前言
目前 MCP 协议是给 DeepSeek 大模型插上工具链的翅膀,让大模型不仅拥有超高的推理和文本生成能力,还能具备执行大脑意识的工具能力!
MCP(Model Context Protocol)是连接大模型与外部工具的协议。本文介绍了两种 Python 开发 MCP 服务器的方式:使用官方 mcp 库和 fastapi-mcp 库。通过 FastAPI 封装本地服务接口,利用 add_mcp_server 将其注册为 MCP 服务,可实现将企业本地数据查询能力集成到 DeepSeek 等大模型中。此外,还演示了如何搭建本地 MCP Hub 进行统一管理,帮助开发者快速构建 AI 工具链应用。

目前 MCP 协议是给 DeepSeek 大模型插上工具链的翅膀,让大模型不仅拥有超高的推理和文本生成能力,还能具备执行大脑意识的工具能力!
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') # 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)与客户端通信,适合本地开发和测试。
如果需要远程通信,可以更改为其他传输方式(如 'sse',Server-Sent Events)。
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 和 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 库,节省学习的成本,降低学习难度系数!
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()
# TODO: 此处初始化 MongoDB 连接逻辑,例如使用 motor.motor_asyncio
# client = motor.motor_asyncio.AsyncIOMotorClient("mongodb://localhost:27017/")
# db = client["your_database"]
# 根据结构式获取化合物计算属性的值
@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="Demo", code=status.HTTP_404_NOT_FOUND, message="Not implemented in demo")
# 获取单个化合物
@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")
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 生成化合物的属性信息




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

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


微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 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