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,流程是:

  1. client.py 作为 MCP Client 启动并拉起 server.py 子进程。
  2. Client 和 Server 先完成 initialize 握手。
  3. Client 调用 tools/list,拿到工具清单。
  4. Client 依次调用 tools/call(add)tools/call(build_daily_report)
  5. Server 执行工具函数并返回结果给 Client。

6. 预期输出(示例)

可用工具: ['add', 'build_daily_report']
add(7,5) => 12

===== 日报输出 =====
技术日报】
於鸣 | 2026-03-24
...

7. 常见问题

  1. ModuleNotFoundError: No module named 'mcp'
    先执行 pip install "mcp[cli]",并确认当前解释器就是安装依赖的解释器。

  2. Windows 下 python 不存在
    直接用 py client.py,或把命令改成你的 Python 全路径。

  3. 工具调用结果不是纯文本
    MCP 返回的是结构化 content,示例中的 extract_text() 已做文本提取。

Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐