mcpField
O
omitly-mcp

omitly-mcp

ローカル
github.com/omitlyセキュリティ01 日前に更新

omitly-mcp について

omitly-mcp は、機密文書を扱う AI エージェントに Omitly のローカル PDF 検査・墨消し機能を提供する MCP サーバーです。ファイルは端末上で処理され、削除内容を記録した監査ログを返します。一部の書き込みとシール検証にはネイティブエンジンが必要です。

主な機能

  1. 01PDF 内の機密情報を端末上で検出
  2. 02テキストを特定してページ座標を返却
  3. 03墨消し後に機密情報が残るか確認
  4. 04抽出テキストの個人情報を既定でマスク
  5. 05墨消し済みファイルを作成して削除を検証
  6. 06文書シールと改ざん証拠を検証

活用シーン

  1. 01送信前に PDF の個人情報を確認
  2. 02墨消し対象テキストと座標を特定
  3. 03墨消し済み PDF に情報が残っていないか検証
  4. 04シール後に PDF が変更されたか確認

MCP 対応

MCP サーバーとして、PDF の検出、テキスト抽出、墨消し、検証、提案状態確認のツールを AI エージェントに提供します。検出・抽出の5ツールは同梱 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

Omitly のローカルで検証可能な PDF の墨消し機能を AI エージェント(Claude Code、Claude Desktop、その他の MCP クライアント)に提供するModel Context Protocolサーバーです。

リポジトリの範囲とライセンス — PR を作成する前にお読みください。

このリポジトリはソースを閲覧できますが、オープンソースではありません。詳細は LICENSE をご覧ください。 このコードは、機密文書に触れさせる前に、ご自身のマシンで何が実行されるのかを正確に確認できるよう公開されています。他のプロジェクトでの再利用を許諾するものではありません。

このリポジトリには MCP サーバーとコンパイル済みの wasm 検出バンドルが含まれています。Omitly の墨消しエンジン、改ざん検知シール、ライセンス実装はこのリポジトリには含まれておらず、非公開で開発されています。このコードはエンジンを呼び出しますが、エンジン自体は含みません。

開発は非公開リポジトリで行い、リリース時にこちらへミラーされるため、プルリクエストはマージできません。Issue やセキュリティ報告は歓迎します。詳細は SECURITY.md をご覧ください。

このサーバーの特長は、エージェントが文書をどこにもアップロードせずに墨消しできることです。墨消しは Omitly エンジンを通じてデバイス上で実行され、削除した内容を記録した署名付き監査ログが返されます。シールによって、納品されたファイルが封印後に変更されていないことを確認できます。ただし、文書に他の機密情報が残っていないことを示すものではありません。これは、機密ファイルをチャットモデルに貼り付ける方法とは正反対です。

11 個のツールのうち 5 個(find_sensitive_regions、locate_text、check_redaction、verify_redaction、extract_pdf_text)は、そのまま使えます。npm install するだけで、Rust ツールチェーン、ネイティブバイナリ、デスクトップアプリは不要です。 これらは omitly.app の Web リークチェッカーを支える検出器と同じものを wasm-bindgen でビルドし、このパッケージに直接バンドルして実行します。create_pdf、2 つの書き込みツール(redact_pdf、redact_by_entity)、および 2 つのシール検証ツール(verify_seal、verify_document)には、引き続き設定済みのネイティブエンジンが必要です。詳細は以下の「ネイティブエンジン」をご覧ください。シール検証ツールには、まだ wasm による代替手段がありません。wasm によるシール検証経路が存在しないためです(issue #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 マークが付いており、ネイティブエンジンがない場合は、2 つのツールで共有される月 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_regionsPDFをデバイス上でスキャンし、PIIの候補を返します。対象は、メールアドレス/SSN/電話番号/カード情報と、オーストラリアの識別情報(TFN、ABN、ACN、Medicare、Centrelink CRN、IHI、BSB。公開されているアルゴリズムがある場合はチェックディジットを検証)です。ページ番号と正確な座標も返すため、エージェントはエンティティを指定して選択でき、座標を推測する必要はありません。ベストエフォートのパターンマッチングであり、コンプライアンス評価ではありません。任意の regions(generic/us/au)を指定すると、対象となる種類を絞り込めます。無料枠(wasm)はEVALUATIONのマークが付き、月10回の共通上限にカウントされます(「ライセンス」を参照)。ネイティブエンジンを設定している場合、上限はありません。
locate_textモデルが指定した文字列(名前、住所など、正規表現では検出できないもの)を、ページ番号と座標に対応付けます。認識はモデルが行い、座標の特定はエンジンが行います。
check_redactionすでに墨消しされたPDFを監査し、墨消しマークの下、以前の増分更新リビジョン、メタデータ、AcroFormフィールド、添付ファイルに機密テキストが残っているかを報告します。「黒塗りでデータを本当に削除できたか」を確認し、検査した範囲を示すカバレッジレポートも返します。また、デスクトップアプリの「Check any PDF」と同じ提示済み文書のチェック(ネイティブの omitly-redact check またはバンドルされたwasmの check。同一のRust関数)に基づき、verdict を返します。値は safe_to_send、needs_review(問題が見つかった場合は blocking を含む)、または cannot_verify です。固定形式のコピー結果には、検査内容、問題点、要確認事項、確認できなかった内容が含まれます。判定の根拠となる監査レポートv2の全体はこのツールからは返されません。エンジンの check コマンドから取得できます。判定が示すのは、チェック内容とその対象範囲(非表示、覆われている、復元可能なコンテンツ)であり、文書の安全性を保証するものではありません。無料枠(wasm)はEVALUATIONのマークが付き、月10回の共通上限にカウントされます(「ライセンス」を参照)。ネイティブエンジンを設定している場合、上限はありません。
extract_pdf_textPDFの全文をページごとに抽出します。デフォルトではPIIがマスキングされるため、生の機密情報がモデルのコンテキストウィンドウに大量に入ることはありません。各ページの spans には、マスキングした値の種類と文字オフセット(バイトオフセットではありません)が記録されるため、生の値を見なくてもエージェントは位置を判断できます。masked: false を指定すると、生テキストを取得する明示的なオプトインになります。無料でライセンス不要です。バンドルされたwasmエンジンですぐに利用でき、利用可能な場合はネイティブエンジンが優先されます(regions フィルターも利用可能になります。wasmはこれを無視し、すべてのパターンをスキャンします)。ページを画像としてレンダリングすることはありません。
redact_by_entity1回の操作で、検出+種類(email/ssn/phone/card/tfn/abn/acn/medicare/crn/ihi/bsb)および/または regions による絞り込み+墨消し+検証を行います。「明らかなPIIだけを手早く削除する」ためのショートカットです。
redact_pdfPDFの指定領域から元データを削除し、何も残っていないことを検証して、墨消し済みファイルを書き出し、監査ログを返します。
verify_redactionすでに墨消しされたPDFを再スキャンし、検証結果を返します。墨消しが完全かどうかを確認します。
verify_sealPDFに埋め込まれたOmitly監査レポートと、ファイル全体の改ざん検知シール(シールv1:Ed25519、Omitly 4.0以降のシールv2:ML-DSA-87とECDSA P-384)を暗号学的に検証します。改ざん検知のチェックであり、verify_redaction とは異なります。**完全性の検証であり、本人確認ではありません:**署名鍵はファイル内に含まれます(デスクトップアプリではインストールごとに、エンジンでは単一の出力に対して一度だけ使用されます)。そのため、有効なシールが意味するのは「この鍵の所持者がシールを付けてから変更されていない」ということであり、「Omitlyが作成した」ということではありません。出所を確認するには、別途 sealFingerprint を照合してください。ネイティブエンジンが必要です。wasmによる代替手段はありません。
verify_document受領者向けの信頼性検証(omitly#113)です。verify_seal と同じシール/レポートのチェックを行います。残存データの再スキャンではありません。他者から受け取ったPDFがシール付与後に変更されていないことを(完全性を検証し、本人確認ではありません。verify_seal を参照)、支払いもライセンスもなしで確認したい人を対象としています。無料でライセンス不要です。現在は verify_seal と同様にネイティブエンジンが必要です(wasmによるシール検証にはまだ対応していません)。
create_pdfMarkdown/HTMLから、デバイス上で整ったPDFを生成します。実際のブラウザーエンジンでレンダリングするため、印刷したような見た目になります。一時的なreportlab/LaTeXスクリプトを書く必要はありません。
check_license現在のライセンスまたはトライアルの状態を報告します。含まれる情報は、ティア、トライアルの残り日数、ベンダー署名済みのライセンシー名、ライセンスを取得した解決ステップ、このマシンに紐付いているかどうかです。無料で、引数は不要です。文書を読み込まず、呼び出すたびにライセンスを再解決するため、再起動せずに「購入 → ライセンスを保存 → 再度呼び出し」が可能です。**デバイスのフィンガープリントやライセンスファイルの内容を返すことはありません。**デバイスへの紐付けは、はい/いいえでのみ返します。ネイティブエンジンが必要です。wasmの無料枠にはライセンスの概念がありません。
propose_redactionsomitly#1643。独自のAIを利用して、PERSONがOmitlyデスクトップアプリで承認する墨消し領域を提案します。何も書き込みません。このコンピューターでデスクトップアプリを起動している必要があります。承認すると、デスクトップアプリが削除、検証、シール付与を行い、記録には人が判断したこと(human-desktop)が残ります。
get_proposal_statusキューに入った提案の状態を確認します。状態は、保留中、承認済み、却下済み、適用済み(出力パスと判定を含む)、失敗、期限切れです。無料で、文書を読み込みません。
アプリ内での承認(omitly#1643)

Omitly デスクトップアプリが同じコンピューター上で実行されており、Settings → Connect your AI → "Accept proposals in Omitly" がオン(デフォルト)の場合、redact_pdf と redact_by_entity は実行されず、{ status: "queued", proposalId } を返します。墨消しは アプリ内で人が承認または却下する提案になります。承認されると、デスクトップアプリが独自の検証済み削除エンジンを実行し、残存データのスキャンとシール処理を行います。シール済みの記録には、人が判断したこと(human-desktop)が記載されます。この方法では、エージェント側にネイティブエンジンは必要ありません。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 によって提供されます。PDF の生成は検証可能な墨消しとは異なる信頼モデルであるため、このバイナリは墨消しエンジンと分離されています。ヘッドレスの Chromium 系ブラウザー(Chrome/Chromium/Edge/Brave。OMITLY_BROWSER_BIN で上書き可能)を使って Markdown(または生の HTML)をレンダリングします。Omitly アプリの WebView と同じエンジン系統なので、スクリプトで生成したものではなく、印刷したような見た目になります。このツールを有効にするにはネイティブの 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" }

エージェントの一般的なワークフロー:

  • 簡単な方法:redact_by_entity(1 回の呼び出しで検出、墨消し、検証を実行)。
  • 慎重な方法:find_sensitive_regions / locate_text → レビュー → redact_pdf → verify_redaction。 find/locate の座標は、そのまま redact の regions 引数に渡せます。

Claude Code を使った手順の詳細は DEMO.md をご覧ください。

ステータス

MCP のインターフェース(11 個のツール、スキーマ、トランスポート)、ネイティブエンジンのバイナリ (crates/omitly-cli。omitly-redact としてビルド)、バンドルされた wasm エンジン (crates/leakcheck-wasm。ネイティブバイナリなしで 5 個の無料ツールに対応)はすべて実装済みで、エンドツーエンドテストに合格しています。find_sensitive_regions は初期段階の検出器(ASCII パターン、表示演算子ごとの照合)です。検出結果は網羅性を保証するものではなく、レビュー対象の候補として扱ってください。LLM から追加の領域を直接指定することもできます。

検出結果のプライバシー。 このサーバーはファイルをローカルで処理し、アップロードすることはありません。ただし、各ツールの結果は MCP クライアントに返されるため、そのクライアントのモデルコンテキストに入り、クライアントの送信先に渡されます。「何もアップロードされない」というのは、ファイルについての説明であり、結果についてではありません。検出ツール(find_sensitive_regions、check_redaction、verify_redaction)は、検出結果ごとに生の値ではなくマスク済みのプレビュー(例:•••-••-6789)を返します。墨消しはページと座標に基づいて行われます。extract_pdf_text はデフォルトで認識した値をマスクしますが、masked: false を明示的に指定すると、生のテキストが結果とモデルコンテキストにそのまま表示されます。マスキングの対象は認識済みのパターン種別(メールアドレス、SSN、電話番号、カード番号、オーストラリアの識別番号)のみです。名前、住所、検出器が認識しない条項は通常のテキストとして返されます。locate_text の検出結果にもマスク済みのプレビューが含まれますが、そのマスクでは一致したテキストの末尾 4 文字または数字以外はすべて隠されるため、短い文字列や特徴的な文字列は一部が判読できるままです。

エンジンの契約(crates/omitly-cli で実装)

サーバーは OMITLY_REDACT_BIN を起動し、JSON リクエストを stdin に書き込み、JSON レスポンスを stdout から読み取ります。失敗した場合は { "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 および 2 つの書き込みツール(redact_pdf、redact_by_entity)では、常にネイティブエンジンを設定する必要があります。5 つの無料ツールは、ネイティブエンジンが設定されていない場合、バンドル済みの 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)、読み取り専用のため qpdf は不要です。

アクセス制御

ツール呼び出しのパスはすべてモデルから渡されるため、サーバーはすべての読み書きを、許可された単一のディレクトリ内に制限します。

  • OMITLY_ALLOWED_DIR — MCP 設定で指定してください(推奨)。指定しない場合は、サーバーの起動時に使用していたディレクトリが使われます。
  • チェックの前にシンボリックリンクを解決するため、ルートディレクトリ内のリンクがその外部を指している場合は拒否されます。
  • 出力で既存のファイル(またはその .audit.json サイドカーファイル)が上書きされることはありません。代わりに、エージェントには新しい名前を選ぶよう求めます。
  • OMITLY_ENGINE_TIMEOUT_MS(デフォルトは 120000)— 応答しなくなったエンジンプロセスは、エージェントのツール呼び出しを停止させず、期限に達した時点で終了させます。

これらは、混乱した代理人による誤操作を防ぐためのガードレールであり、悪意のあるローカルユーザーに対するサンドボックスではありません。詳しくは docs/THREAT-MODEL.md を参照してください。

ライセンス

redact_pdf/redact_by_entity は書き込み機能で、サーバーではなくエンジンのバイナリ内で適用されます(同梱の wasm フォールバックでも回避できません。wasm はこの 2 つのツールには一切触れません)。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 ティア、つまりネイティブエンジンが設定されていない場合、2 つの無料の検出ツール(find_sensitive_regions、check_redaction)は利用回数が計測されます(omitly#226)。結果には evaluation: true フラグと EVALUATION バナーが付き、2 つのツールで月に合計 10 回(共通カウンター 1 つ。回数は OMITLY_FREE_CAP で変更可能)試行すると、その月が切り替わるまでツールは構造化された { blocked: true, reason: "free-cap" } の拒否を返します。カウントは ~/.omitly/usage.json に保存されます(ディレクトリは OMITLY_STATE_DIR で変更可能。ファイルは 0600 で書き込まれます)。ローカルのみで完結し、外部への通信は一切ありません。ファイルを削除すると無料利用回数はリセットされます。これは許容されており、ネットワークに接続しない方針では避けられません。また、このカウンターが有料の書き込み処理で参照されることは意図的にありません。スキャンの実行前に試行回数が加算されるため、失敗した試行もカウントされます。設定済みのネイティブエンジンが処理する呼び出しは、ライセンスの有無にかかわらず、ここでは利用回数に計上されません。これらのユーザーにはエンジン側の導線が適用され、上記のライセンス規則に従います。ネイティブ専用の verify_seal と verify_document は、crates/omitly-cli でも同じ設計により無料のままです(このコマンド経路でも Pro/Personal ライセンス確認はありません。どちらのツールも同一の verify_seal エンジンコマンドをシェルアウトして呼び出します)。

Claude Desktop にワンクリックでインストール(MCPB、無料ティアのみ)

mcpb/ は、4 つの無料/診断ツール(check_redaction、find_sensitive_regions、locate_text、verify_redaction)を、書き込みツールは含めず、自己完結型の MCPB .mcpb 拡張機能としてパッケージ化します。エンドユーザーのマシンに Node/npm/Rust ツールチェーンは不要で、Claude Desktop で「拡張機能をインストール…」を選ぶだけです。これは意図的に、上記の 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 にドラッグするか、「拡張機能をインストール…」を使用してください。

バンドルのビルド方法については、「ソースからビルド」を参照してください。

署名されていません(mcpb sign には、まだ用意できていないコード署名証明書が必要です。デスクトップアプリの署名と同じ要件です)。パッケージ済みファイルに対して mcpb info を実行すると、WARNING: Not signed と表示されます。この変更時点では、Claude Desktop の「拡張機能をインストール…」のフローが、署名のない .mcpb をブロックするのか、警告のみを表示するのかは、実際の Desktop アプリで確認できていません(この環境に Desktop の GUI がありません)。この確認は未完了で、omitly#225 で追跡されています。

ソースからのビルド

このリポジトリをビルドします。レジストリからインストールする場合(「Install」を参照)、以下の作業は不要です。

サーバーと無料ツール(ネイティブエンジンなし):

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 のソースはこのリポジトリに含まれていません(上記の「Repository scope」を参照)。

ネイティブエンジンのバイナリ(create_pdf、シールツール、書き込みツール用。「Native engine」を参照):

# 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 にすでにバンドルされています。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。