ChatGPT를 활용하여, 3개의 라이브러리에 대한 배경과 필요 코드를 정리하였습니다.
배경: LLM과 외부 도구의 연결을 위한 MCP의 등장
최근 AI 기술의 발전으로 대형 언어 모델(LLM)이 다양한 외부 도구와 데이터를 활용하여 복잡한 작업을 수행하는 에이전트로 진화하고 있습니다. 이러한 흐름 속에서 Model Context Protocol(MCP)은 LLM이 외부 도구와 안전하고 일관되게 통신할 수 있도록 설계된 프로토콜로, 도구 호출의 표준화를 통해 개발자와 사용자 모두에게 효율성을 제공합니다 .
MCP란 무엇인가요?
MCP(Model Context Protocol)는 LLM이 외부 도구 및 데이터 소스와 안전하고 일관되게 통신할 수 있도록 설계된 오픈 표준 프로토콜입니다. 이를 통해 LLM은 다양한 외부 도구와 데이터를 활용하여 복잡한 작업을 수행하는 에이전트로 진화하고 있습니다.
⚙️ fastapi_mcp: FastAPI 엔드포인트를 MCP 도구로 자동 노출
🔍 주요 기능
- 자동 도구 변환: FastAPI의 모든 엔드포인트를 MCP 도구로 자동 변환
- 스키마 보존: 요청 및 응답 모델의 스키마를 그대로 유지
- 유연한 배포: FastAPI 앱 내에 MCP 서버를 직접 마운트하거나 별도로 배포 가능
- 간편한 통합: 추가 설정 없이 간단한 코드로 MCP 통합 구현
🛠️ 사용 예시
from fastapi import FastAPI
from fastapi_mcp import FastApiMCP
app = FastAPI()
@app.get("/hello", operation_id="say_hello")
def say_hello(name: str):
return {"message": f"안녕하세요, {name}님!"}
mcp = FastApiMCP(
app,
name="My API MCP",
base_url="http://localhost:8000"
)
mcp.mount()
위와 같이 설정하면, FastAPI의 모든 엔드포인트가 MCP 도구로 자동 노출되어 Claude, Cursor 등에서 바로 사용할 수 있습니다 .
MCP 연결 방법
http://localhost:8000/mcp 로 설정하거나 proxy로 하는 방법
{
"mcpServers": {
"my-api-mcp-proxy": {
"command": "mcp-proxy",
"args": ["http://127.0.0.1:8000/mcp"]
}
}
}
{
"mcpServers": {
"my-api-mcp-proxy": {
"command": "/Full/Path/To/Your/Executable/mcp-proxy",
"args": ["http://127.0.0.1:8000/mcp"]
}
}
}
🧰 mcp-use: 다양한 MCP 서버와의 간편한 상호작용
🔍 주요 기능
- 다양한 MCP 서버와의 통합 지원: 웹 브라우징, 파일 시스템 접근, 데이터베이스 조회 등 다양한 기능과의 통합
- 사용자 정의 에이전트 생성 및 관리: 자신만의 에이전트를 생성하고 관리할 수 있는 기능 제공
- MCP 도구 및 리소스 자동 탐색: MCP 서버의 도구와 리소스를 자동으로 탐색하여 사용
- OpenAI, Claude 등 다양한 LLM과의 연동: 다양한 LLM과의 연동을 통해 강력한 기능 구현
🛠️ 사용 예시
import asyncio
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from mcp_use import MCPAgent, MCPClient
async def main():
# Load environment variables
load_dotenv()
# Create configuration dictionary
config = {
"mcpServers": {
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest"],
"env": {
"DISPLAY": ":1"
}
}
}
}
# Create MCPClient from configuration dictionary
client = MCPClient.from_dict(config)
# Create LLM
llm = ChatOpenAI(model="gpt-4o")
# Create agent with the client
agent = MCPAgent(llm=llm, client=client, max_steps=30)
# Run the query
result = await agent.run(
"Find the best restaurant in San Francisco",
)
print(f"\nResult: {result}")
if __name__ == "__main__":
asyncio.run(main())
# multi_server_config.json
{
"mcpServers": {
"airbnb": {
"command": "npx",
"args": ["-y", "@openbnb/mcp-server-airbnb", "--ignore-robots-txt"]
},
"playwright": {
"command": "npx",
"args": ["@playwright/mcp@latest"],
"env": {
"DISPLAY": ":1"
}
}
}
}
import asyncio
from mcp_use import MCPClient, MCPAgent
from langchain_anthropic import ChatAnthropic
async def main():
# Create client with multiple servers
client = MCPClient.from_config_file("multi_server_config.json")
# Create agent with the client
agent = MCPAgent(
llm=ChatAnthropic(model="claude-3-5-sonnet-20240620"),
client=client
)
try:
# Run a query that uses tools from multiple servers
result = await agent.run(
"Search for a nice place to stay in Barcelona on Airbnb, "
"then use Google to find nearby restaurants and attractions."
)
print(result)
finally:
# Clean up all sessions
await client.close_all_sessions()
if __name__ == "__main__":
asyncio.run(main())
위 코드를 통해 MCP 서버에 연결하고, 특정 도구를 실행하여 결과를 얻을 수 있습니다.
mcp-proxy: stdio와 SSE 간의 브릿지
최근 Claude, Cursor, LangChain 등에서 도구 호출(Plugin, Tools) 기능이 활성화되면서 LLM이 외부 API나 프로그램과 협업하는 일이 많아졌습니다. 그런데 문제는 통신 방식의 차이였습니다. 어떤 도구는 SSE(Server-Sent Events)를 쓰고, 어떤 도구는 단순히 stdin/stdout으로 작동합니다. 여기서 다리 역할을 하는 것이 바로 mcp-proxy입니다.
mcp-proxy는 다음 두 가지 상황을 연결해주는 중간자(Proxy) 역할을 합니다:
| 모드 | 설명 |
| stdio → SSE | 터미널 입출력 기반 MCP 서버를 SSE 서버처럼 외부에 노출 |
| SSE → stdio | SSE 요청을 받아 stdio MCP 서버에 전달 |
주요 기능
- stdio 기반의 MCP 서버를 SSE 방식으로 노출
- SSE를 사용하는 클라이언트를 stdio 기반의 MCP 서버에 연결
사용 예시
{
"mcpServers": {
"my-api-mcp-proxy": {
"command": "mcp-proxy",
"args": ["http://127.0.0.1:8000/mcp"]
}
}
}
이렇게 설정하면, Claude Desktop과 같은 SSE 기반 클라이언트가 stdio 기반의 MCP 서버와 통신할 수 있습니다.
🔗 통합 활용: FastAPI와 MCP의 시너지
fastapi_mcp와 mcp-use를 함께 활용하면, FastAPI로 개발한 API를 MCP 도구로 노출시키고, 이를 다양한 MCP 서버와 연동하여 복잡한 AI 기반 애플리케이션을 손쉽게 구축할 수 있습니다. 예를 들어, FastAPI로 개발한 데이터 처리 API를 MCP 도구로 노출시키고, mcp-use를 통해 웹 브라우징, 파일 시스템 접근 등의 기능과 통합하여 하나의 에이전트에서 다양한 작업을 수행할 수 있습니다.
🧪 실전 예시: 날씨 알림 및 예보 애플리케이션 구축
fastapi_mcp를 활용하여 미국 국립 기상청(NWS) API와 연동한 날씨 알림 및 예보 애플리케이션을 구축할 수 있습니다. 이를 통해 사용자는 특정 주의 날씨 경보나 특정 지역의 날씨 예보를 손쉽게 확인할 수 있습니다
from fastapi import FastAPI
from fastapi_mcp import FastApiMCP
import httpx
app = FastAPI()
@app.get("/weather/alerts/{state}", operation_id="get_weather_alerts")
async def get_weather_alerts(state: str):
url = f"https://api.weather.gov/alerts/active/area/{state}"
headers = {"User-Agent": "weather-app/1.0", "Accept": "application/geo+json"}
async with httpx.AsyncClient() as client:
response = await client.get(url, headers=headers)
data = response.json()
return data
mcp = FastApiMCP(app, base_url="http://localhost:8000")
mcp.mount()
🧪 실전 조합: fastapi_mcp + mcp-use + mcp-proxy
MCP 시스템을 온전히 활용하려면 세 가지 조합을 고려해보세요:
| 도구 | 역할 |
| fastapi_mcp | FastAPI 앱을 MCP 도구로 노출 |
| mcp-use | 여러 MCP 서버를 연결하고 LLM Agent 실행 |
| mcp-proxy | stdio 기반 도구를 SSE 서버처럼 포장하거나 반대로 연결 |
이 조합을 통해 내가 만든 로컬 API 또는 도구가 Claude나 LangChain 같은 시스템에서 곧바로 사용 가능해집니다.
참조 링크
| 자료 | 링크 |
| FASTAPI-MCP GITHUB CODE | https://github.com/tadata-org/fastapi_mcp |
| MCP-USE GITHUB CODE | https://github.com/mcp-use/mcp-use |
| MCP-PROXY GITHUB CODE | https://github.com/sparfenyuk/mcp-proxy?tab=readme-ov-file#1-stdio-to-sse |
'꿀팁 분석 환경 설정 > MCP' 카테고리의 다른 글
| ChatGPT에서 PlayMCP 사용해보기 (0) | 2025.12.20 |
|---|---|
| 유용할 것 같은 MCP 코드 찾아서 정리 (0) | 2025.04.21 |
| [mcp-directory] mcp 서버 관리 화면 오픈소스 버전 소개 및 개선해보기 (0) | 2025.04.05 |
