Claude Code 实战入门(四):MCP 服务器,让 Claude 跟任何东西对话

MCP 是让 Claude Code 伸出文件系统的插件协议。装一个(Playwright),端到端看它跑通,再学会保护它不发疯的权限模型。

如果你只学一个 Claude Code 的扩展机制,学 MCP。这是"自动补全"和"平台"之间的差别。

一分钟梗概

MCP 是 Model Context Protocol——一份小的开放规范,让 Claude Code 调用外部服务器的工具、读它们的资源。“服务器"是任何一个会说 MCP(基于 stdio 或 HTTP)的进程。Claude 把 MCP 工具当内置工具:模型决定何时调,你确认或自动 approve,结果以文本回来。

这意味着 Claude 可以:

  • 驱动浏览器(Playwright MCP)
  • 查 Postgres(Postgres MCP)
  • 读你的 Notion 或 Obsidian 仓
  • 跟你内部 API 对话
  • 任何你能用 200 行 Node 包起来的东西

MCP 服务器主要是社区写的。mcp.so 有目录,Anthropic 文档里也有日益成长的列表。好的服务器都短、聚焦、对自己能做什么诚实。

装第一个 MCP 服务器

Playwright 是经典"第一个 MCP”,因为它把价值讲明白了。在你的 Shell 里——不是 Claude Code 内部:

1
claude mcp add playwright npx @playwright/mcp@latest

发生了三件事:

  1. 命令注册了一个名为 playwright 的 MCP 服务器。
  2. “怎么跑它"是 npx @playwright/mcp@latest——npx 按需拉。
  3. 服务器进入了你机器级配置(~/.claude/settings.json)。

确认:

1
2
claude mcp list
# playwright    npx @playwright/mcp@latest    enabled

打开 Claude Code:

1
2
claude
> 帮我打开 https://news.ycombinator.com,告诉我前 3 条故事的标题。

第一次会弹一个权限确认——“Claude 想用 playwright 工具”。Approve。Agent 启 headless 浏览器、加载页面、抽标题、回复。几秒往返。

刚才发生了什么(技术上)

Claude Code  --(stdio)--> @playwright/mcp 进程
       |                        |
       |                        v
       |                   真实浏览器
       |                        |
       <----- text -------------+

MCP 服务器是独立进程。Claude Code 走 stdio(或 HTTP,远程服务器用)跟它说话。工具在握手时被发现——Claude 问"你能做什么”,服务器回 schema 列表。从那之后,模型就可以像调内置工具一样调它们。

协议小到 30 分钟能读完。给一个聚焦用例自己写一个,半天能做完。

权限——这一段不能跳

每个 MCP 工具有权限等级。模型第一次调它时你拿到确认对话框,三个选项:

  • 本次允许——只此一次
  • 本会话允许——直到你 /clear 或退出
  • 永久允许——写进 .claude/settings.json

建议对任何会改状态的 MCP 选"永久允许"。只读工具(搜索、抓取、查询)——可以。任何写文件、发消息、有副作用的——每次确认,或者把权限开得很窄。

.claude/settings.json 里对的模式:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
{
  "permissions": {
    "allow": [
      "mcp__playwright__navigate",
      "mcp__playwright__extract_text"
    ],
    "deny": [
      "mcp__playwright__execute_javascript"
    ]
  }
}

这把 Playwright 的安全工具自动放行,把"在浏览器里跑任意 JS"那个直接禁掉。粒度到具体工具。

我真在用的几个 MCP 服务器

试了 30 多个之后留下来的:

服务器做什么为什么留下
playwright浏览器自动化替代了一打手写爬虫
postgres只读 Postgres 查询“把行给我看"不离开 Claude
filesystem项目根之外的沙箱化文件访问~/.config/ 里的配置等
slack搜 Slack 历史、发消息站会总结自动化
github通过 GitHub API 访问 Issue/PR某些查询比 CLI 干净

模式一致:每个做一件事、一个 npm/PyPI 包、暴露 3-10 个工具。

MCP 不是什么

几件要讲清楚:

  • 不是沙箱。 MCP 服务器以你的用户权限运行。恶意服务器能做你能做的一切。装之前要审。
  • 不是快速通道。 每次 MCP 工具调用是进程往返。延迟真实。别在热循环里用。
  • 不是唯一方式。 一次性集成有时一个跑 shell 脚本的斜杠命令更对。MCP 是为"跨会话反复调用"准备的。

自己写一个(草稿)

要自己写,SDK 是 Node 的 @modelcontextprotocol/sdk 或 Python 的 mcp。最小服务器约 50 行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';

const server = new Server({ name: 'my-tools', version: '0.1' }, {
  capabilities: { tools: {} }
});

server.setRequestHandler('tools/list', async () => ({
  tools: [{
    name: 'echo',
    description: '回显输入',
    inputSchema: { type: 'object', properties: { text: { type: 'string' } } }
  }]
}));

server.setRequestHandler('tools/call', async (req) => {
  if (req.params.name === 'echo') {
    return { content: [{ type: 'text', text: req.params.arguments.text }] };
  }
});

await server.connect(new StdioServerTransport());

这是一个能跑的 MCP 服务器。存盘、注册(claude mcp add my-echo node my-server.js)、重启,Claude 就有新工具了。难的是选要暴露什么;协议本身让路。

下一篇:Hooks——每次工具调用前后跑的代码。防御层。

翻完了?

去 GitHub 关注一下,新一篇通常隔一周就到。

GitHub