LLM Wrapper MCP Server について
LLM Wrapper MCP Serverは、OpenRouterや設定可能なAPIエンドポイント経由でLLMを呼び出し、タスクを委任するAgent向けのSTDIOベースのMCPサーバーです。`llm_call`ツールを提供し、`llm-accounting`による利用記録と監査にも対応します。
主な機能
- 01STDIOベースのMCPサーバー
- 02`llm_call`ツール
- 03モデルとAPIエンドポイントの設定
- 04ツール呼び出し対応
- 05利用記録と監査
活用シーン
- 01MCPエージェントからのLLM呼び出し
- 02個別の呼び出しでモデルを選択
- 03LLMの利用状況とクエリの確認
MCP 対応
`stdin`と`stdout`上のJSON-RPCでMCPクライアントと通信します。モデル呼び出し用の`llm_call`を提供し、MCPツール呼び出しに対応します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
LLM Wrapper MCP Server
「MCP 対応のあらゆる LLM エージェントが、OpenRouter.ai API を通じて利用可能な他のあらゆる LLM と通信したり、タスクを委任したりできるようにします。」
さまざまな大規模言語モデル(LLM)と標準化されたインターフェースを介してシームレスにやり取りできるように設計された、Model Context Protocol(MCP)サーバーラッパーです。このプロジェクトでは、LLM 呼び出し、ツールの実行、結果の処理を行う、堅牢で柔軟な STDIO ベースのサーバーを提供することで、開発者が LLM の機能をアプリケーションに統合できるようにします。
特長
- 標準化された LLM とのやり取りを実現するため、Model Context Protocol(MCP)の仕様を実装しています。
- 標準入出力を介して LLM リクエストとレスポンスを処理する、STDIO ベースのサーバーを提供します。
- MCP プロトコルを通じたツール呼び出しや結果の受け渡しなど、高度な機能をサポートします。
- API のベース URL とモデルパラメーターを通じて、さまざまな LLM プロバイダー(OpenRouter、ローカルモデルなど)を使用するように設定できます。
- 拡張性を考慮して設計されており、新しい LLM バックエンドを簡単に統合できます。
- 堅牢なロギング、レート制限、監査機能を実現するために
llm-accountingと統合されています。これにより、リモート LLM の使用状況や推論コストを監視し、デバッグや法的目的のためにクエリとレスポンスを調査できます。
依存関係
このプロジェクトは、以下の主要な依存関係を使用しています。
コア依存関係
pydantic:Python の型ヒントを使用したデータ検証と設定管理。pydantic-settings:環境変数と設定を管理する Pydantic の機能。python-dotenv:.envファイルからキーと値のペアを読み取り、環境変数として設定します。requests:Python 向けの洗練されたシンプルな HTTP ライブラリ。tiktoken:OpenAI のモデルで使用できる、高速な BPE トークナイザー。llm-accounting:堅牢なロギング、レート制限、監査機能を提供します。
開発用依存関係
-
pytest:成熟したフル機能の Python テストフレームワーク。 -
black:妥協のない Python コードフォーマッター。 -
isort:インポートをアルファベット順に並べ替え、セクションと種類ごとに自動で分割する Python ユーティリティ/ライブラリ。 -
mypy:Python 用のオプションの静的型チェッカー。 -
pytest-mock:モックを簡単に利用できるmockerフィクスチャを提供する pytest プラグイン。
インストール
llm-wrapper-mcp-server パッケージは PyPI で公開されており、pip でインストールできます。
pip install llm-wrapper-mcp-server
または、ローカル開発やソースからのインストールの場合:
- 仮想環境を作成して有効化します。
python -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
- パッケージをインストールします。
pip install -e .
設定
プロジェクトのルートに .env ファイルを作成し、次の変数を設定します。
OPENROUTER_API_KEY=your_openrouter_api_key_here
サーバーはデフォルトで OpenRouter を使用するように設定されています。API キーは OPENROUTER_API_KEY 環境変数から読み込まれます。使用する LLM モデルと API のベース URL は、主にサーバー実行時のコマンドライン引数で設定します(下記参照)。
CLI 引数で上書きされない場合のデフォルト設定:
- LLMClient の API ベース URL:https://openrouter.ai/api/v1(
LLM_API_BASE_URL環境変数または--llm-api-base-urlCLI 引数で上書きできます) - LLMClient のデフォルトモデル:perplexity/llama-3.1-sonar-small-128k-online(
--modelCLI 引数で上書きできます)
使用方法
概要(テキスト):
- エージェントソフトウェアは、MCP プロトコル(stdin/stdout)を介して LLM Wrapper MCP Server と通信します。
- LLM Wrapper MCP Server は、LLM API の呼び出しとレスポンスのために、LLM プロバイダー(OpenRouter.ai など)とやり取りします。
- サーバーは、ロギングと監査のために LLM 会計システムとも統合されています。
- 主なコンポーネント:
- MCP 通信ハンドラー
- LLM クライアント
- ツール実行機能
- LLM 会計の統合
サーバーの実行
サーバーを実行するには、次のコマンドを実行します。
python -m llm_wrapper_mcp_server [OPTIONS]
例:
python -m llm_wrapper_mcp_server --model your-org/your-model-name --log-level DEBUG
python -m llm_wrapper_mcp_server --help を実行すると、サーバーを設定するために使用できるすべてのコマンドラインオプションを確認できます。
このサーバーは Model Context Protocol(MCP)STDIO サーバーとして動作し、標準入力と標準出力を介して通信します。MCP 通信用のネットワークポートは開きません。
MCP 通信
サーバーは、stdin と stdout を介して JSON-RPC メッセージを使用して通信します。次の MCP メソッドをサポートしています。
initialize:プロトコルのバージョンとサーバーの機能を確立するためのハンドシェイクです。tools/list:利用可能なツールを一覧表示します。メインサーバーはllm_callツールを提供します。tools/call:指定されたツールを実行します。resources/list:利用可能なリソースを一覧表示します(現在はありません)。resources/templates/list:利用可能なリソーステンプレートを一覧表示します(現在はありません)。
llm_call ツールは、引数として prompt(文字列、必須)と、任意で model(文字列)を受け取ります。指定したモデルが許可されている場合は、呼び出しごとにモデルを上書きできます。
クライアントとの通信例(Python)
標準入力/出力を介した通信をサポートする任意の言語で、STDIO MCP サーバーと通信できます。以下は、subprocess モジュールを使用した Python の例です。
import subprocess
import json
import time
def send_request(process, request):
"""Sends a JSON-RPC request to the server's stdin."""
request_str = json.dumps(request) + "\\n"
process.stdin.write(request_str.encode('utf-8'))
process.stdin.flush()
def read_response(process):
"""Reads a JSON-RPC response from the server's stdout."""
line = process.stdout.readline().decode('utf-8').strip()
if line:
return json.loads(line)
return None
if __name__ == "__main__":
# Start the MCP server as a subprocess
# Ensure you have the virtual environment activated or the package installed globally
server_process = subprocess.Popen(
["python", "-m", "llm_wrapper_mcp_server"], # Add any CLI args here if needed
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE, # Capture stderr for debugging
text=False # Use bytes for stdin/stdout
)
print("Waiting for server to initialize...")
# The server sends an initial capabilities message on startup (id: None)
initial_response = read_response(server_process)
print(f"Server Initial Response: {json.dumps(initial_response, indent=2)}")
# 1. Send an 'initialize' request
initialize_request = {
"jsonrpc": "2.0",
"id": "1",
"method": "initialize",
"params": {}
}
print("\\nSending initialize request...")
send_request(server_process, initialize_request)
initialize_response = read_response(server_process)
print(f"Initialize Response: {json.dumps(initialize_response, indent=2)}")
# 2. Send a 'tools/call' request to use the 'llm_call' tool
llm_call_request = {
"jsonrpc": "2.0",
"id": "2",
"method": "tools/call",
"params": {
"name": "llm_call",
"arguments": {
"prompt": "What is the capital of France?"
# Optionally add: "model": "another-model/if-allowed"
}
}
}
print("\\nSending llm_call request...")
send_request(server_process, llm_call_request)
llm_call_response = read_response(server_process)
print(f"LLM Call Response: {json.dumps(llm_call_response, indent=2)}")
# You can also read stderr for any server logs/errors
# Note: stderr might block if there's no output, consider using non-blocking reads or threads for real apps
# stderr_output = server_process.stderr.read().decode('utf-8')
# if stderr_output:
# print("\\nServer Stderr Output:\\n", stderr_output)
# Terminate the server process
server_process.terminate()
server_process.wait(timeout=5) # Wait for process to terminate
print("\\nServer process terminated.")
開発
プロジェクトのディレクトリとファイル構成の詳細、およびソフトウェア開発エージェント向けの重要なガイドラインについては、AGENTS.md を参照してください。このドキュメントは、コードベースに貢献するエージェントにとって不可欠です。
テストの実行
このプロジェクトでは、テストに pytest を使用します。
すべての単体テストを実行するには:
pytest
通常のテスト実行中に外部 API が呼び出されないよう、統合テストはデフォルトで無効になっています。統合テストを含めて実行するには、integration マーカーを使用します。
pytest -m integration
開発用依存関係のインストール
開発用依存関係をインストールします。
pip install -e ".[dev]"
ライセンス
MIT ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。