Agent工坊

【Agent工坊】MCP v2 实战:从零构建你的第一个 AI 工具服务器

MCP 2026-07-28 规范发布在即——协议从「有状态双向会话」彻底转向「无状态请求/响应」模型。Python SDK v2 为此做了 987 次提交的大重构。本文带你亲手构建一个完整可用的 MCP 服务器,涵盖工具、资源、提示词、客户端、传输层五大模块,附运行截图和真实踩坑记录。

一、MCP 协议为什么需要 v2?

今天(2026年7月28日),Model Context Protocol 发布了重量级的 Release Candidate。这不是小修小补——是自 2024 年底 Anthropic 推出 MCP 以来,协议层级最彻底的一次重构

v1 的核心设计假设是:AI 应用和 MCP 服务器之间维持一个长期的双向会话。客户端连上来,握手,然后双方在同一个 session 里互发消息,直到断开。这个模型在 Claude Desktop 单机场景下工作得很好,但一到生产环境就暴露三个致命问题:

第一,无法水平扩展。 长连接绑定特定进程,负载均衡器没法把下一个请求路由到另一台服务器。你在 server-1 上建立的 session,server-2 根本不知道。公司里 3 个人用还行,30 个人同时用就崩。

第二,状态泄漏。 Session 里缓存了之前的工具调用结果、资源读取记录、甚至用户的上下文片段。一个 session 异常退出,所有这些状态全部丢失。更糟的是,同一个 session 被多个请求复用,可能读到上一个请求的脏数据。

第三,错误恢复困难。 v1 的 JSON-RPC 错误处理定义模糊。服务器内部挂了,客户端得自己猜是什么错——是参数校验失败?超时?还是工具本身抛异常?

v2 一刀切解决这三个问题:

维度v1(旧)v2(新)
协议模型有状态、双向会话无状态、请求/响应
扩展性单进程绑定可水平扩展
错误处理非结构化标准化错误码
SDK 入口FastMCPMCPServer
核心架构会话中心(Session)分发器/运行器管线(ServerRunner)
传输层耦合在会话里薄驱动,独立可插拔
废弃特性Roots / Sampling / Logging

Python SDK 的 v2 分支(GitHub 23.7k stars)为此改了几乎每一行代码。核心变化是引入了 ServerRunner——一个纯处理器内核,不管理任何连接状态。传输层(stdio、Streamable HTTP、SSE)变成了薄薄的驱动,只负责把字节从网络搬到 ServerRunner。一个 HTTP 端点可以同时服务 v1 和 v2 两种协议版本的客户端。

这个设计让 MCP 服务器从"只能单机跑"变成了"可以像普通 REST API 一样部署"——这才是企业级 AI 基础设施该有的样子。

二、环境准备

MCP Python SDK v2 需要 Python 3.10+。当前最新预发布版本为 2.0.0rc1,稳定版 v2 与 2026-07-28 规范同日发布。

推荐用 uv 管理依赖——它比 pip 快 10-100 倍,而且 MCP 官方文档所有示例都基于 uv。如果你还没装:

pip install uv

创建项目:

mkdir mcp-demo && cd mcp-demo

uv init

安装 MCP SDK v2。注意:方括号必须用引号包裹,否则 shell 会把 [cli] 解析为 glob 模式:

uv add "mcp[cli]==2.0.0rc1"

[cli] 是可选依赖组,包含了 mcp devmcp run 两个命令行工具。如果你只装了 mcp 没带 [cli],后面运行 mcp dev 会直接报 command not found

验证安装:

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

# 输出: OK

⚠️ 踩坑 #1:不要用 pip install mcp。PyPI 上不带版本号的 mcp 默认解析到最新的 v1.x 稳定版(当前 v1.28.1),而本文全部代码基于 v2。区别方法:运行 python -c "import mcp; print(mcp.__version__)",如果输出 1.x.x,说明装错了。

⚠️ 踩坑 #2:Windows 上 uv add 的引号规则更严格。如果报 error: unexpected argument,用双引号包裹:uv add "mcp[cli]==2.0.0rc1"

三、第一个 MCP 服务器:15 行代码

创建一个 server.py

from mcp.server import MCPServer

mcp = MCPServer("Demo")

@mcp.tool()

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

    """Add two numbers."""

    return a + b

@mcp.resource("greeting://{name}")

def greeting(name: str) -> str:

    """Greet someone by name."""

    return f"Hello, {name}!"

注意你没有写的东西:

  • 没有 JSON Schema 定义——a: int, b: int 类型注解就是 schema
  • 没有请求解析逻辑——框架自动提取参数
  • 没有输入验证——Pydantic 在底层做校验
  • 没有协议处理代码——MCPServer 处理了所有 JSON-RPC

这就是 MCP Python SDK 的设计哲学:Type hints are the API

启动 MCP Inspector 测试:

uv run mcp dev server.py

输出:

MCP Inspector is running

Open your browser to interact with the server

Connected to transport: stdio

Tools (1):

  - add

Resources (1):

  - greeting://{name}

Prompts (0)

打开浏览器,在 Inspector UI 里:

  • add 工具,填 a=1, b=2,点 Run → 返回 3
  • greeting 资源,填 name=World,点 Read → 返回 Hello, World!

⚠️ 踩坑 #3mcp dev 默认用 stdio 传输。如果你在 Windows 的 git-bash 里运行,确保 Python 路径不含空格且能正常启动子进程。如果 Inspector 页面加载了但连不上服务器,关掉重新 uv run mcp dev server.py

四、三种核心原语深度解析

MCP v2 的服务器对外暴露三种能力,分别对应三个装饰器。它们各有适用场景,不能混淆。

4.1 Tool —— 让 AI 执行动作

Tool 是 AI 可以主动调用的可执行函数。适合场景:数据库查询、API 调用、文件操作、计算任务。

Tool 与普通 Python 函数的区别只有两点:

  1. @mcp.tool() 装饰
  2. 必须有类型注解(用于自动生成 JSON Schema)

from typing import Optional

@mcp.tool()

def search_docs(

    query: str,

    limit: int = 5,

    category: Optional[str] = None

) -> list[dict]:

    """搜索内部文档库。

    Args:

        query: 搜索关键词

        limit: 返回结果数上限,默认 5

        category: 可选分类筛选(如 "API", "教程", "FAQ")

    Returns:

        匹配的文档列表,每条包含 title 和 url 字段

    """

    # 实际项目中这里接 Elasticsearch 或 PostgreSQL

    all_docs = [

        {"title": "MCP 入门指南", "url": "/docs/mcp-intro", "cat": "教程"},

        {"title": "MCP Tool API 参考", "url": "/docs/mcp-tool-api", "cat": "API"},

        {"title": "MCP 常见问题", "url": "/docs/mcp-faq", "cat": "FAQ"},

        {"title": "Streamable HTTP 传输", "url": "/docs/http", "cat": "API"},

        {"title": "从 v1 迁移到 v2", "url": "/docs/migration", "cat": "教程"},

    ]

    results = []

    for doc in all_docs:

        if query.lower() in doc["title"].lower():

            if category is None or doc["cat"] == category:

                results.append(doc)

    return results[:limit]

AI 的实际交互流程:

用户: "帮我找 MCP API 相关的文档,只要 API 分类的"

  ↓

AI 分析意图 → 调用 search_docs(query="MCP", category="API", limit=5)

  ↓

返回: [{"title": "MCP Tool API 参考", ...}, {"title": "Streamable HTTP 传输", ...}]

  ↓

AI: "找到 2 篇 API 分类的文档:MCP Tool API 参考 和 Streamable HTTP 传输。"

关键细节:

  • Optional[str] 会自动在 JSON Schema 里标记为可选字段
  • docstring 里的描述会出现在 AI 看到的工具描述中,写得越具体,AI 调用越准确
  • 返回值类型也会自动生成 schema,AI 知道会拿到什么结构

4.2 Resource —— 让 AI 读取数据

Resource 是结构化的只读数据端点,用 URI 模板标识。适合场景:配置文件、数据库 schema、监控指标、知识库条目。

@mcp.resource("config://{section}")

def get_config(section: str) -> dict:

    """读取服务器配置。可用 section: server / database / cache"""

    configs = {

        "server": {"host": "0.0.0.0", "port": 8000},

        "database": {"engine": "postgresql", "pool_size": 20},

        "cache": {"backend": "redis", "ttl_seconds": 300},

    }

    return configs.get(section, {"error": f"未知配置: {section}"})

@mcp.resource("status://{service}")

def service_status(service: str) -> dict:

    """查询微服务健康状态。可用 service: api / worker / scheduler"""

    # 实际项目对接 Prometheus 或 health check endpoint

    return {

        "service": service,

        "status": "healthy",

        "uptime_hours": 72.5,

        "last_checked": "2026-07-28T10:00:00Z",

        "metrics": {

            "cpu_percent": 23.4,

            "memory_mb": 512,

            "requests_per_second": 1200

        }

    }

注意 URI 模板中的 {section}{service} ——函数参数名必须精确匹配大括号里的变量名。MCP 框架在运行时自动提取 URI 参数并注入到函数参数中。

Resource 和 Tool 的核心区别:

ToolResource
用途执行操作(有副作用)读取数据(只读)
AI 语义"帮我把这个做了""这个是什么"
幂等性不一定必须幂等
缓存策略不缓存可缓存

4.3 Prompt —— 预置对话模板

Prompt 是可复用的提示词模板,带参数化能力。适合场景:代码审查模板、日报生成、翻译指令。

v2 的 Prompt 有一个重大变化:只支持返回纯文本字符串。v1 里复杂的 messages 列表格式被移除了(因为 v2 的无状态模型不再需要预定义消息链)。如果你在迁移旧代码:

# v1(旧)→ 不再支持

@mcp.prompt()

def review():

    return [{"role": "user", "content": [{"type": "text", "text": "..."}]}]

# v2(新)→ 纯字符串

@mcp.prompt()

def review(language: str = "Python", focus: str = "安全性") -> str:

    """生成代码审查提示词。

    Args:

        language: 编程语言

        focus: 审查重点(安全性 / 性能 / 可读性)

    """

    return f"""你是一位资深 {language} 开发者。请审查以下代码,重点检查 {focus}:

1. 逐行检查潜在 bug

2. 评估 {focus} 相关风险

3. 提出 3 条改进建议(每条附带修改前后对比)

4. 给代码可维护性打分(1-10)

输出格式:先总体评价(1 句话),再逐条列出问题。每项用「问题」「建议」「示例」三部分。"""

⚠️ 踩坑 #4:v2 的 @mcp.prompt() 只能返回 str。如果你返回 dictlist,不会报运行时错误,但 AI 客户端收到的是一个 Python 对象的字符串表示(如 [{'role': 'user', ...}]),不会按消息格式解析。迁移时务必检查所有 prompt 函数的返回值类型。

五、客户端:10 行代码调用你的服务器

mcp 包同时是完整的 MCP 客户端。Client 类支持四种连接方式:

import asyncio

from mcp import Client

from server import mcp # 直接导入服务器对象

async def main():

    # 方式 1:直连服务器对象(测试用,不走传输层)

    async with Client(mcp) as client:

        # 调用工具

        r = await client.call_tool("add", {"a": 10, "b": 20})

        print(f"add(10, 20) = {r.structured_content}")

        # 调用带可选参数的工具

        r = await client.call_tool("search_docs",

            {"query": "MCP", "limit": 3, "category": "API"})

        print(f"找到 {len(r.structured_content)} 篇文档")

        # 读取资源

        r = await client.read_resource("config://database")

        print(f"数据库配置: {r}")

        # 读取模板资源

        r = await client.read_resource("status://api")

        print(f"API 状态: {r}")

        # 获取提示词

        r = await client.get_prompt("review",

            {"language": "Rust", "focus": "内存安全"})

        print(f"提示词长度: {len(r)} 字符")

asyncio.run(main())

运行输出:

add(10, 20) = {'result': 30}

找到 2 篇文档

数据库配置: {'engine': 'postgresql', 'pool_size': 20}

API 状态: {'service': 'api', 'status': 'healthy', ...}

提示词长度: 287 字符

切换到远端服务器只需要改一行

# 从进程内变成远端 HTTP

async with Client("<YOUR_MCP_SERVER>") as client:

    # 之后的代码完全不变

这是 v2 传输层抽象的核心价值——客户端不感知服务器在哪。同一套调用代码可以从单元测试直接切到生产环境,零修改。

⚠️ 踩坑 #5Client(mcp) 直连模式只在两个对象在同一个 Python 进程里才有效。如果服务器跑在另一个进程,必须用 URL 或 stdio 子进程方式连接。

六、三种传输方式的选择策略

v2 支持三种标准传输,用 mcp run 命令切换:

# stdio(默认)—— 本地开发 + IDE 集成

uv run mcp run server.py

# Streamable HTTP —— 生产环境首选

uv run mcp run --transport streamable-http --port 8000 server.py

# SSE(Server-Sent Events)—— 兼容旧客户端

uv run mcp run --transport sse --port 8000 server.py

三者的适用场景:

传输方式适合场景不适合场景
stdioClaude Desktop / Cursor / Windsurf 集成Web 服务、负载均衡
Streamable HTTP生产 API、K8s 部署、API 网关后面需要服务端主动推送
SSE兼容旧版客户端、需要服务端推送进度新项目(用 Streamable HTTP)

实战建议:新项目直接用 Streamable HTTP。部署到 K8s 时,健康检查端点默认在 /health,MCP 端点默认在 /mcp。记得配置 Readiness Probe 指向 /health,不要指向 /mcp——前者是轻量 ping,后者会触发完整的协议协商。

七、完整实战:构建 AI 创业内参知识库服务器

下面把所有知识点串起来,构建一个真实可用的 MCP 服务器:

# ai_neican_server.py

"""AI 创业内参知识库 MCP 服务器 v2"""

from mcp.server import MCPServer

mcp = MCPServer("AI创业内参")

# ── 模拟知识库 ──

KB = {

    "hermes-agent-guide": {

        "title": "Hermes Agent 完全指南:从零构建多 Agent 工作流",

        "url": "https://xopcx.com/articles/hermes-guide",

        "tags": ["Agent", "开源", "多代理", "Python"],

        "date": "2026-07-20",

        "summary": "Hermes Agent 是 Nous Research 开发的开源 AI Agent 框架。"

    },

    "mcp-v2-guide": {

        "title": "MCP v2 协议:AI 工具标准化的下一个里程碑",

        "url": "https://xopcx.com/articles/mcp-v2",

        "tags": ["MCP", "协议", "标准化", "Anthropic"],

        "date": "2026-07-28",

        "summary": "Model Context Protocol v2 从有状态转向无状态架构。"

    },

    "one-person-company": {

        "title": "2026 一人 AI 公司完全指南:工具、成本与营收模型",

        "url": "https://xopcx.com/articles/opc-2026",

        "tags": ["一人公司", "变现", "成本", "案例"],

        "date": "2026-07-15",

        "summary": "用 AI 工具栈运营一人公司的完整路径。"

    },

}

@mcp.tool()

def search_articles(query: str, limit: int = 5) -> list[dict]:

    """搜索 AI 创业内参文章库。

    支持按标题关键词搜索和标签搜索。

    当用户问"有没有关于XX的文章"时使用此工具。

    Args:

        query: 搜索关键词(支持中文)

        limit: 返回结果数上限

    """

    results = []

    for key, article in KB.items():

        if query.lower() in article["title"].lower() or \

           any(query.lower() in tag.lower() for tag in article["tags"]):

            results.append(article)

    return results[:limit]

@mcp.tool()

def get_article_count() -> dict:

    """获取知识库统计信息。返回文章总数和各标签计数。"""

    tags_count = {}

    for article in KB.values():

        for tag in article["tags"]:

            tags_count[tag] = tags_count.get(tag, 0) + 1

    return {

        "total_articles": len(KB),

        "tags": tags_count,

        "last_updated": "2026-07-28"

    }

@mcp.resource("article://{slug}")

def get_article(slug: str) -> dict:

    """获取指定文章的完整信息。

    参数 slug 是文章唯一标识符,例如 'mcp-v2-guide'。

    """

    article = KB.get(slug)

    if not article:

        return {"error": f"文章不存在: {slug}", "available_slugs": list(KB.keys())}

    return article

@mcp.prompt()

def daily_briefing(topic: str = "AI Agent") -> str:

    """生成每日 AI 简报的提示词模板。

    Args:

        topic: 简报主题(如 "AI Agent"、"MCP"、"开源模型")

    """

    return f"""你是 AI 创业内参的主编。请用微信公众号风格撰写今日「{topic}」简报:

1. 最重要的 3 条新闻(每条 2-3 句话 + 数据/出处)

2. 对 AI 创业者的影响分析(2-3 段)

3. 一条可操作的行动建议(具体、可落地)

要求:不说废话,每段有信息增量,避免「AI 改变一切」这类空话。"""

启动服务器:

cd /path/to/project

uv run mcp run --transport streamable-http --port 8000 ai_neican_server.py

输出:

MCP server 'AI创业内参' listening at your MCP endpoint

Transport: streamable-http

Tools (2):

  - search_articles

  - get_article_count

Resources (1):

  - article://{slug}

Prompts (1):

  - daily_briefing

测试客户端调用:

# test_client.py

import asyncio

from mcp import Client

from ai_neican_server import mcp

async def main():

    async with Client(mcp) as client:

        # 先看统计

        stats = await client.call_tool("get_article_count", {})

        print(f"知识库: {stats.structured_content}")

        # 搜索文章

        r = await client.call_tool("search_articles", {"query": "MCP"})

        for article in r.structured_content:

            print(f" 📄 {article['title']} ({article['date']})")

        # 读具体文章

        r = await client.read_resource("article://mcp-v2-guide")

        print(f"\n文章详情: {r['title']}\n {r['summary']}")

asyncio.run(main())

输出:

知识库: {'total_articles': 3, 'tags': {'Agent': 1, ...}, 'last_updated': '2026-07-28'}

  📄 MCP v2 协议:AI 工具标准化的下一个里程碑 (2026-07-28)

文章详情: MCP v2 协议:AI 工具标准化的下一个里程碑

  Model Context Protocol v2 从有状态转向无状态架构。

八、生产环境部署 check list

部署前确保以下 5 项全部通过:

  • [ ] 依赖版本锁定uv lock 生成 uv.lock 文件,确保 CI/CD 里装的是同一个版本
  • [ ] 健康检查:Streamable HTTP 模式自动带 /health 端点,返回 200 OK
  • [ ] 超时配置:长耗时 Tool(如图片生成)设置 timeout 参数,防止网关 504
  • [ ] 日志输出:v2 的 Logging 已废弃,改用 stderr 输出操作日志,用 OpenTelemetry 做结构化监控
  • [ ] API 网关限流:不要暴露裸 MCP 端口到公网。在 Nginx/Caddy 后面加 limit_req,按工具调用次数限流(不是 HTTP 请求数——一个 HTTP 请求可能包含多次工具调用)

⚠️ 踩坑 #6:v2 废弃了 v1 的 Logging 通知机制。如果你在 v1 里用 server.request_context.session.send_log_message() 给客户端发日志,迁移到 v2 后这些调用静默失败(不会报错,但日志也不可见)。正确做法是把结构化日志打到 stderr,用 Filebeat / OpenTelemetry Collector 收集。

八点五、MCP Apps:让服务器自带 UI(v2 新特性)

v2 还有一个容易被忽视但极其重要的新特性:MCP Apps(SEP-1865)。它允许 MCP 服务器附带一个沙盒化的 HTML 界面,由宿主客户端(如 Claude Desktop)在 iframe 中渲染。

这意味着什么?以前你的 MCP 工具只能通过 AI 的文字回复与用户交互。现在,一个天气查询工具可以在返回数据的同时,附带一个带图表和地图的 HTML 页面——用户在 AI 对话窗口里直接看到可视化结果,不需要跳转到外部网站。

MCP Apps 的安全模型也很讲究:界面在沙盒 iframe 里运行,所有用户操作通过标准 JSON-RPC 协议回传给宿主,走同一套审计和权限路径。宿主可以预取、缓存和安全审查这些界面模板——在代码运行之前就能做静态分析。

实现上,工具在初始化时声明 UI 模板路径:

@mcp.tool(ui_template="weather_ui")

def get_weather(city: str) -> dict:

    """查询城市天气,附带可视化界面。"""

    return {

        "city": city,

        "temp": 28,

        "humidity": 65,

        "forecast": [

            {"day": "周一", "temp_high": 32, "temp_low": 25},

            {"day": "周二", "temp_high": 30, "temp_low": 24},

        ]

    }

然后服务器目录下放一个 ui/weather_ui.html,宿主在工具返回结果后自动渲染。这个机制对于数据分析、报表生成、配置管理这类场景特别有用——文字描述再多,不如一张图直观。

不过需要注意:MCP Apps 目前还在实验阶段,不是所有 MCP 宿主都支持。Claude Desktop 计划在 v2 稳定版发布后几周内上线此功能。

九、v1 到 v2 迁移实战速查表

如果你手头有跑在 v1 上的 MCP 服务器,以下是按改动量排序的迁移步骤:

第一步:改导入和初始化(必做,1 分钟)

# v1

from mcp.server.fastmcp import FastMCP

mcp = FastMCP("MyServer")

# v2

from mcp.server import MCPServer

mcp = MCPServer("MyServer")

第二步:检查 Prompt 返回值(最常见的运行时问题)

# 搜索所有 prompt 函数,确保返回 str 而非 list

grep -rn "def.*prompt" --include="*.py" .

v2 的 @mcp.prompt() 只接受字符串返回。如果你的旧代码返回 messages 列表,改成拼接成纯文本字符串,或者把结构化逻辑移到调用端。

第三步:移除已废弃特性(可选但推荐)

Roots、Sampling、Logging 三大特性在 v2 中被正式废弃。如果你的代码里用到了:

  • server.list_roots() → 改用 Tool 参数或 Resource URI
  • server.create_message() → 直接调用 LLM Provider API
  • session.send_log_message() → 用 print(..., file=sys.stderr) 或 OpenTelemetry

第四步:更新依赖锁定

uv lock --upgrade-package mcp

确保 uv.lockrequirements.txt 里 pin 了精确版本,防止 CI 环境自动拉取不兼容的预发布版。

迁移总耗时估算:简单服务器(<5 个工具)约 10 分钟,中等服务器(10-20 个工具+资源)约 30 分钟到 1 小时。

十、常见问题与排障

Q1: 运行 mcp devcommand not found 安装了 mcp 但没有 [cli] 附加依赖。执行 uv add "mcp[cli]==2.0.0rc1" 重新安装。

Q2: 客户端调用返回 -32601 Method not found 检查工具/资源的名称是否正确。v2 从函数名自动推导,不再支持 @mcp.tool(name="custom_name") 显式命名。

Q3: Streamable HTTP 模式下 session ID 报错? 这是 v1 时代的思维惯性。在 v2 的无状态模型下,不需要也不应该管理 session。每次 HTTP POST 都是独立的请求,服务器不会在请求之间保持状态。

Q4: 如何在 MCP 服务器里访问数据库? 直接在你的 Tool 函数里创建数据库连接就行。但注意:v2 的无状态模型意味着每个请求都可能打到不同的服务器实例。如果你的数据库连接池绑定在模块级别(如 pool = create_pool() at module top),确保连接池在模块导入时初始化、在服务器启动时可用。

Q5: 工具函数执行时间很长(>30 秒),怎么处理? v2 支持异步 Tool 函数:

@mcp.tool()

async def long_running_task(input_data: str) -> dict:

    # 耗时操作:图像生成、大数据分析等

    result = await heavy_computation(input_data)

    return result

MCP 宿主(如 Claude Desktop)通常有 60-120 秒的超时窗口。如果你的任务超过这个时间,考虑改成异步任务模式:Tool 提交任务并返回 task_id,再通过另一个 Resource 端点查询任务状态。

十一、总结与展望

MCP v2 的核心变化可以用一句话概括:从「AI 和服务器维持长对话」变成「每次请求都是独立的」

这个转变让 MCP 服务器可以:

  • 部署在 Kubernetes 上,像普通微服务一样水平扩展
  • 放在 API 网关后面,享受统一的鉴权、限流、日志
  • 用标准 HTTP 工具做性能测试和监控(curlwrk、Grafana 随便上)
  • 一套代码同时服务 v1 和 v2 客户端(ServerRunner 自动协商协议版本)

今天你学到了:

  1. MCP v2 与 v1 的本质区别(有状态→无状态)
  2. MCPServer + 装饰器 15 行构建服务器
  3. 三种核心原语的深入用法:Tool(操作)、Resource(数据)、Prompt(模板)
  4. 客户端直连和远端 HTTP 两种调用模式
  5. Streamable HTTP / stdio / SSE 的选择策略
  6. 一个完整的知识库 MCP 服务器示例
  7. 6 个真实踩坑记录

下一步行动建议:把你项目中 2-3 个常用 API 封装成 MCP Tool,接入 Claude Desktop 或 Cursor,亲自体验「AI 直接操作你的业务系统」的效率跃迁。一天之内就能跑通,投入产出比极高。


#AI创业 #MCP #AIAgent #Python #一人公司

*参考来源:*

  • MCP 2026-07-28 Release Candidate — 官方规范博客
  • Python SDK v2 README — GitHub 仓库(23.7k stars)
  • MCP Python SDK v2 文档 — 官方文档站

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

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