Skip to content

MCP Server

Sigil 的 MCP Server 是 AI 客户端接入的入口。本篇讲它的协议、监听机制、客户端授权。

协议选择

Sigil 实现的是 Model Context Protocol(MCP)的 Streamable HTTP transport,协议版本 2025-06-18

  • 基于 HTTP(不是 stdio):远程 / 容器 / 多客户端场景天然支持
  • JSON-RPC 2.0 消息封装
  • Bearer Token 鉴权(每个客户端独立 Token)
  • 支持服务端推流(tools/list_changed 等通知)
  • 结构化输出(2025-06-18):tools/call 在人读 content 之外,对支持的能力额外返回机读的 structuredContenttools/list 为这些能力同时声明 outputSchema
  • 工具注解tools/list 为每个能力标注 readOnlyHint / destructiveHint,客户端据此对只读工具免确认、对破坏型工具强确认

MCP 是 Anthropic 推出的开放协议,被 Claude Code、Cursor、Cline、Zed、Continue 等主流 AI 客户端原生支持。

默认配置

监听地址127.0.0.1:8421(仅本机回环)
路径/mcp
端口策略8421 被占用时自动顺延
TLS不启用(仅本机回环,TLS 是 overkill)
Token 算法自托管签发,Constant-time 比对
Origin 校验所有路由强制校验 Origin 头(防 DNS rebinding)
端点文件endpoint.json 仅当前用户可读(Windows ACL / Unix 0600)

如果需要绑定其他网口(如 0.0.0.0,给同一局域网的移动端用),需手动启用"远程网关"——这是显式行为,不会被默默开启。

Origin 校验(防 DNS rebinding)

MCP 规范要求本机 HTTP server 必须校验 Origin 头,否则恶意网页可借 DNS rebinding 让浏览器向 127.0.0.1:8421 发请求。Sigil 的策略:

  • Origin 头 → 放行:非浏览器 MCP 客户端(Claude Code / Cursor / curl)天然不发 Origin,不受影响
  • Origin 为本机回环(localhost / 127.0.0.1 / [::1])→ 放行
  • 其它外部域名 → 403 Forbidden(正是 rebinding 攻击的来源)

这道校验覆盖所有路由,包括无鉴权的 /health/metrics,杜绝聚合指标被恶意网页旁路读取。

客户端授权

Token 颗粒度

Sigil 给每个客户端独立颁发 Bearer Token

Sigil  ──┬── Bearer "sk_sigil_aaaa..."  ──→  Claude Code
         ├── Bearer "sk_sigil_bbbb..."  ──→  Cursor
         └── Bearer "sk_sigil_cccc..."  ──→  Cline(仅只读)

每个 Token 有独立的:

  • 名称(出现在审计日志的 caller 列)
  • 范围(哪些能力可调用)
  • 创建时间 / 最后使用时间
  • 过期时间(可选)
  • 是否启用

撤销

撤销 Token = 立即让对应的客户端连接失效。在 MCP 页 → 客户端管理 → 行末"⋯" → 撤销。

撤销是即时生效的,不需要重启 Sigil。

Token 一次性显示

新建客户端时显示的明文 Token 只在生成那一刻可见——关闭对话框后,UI 不再展示,OS 密钥环里只有 hash 用于比对。

如果你忘了 Token:撤销旧的,重新生成一个。

协议方法(关心实现的人看)

Sigil 实现以下 MCP 方法:

方法用途
initialize客户端握手 + 版本协商(声明 protocolVersion 2025-06-18
tools/list列出当前 Token 可用的所有能力(含 inputSchema / outputSchema / readOnlyHint / destructiveHint
tools/call调用某个能力(返回 content 人读文本 + 可选 structuredContent 机读结果)
notifications/tools/list_changed服务端推送:能力列表变更
ping心跳

不支持的方法(Sigil 不暴露这些):

  • resources/* —— Sigil 不暴露文件资源
  • prompts/* —— Sigil 不维护 Prompt 模板
  • sampling/* —— Sigil 不做模型采样

只做凭据与能力代理——其他能力交给客户端自己实现。

工具列表的动态构造

调用 tools/list 时,Sigil 不是简单返回"所有内置能力"——而是按当前 Token 的范围 + Scope Policy 动态过滤:

请求方        当前 Token 范围             返回的工具列表
─────────────────────────────────────────────────────────
Claude Code   全部能力               git_query / git_mutate /
                                     db_query / db_execute /
                                     ssh_query / ssh_exec /
                                     http_request /
                                     password_generate /
                                     [13 个工具]

Cline         仅只读能力              git_query / db_query /
                                     ssh_query / http_request(GET) /
                                     health_check
                                     [5 个工具]

某第三方客户端 仅 http_request        http_request
                                     [1 个工具]

这意味着:你给某个客户端的 Token 范围越小,它看到的工具就越少——它甚至不知道还有别的工具存在。

性能特征

  • 单连接 RTT: < 5 ms(本机回环)
  • 并发能力调用: 内部用 tokio 多任务,无明显瓶颈
  • 内存占用: MCP Server 本身 < 30 MB(不含 Sigil UI)

写类能力(db_execute / ssh_exec 等)受限于目标服务的网络与执行时间,Sigil 不引入额外开销。

错误码

Sigil 遵循 MCP 标准错误响应,并增加了一组应用级 code:

code说明
unauthorizedBearer Token 无效 / 已撤销
not_in_scope该 Token 不允许调用此能力
credential_missing找不到合适的凭据
credential_expired凭据已过期
scope_policy_denied凭据的 Scope Policy 拒绝此能力
kill_switch_activeAI Kill Switch 已启用
confirmation_required写类能力需用户在 Sigil UI 确认
forbidden_command命中危险命令黑名单(仅 ssh_exec / db_execute

客户端收到这些错误时,建议把 message 直接展示给用户——它们都是已经人化的中文描述。

远程网关(可选 / 进阶)

如果你需要让局域网其他机器(如手机、平板)也通过 MCP 访问本机 Sigil,可以在"设置 → 远程网关"启用:

  • 监听地址改为 0.0.0.0:8421(或自定义网口)
  • 强制要求 Bearer Token 鉴权
  • 建议同时启用"失败追踪"(连续 N 次错误后封禁源 IP)

如果要从公网访问,强烈建议自建反向代理(Caddy / Nginx)加 TLS + 双向 mTLS。Sigil 本身不内嵌 frpc / easytier 等内网穿透——这类二进制在不少国内杀软里被误报,体验不好。

⚠️ 远程网关是双刃剑。仅在你清楚知道自己在做什么时启用。

下一步

让 AI 帮你干活,但永远拿不到你的密钥