LLM Pricing について
LLM Pricingは、LLMモデルの比較やルーティングを行うチーム向けのMCPサーバー兼価格サービスです。価格をリアルタイムのレジストリと照合し、コストと品質に基づくモデル推薦や実利用額の記録を提供します。
主な機能
- 0131プロバイダーのリアルタイム価格
- 02価格変動とデータ品質の確認
- 03コストと品質を考慮したモデル推薦
- 04実利用量と支出の記録
- 05価格履歴とトレンドデータ
活用シーン
- 01モデルのコスト見積もりと比較
- 02タスクに適したモデルの選択
- 03掲載価格の変動確認
- 04コーディングエージェントのセッション費用分析
MCP 対応
STDIOとHTTP経由で、価格情報、モデル推薦、価格検証、利用記録など29のMCPツールを公開します。クライアントはホスト済みHTTPエンドポイントに接続するか、STDIOでサーバーを実行できます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://llm-pricing-api.fly.dev/mcpclaude mcp add --transport http skakumanu-llm-pricing https://llm-pricing-api.fly.dev/mcp{"mcpServers":{"skakumanu-llm-pricing":{"type":"http","url":"https://llm-pricing-api.fly.dev/mcp"}}}Cursor で開く{"servers":{"skakumanu-llm-pricing":{"type":"http","url":"https://llm-pricing-api.fly.dev/mcp"}}}VS Code で開く{"mcpServers":{"skakumanu-llm-pricing":{"type":"http","url":"https://llm-pricing-api.fly.dev/mcp"}}}{"mcpServers":{"skakumanu-llm-pricing":{"serverUrl":"https://llm-pricing-api.fly.dev/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
LLM Pricing MCP サーバー
ほとんどのLLM価格ツールは、静的な参照表です。このツールは、独立して管理される最新の価格レジストリと自らの価格データを照合し、相違があれば通知します。価格を提示するだけでなく、コスト と 品質に基づいてモデルを選択し、実際に使った金額を追跡します。これらすべてを、RESTful API(FastAPI)、STDIOとHTTPに対応した 29個のMCPツール、対話型エージェント+RAGパイプライン、ブラウザベースのUI、セルフサービスの請求ダッシュボードで実現し、主要なLLMプロバイダー31社の価格データを提供します。
公開先:https://llm-pricing-api.fly.dev
このツールの特長
- 信頼するだけでなく、検証できる価格 —
check_price_driftとget_data_qualityは、管理されているすべての価格を最新の外部レジストリと照合します。5%を超える乖離がある価格は保留し(通知なしに提供することはありません)、カタログ全体の信頼度を示す単一のconfirmed_pctスコアを提供します。 - 価格を提示するだけでなく、選択します —
recommend_modelとoptimize_workloadは、実際のタスクに合わせてコスト と 品質からモデルを選びます。より安価な選択肢が品質を損なう場合はその旨を示し、黙って推奨することはありません。 - 実際に使った金額を追跡 —
record_usage、analyze_session_usage、import_session_usageは実際の支出を記録・分析します。使用状況のリアルタイム追跡が設定されていないコーディングエージェントのセッションも、後から取り込めます。 - MCP サーバーだけではありません — 同じ価格エンジンが、REST API、ブラウザUI(計算機、横並び比較、履歴/トレンド)、セルフサービスの請求ダッシュボードも支えています。
機能
MCP インターフェース(STDIO+HTTP)
- 29個のMCPツール:
get_all_pricing、estimate_cost、compare_costs、predict_cost、optimize_workload、recommend_model、check_price_drift、get_data_quality、get_performance_metrics、get_use_cases、get_ide_pricing、get_telemetry、get_pricing_history、get_pricing_trends、register_price_alert、list_price_alerts、delete_price_alert、get_pricing_export_url、list_conversations、delete_conversation、ask_agent、record_usage、get_usage_summary、register_budget_alert、list_budget_alerts、delete_budget_alert、get_cache_stats、analyze_session_usage、import_session_usage get_all_pricing、estimate_cost、compare_costs、get_use_cases、recommend_modelは、オプションのcurrency/country引数を受け取ります(v1.76.0)。指定すると、換算後のlocal_*数値とcurrency_conversionブロックが追加されます。どちらも省略した場合、出力は変わりません。- STDIO トランスポート — ローカルのClaude Desktop連携向けに、STDIO経由でJSON-RPC 2.0を使用します。
- HTTP トランスポート — リモートMCPクライアント向けに、HTTP経由でJSON-RPC 2.0を使用する
POST /mcpを提供します。ローカルへのインストールは不要です。 - MCPプロトコルのバージョン:
2024-11-05
RESTful API
- 31 のプロバイダー(600 以上のモデル)のリアルタイム料金を、スマートキャッシュを利用した非同期取得で提供します。各料金の出典も示されます。
price_source_kindは、プロバイダーの料金表で確認された場合はprovider、参照料金レジストリから取得した場合はregistry(registry_keyと日付も表示)です。レジストリ由来のモデルは見積もりや比較に利用できますが、プロバイダー確認済みとして数えられることはありません。また、週次の取り込み PR により、対象プロバイダーの新しいレジストリモデルが自動的に追加されます - コスト見積もり:単一モデル(
POST /cost-estimate)と一括比較(POST /cost-estimate/batch) - 使用通貨での料金(v1.76.0):
GET /pricing、POST /cost-estimate、POST /cost-estimate/batch、GET /use-cases、POST /router/recommend、GET /pricing/publicは、currency/country(クエリまたはX-Currency/X-Countryヘッダー)を受け付けます。USD の値はそのままに、換算額を追加のlocal_*フィールドとして返します。ブラウザーの計算ツールと比較ページでは、訪問者の国に基づいて通貨が初期設定され、切り替えもできます。詳しくは通貨とロケールをご覧ください - パフォーマンス指標、ユースケースの推奨、料金履歴、トレンド
- フィードバックループを備えたルーター推奨(
POST /router/recommend)。GET /cache-statsでは、約 5 分間の推奨キャッシュにおける、プロセス起動後からのヒット/ミス統計を確認できます - 実際の使用量/支出の追跡(
POST /usage、GET /usage/summary)。/cost-estimateに対する実コスト版です。イベントにsession_idを付けると、必要に応じて 1 つのセッションを分析し(GET /usage/session/{session_id})、根拠に基づく推奨と推定節約額を取得できます - OpenAI 互換プロキシ(
POST /v1/chat/completions)により、SDK をそのまま統合できます - ディスパッチゲートウェイ(v1.77.0):同じエンドポイントに
dispatchポリシーと独自のプロバイダーキーを追加すると、条件を満たす最適なモデルが実際に実行されます。品質の下限を決して下回らないフェイルオーバー、選択されたモデル・理由・実際のコスト・節約額を含むレシート、予算の強制停止、シャドー A/B テスト、組織スコープの監査エクスポートを利用できます。詳しくはディスパッチゲートウェイをご覧ください - 料金変更と予算支出のしきい値を通知する Webhook(
POST /usage/alerts、HMAC-SHA256 署名付き。hard_stop: trueの場合、しきい値到達後は組織のディスパッチもブロックされます) - インタラクティブなドキュメント:
/docs(Swagger)と/redoc
リポジトリコスト監査ツール(scripts/audit_repo.py)
- Python コードベースを静的にスキャンし、LLM SDK の呼び出し箇所(OpenAI、Anthropic、Google、LangChain)を検出します。認証情報や、対象コードへのネットワーク呼び出しは必要ありません
predict_costと同じ料金データとトークン計算を使って、呼び出し箇所ごとのコストを見積もります- より安価なモデル、プロンプトキャッシュ、Batch API(ループ内の呼び出しやオフライン処理と見られる経路向け)、タスクに応じた適正化(単純なタスクに最上位モデルを使用している場合)を提案します。また、複数の呼び出し箇所で同じプロンプトが重複している場合も検出します。詳しくは
python scripts/audit_repo.py --helpをご覧ください - 静的な見積もりのみを行います(設定可能な月間呼び出し回数を想定)。実際の数値を得るには、デプロイ後に
POST /usageで記録した実支出と組み合わせてください
AI ネイティブ SDLC パイプライン(Claude Code を使用するコントリビューター向けの /release-feature)
- 1 つのエージェントがすべてを一度に処理するのではなく、専用のフェーズエージェントを使って機能リクエストを進めます:仕様 → 設計 → コード → レビュー → テストとリリース
- 仕様では、実装の詳細には一切触れずに機能の 内容(要件、受け入れ基準、対象外事項)を定めます。設計では、確定した仕様に基づいて実装の 方法(アプローチ、バージョンの更新、ブランチ名)を定めます。どちらのフェーズも、もう一方の判断を再導出しません
- レビューでは、差分を対象に、正確性、セキュリティ、簡素化を担当する 3 つのエージェントを並行して実行します。テストとリリースでは、仕様の受け入れ基準に照らして結果を確認し、レビューでの指摘をトリアージし、このリポジトリのリリースチェックリストをすべて実行します。また、コミット、プッシュ、PR の作成を行うのはこのフェーズのみです
.claude/agents/phase-*.md(5 つのフェーズエージェント)と.claude/workflows/release-feature.js(コード → レビュー → テストのオーケストレーター)で定義されています。CLAUDE.mdの「AI-Native SDLC Pipeline」セクションを参照してくださいdevelopを対象とするオープン PR の状態で終了します。マージするかどうかは引き続き人間が判断します
エージェントと RAG パイプライン
- 設定可能な LLM バックエンド:OpenAI GPT-4o-mini(デフォルト)、または環境変数で指定する Anthropic Claude
- ReAct ループエージェント:29 個ある MCP ツールのうち 26 個を利用できます(
ask_agent、get_telemetry、get_cache_statsは除外) - TF-IDF RAG:価格ドキュメントを対象とする top-k 検索
- 会話メモリ:セッションごとの SQLite 永続化、ターン数の上限を設定可能
- チャット UI:
/chat— ReAct の進行状況をリアルタイムでストリーミング表示します POST /agent/chat— 同期型の JSON レスポンスPOST /agent/chat/stream— SSE ストリーム(thinking/tool_call/tool_result/answer/done)
ブラウザー UI
| パス | 説明 |
|---|---|
/ | マーケティング用ランディングページ |
/chat | 対話型 AI エージェント |
/calculator | インタラクティブなコスト計算ツール |
/compare | モデルの並列比較 |
/history | 価格履歴チャート(Chart.js) |
/trends | 価格変動ランキング |
/widget | 埋め込み可能な価格表 |
/billing | セルフサービスのサインアップとアップグレード用ダッシュボード |
/conversations | 会話履歴ビューアー |
/admin | サーバー統計、レート制限、顧客 |
/mcp-setup | MCP 統合ハブ |
/api-docs | API リファレンス(Swagger/ReDoc) |
/whats-new | リリースノートのタイムライン |
すべての UI は、一貫したダークデザインシステム(CSS 変数、'Segoe UI' フォント、#0f1117 の背景、#7c6af7 のアクセント)を共有し、モバイルに完全対応しています。画面上部に固定されるハンバーガーナビゲーションバーも備えています。
SaaS 請求(Stripe)
- 無料プランのサインアップ:
POST /billing/signup(メールアドレス → API キー。Stripe は不要) - 有料プラン(Pro/Enterprise)は Stripe Checkout 経由で登録し、レート制限を自動更新します
- セルフサービスポータル:
GET /billing/portal - 使用状況ダッシュボード:
GET /billing/me(ルーター呼び出し数、節約額、受け入れ率) - Stripe Webhook ハンドラー:
POST /billing/webhook
API キーのプランとレート制限
- Free:30 req/min · Pro:120 req/min · Enterprise:600 req/min
- プランは請求 DB(顧客の API キー)から取得されます。または、有効なグローバル
MCP_API_KEYもリクエストに含まれている場合に限り、X-Api-Key-Tierヘッダーから取得されます。匿名リクエストには常にデフォルトのバケットが適用されるため、このヘッダーを使って自分で上位の制限を選ぶことはできません GET /rate-limits/tiers— プランの詳細を一覧表示する公開エンドポイント
セキュリティと品質
- ほとんどのエンドポイントは公開されています(読み取り専用の価格データ、UI、MCP ツール)。
- 保護されたエンドポイント(
/billing/me、/router/recommend、/router/feedback、/billing/portal)には、課金 API キーまたはグローバルなMCP_API_KEYが必要です。 /v1/chat/completionsのディスパッチモードには、無料枠の顧客キーが必要です(ディスパッチでは組織ごとの台帳に書き込むため、グローバルなMCP_API_KEYは拒否されます)。プロバイダーキーはリクエストごとに持ち込む方式(X-Provider-Key-*ヘッダー)で、一時的に使用され、保存、記録、エコーされることはありません。プロンプトや応答も同様です。- クライアント IP とティア別のバケット単位でレート制限を適用します。匿名の
/agent/chatと/agent/chat/streamエンドポイントも対象です(API キーは不要ですが、各呼び出しで運営者のキーを使って LLM を実行するため、スロットリングされます)。 - リクエストサイズの上限(デフォルトは 1MB)。
- テスト 1870 件が合格。すべての PR で CI/CD を実行(test → lint → bandit → OSV → gitleaks → deploy)。
デプロイ
- プライマリ:Fly.io — shared-cpu-1x、512MB、約 $3.40/月。
- CI/CD:GitHub Actions —
masterへの push 時に test → deploy を実行。 - ブルーグリーンデプロイに対応し、正常なシャットダウン(SIGTERM/SIGINT)をサポートします。
- ヘルスプローブ:
/health、/health/live、/health/ready、/health/detailed
目次
クイックスタート(Claude Desktop)
上記のワンクリックリンクを開くと、Cursor/VS Code が直接起動します(ベストエフォート対応です。ディープリンクのサポート状況はクライアントのバージョンによって異なります)。それ以外のクライアントでは、以下のコピー&ペースト用設定を使います。こちらは常に動作します。
オプション A — リモート(インストール不要)
claude_desktop_config.json に追加します。
{
"mcpServers": {
"llm-pricing": {
"url": "https://llm-pricing-api.fly.dev/mcp"
}
}
}
Claude Desktop を再起動します。29 個すべての価格ツールをすぐに利用できます。
オプション B — npx 経由の STDIO(クローンも Python も不要)
command ベースの STDIO サーバーのみをサポートするクライアント向けです(リモート/HTTP の直接設定には非対応)。これは、標準入力/標準出力を上記のホスト型サーバーに中継する、依存関係ゼロの npm パッケージを実行します。クローンは不要で、Python や pip install も必要ありません。
{
"mcpServers": {
"llm-pricing": {
"command": "npx",
"args": ["-y", "llm-pricing-mcp"]
}
}
}
Claude Desktop を再起動します。設定オプション(セルフホスト、タイムアウト)については、npm/llm-pricing-mcp/README.md を参照してください。
オプション C — ローカル STDIO、完全オフライン
- クローンしてインストールします。
git clone https://github.com/skakumanu/llm-pricing-mcp-server.git
cd llm-pricing-mcp-server
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
claude_desktop_config.jsonに追加します。
{
"mcpServers": {
"llm-pricing": {
"command": "python",
"args": ["/absolute/path/to/mcp/server.py"],
"cwd": "/absolute/path/to/llm-pricing-mcp-server",
"env": { "PYTHONUNBUFFERED": "1" }
}
}
}
詳しいセットアップ、Windows のパス、トラブルシューティングについては、docs/CLAUDE_INTEGRATION.md を参照してください。
クイックスタート(API)
サーバーの実行
python src/main.py
# or
uvicorn src.main:app --reload --host 0.0.0.0 --port 8000
公開エンドポイント(認証不要)
# Get all pricing
curl http://localhost:8000/pricing
# Estimate cost
curl -X POST http://localhost:8000/cost-estimate \
-H "Content-Type: application/json" \
-d '{"model_name": "gpt-4o", "input_tokens": 1000, "output_tokens": 500}'
# Chat with the agent
curl -X POST http://localhost:8000/agent/chat \
-H "Content-Type: application/json" \
-d '{"message": "What is the cheapest model for RAG pipelines?"}'
# OpenAI-compatible routing proxy
curl -X POST http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model": "gpt-4o", "messages": [{"role": "user", "content": "hi"}]}'
保護されたエンドポイント(課金 API キーまたは MCP_API_KEY が必要)
# Get your API key via free signup
curl -X POST http://localhost:8000/billing/signup \
-H "Content-Type: application/json" \
-d '{"email": "[email protected]"}'
# Use the returned api_key for protected endpoints
curl -H "x-api-key: <your-api-key>" \
http://localhost:8000/billing/me
curl -X POST http://localhost:8000/router/recommend \
-H "x-api-key: <your-api-key>" \
-H "Content-Type: application/json" \
-d '{"max_cost_per_1m_tokens": 5}'
エージェントのストリーミング
curl -X POST http://localhost:8000/agent/chat/stream \
-H "Content-Type: application/json" \
-d '{"message": "Compare GPT-4o vs Claude Sonnet pricing"}' \
--no-buffer
イベント:thinking → tool_call → tool_result → answer → done
HTTP MCP トランスポート
サーバーは、HTTP 経由の MCP プロトコル(プロトコルバージョン 2024-11-05)をサポートする JSON-RPC 2.0 エンドポイントを POST /mcp で公開しています。
サポートされているメソッド
| メソッド | 説明 |
|---|---|
initialize | ハンドシェイク — サーバー情報と機能を返します |
initialized | 通知 — 204 を返します |
tools/list | 入力スキーマとともに 29 個すべてのツールを一覧表示します |
tools/call | ツールを実行します |
例
# List tools
curl -X POST https://llm-pricing-api.fly.dev/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
# Call a tool
curl -X POST https://llm-pricing-api.fly.dev/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0", "id": 2, "method": "tools/call",
"params": {
"name": "estimate_cost",
"arguments": {"model_name": "gpt-4o", "input_tokens": 1000, "output_tokens": 500}
}
}'
GET /mcp はサーバー情報と設定スニペットを返します。完全なインタラクティブドキュメントは /docs(Swagger UI)と /redoc にあります。
API リファレンス
公開エンドポイント
| メソッド | パス | 説明 |
|---|---|---|
| GET | / | ランディングページ(HTML) |
| GET | /pricing | すべてのモデルの価格(?provider= フィルター。?currency=/?country= を指定すると local_prices を追加) |
| GET | /locale | このリクエストで解決された通貨/国(ブラウザーのプリセット。IP は一切返しません) |
| GET | /currency/rates | 同梱された USD 為替レート表(基準日、7 日間の古さフラグ) |
| GET | /models | 利用可能なすべてのモデル |
| GET | /performance | スループット、レイテンシ、コンテキストウィンドウ、品質スコア |
| GET | /use-cases | モデルのユースケースに関する推奨 |
| GET | /telemetry | サーバーの使用状況メトリクスと分析 |
| GET | /admin/stats | 集計されたサーバー統計 |
| GET | /admin/rate-limits | 現在のレート制限状態 |
| GET | /rate-limits/tiers | API ティアの定義 |
| GET | /pricing/history | 価格履歴スナップショット |
| GET | /pricing/trends | 価格変動ランキング |
| GET | /pricing/public | 公開価格(認証不要、埋め込みに安全) |
| GET | /pricing/history/export | CSV/JSON エクスポート |
| POST | /cost-estimate | 単一モデルのコスト見積もり |
| POST | /cost-estimate/batch | 複数モデルのコスト比較 |
| POST | /agent/chat | ブロッキング方式のエージェントチャット |
| POST | /agent/chat/stream | ストリーミング方式のエージェントチャット(SSE) |
| GET | /agent/conversations | 会話の一覧 |
| DELETE | /agent/conversations/{id} | 会話の削除 |
| GET | /api/versions | API バージョン情報 |
| GET | /pricing/alerts/signing-info | Webhook 署名キー情報 |
| POST | /v1/chat/completions | OpenAI 互換のルーティングプロキシ(推奨のみ。下記のディスパッチモードには顧客キーが必要) |
| GET | /dispatch/providers | 実行可能なプロバイダー、そのキーのヘッダー、ディスパッチ可能なモデルとその理由 |
| GET | /mcp | HTTP MCP サーバー情報 |
| POST | /mcp | HTTP MCP JSON-RPC 2.0 |
| POST | /billing/signup | 無料ティアへの登録 → API キー |
| GET | /billing | 請求ダッシュボード(HTML) |
| POST | /billing/webhook | Stripe Webhook |
| GET | /health | ヘルスチェック |
| GET | /health/live | Kubernetes のライブネスプローブ |
| GET | /health/ready | Kubernetes のレディネスプローブ |
| GET | /health/detailed | サービスの状態を含む詳細なヘルス情報 |
保護されたエンドポイント(請求用 API キーまたは MCP_API_KEY が必要)
| メソッド | パス | 説明 |
|---|---|---|
| POST | /router/recommend | スマートなモデルルーティングの推奨 |
| POST | /router/recommend/stream | ストリーミング方式のルーター(SSE) |
| POST | /router/feedback | ルーティングに関するフィードバックを送信 |
| GET | /telemetry/savings | ルーターの節約レポート |
| POST | /usage | 実際の使用イベントを 1 件記録(コストはサーバー側で計算) |
| POST | /usage/batch | 複数の使用イベントを一度に記録 |
| GET | /usage/summary | 組織ごとのモデル/プロバイダー別の実際の支出概要 |
| POST | /v1/chat/completions + dispatch | ディスパッチモード(顧客キーのみ):X-Provider-Key-* を使用して条件を満たす最適なモデルを実行し、フェイルオーバーとレシートに対応 |
| GET | /dispatch/receipts | 組織のディスパッチレシートのメタデータのみを含む JSON/CSV エクスポート(顧客キーのみ) |
| POST | /billing/checkout | Stripe Checkout セッション |
| GET | /billing/portal | Stripe 請求ポータル |
| GET | /billing/me | 使用状況ダッシュボード |
| POST | /pricing/alerts | 価格変更 Webhook を登録 |
| GET | /pricing/alerts | アラートの一覧 |
| DELETE | /pricing/alerts/{id} | アラートを削除 |
リクエスト/レスポンスの主な例
POST /cost-estimate
// Request
{"model_name": "gpt-4o", "input_tokens": 1000, "output_tokens": 500}
// Response
{
"model_name": "gpt-4o", "provider": "OpenAI",
"input_tokens": 1000, "output_tokens": 500,
"input_cost": 0.0000025, "output_cost": 0.000005,
"total_cost": 0.0000075, "currency": "USD"
}
POST /billing/signup
// Request
{"email": "[email protected]"}
// Response
{
"api_key": "abc123...", "org_id": "org-xyz...",
"tier": "free", "message": "Welcome! Your free API key is ready."
}
POST /router/recommend
// Request (x-api-key header required)
{"max_cost_per_1m_tokens": 5, "task_type": "code"}
// Response
{
"recommended": {"model_name": "gpt-4o-mini", "provider": "OpenAI", ...},
"alternatives": [...],
"reason": "Best quality/cost ratio for code tasks under $5/1M tokens",
"routing_id": "uuid4..."
}
通貨と言語・地域設定
API が提供するすべての価格は、米ドル建ての希望小売価格です。v1.76.0 以降、価格一覧、単一およびバッチのコスト見積もり、ユースケース、ルーターの推奨結果、公開価格エンドポイントでは、換算元の米ドルと併せて、13 種類の通貨(USD、EUR、GBP、INR、JPY、CAD、AUD、BRL、CNY、SGD、CHF、KRW、MXN)で各金額を表示できます。
curl "http://localhost:8000/pricing?currency=EUR" # every model gains local_prices
curl -H "X-Country: IN" "http://localhost:8000/pricing/public" # INR via the country
curl -X POST "http://localhost:8000/cost-estimate?country=JP" \
-H "Content-Type: application/json" \
-d '{"model_name": "gpt-4o", "input_tokens": 1000, "output_tokens": 500}'
- 入力と優先順位:
currencyクエリ >X-Currencyヘッダー >countryクエリ >X-Countryヘッダー > プラットフォームの位置情報ヘッダー(CF-IPCountry、X-Vercel-IP-Country、CloudFront-Viewer-Country、X-Country-Code)> IP による可能な範囲での検索 > USD。通貨が明示されている場合は、国が明示されていても通貨が優先されます(国はレスポンスのラベルとしてのみ使用されます)。 - 形式:換算値は追加フィールドとして提供されます。モデルごとの
local_prices、local_cost、local_cost_rangeと、1 つのcurrency_conversionブロック(currency、rate、rate_as_of、rate_age_days、rate_is_stale、rate_source、country、country_source、currency_source、fallback_to_usd、fallback_reason、note)です。USD のフィールド名や通貨単位が変更されることはありません。また、何も指定または検出されない場合、新しいフィールドは一切表示されません。 - 拒否とフォールバック:明示的に指定されたコードが 13 種類の対応通貨に含まれない場合、対応通貨の一覧を本文に含む
400が返されます(暗黙に USD に切り替わることはありません)。通貨が対応していない国の場合は、fallback_to_usd: true、fallback_reason: "country_not_mapped"として USD が使用されます。 - レート:リポジトリ内のテーブル
data/exchange_rates.jsonは、Frankfurter(利用できない場合は ECB の参照レート)を通じてscripts/refresh_exchange_rates.pyで毎週更新され、人手でマージされる PR を経て反映されます。リクエスト時にデータを取得することはありません。レートが7 日より古くても引き続き使用されますが、rate_is_stale: trueとして示されます。GET /currency/ratesでは、テーブルとas_of日付、および作成時のプレースホルダーのままかどうかを確認できます。換算額は参考値です。プロバイダーへの支払いは USD 建てです。 - ブラウザー:
/calculatorと/compareには通貨セレクターがあり、検出された国の通貨が初期設定されます(検出できない場合は USD)。変更するとすべての金額が再表示され、選択内容はページ間の移動や再読み込み後も保持されます(localStorage のllmp.currency)。ランディングページにはセレクターと注記のみが表示されます。 - プライバシー:クライアントの IP は国の特定に一時的に使用されるだけで、それ以外の用途には使われません。この機能によって保存・記録されることはなく、レスポンスに含まれることもありません。レスポンスに含まれる場合があるのは、特定された ISO 国コードのみです。同じモデルが全員に同じ順序で表示され、コストの価格帯は USD 建てのままです。
- MCP:
get_all_pricing、estimate_cost、compare_costs、get_use_cases、recommend_modelは、任意のcurrencyとcountryを受け付けます。MCP では位置情報を検出しません。
ディスパッチゲートウェイ
v1.77.0 以降、OpenAI 互換エンドポイントでは、推奨モデルを実際に実行できます。dispatch ポリシー、無料枠サービスキー、および自身のプロバイダーキーを送信すると、条件を満たす最適なモデルが実際に実行され、実際の usage と dispatch_receipt を含む通常の chat.completion が返されます。dispatch を指定しない場合、エンドポイントは従来どおり推奨のみを行うプロキシです。
import os
from openai import OpenAI
SERVICE_KEY = os.environ["LLM_PRICING_SERVICE_KEY"] # your free-tier key from POST /billing/signup
client = OpenAI(
base_url="https://llm-pricing-api.fly.dev/v1",
api_key=SERVICE_KEY,
default_headers={ # bring your own provider keys — used transiently, never stored
"X-Provider-Key-OpenAI": "...",
"X-Provider-Key-Anthropic": "...",
"X-Provider-Key-Google": "...",
},
)
resp = client.chat.completions.create(
model="gpt-4o", # what you would have used — the receipt reports savings against it
messages=[{"role": "user", "content": "Summarise this ticket..."}],
max_tokens=300,
extra_body={"dispatch": {"objective": "cheapest", "min_quality_score": 70,
"max_request_cost_usd": 0.01, "request_id": "ticket-4812"}},
)
print(resp.choices[0].message.content)
receipt = resp.model_extra["dispatch_receipt"]
print(receipt["chosen"]["model"], receipt["cost"]["actual_usd"],
receipt["savings"]["vs_requested_model"]["savings_usd"])
-
プリセット(
dispatch.objective):目的 選択内容 balanced(デフォルト)ルーターの品質あたりのコスト順 cheapestすべての制約を満たすモデルのうち、加重平均の 100 万トークンあたりのコストが最も低いモデル best_quality品質スコアが最も高いモデル(同点の場合は安価なモデル) lowest_latency既知のレイテンシが最も低いモデル(不明なモデルは最後) pinnedpinned_modelをそのまま選択。レシートには、下限を満たす最安モデルを選んだ場合に節約できた金額が記載されます厳格な制約ではルーターと同じ語彙を使用します — min_quality_score、max_cost_per_1m_tokens、min_context_window、task_type、preferred_provider、exclude_reasoning_models— さらにallow/denyリスト(モデル名またはprovider:<name>)とmax_request_cost_usd(プロンプトトークン数 × 入力価格 +max_tokens× 出力価格。上限を設定すると、そのmax_tokens(指定した値、またはサーバーのデフォルトである 1024)もプロバイダーに送信されるため、上限が実際に呼び出しを制限します)。すべてのフィールドは省略可能です。空の dispatch: {}はフェイルオーバーが有効なバランス重視の設定を意味します。 -
適格性:プロバイダーが価格を確認済みのモデル(価格の不整合により保留中のモデル、価格設定されたことのないモデル、 廃止済みモデルはディスパッチされません)のうち、実行可能なプロバイダー — OpenAI、Anthropic、Google(Gemini API)、 Groq、Together AI、Fireworks AI、DeepSeek、Mistral AI、xAI。その他はすべて推奨専用です — に属し、 プロバイダーキーが指定されているモデルのみが対象です。
GET /dispatch/providersにはこれらすべてがあらかじめ表示されます。 レシートには除外理由がすべて記載され、適格なモデルがない場合は、プロバイダーを呼び出す前に、エラーで 対象を絞り込んだ制約が示されます。 -
フェイルオーバー(
dispatch.failover、デフォルトで有効、max_attemptsは 3、timeout_msは 30000):タイムアウト、5xx、 429、コンテキスト長超過、モデルが見つからない場合は、すべての制約を引き続き満たす次の候補に移ります(コンテキスト長超過の場合は、 より大きなコンテキストウィンドウを持つモデルに限ります)。フェイルオーバーによって品質の下限を下回る場合は、ディスパッチは失敗し、all_attempts_failedに下限が示されます。お客様のプロバイダーキーで 401/403 が発生した場合は、そこで終了します(provider_auth_failedに プロバイダー名が示されます)。固定指定したモデルからはフェイルオーバーしません。 -
レシート:
chosen(モデル、プロバイダー、品質、ブレンド価格、データの出所)、reason、candidates(ランキング順)、excluded+excluded_summary、usage、cost(actual_usd= プロバイダーのトークン数 × カタログ価格)、savings(vs_most_expensive_eligible、vs_requested_model、固定指定時のforgone_vs_cheapest_meeting_floor)、latency(合計/プロバイダー/オーバーヘッド)、attempts、shadow、dispatch_id、request_id。ポリシーにcurrency/countryを追加するか、X-Currency/X-Countryを指定すると、通貨建てのlocalブロックが表示されます。明示的な指定のみが対象であり、このエンドポイントが 場所を推定することはありません。 -
台帳:ディスパッチが成功するたびに、正確な使用イベントを 1 件(リトライ時は
request_idで重複を排除します — プロバイダー呼び出し自体は重複排除されません)と、使用済みとしてマークされたルーティング判断を 1 件記録します。そのため、GET /usage/summary、GET /telemetry/savings、受け入れ率、予算アラートには、実際にディスパッチされた費用が反映されます。 -
予算の強制停止:顧客 API キーを使用して
POST /usage/alertsにhard_stop: trueを指定すると、記録された支出が アラート期間のしきい値に達した時点で、お客様の組織へのディスパッチを402 budget_hard_stopで拒否します。アラートはキーに紐づく 組織に限定されます(別の組織のアラートを停止、一覧表示、削除することはできません)。Webhook はこれまでどおり実行され、 組織に紐づかないアラートは通知専用です。 -
シャドウ A/B:
shadow: {"model": "..."}またはshadow: {"objective": "best_quality"}を指定すると、 お客様自身のキーを使って 2 つ目のモデルを並行実行します。返されるのはプライマリの完了結果のみです。レシートには両方のモデルの 費用、レイテンシ、結果と差分が含まれます。シャドウの失敗によってリクエストが失敗することはありません。費用上限は プライマリとシャドウの合計に適用されます(上限を超える場合、シャドウはスキップされ、その旨が報告されます)。シャドウの費用も 記録されます — 実際に費用が発生します。 -
監査エクスポート:
GET /dispatch/receipts?format=csv|json&since=&until=&outcome=&limit=は、 お客様の組織のレシートをメタデータ行として返します(保持期間は 90 日)。行にプロンプト、完了結果、キーが含まれることはありません。 -
このリリースの対象範囲:非ストリーミング、テキストのみ、単一選択のチャット補完です。
stream: true、tools/functions/tool_choice、n > 1、テキスト以外のresponse_format、画像コンテンツパーツは、該当する機能名を 示して事前に拒否されます(何かが黙って破棄されることはありません。userは受け付けますが、転送されません)。新しい MCP ツールはありません。 プール型のサービス負担キーと、アカウントごとに保存されたキーは明示的に対象外です。 -
プライバシー:プロバイダーキーはリクエストヘッダーと送信先のプロバイダー呼び出しにのみ存在します。プロンプトと完了結果は リクエスト、プロバイダー呼び出し、
choicesにのみ存在します。いずれもどのレベルでも永続化またはログ記録されず、プロバイダーの エラーボディは結果に分類されるだけで、コピーされることはありません。請求はプロバイダーからお客様に直接行われます。
設定
環境変数
# LLM Backend (Agent)
AGENT_LLM_PROVIDER=openai # "openai" (default) or "anthropic"
AGENT_MODEL=gpt-4o-mini # Model name
OPENAI_API_KEY=sk-... # Required when AGENT_LLM_PROVIDER=openai
ANTHROPIC_API_KEY=sk-ant-... # Required when AGENT_LLM_PROVIDER=anthropic
# Server
SERVER_HOST=0.0.0.0
SERVER_PORT=8000
DEBUG=false
# Security
MCP_API_KEY=your-strong-random-key # Global admin key (optional — billing keys work too)
RATE_LIMIT_PER_MINUTE=60 # Default rate limit (overridden by tier)
# Local currency (v1.76.0)
CURRENCY_DETECTION_ENABLED=true # false = never infer a country from the client IP
GEO_LOOKUP_TIMEOUT_SECONDS=1.0 # request-path cap on the IP -> country lookup
EXCHANGE_RATES_PATH= # override for data/exchange_rates.json (Fly sets /app/vendored/exchange_rates.json)
# Dispatch gateway (v1.77.0) — provider keys are never configured here; callers bring their own per request
DISPATCH_ENABLED=true # false = dispatch mode of /v1/chat/completions returns 503
DISPATCH_DEFAULT_MAX_TOKENS=1024 # used when the caller omits max_tokens (Anthropic requires one)
DISPATCH_ATTEMPT_TIMEOUT_MS=30000 # per-attempt provider timeout
DISPATCH_MAX_ATTEMPTS=3 # failover attempts (1 when failover is off or the model is pinned)
DISPATCH_RECEIPT_RETENTION_DAYS=90 # metadata-only receipt rows are purged past this age
# Billing (Stripe)
STRIPE_SECRET_KEY=sk_live_... # Optional — free signup works without this
STRIPE_WEBHOOK_SECRET=whsec_...
STRIPE_PRICE_ID_PRO=price_...
STRIPE_PRICE_ID_ENTERPRISE=price_...
BILLING_DB_PATH=/app/data/billing.db
BILLING_BASE_URL=https://llm-pricing-api.fly.dev
LLM プロバイダーの切り替えに必要なのは環境変数の変更だけです。コードを変更する必要はありません。
| プロバイダー | AGENT_LLM_PROVIDER | AGENT_MODEL | 推定コスト |
|---|---|---|---|
| OpenAI(デフォルト) | openai | gpt-4o-mini | 約 $0.73/月 |
| OpenAI(高性能) | openai | gpt-4o | 約 $8/月 |
| Anthropic | anthropic | claude-sonnet-4-6 | 約 $15/月 |
| Anthropic(高速) | anthropic | claude-haiku-4-5-20251001 | 約 $2/月 |
開発
プロジェクト構成
llm-pricing-mcp-server/
├── src/
│ ├── __init__.py # Version (1.48.0)
│ ├── main.py # FastAPI app + all endpoints
│ ├── config/settings.py # Pydantic settings
│ ├── models/ # Pydantic models (pricing, billing, router, …)
│ └── services/ # Business logic
│ ├── pricing_aggregator.py # Multi-provider pricing aggregator
│ ├── billing_service.py # SQLite billing / customer DB
│ ├── router.py # Model routing engine
│ ├── savings_tracker.py # Router savings analytics
│ ├── benchmark_service.py # Quality scores + HF API
│ ├── pricing_history.py # Historical snapshot DB
│ └── …
├── mcp/
│ ├── server.py # STDIO JSON-RPC 2.0 server
│ └── tools/ # 29 MCP tool implementations
│ ├── tool_manager.py
│ ├── get_all_pricing.py
│ ├── estimate_cost.py
│ └── …
├── agent/
│ ├── pricing_agent.py # ReAct loop agent
│ ├── llm_backend.py # OpenAI + Anthropic backends
│ └── tools.py # Agent tool wrappers
├── static/ # Browser UIs (one dir per page)
│ ├── landing/ # / (marketing page)
│ ├── chat/ # /chat (agent UI)
│ ├── calculator/ # /calculator
│ ├── compare/ # /compare
│ ├── history/ # /history
│ ├── trends/ # /trends
│ ├── widget/ # /widget
│ ├── billing/ # /billing
│ └── admin/ # /admin
├── tests/ # 667 tests
├── docs/ # Extended documentation
├── .github/workflows/ci-cd.yml # CI/CD pipeline
├── Dockerfile
├── fly.toml # Fly.io deployment config
└── requirements.txt
新しいプロバイダーの追加
BasePricingProviderを実装するsrc/services/<provider>_pricing.pyを作成しますsrc/services/pricing_aggregator.pyに登録します- オプションの API キー用の環境変数を
src/config/settings.pyに追加します tests/にテストを追加します
テスト
# Run all 667 tests
pytest
# With coverage
pytest --cov=src --cov-report=term-missing
# Specific suites
pytest tests/test_api.py -v
pytest tests/test_billing_endpoints.py -v
pytest tests/test_mcp_http.py -v # HTTP MCP transport
pytest tests/test_router.py -v
テストファイル
| ファイル | 対象 |
|---|---|
test_api.py | コア API エンドポイント |
test_agent_endpoint.py | エージェントのチャットとストリーミング |
test_billing_endpoints.py | 登録、チェックアウト、Webhook、ユーザー情報 |
test_billing_service.py | BillingService のユニットテスト |
test_mcp_http.py | HTTP MCP トランスポート |
test_router.py | ルーターの推奨とフィードバック |
test_security.py | 認証ミドルウェア |
test_admin_dashboard.py | 管理者向けエンドポイント |
test_history_tools.py | 価格の履歴と傾向 |
test_rag.py | TF-IDF RAG パイプライン |
test_agent.py | ReAct エージェントのユニットテスト |
test_currency.py | 通貨サービス:マッピング、優先順位、古さ、丸め処理、為替レートテーブル |
test_currency_api.py | 6つのエンドポイントでの REST ロケール解決、/locale、/currency/rates、プライバシー |
test_currency_mcp.py | 5つの MCP ツールでの currency/country |
test_currency_ui.py | 共通のブラウザー通貨コントロール |
test_refresh_exchange_rates.py | 週次の為替レートテーブル更新スクリプトとワークフロージョブ |
test_dispatch_executors.py | httpx.MockTransport を使ったプロバイダー実行器:ワイヤー変換、使用状況/終了のマッピング、エラー分類 |
test_dispatch_service.py | ディスパッチポリシー、適格性、ランキング、フェイルオーバー、上限、強制停止、シャドー A/B、レシート(フェイク実行器) |
test_dispatch_api.py | HTTP 経由のディスパッチモード:認証、非対応機能、台帳、予算アラート、エクスポート、キー/プロンプト漏えいのセンチネル |
デプロイ
Fly.io(プライマリ)
アプリは Fly.io にデプロイされており、master へのプッシュごとに自動デプロイされます。
# Install flyctl
# https://fly.io/docs/getting-started/installing-flyctl/
# Deploy manually
flyctl deploy
# Set secrets
flyctl secrets set \
MCP_API_KEY=... \
OPENAI_API_KEY=... \
AGENT_LLM_PROVIDER=openai \
AGENT_MODEL=gpt-4o-mini
# Set Stripe secrets (optional — free tier works without)
flyctl secrets set \
STRIPE_SECRET_KEY=sk_live_... \
STRIPE_WEBHOOK_SECRET=whsec_... \
STRIPE_PRICE_ID_PRO=price_... \
STRIPE_PRICE_ID_ENTERPRISE=price_... \
BILLING_BASE_URL=https://llm-pricing-api.fly.dev
設定は fly.toml にあります。/app/data/ の永続ボリュームには、すべての SQLite データベースが保存されます。
GitHub Actions CI/CD
.github/workflows/ci-cd.yml パイプラインでは、次の処理を行います。
- すべての PR で 667 件のテストを実行します
masterへのプッシュ時に Fly.io へデプロイします(FLY_API_TOKENシークレットを使用)- デプロイ後にヘルスチェックを実行します
ヘルスチェックエンドポイント
GET /health → {"status":"healthy","version":"1.39.0"}
GET /health/live → {"alive":true}
GET /health/ready → {"ready":true,"checks":{...}}
GET /health/detailed → detailed environment + service statuses
ブルーグリーンデプロイ
リクエストのドレインを伴うグレースフルシャットダウンに対応しています。docs/BLUE_GREEN_DEPLOYMENT.md を参照してください。
ライブデータ
サーバーは、スマートキャッシュを備えたウェブスクレイピングを使用して、公式の公開価格ページから価格データを取得します。価格データの取得にプロバイダーの API キーは必要ありません。
- キャッシュ TTL:価格は 2 時間、パフォーマンス指標は 5 分
- フォールバック:ライブソースが利用できない場合は、静的なハードコード済みデータを使用します
- プロバイダー:OpenAI、Anthropic、Google、Cohere、Mistral AI、Groq、Together AI、Fireworks AI、Perplexity AI、AI21 Labs、Anyscale、Amazon Bedrock
オプションのプロバイダー API キー(OPENAI_API_KEY、ANTHROPIC_API_KEY など)を設定すると、モデルリストの鮮度が向上しますが、必須ではありません。
コントリビューション
docs/CONTRIBUTING.md を参照してください。このリポジトリではGit Flowを使用しています。
feature/<name> → develop (PR) → master (PR) → Fly.io auto-deploy
developまたはmasterに直接コミットしないでください- ブランチ名:
feature/<topic>-v<version>(例:feature/stripe-billing-v1.37.0) developを対象に PR を作成してください。リリース時にはメンテナーが develop から master へ昇格させます
ライセンス
MIT — LICENSE を参照してください。
ロードマップ
完了
- v1.39.0 — OpenAPI タグとグループ化された Swagger UI、15 番目の MCP ツール(
ask_agent) - v1.38.6 — MCP サーバーの修正:すべてのサービスを初期化し、
ask_agentツールを登録、PricingAlertService を初期化 - v1.38.5 — ランディングページに MCP 統合ガイドを追加(Claude Desktop、VS Code、Cursor)
- v1.38.4 — 課金ベータ版の UX:近日公開の文言、有料ボタンの無効化、503 エラーの適切な処理
- v1.38.3 — チャットページと会話ページにダークテーマと共通ナビゲーションを導入
- v1.38.2 — 9 つすべての UI でデザインシステムを標準化(管理画面を基準として採用)
- v1.38.1 — UI テーマの一貫性を改善
- v1.38.0 — リモートクライアント向け HTTP MCP トランスポート(
POST /mcp、GET /mcp) - v1.37.3 — モバイル対応 UI、全ページで一貫したナビゲーション
- v1.37.2 — Fly.io ボリュームのマウント時に SQLite ディレクトリを自動作成
- v1.37.1 —
/にマーケティング用ランディングページを追加 - v1.37.0 — Stripe SaaS 課金:無料登録、Pro/Enterprise プラン、セルフサービスのポータル
- v1.36.0 — API キーのプラン(free/pro/enterprise)、ルーターのフィードバックループ、ストリーミングルーター、Fly.io への移行
- v1.35.0 — 品質価値指数、ベンチマークサービス、モデルルーター、節約額トラッカー
- v1.33.0 — デフォルトの LLM バックエンドを GPT-4o-mini に変更(約 20 倍低コスト)
- v1.27.0–v1.32.0 — 管理ダッシュボード、ウィジェット、比較 UI、計算ツール、価格アラート、履歴エクスポート
- v1.10.0–v1.26.0 — エージェントと RAG パイプライン、ストリーミング、会話メモリ、価格履歴
- v1.5.1 — 12 のプロバイダー、87 以上のモデル、ライブデータの取得
- v1.6.0 — MCP プロトコル全機能(STDIO JSON-RPC 2.0)、Claude Desktop との統合
今後の予定
- Stripe の本番環境向けセットアップ(商品を設定し、Fly.io のシークレットを設定)
- Azure App Service を停止(現在は並行稼働中で、月額約 27 ドル)
- カスタムドメイン
- 追加の LLM バックエンド(Groq への直接接続、ローカルの Ollama)
- ライブ価格購読向けの WebSocket サポート
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。