Python 开发 MongoDB 数据库 MCP Server 实战指南
前言
MCP(Model Context Protocol)协议相当于给大模型装上了工具链的翅膀。它不仅让模型拥有强大的推理和文本生成能力,还能赋予其执行具体任务的工具调用能力。
如何开发一个 MCP 服务?
MCP 是一种协议,全称为 Model Context Protocol。官方 SDK 仓库位于:https://github.com/modelcontextprotocol/python-sdk
方案一:使用官方 FastMCP 库
这是最轻量级的实现方式,适合快速验证想法。
pip install mcp
from mcp.server.fastmcp import FastMCP
import requests
# 创建服务器实例,名称用于标识
mcp = FastMCP("spider")
@mcp.tool()
def crawl(url: str) -> str:
"""获取网页的源代码"""
response = requests.get(url)
return response.text
if __name__ == "__main__":
# stdio 模式适合本地开发和测试
mcp.run(transport='stdio')
# 如需远程通信,可更改为 sse 模式
# mcp.run(transport="sse")
代码解析:
这里我们导入了 FastMCP 类并实例化了一个名为 spider 的服务器。核心在于 @mcp.tool() 装饰器,它将 crawl 函数注册为一个可供客户端调用的工具。函数的文档字符串会被客户端(如 MCP Inspector)展示,帮助用户理解功能。
启动时指定 transport='stdio',意味着服务器通过标准输入输出与客户端通信,非常适合本地调试。如果需要对外提供服务,可以切换到 sse(Server-Sent Events)传输方式。
方案二:基于 FastAPI 集成
如果你已经在使用 FastAPI 构建后端,可以直接利用 fastapi-mcp 库将现有服务注册为 MCP 服务,无需重复造轮子。
pip install fastapi-mcp
import requests
from fastapi import FastAPI, HTTPException, Query
from pydantic import BaseModel
from typing import Optional
from fastapi_mcp import add_mcp_server
# 创建 FastAPI 应用
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: Optional[str] = Query(None, description="get websource from url")) -> dict:
"""获取网页的源代码"""
try:
response = requests.get(url)
return {"response": response.text}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
# 将 FastAPI 服务挂载为 MCP 服务
mcp_server = add_mcp_server(
app,
mount_path="/mcp", # 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)
分析:
这个案例展示了如何将现有的 FastAPI 接口无缝转换为 MCP 服务。配置中 mount_path 决定了客户端访问 MCP 接口的路由。最后通过 uvicorn 启动服务即可。如果你熟悉 FastAPI,这种方式能极大降低接入成本。
实战:编写 MongoDB 数据库查询 MCP 服务
下面是一个结合 FastAPI、Motor(异步 MongoDB 驱动)以及化学数据处理的实际案例。虽然业务逻辑涉及化合物属性计算,但核心架构展示了如何将本地数据查询能力封装进 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()
# ... 省略部分数据库连接及辅助类定义 ...
# 根据结构式获取化合物计算属性的值
@app.get("/api/computes/", status_code=status.HTTP_200_OK, summary="根据结构式获取化合物计算属性的值")
async def computed(smiles: Optional[str] = Query(None, description="Search smiles string")):
result = ChemRdkit(smiles=smiles).computed
if result and result.get("code") == 200:
del result["code"]
return ResponseModel(data=result, message="success")
return ErrorResponseModel(error=result.get("error"), code=status.HTTP_404_NOT_FOUND, message=result.get("message"))
# 获取单个化合物
@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, message="数据不存在")
# 访问结构式图片
@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")
# 如果文件不存在,尝试根据 filename 获取 casno 号的基本信息,使用 rdkit 库根据 smiles 生成结构式图片
obj = await get_smiles(casno=filename.replace("_", "-"))
if obj:
ChemRdkit(smiles=obj.get("smiles", "")).struct(filename=obj.get("casno"))
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="Item API MCP",
description="MCP server for the Item API",
base_url="http://localhost:9999",
describe_all_responses=False,
describe_full_response_schema=False,
)
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=9999)
运行结果: 该服务实现了查询 CAS 号基本信息,以及根据 SMILES 生成化合物的属性信息和结构图的能力。




以上演示了如何将企业本地的数据查询能力集成到 DeepSeek 等大模型中,让企业能够紧跟 AI 技术发展的步伐。
搭建自己的本地 MCP Hub
Hub 服务器作为中央管理节点,负责连接并管理多个 MCP 服务器,为客户端提供统一的 API 入口。
Docker 部署
docker run --name=mcphub -p 3001:3000 --restart=always -d registry.cn-hangzhou.aliyuncs.com/samanhappy/mcphub
浏览器访问:http://localhost:3001/

1Panel 部署
目前 1Panel 仅支持 stdio 输出协议。
Ubuntu 安装脚本:
curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh

更多资源参考
如果想探索更多现成的 MCP 服务,可以参考以下仓库: https://github.com/punkpeye/awesome-mcp-servers/tree/main


