Python MCP 完整示例:Server + Client
·
Python MCP 完整示例:Server + Client
一套最小但完整的 Python MCP 示例:
- 一个
MCP Server(提供工具) - 一个
MCP Client(连接并调用工具) - 一组可直接复制执行的命令
示例使用 stdio 传输,优点是本地调试最稳、最简单。
1. 目录结构
temp/mcp/
server.py
client.py
2. MCP Server(server.py)
from datetime import datetime
from typing import Literal
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("Daily Report MCP Server", json_response=True)
@mcp.tool()
def add(a: int, b: int) -> int:
"""返回两个整数之和。"""
return a + b
@mcp.tool()
def build_daily_report(
name: str,
date: str,
work_items: list[str],
status: Literal["已完成", "进行中"] = "已完成",
) -> str:
"""根据工作项生成日报正文。"""
if not work_items:
return "今日暂无可记录工作项。"
lines = [
"技术日报】",
f"{name} | {date}",
"",
"一、今日核心工作",
f"◦ 需求/任务:完成 {len(work_items)} 项开发/优化任务",
"◦ 交付物:代码改动、配置更新、联调与本地验证结果",
f"◦ 状态:{status}",
"",
"二、今日产出物(必填)",
]
for item in work_items:
lines.append(f"◦ {item}")
lines.extend(
[
"",
"三、进度与质量自评",
f"• 今日任务总数:{len(work_items)}项,完成:{len(work_items)}项",
'• 未完成原因(无则填"无"):无',
"",
"四、今日问题与解决方案",
"问题:无",
"解决方案:无",
"",
"五、需要协调支持",
"无",
"",
"六、明日工作计划(必填)",
"◦ 对今日改动做回归验证并补充边界测试",
"◦ 持续推进下一批需求开发",
"",
f"生成时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}",
]
)
return "\n".join(lines)
if __name__ == "__main__":
# stdio 模式:适合本地作为子进程被 MCP Client 拉起
mcp.run()
3. MCP Client(client.py)
import asyncio
import sys
from contextlib import AsyncExitStack
from pathlib import Path
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
def extract_text(result) -> str:
"""从 CallToolResult 中提取可读文本。"""
texts = []
for block in getattr(result, "content", []):
text = getattr(block, "text", None)
if text:
texts.append(text)
return "\n".join(texts) if texts else str(result)
async def main() -> None:
server_script = Path(__file__).with_name("server.py")
if not server_script.exists():
raise FileNotFoundError(f"找不到 server.py: {server_script}")
server_params = StdioServerParameters(
command=sys.executable,
args=[str(server_script)],
env=None,
)
async with AsyncExitStack() as stack:
read_stream, write_stream = await stack.enter_async_context(stdio_client(server_params))
session = await stack.enter_async_context(ClientSession(read_stream, write_stream))
# 1) MCP 初始化握手
await session.initialize()
# 2) 查看服务端有哪些工具
tools_result = await session.list_tools()
print("可用工具:", [tool.name for tool in tools_result.tools])
# 3) 调用 add 工具
add_result = await session.call_tool("add", arguments={"a": 7, "b": 5})
print("add(7,5) =>", extract_text(add_result))
# 4) 调用 build_daily_report 工具
report_result = await session.call_tool(
"build_daily_report",
arguments={
"name": "於鸣",
"date": "2026-03-24",
"status": "已完成",
"work_items": [
"设计 JSON Schema 配置文件格式,处理 q 非必填并联调前端",
"修复 Bing/Bing Shopping 因 JS 失败导致 HTML 白屏问题",
"完成 Naver 引擎开发与 JSON Schema 文件编写",
"完成推特 AI 博主关键词采集任务配置并本地运行",
],
},
)
print("\n===== 日报输出 =====")
print(extract_text(report_result))
if __name__ == "__main__":
asyncio.run(main())
4. 安装与运行
在 temp/mcp 目录执行:
# 1) 创建并激活虚拟环境(可选)
python -m venv .venv
# Linux/macOS
source .venv/bin/activate
# Windows PowerShell
# .venv\Scripts\Activate.ps1
# 2) 安装依赖
pip install "mcp[cli]"
# 3) 运行客户端(客户端会自动拉起 server.py)
python client.py
5. 一次真实调用会发生什么
当你执行 python client.py,流程是:
client.py作为 MCP Client 启动并拉起server.py子进程。- Client 和 Server 先完成
initialize握手。 - Client 调用
tools/list,拿到工具清单。 - Client 依次调用
tools/call(add)和tools/call(build_daily_report)。 - Server 执行工具函数并返回结果给 Client。
6. 预期输出(示例)
可用工具: ['add', 'build_daily_report']
add(7,5) => 12
===== 日报输出 =====
技术日报】
於鸣 | 2026-03-24
...
7. 常见问题
-
ModuleNotFoundError: No module named 'mcp'
先执行pip install "mcp[cli]",并确认当前解释器就是安装依赖的解释器。 -
Windows 下
python不存在
直接用py client.py,或把命令改成你的 Python 全路径。 -
工具调用结果不是纯文本
MCP 返回的是结构化content,示例中的extract_text()已做文本提取。
更多推荐


所有评论(0)