mcpField
O
OpsecForge

OpsecForge

ローカル
opsecforge.comセキュリティ0今日更新

OpsecForge について

OpsecForgeは、コーディングエージェント向けのローカル読み取り専用MCPサーバーで、シークレットがモデルのコンテキストに入るのを防ぐためのツールを提供します。ファイルパスや環境変数名をマシン上で処理し、ネットワーク通信なしでマスキング済みまたは派生した結果を返します。

主な機能

  1. 01ローカルファイル内のシークレットをマスキング
  2. 02ファイルとステージ済み変更をスキャン
  3. 03Webhook署名をオフラインで検証
  4. 04JWTのクレームとリスクを確認
  5. 05ファイルのチェックサムを計算・比較

活用シーン

  1. 01共有前に設定ファイルを整える
  2. 02コミット前にステージ済み変更を確認
  3. 03Webhook署名の不一致を調査
  4. 04生の値を渡さずJWTを確認

MCP 対応

stdio経由でMCPクライアントにローカルのセキュリティツールを提供します。機密入力にはパスまたは環境変数名を使い、マスキング済みまたは派生した結果を返します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"cyberdroid2077-opsecforge": {
"command": "npx",
"args": [
"-y",
"opsecforge-mcp"
]
}
}
}
起動コマンドnpx -y opsecforge-mcp

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npmopsecforge-mcp0.1.1

ツール

6

掲載時のツール一覧 · 2 週間前に更新

パラメーター型必須説明
pathstringはい読み取るローカルテキストファイルのパス(絶対パス、サーバーの作業ディレクトリからの相対パス、または ~/ で始まるパス)。

詳細

opsecforge-mcp

Claude Code、Codex、Cursor などの AI コーディングエージェント向けのローカル MCP サーバー(stdio)です。シークレットがモデルのコンテキストに入らないようにします。エージェントはファイルパスまたは環境変数名を渡し、処理はお使いのマシン上で行われ、返されるのはマスキング済みまたは導出された結果だけです。

  • リモートサービスには何も送信されません。サーバーはネットワークリクエストを行いません。
  • アカウント、API キー、テレメトリーは不要です。
  • ソース:github.com/cyberdroid2077/opsecforge-tools(MIT)。opsecforge.com のブラウザーツールを支える、同じテスト済みコードを再利用しています。

このツールに依存する前に、以下の制限事項をお読みください。 マスキングはヒューリスティックです。Claude Code のフックはサンドボックスではなく、ベストエフォートのガードです。また、Codex と Cursor にはフックがありません。

インストール

Node.js 20 以降が必要です。

Claude Code:プラグイン(推奨:MCP サーバー + ガードフック + スキル)
/plugin marketplace add cyberdroid2077/opsecforge-tools
/plugin install opsecforge@opsecforge

プラグインは次の 3 つを追加します。

  1. MCP サーバー(npx -y [email protected])。mcp__plugin_opsecforge_opsecforge__* として公開されます。
  2. .env、*.pem、*.key、id_rsa*、id_ed25519*、credentials、*.p12 などのファイルを直接読み取る Read、Grep、Bash の呼び出しをブロックし、代わりに redact_file を使うようモデルに伝える PreToolUse フック(.env.example、.env.sample、.env.template、*.pub は許可されます)。
  3. 使用するツールをエージェントに指示するスキル。

フックの onFailure: "block" 設定には、新しいバージョンの Claude Code が必要です(フックのドキュメントによると v2.1.295 以降)。古いバージョンでは、タイムアウトしたフックがブロックされずにスキップされることがあります。

Claude Code:MCP サーバーのみ
claude mcp add opsecforge -- npx -y opsecforge-mcp
Codex

~/.codex/config.toml に追加します。

[mcp_servers.opsecforge]
command = "npx"
args = ["-y", "opsecforge-mcp"]

(または codex mcp add opsecforge -- npx -y opsecforge-mcp を実行します。)

Cursor

.cursor/mcp.json(プロジェクト)または ~/.cursor/mcp.json(グローバル)に追加します。

{
  "mcpServers": {
    "opsecforge": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "opsecforge-mcp"]
    }
  }
}
ツールが読み取る環境変数

verify_webhook と inspect_jwt は、環境変数を名前で指定してシークレットを読み取ります。変数は MCP サーバープロセスの環境に存在している必要があります。エージェントを起動するシェルでエクスポートするか、クライアントのサーバー設定に env エントリーを追加してください。シークレットをチャットに貼り付けたり、コミットしたりしないでください。

任意のセキュリティ強化:OPSECFORGE_MCP_ROOTS に、パス区切り文字で区切ったディレクトリのリスト(例:/home/me/projects)を設定すると、ファイルツールはその範囲外のパスを拒否します。

ツール

すべてのツールは読み取り専用でローカルに実行され、サーバーをクラッシュさせる代わりに、内容が分かるエラーを返します。

redact_file({ path })

ローカルのテキストファイルを読み取り、シークレットを [REDACTED] に置き換えた内容と、検出結果の概要(種類、件数、元のファイルにおける行番号)を返します。元の値が返されることはなく、値の一部も表示されません。応答の冒頭には、元の値がマシンから外部に送信されず、モデルにも届いていないことを示す通知が含まれます。

通常ファイルのみ(ディレクトリ、パイプ、デバイスは不可)を対象とし、最大サイズは 1 MiB です。これを超えるファイルは、明示的なメッセージとともに処理に失敗します。バイナリファイルは拒否されます。検出対象には、秘密鍵ブロック(終端がないものを含み、BEGIN からテキスト末尾までマスキングします)、機密性の高い名前付きフィールド(password、token、secret、*_KEY など)、Authorization/Cookie/API キーのヘッダー、URL の認証情報、AWS、Stripe、GitHub、GitLab、Slack、Google、OpenAI、Anthropic、SendGrid のキー形式、JWT 形式の文字列などがあります。

scan_secrets({ paths?, staged? })

コミット前のチェックです。ファイルまたはディレクトリ(paths)、および/または git diff --cached で追加された行のみ(staged: true)をスキャンします。file:line、シークレットの種類、マスキングされたプレビューを一覧表示します。プレビューには、20 文字以上の値の場合は先頭 4 文字、それ以外の場合は … のみが表示されます。元の値が返されることはありません。ディレクトリのスキャンでは、.git、node_modules、ビルド出力、シンボリックリンクをスキップし、最大 1 MiB のファイルを最大 2000 件まで読み取り、バイナリはスキップします。

redact_text({ text })

エージェントがすでに保持しているテキストを秘匿化します。たとえば、ログをイシューやチケットに貼り付ける前に使えます。そのテキストはすでにモデルコンテキストに含まれています。このツールでコンテキストから取り除くことはできません。外部に共有するための、より安全なコピーを作成するだけです。そもそもコンテキストに秘密情報を含めないようにするには、パスを指定して redact_file を使ってください。

verify_webhook({ provider, body_path, secret_env, signature, algorithm?, tolerance_seconds? })

github(X-Hub-Signature-256)、stripe(Stripe-Signature)、または generic の HMAC(16 進数または base64、sha1/sha256/sha512)署名をオフラインで検証します。

  • 秘密情報は、secret_env で指定された環境変数からのみ取得します。平文の秘密情報を渡すパラメーターはありません。不明なパラメーター(例:secret)は説明とともに拒否され、その値が返されることもありません。
  • 本文は body_path から生のバイト列として読み取られます(最大 10 MiB)。受信したとおりに保存してください。
  • 一致/不一致に加え、診断情報を返します。署名ヘッダーの形式が正しいかどうか、Stripe のタイムスタンプの経過時間と許容範囲外かどうか(デフォルトは 300 s)、本文が再フォーマットされているように見えるかどうか(末尾の改行を削除または追加、CRLF/LF の変更、BOM の削除、JSON の最小化または整形を行った場合に署名が一致するかをテストします)、秘密情報の前後に空白や引用符があるかどうか、署名用の whsec_ 秘密情報が必要な箇所で Stripe API キーが使われていないかどうかを示します。
  • 秘密情報や計算された署名は返しません。
inspect_jwt({ token_env?, token? })

JWT をデコードし、ヘッダー、クレーム、時間関連クレームの状態(exp、nbf、iat、auth_time)、およびリスクに関する注意事項を返します。注意事項には、alg: none、オフラインで検証できない HMAC アルゴリズム、exp の欠如、jku/jwk/x5u ヘッダーが含まれます。デコードは検証ではありません。このツールは鍵を持たず、署名を検証することもありません。生のトークンがモデルを経由しないよう、token_env(変数名)を優先してください。token パラメーターはすでにコンテキストに含まれています。秘密情報らしいフィールド名の下にあるクレーム値はマスクされますが、返されるクレームはどちらの場合もコンテキストに含まれます。

file_checksum({ path, algorithm, expected? })

ローカルファイル(最大 32 MiB)の SHA-256 または SHA-512 を計算し、任意で期待値(<hex>、sha256:<hex>、sha256sum の出力を使用できます)と比較します。一致しても、ファイルが期待値の取得元と同じ内容であることしか証明できません。

正直な制限事項

  • このフックはベストエフォートのガードであり、サンドボックスではありません。 ツール呼び出しのテキストを解析します。スクリプトが秘密ファイルを間接的に読み取ること(.env を開く python app.py、make、docker compose config)、.env を含むディレクトリに対する grep -r、シェル変数やコマンド出力をファイル名として使うコマンド(cat "$FILE"、find . -name .env | xargs cat)、プログラム内で言語ランタイムが行う処理は阻止しません。よくある不注意によるケースを検出するための、簡易的な抑止策として扱ってください。

  • より強固に保護するには、Claude Code 独自の制御と組み合わせてください。サンドボックス内で実行し、settings.json に秘密情報のパスを対象とする Read の拒否ルールを追加します(正確なパターン構文については、権限に関するドキュメントを確認してください)。例:

    { "permissions": { "deny": ["Read(./.env)", "Read(./.env.local)", "Read(**/*.pem)", "Read(~/.ssh/**)"] } }
    

    拒否ルールにも不備があり、プロンプトが表示されたり、誤検知が発生したりすることがあります。テストしてください。

  • マスキングはヒューリスティックに基づいており、秘密情報を見落とすことがあります。 一般的な形式や、秘密情報らしいフィールド名を認識します。独自のトークン形式、文章中の秘密情報、Base64 でラップされた値、通常とは異なる形で複数行に分割された秘密情報は判定できません。共有する前に出力を確認し、問題がない結果も「一致するものがなかった」と捉え、「何も含まれていない」とは考えないでください。また、問題のない値をマスキングしてしまうこともあります(誤検知)。

  • すべての MCP ツールのパラメーターと結果はモデルを通過します。 そのため、ツールではパスと変数名を指定します。token を使う redact_text と inspect_jwt では、渡した内容をコンテキストに含めずに処理することはできません。

  • Codex と Cursor には、Claude Code の PreToolUse フックに相当するものがありません。 そのため、これらのツールは助言的なものです。エージェントがファイルを直接読む代わりにツールを呼び出す場合にのみ役立ちます。各クライアントの権限設定とサンドボックス設定も併用してください。

  • マスキング後の出力にも、一致しなかった内容(ホスト名、ユーザー名、内部 URL、個人データ)はすべて残ります。

  • scan_secrets は、CI でルールセットが継続的に保守される専用スキャナーの代わりにはなりません。

  • 秘密情報がすでにモデルのコンテキスト、ログ、またはコミットに含まれてしまった場合は、ローテーションしてください。

詳細情報

これらのチェックをブラウザー内で実行できるバージョンと背景情報は、すべて opsecforge.com にあります。

ライセンス

MIT

コメント

MCP は初めてですか?

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

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