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

Python 开发 MongoDB 数据库 MCP Server 实战

模型上下文协议(MCP)的概念及在 Python 中的两种实现方式:使用官方 mcp 库和 fastapi-mcp 集成。通过示例展示了如何构建简单的爬虫工具、FastAPI 服务以及连接 MongoDB 的 MCP 服务器。此外,还涵盖了本地 MCP Hub 的搭建方法及 1Panel 环境下的部署方案,帮助开发者将企业能力集成到大模型应用中。

人间过客发布于 2026/2/5更新于 2026/10/202.2K 浏览
Python 开发 MongoDB 数据库 MCP Server 实战

前言

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

如何开发一个 MCP?

MCP 是一种协议,指的是模型上下文协议 (Model Context Protocol)。

官方结成的 MCP: 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
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:
    """获取网页的源代码"""
    response = requests.get(url)
    return {"response": response.text}

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://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 分析

上面的案例引入了 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. 1panel MCP server
  15. 其他 MCP 服务参考

更多推荐文章

查看全部
  • 二分算法实战:A-B 数对与高考志愿录取匹配
  • MySQL 锁机制深度解析:从 S/X 锁到 Next-Key Lock 与死锁排查
  • GitHub Copilot 兼容 OpenAI/Anthropic API 的代理工具 copilot-api
  • Lada v0.10.1 本地 AI 视频去马赛克工具使用指南
  • 从Python到Java:多语言SDK开发指南
  • LazyLLM 多 Agent 应用实践:源码部署与可视化 Web 调试
  • 基于 AI 驱动 RPA 的化学资讯自动抓取与分类实践
  • Google 发布 Gemini Embedding 2 及 MuleRun 自进化 AI 助手动态
  • Spring Cloud Gateway 微服务统一入口实战
  • Python 下载 ERA5-Land 气象数据的三种方法
  • Java 后端 Redis 核心知识点与工程实践
  • Python 爬虫实战:爬取苏宁商品评论(好评与差评)
  • GitHub 学生开发者认证完整指南
  • 2025 年 GitHub 十大值得关注的开源项目
  • ruoyi-vue-pro 数据大屏纯前端单点登录实现
  • IWR6843 毫米波雷达人员检测论文研读
  • 基于 Unity 和 AI 零代码制作小游戏“飞翔的牛马”
  • Python GUI 开发实战:CustomTkinter 现代化界面指南
  • 安卓手机使用 Termux 部署 AstrBot 与 NapCat 搭建 QQ 机器人
  • DeepSeek-R1-Distill-Llama-8B 模型写作能力实测与性能分析

相关免费在线工具

  • 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