Agent工坊

【Agent工坊】MCP Python SDK v2 实战:用新版无状态协议搭一个生产级工具链

2026年7月28日,MCP协议发布了史上最大的一次架构变革。Python SDK 同步推出 v2 版本,彻底告别了有状态会话。你的工具链不会因此变弱——反而会在部署和扩展上获得质的飞跃。这篇 5000 字实战教程带你从零搭建、调试、上线,覆盖全部关键踩坑点。

一、MCP 2026-07-28:这次更新到底改了什么

2026年7月28日,MCP(Model Context Protocol)正式发布了 2026-07-28 版规范。这距离上次大更新(2025年11月)已经过去了8个月,期间 MCP 生态爆发式增长——仅 Python SDK 的每月下载量就接近 5 亿次,TypeScript 和 Python SDK 均突破了 10 亿总下载量

这次更新的核心是一个大胆的决定:把 MCP 从"双向有状态协议"改造成"请求/响应无状态协议"。用通俗的话说,以前每一条连接都需要服务器记住"你是谁",现在每条请求自带身份信息,服务器不需要记任何事。

具体变化有七个关键点:

第一,握手和会话被彻底移除。 旧协议里,客户端必须先发 initialize 请求,服务器返回 Mcp-Session-Id,之后所有请求都得带上这个 Session ID。这意味着一个用户的所有请求必须打到同一台服务器实例——如果你有 3 台实例做负载均衡,就必须配粘性路由或共享 Session 存储(Redis)。新协议把这些全删了:每条请求在 _meta 字段里携带客户端身份和协议版本,任何一台实例都能独立处理,不需要共享任何东西。

第二,Header 级别路由。 Mcp-MethodMcp-Name 现在作为 HTTP 请求头传输。这意味着你的 API 网关、WAF、限流器可以直接在 Header 层面做决策——看到 Mcp-Method: tools/call 就限流,看到 Mcp-Name: search 就路由到搜索引擎集群。完全不需要解析 JSON 请求体。

第三,列表结果可缓存。 tools/listresources/list 的响应现在自带 ttlMs(缓存有效期)和 cacheScope(缓存作用域)。客户端可以缓存工具目录,不用每次都重新拉取。这对大模型来说很重要——每次调用前重新拉工具列表会消耗 token 和延迟,有了缓存机制,只有工具列表真的变了才需要刷新。

第四,多轮交互(MRTR)替代长连接。 旧协议里,如果工具执行到一半需要用户确认(比如"确定删除 3 个文件吗?"),服务器通过 SSE 推送一个提示给客户端。这要求连接一直保持打开。新协议的 MRTR 机制改为:服务器返回 inputRequired 结果,客户端收集用户答案后重新发起原请求,带着 inputResponsesrequestState。任何实例都能处理这个重试请求,因为所有上下文都在请求体里。

第五,正式弃用三项功能。 Roots(根目录列表)、Sampling(服务器请求 LLM 补全)、Logging(日志通知)被标记为弃用,但有 12 个月的宽限期。HTTP+SSE 传输方式也被弃用。同时弃用了 Dynamic Client Registration(DCR),转向 Client ID Metadata Documents(CIMD)。

第六,授权机制全面增强。 Token 必须绑定到签发它的授权服务器,不能跨服务器复用(RFC 9207 标准)。这堵上了一个严重的安全漏洞:在旧协议里,攻击者可以从一个授权服务器拿到 Token 去访问另一个服务器。

第七,正式扩展框架落地。 Tasks 长任务、MCP Apps(server 自带 UI)等作为扩展独立演进。Extensions 机制的引入意味着 MCP 核心协议可以保持稳定,新功能通过扩展逐步加入。

这些变化看似激进,但实际是为了解决一个根本矛盾:MCP 的定位是"连接一切 AI 工具的标准协议",但有状态的架构让它在生产环境部署时问题重重。无状态化之后,MCP 终于可以像普通 HTTP API 一样轻松扩展了。

二、环境准备:5 分钟搭好开发环境

MCP 社区已经全面拥抱 uv 作为包管理器。它用 Rust 写成,依赖解析速度比 pip 快 10-100 倍,而且自带虚拟环境管理。

安装 uv

# macOS / Linux

curl -sSf https://install.python-uv.org | bash

# Windows(PowerShell 管理员运行)

powershell -c "irm https://install.python-uv.org | iex"

# 验证安装

uv --version

创建项目并安装 SDK

mkdir my-first-mcp && cd my-first-mcp

uv init

uv add "mcp[cli]"

这里的关键是 mcp[cli] 而不是 mcp[cli] 额外包含了 mcp dev 命令——这是开发过程中最重要的调试工具。如果只装 mcp,你会发现自己少了一个最关键的命令。

⚠️ 踩坑 1mcp dev server.py 会启动内置的 MCP Inspector 浏览器界面,提供交互式工具测试、请求/响应查看、性能耗时分析。这是目前最快的 MCP Server 调试方式——比自己写 curl 命令效率高 10 倍。但如果你只装了 pip install mcp 没有 [cli],这个命令不存在,你会浪费很多时间。

验证安装是否成功:

uv run python -c "from mcp.server import MCPServer; print('OK')"

如果输出 OK,环境就准备就绪了。

三、实战一:你的第一个 MCP Server(工具 + 资源 + 提示词)

先从最简单但功能完整的服务器开始——提供天气查询和基础数学运算。

创建 server.py

"""MCP Server v2 — 天气预报 + 计算器"""

from mcp.server import MCPServer

# v2 直接用 MCPServer,不再需要 FastMCP 包装层

mcp = MCPServer("WeatherCalc")

# ── 工具:数学运算 ──

@mcp.tool()

def add(a: int, b: int) -> int:

    """返回两个整数的和"""

    return a + b

@mcp.tool()

def divide(a: float, b: float) -> dict:

    """安全除法,返回商和余数(除数为零时返回错误)"""

    if b == 0:

        return {"error": "除数不能为零"}

    return {

        "quotient": round(a / b, 4),

        "remainder": round(a % b, 4),

    }

# ── 工具:天气查询(模拟数据) ──

@mcp.tool()

def get_weather(city: str) -> str:

    """查询指定城市的天气状况"""

    weather_db = {

        "北京": "晴,25°C,湿度 45%,北风 3 级",

        "上海": "多云,28°C,湿度 65%,东南风 2 级",

        "深圳": "阵雨,30°C,湿度 80%,西南风 4 级",

        "成都": "阴,22°C,湿度 70%,无持续风向",

        "杭州": "小雨,24°C,湿度 85%,东北风 2 级",

    }

    return weather_db.get(city, f"未找到「{city}」的天气数据。支持的城市:{', '.join(weather_db.keys())}")

# ── 资源:可查询的城市列表 ──

@mcp.resource("weather://cities")

def list_cities() -> str:

    """返回当前支持天气查询的城市列表"""

    return "北京, 上海, 深圳, 成都, 杭州"

# ── 提示词模板 ──

@mcp.prompt()

def travel_advice(city: str) -> str:

    """根据城市天气生成出行建议提示词"""

    return f"""请根据 {city} 的天气情况,给出一份出行建议报告。报告应包含:

1. 穿衣建议

2. 是否需要带雨具

3. 户外活动适宜度

4. 健康提醒(如防晒、防寒等)"""

if __name__ == "__main__":

    mcp.run(transport="stdio")

启动 Inspector 调试

uv run mcp dev server.py

你会看到类似这样的输出:

Available tools:

  - add: 返回两个整数的和

  - divide: 安全除法,返回商和余数(除数为零时返回错误)

  - get_weather: 查询指定城市的天气状况

Available resources:

  - weather://cities: 返回当前支持天气查询的城市列表

Available prompts:

  - travel_advice: 根据城市天气生成出行建议提示词

✓ MCP Inspector running at http://localhost:5173

打开浏览器访问 get_weather,输入 {"city": "深圳"}`,右侧立刻显示返回结果:

"阵雨,30°C,湿度 80%,西南风 4 级"

整个开发→测试的循环极其高效:改一行代码 → 重启 Inspector → 点一下测试按钮 → 看结果。全程不到 5 秒。

⚠️ 踩坑 2:所有 @mcp.tool() 装饰的函数必须有完整的 type hints。MCP 依赖这些类型注解生成 JSON Schema,宿主 AI 才能知道传什么参数、什么类型。如果你写 def search(q) 而不是 def search(q: str),AI 模型拿到的是一个无类型约束的参数,传参质量会大幅下降。

⚠️ 踩坑 3:函数返回类型建议用具体类型而非裸 dict。虽然 -> dict 在 Python 中不报错,但 MCP 的 JSON Schema 推导会变成 {"type": "object"}——完全没有字段级别的结构信息。更好的做法是用 TypedDict 或 Pydantic Model。

四、实战二:接真实 API——Hacker News 搜索引擎

上面的例子是模拟数据。现在做一个真正有用的工具:搜索 Hacker News 上的 AI 相关内容,数据来自 HN Algolia 免费 API。

"""MCP Server — Hacker News 实时搜索"""

from mcp.server import MCPServer

import json

import urllib.request

import urllib.parse

mcp = MCPServer("HN Explorer")

@mcp.tool()

def search_hn(query: str, limit: int = 5) -> dict:

    """搜索 Hacker News 上与 AI 相关的热门文章。

    Args:

        query: 搜索关键词。示例:MCP protocol, Claude Code, OpenAI

        limit: 返回结果数量(1-20),默认 5

    Returns:

        包含查询词、结果数量和文章列表的字典

    """

    encoded_query = urllib.parse.quote(query)

    url = (

        f"https://hn.algolia.com/api/v1/search?"

        f"query={encoded_query}&tags=story&hitsPerPage={min(limit, 20)}"

    )

    try:

        with urllib.request.urlopen(url, timeout=10) as resp:

            data = json.loads(resp.read().decode())

    except Exception as e:

        return {"error": f"HN API 请求失败: {str(e)}"}

    results = []

    for hit in data.get("hits", []):

        results.append({

            "title": hit.get("title"),

            "url": hit.get("url") or (

                f"https://news.ycombinator.com/item?id={hit.get('objectID')}"

            ),

            "points": hit.get("points", 0),

            "comments": hit.get("num_comments", 0),

            "author": hit.get("author"),

            "created_at": hit.get("created_at", ""),

        })

    return {

        "query": query,

        "total_results": data.get("nbHits", 0),

        "returned": len(results),

        "results": results,

    }

@mcp.tool()

def get_top_stories(limit: int = 10) -> dict:

    """获取 Hacker News 当前热榜文章

    Args:

        limit: 返回条数,默认 10

    Returns:

        包含热榜文章的字典,按热度排序

    """

    url = f"https://hn.algolia.com/api/v1/search?" \

          f"tags=front_page&hitsPerPage={min(limit, 30)}"

    try:

        with urllib.request.urlopen(url, timeout=10) as resp:

            data = json.loads(resp.read().decode())

    except Exception as e:

        return {"error": f"获取热榜失败: {str(e)}"}

    stories = []

    for hit in data.get("hits", []):

        stories.append({

            "title": hit.get("title"),

            "url": hit.get("url", ""),

            "points": hit.get("points", 0),

            "comments": hit.get("num_comments", 0),

        })

    return {"stories": stories}

@mcp.resource("hn://topics")

def hot_topics() -> str:

    """当前 AI 社区热门话题关键词"""

    return "\n".join([

        "MCP protocol 2026-07-28",

        "Claude Code agent automation",

        "Python SDK v2 migration",

        "AI agent orchestration",

        "Open-source LLM deployment",

    ])

if __name__ == "__main__":

    mcp.run(transport="stdio")

这个工具可以直接被 Claude Desktop 或 Cursor 调用。比如用户说:「帮我搜一下 HN 上关于 MCP 2026-07-28 的讨论」,Claude 会自动调用 search_hn("MCP 2026-07-28"),拿到结果后帮你总结。

⚠️ 踩坑 4urllib.request.urlopen 在某些内网环境或代理环境下可能超时。生产环境建议用 httpxaiohttp 替代,设置合理的超时和重试策略。

⚠️ 踩坑 5:HN Algolia API 有时对中文关键词返回零结果。这是因为 Algolia 的索引对 CJK 分词支持有限。建议用英文关键词搜索,或者在 prompt 里引导 AI 先用英文搜再翻译。

五、连接 AI 宿主:Claude Desktop / Cursor

MCP Server 本身只是一个后台进程,需要通过配置文件接入 AI 宿主才能被使用。

Claude Desktop 配置

编辑配置文件:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json

{

  "mcpServers": {

    "hn-explorer": {

      "command": "uv",

      "args": [

        "run",

        "--directory",

        "/absolute/path/to/my-first-mcp",

        "server.py"

      ]

    }

  }

}

重启 Claude Desktop,新对话里输入「帮我看看 HN 上今天最火的 AI 话题」,Claude 会自动发现并调用 get_top_stories 工具。

Cursor 配置

Cursor 的配置更简单,在项目根目录创建 .cursor/mcp.json

{

  "mcpServers": {

    "hn-explorer": {

      "command": "uv",

      "args": ["run", "--directory", ".", "server.py"]

    }

  }

}

Cursor 里 --directory 可以用 . 相对路径,这个比 Claude Desktop 友好。

⚠️ 踩坑 6:Claude Desktop 的 --directory 必须用绝对路径。因为它从自己的安装目录启动,相对路径会解析到完全错误的位置。这是新手最常见的配置错误。

⚠️ 踩坑 7:如果你看到「无法连接到 MCP 服务器」,先确认三件事:(1) uv run python server.py 能独立运行不报错;(2) 配置文件的 JSON 格式正确(多余的逗号会导致解析失败);(3) uv 在系统 PATH 中(用 which uv 验证)。

六、从 v1 迁移到 v2:三个最疼的变化

如果你之前用 v1 写过 MCP Server,迁移到 v2 时以下是实际踩过的坑:

变化一:不再有 initialize 握手

v1 的代码里有显式的握手过程,v2 全部移除。代码对比:

# v1 风格(需要 async + 握手)

from mcp.server.fastmcp import FastMCP

import asyncio

mcp = FastMCP("MyServer")

async def main():

    async with mcp.run_stdio_async():

        ...

asyncio.run(main())

# v2 风格(去掉握手,可以直接非 async)

from mcp.server import MCPServer

mcp = MCPServer("MyServer")

if __name__ == "__main__":

    mcp.run(transport="stdio") # 同步调用,一行搞定

变化二:FastMCP → MCPServer

FastMCP 在 v2 中仍然存在(作为 MCPServer 的包装),但官方文档已经推荐直接用 MCPServer。API 几乎一样——@mcp.tool()@mcp.resource()@mcp.prompt() 这些装饰器的用法完全相同。主要的区别是初始化方式从 FastMCP(name) 变成了 MCPServer(name)

变化三:如果你用了 Mcp-Session-Id

v1 里很多开发者利用 session ID 来追踪状态(比如"当前用户打开了哪个浏览器窗口")。v2 没有 session 了,正确的做法是把状态 ID 作为工具参数显式传递:

# v2:显式传状态

@mcp.tool()

def search_page(browser_id: str, query: str) -> dict:

    """browser_id 由模型在多步操作中显式传递"""

    browser = get_browser_instance(browser_id)

    return browser.search(query)

模型的优点恰恰在这里:它能看到 browser_id,可以在多个工具调用之间自动传递这个标识符,就像人类在多步操作中记住"我在用那个窗口"一样自然。这比隐藏在传输层的 session 状态更透明、更可控。

七、生产部署:从本地 stdio 到云端 HTTP

本地开发用 stdio 就够了。但如果你要把 MCP Server 部署到服务器供团队使用,需要用 Streamable HTTP transport。

改为 HTTP 模式

if __name__ == "__main__":

    # 开发:uv run mcp dev server.py

    # 生产:

    mcp.run(transport="http", host="0.0.0.0", port=8000)

Nginx 反向代理(无需粘性路由)

upstream mcp_cluster {

    # v2 不需要 ip_hash 或 sticky cookie!

    server 127.0.0.1:8001;

    server 127.0.0.1:8002;

    server 127.0.0.1:8003;

}

server {

    listen 80;

    server_name mcp.yourdomain.com;

    location /mcp {

        proxy_pass http://mcp_cluster;

        proxy_http_version 1.1;

        proxy_set_header Host $host;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    }

}

v1 的话,这个 nginx 配置必须在 upstream 块里加 ip_hash 或部署 Redis 做 session 共享,否则状态会丢失。v2 完全不需要这些——任何请求打到任何实例都能正确处理。

Docker 化

FROM python:3.12-slim

WORKDIR /app

COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv

COPY pyproject.toml uv.lock ./

RUN uv sync --frozen --no-dev

COPY server.py .

EXPOSE 8000

CMD ["uv", "run", "python", "server.py"]

一行命令部署:

docker build -t my-mcp-server . && docker run -p 8000:8000 my-mcp-server

八、进阶实战:做一个 AI 内容创作的 MCP 工具套件

理解了基础概念后,我们做一个更贴近实际业务的例子——为 AI 创业者打造的内容创作工具套件。这个工具包含三个能力:

功能设计

  • 字数统计工具:分析一篇文章的中文字数、英文单词数、段落数、阅读时间
  • 标题评分工具:根据标题的吸引力、信息密度、点击率潜力打分
  • 排版模板资源:提供三种公众号排版模板供 AI 参考

"""MCP Server — AI 内容创作工具套件"""

from mcp.server import MCPServer

import re

mcp = MCPServer("Content Toolkit")

@mcp.tool()

def analyze_article(text: str) -> dict:

    """分析文章的统计信息:字符数、段落数、预估阅读时间等。

    Args:

        text: 要分析的文章全文(支持中英文混合)

    Returns:

        包含 cn_chars, en_words, paragraphs, reading_time_minutes 的统计字典

    """

    cn_chars = len(re.findall(r'[\u4e00-\u9fff]', text))

    en_words = len(re.findall(r'[a-zA-Z]+', text))

    paragraphs = len([p for p in text.split('\n\n') if p.strip()])

    # 中文阅读速度约 400 字/分钟,英文约 200 词/分钟

    reading_time = round(cn_chars / 400 + en_words / 200, 1)

    return {

        "cn_chars": cn_chars,

        "en_words": en_words,

        "total_chars": len(text),

        "paragraphs": paragraphs,

        "reading_time_minutes": max(reading_time, 0.1),

        "fits_wechat": "✅ 适合" if cn_chars <= 5000 else "⚠️ 偏长,公众号建议拆分",

    }

@mcp.tool()

def score_title(title: str) -> dict:

    """对文章标题进行多维度评分,帮助优化点击率。

    Args:

        title: 文章标题文本

    Returns:

        包含各维度评分和总分(满分 100)的字典

    """

    score = 0

    details = {}

    # 长度评分(公众号标题 15-25 字最佳)

    cn_len = len(re.findall(r'[\u4e00-\u9fff]', title))

    if 15 <= cn_len <= 25:

        details["长度"] = (10, "15-25字,最佳长度 ✅")

        score += 10

    elif 10 <= cn_len <= 30:

        details["长度"] = (6, f"{cn_len}字,长度可接受")

        score += 6

    else:

        details["长度"] = (2, f"{cn_len}字,偏短或偏长")

    # 数字/数据评分

    if re.search(r'\d+', title):

        details["数据感"] = (15, "包含数字,增强可信度 ✅")

        score += 15

    else:

        details["数据感"] = (5, "缺少数字,建议加入具体数据")

    # 悬念/对比评分

    suspense_patterns = ['为什么', '如何', '怎样', '竟然', '居然', 'vs', 'VS', '还是']

    if any(p in title for p in suspense_patterns):

        details["悬念感"] = (15, "包含悬念/对比元素,增加点击欲 ✅")

        score += 15

    else:

        details["悬念感"] = (8, "信息陈述为主,可增加对比或悬念")

    # 情绪词评分

    emotional = ['必看', '重磅', '炸裂', '终于', '全面', '终极', '实战']

    if any(e in title for e in emotional):

        details["情绪张力"] = (10, "包含情绪词,提升紧迫感 ✅")

        score += 10

    else:

        details["情绪张力"] = (5, "偏平实,可适当增加情绪词")

    details["总分"] = min(score, 100)

    return {"title": title, "total_score": min(score, 100), "details": details}

@mcp.resource("template://wechat-article")

def article_template() -> str:

    """公众号文章排版模板(Markdown 格式)"""

    return """# 标题

> 一句话核心观点,吸引读者点进来

## 开篇钩子

200字以内讲清楚这篇文章解决什么问题、读者能得到什么。

## 核心内容分 3-5 个章节

每章有数据支撑、案例说明、可操作步骤。

## 总结

核心要点回顾 + 行动号召。

<hr>

#标签1 #标签2 #标签3

> 💡 觉得有用?分享给需要的朋友。关注「AI创业内参」,获取更多实战干货。"""

if __name__ == "__main__":

    mcp.run(transport="stdio")

这个工具套件在实际使用中非常高效。比如你对 Claude 说「帮我分析这篇文章的字数和结构,然后给这篇新文章起 5 个标题并打分」,Claude 会自动调用 analyze_article 获取统计信息,然后调用 score_title 对每个候选标题评分排序——全自动完成,几秒钟出结果。

⚠️ 踩坑 8@mcp.resource() 返回的模板内容里如果包含 Markdown 格式符号,AI 模型会正确理解并用于排版。但如果返回的是 HTML,AI 可能会混淆。建议 resource 返回纯 Markdown 或纯文本,让宿主 AI 自己决定渲染方式。

九、常见问题与排障

Q: 我的 MCP Server 启动了但 Claude 找不到工具?

A: 三步排查法:(1) 确认 uv run python server.py 能独立运行不报错;(2) 确认配置文件 JSON 格式正确——特别是结尾不能有多余逗号;(3) 检查 uv 是否在系统 PATH 中(which uv)。如果以上都没问题,重启 Claude Desktop 后查看「Developer → MCP Logs」获取详细错误。

Q: stdio 和 HTTP transport 应该选哪个?

A: 本地开发用 stdio(零配置,直接跑)。生产环境用 HTTP(可水平扩展、可加认证中间件、可配负载均衡)。注意 stdio 模式每次 Claude 启动都会新开一个进程,适合轻量工具;HTTP 模式是常驻进程,适合有缓存或需要维持数据库连接的工具。

Q: 一个 Server 里建议放多少个工具?

A: 没有硬性限制,但经验法则是 3-8 个工具最合适。太少说明功能拆得太粗(一个工具做太多事,AI 难以选择);太多会让工具的 JSON Schema 总大小超限(部分宿主 AI 对工具描述总长度有限制)。如果一个 Server 需要 10+ 个工具,建议拆成多个独立的 Server。

Q: v2 的 _meta 字段里应该放什么?

A: _meta 是 v2 替代旧握手信息的关键字段。至少应该包含 io.modelcontextprotocol/clientInfo(客户端名称和版本)。如果你的 Server 在网关后面,还建议加 traceparent(W3C Trace Context)做分布式追踪。不需要像 v1 那样把所有能力列表塞进去——v2 有专门的 server/discover 方法按需查询。

Q: 工具函数里能做异步操作吗?比如调外部 API 或查数据库?

A: 可以但不推荐在同步函数里用 asyncio.run()。正确做法是使用 @mcp.tool() 配合 async def——MCPServer 完全支持异步工具函数。示例:

import httpx

@mcp.tool()

async def fetch_price(symbol: str) -> dict:

    """异步查询股票价格"""

    async with httpx.AsyncClient() as client:

        resp = await client.get(f"https://api.example.com/price/{symbol}")

        return resp.json()

十、总结:无状态化对开发者的真正价值

MCP 2026-07-28 规范的发布和 Python SDK v2 的推出,做了一件看似"减法"的事——去掉会话层、去掉握手、去掉粘性路由依赖。但这恰恰是 MCP 走向生产级的关键一步。无状态化意味着你的 MCP Server 可以像普通 HTTP API 一样部署:挂负载均衡、配自动扩缩容、加 API 网关限流——所有这些都不再需要额外的状态同步层。

回顾一下我们从零到一完成的事情:安装环境、写第一个 MCP Server、用 Inspector 交互调试、接入 HN 真实 API、连接 Claude Desktop 实测、用 Docker 部署上线。这套流程适用于任何你未来需要定制的 AI 工具链。

一个简单的对比:

v1(2025-11-25)v2(2026-07-28)
负载均衡需要 ip_hash 或 Redis普通轮询即可
首次调用先 initialize 握手直接发 tool call
网关限流需解析 JSON body读 Header 即可
工具目录每次重新拉取支持 ttlMs 缓存
长任务依赖 SSE 长连接MRTR 轮询模式
水平扩展需共享存储无状态,随意扩

下一步行动:用上面 server.py 的模板,花 30 分钟走通完整流程——写工具→mcp dev 调试→接入 Claude Desktop→实际对话测试。跑通一次,你就掌握了用 AI Agent 工具链开发的核心技能。


#AI创业 #Agent工坊 #MCP协议 #Python开发 #AI工具链 #一人公司

本文由AI辅助创作,经人工审核编辑发布

更多一人公司案例与工具,微信搜索「AI创业内参」关注我们