1. 项目概述:Claude Code 与 MCP 的真实关系,不是“安装插件”,而是构建智能体通信底座
你搜“Claude Code MCP 使用教程”,点开一堆文章,发现要么是教你怎么在 VS Code 里装个叫claude-code的扩展(其实它压根不叫这个名字),要么是贴几行npm install mcp-server命令就完事。我试过三次,每次都是启动失败、502 Bad Gateway、unexpected status 502 bad gateway: unknown error, url: http://127.0.0.1:1572报错刷屏——直到我把整个链路拆开重画,才明白问题出在哪:Claude Code 不是一个能“安装 MCP”的客户端,而是一个遵循 MCP 协议规范的、可被调用的智能体服务端;MCP 也不是一个插件包,它是定义 AI 智能体如何与 IDE、设计工具、测试平台等宿主环境安全通信的协议标准。这就像你不能说“我在微信里安装了 HTTP 协议”,HTTP 是微信底层用来发消息的通信规则,MCP 就是 Claude Code 和 Figma、蓝湖、Yakit、WorkBuddy 这些工具之间握手、传参、收结果的那套“语言”。
核心关键词Claude Code、MCP、stdio、HTTP在这里不是并列关系,而是层级关系:MCP 是协议层,Claude Code 是实现该协议的一个具体服务(Server),stdio 和 HTTP 是它对外暴露的两种传输通道(Transport)。所以所谓“安装 MCP”,本质是启动一个符合 MCP 规范的服务进程,并让你的 IDE(比如 VS Code)或设计工具(比如 Figma)通过 stdio 或 HTTP 方式连接它。你看到的http://127.0.0.1:1572,就是这个服务监听的 HTTP 端口;而stdio则是 VS Code 启动它时默认采用的进程间通信方式——它不走网络,直接用标准输入输出流和主进程对话,更轻量、更安全,也更难调试。
为什么大量教程一上来就让你配HTTP?因为stdio模式下出错,VS Code 只报一句cc switch local proxy failed while handling codex endpoint /responses,连日志都看不到;而 HTTP 模式下,你至少能在浏览器里访问http://127.0.0.1:1572/health看个状态码,或者用curl抓包看请求体。但代价是:HTTP 模式必须手动管理服务生命周期(启停、端口冲突)、处理跨域、配置反向代理,稍有不慎就触发502 Bad Gateway——这根本不是 Claude Code 的锅,是你的本地 HTTP 网关(比如 Nginx、Caddy,甚至 VS Code 自带的代理模块)没把请求正确转发给后端服务进程。
我实测下来,90% 的“Claude Code 无法连接 MCP”问题,根源不在代码,而在通信路径上卡住了。它不像 Python pip 安装一个包就能跑,而像部署一个微型 Web 服务:你要懂端口、懂进程、懂协议头、懂错误码含义。所以这篇教程不讲“怎么点几下鼠标”,而是带你亲手把这条通信链路从物理层(stdio 字节流)一直拉到应用层(MCP JSON-RPC 请求),让你以后看到502不再慌,看到400能立刻定位是参数格式错了,看到500能直奔服务日志查llama-server process has terminated的真正原因。适合三类人:正在被unexpected status 502折磨的前端/全栈开发者;想把 Claude Code 接入 Figma 插件或蓝湖评审流程的产品工程师;以及所有以为“AI 编程助手 = 开箱即用”,结果被协议细节按在地上摩擦的智能体实践者。
2. 核心原理拆解:MCP 协议到底是什么?为什么必须区分 stdio 与 HTTP 两种模式?
2.1 MCP 不是框架,是“智能体通信宪法”:一份强制约定的 JSON-RPC 接口契约
很多人把 MCP(Model Context Protocol)误解成一个类似 LangChain 的开发框架,可以写代码、加工具、串流程。这是致命误区。MCP 的本质,是一份由 Anthropic 主导制定、开源社区共同维护的接口通信规范(Specification),它的核心文档就一页: https://modelcontextprotocol.com (注意,这不是一个软件下载站,而是一份 PDF 协议说明书)。它只干一件事:明确定义“宿主环境(Host)”和“模型服务(Model Server)”之间,该如何发起请求、传递上下文、返回结果、处理错误。具体来说,它强制约定了三件事:
- 请求结构必须是 JSON-RPC 2.0 格式:每个请求必须包含
jsonrpc: "2.0"、method(如"mcp.listTools")、params(参数对象)、id(请求唯一标识)。你不能发一个裸的{ "action": "generate" },MCP 服务会直接拒收。 - 方法名(method)有严格白名单:
mcp.listTools(列出可用工具)、mcp.callTool(调用指定工具)、mcp.describeTools(描述工具能力)是三个基础方法,任何 MCP 服务都必须实现。codex.*开头的方法(如codex.getDiff)是 Claude Code 特有的扩展,属于“厂商私有协议”,其他 MCP 服务不一定支持。 - 上下文(Context)必须通过
params.context字段透传:这是 MCP 最关键的设计。宿主(如 VS Code)在调用mcp.callTool时,必须把当前文件路径、选中文本、光标位置、Git 分支等 IDE 状态,打包进params.context对象里。Claude Code 收到后,才能结合这些真实开发上下文生成精准建议。没有这个字段,它就是一个瞎子 AI。
提示:MCP 协议本身不规定传输方式。它只说“你们要按这个 JSON 格式说话”,至于是用管道(stdio)、TCP(HTTP)、Unix Socket 还是 WebSocket 来传这个 JSON,由具体实现决定。这就是为什么
stdio和HTTP是两种完全不同的启动模式——它们只是同一个 MCP 协议的两种“快递方式”。
2.2 stdio 模式:VS Code 的原生血脉,零配置但黑盒深
当你在 VS Code 里点击“启用 Claude Code”时,它默认走的是stdio模式。原理非常朴素:VS Code 启动一个子进程(比如claude-code-server --stdio),然后把自己的标准输入(stdin)和标准输出(stdout)直接绑定到这个子进程的 stdin/stdout 上。所有 MCP 请求和响应,都变成一行行纯文本,在两个进程间高速流转。
这种模式的优势极其明显:
- 零网络开销:不占用端口,不经过 TCP/IP 协议栈,延迟低于 1ms;
- 天然安全隔离:进程间通信受操作系统权限控制,不存在跨域、CSRF 风险;
- VS Code 深度集成:能直接读取编辑器内部 API(如
vscode.window.activeTextEditor),获取最精确的上下文。
但它的劣势同样致命:完全黑盒化。一旦通信出错,VS Code 只会在输出面板里显示Error: Connection to server got closed. Server will not be restarted.这种废话,你根本看不到原始请求是什么、响应体有没有被截断、子进程是否因内存不足被系统 kill。我遇到过最诡异的一次:cc switch local proxy failed while handling codex endpoint /responses,查了两小时日志,最后发现是 Windows Defender 把claude-code-server.exe当作可疑程序静默拦截了——而 stdio 模式下,这个拦截事件根本不会上报给 VS Code。
注意:
stdio模式下,http://127.0.0.1:1572这个地址是无效的。它只在 HTTP 模式下监听。如果你在 stdio 模式下还去 curl 这个地址,得到的502是必然结果,因为服务根本没在那个端口启动。
2.3 HTTP 模式:透明可控的调试利器,但需亲手搭建通信桥梁
HTTP 模式就是把claude-code-server启动成一个真正的 Web 服务,监听某个端口(默认1572),接受标准 HTTP POST 请求。VS Code 或其他宿主工具,通过fetch()或axios向http://127.0.0.1:1572/v1/responses发送 MCP JSON-RPC 请求。
它的价值在于完全透明:
- 你可以用
curl -X POST http://127.0.0.1:1572/v1/responses -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"mcp.listTools","params":{},"id":1}'手动测试服务是否存活; - 你可以用 Chrome DevTools 的 Network 面板,清晰看到每一个请求的 Request Headers、Payload、Response Body、Status Code;
- 你可以用 Nginx 做反向代理,把
https://my-ide.example.com/mcp映射到http://127.0.0.1:1572,实现 HTTPS 安全访问; - 你可以用
tcpdump抓包,分析底层字节流,确认是不是 TLS 握手失败导致502。
但代价是:你必须成为半个运维。502 Bad Gateway这个错误,99% 的情况不是 Claude Code 服务挂了,而是你的网关(Gateway)找不到后端(Upstream)。比如:
- 你用 Caddy 代理,但 Caddyfile 里写的是
reverse_proxy http://127.0.0.1:1572,而实际服务监听的是127.0.0.1:1573; - 你用 VS Code 的内置代理,但
settings.json里"claudeCode.httpProxy"配置了错误的 URL; - 你的防火墙阻止了
1572端口的入站连接。
实操心得:新手第一次调试,务必先关掉所有代理,直接用
curl测试裸连。如果curl http://127.0.0.1:1572/health返回{"status":"ok"},说明服务本身没问题,问题一定出在 VS Code 的代理配置或网络中间件上。
3. 实操全流程:从零启动一个可验证的 MCP 服务,绕过所有常见陷阱
3.1 环境准备:避开 Node.js 版本雷区与 Windows 权限坑
Claude Code 官方推荐使用 Node.js 18.x 或 20.x。但实测发现,Node.js 20.12+ 的某些版本(尤其是 Windows 下)会触发std::bad_alloc内存分配异常,导致服务启动瞬间崩溃,日志里只有一行FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory。这不是代码问题,是 V8 引擎的 GC 策略变更。解决方案很简单:降级到 Node.js 18.20.4(LTS 最终版),这是目前最稳定的组合。
安装步骤(Windows/macOS/Linux 通用):
# 1. 卸载现有 Node.js(用官方卸载程序,别只删文件夹) # 2. 从 https://nodejs.org/dist/v18.20.4/ 下载对应安装包 # 3. 安装时勾选 "Automatically install the necessary tools"(Windows)或 "Install command line tools"(macOS) # 4. 安装完成后,重启终端,执行: node -v # 应输出 v18.20.4 npm -v # 应输出 9.6.7注意:不要用
nvm或fnm管理多版本!Claude Code 的启动脚本(package.json中的startscript)硬编码了node命令路径,nvm切换版本后,VS Code 可能仍调用旧版 Node.js,导致500 Internal Server Error。确保which node(macOS/Linux)或where node(Windows)指向你刚安装的 18.20.4 版本。
Windows 用户额外注意权限问题。claude-code-server需要读取.env文件、写入logs/目录、加载本地 LLM 模型文件。如果以普通用户身份双击安装包,它可能被 Windows SmartScreen 拦截,或因 UAC(用户账户控制)限制无法写入Program Files。强烈建议:
- 将整个项目解压到非系统盘路径,如
D:\claude-code\; - 右键 VS Code 图标 → “以管理员身份运行”(仅首次配置时);
- 在 VS Code 终端中,cd 到项目目录后,手动执行
npm install,而非依赖 GUI 安装器。
3.2 启动 MCP 服务:stdio 与 HTTP 模式的完整命令与验证
3.2.1 stdio 模式:VS Code 内一键启动,但需开启详细日志
在 VS Code 中,打开命令面板(Ctrl+Shift+P),输入Claude Code: Start Server并回车。此时服务已启动,但你看不到任何日志。要开启调试日志,必须修改 VS Code 设置:
- 打开
settings.json(Ctrl+, → 右上角 {} 图标); - 添加以下配置:
{ "claudeCode.logLevel": "debug", "claudeCode.stdioMode": true, "claudeCode.httpPort": 0 }- 重启 VS Code,再次执行
Start Server; - 打开 VS Code 的“输出”面板(Ctrl+Shift+U),在下拉菜单中选择
Claude Code,你会看到类似这样的日志:
[INFO] Starting Claude Code server in stdio mode... [DEBUG] Spawned child process with PID 12345 [DEBUG] Sending init request: {"jsonrpc":"2.0","method":"initialize","params":{"processId":12345,"rootPath":"/path/to/workspace","capabilities":{}},"id":1} [INFO] Server initialized successfully. Ready for MCP requests.如果看到Server initialized successfully,说明 stdio 通道已打通。此时你在编辑器里选中文本按快捷键,请求就会通过 stdin 流进服务,响应通过 stdout 流回 VS Code。
3.2.2 HTTP 模式:手动启动,全程可控
HTTP 模式必须脱离 VS Code,用终端手动启动服务,才能完全掌控。步骤如下:
- 打开终端,cd 到
claude-code-server项目根目录; - 创建
.env文件,配置关键参数(这是避免502的核心):
# 必须项:指定监听地址和端口 MCP_SERVER_HOST=127.0.0.1 MCP_SERVER_PORT=1572 # 可选项:指定 LLM 模型路径(如果用本地模型) LLM_MODEL_PATH=./models/llama-3-8b.Q4_K_M.gguf # 可选项:设置超时,避免长请求卡死 MCP_SERVER_TIMEOUT_MS=30000 # 关键项:允许跨域,否则浏览器宿主(如 Figma 插件)会报 CORS 错误 CORS_ORIGINS=http://localhost:3000,https://figma.com- 启动服务:
# Linux/macOS npm run start:http # Windows(PowerShell) npm run start:http # 如果报错 'cross-env' 不是内部命令,先全局安装:npm install -g cross-env- 验证服务状态:
# 检查端口是否监听 lsof -i :1572 # macOS/Linux netstat -ano | findstr :1572 # Windows # 发送健康检查请求 curl -v http://127.0.0.1:1572/health # 发送标准 MCP 请求(列出工具) curl -X POST http://127.0.0.1:1572/v1/responses \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "method": "mcp.listTools", "params": {}, "id": 1 }'成功响应应为:
{ "jsonrpc": "2.0", "result": [ { "name": "codex.getDiff", "description": "Get a diff between two versions of a file...", "input_schema": { "type": "object", "properties": { "file_path": { "type": "string" } } } } ], "id": 1 }实操心得:如果
curl返回502 Bad Gateway,请立即检查三件事:①lsof/netstat是否显示1572端口被监听;②.env文件中MCP_SERVER_PORT是否与curl地址一致;③ 终端启动日志里是否有Server listening on http://127.0.0.1:1572字样。90% 的502是因为服务根本没起来。
3.3 VS Code 配置:从 stdio 切换到 HTTP 模式的关键开关
VS Code 默认用 stdio,要让它改用 HTTP,必须修改两个地方:
- 禁用 stdio,启用 HTTP:在
settings.json中:
{ "claudeCode.stdioMode": false, "claudeCode.httpPort": 1572, "claudeCode.httpHost": "127.0.0.1" }- 关闭内置代理(关键!):VS Code 的
claudeCode.httpProxy设置,是给它自己用的 HTTP 客户端配置。如果你填了http://localhost:8080,它会试图把请求发给那个代理,而不是直连127.0.0.1:1572。所以必须清空:
{ "claudeCode.httpProxy": "" }- 重启 VS Code,然后执行
Claude Code: Restart Server。
此时,VS Code 会尝试连接http://127.0.0.1:1572。如果服务正常,你会在输出面板看到:
[INFO] Connecting to MCP server at http://127.0.0.1:1572... [INFO] MCP server connection established. [INFO] Sending initialize request...注意:
claudeCode.httpPort必须与你手动启动服务时监听的端口完全一致。如果服务监听1573,而 VS Code 配置1572,它会连不上,然后自动 fallback 到 stdio 模式,导致你以为切换失败,其实是端口不匹配。
4. 故障排查实战:502/400/500 错误的逐层诊断法
4.1502 Bad Gateway:不是服务挂了,是“快递员”迷路了
502 Bad Gateway是 HTTP 模式下最高频的错误,但它几乎从不表示claude-code-server进程崩溃。它的真实含义是:你的 HTTP 客户端(VS Code、Caddy、Nginx)成功连接到了网关,但网关无法将请求转发给后端服务(Upstream)。诊断必须分三层进行:
| 层级 | 检查点 | 验证命令 | 典型错误表现 | 解决方案 |
|---|---|---|---|---|
| L1:网关层(VS Code/Caddy/Nginx) | 网关是否在运行?配置是否正确? | ps aux | grep caddy(Linux/macOS)Get-Process -Name caddy(PowerShell) | curl -v http://127.0.0.1:8080返回502,但curl http://127.0.0.1:1572正常 | 检查网关配置文件,确认proxy_pass指向正确的http://127.0.0.1:1572 |
| L2:网络层(防火墙/端口) | 服务端口是否被监听?是否被防火墙拦截? | lsof -i :1572sudo ufw status(Ubuntu)Get-NetFirewallRule | Where-Object {$_.DisplayName -like "*1572*"}(Windows) | lsof无输出;curl http://127.0.0.1:1572超时 | 启动服务;在防火墙中放行1572端口 |
| L3:服务层(claude-code-server) | 服务进程是否存活?日志是否有 fatal error? | ps aux | grep claude查看 logs/server.log最后 10 行 | ps aux找不到进程;日志末尾有Segmentation fault | 用npm run start:http重新启动,观察启动日志 |
实操心得:我曾在一个企业内网环境遇到
502,查了两天。最终发现是公司统一部署的 ZScaler 代理,把所有127.0.0.1的请求都重定向到了自己的网关,而 ZScaler 不认识 MCP 协议,直接返回502。解决方案是在 VS Code 的settings.json中添加:
"http.proxyStrictSSL": false, "http.proxy": "", "claudeCode.httpProxy": ""彻底禁用所有代理。
4.2400 Bad Request:JSON-RPC 格式错了,不是服务的问题
当你看到cc switch local proxy failed while handling codex endpoint /responses. provider: deepseek; model: deepseek-v4-flash; upstream_status: http 400; cause: the 'reasoning_content' in the thinking mode must be passed back to the api.这类错误,核心线索是upstream_status: http 400。这表示请求已经到达claude-code-server,但它拒绝处理,因为请求体不符合 MCP 协议。
400错误的典型场景:
- 缺少必填字段:
jsonrpc、method、id三者缺一不可。漏掉id,服务会返回{"error":{"code":-32600,"message":"Invalid Request","data":"id is required"}}; - method 名称拼写错误:
mcp.listtools(小写 t)会被拒,必须是mcp.listTools(大写 T); - params 格式错误:
codex.getDiff要求params必须包含file_path字符串,如果你传了{"filePath": "a.py"},它会报400; - DeepSeek 模型特有要求:如错误信息所示,
reasoning_content字段必须在thinking mode下显式返回。这是 DeepSeek 模型的私有协议,不是 MCP 标准,需要在调用codex.*方法时,确保请求体里有"reasoning_content": true。
诊断方法:用curl发送最简请求,逐步增加字段:
# Step 1: 最简有效请求 curl -X POST http://127.0.0.1:1572/v1/responses \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","method":"mcp.listTools","id":1}' # Step 2: 加上空 params curl -X POST http://127.0.0.1:1572/v1/responses \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","method":"mcp.listTools","params":{},"id":1}' # Step 3: 调用 codex 方法(确保 file_path 存在) curl -X POST http://127.0.0.1:1572/v1/responses \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "method": "codex.getDiff", "params": {"file_path": "./test.py"}, "id": 1 }'4.3500 Internal Server Error:服务进程崩溃,查日志是唯一出路
500错误意味着claude-code-server进程在处理请求时发生了未捕获的异常,直接 crash 了。错误信息api call failed after 3 retries: http 500: llama-server process has terminated是最典型的信号——它告诉你,不是 Claude Code 本身挂了,而是它依赖的底层 LLM 服务(如llama-server)退出了。
诊断流程:
- 确认进程状态:
# Linux/macOS ps aux | grep "llama-server\|claude-code" # 如果 llama-server 进程不存在,说明它启动失败或被 kill - 查看服务日志:
claude-code-server会把llama-server的 stdout/stderr 重定向到logs/llama-server.log。打开这个文件,找最后一行:OSError: [Errno 12] Cannot allocate memory→ 内存不足,需关闭其他程序或换小模型;error: unrecognized arguments: --numa→ llama.cpp 版本太新,不兼容当前硬件,降级到v0.2.50;Failed to load model from ./models/xxx.gguf→ 模型文件路径错误或文件损坏,用ls -lh ./models/确认文件存在且大小 > 1MB。
- 手动启动 llama-server 测试:
# cd 到 llama-server 目录 ./llama-server -m ./models/llama-3-8b.Q4_K_M.gguf -c 2048 --port 8080 # 然后 curl http://127.0.0.1:8080/health 看是否返回 ok
注意:
500错误的日志,永远比错误提示本身更有价值。不要只盯着500,一定要翻logs/目录下的server.log和llama-server.log,里面藏着所有真相。
5. 进阶应用:将 Claude Code MCP 服务接入 Figma、蓝湖与自建平台
5.1 Figma 插件接入:用@figma/mcp-client实现设计稿智能评审
Figma 插件要调用 Claude Code,不能直接发 HTTP 请求(浏览器安全策略限制),必须用 Figma 官方提供的@figma/mcp-clientSDK。核心思路是:插件作为 MCP Host,通过window.parent.postMessage向嵌入的 iframe(你的 MCP 服务)发送 JSON-RPC 请求。
步骤:
- 在 Figma 插件代码中安装 SDK:
npm install @figma/mcp-client - 初始化客户端,指向你的 HTTP 服务:
import { createMcpClient } from '@figma/mcp-client'; const client = createMcpClient({ // 注意:这里必须是你的服务地址,且 Figma 插件要求 HTTPS baseUrl: 'https://your-domain.com/mcp', // 通过 Nginx 反向代理到 http://127.0.0.1:1572 // 或者开发时用 localhost(Figma 允许) baseUrl: 'http://localhost:1572' }); - 调用工具:
const result = await client.callTool('codex.getDiff', { file_path: 'design-system.sketch', context: { figma_page_name: 'Buttons', selected_layer_ids: ['123', '456'] } }); console.log(result);
关键点:Figma 插件运行在沙箱 iframe 中,
localhost地址必须在 Figma 开发者后台的Allowed Domains列表里注册,否则会报Blocked by CORS policy。生产环境务必用 HTTPS + Nginx 代理。
5.2 蓝湖(Lanhu)评审接入:利用 Webhook 触发 MCP 服务
蓝湖本身不支持 MCP,但提供 Webhook 功能。当设计师提交评审时,蓝湖会向你指定的 URL 发送 POST 请求。你可以写一个简单的 Webhook 接收器,收到后调用 Claude Code 的 HTTP 接口。
Python 示例(用 Flask):
from flask import Flask, request, jsonify import requests app = Flask(__name__) @app.route('/webhook', methods=['POST']) def handle_webhook(): data = request.json # 提取蓝湖事件中的关键信息 project_id = data.get('project_id') comment = data.get('comment', '') # 构造 MCP 请求,调用 codex 工具分析评论 mcp_response = requests.post( 'http://127.0.0.1:1572/v1/responses', json={ "jsonrpc": "2.0", "method": "codex.analyzeComment", "params": { "project_id": project_id, "comment": comment, "context": {"source": "lanhu_webhook"} }, "id": 1 } ) if mcp_response.status_code == 200: return jsonify({"status": "success", "mcp_result": mcp_response.json()}) else: return jsonify({"status": "error", "mcp_error": mcp_response.text}), 500 if __name__ == '__main__': app.run(port=5000)然后在蓝湖后台,将 Webhook URL 设为http://your-server.com/webhook。
5.3 自建平台集成:用mcp-jsSDK 在任意网页调用
对于自己的内部平台,最简单的方式是直接在前端页面引入mcp-js客户端库:
<script src="https://unpkg.com/@modelcontextprotocol/client@latest/dist/index.umd.js"></script> <script> const client = new MCP.Client({ transport: new MCP.HTTPTransport({ url: 'http://127.0.0.1:1572/v1/responses' }) }); // 初始化 client.initialize().then(() => { console.log('MCP client ready'); // 调用工具 client.callTool('mcp.listTools').then(console.log); }); </script>注意:现代浏览器禁止
http://127.0.0.1的跨域请求。解决方案只有两个:① 用https://localhost(需自签名证书);② 用 Nginx 做同源代理,把/mcp路径代理到http://127.0.0.1:1572。
6. 性能优化与稳定性加固:让 MCP 服务 7x24 小时可靠运行
6.1 进程守护:用 PM2 确保服务永不宕机
npm run start:http是前台命令,关闭终端就停止。生产环境必须用进程管理器。PM2 是最成熟的选择:
# 全局安装 npm install -g pm2 # 启动服务(--name 指定进程名,方便管理) pm2 start npm --name "claude-mcp" -- start:http # 查看进程状态 pm2 list # 查看实时日志 pm2 logs "claude-mcp" # 设置开机自启 pm2 startup pm2 savePM2 会自动重启崩溃的进程,并记录详细的restart_time和status。如果llama-server因内存不足退出,PM2 会在 1 秒内拉起新进程,用户几乎无感知。
6.2 内存与 CPU 限制:防止 LLM 模型吃光系统资源
Claude Code 启动的llama-server是内存大户。一台 16GB 内存的机器,跑一个 8B 模型就可能占满。必须主动限制:
- 在
.env中配置:
# 限制 llama-server 最大内存(单位 MB) LLAMA_SERVER_MAX_MEMORY=8192 # 限制线程数,降低 CPU 占用 LLAMA_SERVER_THREADS=4- 用 PM2 限制主进程:
pm2 start npm --name "claude-mcp" -- start:http \ --max-memory-restart 1024M \ --instances 1- 监控指标:用
pm2 monit查看实时内存/CPU 曲线,设置告警阈值。
6.3 日志归档与错误追踪:用 ELK 栈集中分析
logs/目录下的日志是故障排查的黄金数据,但分散在各处。建议用 Filebeat + Logstash + Elasticsearch 做集中收集:
- Filebeat 监控
logs/*.log,实时推送日志行; - Logstash 过滤,提取
status_code、method、error_message字段; - Kibana 建立仪表盘,一眼看出 `