🧩 MCP生态

MCP协议是什么?AI代理通用通信协议详解与实战应用

发布时间:2026-04-12 分类: MCP生态
摘要:MCP:一个“意外诞生”的AI代理通用插座为什么需要MCP?用过 VS Code + Cursor + Claude 组合的人大概都踩过这些坑:在 VS Code 里写完一段 Python,想立刻在 Cursor 里跑单元测试,得手动复制粘贴;Claude 给出的修复建议没法直接传给本地调试器;每换一个 IDE 就得重写一遍 Agent 的通信逻辑,连日志格式都要对齐。MCP 不是为了解决某...

MCP:一个“意外诞生”的AI代理通用插座

为什么需要MCP?

用过 VS Code + Cursor + Claude 组合的人大概都踩过这些坑:

  • 在 VS Code 里写完一段 Python,想立刻在 Cursor 里跑单元测试,得手动复制粘贴;
  • Claude 给出的修复建议没法直接传给本地调试器;
  • 每换一个 IDE 就得重写一遍 Agent 的通信逻辑,连日志格式都要对齐。

MCP 不是为了解决某个宏大命题设计出来的。它起源于一次深夜调试——开发者发现三个不同平台的 Agent 正在用三套不兼容的 JSON 字段互相猜意图,干脆拉出共性,定义了一组最小可行消息结构:typeidpayloadtools。没有抽象层,不包揽调度,只做一件事:让 Agent 能听懂彼此说的话。

协议本身很轻

它不是插件标准

MCP 是通信协议,不是 SDK 或框架。它不规定你用什么语言写 Agent,也不要求你继承某个基类。它只约定:

  • 所有请求/响应必须是 JSON 对象;
  • 必须带 type 字段(如 "execute_code""list_tools");
  • 工具调用必须通过 tools 数组声明能力,运行时由 Server 决定是否执行;
  • 错误统一用 error 字段返回,不抛 HTTP 状态码。

VS Code 插件、Claude 的 Tool Use 接口、Cursor 的 Local Agent 都能按这个规则收发消息——因为它们本来就在处理 JSON。

跨平台协作是自然结果

不需要“桥接”或“同步状态”。只要两个端点都遵守 MCP,协作就发生在线上:

graph LR
  A[VS Code Agent] -- POST /mcp --> B[MCP Server]
  B -- POST /mcp --> C[Cursor Debugger]
  C -- POST /mcp --> D[Claude Reasoner]
  D -- POST /mcp --> A

比如你在 VS Code 里选中一段代码,右键「发送到调试器」,插件会打包成:

{
  "type": "execute_code",
  "id": "req-7a2f",
  "payload": {
    "language": "python",
    "code": "sum([1, 2, 3])"
  }
}

Cursor 的 MCP 客户端收到后直接执行,把结果原样回传,VS Code 插件解析 id 匹配原始请求,显示在终端里。整个过程不依赖共享内存、不绑定进程、不强求实时性。

接入成本接近于零

不用改 IDE 源码,不用等厂商支持。只要你的 Agent 能发 HTTP 请求,就能当 Client;只要它能监听端口、解析 JSON,就能当 Server。

已知落地案例:

  • 一个 Rust 编写的本地 LLM 工具链,用 reqwest 发请求,50 行代码接入 Cursor;
  • 一个 Python 数据清洗 Agent,用 Flask 暴露 /mcp 端点,没动一行业务逻辑;
  • VS Code 插件作者把原有 Language Server 协议适配层删掉,换成 MCP 消息转发,发布周期从两周缩到两天。

写一个可用的 MCP Server

下面这个 Server 能跑通真实交互:接收代码执行请求、返回结果、处理错误。它不追求生产就绪,但每行代码都有明确目的。

from flask import Flask, request, jsonify
import ast
import traceback

app = Flask(__name__)

@app.route('/mcp', methods=['POST'])
def handle_mcp():
    try:
        data = request.get_json()
        if not data or 'type' not in data:
            return jsonify({'error': 'missing type field'}), 400

        if data['type'] == 'execute_code':
            result = _run_python(data.get('payload', {}))
            return jsonify({
                'type': 'execute_code_result',
                'id': data.get('id'),
                'result': result
            })

        elif data['type'] == 'list_tools':
            return jsonify({
                'type': 'list_tools_result',
                'tools': [
                    {'name': 'execute_code', 'description': 'Run Python code'}
                ]
            })

        else:
            return jsonify({'error': f'unsupported type: {data["type"]}'}), 400

    except Exception as e:
        return jsonify({'error': str(e)}), 500

def _run_python(payload):
    code = payload.get('code', '').strip()
    if not code:
        return {'error': 'empty code'}

    # 禁用危险操作,只允许表达式和简单语句
    try:
        tree = ast.parse(code, mode='eval')
        compiled = compile(tree, '<string>', 'eval')
        result = eval(compiled)
        return {'output': result}
    except SyntaxError:
        # 尝试作为语句执行(如赋值、print)
        try:
            tree = ast.parse(code, mode='exec')
            namespace = {}
            exec(compile(tree, '<string>', 'exec'), namespace)
            output = namespace.get('output') or str(namespace)
            return {'output': output}
        except Exception as e:
            return {'error': traceback.format_exc().split('\n')[-2]}
    except Exception as e:
        return {'error': str(e)}

if __name__ == '__main__':
    app.run(host='127.0.0.1', port=5000, debug=False)

启动和验证

  1. 安装依赖:

    pip install Flask
  2. 保存为 server.py,运行:

    python server.py
  3. 用 curl 测试:

    curl -X POST http://localhost:5000/mcp \
      -H "Content-Type: application/json" \
      -d '{"type":"execute_code","id":"test1","payload":{"code":"2 + 2"}}'

你会得到:

{
  "type": "execute_code_result",
  "id": "test1",
  "result": {"output": 4}
}

注意:这个 Server 没有持久化、没加认证、没做资源隔离。但它能让你看清 MCP 的数据流——消息进来,逻辑处理,结果出去。后续加固(如超时控制、沙箱执行、JWT 验证)都是可选叠加层。

真实的商业化路径

我们见过三个靠 MCP 跑通闭环的团队,都不是靠融资或概念炒作:

案例一:前端组件生成器(单人项目)

  • 产品:输入 Figma 链接或截图,输出 React/Vue 组件代码 + Storybook 示例;
  • MCP 用法:VS Code 插件作为 Client,调用本地 Python Server(含 OCR + LLM);Server 把截图发给私有 Llama 3 实例,再把生成的代码传回编辑器;
  • 变现:GitHub Sponsors + Gumroad 卖 Pro 版(支持 Tailwind 主题定制、Figma 插件直连),月均 $1,800;
  • 关键点:没做 Web UI,全部走编辑器内工作流,用户留存率 67%(vs 行业平均 22%)。

案例二:运维故障诊断 Agent(小团队)

  • 产品:接入企业 Prometheus + Slack,自动分析告警指标,生成根因报告;
  • MCP 用法:Slack Bot 作为 Client,调用内部 MCP Server;Server 编排多个子 Agent:Prometheus 查询器、日志检索器、知识库检索器;每个子 Agent 独立部署,只认 MCP 消息;
  • 变现:按节点数订阅,$299/月起;已有 12 家中小公司付费;
  • 关键点:客户原有监控栈不动,只加一个 MCP Server 和 Slack 插件,上线耗时 < 4 小时。

案例三:学术论文辅助工具(学生团队)

  • 产品:LaTeX 编辑器插件,实时检查公式语法、查文献、润色段落;
  • MCP 用法:Overleaf 插件发请求 → 本地 MCP Server → 调用 Ollama 的 Phi-3 模型(公式校验)+ 自建文献向量库(相似论文推荐);
  • 变现:免费基础版;Pro 版 $5/月,含 PDF 解析、Zotero 同步、批量处理;学生用户占比 83%,LTV 达 $22;
  • 关键点:所有模型都在本地跑,数据不出内网,高校采购无障碍。

共同规律:

  • 全部绕开大模型 API 厂商的封闭生态;
  • 用户价值锚定在「编辑器内完成闭环」,不是「又一个聊天框」;
  • 商业模式基于具体动作收费(生成组件、诊断故障、润色段落),而非按 token 或调用量。

下一步怎么动

别从协议文档开始。从这三件事入手:

  1. 抓包看真实流量:在 VS Code 里装 MCP Inspector 插件,打开 DevTools Network 标签页,点「Send to Claude」,看发了什么、收了什么;
  2. 改一行代码跑通:把你现有的 Python 脚本加上上面那个 Flask Server,把 print() 换成 return jsonify(...),用 curl 调一次;
  3. 找一个痛点切进去:比如你总要手动把 Jupyter Notebook 单元格内容复制到 Claude,那就写个 VS Code 命令,选中代码 → 打包成 MCP 消息 → 发给本地 Server → 转发给 Claude API → 把回复插入编辑器。做完,你就有了第一个 MCP Agent。
返回首页