Agent工坊

【Agent工坊】MCP协议实战:10行Python代码让你的AI Agent操控任何业务系统

2026年最被低估的AI技术:MCP(Model Context Protocol)——它不是又一个API框架,而是给AI Agent装上"手和脚"的操作系统级协议。Anthropic开源半年,已有2000+社区工具,今天带你从零接入。

你为什么必须学会MCP

先说一个场景,看你是否熟悉:

你用Claude Code写了个自动化脚本,想让Agent帮你部署到服务器。Agent说:"我可以用SSH连接服务器,但我没有SSH工具。"你用OpenClaw搭了内容工厂,想让Agent把文章发到Notion知识库。Agent说:"我看到你的Notion链接了,但我无法写入Notion。"

这就是2026年AI Agent最大的短板:它很聪明,但手被绑在沙箱里。

MCP就是来解决这个问题的。它是一套开放协议(Anthropic开源,MIT许可),定义了AI模型如何安全地调用外部工具、访问外部数据。你可以理解为USB-C for AI——标准化接口,插上任何工具都能用。

已经有2000+社区贡献的MCP工具:飞书、Notion、PostgreSQL、GitHub、Slack、微信企业号、Puppeteer浏览器控制...覆盖了几乎你能想到的所有业务系统。

更关键的是:写一个MCP工具只需要10行Python代码。

MCP的底层逻辑(3分钟理解)

MCP架构只有三个角色:

┌──────────────┐     stdio/SSE     ┌──────────────┐
│  MCP Client  │ ←───────────────→ │  MCP Server  │
│ (Claude Code │                   │ (你写的工具)  │
│  Hermes Agent│                   │              │
│  OpenClaw等) │                   │              │
└──────────────┘                   └──────┬───────┘
                                          │
                                    ┌─────┴──────┐
                                    │ 外部系统    │
                                    │ DB/API/文件 │
                                    └────────────┘
  • MCP Client:AI Agent本身(Claude Code、Hermes Agent、OpenClaw、Cursor等)。它发起工具调用请求。
  • MCP Server:你写的Python/Node.js/Go程序,实现具体功能(查数据库、发消息、操作文件)。
  • Transport:通信方式。本地用stdio(标准输入输出,最简单),远程用SSE(Server-Sent Events,适合微服务架构)。

工作流程极其简单:
1. Agent决定"我需要查一下数据库里的用户订单"
2. Client通过MCP协议调用 query_database 工具
3. 你的MCP Server接收请求、执行SQL、返回结果
4. Agent拿到数据,继续推理

实战一:5分钟写一个"网站健康检查"工具

下面是最简单的MCP Server——让Agent能检查任意URL是否可以访问。

第一步:安装依赖

pip install mcp

第二步:写10行核心代码

# check_url_server.py
import asyncio
import urllib.request
from mcp.server import Server, stdio_server
from mcp.types import Tool, TextContent

app = Server("url-checker")

@app.list_tools()
async def list_tools():
    return [
        Tool(
            name="check_url",
            description="检查一个URL是否可以正常访问,返回HTTP状态码和响应时间",
            inputSchema={
                "type": "object",
                "properties": {
                    "url": {"type": "string", "description": "要检查的URL(含https://)"}
                },
                "required": ["url"]
            }
        )
    ]

@app.call_tool()
async def call_tool(name: str, arguments: dict):
    if name == "check_url":
        import time
        start = time.time()
        try:
            req = urllib.request.Request(
                arguments["url"],
                headers={"User-Agent": "Mozilla/5.0"}
            )
            resp = urllib.request.urlopen(req, timeout=10)
            elapsed = round((time.time() - start) * 1000)
            return [TextContent(
                type="text",
                text=f"✅ {arguments['url']}\n状态码: {resp.status}\n响应时间: {elapsed}ms\n服务器: {resp.headers.get('Server', 'unknown')}"
            )]
        except Exception as e:
            elapsed = round((time.time() - start) * 1000)
            return [TextContent(
                type="text",
                text=f"❌ {arguments['url']}\n错误: {str(e)}\n超时时间: {elapsed}ms"
            )]

async def main():
    async with stdio_server() as (read, write):
        await app.run(read, write, app.create_initialization_options())

asyncio.run(main())

第三步:接入Claude Code

在项目根目录创建 .claude/mcp.json

{
  "mcpServers": {
    "url-checker": {
      "command": "python3",
      "args": ["check_url_server.py"],
      "env": {}
    }
  }
}

第四步:让Agent干活

启动Claude Code,直接说:

帮我检查这三个网站是否可以访问:
1. https://www.xopcx.com
2. https://github.com
3. https://api.openai.com

Claude会自动发现 check_url 工具,依次调用,然后把结果汇总给你。

这就是MCP的核心价值:你写一次工具,所有兼容MCP的Agent都能用。

实战二:进阶——让Agent操控你的数据库

上面是入门级。对一人公司来说,真正有价值的是让Agent能读写你的业务数据。

# db_server.py —— 让Agent操作PostgreSQL
import asyncio, os
import asyncpg
from mcp.server import Server, stdio_server
from mcp.types import Tool, TextContent

app = Server("postgres-tools")
pool = None

@app.list_tools()
async def list_tools():
    return [
        Tool(
            name="query_db",
            description="执行只读SQL查询(SELECT),返回JSON结果",
            inputSchema={
                "type": "object",
                "properties": {
                    "sql": {"type": "string", "description": "SELECT查询语句"}
                },
                "required": ["sql"]
            }
        ),
        Tool(
            name="get_table_schema",
            description="获取某个表的字段结构",
            inputSchema={
                "type": "object",
                "properties": {
                    "table_name": {"type": "string"}
                },
                "required": ["table_name"]
            }
        )
    ]

@app.call_tool()
async def call_tool(name: str, arguments: dict):
    global pool
    if pool is None:
        pool = await asyncpg.create_pool(os.environ["DATABASE_URL"])

    async with pool.acquire() as conn:
        if name == "query_db":
            sql = arguments["sql"].strip()
            if not sql.upper().startswith("SELECT"):
                return [TextContent(type="text", text="❌ 仅允许SELECT查询")]
            rows = await conn.fetch(sql)
            result = [dict(r) for r in rows]
            return [TextContent(
                type="text",
                text=f"查询结果({len(result)}行):\n" + 
                     "\n".join(str(r) for r in result[:50])
            )]
        elif name == "get_table_schema":
            rows = await conn.fetch(
                "SELECT column_name, data_type FROM information_schema.columns WHERE table_name=$1",
                arguments["table_name"]
            )
            return [TextContent(
                type="text",
                text="\n".join(f"{r['column_name']}: {r['data_type']}" for r in rows)
            )]

asyncio.run(main())

然后你可以对Agent说:

查一下上周新增了多少付费用户,按天分组统计,如果趋势下降就提醒我。

Agent会先调 get_table_schema 了解表结构,再调 query_db 执行查询,最后分析数据给你结论。

实战三:一人公司的MCP工具箱(拿来即用)

你不用从零写所有工具。以下是2026年最实用的社区MCP Server:

工具 安装命令 用途
GitHub npx @anthropic/mcp-server-github 管理Issue/PR/Release
Notion npx @notionhq/mcp-server-notion 读写Notion数据库
飞书 npx @feishu/mcp-server 发消息、读文档、管理日历
PostgreSQL npx @anthropic/mcp-server-postgres 数据库查询
Puppeteer npx @anthropic/mcp-server-puppeteer 浏览器自动化(截图/点击/填表)
Slack npx @slack/mcp-server 发消息、读频道
文件系统 npx @anthropic/mcp-server-filesystem 安全的文件读写
Brave Search npx @anthropic/mcp-server-brave-search 网络搜索

一键接入Hermes Agent

Hermes Agent从v0.18开始原生支持MCP。在 ~/.hermes/mcp.json 中配置:

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": ["-y", "@anthropic/mcp-server-filesystem", "/home/agent/projects"],
      "env": {}
    },
    "github": {
      "command": "npx",
      "args": ["-y", "@anthropic/mcp-server-github"],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"
      }
    },
    "notion": {
      "command": "npx",
      "args": ["-y", "@notionhq/mcp-server-notion"],
      "env": {
        "NOTION_API_TOKEN": "${NOTION_TOKEN}"
      }
    }
  }
}

重启Hermes,Agent就能看到这些工具了。

避坑指南:4个新手最容易踩的坑

坑1:Transport选错

  • stdio(标准输入输出):适合本地开发,Agent和工具在同一台机器上。99%的场景用这个。
  • SSE(Server-Sent Events):适合远程部署,工具跑在另一台服务器上。需要额外处理认证和网络。

别在本地用SSE,别在远程用stdio。

坑2:权限过度开放

MCP工具可以做任何事——查数据库、发消息、删文件。永远不要给Agent root权限。

# ❌ 危险:允许任意SQL
async def call_tool(name, arguments):
    await conn.execute(arguments["sql"])  # DROP TABLE也能执行!

# ✅ 安全:只允许SELECT
async def call_tool(name, arguments):
    if not arguments["sql"].upper().startswith("SELECT"):
        return [TextContent(type="text", text="❌ 仅允许查询操作")]

坑3:忽略错误处理

Agent调用工具时如果报错,它可能会反复重试或给出错误结论。

# ✅ 永远返回结构化错误,不要让异常逃逸
try:
    result = do_something()
    return [TextContent(type="text", text=f"✅ {result}")]
except Exception as e:
    return [TextContent(type="text", text=f"❌ 操作失败: {str(e)}")]

坑4:环境变量泄露

MCP Server的 env 字段会在Agent的上下文中可见。不要在工具描述里暴露Token。

// ❌ 危险
"env": {
    "DATABASE_URL": "postgres://admin:MyP@ssword123@db.host.com/prod"
}

// ✅ 安全:用环境变量引用
"env": {
    "DATABASE_URL": "${DATABASE_URL}"
}

一人公司的MCP终极方案

把上面所有内容串起来,这就是一个AI创业者一天的工作流:

早上8:00
  Hermes Agent 通过 MCP-BraveSearch 扫描热点
  → MCP-Notion 写入选题库
  → MCP-Slack 通知你审核

上午10:00
  Claude Code 通过 MCP-Filesystem 读取草稿
  → MCP-Puppeteer 截图数据图表
  → MCP-GitHub 提交到仓库

下午2:00
  OpenClaw 通过 MCP-Feishu 发布到飞书群
  → MCP-PostgreSQL 记录发布数据
  → MCP-GitHub 同步到网站

晚上8:00
  Agent 通过 MCP-PostgreSQL 生成日报
  → MCP-Slack 发送数据总结
  → 你只需要看一眼

核心逻辑:Agent负责执行,MCP负责连接,你负责决策。

总结

MCP不是又一个需要学习的框架——它是AI Agent生态的"操作系统接口"。2026年,写MCP工具将成为AI创业者的基本功,就像2015年的REST API一样。

三个可以立刻行动的点:

  1. 今天:跑通"网站健康检查"例子,感受MCP的工作方式
  2. 本周:接入一个社区MCP Server(推荐从GitHub或文件系统开始)
  3. 本月:写一个连接你自己业务系统的MCP Server

记住一句话:AI Agent的边界,就是你能用MCP连接到的世界的边界。


AI创业 #MCP协议 #Agent工坊 #一人公司 #AI工具

参考来源
- MCP官方规范:https://modelcontextprotocol.io
- MCP Python SDK:https://github.com/modelcontextprotocol/python-sdk
- 社区MCP Server汇总:https://github.com/modelcontextprotocol/servers