Skip to content

MCP 协议入门:让 LLM 用上你的工具

MCP(Model Context Protocol)是 Anthropic 在 2024 年底开源的协议,2026 年已经成为 LLM 工具生态的事实标准——Claude Desktop、Cursor、Zed、各大 IDE 都原生支持。它要解决的问题简单粗暴:

每个 LLM 客户端 × 每个工具 = N×M 个适配器,太蠢了。MCP 把它变成 N+M。

一句话

MCP = Tool Use 的标准化协议层。 你写一个 MCP Server,所有支持 MCP 的 LLM 客户端都能直接用。

一、MCP 在解决什么

举个具体例子。你想让 Claude 能查你公司的 Linear 任务:

没有 MCP 的世界

  • Claude Desktop → 自己写一个 Linear 插件
  • Cursor → 再写一遍
  • Zed → 再写一遍
  • 你自己的 Chat 应用 → 再写一遍

有 MCP 的世界

  • 写一个 linear-mcp-server
  • 上面那些客户端配置一下就能直接用

MCP Server 其实不是"服务器"——多数情况它就是一个本地 stdio 进程,由客户端 spawn 起来通过 JSON-RPC 通信。当然也支持 HTTP/SSE 远程模式。

二、协议的核心概念

MCP 定义了三种"能力":

能力含义例子
ToolsLLM 可以调用的函数search_linear_issues(query)
ResourcesLLM 可以读取的数据源file:///project/README.md
Prompts预设的 Prompt 模板"用我的代码风格 review 这个 PR"

通信是 JSON-RPC 2.0。客户端先 initializelist_tools 拿到所有工具 → LLM 决定调用哪个 → 客户端发 call_tool → Server 返回结果。

三、写一个最小 MCP Server(Node.js)

需求:暴露一个 read_file 工具,让 Claude 能读项目里的文件。

bash
npm init -y
npm i @modelcontextprotocol/sdk

server.ts

ts
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import {
  CallToolRequestSchema,
  ListToolsRequestSchema,
} from '@modelcontextprotocol/sdk/types.js';
import fs from 'node:fs/promises';
import path from 'node:path';

const ROOT = process.argv[2] ?? process.cwd();

const server = new Server(
  { name: 'mini-fs', version: '0.1.0' },
  { capabilities: { tools: {} } },
);

// 1. 声明工具
server.setRequestHandler(ListToolsRequestSchema, async () => ({
  tools: [
    {
      name: 'read_file',
      description: '读取项目里的某个文件',
      inputSchema: {
        type: 'object',
        properties: {
          path: { type: 'string', description: '相对项目根的路径' },
        },
        required: ['path'],
      },
    },
  ],
}));

// 2. 处理调用
server.setRequestHandler(CallToolRequestSchema, async (req) => {
  if (req.params.name === 'read_file') {
    const rel = req.params.arguments?.path as string;
    const abs = path.resolve(ROOT, rel);

    // 安全:禁止逃逸出项目根
    if (!abs.startsWith(ROOT)) {
      throw new Error('path escapes project root');
    }

    const content = await fs.readFile(abs, 'utf8');
    return {
      content: [{ type: 'text', text: content }],
    };
  }
  throw new Error(`unknown tool: ${req.params.name}`);
});

// 3. 启动 stdio transport
const transport = new StdioServerTransport();
await server.connect(transport);

测试:直接跑

bash
node server.js /Users/aaron/my-project

它会等待 stdin 上的 JSON-RPC 消息。手动测试比较麻烦,直接用客户端最快。

四、在 Claude Desktop 里挂上去

编辑 ~/Library/Application Support/Claude/claude_desktop_config.json(macOS):

json
{
  "mcpServers": {
    "mini-fs": {
      "command": "node",
      "args": [
        "/Users/aaron/projects/mini-mcp/server.js",
        "/Users/aaron/projects/my-app"
      ]
    }
  }
}

重启 Claude Desktop,输入框旁边会出现一个工具图标。问 Claude:"读一下 README.md",它会调你刚写的工具。

五、安全:MCP 是用 LLM 代你 操作工具

这件事不能轻视——LLM 误判时会拿你的工具做意外的事。MCP 客户端通常会:

  • 第一次调用某个工具时弹确认;
  • 把"读取"和"写入"分两类权限;
  • 给敏感工具打 human_in_the_loop 标记,每次都要用户点确认。

Server 端的责任

  • 路径白名单(上面 read_file 里的 startsWith(ROOT));
  • 写操作必须有 dry-run 模式;
  • 任何破坏性操作(删除、网络外发、付费 API 调用)必须可回滚或可拒绝。

六、前端开发者用 MCP 能做什么

1. 给自己的开发流加工具

  • git-mcp-server:让 LLM 能查 commit、跑 blame;
  • playwright-mcp-server:让 LLM 能对你的页面做端到端测试;
  • 自家公司的 API → 写一个内部 MCP Server,供团队所有 IDE 共享。

2. 给产品做 Agent 能力

如果你在做 LLM 产品,直接复用 MCP 生态 比自己实现 Tool Use 更划算:

  • 用户已经熟悉的工具(GitHub、Slack、Notion、Linear),社区都有现成的 MCP Server;
  • 你的 Agent 能直接接入,不用自己写适配层。

3. 把网页变成 LLM 能操作的对象

新方向:MCP Server 暴露当前网页的 DOM / 状态,让 LLM 能"看得见"页面、"点得到"按钮。Anthropic 的 Computer Use 就是这个思路的一种实现。

七、社区现状(2026)

可以去看的几个方向:

  • github.com/modelcontextprotocol/servers ——官方维护的 reference servers(filesystem / fetch / git / slack / postgres 等)。
  • 国内开发者的 MCP 注册表也在长起来,找"MCP marketplace"关键词。
  • Cursor、Zed、Claude Code 都把 MCP 列为一等公民,配置完全互通。

八、什么时候不要用 MCP

  • 工具特别简单、调用方只有一个客户端:直接用各家 API 的原生 Tool Use 即可。
  • 工具运行环境是浏览器:MCP 主要是进程间协议,浏览器场景下用 Function Calling 更直接。

本站总访问量 --heart 本站访客数 -- 人次