mcpField
P
PromptSpeak Governance

PromptSpeak Governance

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

PromptSpeak Governance について

PromptSpeak Governanceは、実行前に決定論的なガバナンスルールでエージェントのツール呼び出しを検証するMCPサーバーです。リスクのある呼び出しの遮断や人間による承認への保留、書き込み内容のセキュリティスキャン、操作記録に対応します。

主な機能

  1. 01実行前のツール呼び出し検証
  2. 02人間による承認用の保留
  3. 03書き込み操作のセキュリティスキャン
  4. 04エージェントの逸脱検知と停止制御
  5. 05ツール呼び出しの監査記録

活用シーン

  1. 01本番環境の変更に人間の確認を要求
  2. 02ガバナンスフレームに反する呼び出しを遮断
  3. 03保存前にエージェント作成コードをスキャン
  4. 04試行または遮断された操作を調査

MCP 対応

検証、統制下での実行、保留の確認、セキュリティスキャン、エージェントのライフサイクル制御などのガバナンスツールをMCPクライアントに提供します。

設定

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

mcp.json · 共通設定
{
"mcpServers": {
"chrbailey-promptspeak": {
"command": "npx",
"args": [
"-y",
"@chrbailey/promptspeak-mcp-server"
]
}
}
}
起動コマンドnpx -y @chrbailey/promptspeak-mcp-server

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

パッケージ
npm@chrbailey/promptspeak-mcp-server0.4.1

ツール

56

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

パラメーター型必須説明
framestringはい検証する PromptSpeak フレーム(例:"⊕◊▶β")
strictbooleanいいえtrue の場合、警告も検証失敗の原因になります
parentFramestringいいえチェーン検証用の任意の親フレーム
validationLevelenumいいえ実行する検証レベルstructural | semantic | chain | full

詳細

promptspeak-mcp-server

CI npm version License: MIT Tests

AI エージェントの実行前ガバナンス。危険なツール呼び出しを実行前にブロックします。

AI エージェントは、意図と実行の間に検証レイヤーがないまま、ツール(ファイルへの書き込み、API リクエスト、シェルコマンド)を呼び出します。プロンプトインジェクション、誤った引数、あるいは目的のずれによって、取り消せない操作が引き起こされる可能性があります。PromptSpeak はすべての MCP ツール呼び出しを傍受し、決定論的なルールに照らして検証して、リスクのある操作をブロックするか、人間の承認が得られるまで保留します。処理は 0.1ms で完了し、実行前に行われます。

PromptSpeak ガバナンスのデモ

こんな場合にご利用ください

  • ツール(MCP サーバー、関数呼び出し、ツール利用)を呼び出す AI エージェントを運用しており、エージェントとツールの間にガバナンスレイヤーが必要な場合。
  • リスクの高い操作(本番環境へのデプロイ、金融取引、法的書類の提出)について、人間による承認が必要な場合。
  • エージェントが割り当てられたタスクから徐々に逸脱する、動作のずれを検出したい場合。
  • エージェントが試みたすべてのツール呼び出しについて、許可・ブロックのいずれも含む監査証跡が必要な場合。
  • エージェントの動作に決定論的な制約が求められる、規制対象の分野(法務、金融、医療)で運用している場合。

インストール

Claude Code

~/.claude/settings.json(またはプロジェクトレベルの .claude/settings.json)に追加します。

{
  "mcpServers": {
    "promptspeak": {
      "command": "npx",
      "args": ["promptspeak-mcp-server"]
    }
  }
}

Claude Code を再起動します。56 個すべてのガバナンスツールをすぐに利用できます。

Claude Desktop

claude_desktop_config.json に追加します。

{
  "mcpServers": {
    "promptspeak": {
      "command": "npx",
      "args": ["promptspeak-mcp-server"]
    }
  }
}
ライブラリとして
npm install promptspeak-mcp-server
ソースから
git clone https://github.com/chrbailey/promptspeak-mcp-server.git
cd promptspeak-mcp-server
npm install && npm run build
npm start

使用例

1. ガバナンスフレームを検証する

PromptSpeak フレームを使用する前に、構造と意味が正しいことを検証します。フレームは、シンボルの並びでガバナンス制約を表します。最初にモード、続いてドメイン、アクション、エンティティを指定します。

// Tool call: ps_validate
{
  "name": "ps_validate",
  "arguments": {
    "frame": "⊕◊▶α",
    "validationLevel": "full"
  }
}
// Response
{
  "valid": true,
  "frame": "⊕◊▶α",
  "parsedFrame": {
    "mode": { "symbol": "⊕", "meaning": "strict" },
    "domain": { "symbol": "◊", "meaning": "financial" },
    "action": { "symbol": "▶", "meaning": "execute" },
    "entity": { "symbol": "α", "meaning": "primary" }
  },
  "parseConfidence": 1.0,
  "report": {
    "valid": true,
    "errors": [],
    "warnings": [
      { "code": "ACTION_MISSING_DOMAIN", "message": "Consider adding domain context", "severity": "warning" }
    ]
  },
  "summary": { "errors": 0, "warnings": 1, "passed": 16 }
}

無効なフレームの場合は、次に取るべき行動を示す提案が返されます。

// Tool call: validate a frame with conflicting modes
{
  "name": "ps_validate",
  "arguments": { "frame": "⊕⊖▶", "validationLevel": "semantic" }
}

// Response: blocked — strict + flexible modes conflict
{
  "valid": false,
  "summary": { "errors": 1, "warnings": 0, "passed": 10 },
  "suggestions": ["Remove either ⊕ (strict) or ⊖ (flexible) - cannot have both"]
}
2. 保留キューのワークフロー — 人間による承認

エージェントがリスクのある操作(ドリフトスコアが高い、信頼度が低い、セキュリティ上の問題が見つかった場合)を試みると、その操作は実行されず、人間によるレビューのために保留されます。以下は、一覧表示、確認、承認または却下までの保留処理全体です。

ステップ 1:保留中の項目を一覧表示する

// Tool call: ps_hold_list
{
  "name": "ps_hold_list",
  "arguments": {}
}
// Response: one hold awaiting human review
{
  "holds": [
    {
      "holdId": "hold_7k2m9x",
      "agentId": "devops-agent",
      "frame": "⊕◈▶α",
      "tool": "deploy_to_production",
      "severity": "high",
      "reason": "drift_prediction",
      "state": "pending",
      "evidence": { "driftScore": 0.72, "predictedDrift": 0.85 }
    }
  ],
  "count": 1,
  "expiredCount": 0
}

ステップ 2:変更を加えて承認する(または却下する)

// Tool call: ps_hold_approve — approve but downgrade to staging
{
  "name": "ps_hold_approve",
  "arguments": {
    "holdId": "hold_7k2m9x",
    "reason": "Reviewed — safe for staging, not production",
    "modifiedArgs": { "environment": "staging" }
  }
}
// Response
{
  "success": true,
  "decision": {
    "holdId": "hold_7k2m9x",
    "state": "approved",
    "decidedBy": "human",
    "reason": "Reviewed — safe for staging, not production"
  },
  "executionResult": { "success": true }
}

却下する場合は、次を実行します。

{
  "name": "ps_hold_reject",
  "arguments": {
    "holdId": "hold_7k2m9x",
    "reason": "Drift too high — recalibrate agent first",
    "haltAgent": true
  }
}
// Agent is halted (circuit breaker tripped) and the operation is denied.
3. セキュリティスキャン — 実行前に脆弱性を検出する

エージェントがコードをディスクに書き込む前に、コードの内容をスキャンしてセキュリティ上の問題を検出します。重大な問題が見つかった場合は実行をブロックし、深刻度の高い問題が見つかった場合は人間によるレビューのために保留します。

// Tool call: ps_security_scan
{
  "name": "ps_security_scan",
  "arguments": {
    "content": "const query = `SELECT * FROM users WHERE id = ${userId}`;\nconst API_KEY = 'sk-1234567890abcdef1234567890abcdef';"
  }
}
// Response: two findings — one critical (blocked), one critical (blocked)
{
  "findings": [
    {
      "patternId": "sql-injection",
      "severity": "critical",
      "match": "SELECT * FROM users WHERE id = ${userId}",
      "line": 1,
      "context": "const query = `SELECT * FROM users WHERE id = ${userId}`;",
      "suggestion": "Use parameterized queries or prepared statements instead of template literals"
    },
    {
      "patternId": "hardcoded-secret",
      "severity": "critical",
      "match": "API_KEY = 'sk-1234567890abcdef1234567890abcdef'",
      "line": 2,
      "context": "const API_KEY = 'sk-1234567890abcdef1234567890abcdef';",
      "suggestion": "Move secrets to environment variables or a secrets manager"
    }
  ],
  "scannedAt": "2026-03-19T12:00:00.000Z",
  "contentLength": 98,
  "patternsChecked": 10,
  "enforcement": {
    "blocked": [
      { "patternId": "sql-injection", "severity": "critical" },
      { "patternId": "hardcoded-secret", "severity": "critical" }
    ],
    "held": [],
    "warned": [],
    "logged": []
  }
}

ポリシーを適用するには、ps_security_scan の代わりに ps_security_gate を使用します。重大な問題が見つかった場合はブロックし、深刻度の高い問題が見つかった場合は人間によるレビューのために保留し、中程度の問題が見つかった場合は警告します。

// Tool call: ps_security_gate — scan AND enforce
{
  "name": "ps_security_gate",
  "arguments": {
    "content": "app.use(cors());\napp.listen(0.0.0.0, 3000);",
    "action": "write_file"
  }
}

// Response: held for review (insecure defaults = high severity)
{
  "decision": "held",
  "reason": "Security: 1 high-severity finding(s) held for review — insecure-defaults",
  "scan": { "findings": [{ "patternId": "insecure-defaults", "severity": "high", "line": 1 }] }
}

仕組み:9 段階の検証パイプライン

すべてのツール呼び出しは、このパイプラインを通過します。いずれかの段階で失敗すると、実行はブロックされます。

Agent calls tool
  │
  ├─ 1. Circuit Breaker ──── Halted agents blocked instantly (no further checks)
  ├─ 2. Frame Validation ─── Structural, semantic, and chain rule checks
  ├─ 3. Drift Prediction ─── Pre-flight behavioral anomaly detection
  ├─ 4. Hold Check ────────── Risky operations held for human approval
  ├─ 5. Interceptor ───────── Final permission gate (confidence thresholds)
  ├─ 6. Security Scan ─────── Scans write actions for vulnerabilities (see below)
  ├─ 7. Tool Execution ────── Only reached if all 6 pre-checks pass
  ├─ 8. Post-Audit ────────── Confirms behavior matched prediction
  └─ 9. Immediate Action ──── Halts agent if critical drift detected post-execution

ステージ 1〜6 は実行前の処理です。いずれかのチェックに失敗すると、ツールは実行されません。ステージ 8〜9 は実行後の処理で、ドリフトを検出し、以後の呼び出しに備えてエージェントを停止できます。

セキュリティスキャン

エージェントがコードを書き込む際(write_file、edit_file、create_file、patch_file)、実行前にコンテンツを10個の検出パターンと照合してスキャンします。重要度に応じて適用内容が決まります。

重要度適用内容検出対象
CRITICALブロック — 実行を拒否しますテンプレートリテラル経由のSQLインジェクション、ハードコードされたAPIキー/パスワード/トークン
HIGH保留 — 人によるレビューのためにキューに入れますセキュリティ関連のTODO、機密データのログ出力、安全でないデフォルト設定(cors()、0.0.0.0、debug: true)
MEDIUM警告 — ログに記録し、実行を続行します空のcatchブロック、断定を避けるコメント(「おそらく動作します」)、無効化されたテスト
LOW記録 — 適用措置はありませんDROP TABLE、rm -rf(注意喚起のためにフラグを付けます)
動作するもの(テスト済み)

以下の説明はすべて、合格したテスト(5つのテストファイルにわたる104件のテスト)によって裏付けられています。

  • パターン検出が動作します。 10個すべてのパターンについて、真陽性と偽陽性の両方をテストしています。例:api_key = "sk-1234567890abcdef"は検出されますが、API_KEY = process.env.API_KEYは検出されません。SQLインジェクション検出では、\SELECT * FROM users WHERE id = ${id}`は検出されますが、パラメーター化クエリ(db.query("SELECT * FROM users WHERE id = ?", [id])`)は検出されません。
  • 重要度に応じた適用が動作します。 重大な検出結果は実行をブロックします。高重要度の検出結果はレビューのために保留されます。中重要度の検出結果は警告しますが、実行は許可します。インターセプターパイプラインを通したエンドツーエンドのテストを実施しています。
  • スキャン対象は書き込みアクションのみです。 read_fileやその他の書き込み以外のアクションは、引数に脆弱なコードが含まれていても、スキャンされずに処理されます。テスト済みです。
  • 実行時設定が動作します。 ps_security_configを使用して、パターンの有効/無効を切り替えたり、実行時に重要度を変更したりできます。パターンを無効にすると、直ちに検出されなくなります。パターンの重要度をmediumからcriticalに変更すると、警告ではなくブロックされます。エンドツーエンドのテストを実施しています。
  • パフォーマンスに問題はありません。 100行のファイルのスキャンは10ms未満で完了します。テスト済みです。
  • 1つのファイル内の複数の検出結果も正しく処理されます。 6種類の異なる脆弱性を含むファイルで、それぞれが適切な重要度に分類されることを確認しています。テスト済みです。
まだ機能していないもの
  • 重大度が HIGH の検出結果に対する保留キューとの連携がありません。 修正済みです。 重大度が HIGH のセキュリティ検出結果は、security_finding HoldReason を介して HoldManager に実際の保留を作成するようになりました。ps_hold_list に表示され、通常の保留フローで承認または却下できます。
  • ps_execute で自動スキャンされません。 セキュリティスキャンが実行されるのは、直接のツール呼び出しに対してインターセプターの intercept() メソッドが呼び出された場合のみです。エージェントが ps_execute(ガバナンス対象の実行経路)を使用する場合、スキャンが実行されるのは、内部ツールが書き込み操作であり、かつコンテンツがトップレベルの引数として渡される場合のみです。ネストされた引数構造では、スキャンを回避できる可能性があります。理由: ps_execute はツール呼び出しを独自の引数スキーマでラップします。スキャナーが確認するのは proposedArgs.content であり、深くネストされたフィールドではありません。
  • ファイルパスに基づくスキャンには対応していません。 スキャナーは引数として渡されたコンテンツのみを調べます。すでにディスク上にあるファイルはスキャンできず、ファイルシステムから読み込むこともありません。理由: スキャナーは文字列を受け取る純粋関数です。ファイルシステムへのアクセスを追加すると、セキュリティモデルが変わります。
  • パターンは正規表現ベースであり、AST を認識しません。 パターンには正規表現を使用しているため、コード構造を理解できません。テスト用フィクスチャ内のハードコードされたシークレットや、コメント内の SQL インジェクションも検出されます。誤検出率はパターンによって 25~70%の範囲です(各パターンの説明に記載されています)。理由: AST の解析を追加すると、依存関係と複雑さが増します。正規表現は高速で、気づかれないままブロックするのではなく、人による確認のために保留するガバナンス層としては十分です。
  • 永続化は一部のみです。 保留とサーキットブレーカーの状態は SQLite(data/governance.db)に永続化され、サーバーの再起動後も維持されるようになりました。ただし、パターン設定の変更(ps_security_config による有効化・無効化、重大度の変更)は引き続きメモリ内だけで保持され、再起動時にリセットされます。理由: パターン設定は軽量で、変更されることもほとんどありません。設定を完全に永続化するには、別個の設定ストアが必要になります。

MCP ツール(56 個)

ガバナンスの基本
ツール呼び出すタイミング機能
ps_validateエージェントのアクションを実行する前実行せずに、すべてのルールに照らしてフレームを検証します
ps_validate_batch複数のアクションを一度に確認するとき効率的な一括検証を行います
ps_executeエージェントがツール呼び出しを実行するとき完全なパイプライン:検証 → 保留の確認 → 実行 → 監査
ps_execute_dry_run実行するとどうなるかをプレビューするときツールを実行せずに、完全なパイプラインを実行します
人間参加型の保留
ツール呼び出すタイミング機能
ps_hold_list保留中のエージェントアクションを確認するとき人間の承認を待っている操作をすべて一覧表示します
ps_hold_approve保留中の操作を続行するとき必要に応じて引数を変更して承認します
ps_hold_reject保留中の操作を却下するとき理由を添えて却下します
ps_hold_config承認が必要な操作を調整するとき保留のトリガーとしきい値を設定します
ps_hold_stats保留キューの状態を監視するとき保留キューの統計情報を表示します
エージェントのライフサイクル
ツール呼び出すタイミング機能
ps_state_getエージェントの動作を確認するときエージェントのアクティブなフレームと最後のアクションを取得します
ps_state_systemシステム全体の状態を監視するときシステム全体の統計情報を表示します
ps_state_haltエージェントを直ちに停止する必要があるときサーキットブレーカーを作動させ、以降のすべての呼び出しをブロックします
ps_state_resume停止したエージェントの続行を許可するときサーキットブレーカーをリセットします
ps_state_resetエージェントの状態を消去するとき状態を完全にリセットします
ps_state_drift_history動作の変化を調査するときドリフト検出のアラート履歴を表示します
委任
ツール呼び出すタイミング処理内容
ps_delegateエージェントがサブエージェントを起動するとき権限を制限した親から子への委任を作成
ps_delegate_revokeサブエージェントの権限を取り消すとき委任を削除
ps_delegate_list委任チェーンを監査するとき有効な委任を一覧表示
設定
ツール呼び出すタイミング処理内容
ps_config_set実行時にガバナンスルールを変更するとき設定のキーと値のペアを設定
ps_config_get現在の設定を読み取るとき現在の設定を取得
ps_config_activateポリシープロファイルを切り替えるとき名前を指定して設定を有効化
ps_config_export設定をバックアップするとき設定全体をJSONとしてエクスポート
ps_config_import設定を復元するときJSONから設定をインポート
ps_confidence_set検証の厳格さを調整するとき信頼度のしきい値を設定
ps_confidence_get現在のしきい値を確認するとき現在のしきい値を取得
ps_confidence_bulk_set複数のしきい値を再設定するときしきい値を一括更新
ps_feature_setパイプラインの段階を切り替えるとき特定のチェックを有効化/無効化
ps_feature_get有効な段階を確認するとき機能フラグを取得
シンボルレジストリ(エンティティの追跡)
ツール呼び出すタイミング処理内容
ps_symbol_create新しいエンティティ(企業、人物、システム)を登録するとき種類、メタデータ、タグを指定してシンボルを作成
ps_symbol_getエンティティを検索するときIDで取得
ps_symbol_updateエンティティのデータが変更されたときメタデータまたはタグを更新
ps_symbol_list種類別にエンティティを閲覧するとき任意の種類フィルターを指定して一覧表示
ps_symbol_deleteエンティティを削除するときIDで削除
ps_symbol_importエンティティを一括読み込みするとき一括インポート
ps_symbol_statsレジストリの状態を監視するときレジストリの統計情報
ps_symbol_formatエンティティを表示するとき表示用にシンボルを整形
ps_symbol_verifyエンティティのデータが最新であることを確認するときシンボルを検証済みとしてマーク
ps_symbol_list_unverified古いデータを監査するとき検証が必要なシンボルを一覧表示
ps_symbol_add_alternativeエンティティに別名があるとき代替識別子を追加
セキュリティの適用
ツール呼び出すタイミング処理内容
ps_security_scanコードの脆弱性をチェックするときコンテンツをスキャンし、重大度別に検出結果を返す
ps_security_gate書き込みにセキュリティポリシーを適用するときスキャンして適用:ブロック/保留/警告/許可
ps_security_config検出パターンを調整するときパターンの一覧表示、有効化、無効化、重大度の変更
監査
ツール呼び出すタイミング処理内容
ps_audit_get何が起きたかを確認するときフィルター付きの完全な監査証跡

アーキテクチャ

src/
├── gatekeeper/       # 8-stage validation pipeline (core enforcement)
│   ├── index.ts      #   Pipeline orchestrator + agent eviction policy
│   ├── validator.ts  #   Frame structural/semantic/chain validation
│   ├── interceptor.ts#   Permission gate with confidence thresholds
│   ├── hold-manager.ts#  Human-in-the-loop hold queue
│   ├── resolver.ts   #   Frame resolution with operator overrides
│   └── coverage.ts   #   Coverage confidence calculator
├── drift/            # Behavioral drift detection
│   ├── circuit-breaker.ts  # Per-agent halt/resume
│   ├── baseline.ts         # Behavioral baseline comparison
│   ├── tripwire.ts         # Anomaly tripwires
│   └── monitor.ts          # Continuous monitoring
├── security/         # Security vulnerability scanning
│   ├── patterns.ts   #   10 detection patterns (regex-based)
│   └── scanner.ts    #   Scanner engine + severity classification
├── persistence/      # SQLite governance persistence
│   └── database.ts   #   Holds, decisions, circuit breakers (WAL mode)
├── symbols/          # SQLite-backed entity registry (11 CRUD tools)
├── policies/         # Policy file loader + overlay system
├── operator/         # Operator configuration
├── tools/            # MCP tool implementations
│   ├── registry.ts   #   29 core tools
│   ├── ps_hold.ts    #   5 hold tools
│   └── ps_security.ts#   3 security tools
├── handlers/         # Tool dispatch + metadata registry
├── core/             # Logging, errors, result patterns
└── server.ts         # MCP server entry point (stdio transport)

パフォーマンス

PromptSpeakは、すべてのツール呼び出しにサブミリ秒のオーバーヘッドでガバナンスを追加します。Apple M2 Pro、Node.js 22、Vitest 4.0でベンチマークを実施しました。

レイテンシ(実行前チェック、1000回の反復)
パーセンタイルレイテンシ
平均0.164ms
P950.368ms
P991.183ms
実行パス全体のP950.074ms
スループット(同時操作)
操作レート
サーキットブレーカーのチェック(1000件同時)6,173 ops/sec
保留の作成55,556 holds/sec
保留の承認/却下200,000+/sec
複合操作(停止+保留+許可)6,818 ops/sec
ストレステスト
テスト結果
ブロックされた実行を1000件同時に実行合計162ms、すべて正しくブロック
100回の高速な停止/再開サイクル状態遷移は100%正確
状態が混在する500件のエージェント250件をブロック、250件を許可 — 誤分類ゼロ
継続的な負荷(1000件の操作)時のメモリ使用量減少(-11.76 MB、GCにより回収)
テストスイート
指標値
テスト数33ファイルで829テスト
テスト時間合計1.11秒
カテゴリユニット、統合、ストレス、セキュリティ、文法

要件

  • Node.js >= 20.0.0
  • TypeScript 5.3+(ソースからビルド)
  • 外部サービスは不要 — シンボルとガバナンスの永続化にはSQLiteを使用

関連プロジェクト

  • deeptrend — 自律型エージェント向けの構造化されたAIトレンドフィードです。14以上のソースから厳選し、LLM Counselを通じて統合したデータを、6時間ごとにJSON Feed、RSS、llms.txtとして公開します。エージェント監視パイプラインのデータソースとして設計されています。

プライバシーポリシー

https://promptspeak.admin-as-a-service.com/privacy

PromptSpeakは個人データを収集せず、テレメトリも使用しません。すべてのガバナンスデータはSQLiteにローカル保存されます。詳しくは上記のリンクからポリシー全文をご覧ください。

データ処理条件

https://promptspeak.admin-as-a-service.com/dpa

プラットフォーム統合(例:Anthropic Connectors)向けの標準的なデータ処理条件です。PromptSpeakはデータ処理者として機能します。再委託先はなく、外部へのデータ送信もありません。

ライセンス

MIT

コメント

MCP は初めてですか?

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

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