웹 브라우징부터 3D 모델링까지, 다양한 외부 도구와 LLM을 연결하는 최신 프레임워크
AI 모델과 외부 도구를 연결하는 방식이 AI 시스템의 실용성을 결정짓는 핵심 요소가 되었습니다. 이런 맥락에서 MCP-Use는 다양한 언어 모델을 Model Context Protocol(MCP) 서버와 유연하게 연결하는 혁신적인 솔루션을 제공합니다. 이 글에서는 MCP Use의 핵심 개념과 실용적인 구현 방법을 살펴보겠습니다.
MCP-Use란 무엇인가?

MCP-Use는 다양한 LLM(Large Language Model)을 MCP 서버와 연결하여 도구 접근 기능을 갖춘 맞춤형 AI 에이전트를 구축할 수 있게 해주는 오픈소스 Python 라이브러리입니다. 참고로 MCP(Model Context Protocol)는 Anthropic에서 개발한 개방형 프로토콜로, AI 모델이 외부 데이터 소스 및 도구와 상호작용하는 방식을 표준화합니다.
Anthropic은 MCP를 “AI 애플리케이션을 위한 USB-C 포트”라고 표현합니다. 즉, 다양한 기기를 표준화된 방식으로 연결하는 USB-C처럼, MCP는 AI 모델이 다양한 데이터 소스와 도구에 일관된 방식으로 접근할 수 있게 해줍니다.
간단한 구현: 6줄 코드로 AI 에이전트 만들기
MCP-Use의 가장 인상적인 특징은 단 6줄의 코드만으로 복잡한 AI 에이전트를 구현할 수 있다는 점입니다:
import asyncio
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from mcp_use import MCPAgent, MCPClient
load_dotenv() # .env 파일에서 API 키 로드
client = MCPClient.from_dict({"mcpServers": {"playwright": {"command": "npx", "args": ["@playwright/mcp@latest"]}}})
llm = ChatOpenAI(model="gpt-4o") # OpenAI의 GPT-4o 모델 사용
agent = MCPAgent(llm=llm, client=client, max_steps=30) # 에이전트 생성
result = asyncio.run(agent.run("Find me the top 3 pizza restaurants in Chicago")) # 에이전트 실행
print(f"Result: {result}") # 결과 출력
이 코드는 Playwright MCP 서버를 통해 웹 브라우징 기능을 갖춘 에이전트를 생성합니다. 에이전트는 GPT-4o를 활용하여 시카고의 피자 레스토랑을 검색하고 결과를 반환합니다.
MCP-Use의 핵심 아키텍처
MCP-Use의 아키텍처는 다음 핵심 구성 요소로 이루어져 있습니다:
- LangChain 지원 LLM: OpenAI, Anthropic, Groq, Llama 등 도구 호출 기능을 갖춘 다양한 모델 지원
- MCPAgent: 사용자 쿼리 처리, 도구 호출 관리, 대화 흐름 제어
- MCPClient: MCP 서버와의 연결 관리, 서버 구성, 세션 생성
- LangChain Adapter: MCP 서버의 기능을 LangChain 도구 형식으로 변환
- 서버 관리자: 여러 MCP 서버 간 동적 전환 처리
- MCP 서버: 실제 도구 기능 제공 (Playwright, Airbnb, Blender 등)
MCP-Use는 STDIO, HTTP, WebSocket 등 다양한 연결 방식을 지원하여 로컬 및 원격 환경에서 모두 활용 가능합니다.
대표적인 사용 사례
1. 웹 브라우징 및 정보 검색
웹을 검색하고 정보를 수집하는 에이전트:
import asyncio
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from mcp_use import MCPAgent, MCPClient
async def web_search_agent():
load_dotenv()
# Playwright MCP 서버 구성
config = {
"mcpServers": {
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest"],
"env": {"DISPLAY": ":1"}
}
}
}
client = MCPClient.from_dict(config)
llm = ChatOpenAI(model="gpt-4o")
agent = MCPAgent(llm=llm, client=client, max_steps=30)
query = "현재 비트코인 가격과 지난 24시간 변동률을 찾아서 요약해줘"
result = await agent.run(query)
print(f"결과: {result}")
await client.close_all_sessions()
if __name__ == "__main__":
asyncio.run(web_search_agent())
이 에이전트는 Playwright를 사용하여 웹을 탐색하고 비트코인 가격 정보를 수집한 다음, 이를 요약하여 제공합니다.
2. 여행 계획 도우미 (Airbnb 통합)
여행 계획을 지원하는 에이전트:
async def travel_planning_agent():
load_dotenv()
# Airbnb 및 Playwright MCP 서버 구성
config = {
"mcpServers": {
"airbnb": {
"command": "npx",
"args": ["-y", "@openbnb/mcp-server-airbnb"]
},
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest"]
}
}
}
client = MCPClient.from_dict(config)
llm = ChatAnthropic(model="claude-3-5-sonnet-20240620")
# 서버 관리자 활성화
agent = MCPAgent(
llm=llm,
client=client,
max_steps=40,
use_server_manager=True
)
query = """
다음 달 7월 5일부터 7월 12일까지 발리에서 숙박할 곳을 찾아줘.
2명이 머물 예정이고 수영장이 있는 곳이 좋아.
예산은 하루 200달러 이하이고, 평점이 4.5 이상인 곳을 찾아줘.
숙소 찾은 후에는 주변 관광지와 맛집도 3곳씩 추천해줘.
"""
result = await agent.run(query)
print(f"결과: {result}")
이 예시는 Airbnb MCP 서버와 Playwright MCP 서버를 모두 활용하여, Airbnb에서 숙소를 검색한 다음 주변 관광지와 맛집 정보를 수집합니다.
3. 3D 모델링 자동화 (Blender 통합)
Blender를 사용한 3D 모델링 자동화:
async def blender_automation_agent():
# Blender MCP 서버 구성
config = {
"mcpServers": {
"blender": {
"command": "uvx",
"args": ["blender-mcp"]
}
}
}
client = MCPClient.from_dict(config)
llm = ChatAnthropic(model="claude-3-5-sonnet-20240620")
agent = MCPAgent(llm=llm, client=client, max_steps=30)
query = """
Blender에서 떠다니는 섬 위에 작은 오두막이 있는 장면을 만들어줘.
섬 주변에는 폭포가 있고, 하늘에는 두 개의 달이 떠 있는 밤 장면으로 만들어줘.
"""
result = await agent.run(query)
print(f"결과: {result}")
이 에이전트는 Blender MCP 서버를 통해 3D 모델링 작업을 자동화합니다. 사용자가 자연어로 설명한 장면을 Blender에서 구현합니다.
실전 활용을 위한 최적화 전략
1. 에이전트 메모리 최적화
메모리 관리는 성능과 비용에 직접적인 영향을 미칩니다:
from langchain.memory import ConversationBufferWindowMemory
# 창 크기가 5인 메모리 생성 (최근 5개 교환만 유지)
memory = ConversationBufferWindowMemory(k=5)
agent = MCPAgent(
llm=ChatOpenAI(model="gpt-4o"),
client=client,
memory=memory,
memory_enabled=True
)
이 방식으로 대화 기록의 크기를 제한하여 토큰 사용량을 줄이고 응답 시간을 개선할 수 있습니다.
2. 효율적인 다중 서버 구성
다중 서버 환경에서는 서버 관리자를 활성화하고, 도구 설명을 최적화합니다:
# 다중 서버 구성 예시
config = {
"mcpServers": {
"search": {
"command": "npx",
"args": ["@playwright/mcp@latest"],
},
"database": {
"command": "npx",
"args": ["-y", "@some-author/mcp-database"],
}
}
}
# 서버 관리자를 활성화한 효율적인 에이전트
client = MCPClient.from_dict(config)
agent = MCPAgent(
llm=llm,
client=client,
use_server_manager=True,
system_prompt="도구를 사용할 때 작업에 가장 적합한 도구를 선택하세요."
)
3. 오류 처리 및 복원력 향상
실제 프로덕션 환경에서는 오류 처리와 시스템 복원력이 중요합니다:
async def resilient_agent_execution(query, max_retries=3):
client = None
try:
client = MCPClient.from_config_file("production_config.json")
agent = MCPAgent(llm=llm, client=client, max_steps=30)
# 지정된 재시도 횟수만큼 시도
for attempt in range(max_retries):
try:
return await agent.run(query)
except Exception as e:
logging.warning(f"Attempt {attempt+1} failed: {str(e)}")
if attempt == max_retries - 1:
raise
await asyncio.sleep(2 ** attempt) # 지수 백오프
finally:
# 리소스 정리 보장
if client and client.sessions:
await client.close_all_sessions()
이 패턴은 일시적인 오류에 대한 복원력을 제공하고 지수 백오프 전략을 사용하여 재시도 간격을 점진적으로 늘립니다.
4. 도구 접근 제어로 보안 강화
보안에 민감한 환경에서는 도구 접근을 제한할 수 있습니다:
# 제한된 도구로 에이전트 생성
agent = MCPAgent(
llm=ChatOpenAI(model="gpt-4"),
client=client,
disallowed_tools=["file_system", "network"] # 파일 시스템 및 네트워크 접근 제한
)
MCP-Use의 장단점
장점
- 표준화된 프로토콜: 일관된 방식으로 다양한 도구에 접근
- 다양한 LLM 지원: 특정 모델에 종속되지 않음
- 다중 서버 동시 지원: 하나의 에이전트로 여러 MCP 서버 사용
- 보안 및 접근 제어: 특정 도구에 대한 접근 제한 가능
- 유연한 연결 옵션: STDIO, HTTP, WebSocket 지원
단점
- LangChain 의존성: 현재 LangChain이 필수적으로 필요함
- 학습 곡선: MCP 프로토콜과 구성 방식 이해 필요
- MCP 서버 필요: 각 도구마다 MCP 서버 필요
- 상대적으로 신생 기술: 문서와 커뮤니티 지원이 아직 발전 중
도입 고려 사항
MCP-Use 도입을 고려할 때 다음 사항들을 검토해야 합니다:
- 사용 사례 적합성:
- 다양한 외부 시스템과의 통합이 필요한가?
- 복잡한 도구 접근 로직이 필요한 에이전트를 개발하는가?
- 기술 스택 호환성:
- Python 기반 프로젝트인가?
- LangChain 사용에 거부감이 없는가?
- 비동기 프로그래밍(asyncio)에 익숙한 팀인가?
- 서버 구성 복잡성:
- 필요한 도구에 맞는 MCP 서버가 이미 존재하는가, 아니면 개발이 필요한가?
결론
MCP-Use는 다양한 LLM과 외부 도구를 표준화된 방식으로 연결하는 혁신적인 프레임워크입니다. 단 몇 줄의 코드로 강력한 AI 에이전트를 구축할 수 있는 능력은 개발자 생산성을 획기적으로 향상시킵니다.
MCP 프로토콜이 더 광범위하게 채택되고 MCP 서버 생태계가 성장함에 따라, MCP-Use의 가치는 더욱 증가할 것입니다. 다양한 외부 시스템과 상호작용하는 AI 애플리케이션을 효율적으로 구축하고자 한다면, MCP-Use는 탐색해볼 가치가 충분한 프레임워크입니다.
[참고] MCP Use와 langchain-mcp-adapters 비교
LangChain과 관련해서, MCP 프로토콜을 활용하는 도구로 MCP-Use 외에도 LangChain 팀에서 개발한 Langchain MCP Adapters가 있습니다. 이 두 라이브러리는 비슷한 목적을 가지고 있지만 접근 방식과 중점을 두는 부분이 다릅니다:
접근 방식 차이
특성 | langchain-mcp-adapters | MCP-Use |
---|---|---|
개발주체 | LangChain 팀 공식 개발 | Pietro Zullo (개인/커뮤니티) |
중심 생태계 | LangChain 생태계에 MCP 통합 | MCP를 중심으로 여러 LLM 통합 |
방향성 | MCP → LangChain | LangChain + LLM → MCP |
범위 | 경량화된 어댑터에 초점 | 전체 에이전트 프레임워크 제공 |
코드 스타일 비교
langchain-mcp-adapters:
# MCP 도구를 LangChain 도구로 로드
tools = await load_mcp_tools(session)
# LangGraph와 함께 사용
agent = create_react_agent(model, tools)
response = await agent.ainvoke({"messages": "what's (3 + 5) x 12?"})
MCP-Use:
# 에이전트 중심 설계
client = MCPClient.from_dict(config)
agent = MCPAgent(llm=llm, client=client, max_steps=30)
result = await agent.run("Find me the top 3 pizza restaurants in Chicago")
선택 가이드
- 이미 LangChain/LangGraph를 사용 중이라면: langchain-mcp-adapters가 더 적합할 수 있음
- MCP 중심의 완전한 에이전트 솔루션이 필요하다면: MCP Use가 더 적합할 수 있음
- 단순히 MCP 도구를 LangChain에 연결하는 것이 목적이라면: langchain-mcp-adapters가 더 경량화된 솔루션
- 빠르게 완전한 에이전트를 구축하고 싶다면: MCP Use가 더 간편한 인터페이스 제공
⠀ 두 라이브러리는 서로 경쟁 관계보다는 각각 다른 사용 사례와 사용자를 위한 솔루션으로 볼 수 있습니다.
MCP-Use에 대해 더 알아보고 싶다면, 공식 GitHub 페이지와 문서를 참조하세요. 또한 MCP 프로토콜에 대한 자세한 내용은 Model Context Protocol 공식 페이지에서 확인할 수 있습니다.