mcp2cli について
mcp2cliは、MCPサーバー、OpenAPI仕様、GraphQLエンドポイントを実行時にコマンドラインのコマンドへ変換するツールです。コード生成は不要で、コマンドの動的な検出・実行に加え、設定の保存やMCPセッションの維持に対応します。
主な機能
- 01MCP、OpenAPI、GraphQLをCLIコマンド化
- 02コマンドの動的な検出、検索、確認
- 03HTTP、SSE、stdioトランスポートに対応
- 04永続MCPセッションと名前付き設定の管理
- 05認証、応答の切り詰め、TOON出力
活用シーン
- 01コマンドラインからMCPサーバーのツールを呼び出す
- 02OpenAPIやGraphQL APIを調べて操作する
- 03保存したAPI接続設定を再利用する
- 04永続セッションでstdioサーバーを繰り返し使う
MCP 対応
MCPクライアントとして、HTTP/SSEまたはstdio経由でMCPサーバーに接続し、ツールを検出して呼び出します。永続セッション、roots、引数補完にも対応します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ knowsuchagency/ mcp2cli --skill mcp2cliインストール後、Claude Code で/mcp2cliを入力して読み込まれたか確認します。
詳細
mcp2cli
任意の MCP サーバー、OpenAPI 仕様、または GraphQL エンドポイントを、実行時に CLI に変換します。コード生成は不要です。
インストール
# Run directly (no install needed)
uvx mcp2cli --help
# Or install
pip install mcp2cli
基本的なワークフロー
- ソース(MCP サーバー、OpenAPI 仕様、または GraphQL エンドポイント)に接続します
--listで使用可能なコマンドを確認します(または--searchで絞り込みます)<command> --helpで特定のコマンドを確認します- フラグを指定してコマンドを実行します
# MCP over HTTP
mcp2cli --mcp https://mcp.example.com/sse --list
mcp2cli --mcp https://mcp.example.com/sse create-task --help
mcp2cli --mcp https://mcp.example.com/sse create-task --title "Fix bug"
# MCP over stdio
mcp2cli --mcp-stdio "npx @modelcontextprotocol/server-filesystem /tmp" --list
mcp2cli --mcp-stdio "npx @modelcontextprotocol/server-filesystem /tmp" read-file --path /tmp/hello.txt
# OpenAPI spec (remote or local, JSON or YAML)
mcp2cli --spec https://petstore3.swagger.io/api/v3/openapi.json --list
mcp2cli --spec ./openapi.json --base-url https://api.example.com list-pets --status available
# GraphQL endpoint
mcp2cli --graphql https://api.example.com/graphql --list
mcp2cli --graphql https://api.example.com/graphql users --limit 10
mcp2cli --graphql https://api.example.com/graphql create-user --name "Alice"
CLI リファレンス
mcp2cli [global options] <subcommand> [command options]
Source (mutually exclusive, one required):
--spec URL|FILE OpenAPI spec (JSON or YAML, local or remote)
--mcp URL MCP server URL (HTTP/SSE)
--mcp-stdio CMD MCP server command (stdio transport)
--graphql URL GraphQL endpoint URL
Options:
--auth-header K:V HTTP header (repeatable, value supports env:/file: prefixes)
--base-url URL Override base URL from spec
--transport TYPE MCP HTTP transport: auto|sse|streamable (default: auto)
--env KEY=VALUE Env var for stdio server process (repeatable)
--root PATH|FILE_URI Expose a filesystem root to an MCP server (repeatable)
--complete SPEC Complete an MCP prompt or resource-template argument
--session-start NAME Start a persistent session daemon (requires --mcp or --mcp-stdio)
--session NAME Route command through an existing session daemon
--session-stop NAME Stop a named session daemon (sends SIGTERM)
--session-list List all active sessions with PID and alive/dead status
--oauth Enable OAuth (authorization code + PKCE flow)
--oauth-client-id ID OAuth client ID (supports env:/file: prefixes)
--oauth-client-secret S OAuth client secret (supports env:/file: prefixes)
--oauth-scope SCOPE OAuth scope(s) to request
--oauth-manual-callback Print the auth URL and read the redirect URL from stdin
(headless hosts: VPS over SSH, containers)
--cache-key KEY Custom cache key
--cache-ttl SECONDS Cache TTL (default: 3600)
--refresh Bypass cache
--list List available subcommands
--search PATTERN Search tools by name or description (implies --list)
--fields FIELDS Override GraphQL selection set (e.g. "id name email")
--pretty Pretty-print JSON output
--raw Print raw response body
--json Force valid JSON for every command. --list emits a JSON array;
MCP calls emit the full envelope (structuredContent, isError).
--toon Encode output as TOON (token-efficient for LLMs)
--head N Limit output to first N records (arrays)
--version Show version
Bake mode:
bake create NAME [opts] Save connection settings as a named tool
bake list List all baked tools
bake show NAME Show config (secrets masked)
bake update NAME [opts] Update a baked tool
bake remove NAME Delete a baked tool
bake install NAME Create ~/.local/bin wrapper script
@NAME [args] Run a baked tool (e.g. mcp2cli @petstore --list)
サブコマンドとフラグは、ソースから動的に生成されます。
使用パターン
認証
シークレットには必ず env: または file: プレフィックスを使用してください。CLI フラグに認証情報をリテラル値として渡さないでください。リテラル値はプロセス一覧やシェルの履歴から確認できてしまいます。
# Secret from environment variable (recommended — avoids exposing in process list)
mcp2cli --spec ./spec.json --auth-header "Authorization:env:API_TOKEN" list-items
# Secret from file
mcp2cli --mcp https://mcp.example.com/sse \
--auth-header "x-api-key:file:/run/secrets/api_key" \
search --query "test"
OAuth 認証(MCP HTTP のみ)
# Authorization code + PKCE (opens browser)
mcp2cli --mcp https://mcp.example.com/sse --oauth --list
# Client credentials (machine-to-machine)
mcp2cli --mcp https://mcp.example.com/sse \
--oauth-client-id env:OAUTH_CLIENT_ID --oauth-client-secret env:OAUTH_CLIENT_SECRET \
search --query "test"
# With scopes
mcp2cli --mcp https://mcp.example.com/sse --oauth --oauth-scope "read write" --list
トークンは ~/.cache/mcp2cli/oauth/ にキャッシュされ、自動的に更新されます。
トランスポートの選択(MCP HTTP のみ)
# Default: tries streamable HTTP, falls back to SSE
mcp2cli --mcp https://mcp.example.com/sse --list
# Force SSE transport (skip streamable HTTP attempt)
mcp2cli --mcp https://mcp.example.com/sse --transport sse --list
# Force streamable HTTP (no SSE fallback)
mcp2cli --mcp https://mcp.example.com/sse --transport streamable --list
GraphQL
# Discover queries and mutations
mcp2cli --graphql https://api.example.com/graphql --list
# Run a query
mcp2cli --graphql https://api.example.com/graphql users --limit 10
# Run a mutation
mcp2cli --graphql https://api.example.com/graphql create-user --name "Alice" --email "[email protected]"
# Override auto-generated selection set
mcp2cli --graphql https://api.example.com/graphql users --fields "id name email"
# With auth
mcp2cli --graphql https://api.example.com/graphql --auth-header "Authorization:env:API_TOKEN" users
ツールの検索
# Filter tools by name or description (case-insensitive)
mcp2cli --mcp https://mcp.example.com/sse --search "task"
mcp2cli --spec ./openapi.json --search "create"
mcp2cli --graphql https://api.example.com/graphql --search "user"
--search を指定すると --list も適用され、一致するツールのみが表示されます。
標準入力からの JSON ボディを使用した POST
echo '{"name": "Fido", "tag": "dog"}' | mcp2cli --spec ./spec.json create-pet --stdin
マルチパートファイルのアップロード
OpenAPI 仕様で format: binary フィールドを含む multipart/form-data が宣言されている場合、mcp2cli はファイルパスを指定する CLI 引数として公開します。
# Upload a file — binary fields accept local file paths
mcp2cli --spec ./spec.json upload-image --file /path/to/photo.png --caption "My photo"
# Non-binary fields in the same multipart schema become regular flags
mcp2cli --spec ./spec.json upload-image --file ./image.jpg --title "Cover" --alt-text "A sunset"
ファイルパラメーターは --help の出力に (file path) と表示されます。MIME タイプはファイル拡張子から自動検出されます。
stdio サーバーの環境変数
mcp2cli --mcp-stdio "node server.js" --env API_KEY=env:API_SECRET_KEY --env DEBUG=1 search --query "test"
MCP のルートと補完
ワークスペースのスコープを持つサーバーは、クライアントが公開するファイルシステムのルートを要求できます。--root は繰り返し指定でき、ローカルパスは file:// URI に変換されます。
mcp2cli --mcp-stdio "npx @modelcontextprotocol/server-filesystem /tmp" \
--root "$PWD" --root file:///var/shared --list
サーバーに、プロンプト引数またはリソーステンプレートの変数を補完するよう依頼します。
mcp2cli --mcp https://example.com/mcp --complete "greeting:name=San"
mcp2cli --mcp https://example.com/mcp \
--complete "file:///docs/{topic}:topic=api"
永続接続では、デーモンの起動時にルートを渡し、名前付きセッションを通じて補完を実行します。
mcp2cli --mcp-stdio "node server.js" --root "$PWD" --session-start workspace
mcp2cli --session workspace --complete "greeting:name=San"
セッション管理 — MCP 接続の永続化
--mcp-stdio を実行するたびに新しいサブプロセスが起動し、起動コストが発生した後に終了します。
セッションを使うと、MCP サーバーをバックグラウンドデーモンで起動したままにでき、Unix ドメインソケット経由で接続できます。
# Start a persistent session for a stdio server
mcp2cli --mcp-stdio "npx @modelcontextprotocol/server-filesystem /tmp" \
--session-start myfs
# Use the session — no subprocess spawn, no startup delay
mcp2cli --session myfs --list
mcp2cli --session myfs read-file --path /tmp/hello.txt
mcp2cli --session myfs write-file --path /tmp/world.txt --content "hi"
# Check active sessions
mcp2cli --session-list
# Stop when done
mcp2cli --session-stop myfs
ベイクモード — 設定の保存
接続設定を名前付き設定として保存すると、フラグを繰り返し指定せずに済みます。
# Create a baked tool
mcp2cli bake create petstore --spec https://api.example.com/spec.json \
--exclude "delete-*,update-*" --methods GET,POST --cache-ttl 7200
mcp2cli bake create myfs --mcp-stdio "npx -y @modelcontextprotocol/server-filesystem /tmp" \
--include "search-*,list-*" --exclude "list-allowed-*"
# Use with @ prefix
mcp2cli @petstore --list
mcp2cli @petstore list-pets --limit 10
mcp2cli @myfs --list # search-files, list-directory, list-directory-with-sizes
mcp2cli @myfs search-files --path /tmp --pattern "**/*.md" # pattern is a glob, relative to --path
# Manage
mcp2cli bake list
mcp2cli bake show petstore
mcp2cli bake update petstore --cache-ttl 3600
mcp2cli bake remove petstore
mcp2cli bake install petstore # creates ~/.local/bin/petstore wrapper
絞り込みオプション:--include(glob ホワイトリスト)、--exclude(glob ブラックリスト)、--methods(HTTP メソッド。OpenAPI のみ)。
設定は ~/.config/mcp2cli/baked.json に保存されます(MCP2CLI_CONFIG_DIR で変更できます)。
キャッシュ
仕様と MCP ツール一覧は ~/.cache/mcp2cli/ にキャッシュされます(TTL は 1 時間)。ローカルファイルはキャッシュされません。
mcp2cli --spec https://api.example.com/spec.json --refresh --list # Force refresh
mcp2cli --spec https://api.example.com/spec.json --cache-ttl 86400 --list # 24h TTL
TOON 出力(LLM 向けのトークン効率化)
mcp2cli --mcp https://mcp.example.com/sse --toon list-tags
均一な要素を含む大きな配列に最適です。JSON よりトークン数を 40〜60% 削減できます。
--head による大きなレスポンスの切り詰め
# Preview first 3 records from a potentially huge dataset
mcp2cli --spec ./spec.json list-records --head 3 --pretty
--head N は JSON 配列を先頭の N 要素に切り詰めます。フィールドが過大なデータセット(例:1 レコードあたり約 200KB の geo_shape ポリゴン)に便利です。
セキュリティ
- 認証情報:シークレットには必ず
env:またはfile:プレフィックスを使用してください。コマンドにトークンやキーをリテラル値として埋め込まないでください。env:プレフィックスは環境変数から、file:はファイルパスから読み込みます。 - 信頼境界:mcp2cli は、ユーザーが指定したリモート API および MCP サーバーに接続します。外部ソースからのレスポンスは信頼できないものとして扱い、操作する前にデータを検証してください。
- ベイク済み設定:
bake showは出力内のシークレットをマスクします。ベイク済み設定はローカルの~/.config/mcp2cli/baked.jsonに保存されるため、このファイルを適切に保護してください。
API からスキルを生成する
ユーザーから MCP サーバー、OpenAPI 仕様、または GraphQL エンドポイントを基にスキルを作成するよう依頼された場合は、次のワークフローに従います。
-
検出:利用可能なコマンドをすべて確認します。
uvx mcp2cli --mcp https://target.example.com/sse --list -
調査:各コマンドを調べ、パラメーターを理解します。
uvx mcp2cli --mcp https://target.example.com/sse <command> --help -
テスト:重要なコマンドをテストし、エッジケースを調べます。
uvx mcp2cli --mcp https://target.example.com/sse <command> --param value特に、次の点をテストします。
- 大きなレスポンス:
--head 3を使ってプレビューします。出力が過大になるフィールド(例:geo_shape、埋め込みデータ)はありますか? - 日付/時刻フィールド:API が想定する形式は何ですか?(ISO 8601、Unix タイムスタンプ、
date'2022'のような独自構文など) - ページネーション:API はすべての結果を返しますか?それとも
--offset/--limitが必要ですか? - エラーメッセージ:無効なパラメーターを指定するとどうなりますか?エラーは分かりやすいですか?
- バイナリとテキストのレスポンス:JSON 以外(xlsx、parquet、画像など)を返すエンドポイントはありますか?
- スコープの混同:想定以上のデータ(例:地域別データを期待しているのに全国データ)が含まれていませんか?
- 大きなレスポンス:
-
接続設定を組み込み、スキルでフラグを繰り返し指定しなくて済むようにします。
uvx mcp2cli bake create myapi \ --mcp https://target.example.com/sse \ --auth-header "Authorization:Bearer env:MYAPI_TOKEN" \ --exclude "delete-*" --methods GET,POST -
ラッパーをスキルの scripts ディレクトリにインストールします。
uvx mcp2cli bake install myapi --dir .claude/skills/myapi/scripts/ -
.claude/skills/myapi/にSKILL.mdを作成し、別の AI エージェントにこの API の使い方を説明します。SKILL.mdでは--helpの出力にとどまらず、テストやドキュメントの閲覧を通じてのみ得られる知識に重点を置きます。Frontmatter:
--- name: myapi description: Interact with the MyAPI service allowed-tools: Bash(bash *) ---コアワークフロー(検出と実行):
# List available commands ${CLAUDE_SKILL_DIR}/scripts/myapi --list # Get help for a command ${CLAUDE_SKILL_DIR}/scripts/myapi <command> --help # Run a command ${CLAUDE_SKILL_DIR}/scripts/myapi <command> --param value --prettyクエリ実行前のチェックリスト — 判断の枠組みを含めます。
- どのデータセット/リソースを対象にしていますか?
- ページネーション(
--offset、--limit)は必要ですか? - 出力が大きくなるフィールドがあり、除外または切り詰め(
--head)が必要ですか? - このエンドポイントでは、どのような日付/フィルター形式が必要ですか?
アンチパターンと注意点 — テスト中に見つかった意外な点をすべて記録します。
- 日付構文の癖(例:
date'2022'と"2022") - 出力が過大になるフィールド(例:geo_shape →
--headを使って制限) - エンドポイント間でのパラメーター名の不一致
- スコープ/フィルタリングの混同(例:データセットに地域別データだけでなく全国データも含まれる)
- バイナリエクスポートの破損リスク(例:バイナリ形式をテキストエンコーディング経由でパイプしない)
出力処理 — 読みやすい JSON には
--prettyを、結果の制限には--headを使うか、フィルタリングにjqへパイプします。# Pretty-print results ${CLAUDE_SKILL_DIR}/scripts/myapi list-records --pretty # Limit large datasets ${CLAUDE_SKILL_DIR}/scripts/myapi list-records --head 5 # Filter with jq (pipe) ${CLAUDE_SKILL_DIR}/scripts/myapi list-records | jq '.[].name'エクスポート形式(API が複数の出力形式に対応している場合):
- 対応形式(JSON、CSV、xlsx、parquet など)を列挙します。
- テキストとして安全に扱える形式とバイナリ形式を明記します。
- バイナリ形式の場合:
${CLAUDE_SKILL_DIR}/scripts/myapi export --format xlsx --raw > output.xlsx
知識差分の原則:
--helpに記載されたパラメーター一覧を重複して記載しないでください。代わりに、一般的なタスクで実際に重要なパラメーター、意外なデフォルト動作、併用できない組み合わせ、レート制限やレスポンスサイズの上限を記録します。
生成されたスキルは実行レイヤーとして mcp2cli を使用します。接続の詳細は組み込み済みのラッパースクリプトが処理するため、SKILL.md は簡潔で移植しやすいまま保たれます。