PromptSpeak Governance について
PromptSpeak Governanceは、実行前に決定論的なガバナンスルールでエージェントのツール呼び出しを検証するMCPサーバーです。リスクのある呼び出しの遮断や人間による承認への保留、書き込み内容のセキュリティスキャン、操作記録に対応します。
主な機能
- 01実行前のツール呼び出し検証
- 02人間による承認用の保留
- 03書き込み操作のセキュリティスキャン
- 04エージェントの逸脱検知と停止制御
- 05ツール呼び出しの監査記録
活用シーン
- 01本番環境の変更に人間の確認を要求
- 02ガバナンスフレームに反する呼び出しを遮断
- 03保存前にエージェント作成コードをスキャン
- 04試行または遮断された操作を調査
MCP 対応
検証、統制下での実行、保留の確認、セキュリティスキャン、エージェントのライフサイクル制御などのガバナンスツールをMCPクライアントに提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
56掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| frame | string | はい | 検証する PromptSpeak フレーム(例:"⊕◊▶β") |
| strict | boolean | いいえ | true の場合、警告も検証失敗の原因になります |
| parentFrame | string | いいえ | チェーン検証用の任意の親フレーム |
| validationLevel | enum | いいえ | 実行する検証レベルstructural | semantic | chain | full |
詳細
promptspeak-mcp-server
AI エージェントの実行前ガバナンス。危険なツール呼び出しを実行前にブロックします。
AI エージェントは、意図と実行の間に検証レイヤーがないまま、ツール(ファイルへの書き込み、API リクエスト、シェルコマンド)を呼び出します。プロンプトインジェクション、誤った引数、あるいは目的のずれによって、取り消せない操作が引き起こされる可能性があります。PromptSpeak はすべての MCP ツール呼び出しを傍受し、決定論的なルールに照らして検証して、リスクのある操作をブロックするか、人間の承認が得られるまで保留します。処理は 0.1ms で完了し、実行前に行われます。

こんな場合にご利用ください
- ツール(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_findingHoldReason を介して 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 |
| P95 | 0.368ms |
| P99 | 1.183ms |
| 実行パス全体のP95 | 0.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
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。