mcpField
O
OpenRouter MCP Multimodal Server

OpenRouter MCP Multimodal Server

ローカル
npmjs.comAI・エージェント1014 日前に更新

OpenRouter MCP Multimodal Server について

OpenRouter MCP Multimodal Serverは、MCPクライアントやコーディングエージェントをOpenRouterに接続し、チャットとマルチモーダル分析・生成を提供します。モデル検索、埋め込み、判定、メディア操作も一つにまとめています。

主な機能

  1. 01300以上のOpenRouterモデルとのチャット
  2. 02画像・音声・動画の分析と生成
  3. 03テキスト生成と音声文字起こし
  4. 04テキスト埋め込みと構造化判定
  5. 05モデルの検索・検証・再ランキング

活用シーン

  1. 01MCPクライアントで複数モデルの回答を比較
  2. 02画像・音声・動画から情報を抽出
  3. 03音声・音楽・画像・動画を生成
  4. 04埋め込み生成や文書の再ランキング

MCP 対応

stdio経由で、チャット、マルチモーダル分析・生成、モデルカタログ、埋め込みなど21のツールをMCPクライアントに公開します。MCP構造化出力と、動画の非同期進捗通知に対応しています。

設定

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

mcp.json · 共通設定
{
"mcpServers": {
"openrouter-mcp-multimodal": {
"command": "npx",
"args": [
"-y",
"@stabgan/openrouter-mcp-multimodal"
],
"env": {
"OPENROUTER_API_KEY": "<OPENROUTER_API_KEY>",
"OPENROUTER_DEFAULT_MODEL": "<OPENROUTER_DEFAULT_MODEL>",
"OPENROUTER_OUTPUT_DIR": "<OPENROUTER_OUTPUT_DIR>",
"OPENROUTER_MAX_TOKENS": "<OPENROUTER_MAX_TOKENS>",
"OPENROUTER_PROVIDER_SORT": "<OPENROUTER_PROVIDER_SORT>",
"OPENROUTER_PROVIDER_IGNORE": "<OPENROUTER_PROVIDER_IGNORE>",
"OPENROUTER_PROVIDER_ORDER": "<OPENROUTER_PROVIDER_ORDER>",
"OPENROUTER_PROVIDER_QUANTIZATIONS": "<OPENROUTER_PROVIDER_QUANTIZATIONS>",
"OPENROUTER_PROVIDER_REQUIRE_PARAMETERS": "<OPENROUTER_PROVIDER_REQUIRE_PARAMETERS>",
"OPENROUTER_PROVIDER_DATA_COLLECTION": "<OPENROUTER_PROVIDER_DATA_COLLECTION>",
"OPENROUTER_PROVIDER_ALLOW_FALLBACKS": "<OPENROUTER_PROVIDER_ALLOW_FALLBACKS>",
"OPENROUTER_CACHE_RESPONSES": "<OPENROUTER_CACHE_RESPONSES>",
"OPENROUTER_INCLUDE_REASONING": "<OPENROUTER_INCLUDE_REASONING>"
}
}
}
}
起動コマンドnpx -y @stabgan/openrouter-mcp-multimodal
設定が必要な環境変数
OPENROUTER_API_KEYシークレットOpenRouter API key. Get one free at https://openrouter.ai/keys
OPENROUTER_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 / latency
OPENROUTER_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/deny
OPENROUTER_PROVIDER_ALLOW_FALLBACKStrue/false
OPENROUTER_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 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npm@stabgan/openrouter-mcp-multimodal4.5.1
ocidocker.io/stabgan/openrouter-mcp-multimodal:4.5.1

ツール

14

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

パラメーター型必須説明
cachebooleanいいえ`X-OpenRouter-Cache: true` で OpenRouter の応答キャッシュを有効にします。サーバー全体のデフォルトは `OPENROUTER_CACHE_RESPONSES=1` で設定できます。
modelstringいいえモデル ID(任意、デフォルトを使用)。`:nitro` を付けると最速のバリアント、`:floor` は最安のバリアント、`:exacto` はツール呼び出し精度が最も高いバリアントを使用します。例:`openai/gpt-4o:nitro`。
onlinebooleanいいえOpenRouter のウェブ検索プラグインを有効にします(Exa ベース、1000 件あたり $4)。
messagesarrayはい
providerobjectいいえOpenRouter のプロバイダールーティングの上書き設定です。`OPENROUTER_PROVIDER_*` 環境変数のデフォルト値にマージされます。https://openrouter.ai/docs/features/provider-routing を参照してください。
provider.sortenumいいえprice | throughput | latency
provider.orderarrayいいえ
provider.ignorearrayいいえこれらのプロバイダー slug を除外します。
provider.quantizationsarrayいいえ量子化方式でプロバイダーをフィルタリングします(例:`["fp16","int8"]`)。
provider.allow_fallbacksbooleanいいえ
provider.data_collectionenumいいえallow | deny
provider.require_parametersbooleanいいえ
cache_ttlstringいいえキャッシュ TTL(例:`"5m"`、`"1h"`、`"24h"`、範囲は 1s~24h)。
max_tokensnumberいいえcompletion token の最大数。未設定の場合は `OPENROUTER_MAX_TOKENS` 環境変数にフォールバックします。
cache_clearbooleanいいえこのリクエストと完全に一致するキャッシュエントリーを無効化します。
temperaturenumberいいえ
web_max_resultsnumberいいえ`online: true` の場合のウェブ検索結果の最大数(デフォルトは 5)。
include_reasoningbooleanいいえR1 / Opus 4.7 / Gemini Thinking のモデルの思考過程を `_meta.reasoning` に表示します。

詳細

OpenRouter MCP Multimodal — チャット、ビジョン、音声、動画のAIツール向けMCPサーバー

OpenRouter MCP Multimodal

マルチモーダルAIエージェント向けMCPサーバーです。
インストールは1回 · 21個のツール · 300以上のOpenRouterモデル · テキスト、ビジョン、音声、動画の分析と生成。

npm バージョン PyPI バージョン GitHub リリース Docker バージョン CI ステータス Apache 2.0 ライセンス Node.js 22+

npm ダウンロード数 Docker プル数 MCP Registry Smithery MCP レジストリ

クイックスタート · ツール · 使用例 · セキュリティ · トラブルシューティング · 開発 · リリース · 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_status300 以上のモデル、:nitro / :floor / :free / :online / :exacto サフィックス、プロバイダールーティング、ウェブ検索、応答キャッシュ、推論トークン、推論の労力制御、構造化出力(JSON Schema)、非同期ジョブ、複数モデルの融合、サブエージェントへの委任、応答の修復
ビジョンanalyze_image, generate_image, generate_image_dedicatedOCR、キャプション生成、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_text37 以上の埋め込みモデル(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 DesktopmacOS:~/Library/Application Support/Claude/claude_desktop_config.json · Windows:%APPDATA%\Claude\claude_desktop_config.json
VS Code.vscode/mcp.json(ワークスペース)または User Settings → MCP
WindsurfWindsurf Settings → MCP(Cursor と同じ mcpServers JSON 形式)

以下の手動設定にある mcpServers オブジェクトを使用してください。

開始時にクレジットは不要です。 google/gemma-4-26b-a4b-it:free などの無料モデルは、チャットと画像認識で利用できます。動画/音声の生成には通常、クレジットが必要です。

インストール

MCP サーバーはいくつかのパッケージ形式で配布されています。このサーバーは Node.js/TypeScript で実装されています。以下の表では、各エコシステムの方法を、このサーバーの実行方法に対応付けています。

方法ランタイム最適な用途このサーバー
npxNode.js 22+ほとんどの MCP クライアント(デフォルト)✅ @stabgan/openrouter-mcp-multimodal
uvx / pipxPython 3.10+ and Node.js 22+Python を優先するワークフロー、PyPI の MCP サーバーと同じパターン✅ mcp-server-openrouter-multimodal
npm globalNode.js 22+再ダウンロードせずにバージョンを固定✅
node (local)Node.js 22+コントリビューター/エアギャップ環境でのビルド✅
Docker HubDocker分離環境、ホストに Node 不要✅ stabgan/openrouter-mcp-multimodal
GHCRDockerGitHub ネイティブの OCI プル✅ ghcr.io/stabgan/openrouter-mcp-multimodal
Smithery CLINode.js(インストーラー経由)Claude/Cursor などへの対話型インストール✅
MCP Registrynpm または OCI公式ディスカバリー(io.github.stabgan/openrouter-multimodal)✅ 掲載ページ
One-click deeplinksNode.jsCursor、VS Code、Kiro✅
Claude Code CLINode.jsターミナル中心で Claude Code を使うユーザー✅
MCP InspectorNode.jsローカルでのデバッグ/ツール一覧表示✅
Windows cmd /c npxNode.jsnpx が 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 のインストールは引き続き必要です。

ワンクリック
CursorOpenRouter MCP を Cursor に追加
VS CodeVS Code に追加
KiroKiro に追加
Claude Desktop / Windsurf / ClineJSON による手動設定(以下の方法から選択してください)
Smitherynpx -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 | ...

掲載ページ:smithery.ai/server/@stabgan/openrouter-mcp-multimodal

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_documentsRAG 向けの関連度ランキング
embed_textベクトル埋め込み(37 以上のモデル:text-embedding-3-small/large、Nomic など)
decide調整済み確率を伴う構造化された意思決定(System One モデル)
health_checkAPI キーと接続性の確認

すべてのエラーには、閉じた分類体系(13 コード)に基づく _meta.code が含まれます。プログラムで処理する場合は、これらの値で分岐してください。

_meta.code意味対処
INVALID_INPUT引数が不正、または不足しています正しいスキーマについてツールの説明を確認してください
INVALID_CREDENTIALSAPI キーがない、無効、または失効していますopenrouter.ai/keys で再生成してください
UNSAFE_PATHローカルパスが入力/出力サンドボックスの外にありますファイルを OPENROUTER_INPUT_DIR / OPENROUTER_OUTPUT_DIR の下に移動してください
UPSTREAM_HTTPOpenRouter から認証以外の 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_FOUNDOpenRouter のカタログにモデルのスラッグがありません先に 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 MiBOPENROUTER_IMAGE_INLINE_MAX_BYTES → OPENROUTER_INLINE_MAX_BYTES
音声1 MiBOPENROUTER_AUDIO_INLINE_MAX_BYTES → OPENROUTER_INLINE_MAX_BYTES
動画10 MiBOPENROUTER_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いいえcwdsave_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いいえinfoerror/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 test3905 件の単体テストとモックテスト(API キー不要、<20s)
npm run test:regression7 件のセキュリティおよびスキーマ回帰ガード
npm run test:integration17 件の OpenRouter ライブシナリオ(.env キーが必要)
npm run test:e2eMCP stdio のスモークテスト一式(scripts/live-e2e.mjs)
npm run cilint + 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 requiredAPI キーが未設定または空クライアントの 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 を参照してください。

コメント

MCP は初めてですか?

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

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