Appearance
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 定义了三种"能力":
| 能力 | 含义 | 例子 |
|---|---|---|
| Tools | LLM 可以调用的函数 | search_linear_issues(query) |
| Resources | LLM 可以读取的数据源 | file:///project/README.md |
| Prompts | 预设的 Prompt 模板 | "用我的代码风格 review 这个 PR" |
通信是 JSON-RPC 2.0。客户端先 initialize → list_tools 拿到所有工具 → LLM 决定调用哪个 → 客户端发 call_tool → Server 返回结果。
三、写一个最小 MCP Server(Node.js)
需求:暴露一个 read_file 工具,让 Claude 能读项目里的文件。
bash
npm init -y
npm i @modelcontextprotocol/sdkserver.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 更直接。
