Unbounded Consumption Auditor
概要
作者による説明(英語の原文)
Scans LLM/agent code for Unbounded Consumption / denial-of-wallet risks (OWASP LLM Top 10 2026 #6)
PopNx MCPの3つの柱
この3つを1つのスコアにまとめることはしません。意見、測定、人気はそれぞれ別のものだからです。
- 利用者の声iレビューはまだありませんレビューは今後のステップで、アカウント機能と一緒に始まります
- 私たちの基本チェックi1項目中0項目に合格公開情報からチェック。コードはまだスキャンしていません
- 利用状況iとても新しい↓ 316/週 · ★ –
できること
このサーバーのやさしい解説はまだ書いていません。以下はレジストリから読み取った事実です。
- 接続方法: パソコンで動く
- トランスポート: stdio
- カテゴリ: 検索・AIの記憶
インストール
使っているAIアプリを選んで、設定をコピーしてください。
インストールの前に
- 基本チェック:1項目中0項目に合格
- あなたのパソコンで、あなたのユーザーと同じ権限(ファイル、ネットワーク、アプリ)で動きます。
- レジストリには、入力が必要なキーは載っていません。
必要なもの
- npmNode.jsのインストール(npxコマンドに必要)
どのアプリを使っていますか?
上でアプリを選んでください。選んだアプリを覚えておくので、次からはボタンに「…にインストール」と表示されます。
Claude Desktop → Settings → Developer → Edit Config を開き、claude_desktop_config.json にこれを貼り付けます
{
"mcpServers": {
"unbounded-consumption-auditor": {
"command": "npx",
"args": [
"-y",
"@guardbee/mcp-unbounded-consumption-auditor"
]
}
}
}ターミナルでこれを実行します
claude mcp add unbounded-consumption-auditor -- npx -y @guardbee/mcp-unbounded-consumption-auditorまたは、設定を自分でコピーする
プロジェクトの .cursor/mcp.json、または ~/.cursor/mcp.json に貼り付けます
{
"mcpServers": {
"unbounded-consumption-auditor": {
"command": "npx",
"args": [
"-y",
"@guardbee/mcp-unbounded-consumption-auditor"
]
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
または、設定を自分でコピーする
プロジェクトの .vscode/mcp.json に貼り付けます
{
"servers": {
"unbounded-consumption-auditor": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@guardbee/mcp-unbounded-consumption-auditor"
]
}
}
}ブラウザがアプリを開いてよいか確認し、そのあとアプリが設定を表示して確認を求めます。キーの値は空欄のままなので、自分で入力してください。
これはパソコンで動くサーバーですが、ChatGPTがつなげるのはインターネット上のサーバーだけです。ほかのアプリを選んでください。
選んだアプリは、この端末のCookieに保存されます。アカウントは不要です。
この設定は、作者のレジストリ登録情報から作成しています。READMEと違う場合は、READMEに従ってください。
できること
パソコンで動くサーバーです。インストールすると、ツール一覧がAIアプリに表示されます。
基本チェックi
誰でも見られる情報をチェックしており、コードは読んでいません。当てはまらない項目は数に入れていません。 · 2026年11月9日にチェック
- ! 注意
作者とリポジトリが一致
公開者(4hmetuyar)がリポジトリの所有者(GuardBee)ではありません。別の人が登録した可能性があります
- … 未チェック
今もメンテナンスされている
このリポジトリはまだGitHubから読み取っていません
- … 未チェック
ライセンスがある
このリポジトリはまだGitHubから読み取っていません
- – 対象外
エンドポイントが応答する
これはパソコンで動くため、インターネット上のエンドポイントはありません
- – 対象外
OAuthでサインイン
パソコンで動き、代わりにローカルの設定を使います
- … 未チェック
ツールの説明に隠れた指示がない
パソコンで動くサーバーです。ツール一覧を読み取れるのは、インターネット上のエンドポイントがある場合だけです
検索・AIの記憶のほかのサーバーとの比較i
- このカテゴリのほかの5730件のうち0%よりスターが多い
- このカテゴリのほかの5730件のうち49%より最近レジストリに公開
- 基本チェックの結果が、このカテゴリのほかの5730件のうち17%と同じかそれ以上
レジストリでこのカテゴリにある有効なすべてのサーバーと比較しています。スターは、公開者がリポジトリの所有者である場合だけ数えます。
よくある質問
Unbounded Consumption Auditorは安全ですか?
当てはまる基本チェック1項目のうち0項目に合格しました。コードは読んでいません。キーやトークンを追加する前に、サーバーがどんなアクセスを求めているかを確認し、必要な権限だけを持つキーを使ってください。
どんなキーやコードが必要ですか?
レジストリには必須のキーは載っていません。ただし、最初に使うときにサインインを求めるサーバーもあります。
パソコンで動きますか、それともクラウドですか?
あなたのパソコンで動きます。必要なときにAIアプリが起動し、データは作者のサーバーを通りません(サーバー自体がオンラインサービスを呼び出す場合を除きます)。
今もメンテナンスされていますか?
GitHubリポジトリの最終更新は–、最新バージョン(0.1.2)がレジストリに届いたのは41 日前です。
どのアプリで使えますか?
Claude Desktop、Claude Code、Cursor、VS CodeなどのMCP対応アプリで使えます。パソコンにNode.jsも必要です。
代わりに使えるものは?
同じカテゴリには:Context7, Codebase Memory, Exa
代わりの候補
同じカテゴリで、ほかの作者が作ったサーバー。スターの多い順。
カードの見方:↓ 週あたりのダウンロードi★ GitHubスターi3つの柱:レビュー · チェック · 利用状況i更新=最新バージョンをレジストリに公開した日i
Codebase Memory
Codebase knowledge graph for AI agents — 162 languages, sub-ms queries, 99% fewer tokens.
Exa
Connect AI agents to Exa for web search, content fetching, and multi-step research.
作者のREADME
READMEを開く
作者のリポジトリから書かれたとおりにコピーしたものです。PopNx MCPは内容を確認・推奨していません。HTML、画像、スクリプトは取り除いています。リンクはこのサイトの外へ移動します。
@guardbee/mcp-unbounded-consumption-auditor
🇬🇧 English | 🇹🇷 Türkçe | 🇨🇳 中文 | 🇯🇵 日本語 | 🇰🇷 한국어 | 🇧🇷 Português | 🇪🇸 Español | 🇩🇪 Deutsch
An MCP (Model Context Protocol) server that scans LLM/agent application code for Unbounded Consumption — OWASP LLM Top 10 2026's #6 category, also known as "denial of wallet": nothing stops the application from making unlimited billable calls.
Telemetry is off by default. With
GUARDBEE_TELEMETRY=1it sends the server, tool, success, duration and short parameter values such as a file path; longer strings and fields likecontent,tokenorpasswordare replaced with a placeholder. See@guardbee/mcp-telemetry.
Claude ──► unbounded-consumption-auditor ──► your LLM/agent source
│ ├─ missing-token-limit (no cap on how much the model can generate) ├─ missing-timeout (a hand-rolled call to an LLM endpoint that can hang forever) ├─ unbounded-loop (an agent/retry loop with no iteration cap) ├─ disabled-safety-limit (a framework's own loop cap explicitly turned off) └─ missing-rate-limit (an MCP tool making billable calls with no throttling)
OWASP's own write-up on this category gives a concrete cost example worth keeping in mind while reading findings: *"A research assistant agent without any recursion limit or call budget ended up making 500 tool calls with a simulated cost of $10... An agent with a call budget, a recursion depth limit and an agentic circuit breaker... completed one tool call, spending just $0.02."*
Why these five checks specifically
Every pattern here was checked against real SDK source or real code before being written — not guessed from training-data assumption.
- Missing token limit targets
.chat.completions.create(...)calls (OpenAI Python/JS) with neithermax_tokensnormax_completion_tokensset. It's deliberately scoped to OpenAI-shaped calls only: Anthropic's own SDK makesmax_tokensa required constructor argument — it raises before the request is even sent — so a matching check there would be 100% false positives. Reasoning models (o1+) silently ignoremax_tokensand needmax_completion_tokensinstead, so the check only flags a call missing *both*. - Missing timeout targets hand-rolled
requests/axios/fetchcalls whose own argument span mentions a known LLM endpoint (api.openai.com,api.anthropic.com,/chat/completions,/v1/messages). The official OpenAI/Anthropic SDKs already ship a bounded client-level default (openai-node: 600s) — flagging those would just be noise.requests.post()'s own Quickstart warns that an unsettimeoutcan leave a program waiting indefinitely; axios and barefetchhave the same no-default-timeout shape. - Unbounded loop covers two real shapes, both real-code-verified: a hand-rolled
while True:/while(true)agent loop that dispatchestool_callswith nothing nearby suggesting an iteration cap (the exact shape quoted from a public 70-line-agent walkthrough), and a retry loop that catches an exception, calls straight back into an LLM, andcontinues with no attempt counter (OWASP's own write-up calls this out by name: *"a failed step might be retried repeatedly"*). The retry-loop check is deliberately scoped to loops that actually call an LLM — an early version without that scoping flagged ordinary polling/retry code in a real open-source codebase during testing (see Development below). - Disabled safety limit flags
max_iterations=None(LangChain'sAgentExecutor) andmax_turns=None(openai-agents-python'sRunner.run/run_sync) — both verified against real source before shipping. LangChain'sAgentExecutordefaultsmax_iterationsto 15, and its own_should_continue()only enforces the capif self.max_iterations is not None— soNonegenuinely disables it. openai-agents-python's own issue tracker states plainly thatmax_turns=Nonedisables the turn limit. LangGraph's `recursion_limit` has no equivalent — it requires a concrete number — so no pattern is shipped for it, rather than guessing at an unverified "disable" mechanism. - Missing rate limit is the one heuristic pattern here, shipped at medium (not high/critical) severity on purpose: no MCP SDK (TypeScript or Python) provides a built-in per-caller throttling hook on tool registration, unlike the bounded defaults LangChain/LangGraph ship for iteration caps. Multiple independent 2026 write-ups describe the fix as a hand-rolled wrapper around
server.tool()/@mcp.tool(), implying there's no framework default to fall back on. This check can't see a rate limiter enforced elsewhere (an API gateway, middleware in another file) — see Limitations.
Relationship to `ai-code-scanner`: that package already has a coarser unbounded_agent_loop pattern (any while(true)/for(;;) within 200 characters of a .chat.completions.create/.messages.create call, under its excessive-agency category) — it doesn't check whether the loop actually dispatches tool calls, and doesn't check for a nearby iteration-cap hint, so it would also flag a loop that's already properly bounded. This package's unbounded_tool_calling_loop is narrower and cost-specific: it requires an actual tool_calls/toolCalls reference (the real agentic-dispatch shape) and explicitly skips loops with a visible cap hint nearby.
Features
- 7 patterns across 5 categories, each grounded in real SDK source, a real code walkthrough, or OWASP's own 2026 write-up — cited inline in the pattern comments
- 25 tests (positive + negative for every pattern, including the exact quoted real-world loop snippet the unbounded-loop checks are built from)
- SARIF 2.1.0 output — CI/CD integration (GitHub Code Scanning, etc.)
- End-to-end verified against a planted-vulnerability fixture (all 7 patterns caught, all 3 "safe counterpart" negatives correctly skipped) and against a real 3,414-file open-source codebase (
IBM/mcp-context-forge) plus this monorepo's own 495 files — zero false positives in production code. Two real false positives *were* found and fixed during that verification, before shipping: an early, wider loop-body window let an unrelatedexcept/continueelsewhere in the same file get mistaken for part of a nearby loop (fixed by requiring an LLM-call hint in the window and shrinking it), and a disabledmax_iterations=Nonea few lines below a loop was briefly mistaken for a legitimate nearby iteration cap (fixed by stripping disabled-cap assignments before testing for a real one).
Quick Start
Claude Desktop / MCP Client
{
"mcpServers": { "guardbee-unbounded-consumption-auditor": { "command": "npx", "args": ["-y", "@guardbee/mcp-unbounded-consumption-auditor"] } } }
CLI (CI/CD)
npx @guardbee/mcp-unbounded-consumption-auditor scan . --fail-on=high --format=sarif > results.sarif
MCP Tools
| Tool | Description |
|---|---|
scan_text | Scan a code snippet for Unbounded Consumption anti-patterns |
scan_file | Scan a single file |
scan_directory | Recursively scan a directory |
list_patterns | List every pattern this auditor detects, grouped by category |
Detected Patterns
| Pattern | Category | Severity | Meaning |
|---|---|---|---|
openai_chat_completion_missing_max_tokens | missing-token-limit | medium | An OpenAI chat completion call has neither max_tokens nor max_completion_tokens set |
raw_http_call_to_llm_endpoint_missing_timeout | missing-timeout | medium | A hand-rolled HTTP call to a known LLM endpoint has no timeout/AbortSignal |
unbounded_tool_calling_loop | unbounded-loop | medium | A hand-rolled while(true)/while True: loop dispatches tool_calls with no visible iteration cap |
unbounded_retry_loop | unbounded-loop | medium | A retry loop around an LLM call catches an exception and continues with no attempt counter |
langchain_max_iterations_disabled | disabled-safety-limit | high | LangChain's AgentExecutor max_iterations explicitly set to None |
openai_agents_max_turns_disabled | disabled-safety-limit | high | openai-agents-python's Runner max_turns explicitly set to None |
mcp_tool_billable_call_no_rate_limit | missing-rate-limit | medium | An MCP tool handler makes a billable LLM call with nothing suggesting per-caller rate limiting |
Configuration (guardbee.yml)
unbounded-consumption-auditor:
fail-on: high # any | critical | high | medium | low | none max-files: 5000 exclude:
- ".test.ts"
Limitations (by design)
- Bounded-window heuristics, not real control-flow analysis. The loop checks look at a fixed character window after
while True:/while(true), not the actual loop body — a loop with an unusually long body, or one whose cap check lives outside that window, can be missed. Testing against real code found the reverse failure mode too (an unrelatedexcept/continuefurther down getting mistaken for part of a nearby loop) and tightened the window accordingly; it's still a heuristic, not a parser. - The rate-limit check can't see enforcement elsewhere. A tool handler with no rate-limiter in its own body might still be protected by an API gateway, middleware in another file, or a wrapper this scanner doesn't trace into — this check flags what's visible in the handler itself, nothing more.
- No cross-function default detection. If a project sets an output limit or timeout once, centrally, and every call site relies on that default implicitly (rather than passing it per-call), the per-call checks here will still flag each call site individually.
- LangGraph's `recursion_limit` isn't checked. Unlike LangChain and openai-agents-python, LangGraph's recursion limit requires a concrete number — there's no verified "set it to disable" mechanism, so no pattern is shipped for it rather than guessing at one.
Development
npm run build
npm test # 25 unit tests
License
MIT — GuardBee
Feedback
Questions, ideas, or a false positive? Start a thread in GitHub Discussions or open an issue. If GuardBee is useful to you, a ⭐ on the repository helps others find it.