引言
在现代微服务架构中,服务间的通信协议选择至关重要。除了常见的 RESTful API、gRPC 等,MCP(Message-oriented Communication Protocol)作为一种面向消息的通信协议,也逐渐在特定场景中展现出其优势。本文将通过一个具体的 Python 示例,演示如何基于 fastapi-mcp 和 mcp 库,构建一个 MCP 服务端和客户端,并实现工具(Tool)的远程调用。
服务端将使用 FastAPI 框架,通过 fastapi-mcp 库将一个 API endpoint 暴露为 MCP 工具。客户端则会演示如何连接到 MCP 服务,列出可用的工具,并远程调用它。
核心组件:
- 服务端 (
main.py): 一个基于 FastAPI 的 Web 应用,提供 MCP 服务。 - 客户端 (
test/mcp_client.py): 一个 Python 脚本,用于连接 MCP 服务并与之交互。
服务端实现 (main.py)
我们的服务端基于 FastAPI 构建。核心是利用 fastapi-mcp 库将指定的 FastAPI 路由转换成 MCP 可以识别和调用的'工具'。
1. 定义 FastAPI 路由
首先,我们定义一个标准的 FastAPI 路由,这个路由将是我们要通过 MCP 暴露的功能。在这个例子中,我们创建了一个名为 get_data 的异步函数,它接收 question 和 type 两个参数,并返回一个答案。
# main.py
from fastapi import FastAPI
from fastapi_mcp import FastApiMCP
import uvicorn
# 创建 FastAPI 应用
app = FastAPI(
title="GRAPH RAG API",
description="高效的 web 数据管理接口",
version="0.1.0",
)
# ... (其他 FastAPI 配置,如 CORS、异常处理等)
@app.get("/answer", operation_id="get_data", tags=["mcp"], summary="根据问题获取答案")
async def get_data(question: str, type: str):
# 在实际应用中,这里会调用服务层处理业务逻辑
# chat_service = get_chat_service()
# answer = await chat_service.get_answer_mcp(question, type)
()

