Python 开发 MongoDB 数据库 MCP Server 实战指南
前言
目前 MCP (Model Context Protocol) 协议是给大模型插上工具链的翅膀,让大模型不仅拥有超高的推理和文本生成能力,还能具备执行大脑意识的工具能力。
如何开发一个 MCP Server
MCP 是一种协议,指的是模型上下文协议 (Model Context Protocol)。
官方 SDK:https://github.com/modelcontextprotocol/python-sdk
使用 mcp 库
安装依赖:
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__":
mcp.run(transport='stdio')
# mcp.run(transport="sse")
以上代码实现了 FastMCP 库来创建一个简单的 MCP 服务器,它提供一个基本的工具(工具名:crawl),用于实现源代码的获取。这是一个非常简单的爬虫 MCP 入门示例,适合理解 MCP 服务器的工作原理和 FastMCP 的基本用法。
代码分析
- 从
mcp.server.fastmcp模块中导入了 FastMCP 类。 - 创建了一个 FastMCP 类的实例,命名为 spider。
@mcp.tool()是一个装饰器,将crawl函数注册为一个可供客户端调用的工具。- 文档字符串描述了函数的功能,客户端会显示这个描述。
mcp.run(transport='stdio')启动 MCP 服务器,指定通信方式为标准输入输出,适合本地开发和测试。
使用 fastapi-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
# Create a simple FastAPI app
app = FastAPI(
title="Spider",
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=400, detail=str(e))
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)
上面的案例引入了 fastapi 和 fastapi-mcp 并实例化一个 fastapi 的类;然后使用 fastapi 编写了一个方法用户获取一个 url 站点的源代码;使用 fastapi-mcp 创建一个实例化的 mcp_server,将上面的 fastapi 服务注册为一个 mcp 服务;最后导入 uvicorn 库,正常启动 fastapi 的服务;可以无缝的将代码转成 mcp server!
以上两种实现 MCP 服务的方式,都可以学习下,尤其是如果你本身对 fastapi 比较的熟练,那么可以直接使用 fastapi-mcp 将服务注册为 MCP server!
实战编写 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
from typing import Optional
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"))
pass
# 获取单个化合物
@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="数据不存在")
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_server = add_mcp_server(
app,
mount_path="/mcp",
name="Item API MCP",
description="MCP server for the Item API",
base_url="http://192.168.1.250:9999",
describe_all_responses=False,
describe_full_response_schema=False,
)
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=9999)
结果输出
实现查询 casno 的基本信息,以及根据 smiles 生成化合物的属性信息。

以上就可以把企业本地查询数据的一般能力集成到 AI 中了!
搭建自己的本地 MCP Hub
Hub 服务器 (MCP Hub):作为中央管理服务器,连接并管理多个 MCP 服务器。它为客户端提供统一的 API 入口,并将请求路由到相应的 MCP 服务器。
docker run --name=mcphub -p 3001:3000 --restart=always -d registry.cn-hangzhou.aliyuncs.com/samanhappy/mcphub
浏览器输入:http://localhost:3001/


