如何快速托管MCP服务:以Paddle OCR为例
项目地址:https://github.com/PaddlePaddle/PaddleOCR
本地测试 MCP 服务
使用 pip 安装 paddleocr-mcp 库的命令如下:
1# 从 PyPI 安装
2pip install -U paddleocr-mcp
可通过以下命令检查是否安装成功:
1paddleocr_mcp --help
本地测试:
1# 设置环境变量
2export PADDLEOCR_MCP_PIPELINE="PaddleOCR-VL"
3export PADDLEOCR_MCP_PPOCR_SOURCE="qianfan"
4export PADDLEOCR_MCP_SERVER_URL="https://qianfan.baidubce.com/v2/ocr"
5export PADDLEOCR_MCP_QIANFAN_API_KEY="<your-api-key>"
6
7# 启动 Inspector
8npx @modelcontextprotocol/inspector

CFC 托管
创建函数
1、登录 CFC控制台,进入函数列表,点击创建函数。
2、选择空白函数,点击下一步
3、设置函数名、函数类型选择Web函数、(为了使用Streamable HTTP 协议)运行时尽量选择Python 3.12 ubuntu2204,超时时间可配置为300,勾选同意后点击提交

创建函数代码
1、本地编辑函数代码
建议使用 stateless_http=True,避免** **CFC 后端切换实例后,客户端固定的 session id 失效
1import uvicorn
2import os
3import contextlib
4from mcp.server.fastmcp import FastMCP
5from starlette.applications import Starlette
6from starlette.routing import Mount
7from paddleocr_mcp.pipelines import create_pipeline_handler
8
9# 初始化 FastMCP 实例,
10mcp = FastMCP("python312_mcp", stateless_http=True)
11
12# 配置 PaddleOCR
13# 建议从环境变量获取 API Key
14api_key = os.getenv("PADDLEOCR_MCP_QIANFAN_API_KEY")
15
16pipeline_handler = create_pipeline_handler(
17 "PaddleOCR-VL",
18 ppocr_source="qianfan",
19 server_url="https://qianfan.baidubce.com/v2/ocr",
20 qianfan_api_key=api_key,
21 pipeline_config=None,
22 device=None,
23 aistudio_access_token=None,
24 timeout=60
25)
26
27# 注册 PaddleOCR 工具
28pipeline_handler.register_tools(mcp)
29
30# 获取 streamable http 应用
31# 注意:这里我们使用 streamable_http_app() 替代 sse_app()
32# 必须先调用此方法,mcp.session_manager 才可用
33streamable_app = mcp.streamable_http_app()
34
35@contextlib.asynccontextmanager
36async def lifespan(app):
37 # 初始化 session manager
38 async with mcp.session_manager.run():
39 await pipeline_handler.start()
40 yield
41 await pipeline_handler.stop()
42
43# 组装 Starlette 应用
44app = Starlette(
45 routes=[
46 Mount('/', app=streamable_app),
47 ],
48 lifespan=lifespan
49)
50
51# 入口(仅用于本地启动)
52if __name__ == "__main__":
53 uvicorn.run(app, host="0.0.0.0", port=8800)
- 初始化 FastMCP 实例:开启
stateless_http=True后,FastMCP将以无状态模式运行 HTTP 服务,不再强制依赖Session ID来维护上下文状态。您的mcp.session_manager逻辑仍然可以正常初始化和启动,但服务对外交互时将不再强制要求 Session 绑定。 - 配置 PaddleOCR pipeline handler:此处配置了服务来源为
千帆 - 将 pipeline 的工具注册到 MCP:已经有了一个 mcp 实例(名为 "python312_mcp" )后,调用
register_tools(mcp)实际上是把 PaddleOCR 的工具函数 追加 到了这个现有的实例上。 - 生命周期管理:async 的生命周期管理器(ASGI
lifespan),在应用启动时运行start(),在应用关闭时运行stop()。 - 组装 Starlette 应用并注入 lifespan:
lifespan=lifespan:把上面的 asynccontextmanager 传给 Starlette,用于启动/关闭钩子。 - 整体启动流程:启动
uvicorn-> Starlette 启动 ->lifespan调用pipeline_handler.start()。

2、添加环境变量
PADDLEOCR_MCP_QIANFAN_API_KEY
api_key是在调用千帆推理服务时使用,通过在控制台-用户账号-安全认证-API Key页面,查看API Key,此API Key永久有效。获取步骤如下:
(1)登录控制台-安全认证-API Key。
(2)点击创建API Key。

安装依赖
1、准备一个空文件夹,放入函数代码,并创建一个名为python的空文件夹作为依赖包目录
1mkdir test
2cd test
3# 将函数代码放入当前文件夹
4mkdir python

2、使用 docker 拉取和函数运行时匹配的镜像
1docker pull --platform linux/amd64 brikerman/python:3.12..ubuntu--22.04
2# 需要登录 CCR 账号
3docker pull --platform linux/amd64 ccr-3k7z0z2u-pub.cnc.gz.baidubce.com/cfc_public/ubuntu2204_python312:v1
3、进入依赖包目录,并运行容器
1cd python
2docker run -it --rm \
3 -v $(pwd):/workspace \
4 -w /workspace \
5 --platform linux/amd64 \
6 ccr-3k7z0z2u-pub.cnc.gz.baidubce.com/cfc_public/ubuntu2204_python312:v1 \
7 bash
4、若您的依赖是开源代码库,则您需要将开源代码库依赖都放置到当前目录中(对应于宿主机的test/python目录)。
1pip3 install paddleocr-mcp -i https://pypi.tuna.tsinghua.edu.cn/simple -t .
5、压缩python文件夹 和 函数代码
1# exit 退出容器后,返回 test 目录
2cd ..
3zip -r mcp.zip .
6、上传代码包

测试
1、编辑 HTTP触发器的路径,复制 HTTP触发器的 URL


2、使用 MCP Inspector 测试
选择Streamable HTTP,填入HTTP触发器的URL,点击connect连接,选择Tools,即可测试

3、集成进 VS Code 使用


