在本教程中,我们将通过构建一个简单的MCP server,并通过 OpenMCP进行测试。
MCP核心概念
MCP servers可以提供三种主要类型的功能:
- Resources: 客户端可以读取的类文件数据(如API响应或文件内容)
- Tools: LLM可以调用的函数(经过用户批准)
- Prompts: 帮助用户完成特定任务的预编写模板
本教程使用Python进行演示(当然还可使用TypeScript、Java、Rust等其他语言, 参考)。
📝 日志处理指南
在开发 MCP 服务器时,日志记录方式取决于服务器的传输协议。请根据您的实现方式遵循以下准则:
1. STDIO 基础服务器
严禁向标准输出写入任何内容。
- 🚫 禁止操作: 所有的调试打印语句(如 print() 、 console.log() 、 fmt.Println() 等)。
- ⚠️ 后果: 任何写入标准输出的内容都会破坏 JSON-RPC 消息流,导致服务器通信中断。
2. HTTP 基础服务器
标准输出日志是安全的。
- ✅ 允许操作: 可以正常使用标准输出进行日志记录。
- 💡 原因: 日志输出不会干扰 HTTP 响应数据。
安装 uv
本次将使用 uv 来管理项目
uv是用 Rust 编写的 Python 超快包管理器,可替代 pip 、 venv 和 pip-tools ,极速安装依赖并管理虚拟环境。
如果你还未使用过uv,请先下载安装:
pip install uv
查看 uv 的版本:
uv version
输出以下内容代表安装成功(版本号取决于你安装的版本)
scss
uv 0.8.22 (ade2bdbd2 2025-09-23)
快速开始
创建项目并初始化
bash
mkdir -p ~/codes/my_first_mcp
cd ~/codes/my_first_mcp
uv init --no-workspace
添加MCP相关库
csharp
uv add "mcp[cli]"
python
from mcp.server.fastmcp import FastMCP
# 初始化 FastMCP 服务器
mcp = FastMCP("我的第一个MCP")
@mcp.tool(name="greet", description="两个数相加")
def add(a: int, b: int) -> int:
return a + b
@mcp.resource("resource://{name}")
def get_greeting(name: str) -> str:
""""根据resource中的名字向他问好(资源名建议为英文,否则出现乱码)"""
return f"Hello, {name}!"
@mcp.prompt()
def greet_user(name: str, style: str = "friendly") -> str:
styles = {
"friendly": "写一个温暖友好的问候语",
"formal": "写一个正式的问候语",
"casual": "写一个随意的问候语"
}
return f"给{name}{styles.get(style, styles['friendly'])}"
# 以http方式启动服务器
if __name__ == "__main__":
mcp.run(transport="streamable-http")
测试
安装OpenMCP, 参考,效果如下

欢迎加入我的【ima知识库】 从零开始学MCP