Skip to main content
Glama

MCPGen

OpenAPI仕様から、ポリシーを意識した安全なMCPサーバーを生成します。

MCPGenは、OpenAPI仕様をデフォルトで安全なツールサーバーに変換する、プロダクション指向のMVP Pythonフレームワークです。FastAPIデモサーバーやMCP形式のstdioサーバーを生成でき、将来的にポリシー設定で明示的に許可されない限り、書き込み操作はブロックされたままになります。

問題点

AIアプリケーションは、多くのAPI、データベース、内部システムへのアクセスを必要とすることがよくあります。フレームワークがない場合、チームは同じ統合を繰り返し構築し、モデルに対して過剰なツールを公開し、リスク分類、監査ログ、書き込み操作のガードレールといった安全管理を省略しがちです。

MCPサーバーはAIシステムがツールを利用できるようにしますが、迅速なプロトタイプ作成では、レビューなしで DELETE、POST、PATCH、PUT といった危険な操作を誤って公開してしまう可能性があります。

Related MCP server: openapi-mcp

解決策

MCPGenはOpenAPIのYAMLまたはJSONファイルを読み込み、以下を生成します:

  • 構造化されたツール記述子

  • 安全に公開されたツールリスト

  • 除外されたツールレポート

  • 入力スキーマ

  • ポリシーを意識したFastAPIまたはMCPサーバー

  • ドライラン(空実行)プレビュー

  • 安全な GET 実行

  • JSONL監査ログ

  • キーワードフォールバック付きのセマンティックツールルーティング

デフォルトの動作は意図的に保守的であり、低リスクの GET ツールのみが公開されます。

機能

  • OpenAPI YAML/JSON解析

  • エンドポイントからのツール生成

  • リスク分類:

    • GET = 低

    • POST, PUT, PATCH = 中

    • DELETE = 高

  • デフォルトでの安全なフィルタリング

  • パス/クエリパラメータおよびJSONリクエストボディからの入力スキーマ生成

  • キーワードフォールバック付きのセマンティックツールルーティング

  • FastAPIモード

  • tools/list および tools/call を備えたMCP stdioモード

  • ドライランのリクエストプレビュー

  • 低リスクの GET ツールのみに対する安全な実実行

  • 中央ポリシーエンジン

  • JSONL監査ログ

  • CLIコマンド: generate, inspect

  • mcpgen.yaml による設定

アーキテクチャフロー

OpenAPI spec
  -> parser
  -> tool generator
  -> risk classifier
  -> safety filter
  -> tools.json / tools.all.json / tools.embeddings.json / safety_report.json
  -> generated FastAPI or MCP server
  -> policy engine
  -> semantic/keyword router
  -> dry-run or safe GET execution
  -> audit log

クイックスタート

ローカルにインストール:

pip install -e .[dev]

仕様を検査:

mcpgen inspect --from examples/jsonplaceholder.openapi.yaml

FastAPIサーバーを生成:

mcpgen generate --from examples/jsonplaceholder.openapi.yaml --mode fastapi --output generated_jsonplaceholder

実行:

cd generated_jsonplaceholder
export API_BASE_URL=https://jsonplaceholder.typicode.com
uvicorn server:app --reload --port 8001

PowerShellの場合:

cd generated_jsonplaceholder
$env:API_BASE_URL = "https://jsonplaceholder.typicode.com"
uvicorn server:app --reload --port 8001

開く:

http://127.0.0.1:8001/
http://127.0.0.1:8001/docs
http://127.0.0.1:8001/tools
http://127.0.0.1:8001/safety

OpenAPI入力例

デモ仕様:

examples/jsonplaceholder.openapi.yaml

以下が含まれます:

  • GET /users

  • GET /users/{id}

  • GET /posts

  • GET /posts/{id}

  • POST /posts

  • DELETE /posts/{id}

抜粋:

paths:
  /users/{id}:
    get:
      operationId: getUserById
      summary: Get user by ID
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer

生成されたツールの例

生成された安全なツール:

{
  "name": "get_user_by_id",
  "description": "Get user by ID",
  "method": "GET",
  "path": "/users/{id}",
  "risk_level": "low",
  "enabled": true,
  "operation_id": "getUserById",
  "input_schema": {
    "type": "object",
    "properties": {
      "id": {
        "type": "integer",
        "description": "User ID",
        "x-mcpgen-location": "path"
      }
    },
    "required": ["id"]
  }
}

create_post や delete_post のような除外されたツールは tools.all.json に残り、safety_report.json で説明されます。

FastAPIデモコマンド

プロジェクトルートから:

mcpgen generate --from examples/jsonplaceholder.openapi.yaml --mode fastapi --output generated_jsonplaceholder
cd generated_jsonplaceholder
export API_BASE_URL=https://jsonplaceholder.typicode.com
uvicorn server:app --reload --port 8001

PowerShellの場合:

mcpgen generate --from examples/jsonplaceholder.openapi.yaml --mode fastapi --output generated_jsonplaceholder
cd generated_jsonplaceholder
$env:API_BASE_URL = "https://jsonplaceholder.typicode.com"
uvicorn server:app --reload --port 8001

公開された安全なツールを一覧表示:

curl http://127.0.0.1:8001/tools

クエリでツールをルーティング:

curl -X POST http://127.0.0.1:8001/tools \
  -H "Content-Type: application/json" \
  -d "{\"query\":\"get user by id\"}"

PowerShellでの同等コマンド:

Invoke-RestMethod -Method Post http://127.0.0.1:8001/tools `
  -ContentType "application/json" `
  -Body '{"query":"get user by id"}'

安全なツールをドライラン:

curl -X POST http://127.0.0.1:8001/tools/get_user_by_id/dry-run \
  -H "Content-Type: application/json" \
  -d "{\"inputs\":{\"id\":1}}"

安全な GET ツールを実行:

curl -X POST http://127.0.0.1:8001/execute \
  -H "Content-Type: application/json" \
  -d "{\"tool_name\":\"get_user_by_id\",\"params\":{\"id\":1}}"

PowerShellでの同等コマンド:

Invoke-RestMethod -Method Post http://127.0.0.1:8001/execute `
  -ContentType "application/json" `
  -Body '{"tool_name":"get_user_by_id","params":{"id":1}}'

ブロックされた POST の動作を表示:

curl -X POST http://127.0.0.1:8001/tools/create_post/dry-run \
  -H "Content-Type: application/json" \
  -d "{\"inputs\":{\"title\":\"Hello\",\"body\":\"Demo\",\"userId\":1}}"

ブロックされた DELETE の動作を表示:

curl -X POST http://127.0.0.1:8001/tools/delete_post/dry-run \
  -H "Content-Type: application/json" \
  -d "{\"inputs\":{\"id\":1}}"

監査ログを表示:

cat logs/audit.log

PowerShellでの同等コマンド:

Get-Content logs\audit.log

MCPモード

MCP形式のstdioサーバーを生成:

mcpgen generate --from examples/jsonplaceholder.openapi.yaml --mode mcp --output generated_jsonplaceholder_mcp

実行:

cd generated_jsonplaceholder_mcp
export API_BASE_URL=https://jsonplaceholder.typicode.com
python server.py

PowerShellの場合:

cd generated_jsonplaceholder_mcp
$env:API_BASE_URL = "https://jsonplaceholder.typicode.com"
python server.py

tools/list JSON-RPC入力の例:

{"jsonrpc":"2.0","id":1,"method":"tools/list"}

tools/call ドライラン入力の例:

{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"get_user_by_id","arguments":{"id":1}}}

MCPモードは、FastAPIモードと同じ tools.json、ポリシーエンジン、監査ログを使用します。現在のMVPでは、tools/call はデフォルトでドライランされます。execution_mode: safe-execute を設定すると、低リスクの GET ツールのみを実行できます。

セマンティックツールルーティング

MCPGenは生成時に tools.embeddings.json を書き込み、以下の場合に使用します:

routing_mode: semantic

埋め込みが利用できない場合やセマンティックランキングが失敗した場合、MCPGenは自動的にキーワードルーティングにフォールバックします。以下の設定でキーワードルーティングを強制できます:

routing_mode: keyword

ツールテキストは、ツール名、説明、オプションのタグを組み合わせたものです。例:

create_invoice create invoice for customer billing payments

デフォルトでは、MCPGenは決定論的なローカル埋め込みフォールバックを使用するため、モデルのダウンロードなしでデモやテストが動作します。sentence-transformers を使用するには、以下を設定します:

export MCPGEN_EMBEDDING_BACKEND=sentence-transformers

PowerShellの場合:

$env:MCPGEN_EMBEDDING_BACKEND = "sentence-transformers"

mcpgen.yaml の routing_mode を変更してサーバーを再生成し、ルーティングモードを比較してください。セマンティックモードはベクトル類似度でランク付けし、キーワードモードは正規化されたトークンの重複度でランク付けし、一致した用語を含めます。

安全性モデル

MCPGenはデフォルトで安全です:

  • 低リスクの GET ツールのみが tools.json で公開されます。

  • 中リスクの書き込みツールは、将来の設定で明示的に有効にされない限り除外されます。

  • 高リスクの DELETE ツールは常にブロックされます。

  • 実実行は低リスクの GET ツールに制限されます。

  • 書き込み実行は実装されていません。

  • 認証は実装されていません。

ポリシー判定は以下を返します:

{
  "allowed": false,
  "status": "blocked",
  "reason": "Medium-risk tool is not listed in enabled_tools.",
  "risk_level": "medium",
  "tool_name": "create_post"
}

監査ログ

監査ログは、以下に書き込まれるJSONLレコードです:

logs/audit.log

設定:

audit_enabled: true
audit_log_path: logs/audit.log
routing_mode: semantic

各イベントには以下が含まれます:

  • タイムスタンプ

  • ツール名

  • メソッド

  • パス

  • リスクレベル

  • モード

  • ステータス

  • 許可状況

  • 理由

  • ソース

  • アクション

アクションには以下が含まれます:

  • policy_evaluation

  • dry_run

  • execution_started

  • execution_success

  • execution_error

  • execution_blocked

設定

デフォルト設定:

max_tools: 5
allowed_methods:
  - GET
output_dir: generated_mcp_server
api_base_url: https://api.example.com
enabled_tools: []
execution_mode: dry-run
audit_enabled: true
audit_log_path: logs/audit.log

JSONPlaceholderデモの場合、以下を設定します:

api_base_url: https://jsonplaceholder.typicode.com

現在の制限事項

  • これはプロダクション指向のMVPであり、本番環境対応のフレームワークではありません。

  • 環境変数の準備以外、認証やシークレット管理はありません。

  • 書き込み実行はありません。

  • 確認ワークフローのUIはありません。

  • ベクトルデータベースや埋め込みキャッシュの最適化はありません。

  • レート制限はありません。

  • データベースバックエンドの監査シンクはありません。

  • 公式のPython MCP SDKが利用できない場合、MCPモードは最小限のstdio足場を使用します。

ロードマップ

  • 公式MCP SDKの統合

  • 認証とシークレット管理

  • 有効化された中リスクツールに対する確認ワークフロー

  • レート制限

  • リクエスト/レスポンスのバリデーション

  • OpenAPIスキーマサポートの向上

  • プラグ可能な監査シンク

  • より優れたセマンティックルーティングモデルと埋め込みキャッシュの最適化

  • デプロイメントテンプレート

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Automatically generates MCP server tools from OpenAPI specifications, enabling LLMs to interact with any API defined by an OpenAPI spec through natural language.
    29 npm
    MIT