Python 开发 MCP Server 实战:协议集成与部署指南
MCP(Model Context Protocol)协议相当于给大模型装上了工具链的翅膀,让它不仅拥有推理和文本生成能力,还能执行具体的任务。本文将通过实战案例,演示如何使用 Python 快速构建一个 MCP 服务器。
一、基础环境搭建
首先安装官方推荐的 SDK:
pip install mcp
1. 使用 FastMCP 快速入门
这是一个最轻量级的实现方式,适合理解 MCP 的基本工作原理。
from mcp.server.fastmcp import FastMCP
import requests
# 创建服务器实例,名称用于标识
mcp = FastMCP("spider")
# 注册工具函数
@mcp.tool()
def crawl(url: str) -> str:
"""获取网页的源代码"""
try:
response = requests.get(url)
return response.text
except Exception as e:
return f"Error: {str(e)}"
if __name__ == "__main__":
# transport='stdio' 表示通过标准输入输出通信,适合本地调试
mcp.run(transport='stdio')
# 如需远程通信,可改为 transport="sse"
代码解析:
这里我们导入了 FastMCP 类并实例化了一个名为 spider 的服务器。@mcp.tool() 装饰器将 crawl 函数注册为外部客户端可调用的工具。文档字符串是客户端展示的工具描述。最后通过 mcp.run 启动服务,stdio 模式意味着它监听命令行输入输出,非常适合本地开发和测试。
2. 结合 FastAPI 进行深度集成
如果你已经在使用 FastAPI 构建业务接口,可以直接通过 fastapi-mcp 库将其暴露为 MCP 服务,无需重复编写逻辑。
pip install fastapi-mcp uvicorn
import requests
from fastapi import FastAPI, Query
from fastapi_mcp import add_mcp_server
app = FastAPI(
title="Spider API",
description="A simple example API with integrated MCP server",
version="0.1.0",
)
@app.get("/items/{url}")
def crawl(url: str = Query(..., description="get websource from url")) -> dict:
"""获取网页的源代码"""
response = requests.get(url)
return {"response": response.text}
# 将 FastAPI 应用挂载为 MCP 服务
mcp_server = add_mcp_server(
app,
mount_path="/mcp",
name="Item API MCP",
description="MCP server for the Item API",
base_url="http://localhost:8000",
describe_all_responses=False,
describe_full_response_schema=False,
)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
这种方式非常灵活,可以将现有的 RESTful 接口无缝转换为 MCP 服务。配置中 mount_path 指定了 MCP 路由地址,base_url 则是服务的实际访问地址。
二、业务场景实战:数据查询服务
在实际企业应用中,我们往往需要将内部数据库或特定业务逻辑封装成 MCP 工具。下面是一个集成示例,展示了如何将复杂的业务查询(如化合物属性计算、图片获取等)封装进 MCP 服务。
注意:以下代码片段展示了核心逻辑结构,实际项目中请根据具体业务调整依赖和错误处理。
import sys
from datetime import datetime
import traceback
import uvicorn
from fastapi_mcp import add_mcp_server
from fastapi import FastAPI, status, HTTPException, Response, Query
import motor.motor_asyncio
app = FastAPI()
# ... 中间省略部分数据库连接和业务逻辑定义 ...
# 示例接口:根据 CAS 号获取化合物信息
@app.get("/api/chemicals/{casno}/", status_code=status.HTTP_200_OK, summary="根据 casno 获取单个化合物")
async def chemicals(casno: str):
"""根据 casno 获取化合物"""
# result = await chemical_get_data(casno=casno)
# if result:
# return ResponseModel(data=result, message="success")
# return ErrorResponseModel(error="数据不存在", code=status.HTTP_404_NOT_FOUND)
pass
# 示例接口:访问结构式图片
@app.get("/image/{filename}/", status_code=status.HTTP_200_OK, summary="访问结构式图片")
async def get_image(filename: str):
print(filename)
# image_content = struct_obj.get_struct(filename)
# if image_content:
# return Response(content=image_content, media_type="image/jpeg")
return None
# 注册 MCP 服务
mcp_server = add_mcp_server(
app,
mount_path="/mcp",
name="Chemical API MCP",
description="MCP server for Chemical Data",
base_url="http://192.168.1.250:9999",
)
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=9999)
通过这种方式,企业本地的查询能力就可以被集成到 DeepSeek 等大模型中,让 AI 能够直接调用内部数据。
三、部署与管理:搭建本地 MCP Hub
当有多个 MCP 服务器时,需要一个中央管理节点来统一路由请求。
1. 使用 Docker 部署 Hub
docker run --name=mcphub -p 3001:3000 --restart=always -d registry.cn-hangzhou.aliyuncs.com/samanhappy/mcphub
启动后访问浏览器 http://localhost:3001/ 即可看到管理界面。
2. 其他部署方案
目前 1Panel 也支持 MCP Server 插件,仅支持 stdio 输出协议。Ubuntu 安装脚本如下:
curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh
更多参考资源可以查看 Awesome MCP Servers 仓库。
通过以上步骤,你可以快速掌握 Python 开发 MCP Server 的核心流程。无论是简单的工具调用还是复杂的企业级数据集成,MCP 协议都能提供标准化的解决方案。


