mcpField
O
omitly-mcp

omitly-mcp

本地服务
github.com/omitly安全01 天前更新

关于 omitly-mcp

omitly-mcp 将 Omitly 的本地 PDF 检查与脱敏能力提供给 AI Agent,适用于处理机密文档的场景。文档在设备上处理,并可生成记录移除内容的审计日志;部分写入和印章验证工具需要配置原生引擎。

主要功能

  1. 01本地扫描 PDF 中的敏感信息
  2. 02定位文本并返回页码与坐标
  3. 03检查脱敏后是否仍有敏感内容
  4. 04默认遮蔽提取文本中的个人信息
  5. 05生成脱敏文件并验证移除结果
  6. 06验证文件印章与篡改证据

适用场景

  1. 01发送前检查 PDF 中的个人信息
  2. 02定位待脱敏文本并核对坐标
  3. 03验证已脱敏 PDF 是否仍含敏感内容
  4. 04确认 PDF 自签章后是否被更改

MCP 相关

MCP 服务向 AI Agent 暴露 PDF 扫描、文本提取、脱敏、验证和提案状态等工具。五项检测与提取工具可通过内置 wasm 检测器运行;部分生成、写入和印章验证工具需要原生引擎。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"omitly-omitly": {
"command": "npx",
"args": [
"-y",
"omitly-mcp"
]
}
}
}
启动命令npx -y omitly-mcp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmomitly-mcp5.2.0

工具

11

收录的工具列表 · 更新于 今天

参数类型必填说明
pdfPathstring是要扫描的 PDF 的绝对路径
regionsarray否将列出的模式类型限制为这些区域包(通用类型始终列出;已确认的标记下残留项始终报告);省略则扫描所有内容——这是安全默认值

详细介绍

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_redactionsomitly#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 中。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。