跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI

Python 开发 MongoDB 数据库 MCP Server 实战指南

Python MCP Server 开发实战,涵盖官方 SDK 与 FastAPI 集成方案。通过 FastMCP 快速构建工具服务器,支持 stdio 和 SSE 传输。结合 FastAPI 实现复杂业务逻辑注册为 MCP 服务,并演示本地 MCP Hub 搭建及 1Panel 部署方式。示例包含化合物数据查询接口,展示如何将企业能力接入大模型上下文协议。

技术博主发布于 2026/2/6更新于 2026/10/2190 浏览
Python 开发 MongoDB 数据库 MCP Server 实战指南

前言

目前 MCP 协议是给 DeepSeek 大模型插上工具链的翅膀,让大模型不仅拥有超高的推理和文本生成能力,还能具备执行大脑意识的工具能力。

如何开发一个 MCP?

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) -> int:
    """获取网页的源代码"""
    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。

FastMCP 是服务器的核心类,它负责管理工具、资源和通信。参数「spider」是服务器的名称,用于标识这个 MCP 服务器。

然后,@mcp.tool() 是一个装饰器(decorator),它告诉 FastMCP 将 crawl 函数注册为一个可供客户端调用的工具。

文档字符串("""获取网页的源代码"""):这是函数的描述,客户端(如 MCP Inspector)会显示这个描述,帮助用户理解工具的功能。这个工具可以被外部客户端调用!例如通过 MCP 协议发送请求,传入 url,服务器会返回它的网页源代码。

mcp.run(transport='stdio') 启动 MCP 服务器,进入监听状态,等待客户端的连接和请求。transport='stdio' 指定了通信方式为标准输入输出(Standard I/O)。这意味着服务器通过命令行的标准输入(stdin)和标准输出(stdout)与客户端通信,适合本地开发和测试。

mcp.run(transport='stdio') 启动 MCP 服务器,如果需要远程通信,可以更改为其他传输方式(如 'sse',Server-Sent Events)。

fastapi-mcp 库
pip install fastapi-mcp

案例分析

import requests
 fastapi  FastAPI, HTTPException, Query
 pydantic  BaseModel
 typing  
 fastapi_mcp  add_mcp_server


app = FastAPI(
    title=,
    description=,
    version=,
)


 () -> :
    
    response = requests.get(url)
     {: response.text}

mcp_server = add_mcp_server(
    app,
    mount_path=, 
    name=, 
    description=,
    base_url=,
    describe_all_responses=,
    describe_full_response_schema=,
)

 __name__ == :
     uvicorn
    uvicorn.run(app, host=, port=)
from
import
from
import
from
import
Optional
from
import
# Create a simple FastAPI app
"spider"
"A simple example API with integrated MCP server"
"0.1.0"
@app.get("/items/{url}", tags=["items"])
def
crawl
url: Optional[str] = Query(None, description="get websource from url")
dict
"""获取网页的源代码"""
return
"response"
"/mcp"
# 挂着 mcp 服务器的地址
"Item API MCP"
# mcp 服务的名称
"MCP server for the Item API"
"http://localhost:8000"
False
False
if
"__main__"
import
"0.0.0.0"
8000
fastapi_mcp 分析

上面的案例引入了 fastapi 和 fastapi-mcp 并实例化一个 fastapi 的类;

然后使用 fastapi 编写了一个方法用户获取一个 url 站点的源代码;

使用 fastapi-mcp 创建一个实例化的 mcp_server,将上面的 fastapi 服务注册为一个 mcp 服务,可以配置 mcp 服务调用的路由为 http://localhost:8000/mcp

最后导入 uvicorn 库,正常启动 fastapi 的服务;可以无缝的将代码转成 mcp server!

以上两种实现 MCP 服务的方式,都可以学习下,尤其是如果你本身对 fastapi 比较的熟练,那么可以直接使用 fastapi-mcp 将服务注册为 MCP server!如果熟悉 python,但是不熟悉 fastapi 也可以使用官方推荐的 mcp 库,节省学习的成本,降低学习难度系数!

实战编写 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_server = add_mcp_server(
    app,
    mount_path="/mcp", # 挂着 mcp 服务器的地址
    name="Item API MCP", # 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 生成化合物的属性信息

文章配图 文章配图 文章配图 文章配图

以上就可以把企业本地查询数据的一般能力集成到 deepseek 中了!让企业赶的上 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/

文章配图

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

文章配图

其他 MCP 服务参考

https://github.com/punkpeye/awesome-mcp-servers/tree/main

目录

  1. 前言
  2. 如何开发一个 MCP?
  3. mcp 库
  4. 代码分析
  5. fastapi-mcp 库
  6. Create a simple FastAPI app
  7. fastapi_mcp 分析
  8. 实战编写 mongodb 数据库查询 MCP 服务
  9. 此处省略具体的数据库连接和业务逻辑代码
  10. 根据结构式获取化合物计算属性的值
  11. 获取单个化合物
  12. 访问结构式图片
  13. 搭建自己的本地 MCP hub
  14. 其他 MCP 服务参考

更多推荐文章

查看全部
  • 无人机烟幕投放策略:如何用代码计算最长遮蔽时间
  • 基于 LLaMA-Factory 微调 ChatGLM3 模型实战
  • 算法:双指针解决快乐数问题
  • YOLO+OpenClaw+SAM 微调实现工业缺陷自动标注
  • Python 文件操作详解:读写、序列化与路径管理
  • OpenCV Mat 类:基本图像容器详解
  • 基于分布式光纤声波传感(DAS)的无人机入侵探测技术与应用
  • 英伟达开源 DreamDojo:4.4 万小时视频数据破解机器人数据鸿沟
  • 腾讯 QQ 开放平台接入 OpenClaw:个人号一键部署 5 个机器人
  • C++ 测试与调试实战:保障代码质量与稳定性
  • 设计一个支持万人并发抢购的秒杀系统架构方案
  • Java 包与导包机制及 Scanner 类输入源详解
  • GitHub 入门指南:Git 区别、核心操作与协作流程
  • OpenClaw:开源AI智能体框架的技术架构与部署实践
  • 如何在 VS Code 中集成并使用 Cursor AI
  • C++ 测试与调试实战:保障代码质量与稳定性
  • 探索云开发Copilot,AI如何重塑开发流程?
  • VSCode 中 GitHub Copilot 插件无模型选项的解决方案
  • 吴恩达:提升大模型能力的四个关键步骤
  • Web 前端基础:HTML 核心语法与常用标签
  • 相关免费在线工具

    • RSA密钥对生成器

      生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

    • Mermaid 预览与可视化编辑

      基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

    • 随机西班牙地址生成器

      随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

    • curl 转代码

      解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

    • Base64 字符串编码/解码

      将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

    • Base64 文件转换器

      将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online