实战篇:Python 开发 MongoDB 数据库 MCP Server
基于 Python 开发 Model Context Protocol (MCP) Server 的实战方法。通过 FastMCP 库和 FastAPI 集成方式,实现了将本地工具(如数据库查询)暴露给大模型的能力。示例涵盖了基础爬虫工具封装、化学数据 API 集成以及本地 MCP Hub 的搭建,帮助开发者快速构建企业级 AI 应用接口。

基于 Python 开发 Model Context Protocol (MCP) Server 的实战方法。通过 FastMCP 库和 FastAPI 集成方式,实现了将本地工具(如数据库查询)暴露给大模型的能力。示例涵盖了基础爬虫工具封装、化学数据 API 集成以及本地 MCP Hub 的搭建,帮助开发者快速构建企业级 AI 应用接口。

目前 MCP (Model Context Protocol) 协议是给大模型插上工具链的翅膀,让大模型不仅拥有超高的推理和文本生成能力,还能具备执行大脑意识的工具能力。
MCP 是一种协议,指的是模型上下文协议 (Model Context Protocol)。
安装依赖:
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')
以上代码实现了 FastMCP 库来创建一个简单的 MCP 服务器,它提供一个基本的工具(工具名:crawl),用于实现源代码的获取。这是一个非常简单的爬虫 MCP 入门示例,适合理解 MCP 服务器的工作原理和 FastMCP 的基本用法。
mcp.server.fastmcp 模块中导入了 FastMCP 类。@mcp.tool() 是一个装饰器,将 crawl 函数注册为一个可供客户端调用的工具。mcp.run(transport='stdio') 启动 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}", tags=["items"])
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))
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。
以下示例展示了如何结合 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()
# 初始化 MongoDB 客户端及定义业务逻辑类
# client = motor.motor_asyncio.AsyncIOMotorClient("mongodb://localhost:27017")
# db = client["your_database"]
# class ChemRdkit: ...
# class StructObj: ...
# 根据结构式获取化合物计算属性的值
@app.get("/api/computes/", status_code=status.HTTP_200_OK, summary="根据结构式获取化合物计算属性的值")
async def computed(smiles: Optional[str] = Query(None, description="Search smiles string")):
# result = await db.collection.find_one({"smiles": smiles})
# 模拟返回结果
if True:
return {"data": {"code": 200}, "message": "success"}
return {"error": "Not found", "code": status.HTTP_404_NOT_FOUND}
# 获取单个化合物
@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 {"data": result}
return {"error": "数据不存在", "code": status.HTTP_404_NOT_FOUND}
# 访问结构式图片
@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="Chemical API MCP",
description="MCP server for Chemical Data",
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)
以上就可以把企业本地查询数据的一般能力集成到 AI 应用中,让企业跟上 AI 的快车。
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/

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online