Frugal について
Frugalは、設定可能なポリシーに基づいてAIツールのリクエストをプロバイダー間で振り分ける、セルフホスト可能なGo製MCPサーバーです。プロバイダー、費用、振り分け理由を記録し、自動フェイルオーバー、予算管理、結果サイズ制限にも対応します。
主な機能
- 01ポリシーに基づくプロバイダー振り分け
- 02エラーや空の結果での自動フェイルオーバー
- 03プロバイダー別の予算とクールダウン
- 04監査可能なプロバイダー・費用記録
- 05結果サイズ制限とトークン推定
活用シーン
- 01検索を低コストのプロバイダーへ振り分け
- 02指定プロバイダーをリクエスト経路から除外
- 03プロバイダーごとの日次支出上限の設定
- 04エージェントに返す長いページ内容の制限
MCP 対応
FrugalはMCPクライアントとツールプロバイダーの間に入り、検索、抽出、閲覧、実行などの振り分け機能を公開します。ローカルMCP接続とStreamable HTTPクライアントに対応します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
frugal
AI ツールのためのオープンなルーティングレイヤー。
Frugal は、エージェントとそのツールプロバイダーの間に位置する MCP サーバーです。検索、抽出、レンダリング、あるいは単なる意図など、実行したい作業を指定すると、Frugal がその完了方法を決定し、ポリシーに従って各呼び出しをルーティングします。デフォルトでは対応可能なプロバイダーのうち最も低コストのものを選び、指定があれば最速またはプレミアムのプロバイダーを選択し、コンプライアンス上の要件があればプロバイダーを固定または拒否します。また、プロバイダーでエラーが発生したり、結果が空だったりした場合は自動的にフェイルオーバーします。すべての応答には判断内容が含まれます。provider_used、cost_usd、および(frugal__execute 経由で)一行の理由が記録されるため、各呼び出しがなぜその宛先にルーティングされたのかを監査できます。
あらゆるモデルで動作します。Go のバイナリは 1 つ。キーはご自身で用意します。アカウントは不要です。すべてセルフホストでき、ロックインもありません。ソース公開(BUSL 1.1 → Apache 2.0)。
インストールから最初のインテリジェントなルーティングによるツール呼び出しまで、5 分以内です。
インストール
curl -fsSL https://frugal.sh/install | bash
frugal mcp install
最初のコマンドでバイナリを $PATH に配置します。2 つ目のコマンドは Claude Desktop、Cursor、AnythingLLM、Claude Code を自動検出し、それぞれの設定済み MCP サーバーリストに frugal を追加します。
AnythingLLM
frugal mcp install は AnythingLLM Desktop を自動検出し、frugal を <storage>/plugins/anythingllm_mcp_servers.json に追加します。セルフホスト版または Docker 版の AnythingLLM では、インストーラーにそのインスタンスのストレージディレクトリを指定してください(AnythingLLM 自身の STORAGE_DIR が使用するものと同じパスです)。
ANYTHINGLLM_STORAGE_DIR=/path/to/anythingllm/storage frugal mcp install --client anythingllm
AnythingLLM を再起動し、Agent Skills → MCP Servers の下にある frugal を探してください。ツールはエージェントのセッションで読み込まれるため、@agent チャットから呼び出します。Docker では、command のパスがコンテナ 内 で解決できる必要があります。frugal バイナリをコンテナにマウントするか、ホスト上で frugal mcp serve --http を実行し、代わりに streamable サーバーとして登録してください。
Streamable HTTP と MCP 2026-07-28
frugal mcp serve --http ADDR は、リモートクライアントや Docker 環境向けに Streamable HTTP を提供します。プロトコルレベルのセッションと initialize ハンドシェイクを廃止した現行の MCP リビジョン 2026-07-28 に対応しているほか、それ以前のセッションベースのリビジョンにも対応しています。どちらのクライアントも同じエンドポイントに接続します。
- 2026-07-28 以降に対応したクライアントには、ステートレスで応答します。
Mcp-Session-Idは不要で、すべての POST は自己完結し、server/discoverにはサポート対象のバージョンと機能を返します。 - 古いクライアント(2025-11-25 以前)はセッションと任意の GET イベントストリームを引き続き使用するため、すでに稼働しているホストに変更はありません。
すべてのクライアントでセッションを無効にするには --stateless を指定します。これは、複数の frugal レプリカを通常のロードバランサーの背後に配置する場合に適しています。どのレプリカでもあらゆるリクエストに応答できます。このモードでも古いクライアントは動作しますが、任意の GET ストリームは利用できません(仕様で許可されているとおり、405 で拒否されます)。
カタログの結果(tools/list、server/discover)には、cacheScope: public とともに 1 時間の ttlMs ヒントが含まれるため、仕様の最新バージョンに対応したクライアントは各ターンでツールリストを再取得しなくなります。カタログはプロセスの実行中は固定されるため、変更するには新しい設定で再起動する必要があります。
FRUGAL_AUTH_TOKEN=... frugal mcp serve --http 0.0.0.0:8765 --stateless
今すぐ試す(キー不要)
検索と抽出はすぐに利用できます。You.com の無料プラン
(youcom-free:キーが必要な You.com プロバイダーと同じ主要ウェブインデックスを、キーもアカウントも不要で You.com のホスト型 MCP エンドポイント経由で利用でき、1 日あたり約 100 クエリ)、Marginalia(インディー/非商用ウェブの無料インデックス)、Wikipedia(無料の Wikimedia REST 検索)、go-readability(無料の純粋な Go 製ローカル抽出ツール)、Jina Reader
(JavaScript でコンテンツを描画するページ向けの無料ホスト型レンダリング)は、設定なしで有効になっています。これがデフォルトの cheap ポリシーの動作です。まず無料およびローカルの段階を使い、プロバイダーから結果が返らない場合はフェイルオーバーします。キーなしで実行したライブ結果は次のとおりです。
frugal__search {"query": "AI agent framework comparison", "max_results": 3}
result › {
"provider_used": "youcom-free",
"cost_usd": 0,
"latency_ms": 177,
"results": [
{"title": "Top 12 AI Agent Frameworks Comparison", "url": "https://www.nimbleway.com/blog/top-ai-agent-frameworks-comparison", ...},
{"title": "AI Agent Frameworks Compared: LangGraph, CrewAI, AutoGen", "url": "https://pecollective.com/blog/ai-agent-frameworks-compared/", ...},
{"title": "Comparing Open-Source AI Agent Frameworks - Langfuse", "url": "https://langfuse.com/blog/2025-03-19-ai-agent-comparison", ...}
]
}
無料プランの日次上限に達すると、レート制限が適用され、ルーターはそのプロバイダーをクールダウンし、チェーンは範囲の狭い無料インデックスからの提供を続けます。同じクエリをこのフォールバック経路で実行したライブ結果もご覧ください。
frugal__search {"query": "AI agent framework comparison", "max_results": 3}
stderr › search zero hits; falling back provider=marginalia latency_ms=529
result › {
"provider_used": "wikipedia",
"cost_usd": 0,
"latency_ms": 954,
"results": [
{"title": "Gemini Enterprise Agent Platform", "url": "https://en.wikipedia.org/wiki/Gemini_Enterprise_Agent_Platform", ...},
{"title": "Perplexity AI", "url": "https://en.wikipedia.org/wiki/Perplexity_AI", ...},
{"title": "Agentic commerce", "url": "https://en.wikipedia.org/wiki/Agentic_commerce", ...}
]
}
正直なところ、利用には制限があります。youcom-free は一般的なウェブインデックスですが、IP ごとに 1 日あたり約 100 クエリに制限されています。Marginalia はエッセイ、ドキュメント、ブログ、ニッチな技術記事には本当に強い一方、主流ニュースや製品ページには弱いです。Wikipedia は固有名詞や参考トピックをカバーします。キー不要モードは、調査やローカル抽出に実用的なワークフローですが、無制限ではありません。環境変数を 1 つ設定するだけで変わります。SEARXNG_URL(無料、セルフホスト可能)、SERPER_API_KEY(1 回あたり $0.001)、または YDC_API_KEY(キーが必要な You.com のプラン、日次上限なし)を設定すると、チェーンにより強力なフォールバック先が加わります。You.com を経由するクエリを完全に避けたい場合は、search_providers の下に youcom-free: {enabled: false} を追加してください。チェーンは再び Marginalia と Wikipedia になります。
ルーティングポリシー
プロバイダーチェーンの順序を機能ごとに宣言するには、~/.frugal/config/models.yaml に設定します。
routing:
search:
strategy: fast # cheap (default) | fast | premium
deny: [youcom] # never called — not by fallback, not even pinned
extract:
order: [firecrawl, goreadability] # explicit preference; unlisted providers still fall back
- cheap(デフォルト)— 実効コストの昇順で、クォータを考慮します。優先度の低いプロバイダーへ自動的にフェイルオーバーします。
- fast — マシン上で実測されたレイテンシー順(ローカルの使用状況記録に基づき、成功した呼び出しのみ)です。履歴が十分に蓄積されるまではコスト順にフォールバックします。ライブでのプローブではありません。
- premium — プレミアム価格のプロバイダーを優先し、価格の降順で並べます。
- order — 明示的な優先リストです。これは先頭部分の指定であり、許可リストではありません。リストにないプロバイダーもフォールバック先として利用されます。
- deny — 呼び出しを絶対に許可しないプロバイダーです。プロバイダーを固定した呼び出しにも適用されます。これはプライバシーを守るための確実な設定です(たとえば、有料プロバイダーをすべて拒否すれば、無料/ローカルの段階からデータが外部に送信されることはありません)。
すべての呼び出しチェーンで、適用されたポリシーが記録されます。また、frugal__execute はレスポンスにその情報を含めて返します。
支出上限とレート制限のクールダウン
上記のポリシーに加え、ルーティング層で適用される 2 つの保護策により、プロバイダーにかかるコストを制限できます。
search_providers:
youcom:
api_key_env: YDC_API_KEY
cost_per_call: 0.005
daily_budget_usd: 2.50 # skip youcom once it has spent $2.50 today
routing:
cooldown: 90s # after a 429, skip that provider for 90s (default 60s)
- daily_budget_usd(3 つのテーブルのいずれかでプロバイダーごとに設定)— 現在の UTC 日のプロバイダーの支出がこの上限に達すると、ルーターはそのプロバイダーをスキップし、チェーン内の次のプロバイダーに進みます。名前を指定してそのプロバイダーに固定した呼び出しはエラーになります。カウンターは UTC の午前 0 時にリセットされます。値が 0 または未設定の場合、上限はありません。2 つの機能テーブルで同じプロバイダー名を指定した場合、予算はそれぞれ独立します。
- cooldown(トップレベルの
routing:の下)— プロバイダーがレート制限(HTTP 429)を返した場合、この期間はそのプロバイダーが隔離され、チェーンからの連続した呼び出しが止まります。90sや2mのような Go の期間文字列を指定します。無効な値の場合、起動時に警告が表示され、デフォルトの 60 秒が適用されます。上限の有無にかかわらず、すべてのプロバイダーに適用されます。
保護策によってプロバイダーがスキップされた場合、ルーティングトレース(; budget: skipped youcom (...))に記録され、Warn レベルでログに出力されます。チェーン内のすべてのプロバイダーが予算超過またはクールダウン中の場合、何もせずに終了するのではなく、明確なメッセージとともに呼び出しが失敗します。
呼び出しごとの期限:call_timeout
各プロバイダークライアントには独自のリクエストタイムアウト(15~90s)がありますが、応答の遅いプロバイダーをいくつも順番に試すチェーンでは、エージェントが数分間ブロックされる可能性があります。そのため、すべてのルーティングされたツール呼び出し(frugal__search、frugal__extract、frugal__browse、frugal__execute。extract から browse へのフォールフォワードを含む)は、デフォルトで60sの全体期限内で実行されます。各試行に割り当てられるのは残りの予算のみです。期限に達するとフェイルオーバーは停止し(それ以上のプロバイダーは呼び出されず、料金も発生しません)、すべての試行のエラーを示す frugal: call deadline exceeded; <capability> failover stopped after N attempt(s): ... を返して呼び出しは失敗します。
limits:
call_timeout: 45s # "0s" disables the overall deadline
frugal mcp serve --call-timeout 30s で設定を上書きできます。--http を使用する場合は、この値と --request-timeout(デフォルトで30s)のうち短いほうが適用されます。
一時的なエラーの再試行:retries(無料プロバイダーのみ)
無料プロバイダー(設定の cost_per_call: 0)では、一時的なエラー(429、408、5xx、タイムアウト、接続リセット)が発生した場合、フェイルオーバー前にデフォルトで2回再試行します。再試行の間隔は、短いジッター付きのバックオフ(約200ms、続いて800ms)です。有料プロバイダー(cost_per_call > 0:デフォルトでは Serper、You.com、Brave、Firecrawl、Browserless)は再試行されません。タイムアウトや5xxエラーが発生したリクエストにも料金が請求される可能性があるため、二重請求のリスクを避けるため、Frugal は直ちに次のプロバイダーへフェイルオーバーします。有料かどうかは設定された価格で決まるため、プロバイダーの cost_per_call を0に設定すると再試行可能になり、その逆も同様です。
恒久的なエラー(401、402、403、その他の4xx)や、どのプロバイダーでも解決できないエラーは再試行されません。Retry-After ヘッダーがある場合はそれを尊重します。値が5s以下なら、その時間以上待って再試行します。より長い値が指定されている場合は再試行せず、フェイルオーバーします。再試行の待機時間が、残りの call_timeout を超えることはありません。429エラーが発生すると、設定された期間のプロバイダーのレート制限クールダウンが開始され、期間は Retry-After の値まで延長されます(上限は10分)。これは有料・無料のどちらのプロバイダーにも適用されます。
limits:
retries: 1 # free providers only; 0 disables (fail over immediately); max 5
複数試行のレシート:attempts[] と total_cost_usd
cost_usd は、取得した回答の価格を示します。成功したルーティング結果には、各プロバイダー呼び出しを順番に記録した attempts[](provider、outcome = won / empty / error、error_kind、error、latency_ms、cost_usd を含む)と、それらの合計である total_cost_usd も含まれます。そのため、フェイルオーバーした呼び出しでは、試したすべての段階が表示されます。失敗した試行は $0 として記録されます。Frugal は、エラーになったリクエストにプロバイダーが料金を請求しないものと想定しています(ドライバーから、失敗時に料金が発生したとの報告はありません)。有料プロバイダーがヒット件数0の回答を返した場合は課金され、定価が表示されます。同じプロバイダー内での再試行は、1回の試行として数えられます。キャッシュヒットには試行回数がありません。
結果サイズの上限とトークンレシート
ツール呼び出しには料金がかかります。それ以外に、その結果がセッションの残りの間、モデルのコンテキスト内で占めるトークン数もコストになります。MCP クライアントはこの上限を、内容を確認せずに適用します。Claude Code はデフォルトで 25,000 トークンを超える MCP の結果を拒否し、50,000 文字を超える内容は 2 KB のプレビューを付けてファイルに出力します。そのため、長いページは呼び出しに失敗するか、末尾が欠けていることをモデルに知らせないまま途中で切れて届きます。
Frugal ではこの判断をサーバー側に移し、レシートに記載します。すべての frugal__extract、frugal__browse、frugal__execute の応答には、chars_returned、chars_total、est_tokens が報告され、異なる場合は truncated: true も報告されます。frugal__search では結果リストの est_tokens が報告されます。返される内容に上限を設定するには、呼び出し時に max_chars を渡すか、models.yaml でデフォルト値を設定します。
limits:
max_chars: 40000 # default page-content budget per call (about 10k tokens)
frugal__extract {"url": "https://example.com/long-article", "max_chars": 8000}
result › {
"markdown": "...the first 8,000 characters, cut on a word boundary...
[frugal: output truncated to 7996 of 61230 chars; pass a larger max_chars to see more]",
"provider_used": "goreadability",
"cost_usd": 0,
"chars_returned": 7996,
"chars_total": 61230,
"truncated": true,
"est_tokens": 1999
}
- 予算は優先順位に従ってコンテンツフィールド間で共有されます(markdown、次に text、次に html)。そのため、読みやすい表示は残り、生の HTML が最初に削られます。
- 切り詰めはルーン境界に沿って行われ、最も近い単語境界まで戻ります。短縮したフィールドの末尾にマーカーが追加されるため、構造化出力をテキストに平坦化するクライアントでも、切り詰められたことが明確に分かります。
- 呼び出しごとの
max_charsは、設定済みのデフォルト値をどちらの方向にも上書きします。ゼロまたは未指定の場合は上限なしです。これもデフォルトの動作であり、既存の設定では以前とバイト単位で同じ結果が返されます。 - 検索結果は測定のみで、切り詰められることはありません。ここでサイズを調整するには
max_resultsを使い、大きな値にした場合のコストはest_tokensで確認できます。 est_tokensはchars / 4を切り上げた値です。請求額ではなく、計画用の目安です。実際のトークナイザーでは、密度の高い HTML ではより多くなり、文章ではより少なくなります。
結果キャッシュ
デフォルトでは無効です。有効にすると、TTL 内に同一の frugal__search または frugal__extract 呼び出しが繰り返された場合、プロバイダーを呼び出さず、プロセスメモリから応答を返すため、費用はかかりません。エージェントは、再試行ループ、同じクエリを実行する兄弟サブエージェント、同じページについての追加質問など、同じ処理を頻繁に繰り返します。キャッシュが有効なら、料金が発生するのは最初の呼び出しだけです。
cache:
enabled: true
search_ttl: 5m # default 5m; "0" turns search caching off
extract_ttl: 15m # default 15m; "0" turns extract caching off
max_entries: 512 # LRU eviction past this bound (default 512)
- キャッシュヒットは応答内に
cached: true、cache_age_ms、cost_usd: 0として示されます。provider_usedには、元の結果を生成したプロバイダーが引き続き記載されます。古い結果が黙って返されることはありません。エージェントはキャッシュされた応答を受け取ったことと、その経過時間を常に確認できます。 - 設計上、完全一致で判定します。キーにはクエリまたは URL に加え、プロバイダーの返す内容を変えるすべての引数(
max_results、freshness、formats、プロバイダーの固定指定)が含まれます。Phase 3 のセマンティックキャッシュはこのレイヤーの上に構築され、このレイヤーを置き換えるものではありません。 frugal__executeは直接呼び出すツールとエントリーを共有します。そのため、frugal__search("python docs")の後にfrugal__execute("search python docs")を呼び出すとキャッシュヒットし、逆の場合も同様です。execute でpriority: cheapまたはpremiumを明示した場合は、呼び出し元が特定のルーティング結果を要求しているため、キャッシュを迂回します。frugal__browseはキャッシュされません。ページのレンダリングは、呼び出し元がライブ DOM を必要とするケースそのものだからです。- キャッシュはプロセス内のみで、プロセスごとに管理されます。キャッシュされたプロバイダーのペイロードがディスクに書き込まれることはなく、サーバーの終了後まで保持されることもありません。
ドメインポリシー:フェッチを許可するホスト
ルーティングポリシーは、どのプロバイダーが処理を行うかを決定します。ドメインポリシーは、処理がアクセスできるホストそのものを決定します。このポリシーはプロバイダーが呼び出される前に適用されるため、拒否されたターゲットには費用がかからず、マシンの外に出ることもありません。
routing:
domains:
allow: [docs.python.org, github.com] # only these hosts (and subdomains) may be fetched
deny: [gist.github.com, "*.internal"] # never fetched, even when allow would admit them
deny_private: true # refuse loopback, LAN, link-local, and CGNAT targets
- allow を設定すると、ホワイトリストになります。
frugal__extract、frugal__browse、およびfrugal__executeの URL インテントは、対象の配下にないホストを拒否します。未設定の場合、これまでの動作どおり、すべてのホストをフェッチできます。 - deny は、allow ルールに一致する場合や、プロバイダー名を指定した呼び出しであっても、常に優先されます。拒否理由には該当したルールが示されます。
- deny_private は、ループバック、RFC 1918、リンクローカル(169.254.169.254 などのクラウドメタデータエンドポイントを含みます)、キャリアグレード NAT、未指定の IP リテラルに加えて、
localhost、.local、.internal、.home.arpaの名前を拒否します。エージェントがネットワーク経由でアクセスするfrugal mcp serve --httpインスタンス向けの設定です。エージェントが誘導されたページから LAN の情報を読み取られることを防ぎます。 - ルールには、スキーム、ポート、パスを含まないホスト名を指定します。大文字と小文字は区別されません。
example.comはルートドメインとすべてのサブドメインに一致し、*.example.comはサブドメインのみに一致します。不正なルールがあると、何にも一致しないまま黙って処理されるのではなく、理由とともに設定の読み込みが失敗します。 frugal__searchは検索結果リストにも同じルールを適用し、除外した内容をwarningsに報告します(domain policy dropped 2 results ...)。これにより、エージェントに、後で拒否されるリンクが渡されることはありません。
拒否はすべて、ツールと URL とともに Warn レベルでログに記録されます。拒否が相次ぐ場合は、エージェントがアクセスすべきでない場所へ誘導されている兆候です。これがこのポリシーの狙いです。フェッチしたウェブコンテンツは、エージェントスタックにおけるプロンプトインジェクションの主な取り込み口であり、この設定でその侵入を防ぎます。
制限事項もあります。一致判定には、記述された URL を使用します。ホスト名は解決されないため、プライベートアドレスを指すパブリック名は deny_private で検出されません。また、プロバイダーがたどるリダイレクトは再チェックされません。これはポリシーによる制限であり、ネットワークサンドボックスではありません。
ループガード
3つ目の安全策は、ほかの2つでは予測できない問題、つまりエージェントが同じツール呼び出しを繰り返す状態を検出します。予算制限が作動するのは費用が発生した後であり、クールダウンが作動するのはプロバイダーが 429 を返した後です。無料の段階では、どちらも作動しません。MCP 仕様にはクライアント向けのバックオフ規約がないため、サーバーが停止を指示する必要があります。
routing:
loop_limit: 5 # identical calls admitted per window (default 5; 0 turns the rail off)
loop_window: 60s # sliding window the limit counts within (default 60s)
デフォルトで有効です。同じツールに、正規化後の引数が同じ(空白を削除し、プロバイダー名の表記を統一するため、書式を少し変えながら繰り返すループもカウントされます)呼び出しが届くと、「同一」と判定します。1分以内に frugal__search が6回同一呼び出しを受けると、プロバイダーに到達する前に拒否され、エージェントが対処できる理由が返されます。
frugal__search: loop guard: this exact frugal__search call has been made 6 times
in the last 1m0s (limit 5); the result will not change, so change the arguments or wait 48s
拒否された呼び出しもカウントされるため、クライアントが呼び出しを続けると、ウィンドウ全体にわたって呼び出しが途絶えるまで拒否され続けます。各ツールは個別のフィンガープリント領域を持ちます(同じ URL に対する extract と browse は別々の呼び出しとして扱われます)。引数(max_results、freshness、priority)が変われば、新しい呼び出しとして扱われます。ガードがメモリ内に保持するのは、上限付きマップに保存された引数のハッシュのみです。クエリの情報がどこかに書き込まれることはありません。ガードの作動は、予算によるスキップのログの横に Warn レベルで記録されます。
呼び出しごとのコスト上限:max_cost_usd
日次予算は、1 日を通じてウォレットを保護します。max_cost_usd を使うと、エージェントは呼び出しごとに、1 つの質問にいくらの価値があるかを判断できます。ルーティング対象の各ツール(frugal__search、frugal__extract、frugal__browse、frugal__execute)で指定できます。
frugal__search {"query": "is this library still maintained", "max_cost_usd": 0.001}
frugal__execute {"intent": "read https://example.com/post", "max_cost_usd": 0}
- 1 回あたりの実効価格が上限を超えるプロバイダーは、呼び出しが行われる前にチェーンから除外されるため、フォールバック先としても使われません。残りのチェーンは、通常どおり設定したポリシーに従ってルーティングされます。
0は無料プロバイダーのみを意味します。実効価格はクォータを考慮します。今月の無料クォータが残っている有料プロバイダーは、無料として扱われます。- 設定した上限を超える価格のプロバイダーを固定しようとすると、拒否されたプロバイダーや予算超過のプロバイダーを固定する場合と同様に、費用が発生する前に拒否されます。
frugal__executeでは、上限は抽出からブラウズへのフォールフォワードにも適用されます。上限を0にした呼び出しが、有料のレンダリングへフォールフォワードすることはありません。空の抽出結果が、理由を示す警告とともに返されます。- スキップされた項目はトレースで確認できます(
; ceiling: skipped youcom (youcom costs $0.0050 per call, above max_cost_usd $0.0010))。条件を満たすプロバイダーがない場合は、最も安価な設定済みプロバイダーとその価格がエラーに表示されるため、エージェントは上限を引き上げるか、次に進むことができます。
この設定を省略すれば、ルーティングは従来どおりです。上限はエージェントがリクエスト時に指定する設定であり、オペレーターの daily_budget_usd、deny、cooldown は引き続き適用されます。
作業内容を指定する:frugal__execute
ツールを選ぶ代わりに、エージェントは意図と優先度を指定できます。Frugal はその内容を機能に分類し(URL とキーワードを手がかりに判定。決定論的で、モデル呼び出しはありません)、設定したポリシーに従ってルーティングします。ライブのゼロキー実行で取得した結果:
frugal__execute {"intent": "search for MCP server security best practices"}
result › {
"capability": "search",
"provider_used": "youcom-free",
"cost_usd": 0,
"latency_ms": 594,
"reason": "routed to a web search; policy=cheap: effective cost ascending; provider=youcom-free won on attempt 1",
"results": [
{"title": "MCP Server Security Best Practices for Safe AI Deployments", "url": "https://www.truefoundry.com/blog/mcp-server-security-best-practices", ...},
{"title": "GitHub - slowmist/MCP-Security-Checklist", "url": "https://github.com/slowmist/MCP-Security-Checklist", ...},
...
]
}
priority: "cheap" | "balanced" | "premium" は、上記のポリシーに対応します(balanced は設定済みの戦略に従います)。URL に関する意図の場合は抽出を実行し、ページに JS が必要な場合はヘッドレスレンダリングにフォールフォワードします。費用は合算されます。reason フィールドは、どのポリシーのもとで何が判断され、どの試行でどのプロバイダーが選ばれたかを示す記録です。機能がすでに分かっている呼び出し元は、引き続き直接ツール(frugal__search、frugal__extract、frugal__browse)を利用できます。
利用した内容を確認する
コストは Frugal の主要なポリシーであり、記録はその証明です。すべての呼び出しはローカルの台帳に記録されます(~/.frugal/usage、JSONL 形式。マシンの外部に送信されることはありません。FRUGAL_STATS=off で無効にできます)。frugal stats を実行すると、今月の記録が表示されます。
frugal receipt · July 2026 (UTC)
────────────────────────────────────────────────
tool provider calls paid
search marginalia 1 $0.0000
search wikipedia 1 $0.0000
extract goreadability 1 $0.0000
────────────────────────────────────────────────
total 3 $0.0000
same calls at premium rack rate* $0.0060
you paid $0.0000
────────────────────────────────────────────────
you saved $0.0060 (100%)
────────────────────────────────────────────────
* rack rate = list price of each capability's premium
provider, snapshotted at call time. failed calls excluded.
実際に結果を返した呼び出しだけが料金の対象になります。フォールバックの試行や、結果が 0 件だった呼び出しによって数値が水増しされることはありません。
API キーを設定する(任意)
キーを追加すると、より高性能な有料プロバイダーを利用できます。Frugal は環境変数からキーを読み取り、設定済みのプロバイダーのツールのみを登録します。
# Search — frugal__search
export SEARXNG_URL=... # free, self-hosted (You.com free tier, Marginalia, Wikipedia need no key)
export SERPER_API_KEY=... # cheap paid
export BRAVE_API_KEY=... # independent index (Brave Search), $5/mo credit
export YDC_API_KEY=... # premium paid (You.com)
# Extract — frugal__extract (goreadability + Jina Reader are free, no key)
export JINA_API_KEY=... # optional: lifts Jina Reader from 20 to 500 requests/min
# (also add api_key_env: JINA_API_KEY to the jina entry)
export FIRECRAWL_API_KEY=... # premium paid (anti-bot pages, PDFs)
# Browse — frugal__browse
export BROWSERLESS_TOKEN=... # headless render
以上です。エージェントを再起動してください。設定済みのプロバイダーのツールのみが登録されます。
ルーティングテーブル
ツールの価格は、モデルの価格ほど下がっていません。You.com は 1 回あたり $0.005 で、1 回あたり $0.001 の Serper の 5 倍です。自分のマシンで実行する SearXNG は無料です。
| 機能 | 無料/ローカル | 低価格の有料 | プレミアムの有料 | ステータス |
|---|---|---|---|---|
| 検索 | SearXNG · You.com free tier · Marginalia · Wikipedia | Serper 1 回あたり $0.001 | You.com 1 回あたり $0.005 · Brave 1 回あたり $0.005 | 提供中 |
| 抽出 | go-readability(ローカル)· Jina Reader(ホスト型 JS レンダリング) | — | Firecrawl 1 ページあたり $0.001 | 提供中 |
| ブラウズ | ローカル Playwright (延期) | Browserless 1 レンダリングあたり $0.002 | Browserbase (計画中) | 一部提供 |
| 埋め込み | nomic-embed-text、bge-large | text-embedding-3-small 100 万トークンあたり $0.02 | 3-large、Voyage-3、Cohere | 計画中 |
| 文字起こし | whisper.cpp | Deepgram Nova 1 分あたり $0.0043 | OpenAI Whisper 1 分あたり $0.006 | 計画中 |
cheap ポリシーでは、Frugal は列を左から右へたどり、差額を節約できます。fast と premium はその順序を変更し、deny は列を完全に除外します。コストは複数あるポリシーの一つですが、支出の明細が残るのはこのポリシーです。
現在提供している機能
1 つの MCP サーバー、4 つのツール、9 つのプロバイダー:
frugal__execute— 提供中。ジョブ(intent、任意のpriority)を指定すると、ヒューリスティックに基づいて機能に分類し、ポリシーに従ってルーティングします。完全なルーティングトレース(capability、provider_used、cost_usd、reason)を返します。frugal__search— 提供中。SearXNG(無料、セルフホスト可能)、You.com free tier(youcom-free:無料、公開、ホスト型 MCP、1 日あたり約 100 件のクエリ)、Marginalia(無料、公開)、Wikipedia(無料、公開)、Serper($0.001/call)、You.com($0.005/call)、Brave Search($0.005/call、Brave 独自の独立したインデックス)にわたってルーティングします。どのプランにも月額 $5 のクレジットが含まれているため、daily_budget_usd: 0.16に設定すれば、軽い利用はクレジット内に収まります。無料プロバイダーから結果が 0 件返された場合、チェーンは次の段階に進みます。有料プロバイダーから結果が 0 件返された場合はチェーンを終了します(クエリに結果がないため、より高価なプロバイダーに確認を依頼しても意味がありません)。frugal__extract— 提供中。go-readability(無料、純粋な Go によるローカル Readability)、Jina Reader(無料、ホスト型のヘッドレスレンダリング:キーなしで毎分 20 リクエスト、無料のJINA_API_KEYを使うと 500 リクエスト)、Firecrawl(~$0.001/page、ボット対策と PDF に対応)にわたってルーティングします。まずローカルで処理するため、静的ページがマシンの外に送信されることはありません。JavaScript でコンテンツをレンダリングするページだけがホスト型の段階に進み、そこでも結果が得られない場合にのみ、有料のスクレイピングを行います。Jina に送信されるのは対象 URL のみで、それ以外は送信されません。抽出を完全にローカルで行うには、extract_providersの下にjina: {enabled: false}を設定します。frugal__browse— 一部提供。Browserless(~$0.002/render、ヘッドレス Chrome)は提供中です。ローカル Playwright は延期されています。- ルーティングポリシー — 提供中。機能ごとの
strategy(cheap / fast / premium)、明示的なorder、denyリストに対応します。 - ドメインポリシー — 提供中。各フェッチに対する
allow/denyホストリストとdeny_privateに対応します。プロバイダーの呼び出し前に適用され、検索結果にも適用されます。 frugal stats— ローカルでの節約額の明細です(上記を参照)。- Stdio と Streamable HTTP のトランスポートに対応します。HTTP は、MCP 2026-07-28(ステートレス)と、それ以前のセッションベースのリビジョンを 1 つのエンドポイントで提供します。ロードバランスされたレプリカでは
--statelessを指定できます。ツールカタログにはttlMsキャッシュヒントを設定できます。 - HTTP トランスポートは、ベアラートークン認証(
FRUGAL_AUTH_TOKEN)、IP ごとのレート制限、/metricsエンドポイント(Prometheus 形式のテキスト:frugal_calls_total{tool=,provider=}など)に対応します。 frugal mcp installは、Claude Desktop、Cursor、AnythingLLM、Claude Code に適切な設定を書き込みます。
ロードマップ
-
Phase 3 — 埋め込み、文字起こし、コード実行、ローカルチャット モデル、セマンティックキャッシュ。
-
Phase 4 — Frugal Cloud (未提供 — ウェイトリスト受付中)。バイナリは ローカルに留まり、セルフホスト可能です。Cloud はその上にチーム向けのレイヤーを追加します。
- ホスト型ポリシー管理(ダッシュボードでルーティングポリシーを編集し、 すべてのアプリにデプロイ)
- チームのワークスペースと共有ポリシーテンプレート
- 組織全体の利用状況分析とコストレポート
- プロバイダーの稼働状況モニタリングとルーティングトレース
- 組織全体の API キー管理
Phase 4 の内容はすべてロードマップであり、製品ではありません。オープンルーターに これが必要になることはなく、ロックインもありません。 ウェイトリストに登録
ソースから
git clone https://github.com/brainsparker/frugal.git && cd frugal && make build
ライセンス
BUSL 1.1 — セルフホストと社内での商用利用が 許可されています。各リリースは公開から4年後に Apache 2.0 に移行します。 平易な英語での概要は LICENSE-BUSL-FAQ.md をご覧ください。
セキュリティ
非公開の脆弱性報告は GitHub Security Advisories からお送りください。 ポリシーの全文は SECURITY.md に記載されています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。