手把手搭建自定义 MCP 本地服务 stdio 和 sse 模式,实现 AI 工具个性化调用
MCP(Model Context Protocol)作为 AI 与外部工具的通信协议,能让大模型精准调用自定义功能,摆脱官方工具的限制。本文将从环境搭建、项目初始化、代码开发到 Cherry Studio 联调,完整实现一个自定义 MCP 服务,最终让 AI 通过该服务完成「1+3=5」的个性化计算,全程步骤清晰、可直接复刻。
一、前置准备:安装 uv 包管理工具(核心环境)
uv 是新一代 Python 包管理工具,比 pip/conda 更快,且能统一管理 Python 版本和项目依赖,是搭建 MCP 服务的最佳选择,仅需一行命令完成安装。
安装命令(PowerShell 执行)
powershell -ExecutionPolicy Bypass -c "irm https://github.com/astral-sh/uv/releases/download/0.9.27/uv-installer.ps1 | iex"安装完成后无需额外配置,自动添加系统环境变量
验证安装:在终端输入uv --version,输出版本号即表示安装成功
二、Python 版本管理:安装 3.13(MCP 推荐版本)
MCP 对 Python 3.13 兼容性更佳,通过 uv 可一键安装并管理该版本,无需担心多版本冲突。
1. 查看当前已安装 Python 版本
uv python list 2. 安装python 3.13
uv python install3.13三、项目初始化:创建 MCP 服务专属工程
- 创建项目文件夹并进入
建议按「根目录 - 项目目录」的结构创建,方便后续管理,以 Windows 为例:
创建一个mcp_server文件夹, 初始化python项目
D:\AiMcpProject>cd D:\AiMcpProject D:\AiMcpProject>cd mcp_server D:\AiMcpProject\mcp_server> uv init . -p 3.13 Initialized project `mcp-server` at `D:\AiMcpProject\mcp_server`四、安装 MCP SDK:核心依赖包
MCP SDK 是开发自定义 MCP 服务的基础,提供了FastMCP核心类和各类装饰器,支持uv/pip 两种安装方式,优先推荐 uv(更快、无依赖冲突)。
方式 1:uv 安装(推荐,速度更快)
uv add"mcp[cli]"
方式 2:pip 安装(备用,兼容所有环境)
pip install"mcp[cli]"
五、核心开发:编写自定义 MCP 服务代码
项目初始化后,打开main.py(PyCharm/VS Code 均可),编写核心业务代码。本次实现3 个核心功能:个性化加法工具、动态问候资源、多风格问候提示词,且特意将加法结果「多加 1」,用于后续验证服务是否被成功调用。
main.py 内容
完整代码(可直接复制使用)
from mcp.server import FastMCP # 初始化MCP服务,命名为Demo(服务标识,可自定义) mcp = FastMCP("Demo")# 1. 自定义加法工具:核心测试功能(a+b后多加1,用于联调验证)@mcp.tool()# 装饰器标记为MCP工具,供AI调用defadd(a:int, b:int)->int:"""Add two numbers(函数描述,AI会识别该描述并调用)"""return a + b +1# 个性化逻辑:比正常加法多1,验证核心标识# 2. 动态问候资源:通过自定义协议返回个性化内容@mcp.resource("greeting://{name}")# 自定义资源协议,支持参数传参defget_greeting(name:str)->str:"""Get a personalized greeting(资源描述,说明功能用途)"""returnf"Hello, {name}!"# 3. 多风格问候提示词:为AI生成指定风格的问候语提供模板@mcp.prompt()# 装饰器标记为MCP提示词工具defgreet_user(name:str, style:str="friendly")->str:"""Generate a greeting prompt(生成不同风格的问候提示词)"""# 定义三种问候风格,默认友好风格 styles ={"friendly":"Please write a warm, friendly greeting","formal":"Please write a formal, professional greeting","casual":"Please write a casual, relaxed greeting",}# 返回匹配的风格提示词,无匹配则使用友好风格returnf"{styles.get(style, styles['friendly'])} for someone named {name}."# 启动MCP服务:使用标准输入输出传输协议(stdio) 本地服务,兼容Cherry Studioif __name__ =="__main__": mcp.run(transport="stdio")代码核心说明
- FastMCP(“Demo”):快速初始化 MCP 服务,Demo为服务名称,在 Cherry Studio 中会显示该名称
- 三大核心装饰器:
@mcp.tool():标记可调用工具,AI 能直接执行并返回结果(如加法计算)
@mcp.resource():标记资源服务,通过自定义协议提供静态 / 动态资源(如个性化问候)
@mcp.prompt():标记提示词工具,为 AI 生成指定风格的内容提供模板
六、客户端准备:安装 Cherry Studio(MCP 联调工具)
Cherry Studio 是一款专为 MCP 协议设计的 AI 客户端,能无缝对接自定义 MCP 服务,无需复杂的接口配置,是测试自定义 MCP 服务的最佳工具。
1. 下载安装
官网下载地址:https://www.cherry-ai.com/download
支持 Windows/macOS 系统,一键安装无附加组件
安装完成后打开,完成基础注册 / 登录(免费可用)
2. 安装 Cherry 内置工具(基础准备)


添加MCP 服务器

七、关键步骤:Cherry Studio 添加自定义 MCP 服务

输入完后,点保存并打开。

八、联调测试:验证自定义 MCP 服务是否生效
回到首页,输入使用MCP 1+3 等于多少? 发送输出5 证明已调用到我们自己写的MCP 服务中。

九、在Trace 中配置MCP stdi模式使用
1. 配置mcp:
{"mcpServers":{"mcp-stdio-add":{"command":"python", "args":["D:\\AiMcpProject\\mcp_server\\main.py"], "env":{}}}}
2.输入 使用 mcp-stdio-add 工具计算 1+3 的和,发送即可

十、 运行 MCP see模式
main.py 配置 see 和端口 8001
if __name__ =="__main__": mcp.settings.port =8001 mcp.run(transport="sse")完整代码(可直接复制使用)
from mcp.server import FastMCP # Create an MCP server mcp = FastMCP("Demo")# Add an addition [email protected]()defadd(a:int, b:int)->int:"""Add two numbers"""return a + b +1#多加1 测试是走了我们自己的mcp# Add a dynamic greeting [email protected]("greeting://{name}")defget_greeting(name:str)->str:"""Get a personalized greeting"""returnf"Hello, {name}!"# Add a [email protected]()defgreet_user(name:str, style:str="friendly")->str:"""Generate a greeting prompt""" styles ={"friendly":"Please write a warm, friendly greeting","formal":"Please write a formal, professional greeting","casual":"Please write a casual, relaxed greeting",}returnf"{styles.get(style, styles['friendly'])} for someone named {name}."# sse stdio Streamable Http# Run with streamable HTTP transportif __name__ =="__main__": mcp.settings.port =8001 mcp.run(transport="sse")运行程序:

Trace 配置MCP sse:
输入 使用 mcp-stdio-add 工具计算 1+3 的和,发送即可, 会输出结果 和 python端输出接口请求
