关于 omitly-mcp
omitly-mcp 将 Omitly 的本地 PDF 检查与脱敏能力提供给 AI Agent,适用于处理机密文档的场景。文档在设备上处理,并可生成记录移除内容的审计日志;部分写入和印章验证工具需要配置原生引擎。
主要功能
- 01本地扫描 PDF 中的敏感信息
- 02定位文本并返回页码与坐标
- 03检查脱敏后是否仍有敏感内容
- 04默认遮蔽提取文本中的个人信息
- 05生成脱敏文件并验证移除结果
- 06验证文件印章与篡改证据
适用场景
- 01发送前检查 PDF 中的个人信息
- 02定位待脱敏文本并核对坐标
- 03验证已脱敏 PDF 是否仍含敏感内容
- 04确认 PDF 自签章后是否被更改
MCP 相关
MCP 服务向 AI Agent 暴露 PDF 扫描、文本提取、脱敏、验证和提案状态等工具。五项检测与提取工具可通过内置 wasm 检测器运行;部分生成、写入和印章验证工具需要原生引擎。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
11收录的工具列表 · 更新于 今天
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| pdfPath | string | 是 | 要扫描的 PDF 的绝对路径 |
| regions | array | 否 | 将列出的模式类型限制为这些区域包(通用类型始终列出;已确认的标记下残留项始终报告);省略则扫描所有内容——这是安全默认值 |
详细介绍
omitly-mcp
一个 Model Context Protocol 服务,可向 AI Agent(Claude Code、Claude Desktop 以及任何其他 MCP 客户端)提供 Omitly 的本地、可验证的 PDF 脱敏功能。
仓库范围与许可协议——请在提交 PR 前阅读。
本仓库的代码可供查看,但并非开源。请参阅
LICENSE: 发布代码是为了让你在允许它处理机密文档之前,可以准确查看它会在你的机器上运行什么。 本代码未获许可用于其他项目。本仓库包含 MCP 服务和编译后的 wasm 检测包。Omitly 脱敏引擎、防篡改封印和许可实现不在本仓库中,而是在私有环境中开发;本代码会调用该引擎,但不包含引擎本身。
开发工作在私有仓库中进行,并在发布时同步到此处,因此无法合并拉取请求。欢迎提交问题和安全报告 ——请参阅
SECURITY.md。
其独特之处在于:Agent 可以在不将文档上传到任何地方的情况下对其进行脱敏。脱敏通过 Omitly 引擎在设备本地运行,并返回一份签名审计日志,记录了移除的内容;封印则表明交付的文件自封印后未被更改。但它无法证明文档中没有残留其他敏感信息——这与将机密文件粘贴到聊天模型中的做法恰恰相反。
11 个工具中的 5 个(find_sensitive_regions、locate_text、
check_redaction、verify_redaction、extract_pdf_text)开箱即用——只需 npm install,无需 Rust 工具链、原生二进制文件或桌面应用。
它们基于 wasm-bindgen 构建的检测器运行,该检测器与 omitly.app 上的网页泄漏检查器使用相同的引擎,并直接打包在此程序包中。create_pdf、两个写入工具(redact_pdf、redact_by_entity)以及两个封印验证工具(verify_seal、verify_document)仍需要配置原生引擎——请参阅下文的“原生引擎”。封印工具目前都没有 wasm 回退方案:尚无 wasm 封印验证路径(问题 #113 中正在跟踪),因此两者始终需要原生引擎,即使检查封印无需许可证。
安装
使用 npx 将服务添加到 MCP 客户端——无需克隆、构建或编译。已发布的版本自带 wasm 检测器,因此从注册表安装无需 Rust。
Claude Code:
claude mcp add omitly --env OMITLY_ALLOWED_DIR=/path/agents/may/touch -- npx -y omitly-mcp
Claude Desktop(claude_desktop_config.json)、Cursor(~/.cursor/mcp.json)和
Windsurf(~/.codeium/windsurf/mcp_config.json)使用相同的配置:
{
"mcpServers": {
"omitly": {
"command": "npx",
"args": ["-y", "omitly-mcp"],
"env": { "OMITLY_ALLOWED_DIR": "/path/agents/may/touch" }
}
}
}
将 OMITLY_ALLOWED_DIR 设置为存放待检查文档的文件夹;
如果未设置,服务将使用启动时所在的目录(请参阅“访问控制”)。Claude Desktop 用户也可以安装一键式 .mcpb 程序包(请参阅下文的“Claude Desktop 一键安装”)。
有 5 个工具开箱即用。find_sensitive_regions 和 check_redaction
免费,但会标记为 EVALUATION;未配置原生引擎时,两者合计每月最多可尝试 10 次(可通过 OMITLY_FREE_CAP 修改次数上限);locate_text、verify_redaction 和 extract_pdf_text 免费且没有次数限制。脱敏(redact_pdf、redact_by_entity)、
create_pdf 和封印验证需要原生引擎,目前该引擎不会在源代码仓库之外分发(omitly#1405)。
技能(Claude Code)
此程序包附带一项 Claude 技能:skill/SKILL.md:
纯文本说明,告诉 Claude 何时使用这些工具以及如何报告结果——只显示掩码后的值,并说明免费检查能证明和不能证明什么。
为 Claude Code 安装此技能(用户范围):
mkdir -p ~/.claude/skills/omitly-redaction
curl -fsSL https://raw.githubusercontent.com/omitly/omitly-mcp/main/skill/SKILL.md \
-o ~/.claude/skills/omitly-redaction/SKILL.md
项目也可以将技能保存在 .claude/skills/omitly-redaction/ 下。
技能仅包含说明;限制和免费次数上限由服务执行,而非技能。
工具
| 工具 | 功能 |
|---|---|
find_sensitive_regions | 在设备本地扫描 PDF,并返回 PII 候选项——电子邮件/SSN/电话号码/银行卡,以及澳大利亚标识符(TFN、ABN、ACN、Medicare、Centrelink CRN、IHI、BSB;有已发布算法的标识符会进行校验位验证)——并附上页码和精确坐标,让 Agent 按实体选择,绝不猜测几何位置。采用尽力而为的模式匹配,不构成合规性评估。可选的 regions(generic/us/au)可缩小所列类型的范围。免费层(wasm)标记为 EVALUATION,并计入每月共享的 10 次尝试上限(见“Licensing”);配置了原生引擎则不受此上限约束。 |
locate_text | 将模型提供的字面字符串(姓名、地址——任何正则表达式无法捕捉的内容)定位到对应页码和坐标。由模型识别内容,由引擎计算几何位置。 |
check_redaction | 审计一份已完成脱敏的 PDF,并报告敏感文本是否仍隐藏在脱敏标记下方、之前的增量更新版本、元数据、AcroForm 字段或附件中——检查“我的黑色遮盖框是否真的移除了数据?”,并提供覆盖范围报告,说明检查了哪些内容。它还会根据与桌面应用“检查任意 PDF”相同的文档检查(原生 omitly-redact check 或捆绑的 wasm check,使用同一个 Rust 函数)返回 verdict——safe_to_send、needs_review(发现问题时附带 blocking)或 cannot_verify——以及固定的结果分区(检查内容、问题、需复核内容、无法检查的内容)。此工具不会返回 verdict 背后的完整 audit v2 报告;该报告可通过引擎的 check 命令获取。Verdict 仅说明检查及其覆盖范围(隐藏、遮盖和可恢复的内容),绝不代表文档安全。免费层(wasm)标记为 EVALUATION,并计入每月共享的 10 次尝试上限(见“Licensing”);配置了原生引擎则不受此上限约束。 |
extract_pdf_text | 按页提取 PDF 的全部文本,默认对 PII 进行遮蔽,避免原始敏感值涌入模型的上下文窗口。每页的 spans 会报告每个被遮蔽值的字符偏移量(不是字节偏移量)和类型,因此 Agent 无需看到原始值,也能判断其位置。masked: false 是文档明确说明的选择加入项,可获取原始文本。免费,无需许可证,在捆绑的 wasm 引擎上开箱即用;有原生引擎时优先使用原生引擎(还可启用 regions 过滤;wasm 会忽略此参数并扫描所有模式)。绝不会将页面渲染为图像。 |
redact_by_entity | 一步完成:查找 + 按类型(email/ssn/phone/card/tfn/abn/acn/medicare/crn/ihi/bsb)和/或 regions 过滤 + 脱敏 + 验证。“只需清除明显 PII”的快捷方式。 |
redact_pdf | 移除 PDF 指定区域中的底层数据,验证没有内容残留,写入脱敏后的文件,并返回审计日志。 |
verify_redaction | 重新扫描已完成脱敏的 PDF,并返回验证 verdict——检查脱敏是否完整。 |
verify_seal | 以密码学方式检查 PDF 中嵌入的 Omitly 审计报告和整份文件的防篡改密封(seal v1:Ed25519;seal v2,自 Omitly 4.0 起:ML-DSA-87 与 ECDSA P-384)——这是防篡改检查,与 verify_redaction 不同。**验证完整性,不验证身份:**签名密钥随文件一起保存(由桌面应用按安装实例生成,或由引擎为单次输出生成),因此有效密封仅表示“自持有此密钥的一方密封后未发生更改”,绝不表示“由 Omitly 生成”——应通过外部渠道比较 sealFingerprint,以确认来源。需要原生引擎;没有 wasm 回退方案。 |
verify_document | 接收方信任验证(omitly#113):与 verify_seal 执行相同的密封/报告检查——不会重新扫描残留内容——面向从他人处收到 PDF、希望确认文件自密封后未被更改的人(验证完整性,不验证身份——见 verify_seal),无需付费或获取许可证。免费,无需许可证。目前与 verify_seal 一样需要原生引擎(尚无 wasm 密封验证路径)。 |
create_pdf | 在设备本地从 Markdown/HTML 生成整洁的 PDF,并通过真实的浏览器引擎进行渲染,使其看起来像打印件——无需编写一次性 reportlab/LaTeX 脚本。 |
check_license | 报告当前的许可证或试用状态——等级、剩余试用天数、由供应商签名的被许可方名称、提供许可证的解析步骤,以及许可证是否绑定到此机器。免费,无需参数,不读取文档;每次调用都会重新解析,因此购买 → 保存许可证 → 再次调用无需重启即可生效。绝不返回设备指纹或许可证文件的内容——设备绑定状态只会以是/否的形式返回。需要原生引擎:wasm 免费层没有许可证概念。 |
propose_redactions | omitly#1643,自带 AI:提出脱敏区域,供 PERSON 在 Omitly 桌面应用中接受。不会写入任何内容。需要此电脑上正在运行桌面应用;接受后,桌面应用会移除内容、进行验证并添加密封,记录会显示由人员作出决定(human-desktop)。 |
get_proposal_status | 跟踪已排队的提议:待处理、已接受、已拒绝、已应用(附输出路径和 verdict)、失败或过期。免费;不读取文档。 |
应用内接受(omitly#1643)
当 Omitly 桌面应用在同一台计算机上运行,且 Settings → Connect
your AI → "Accept proposals in Omitly" 已开启(默认设置)时,redact_pdf 和
redact_by_entity 不会执行:它们会返回 { status: "queued", proposalId },而
脱敏操作会成为一项提案,由用户在应用中接受或拒绝。用户接受后,桌面应用会运行自己的已验证移除引擎、残留内容扫描和封印流程,封存记录会注明决定由用户作出(human-desktop);此流程不需要 Agent 一侧具备原生引擎。propose_redactions 是执行同一操作的显式形式;
get_proposal_status 用于跟踪处理结果;用户在 Omitly 自带的
保存对话框中选择输出路径(outputPath 会保留为客户端提供的建议)。需要使用了解此通道的 omitly-mcp 版本——旧版服务会直接写入。若桌面应用未运行(或开关已关闭),写入工具的行为与之前完全相同,记录会注明 mcp-agent(未经人工审核)。两端通过状态目录下的文件通信
(OMITLY_STATE_DIR,否则为 ~/.omitly:desktop.json、proposals/、clients/)——不使用套接字或网络。PDF 和引擎都留在这台计算机上;客户端请求的文本(例如 extract_pdf_text)会发送到该客户端运行模型的位置。
PDF 生成(create_pdf)
create_pdf 由一个独立的二进制程序 omitly-pdf 提供服务,它与脱敏引擎分开存放,因为生成内容与可验证脱敏采用不同的信任模型。它通过无头 Chromium 系列浏览器(Chrome/Chromium/Edge/Brave;可通过 OMITLY_BROWSER_BIN 覆盖)渲染 Markdown(或原始
HTML)——使用的浏览器引擎与 Omitly 应用的 Web 视图相同,因此输出看起来像打印件,而非脚本生成的内容。此工具需要原生
omitly-pdf 二进制程序,目前尚未发布(omitly#1405),且其源代码不在此存储库中;将 OMITLY_PDF_BIN 指向一个副本即可启用此工具。
// stdin
{ "command": "create", "outputPath": "/abs/out.pdf",
"source": "# Hello\n\nBody **markdown**", "format": "markdown", "title": "Hello" }
// stdout
{ "ok": true, "output": "/abs/out.pdf" }
典型的 Agent 工作流:
- 快速:
redact_by_entity(一次调用即可查找、脱敏并验证)。 - 谨慎:
find_sensitive_regions/locate_text→ 审核 →redact_pdf→verify_redaction。find/locate返回的坐标可直接作为regions参数传给redact。
完整的 Claude Code 操作演示请参阅 DEMO.md。
状态
MCP 接口(十一个工具、架构、传输)、原生引擎二进制程序
(crates/omitly-cli,构建为 omitly-redact)以及捆绑的 wasm 引擎
(crates/leakcheck-wasm,无需原生二进制程序即可提供五个免费工具)均已实现并通过端到端测试。find_sensitive_regions
是初步检测器(ASCII 模式,按显示操作符逐项匹配):应将其命中视为待审核候选项,而非完整性保证。大模型始终可以直接提供其他区域。
检测结果的隐私。 此服务在本地处理文件,绝不会上传文件。不过,每个工具的结果都会返回给你的 MCP 客户端,因此会进入该客户端的模型上下文,并发送到客户端发送结果的任何位置:“不会上传任何内容”描述的是文件,而非结果。检测工具
(find_sensitive_regions、check_redaction、verify_redaction)会为每项发现返回遮盖后的预览(例如 •••-••-6789),而非原始值;脱敏依据页码和坐标执行。extract_pdf_text 默认会遮盖识别出的值,但显式启用 masked: false 后,原始文本会以原样出现在结果和模型上下文中。遮盖仅涵盖已识别的模式类型(电子邮件、SSN、电话号码、银行卡号和澳大利亚标识符):检测器无法识别的姓名、地址或条款会作为普通文本返回。locate_text 的命中结果也会附带遮盖后的预览,但遮盖会隐藏匹配文本中除最后四个字母或数字以外的所有内容,因此较短或有辨识度的字符串仍会部分可读。
引擎约定(在 crates/omitly-cli 中实现)
服务会启动 OMITLY_REDACT_BIN,向标准输入写入 JSON 请求,并从标准输出读取 JSON 响应。任何失败都会返回 { "ok": false, "error": "..." }(进程仍以状态码 0 退出,因此调用方应读取 ok,而不是检查退出码)。
// stdin
{ "command": "find", "pdfPath": "..." }
// stdout
{ "ok": true, "count": 2, "regions": [
{ "page": 0, "x": 250.4, "y": 610.4, "width": 79.2, "height": 14.4, "kind": "ssn", "preview": "•••-••-6789" } ] }
// `preview` is masked — the raw value never leaves the process; redaction is driven by coordinates.
// stdin — "masked" omitted ⇒ true (the default); pass "masked": false for the
// documented raw-text opt-in. "regions" narrows detected kinds (generic
// kinds like email/card always apply).
{ "command": "extract_text", "pdfPath": "..." }
// stdout — "spans" offsets are CHAR (not byte) offsets into "text", valid
// against either the masked or the raw text of the same page (masking never
// changes a page's character count). A page whose text could not be fully
// read reports "contentDecoded": false rather than being silently skipped;
// any text that was read is still returned, so treat that page as incomplete.
{ "ok": true, "masked": true, "pages": [
{ "page": 0, "contentDecoded": true,
"text": "Sensitive sample line: SSN •••-••-6789",
"spans": [ { "kind": "ssn", "start": 24, "end": 35 } ] } ] }
// stdin
{ "command": "redact", "pdfPath": "...", "outputPath": "...",
"regions": [{ "page": 0, "x": 72, "y": 700, "width": 200, "height": 14, "reason": "PII.SSN" }] }
// stdout — also writes "<outputPath>.audit.json" beside the file
{ "ok": true, "output": "...", "audit": { "verdict": "pass", "regions": [ ... ], "warnings": [], "metadataScrubbed": true } }
// stdin — recovers the redacted regions from "<pdfPath>.audit.json"
{ "command": "verify", "pdfPath": "..." }
// stdout — hiddenContent re-checks thumbnails / document actions / embedded
// files on the delivered bytes (omitly#171); any fail flips the verdict
{ "ok": true, "verdict": "pass", "regions": [ ... ], "metadataScrubbed": true,
"hiddenContent": [ { "class": "thumbnails", "verification": { "result": "pass" } }, ... ] }
// stdin — checks the embedded audit report + whole-file seal (v1 or v2), not
// redaction completeness (that's "verify" above)
{ "command": "verify_seal", "pdfPath": "..." }
// stdout — verdict is one of: no_report | seal_invalid |
// seal_unsupported_version | incomplete | verified. seal_unsupported_version
// means this verifier is too old to check the seal at all — sealValid is
// `null` (checked nothing), never true or false; carriesAuditReport flags
// whether the file also carries an Omitly audit report (escalation signal).
// sealRemoved (omitly#1591) is true when the file carries a sealed report but
// no seal at all (typically re-saved in another app) — a reason beside
// seal_invalid or a v2 cannot_verify, never a verdict of its own.
{ "ok": true, "verdict": "verified", "sealValid": true, "sealFingerprint": "...",
"allPassed": true, "metadataScrubbed": true, "regionCount": 2, "pageCount": 4,
"warnings": [], "licenseProvenance": null,
"inputSha256": "...", "outputSha256": "...",
"sourceFilename": "...", "outputFilename": "..." }
// stdin — omitly#1267: the Safe to Send verdict over the file AS PRESENTED
// (the desktop "Check any PDF" check; the bundled wasm `check` returns the
// same object). Free, read-only, no qpdf.
{ "command": "check", "pdfPath": "..." }
// stdout — verdict is one of: safe_to_send | needs_review | cannot_verify;
// "blocking" marks a problem found (e.g. text recoverable under a box).
// These are verdicts about the CHECK, scoped to what it covered
// (result.checked / result.notChecked) — never "the document is safe".
// "report" is the presented audit v2 report, present only when it verified;
// "reason_code" is set only for input_too_large / check_failed.
{ "ok": true, "check": { "verdict": "needs_review", "blocking": true,
"result": { "state": "needs_review", "summary": "...", "problems": [ { "text": "...", "pages": [1] } ], ... },
"report": { "schema": "omitly.audit/v2", "release_check": { "mode": "presented", "overall": "unsafe", ... }, ... },
"reason_code": null } }
MCP 工具 verify_document(omitly#113)会调用与上述完全相同的
verify_seal 引擎命令。它只是面向接收方的名称和措辞,用于执行相同的印章/报告完整性检查,并不是单独的引擎命令。
原生引擎
create_pdf、verify_seal、verify_document 和两个写入工具
(redact_pdf、redact_by_entity)始终需要配置原生引擎;五个免费工具
使用捆绑的 wasm 引擎,除非配置了原生引擎。原生二进制文件
(omitly-redact、omitly-pdf)目前不会在源代码仓库之外分发(omitly#1405)。即使检查印章没有许可要求(见下文“许可”),这两个印章工具也都没有 wasm 回退方案。
一个环境变量即可设置这两个二进制文件:OMITLY_ENGINE_DIR 是存放
omitly-redact 和 omitly-pdf 的目录。设置后,针对各二进制文件的覆盖变量(OMITLY_REDACT_BIN、OMITLY_PDF_BIN)优先于该目录。如果未设置
OMITLY_ENGINE_DIR(或 OMITLY_REDACT_BIN),find_sensitive_regions、locate_text、check_redaction 和 extract_pdf_text 会透明地使用捆绑的 wasm
引擎,而不是原生二进制文件;检测器相同(extract_pdf_text 的可选
regions 筛选器仅限原生引擎使用;wasm 会扫描所有模式,并注明筛选器已忽略)。verify_redaction 也会使用 wasm,但检查范围更窄:没有原生引擎时,不存在可用于核对特定区域的 <path>.audit.json 旁置文件,因此它会回退为重新扫描整个文件(仍然有用——结果非空仍表示文件不干净——只是严谨程度不如基于旁置文件的检查)。
find/redact 需要 qpdf 来运行涂黑处理流程(QPDF_BIN 会覆盖 PATH 查找)。单独运行 find(原生或 wasm)是只读操作,无需该工具。
访问控制
工具调用中的所有路径都来自模型,因此服务会将所有读取和写入限制在一个允许的目录中:
OMITLY_ALLOWED_DIR——在 MCP 配置中设置(推荐)。如果未设置,则使用启动服务时所在的目录。- 检查前会解析符号链接,因此会拒绝根目录内指向其外部的链接。
- 输出绝不会覆盖现有文件(或其
.audit.json旁置文件);服务会要求 Agent 另选一个新文件名。 OMITLY_ENGINE_TIMEOUT_MS(默认值为 120000)——如果引擎进程卡住,会在截止时间到达时将其终止,而不是让 Agent 的工具调用一直挂起。
这些是为了防止代理混淆错误的防护措施,并非用于抵御恶意本地用户的沙箱——请参阅 docs/THREAT-MODEL.md。
许可
redact_pdf/redact_by_entity 是写入接口,许可检查在引擎二进制文件内部执行(不在此服务中,也无法通过捆绑的 wasm 回退绕过——wasm 绝不会接触这两个工具):使用 Pro 或 Personal 许可证(OMITLY_LICENSE_FILE,或同一台机器上已激活许可证的 Omitly 桌面应用)时,输出不会带标记;否则会使用共用的 14 天试用期,审计输出会永久标记为评估输出。脱敏本身绝不会降级,许可证检查也绝不会访问网络。
find_sensitive_regions、locate_text、check_redaction、verify_redaction、verify_seal、verify_document 和 extract_pdf_text 均免费;其中 locate_text/verify_redaction/verify_seal/verify_document/extract_pdf_text 永久免费,没有次数上限,也不带标记(重点在于接收方验证和设备端提取,而不是计量式转化漏斗)。wasm 层级上的两个免费检测工具(find_sensitive_regions、check_redaction)——也就是未配置原生引擎时——会计量使用次数(omitly#226):结果会带有 evaluation: true 标志和 EVALUATION 横幅;每月两种工具合计尝试 10 次后(共用一个计数器;可通过 OMITLY_FREE_CAP 更改次数),工具会返回结构化拒绝 { blocked: true, reason: "free-cap" },直到下个月开始。计数保存在 ~/.omitly/usage.json 中(可通过 OMITLY_STATE_DIR 更改目录;文件权限设为 0600),并且仅限本地——绝不会向外发送任何信息;删除该文件会重置免费次数,此情况可接受(无网络原则使其不可避免),且任何付费写入路径都不会查询此计数器。扫描开始前即会计入一次尝试,因此即使尝试失败也会计数。通过已配置的原生引擎提供的调用(无论是否有许可)不会在此处计量——这类用户属于引擎漏斗,适用上述许可规则。根据相同设计,crates/omitly-cli 中的 verify_seal 和 verify_document(两者仅限原生引擎)仍然免费(该命令路径也不会检查 Pro/Personal 许可证——这两个工具都会调用完全相同的 verify_seal 引擎命令)。
一键安装 Claude Desktop(MCPB,仅限免费层级)
mcpb/ 将四个免费/诊断工具(check_redaction、find_sensitive_regions、locate_text、verify_redaction)打包成独立的 MCPB .mcpb 扩展,绝不包含写入工具:最终用户的机器上无需安装 Node/npm/Rust 工具链,只需在 Claude Desktop 中选择“Install Extension…”即可。这是一个刻意做得更精简、独立于上文 dist/index.js 的服务(mcpb/server/index.js),因此该扩展绝不可能意外暴露 redact_pdf/redact_by_entity/create_pdf。
下载:releases.omitly.app/mcp/omitly-leak-check.mcpb——始终提供当前版本(每次真实的 omitly-mcp 发布时由 publish-npm.yml 发布;带版本号的副本和校验和也位于 mcp/latest.json)。将下载的文件拖入 Claude Desktop,或使用“Install Extension…”。
要自行构建扩展包,请参阅“从源代码构建”。
未签名(mcpb sign 需要我们目前尚未拥有的代码签名证书——与桌面应用签名面临的限制相同)。对打包后的文件运行 mcpb info,会确认显示 WARNING: Not signed。Claude Desktop 的“Install Extension…”流程会阻止安装未签名的 .mcpb,还是仅显示警告,本次更改尚未通过真实的 Desktop 应用确认(此环境中没有 Desktop GUI)——这项检查仍未完成,跟踪记录见 omitly#225。
从源代码构建
构建此仓库。通过注册表安装(请参阅“安装”)无需进行这些操作。
服务和免费工具(不使用原生引擎):
cd omitly-mcp
npm install
npm run build # plain tsc; the wasm bundle ships prebuilt in wasm/
node dist/index.js
此仓库随附已编译的 wasm 包,位于 wasm/,并提供
wasm/leakcheck_wasm_bg.wasm.sha256,供你验证收到的构件是否逐字节一致。
它与在 npm 包中发布的包相同。
这意味着无需 Rust 工具链,npm install && npm run build && npm test 也能正常运行:
npm run build 只运行 tsc。wasm 编译自 Omitly 检测引擎,其 Rust 源代码不属于此仓库
(请参阅上文“仓库范围”)。
原生引擎二进制文件(用于 create_pdf、seal 工具和 write
工具;请参阅“原生引擎”):
# Build and start the MCP server (no Rust toolchain needed)
npm install
npm run build
node dist/index.js
# To enable the native-engine tools as well, point at a directory containing
# the Omitly engine binaries (omitly-redact, omitly-pdf). They are not currently
# distributed (omitly#1405), and their source is not in this repository.
OMITLY_ENGINE_DIR=/abs/path/to/engine node dist/index.js
在 Claude Code 中注册本地构建:
claude mcp add omitly -- env \
OMITLY_ENGINE_DIR=/path/to/engine-dir \
OMITLY_ALLOWED_DIR=/path/agents/may/touch \
node /abs/path/to/omitly-mcp/dist/index.js
或在 Claude Desktop 的 claude_desktop_config.json 中:
{
"mcpServers": {
"omitly": {
"command": "node",
"args": ["/abs/path/to/omitly-mcp/dist/index.js"],
"env": {
"OMITLY_ENGINE_DIR": "/path/to/engine-dir",
"OMITLY_ALLOWED_DIR": "/path/agents/may/touch"
}
}
}
}
MCPB 包:
npm run mcpb:pack # copy wasm/ into mcpb/wasm + npm install + mcpb pack
# → dist-mcpb/omitly-leak-check.mcpb
mcpb:pack 无需 Rust 工具链——它会复用此仓库中预构建的 wasm/
(构建一次共享的 wasm 检测器,然后将其复制到 mcpb/——请参阅
mcpb/scripts/copy-wasm.mjs)。打包后的 .mcpb 除 Node 外不需要其他依赖,
而 Node 已包含在 Claude Desktop 中。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。