OpenRouter MCP Multimodal Server について
OpenRouter MCP Multimodal Serverは、MCPクライアントやコーディングエージェントをOpenRouterに接続し、チャットとマルチモーダル分析・生成を提供します。モデル検索、埋め込み、判定、メディア操作も一つにまとめています。
主な機能
- 01300以上のOpenRouterモデルとのチャット
- 02画像・音声・動画の分析と生成
- 03テキスト生成と音声文字起こし
- 04テキスト埋め込みと構造化判定
- 05モデルの検索・検証・再ランキング
活用シーン
- 01MCPクライアントで複数モデルの回答を比較
- 02画像・音声・動画から情報を抽出
- 03音声・音楽・画像・動画を生成
- 04埋め込み生成や文書の再ランキング
MCP 対応
stdio経由で、チャット、マルチモーダル分析・生成、モデルカタログ、埋め込みなど21のツールをMCPクライアントに公開します。MCP構造化出力と、動画の非同期進捗通知に対応しています。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y @stabgan/openrouter-mcp-multimodalOPENROUTER_API_KEYシークレットOpenRouter API key. Get one free at https://openrouter.ai/keysOPENROUTER_DEFAULT_MODELDefault model for chat + analyze tools. Defaults to nvidia/nemotron-nano-12b-v2-vl:free.OPENROUTER_OUTPUT_DIRSandbox root for save_path on generate_* tools. Defaults to the current working directory.OPENROUTER_MAX_TOKENSシークレットDefault max_tokens for chat_completion when unset in the request.OPENROUTER_PROVIDER_SORTprice / throughput / latencyOPENROUTER_PROVIDER_IGNORECSV of provider slugs to exclude.OPENROUTER_PROVIDER_ORDERJSON array or CSV of preferred provider IDs.OPENROUTER_PROVIDER_QUANTIZATIONSCSV of quantization levels (fp16,int8).OPENROUTER_PROVIDER_REQUIRE_PARAMETERStrue/false. Require providers to support all request params.OPENROUTER_PROVIDER_DATA_COLLECTIONallow/denyOPENROUTER_PROVIDER_ALLOW_FALLBACKStrue/falseOPENROUTER_CACHE_RESPONSESEnable response caching server-wide. Sends X-OpenRouter-Cache: true on every chat/analyze call unless overridden per-request. Zero tokens billed on cache hits.OPENROUTER_INCLUDE_REASONINGEnable reasoning tokens passthrough server-wide. Adds _meta.reasoning to chat_completion responses for DeepSeek R1 / Gemini Thinking / Opus 4.7.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
14掲載時のツール一覧 · 3 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| cache | boolean | いいえ | `X-OpenRouter-Cache: true` で OpenRouter の応答キャッシュを有効にします。サーバー全体のデフォルトは `OPENROUTER_CACHE_RESPONSES=1` で設定できます。 |
| model | string | いいえ | モデル ID(任意、デフォルトを使用)。`:nitro` を付けると最速のバリアント、`:floor` は最安のバリアント、`:exacto` はツール呼び出し精度が最も高いバリアントを使用します。例:`openai/gpt-4o:nitro`。 |
| online | boolean | いいえ | OpenRouter のウェブ検索プラグインを有効にします(Exa ベース、1000 件あたり $4)。 |
| messages | array | はい | |
| provider | object | いいえ | OpenRouter のプロバイダールーティングの上書き設定です。`OPENROUTER_PROVIDER_*` 環境変数のデフォルト値にマージされます。https://openrouter.ai/docs/features/provider-routing を参照してください。 |
| provider.sort | enum | いいえ | price | throughput | latency |
| provider.order | array | いいえ | |
| provider.ignore | array | いいえ | これらのプロバイダー slug を除外します。 |
| provider.quantizations | array | いいえ | 量子化方式でプロバイダーをフィルタリングします(例:`["fp16","int8"]`)。 |
| provider.allow_fallbacks | boolean | いいえ | |
| provider.data_collection | enum | いいえ | allow | deny |
| provider.require_parameters | boolean | いいえ | |
| cache_ttl | string | いいえ | キャッシュ TTL(例:`"5m"`、`"1h"`、`"24h"`、範囲は 1s~24h)。 |
| max_tokens | number | いいえ | completion token の最大数。未設定の場合は `OPENROUTER_MAX_TOKENS` 環境変数にフォールバックします。 |
| cache_clear | boolean | いいえ | このリクエストと完全に一致するキャッシュエントリーを無効化します。 |
| temperature | number | いいえ | |
| web_max_results | number | いいえ | `online: true` の場合のウェブ検索結果の最大数(デフォルトは 5)。 |
| include_reasoning | boolean | いいえ | R1 / Opus 4.7 / Gemini Thinking のモデルの思考過程を `_meta.reasoning` に表示します。 |
詳細
OpenRouter MCP Multimodal
マルチモーダルAIエージェント向けMCPサーバーです。
インストールは1回 · 21個のツール · 300以上のOpenRouterモデル · テキスト、ビジョン、音声、動画の分析と生成。
クイックスタート · ツール · 使用例 · セキュリティ · トラブルシューティング · 開発 · リリース · FAQ
これは何ですか?
OpenRouter MCP Multimodalは、本番環境向けのModel Context Protocol (MCP)サーバーです。公式MCP Registryにio.github.stabgan/openrouter-multimodalとして登録されています。AIコーディングエージェント(Cursor、Claude Desktop、VS Code、Windsurf、Clineなど)を、stdio経由でOpenRouterの統合LLM APIに接続します。
テキスト専用のMCPサーバーとは異なり、1回のインストールでマルチモーダル機能をすべて利用できます。
| 機能 | ツール | 特長 |
|---|---|---|
| チャット | chat_completion, start_chat_completion, get_chat_completion_status | 300 以上のモデル、:nitro / :floor / :free / :online / :exacto サフィックス、プロバイダールーティング、ウェブ検索、応答キャッシュ、推論トークン、推論の労力制御、構造化出力(JSON Schema)、非同期ジョブ、複数モデルの融合、サブエージェントへの委任、応答の修復 |
| ビジョン | analyze_image, generate_image, generate_image_dedicated | OCR、キャプション生成、VQA、参照入力を使った画像生成、解像度/品質/形式を制御できる専用 Image API |
| 音声 | analyze_audio, generate_audio, text_to_speech, speech_to_text | 文字起こし、音声/音楽生成、専用 TTS(Deepgram、ElevenLabs、OpenAI。デフォルトは無料の Deepgram、音声、mp3/pcm)、専用 STT(Whisper、GPT-4o Transcribe、Voxtral、ElevenLabs Scribe) |
| 動画 | analyze_video, generate_video, generate_video_from_image, get_video_status | クリップの理解、Veo 3.1 / Seedance 2.5 / Kling v3.0 / Wan 2.7 / Grok Imagine Video による生成と進捗通知 |
| 埋め込み | embed_text | 37 以上の埋め込みモデル(text-embedding-3-small/large、Nomic、Jina、Voyage など) |
| 意思決定 | decide | 確率を調整した、構造化された yes/no、選択、スコアによる意思決定(System One モデル) |
| カタログ | search_models, get_model_info, validate_model, rerank_documents, health_check | モデルの検索、検証、再ランキング、運用状態の健全性チェック |
本番環境向けの強化: 入出力パスのサンドボックス化(v4.5.2 以降、analyze_* のローカルファイルも対象)、SSRF ガード、_meta.code を含む構造化エラー、MCP 2025-11-25 の構造化出力とツールアイコン、非同期動画の進捗通知、3929 件の自動テスト(3905 件のユニット/モックテスト + 7 件の回帰テスト + 17 件のライブ統合テスト)。
クイックスタート
1. API キーを取得する(無料枠で利用できます)→ openrouter.ai/keys
2. サーバーを実行する
export OPENROUTER_API_KEY=sk-or-v1-...
npx -y @stabgan/openrouter-mcp-multimodal
3. MCP クライアントに追加する — インストールから JSON ブロックを 1 つコピーして、クライアントの設定に貼り付けます。
| クライアント | 設定場所 |
|---|---|
| Cursor | プロジェクト:.cursor/mcp.json · ユーザー:Cursor Settings → MCP |
| Claude Desktop | macOS:~/Library/Application Support/Claude/claude_desktop_config.json · Windows:%APPDATA%\Claude\claude_desktop_config.json |
| VS Code | .vscode/mcp.json(ワークスペース)または User Settings → MCP |
| Windsurf | Windsurf Settings → MCP(Cursor と同じ mcpServers JSON 形式) |
以下の手動設定にある mcpServers オブジェクトを使用してください。
開始時にクレジットは不要です。
google/gemma-4-26b-a4b-it:freeなどの無料モデルは、チャットと画像認識で利用できます。動画/音声の生成には通常、クレジットが必要です。
インストール
MCP サーバーはいくつかのパッケージ形式で配布されています。このサーバーは Node.js/TypeScript で実装されています。以下の表では、各エコシステムの方法を、このサーバーの実行方法に対応付けています。
| 方法 | ランタイム | 最適な用途 | このサーバー |
|---|---|---|---|
| npx | Node.js 22+ | ほとんどの MCP クライアント(デフォルト) | ✅ @stabgan/openrouter-mcp-multimodal |
| uvx / pipx | Python 3.10+ and Node.js 22+ | Python を優先するワークフロー、PyPI の MCP サーバーと同じパターン | ✅ mcp-server-openrouter-multimodal |
| npm global | Node.js 22+ | 再ダウンロードせずにバージョンを固定 | ✅ |
| node (local) | Node.js 22+ | コントリビューター/エアギャップ環境でのビルド | ✅ |
| Docker Hub | Docker | 分離環境、ホストに Node 不要 | ✅ stabgan/openrouter-mcp-multimodal |
| GHCR | Docker | GitHub ネイティブの OCI プル | ✅ ghcr.io/stabgan/openrouter-mcp-multimodal |
| Smithery CLI | Node.js(インストーラー経由) | Claude/Cursor などへの対話型インストール | ✅ |
| MCP Registry | npm または OCI | 公式ディスカバリー(io.github.stabgan/openrouter-multimodal) | ✅ 掲載ページ |
| One-click deeplinks | Node.js | Cursor、VS Code、Kiro | ✅ |
| Claude Code CLI | Node.js | ターミナル中心で Claude Code を使うユーザー | ✅ |
| MCP Inspector | Node.js | ローカルでのデバッグ/ツール一覧表示 | ✅ |
Windows cmd /c npx | Node.js | npx が GUI の PATH にない場合の Claude Desktop/Cursor | ✅ 以下を参照 |
| pip / uv (direct) | — | ネイティブの Python MCP サーバーのみ | — 上記の uvx の行を使用 |
| DXT desktop extensions | — | Claude Desktop にバンドルされた .dxt | 未対応 |
| Remote HTTP / SSE | — | ホスト型 Smithery/Cloudflare エンドポイント | Smithery 経由 |
uvx と npx の違い: MCP エコシステムでは、
npxは npm(Node)パッケージを実行し、uvxは PyPI(Python)パッケージを実行します。このサーバーは Node ベースのため、uvxは薄い Python ランチャー を使ってnpx -y @stabgan/openrouter-mcp-multimodalを実行します。Node のインストールは引き続き必要です。
ワンクリック
| Cursor | |
| VS Code | |
| Kiro | |
| Claude Desktop / Windsurf / Cline | JSON による手動設定(以下の方法から選択してください) |
| Smithery | npx -y @smithery/cli install @stabgan/openrouter-mcp-multimodal --client claude |
| MCP Registry | 公式レジストリページ — npm および OCI パッケージ |
プロンプトが表示されたら OPENROUTER_API_KEY を貼り付けてください。ディープリンクではプレースホルダーを使用するため、シークレットが URL に表示されることはありません。
手動設定
npx(推奨)
export OPENROUTER_API_KEY=sk-or-v1-...
npx -y @stabgan/openrouter-mcp-multimodal
{
"mcpServers": {
"openrouter": {
"command": "npx",
"args": ["-y", "@stabgan/openrouter-mcp-multimodal"],
"env": {
"OPENROUTER_API_KEY": "sk-or-v1-..."
}
}
}
}
リリースを固定する場合:"args": ["-y", "@stabgan/[email protected]"]
uvx / pipx(Python ランチャー)
uv をインストールし(uvx が含まれています)、Node.js 22+ も PATH にあることを確認してから、次を実行します。
export OPENROUTER_API_KEY=sk-or-v1-...
uvx mcp-server-openrouter-multimodal
# pin npm version: OPENROUTER_MCP_NPM_VERSION=5.1.3 uvx mcp-server-openrouter-multimodal
{
"mcpServers": {
"openrouter": {
"command": "uvx",
"args": ["mcp-server-openrouter-multimodal"],
"env": {
"OPENROUTER_API_KEY": "sk-or-v1-..."
}
}
}
}
pipx の場合: pipx run mcp-server-openrouter-multimodal
任意:OPENROUTER_MCP_NPM_VERSION=5.1.3 を指定すると、基盤となる npm パッケージのバージョンを固定できます。
npm グローバルインストール
npm install -g @stabgan/openrouter-mcp-multimodal
{
"mcpServers": {
"openrouter": {
"command": "openrouter-multimodal",
"env": { "OPENROUTER_API_KEY": "sk-or-v1-..." }
}
}
}
node(ローカルクローン)
git clone https://github.com/stabgan/openrouter-mcp-multimodal.git
cd openrouter-mcp-multimodal
npm ci && npm run build
{
"mcpServers": {
"openrouter": {
"command": "node",
"args": ["/absolute/path/to/openrouter-mcp-multimodal/dist/index.js"],
"env": { "OPENROUTER_API_KEY": "sk-or-v1-..." }
}
}
}
Docker
docker run --rm -i -e OPENROUTER_API_KEY=sk-or-v1-... stabgan/openrouter-mcp-multimodal:latest
{
"mcpServers": {
"openrouter": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-e",
"OPENROUTER_API_KEY=sk-or-v1-...",
"stabgan/openrouter-mcp-multimodal:latest"
]
}
}
}
-i(対話型 stdio)を使用してください。-t は避けてください(一部のホストでは TTY によって MCP のフレーミングが破損します)。
GHCR(GitHub Container Registry)
docker run --rm -i -e OPENROUTER_API_KEY=sk-or-v1-... \
ghcr.io/stabgan/openrouter-mcp-multimodal:5.1.3
{
"mcpServers": {
"openrouter": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-e",
"OPENROUTER_API_KEY=sk-or-v1-...",
"ghcr.io/stabgan/openrouter-mcp-multimodal:5.1.3"
]
}
}
}
Smithery
対話形式でインストールします(クライアントの設定を書き込みます)。
npx -y @smithery/cli install @stabgan/openrouter-mcp-multimodal --client claude
# or: --client cursor | vscode | windsurf | ...
MCP Registry
正式名称:io.github.stabgan/openrouter-multimodal
- レジストリ:registry.modelcontextprotocol.io
- npm パッケージ:
@stabgan/openrouter-mcp-multimodal - OCI イメージ:
docker.io/stabgan/openrouter-mcp-multimodal
レジストリ経由のインストールに対応するクライアントでは、npm または Docker を選択できます。それ以外の場合は、上記の JSON ブロックを使用してください。
Claude Code CLI
claude mcp add openrouter -- npx -y @stabgan/openrouter-mcp-multimodal
# project scope:
claude mcp add --scope project openrouter -- npx -y @stabgan/openrouter-mcp-multimodal
Claude Code を起動する前に、シェルまたはクライアントの環境変数に OPENROUTER_API_KEY を設定してください。
MCP Inspector
有効な OpenRouter キーを使って、tools/list とツール呼び出しをデバッグします。
export OPENROUTER_API_KEY=sk-or-v1-...
npx -y @modelcontextprotocol/inspector npx -y @stabgan/openrouter-mcp-multimodal
Windows npx
Claude Desktop または Cursor が npx を見つけられない場合(GUI アプリではシェルの PATH が引き継がれないことがよくあります)、cmd でラップしてください。
{
"mcpServers": {
"openrouter": {
"command": "cmd",
"args": ["/c", "npx", "-y", "@stabgan/openrouter-mcp-multimodal"],
"env": { "OPENROUTER_API_KEY": "sk-or-v1-..." }
}
}
}
それでも失敗する場合は、where npx で確認できるフルパスをコマンドとして使用してください。
このサーバーを選ぶ理由
| 機能 | このサーバー | 一般的な MCP LLM サーバー |
|---|---|---|
| テキストチャット(300+ モデル) | ✅ | ✅ |
| 画像分析+生成 | ✅ | 一部対応 |
| 音声分析+TTS+STT | ✅ | ❌ |
| 動画分析+生成 | ✅ | ❌ |
| ベクトル埋め込み(37+ モデル) | ✅ | ❌ |
| 構造化された判断(System One) | ✅ | ❌ |
| モデルの検索/検証/再ランキング | ✅ | ❌ |
| パスのサンドボックス化+SSRF 対策 | ✅ | まれ |
| MCP 2025 の構造化出力 | ✅ | まれ |
| 非同期動画+進捗通知 | ✅ | ❌ |
ツール
MCP ツールは 21 個あります。それぞれの説明には、エージェントが適切なツールを選び、エラーから復旧できるよう、使用する場面、適切な例/不適切な例、失敗する場合、連携する対象が記載されています。
| ツール | 用途 |
|---|---|
chat_completion | テキストチャット、ウェブ検索、プロバイダーのルーティング、キャッシュ、推論、構造化出力 |
start_chat_completion | 長時間実行される推論モデル向けの非同期バックグラウンドジョブ |
get_chat_completion_status | 非同期完了結果のポーリング/取得 |
analyze_image | 画像認識 — ローカルパス、URL、またはデータ URL と question |
analyze_audio | 音声ファイルの文字起こし/分析 |
analyze_video | 動画ファイルの説明/質疑応答 |
generate_image | 参照画像を使用した、チャット補完によるテキストから画像への生成 |
generate_image_dedicated | 専用の /api/v1/images によるテキストから画像への生成(解像度、品質、形式) |
generate_audio | チャット補完によるテキスト読み上げ/音楽生成 |
text_to_speech | 専用 TTS(/api/v1/audio/speech)— Deepgram、ElevenLabs、OpenAI、音声、速度、mp3/pcm |
speech_to_text | 専用 STT(/api/v1/audio/transcriptions)— Whisper、GPT-4o Transcribe、Voxtral、ElevenLabs Scribe |
generate_video | テキストから動画への生成(非同期、再開可能) |
generate_video_from_image | 画像から動画への生成(より限定されたスキーマ) |
get_video_status | 動画ジョブのポーリング/再開 |
search_models | ページネーション対応のモデルカタログ検索 |
get_model_info | 料金、コンテキスト、モダリティ |
validate_model | モデル ID の存在を低コストで確認 |
rerank_documents | RAG 向けの関連度ランキング |
embed_text | ベクトル埋め込み(37 以上のモデル:text-embedding-3-small/large、Nomic など) |
decide | 調整済み確率を伴う構造化された意思決定(System One モデル) |
health_check | API キーと接続性の確認 |
すべてのエラーには、閉じた分類体系(13 コード)に基づく _meta.code が含まれます。プログラムで処理する場合は、これらの値で分岐してください。
_meta.code | 意味 | 対処 |
|---|---|---|
INVALID_INPUT | 引数が不正、または不足しています | 正しいスキーマについてツールの説明を確認してください |
INVALID_CREDENTIALS | API キーがない、無効、または失効しています | openrouter.ai/keys で再生成してください |
UNSAFE_PATH | ローカルパスが入力/出力サンドボックスの外にあります | ファイルを OPENROUTER_INPUT_DIR / OPENROUTER_OUTPUT_DIR の下に移動してください |
UPSTREAM_HTTP | OpenRouter から認証以外の HTTP エラー(4xx/5xx)が返されました | _meta.details.status を確認し、一時的なエラーであれば再試行してください |
UPSTREAM_TIMEOUT | アップストリームから時間内に応答がありませんでした | 再試行するか、応答の遅いモデルには start_chat_completion を使用してください |
UPSTREAM_REFUSED | コンテンツポリシー、レート制限、またはクレジット不足が原因です | _meta.retry_after_seconds を確認し、プロンプトを見直すかクレジットを追加してください |
UNSUPPORTED_FORMAT | ファイルが認識可能なメディア形式ではありません | ファイルの種類がツールの想定と一致していることを確認してください |
RESOURCE_TOO_LARGE | ファイルが取得/インライン表示のサイズ上限を超えています | ファイルを小さくするか、インライン表示を避けるために save_path を使用してください |
ZDR_INCOMPATIBLE | モデル/プロバイダーでゼロデータ保持が必要です | ZDR 対応のプロバイダーまたは別のモデルを使用してください |
MODEL_NOT_FOUND | OpenRouter のカタログにモデルのスラッグがありません | 先に validate_model または search_models を実行してください |
JOB_FAILED | プロバイダー側で非同期ジョブ(動画/チャット)が失敗しました | _meta.details を確認し、再試行するかモデルを変更してください |
JOB_STILL_RUNNING | 非同期ジョブはまだ完了していません(エラーではありません) | get_video_status / get_chat_completion_status を呼び出して状態を確認してください |
INTERNAL | 予期しないサーバー側エラーです | 再現する場合は報告してください |
エラーには、利用可能な場合、エージェント向けの次の手順を示す _meta.suggestions が含まれます。
バイナリツールの結果(v4.7.0+)
ツール(generate_image、generate_image_dedicated、generate_audio、text_to_speech、generate_video、generate_video_from_image、get_video_status)は、画像、音声、または動画のバイトデータを返します。4.7.0 以降、この動作が明確になりました。
save_path | ツールの結果 |
|---|---|
| 設定済み | テキストポインターのみ — 例:Image saved to: out.png (… bytes, image/png) と _meta.save_path。インラインの base64 は含まれません(MCP チャネルで大きなペイロードが重複するのを防ぎます)。 |
| 未設定、バイト数が上限未満 | インラインのメディアブロック と 要約テキスト(画像/音声には MCP の image/audio タイプを使用し、動画には MCP の resource ブロックを使用します)。 |
| 未設定、バイト数が上限超過 | save_path を指定するよう案内するテキストのみ。 |
インラインのデフォルト上限(種類ごと、または全体で上書きできます)。
| 種類 | デフォルト | 環境変数(優先順位:種類ごと → 全体) |
|---|---|---|
| 画像 | 1 MiB | OPENROUTER_IMAGE_INLINE_MAX_BYTES → OPENROUTER_INLINE_MAX_BYTES |
| 音声 | 1 MiB | OPENROUTER_AUDIO_INLINE_MAX_BYTES → OPENROUTER_INLINE_MAX_BYTES |
| 動画 | 10 MiB | OPENROUTER_VIDEO_INLINE_MAX_BYTES → OPENROUTER_INLINE_MAX_BYTES |
以前、同じツール結果で保存ファイル と インラインメディアの両方を利用していた場合は、_meta.save_path からファイルを読み取ってください(または、上限未満のときにインラインメディアを取得するには save_path を省略してください)。
例
チャット(無料モデル)
{
"tool": "chat_completion",
"arguments": {
"model": "google/gemma-4-26b-a4b-it:free",
"messages": [{ "role": "user", "content": "Summarize MCP in one sentence." }]
}
}
構造化出力を使ったチャット(JSON Schema)
{
"tool": "chat_completion",
"arguments": {
"model": "openai/gpt-4o",
"messages": [{ "role": "user", "content": "Extract the name and age from: 'Alice is 30 years old.'" }],
"response_format": {
"type": "json_schema",
"json_schema": {
"name": "person",
"schema": {
"type": "object",
"properties": {
"name": { "type": "string" },
"age": { "type": "integer" }
},
"required": ["name", "age"]
}
}
}
}
}
スキーマなしでよりシンプルな JSON を使うには、
"response_format": { "type": "json_object" }を使用してください。不正な形式の JSON を自動修正するには、"response_healing": trueを追加してください。
画像を分析する
{
"tool": "analyze_image",
"arguments": {
"image_path": "diagram.png",
"question": "List every label in this diagram."
}
}
image/promptではなく、image_pathとquestionを使用してください。
モデルを検索する(ビジョン + 無料)
{
"tool": "search_models",
"arguments": {
"query": "gemma",
"capabilities": { "vision": true },
"limit": 10,
"offset": 0
}
}
動画を生成する(非同期)
{
"tool": "generate_video",
"arguments": {
"model": "google/veo-3.1",
"prompt": "Ocean waves at sunrise, cinematic drone shot",
"duration": 4,
"save_path": "river.mp4"
}
}
max_wait_ms の経過時点でジョブがまだ実行中の場合、レスポンスは _meta.code: JOB_STILL_RUNNING と video_id を含んで正常に返ります。再開するには get_video_status を呼び出してください。これはエラーではありません。
(上記のように)save_path を設定すると、完了時の結果は保存ファイルへのテキストポインターになります。インライン動画ではありません。バイナリツールの結果を参照してください。
テキストを埋め込む(ベクトル埋め込み)
{
"tool": "embed_text",
"arguments": {
"texts": ["What is MCP?", "Model Context Protocol enables tool use for LLMs."],
"model": "openai/text-embedding-3-small",
"dimensions": 1024
}
}
RAG、セマンティック検索、またはクラスタリング用の埋め込み配列を返します。37 以上のモデルに対応しています。単一の文字列、または最大 2048 件のテキストを含む配列を渡してください。
構造化された判定(System One)
{
"tool": "decide",
"arguments": {
"questions": {
"is_bug": {
"type": "noul",
"instructions": "Is this a bug report or a feature request?",
"criteria": {
"true": "Describes broken or incorrect behavior",
"false": "Requests new functionality"
}
}
},
"state": {
"ticket": "The login button does not respond when clicked on Safari."
}
}
}
生成テキストの代わりに、較正済みの確率を返します。質問の種類は 3 つです。noul(はい/いいえ)、choice(カテゴリを 1 つ選択)、score(順序尺度の評価基準)。モデル:typesafe/jev-1.13(デフォルト)、upstage/solar-decide、microsoft/decision-1。
その他の例:docs/plans/tool-description-improvement.md
セキュリティ
- 入力パスのサンドボックス化 —
analyze_*のローカルパスと参照画像は、OPENROUTER_INPUT_DIR(未設定の場合はOPENROUTER_OUTPUT_DIR、次にcwd)の範囲内にある必要があります - 出力パスのサンドボックス化 —
save_pathはOPENROUTER_OUTPUT_DIRの範囲内にある必要があります - 非同期ジョブの読み取り —
get_chat_completion_statusは、ディスク上のパスをOPENROUTER_OUTPUT_DIR/openrouter-jobs/以下に限定して解決します(4.7.0+) - SSRF 対策 — URL の取得時にプライベート IP と予約済み IP をブロックします
- 信頼できないコンテンツ — 分析結果には
_meta.content_is_untrusted: trueのタグが付けられます - プロトタイプ汚染への対策 — すべての API 出力境界(モデルレコード、埋め込み、判定、再ランク付け結果、ログコンテキスト)で、
__proto__、constructor、prototypeキーを再帰的に除去してから MCP クライアントに転送します - シークレットのマスキング — stderr の JSON ロガーは API キーと機密値をマスキングします。stdout は MCP プロトコルのトラフィック専用です
サンドボックスを無効にする場合は、OPENROUTER_ALLOW_UNSAFE_PATHS=1 を設定してください(非推奨)。
脆弱性の報告先:SECURITY.md(非公開で報告してください。エクスプロイトを公開イシューとして投稿しないでください)。
設定
環境変数
| 変数 | 必須 | デフォルト | 説明 |
|---|---|---|---|
OPENROUTER_API_KEY | はい | — | OpenRouter API キー |
OPENROUTER_DEFAULT_MODEL | いいえ | google/gemma-4-26b-a4b-it:free | ツールで model が省略された場合のデフォルト |
OPENROUTER_OUTPUT_DIR | いいえ | cwd | save_path のサンドボックスルート |
OPENROUTER_INPUT_DIR | いいえ | OUTPUT_DIR または cwd | ローカル入力ファイルのサンドボックスルート |
OPENROUTER_INLINE_MAX_BYTES | いいえ | 1048576(画像/音声) | インラインメディアの全体上限 |
OPENROUTER_IMAGE_INLINE_MAX_BYTES | いいえ | 全体上限にフォールバック | 種類別のインライン上限 |
OPENROUTER_AUDIO_INLINE_MAX_BYTES | いいえ | 全体上限にフォールバック | 種類別のインライン上限 |
OPENROUTER_VIDEO_INLINE_MAX_BYTES | いいえ | 10485760 | 動画のインライン上限 |
OPENROUTER_LOG_LEVEL | いいえ | info | error/warn/info/debug |
全項目については .env.example を参照してください(プロバイダーのルーティング、取得上限、キャッシュ、動画のポーリング、非同期ジョブ、統合テストのオーバーライド)。
開発
git clone https://github.com/stabgan/openrouter-mcp-multimodal.git
cd openrouter-mcp-multimodal
npm install
cp .env.example .env # add OPENROUTER_API_KEY
npm run build
テスト
| コマンド | 実行内容 |
|---|---|
npm test | 3905 件の単体テストとモックテスト(API キー不要、<20s) |
npm run test:regression | 7 件のセキュリティおよびスキーマ回帰ガード |
npm run test:integration | 17 件の OpenRouter ライブシナリオ(.env キーが必要) |
npm run test:e2e | MCP stdio のスモークテスト一式(scripts/live-e2e.mjs) |
npm run ci | lint + format + version sync + build + 全テスト |
CI/クレジット残高がゼロのアカウント向け無料モデル: 統合テストでは、デフォルトで google/gemma-4-26b-a4b-it:free を使用します(OPENROUTER_INTEGRATION_MODEL で変更できます)。GitHub Actions では、リポジトリシークレット OPENROUTER_API_KEY が必要です。
モックテストは src/__tests__/mock/ にあり、ハンドラー、パスのサンドボックス化、SSRF のブロック、モデルキャッシュのページネーション、ツールの説明、構造化出力をカバーします。コアスイートに加え、396 件のテストケースがあります。
npm run lint
npm run format:check
npm run version:check # package.json vs src/version.ts, server.json, pyproject.toml
リリース
公開される成果物(npm、PyPI/uvx、Docker、GHCR)はすべて、Git タグ(vX.Y.Z)の同じセマンティックバージョンから配布されます。main へのプッシュではテストが実行されますが、npm や PyPI には公開されません。
通常のフロー: conventional commits を main にマージ → Release Please がリリース PR を作成 → マージ → タグが作成される → CI がすべての配布先に公開します。
手動のフロー: すべてのバージョンファイルを更新 → npm run version:check → npm run ci とスモークテスト → コミット → git tag vX.Y.Z → git push origin vX.Y.Z。
完全なチェックリスト、ファイル一覧、CI シークレット、エージェント向けの手順については、以下をご覧ください。
docs/RELEASING.md— メンテナー向けリリースガイドAGENTS.md— AI エージェント向けクイックリファレンス
トラブルシューティング
| 症状 | 考えられる原因 | 対処法 |
|---|---|---|
サーバーがすぐに終了する/OPENROUTER_API_KEY is required | API キーが未設定または空 | クライアントの env またはシェルで OPENROUTER_API_KEY を設定します。openrouter.ai/keys で取得できます |
_meta.code: INVALID_CREDENTIALS または HTTP 401 | キーが無効、または失効している | openrouter.ai/keys で再生成し、MCP クライアントを再起動します |
_meta.code: MODEL_NOT_FOUND | モデル ID の入力ミス、または廃止 | search_models または validate_model を実行し、openrouter.ai/models を確認します |
| HTTP 402/クレジット不足 | 有料モデル、または残高ゼロでの生成 | openrouter.ai/credits でクレジットを追加するか、:free モデルを使用します |
429 を伴う _meta.code: UPSTREAM_HTTP | レート制限 | _meta.retry_after_seconds があればその時間だけ待ち、同時実行数を減らします |
_meta.code: UNSAFE_PATH | サンドボックス外のローカルパス | ファイルを OPENROUTER_INPUT_DIR 配下に置くか、OPENROUTER_OUTPUT_DIR をより広いパスに設定します。セキュリティを参照してください |
npx が見つからない(Windows GUI アプリ) | GUI の PATH がターミナルと異なる | Windows npx の cmd /c ラッパーを使用します |
| アップグレード後にインライン画像/音声が表示されない | save_path が設定された v4.7.0 | 想定どおりです。結果はテキストと _meta.save_path のみです。save_path を省略するか、保存されたファイルを読み取ってください |
| MCP クライアントに古いツール一覧が表示される | クライアントのキャッシュ | パッケージのバージョン指定を更新した後、MCP を再起動するか、ウィンドウを再読み込みします |
構造化エラーには、利用可能な場合、エージェント向けの次の手順を示す _meta.suggestions が含まれます。
FAQ
OpenRouter の有料クレジットは必要ですか?
いいえ。まずは無料で始められます。無料モデルはチャットと画像認識に使用できます。音声/動画の生成には通常クレジットが必要です。一部のモデルでは分析時に 402 が返されることがありますが、サーバーはそれを構造化エラーとして通知します。
どの MCP クライアントに対応していますか?
stdio 経由で MCP に対応するクライアントなら、どれでも使用できます。Cursor、Claude Desktop、VS Code Copilot、Windsurf、Cline、Kiro、カスタムエージェントに対応しています。
OpenRouter を直接呼び出す場合との違いは何ですか?
このサーバーは、MCP ツールのスキーマ、セキュリティサンドボックス、エラー分類、モデルのキャッシュ、進捗通知に対応した非同期動画ポーリング、エージェント向けのツールの説明を追加します。これにより、LLM はカスタムの HTTP 接続処理を記述しなくても、適切な機能を呼び出せます。
パストラバーサルに関するセキュリティアドバイザリはどこにありますか?
4.5.2+ で修正済みです。GHSA-3q7p-736f-x44v、SECURITY.md、docs/solutions/security-issues/ を参照してください。
互換性
あらゆる MCP クライアントで動作します。プロトコル:MCP 2025-11-25(2025-06-18 以前との後方互換性があります)。Node ≥ 22(Docker イメージでは Node 24 を使用します)。
ライセンス
Apache 2.0 — LICENSE を参照してください。
コントリビューション
Issue や PR を歓迎します。大規模な変更の場合は、まず Issue を作成してください。
提出前に、npm run ci を実行してください。Release Please で次のリリースを作成できるよう、Conventional Commits(fix:、feat: など)を使用してください。バージョンをリリースする場合は、docs/RELEASING.md を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。