关于 Frugal
Frugal 是可自托管的 Go MCP 服务,按可配置策略在多个提供方之间路由 AI 工具请求。它记录提供方、费用和路由理由,并支持自动故障转移、预算控制与结果大小限制。
主要功能
- 01按策略路由提供方
- 02错误或空结果时自动故障转移
- 03提供方预算与冷却机制
- 04可审计的提供方和费用记录
- 05结果大小限制与 Token 估算
适用场景
- 01将搜索路由至成本较低的提供方
- 02将指定提供方排除在请求链外
- 03为提供方设置每日支出上限
- 04限制返回给 Agent 的长页面内容
MCP 相关
Frugal 位于 MCP 客户端与工具提供方之间,提供搜索、提取、浏览和执行等路由能力。它支持本地 MCP 连接或 Streamable HTTP 客户端。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
frugal
面向 AI 工具的开放路由层。
Frugal 是一个 MCP 服务,位于你的 Agent 与工具提供商之间。你描述要完成的任务——搜索、提取、渲染,或只是表达一个意图——Frugal 就会决定如何完成,并根据策略路由每次调用:默认选择能力足够且价格最低的提供商;你提出要求时,选择速度最快或高端的提供商;合规要求时,固定使用或拒绝某个提供商;提供商出错或未返回结果时,则自动故障转移。每个响应都会附带决策信息——provider_used、cost_usd,以及通过 frugal__execute 返回的一行原因——让你能够审计每次调用为何被路由到相应位置。
适用于任何模型。一个 Go 二进制文件。使用你自己的密钥。无需账户。所有内容都可自托管,无供应商锁定。源代码可用(BUSL 1.1 → Apache 2.0)。
从安装到首次智能路由的工具调用:不到五分钟。
安装
curl -fsSL https://frugal.sh/install | bash
frugal mcp install
第一条命令会将二进制文件放入你的 $PATH。第二条命令会自动检测 Claude Desktop、Cursor、AnythingLLM 和 Claude Code,并将 frugal 合并到各自已配置的 MCP 服务列表中。
AnythingLLM
frugal mcp install 会自行找到 AnythingLLM Desktop,并将 frugal 合并到 <storage>/plugins/anythingllm_mcp_servers.json。对于自托管或 Docker 版 AnythingLLM,请将安装程序指向该实例的存储目录(即其自身 STORAGE_DIR 使用的路径):
ANYTHINGLLM_STORAGE_DIR=/path/to/anythingllm/storage frugal mcp install --client anythingllm
重启 AnythingLLM,然后在 Agent Skills → MCP Servers 下查找 frugal。这些工具会加载到 Agent 会话中,因此请在 @agent 聊天中调用它们。在 Docker 中,command 路径必须在容器内部可解析——将 frugal 二进制文件挂载到容器中,或者在主机上运行 frugal mcp serve --http,并将其注册为 streamable 服务。
Streamable HTTP 和 MCP 2026-07-28
frugal mcp serve --http ADDR 会提供 Streamable HTTP,供远程客户端和 Docker 环境使用。它支持当前的 MCP 修订版 2026-07-28,该版本移除了协议级会话和 initialize 握手,也支持此前基于会话的修订版。两类客户端都连接到同一端点:
- 使用 2026-07-28 或更高版本协议的客户端以无状态方式提供服务:不使用
Mcp-Session-Id,每个 POST 请求都独立完整;收到server/discover请求时,会返回支持的版本和能力。 - 较旧的客户端(2025-11-25 及更早版本)会继续保留会话和可选的 GET 事件流,因此你已在运行的主机无需做任何改动。
传入 --stateless 可对所有客户端禁用会话。如果多个 frugal 副本位于普通负载均衡器后方,这正是你所需要的:任何副本都可以响应任何请求。较旧的客户端在此模式下仍可正常工作,只是无法使用可选的 GET 流(会以 405 拒绝,符合规范允许的行为)。
目录结果(tools/list、server/discover)会附带一个小时的 ttlMs 提示,并设置 cacheScope: public,这样符合当前规范的客户端就不会在每轮对话时重新获取工具列表。目录在进程运行期间保持固定,因此只有使用新配置重启进程才会改变目录。
FRUGAL_AUTH_TOKEN=... frugal mcp serve --http 0.0.0.0:8765 --stateless
立即试用(无需密钥)
搜索和提取开箱即用:You.com 免费层
(youcom-free:与需要密钥的 You.com 提供商使用同一个主要网络索引,
通过 You.com 托管的 MCP 端点访问,无需密钥或账户,
每天约 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
每天最多约 100 次查询;Marginalia 确实擅长文章、文档、博客和
小众技术写作,但不擅长主流新闻和产品页面;Wikipedia 覆盖实体
和参考资料主题。零密钥模式确实适用于研究和本地提取工作流,
但并非无限使用。只需设置一个环境变量,即可改变这一点:
SEARXNG_URL(免费、可自托管)、SERPER_API_KEY(每次调用 $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 会在响应中返回该策略。
支出上限和速率限制冷却
两项防护措施用于限制提供商可能产生的费用,并与上述策略一同在路由 层执行:
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(可用于三个表中的任意一个,按提供商设置)——当 某提供商在当前 UTC 日的支出达到此上限后,路由器会跳过该提供商, 改用链中的下一个提供商;若调用按名称固定指定该提供商,则会报错。 计数器在 UTC 午夜重置。设为 0 或未设置表示无上限。同一提供商名称 出现在两个能力表中时,分别计算预算。
- cooldown(在
routing:顶层下)——当提供商触发速率限制 (HTTP 429)时,会在这段时间内被暂时禁用,避免链路不断重试。 使用 Go 时长字符串,例如90s或2m;值无效时会在启动时发出 警告,并回退到默认的 60s。适用于所有提供商,无论是否设有支出上限。
防护措施跳过提供商时,会在路由跟踪中注明
(; budget: skipped youcom (...)),并以 Warn 级别记录日志。如果
链中的所有提供商都超出预算或处于冷却状态,调用会返回明确的错误信息,
而非悄无声息地不做任何事。
单次调用截止时间:call_timeout
每个提供商客户端都有自己的请求超时时间(15–90s),但依次调用多个响应缓慢的提供商,仍可能让 Agent 阻塞数分钟。因此,每次路由工具调用(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 假定提供商不会对出错的请求收费(没有驱动程序会报告失败请求的费用)。付费提供商返回零条结果时仍会收费,并显示其标价。在驱动程序内部对同一提供商进行的重试计为一次尝试。缓存命中没有尝试记录。
结果大小上限与 Token 回执
工具调用的成本不仅是金钱,还包括其结果在本次会话剩余时间内占用的模型上下文 Token;而 MCP 客户端会在不知情的情况下强制执行上限:Claude Code 默认会拒绝超过 25,000 个 Token 的 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可以双向覆盖配置的默认值。值为 0 或未设置时表示不设上限,这也是默认行为:现有配置会像以前一样逐字节返回结果。 - 搜索结果只会统计长度,不会截断。此处可通过
max_results控制结果数量,而est_tokens可显示较大值会带来多少开销。 est_tokens的计算方式为chars / 4,向上取整:它只是用于规划的估算值,并非账单金额。对于密集的 HTML,实际分词器统计值通常更高;对于散文,通常更低。
结果缓存
默认关闭。启用后,在 TTL 内重复发起完全相同的 frugal__search 或 frugal__extract 调用时,会从进程内存中返回结果,而不会访问提供方,且不产生费用。Agent 经常会重复执行相同操作:重试循环、同级子 Agent 发出相同查询,以及针对同一页面提出后续问题。启用缓存后,只有首次调用会产生费用。
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仍会标明生成原始结果的提供方。结果不会在无提示的情况下过期:Agent 始终能看到自己收到的是缓存答案及其缓存时间。 - 缓存按设计采用精确匹配:键包含查询或 URL,以及每个会影响提供方返回内容的参数(
max_results、freshness、formats、提供方固定设置)。第 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名称。适用于 Agent 通过网络访问的frugal mcp serve --http实例:Agent 被引导访问的页面无法借此读取你的局域网。 - 规则必须是纯主机名,不区分大小写,且不能包含方案、端口或路径。
example.com会匹配顶级域名和所有子域名;*.example.com只匹配子域名。规则格式错误时,配置加载会失败并说明原因,而不会静默地匹配不到任何内容。 frugal__search会对结果列表应用相同规则,并在warnings中报告移除的内容(domain policy dropped 2 results ...),因此 Agent 不会收到之后会被拒绝的链接。
每次拒绝都会以 Warn 级别记录工具和 URL。大量拒绝意味着 Agent 正被引导至不该访问的地方,这正是此策略的目的:抓取的网页内容是 Agent 技术栈中提示词注入的主要入口,而此设置可以将其拦在边界之外。
需要明确的是:匹配依据是 URL 中写出的内容。主机名不会被解析,因此指向私有地址的公网名称不会被 deny_private 拦截;提供商跟随的重定向也不会重新检查。这是策略护栏,不是网络沙箱。
循环防护
第三道护栏可以捕捉前两道无法预见的故障:Agent 陷入反复发出相同工具调用的循环。预算只有在花完钱后才会触发,冷却机制只有在提供商返回 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)
默认启用。当相同工具收到相同的标准化参数(去除空格、统一提供商名称大小写,因此即使循环中格式略有变化,也仍会被计入)时,该调用就被视为“相同”。一分钟内第六次完全相同的 frugal__search 调用会在触达任何提供商之前被拒绝,并附上 Agent 可以据此采取行动的原因:
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
每日预算可保护你一整天的开支。max_cost_usd 则让 Agent 可以按调用决定每个问题值得花多少钱。每个路由工具(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}
- 有效单次调用价格高于上限的提供方会在调用前从链中移除,因此也不会作为后备选项被调用。链中的其他提供方仍会按你的策略进行路由。
0表示只使用免费提供方。有效价格会考虑配额:本月仍有免费配额的付费提供方也按免费计算。- 如果你指定的提供方价格高于你设置的上限,系统会在产生任何费用前拒绝该请求,处理方式与指定被拒绝或超出预算的提供方相同。
- 在
frugal__execute中,上限也适用于从提取转为浏览的后续处理。上限设为0的调用绝不会转为付费渲染;提取结果为空,并会附上说明原因的警告。 - 跳过的提供方会显示在跟踪记录中(
; ceiling: skipped youcom (youcom costs $0.0050 per call, above max_cost_usd $0.0010))。如果没有任何提供方符合条件,错误信息会指出已配置提供方中价格最低的一家及其价格,以便 Agent 提高上限或继续处理其他任务。
不设置此参数,路由方式就与原来完全相同。该上限是 Agent 在请求时使用的参数;运营方设置的 daily_budget_usd、deny 和 cooldown 仍会继续生效。
描述任务:frugal__execute
Agent 无需选择工具,可以直接说明意图和优先级。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.
只有实际产生结果的调用才会计入成本统计;后备尝试和未命中结果都不会虚增数字。
设置密钥(可选)
添加密钥即可启用更强大的付费提供方。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
就这么简单。重启你的 Agent 即可。系统只会注册已配置提供方对应的工具。
路由表
工具价格并没有像模型价格那样下降。You.com 的单次调用价格为 $0.005,是 Serper($0.001/次)的 5 倍。在自己的机器上运行 SearXNG 则是免费的。
| 能力 | 免费 / 本地 | 低价付费 | 高端付费 | 状态 |
|---|---|---|---|---|
| 搜索 | SearXNG · You.com 免费套餐 · Marginalia · Wikipedia | Serper $0.001/次 | You.com $0.005/次 · Brave $0.005/次 | 已上线 |
| 提取 | go-readability(本地)· Jina Reader(托管式 JS 渲染) | — | Firecrawl $0.001/页 | 已上线 |
| 浏览 | 本地 Playwright (暂缓) | Browserless $0.002/次渲染 | Browserbase (计划中) | 部分支持 |
| 嵌入 | nomic-embed-text、bge-large | text-embedding-3-small $0.02/1M token | 3-large、Voyage-3、Cohere | 计划中 |
| 转录 | whisper.cpp | Deepgram Nova $0.0043/分钟 | OpenAI Whisper $0.006/分钟 | 计划中 |
采用 cheap 策略时,Frugal 会从左到右遍历各列,你可以保留其中的价差;fast 和 premium 会调整遍历顺序;deny 则会完全排除指定列。成本只是多种策略之一——但它是唯一有收据的策略。
目前已上线的功能
一个 MCP 服务、四个工具、九个提供商:
frugal__execute— 已上线。描述任务(intent,可选的priority);通过启发式分类确定能力,再按策略路由。返回完整的路由跟踪信息(capability、provider_used、cost_usd、reason)。frugal__search— 已上线。在 SearXNG(免费,可自托管)、You.com 免费套餐(youcom-free:免费、公开、托管式 MCP,每天约 100 次查询)、Marginalia(免费、公开)、Wikipedia(免费、公开)、Serper($0.001/次)、You.com($0.005/次)和 Brave Search($0.005/次,使用 Brave 自有的独立索引;每种套餐都包含 $5 的月度额度,因此设置daily_budget_usd: 0.16即可让少量使用不超出额度)之间进行路由。免费提供商返回零条结果时,链会继续尝试下一级;付费提供商返回零条结果时,链会就此结束(该查询没有结果——没必要再付更贵的费用来确认)。frugal__extract— 已上线。在 go-readability(免费、纯 Go 语言的本地 Readability)、Jina Reader(免费、托管式无头渲染:无需密钥时每分钟 20 次请求,使用免费的JINA_API_KEY时每分钟 500 次)和 Firecrawl(约 $0.001/页,提供反机器人防护并支持 PDF)之间进行路由。本地处理会先运行,因此静态页面绝不会离开你的机器;只有在页面通过 JavaScript 渲染内容时,才会进入托管层;只有该层也未能提取内容时,链才会付费抓取。Jina 只会收到目标 URL,不会收到其他内容;在extract_providers下设置jina: {enabled: false},即可完全在本地完成提取。frugal__browse— 部分支持。Browserless(约 $0.002/次渲染,无头 Chrome)已上线;本地 Playwright 暂缓。- 路由策略 — 已上线。按能力设置
strategy(cheap / fast / premium)、显式指定order、设置deny列表。 - 域名策略 — 已上线。为每次抓取设置
allow/deny主机列表和deny_private,在调用提供商前强制执行,并应用于搜索结果。 frugal stats— 本地节省情况收据(见上文)。- Stdio 和 Streamable HTTP 传输。HTTP 在同一端点上提供 MCP 2026-07-28(无状态)和此前基于会话的版本;可使用
--stateless配置负载均衡副本;工具目录支持ttlMs缓存提示。 - HTTP 传输支持 bearer token 身份验证(
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 — 允许自托管和内部商业用途。每个版本在发布四年后转换为 Apache 2.0。 LICENSE-BUSL-FAQ.md 中提供了通俗易懂的摘要。
安全
可通过 GitHub Security Advisories 私下报告漏洞。 完整政策见 SECURITY.md。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。