Model Finder
Recommends, evaluates, and routes across OpenAI models, helping find the cheapest OpenAI model that passes your own tests and escalating on failure.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Model Finderfind the cheapest model that passes my eval suite"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Runs locally. Model Finder is a set of four Agent Skills plus a local MCP server (mcp/server.py, Python 3.9+ standard library, no dependencies). The server makes no network calls, needs no API keys, never writes files and never sends anything to Indigloo. Only the eval script and the router it generates call model providers, with your own keys, when you run them.
How it works
flowchart LR
A["Audit<br/><sub>models and SDKs in your repo</sub>"] --> B["Draft evals<br/><sub>from your prompts, PII dropped</sub>"]
B --> C["Evaluate<br/><sub>your keys · pass rate · latency · cost</sub>"]
C --> D["Rank<br/><sub>cost per passing answer</sub>"]
D --> E["Route<br/><sub>cheapest first, escalate on failure</sub>"]
F["Size<br/><sub>weights + KV cache vs your GPU</sub>"] -.-> C
classDef step fill:#f3f0e8,stroke:#1c1b19,color:#1c1b19;
classDef pick fill:#f3f0e8,stroke:#cd462a,color:#cd462a;
class A,B,C,E,F step;
class D pick;Skill | What it does |
| Recommends models across Claude, Gemini, OpenAI, cloud, and local options for your task, budget, and route, including coding subtasks in an IDE. |
| Runs your examples against shortlisted models and measures pass rate, latency, and billed cost with your own keys. |
| Builds a cheapest-first routing setup: a standalone router with quality guards plus a LiteLLM config. |
| Estimates memory for weights and KV cache and compares it with your hardware. |
Advisory only: nothing is deployed, your active model is never changed, and data goes only to providers you configure and approve. Personal data and secrets are blocked before sending by default; see DATA-PROTECTION.md for how this maps to India's DPDP Act.
Related MCP server: tierline
Install
Requires Python 3.9+ on your PATH as python3 (see Windows). Nothing to pip install.
Client | Command | Skills | MCP tools |
Claude Code |
| ✅ | ✅ via |
OpenAI Codex CLI |
| ✅ | ✅ via |
GitHub Copilot CLI |
| ✅ | ✅ via |
Gemini CLI |
| ✅ | ✅ via |
Cursor | Install from the Cursor marketplace or cursor.directory once listed. Until then, clone into | ✅ | ✅ via |
Any MCP client, from PyPI |
| — | ✅ |
VS Code, JetBrains, Windsurf, others | Add the server to the client's MCP settings (manual setup) | — | ✅ |
Other Agent Skills clients | Copy | ✅ | — |
Gemini CLI only starts extension MCP servers in folders you have trusted; it asks the first time you open a project.
Manual MCP setup
{
"servers": {
"model-finder": {
"type": "stdio",
"command": "python3",
"args": ["/absolute/path/to/EvalHarness/mcp/server.py"],
"env": { "MODEL_FINDER_ROOT": "${workspaceFolder}" }
}
}
}{
"mcpServers": {
"model-finder": {
"command": "python3",
"args": ["/absolute/path/to/EvalHarness/mcp/server.py"],
"env": { "MODEL_FINDER_ROOT": "${workspaceFolder}" }
}
}
}If the client has no workspace variable, write the project path:
{
"mcpServers": {
"model-finder": {
"command": "python3",
"args": ["/absolute/path/to/EvalHarness/mcp/server.py"],
"env": { "MODEL_FINDER_ROOT": "/absolute/path/to/your/project" }
}
}
}Clone the repo once and replace /absolute/path/to/EvalHarness. Repository tools read only inside the workspace: the roots your client shares over MCP, else MODEL_FINDER_ROOT, else the server's working directory. A filesystem root or home directory is refused.
Windows
Codex, Copilot CLI and Cursor start the server as ./mcp/server.py, which relies on its #!/usr/bin/env python3 line; on Windows use the manual setup or uvx model-finder-mcp. If python3 is not on your PATH, the MCP server will not start. Install Python from python.org (tick "Add python.exe to PATH") and either create a python3 alias or use the manual setup with "command": "py" and "args": ["-3", "C:/path/to/EvalHarness/mcp/server.py"].
MCP tools
Ten read-only tools, so the same features work as tools in every supported IDE:
Tool | What it does |
| Lists AI model IDs and SDKs in your repo with file:line locations, routes and hard-coded IDs |
| Drafts eval examples from prompt files and fixtures, dropping anything with personal data or secrets |
| Builds and checks an eval config: call count, env var names, unpriced models, guard verdict |
| Tests a reply against eval checks or routing guards |
| Ranks results by cost per passing answer, with the cost/reliability cascade |
| Returns routing.json and a LiteLLM config from eval results |
| Monthly token cost and cost per accepted result |
| Local memory for weights and KV cache |
| Personal-data and secrets scan (categories and counts only) |
Every tool returns a readable markdown summary by default and the full result as structured JSON (response_format: "json" puts the JSON in the text too). Large results are paginated (limit, offset, has_more, next_offset), modelfinder_audit_models can filter by provider family or hard-coded IDs, and unknown arguments are rejected with the list of valid ones. The server never opens a network connection, never reads API keys and never writes files. Only eval_models.py and the generated router.py call model providers, with your keys, when you run them.
Quick start
In your IDE, ask: "Audit which AI models this repo uses, then draft evals from our prompts and test whether a cheaper model passes." The assistant uses the MCP tools to audit and draft, agrees checks with you, and asks before the paid run.
From a terminal:
cp skills/eval-models/assets/example-config.json my-eval.json # fill in verified model IDs and prices
export ANTHROPIC_API_KEY=... GEMINI_API_KEY=... OPENAI_API_KEY=...
python3 skills/eval-models/scripts/repo_scan.py audit . # what the repo uses
python3 skills/eval-models/scripts/repo_scan.py examples . # draft examples from prompt files
python3 skills/eval-models/scripts/eval_models.py my-eval.json --dry-run
python3 skills/eval-models/scripts/eval_models.py my-eval.json --out results
python3 skills/route-models/scripts/make_routing.py --results results/results.json --guards guards.json --out routing
python3 routing/router.py routing/routing.json "your prompt"Size a local model:
python3 skills/size-local-model/scripts/estimate_memory.py --params-b 8.03 --bits 16 \
--layers 32 --kv-heads 8 --head-dim 128 --context 8192 --available-gib 24Tests
python3 -m unittest discover -s tests -vEnd-to-end tests run against a local mock of the OpenAI-compatible, Anthropic, and Gemini APIs, and drive the MCP server over stdio; no key or network access is needed. evaluations/ holds a 10-question agent evaluation of the MCP tools.
Releases
Bump the version everywhere (
python3 tests/check_release_version.pylists any field that differs) and add a CHANGELOG entry.Push a tag
vX.Y.Z.release.ymlruns the tests, checks the versions, builds the package, publishes it to PyPI with trusted publishing, then publishesserver.jsonto the official MCP Registry.One-time setup:
PyPI: add a pending trusted publisher for project
model-finder-mcp(ownerAbhiindigloo, repositoryEvalHarness, workflowrelease.yml, environmentpypi), ideally from the Indigloo PyPI organization, and create thepypienvironment in the repository settings.MCP Registry (
co.indigloo/model-finder, verified through the indigloo.co domain). On your own machine, with OpenSSL 3:openssl genpkey -algorithm Ed25519 -out mcp-registry-key.pem echo "TXT record for indigloo.co: v=MCPv1; k=ed25519; p=$(openssl pkey -in mcp-registry-key.pem -pubout -outform DER | tail -c 32 | base64)" echo "GitHub secret MCP_REGISTRY_PRIVATE_KEY: $(openssl pkey -in mcp-registry-key.pem -noout -text | grep -A3 'priv:' | tail -n +2 | tr -d ' :\n')"Add the TXT record at the apex of indigloo.co, create a repository environment
mcp-registry, store the hex key as its secretMCP_REGISTRY_PRIVATE_KEY, then deletemcp-registry-key.pemor keep it in a password manager.
skills/ shared Agent Skills (single source of truth)
mcp/server.py local MCP server (stdio, standard library only)
.mcp.json MCP launch config for Claude Code and Cursor (${CLAUDE_PLUGIN_ROOT}); disabled as a
project config inside this repo by .claude/settings.json
mcp.json Agent Plugins MCP launch config (Codex, Copilot CLI, Cursor): runs ./mcp/server.py
server.json, pyproject.toml MCP Registry entry and PyPI package (model-finder-mcp); pypi/ holds the package marker
glama.json Glama directory ownership
.github/workflows/ tests on every push; release.yml publishes tags to PyPI and the MCP Registry
.claude-plugin/ Claude Code (and Copilot CLI) plugin + marketplace manifests
.codex-plugin/ Codex plugin manifest
.agents/plugins/ Codex repository marketplace
.cursor-plugin/ Cursor plugin + marketplace manifests
gemini-extension.json Gemini CLI extension (context: GEMINI.md)
plugin.json Agent Plugins manifest with OpenAI listing metadata
AGENTS.md, GEMINI.md skill index for agents that read root instructions
PRIVACY.md, TERMS.md, SUPPORT.md pages the marketplace listings link to
assets/ logo, README plates, and DESIGN.md (the visual language)skills/eval-models/scripts/mf_core.py is duplicated in skills/route-models/scripts/ so each skill works on its own. The test suite fails if the copies differ.
Available Tools
10 toolsmodelfinder_audit_modelsAudit AI models in the repoARead-onlyIdempotent
List AI model IDs (quoted literals) and AI SDKs used in the repository, with file:line locations, provider family, route hints (Bedrock, Vertex AI, Azure, OpenRouter), usage counts and whether each ID is hard-coded or an environment-variable default. Read-only; skips secret-like files and dependency folders; never returns line content. Results are sorted by usage and paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Directory inside the workspace, relative to the project root (e.g. "services/api"). Defaults to the project root. If a call fails because the project is unknown, pass the absolute path of the project (your current working directory). | |
| limit | No | Items per page (1-200, default 50). | |
| offset | No | Items to skip; use next_offset from the previous page. | |
| hard_coded_only | No | Only IDs not read from configuration or environment. | |
| provider_family | No | Only models from this family, e.g. "anthropic". | |
| response_format | No | markdown (default) for a readable summary, json for the full machine-readable result. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| sdks | Yes | |
| models | Yes | |
| summary | Yes | |
| pagination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and non-destructive, so the safety profile is covered. The description adds genuine behavioral context beyond that: it skips secret-like files and dependency folders, never returns line content, and results are sorted by usage and paginated. It stops short of detailing output shape or rate behavior, but the added filtering/redaction context is meaningful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences that front-load the returned content and then the behavioral constraints. Dense but well-ordered with no filler, though the second sentence bundles several distinct traits into one clause chain.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only audit tool with a full output schema and 100%-covered input schema, the description supplies the remaining needed context: what is scanned, what is excluded for safety, sorting and pagination. An agent has enough to invoke it correctly without opening anything else.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the schema, including enums, defaults and limits. The description restates output concepts (provider family, route hints) but adds no syntax or semantics beyond what the schema provides, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (AI model IDs and AI SDKs) and enumerates the returned fields: locations, provider family, route hints, usage counts, hard-coded vs env-var. This clearly distinguishes it from sibling tools like modelfinder_scan_sensitive_data or modelfinder_estimate_cost.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes context (an audit of the repo) but never states when to choose this over siblings, nor any prerequisites or exclusions. Usage is implied rather than guided, so it sits at the minimum-viable level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
modelfinder_check_outputTest a reply against checksARead-onlyIdempotent
Run deterministic checks on one model reply. Use it to design eval checks and routing guards before spending money on a run.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The model reply to test. | |
| checks | Yes | Deterministic checks; all must pass. Types: contains, not_contains, exact (value, ignore_case?), regex (pattern), json_keys (keys), max_chars (value). Example: [{"type": "json_keys", "keys": ["category"]}, {"type": "contains", "value": "refund"}] | |
| response_format | No | markdown (default) for a readable summary, json for the full machine-readable result. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| passed | Yes | |
| failures | Yes | |
| checks_run | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds useful behavioral context ('deterministic', cheap pre-run testing) but does not disclose how failures are reported or that all checks must pass, which lives only in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero redundancy, with the action front-loaded and the motivation immediately following. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full output schema covering return values, rich annotations, and 100% schema description coverage, the description supplies what an agent needs to select and call it. Minor gaps: no statement about check limits or failure granularity, though these are implied by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so types, enum values, defaults and per-field meanings are already fully documented in the schema. The description adds no parameter-level detail beyond implying a single reply, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action ('run deterministic checks') on a specific resource ('one model reply'), which is concrete enough to distinguish from config-oriented siblings like validate_eval_config. It does not, however, explicitly contrast itself with any named sibling, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use context and a motivating condition: design eval checks and routing guards before spending money on a real run. It omits when-not-to-use and any named alternative, so it is clear guidance without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
modelfinder_create_eval_configCreate an eval configARead-onlyIdempotent
Assemble an eval config from candidate models, examples with checks, and settings; validate it and screen the examples for personal data and secrets. Returns the config to save as JSON for eval_models.py. Keys are referenced by environment variable name only.
| Name | Required | Description | Default |
|---|---|---|---|
| task | No | One-line description of what the model must do. | |
| repeats | No | Runs per example (3+ for noisy tasks). | |
| examples | Yes | Inputs with the checks each reply must pass. | |
| settings | No | max_output_tokens (default 1024), timeout_s (default 60), temperature, system (system prompt). | |
| candidates | Yes | 1-10 models to compare. | |
| pass_threshold | No | Share of calls that must pass every check (0-1). | |
| response_format | No | markdown (default) for a readable summary, json for the full machine-readable result. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| valid | Yes | |
| config | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful context beyond that: it validates the config and screens examples for personal data and secrets, and it returns (rather than persists) the config, plus the security constraint that keys are referenced by environment variable name only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short clauses, front-loaded with the core action (assemble), followed by the processing guarantee (validate/screen) and the output/security note. No filler or repetition; each sentence earns a place, though the phrasing is densely packed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return shape needn't be explained, yet the description still says the config is returned for saving as JSON. Together with the validation/screening disclosure and annotation coverage of safety, an agent has what it needs to call this correctly; only explicit sibling routing is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents candidates, examples, checks, settings, thresholds and enums thoroughly. The description restates the top-level triple (candidates, examples, settings) and reinforces the env-var-only convention for api_key_env, which the schema also states, so it adds little parameter meaning beyond the structured data.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb and resource: assemble an eval config from candidates, examples with checks, and settings, then validate and screen it. It also names what the output is for (eval_models.py), but it doesn't explicitly distinguish itself from validate_eval_config or draft_eval_examples, and the 'screen for personal data and secrets' step overlaps with the scan_sensitive_data sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: it's the assembly step, and the output is meant to be saved as JSON for eval_models.py. There is no explicit when-to-use/when-not, and no routing to validate_eval_config or draft_eval_examples, even though the description mentions validation as if it were an internal step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
modelfinder_draft_eval_examplesDraft eval examples from the repoARead-onlyIdempotent
Draft eval examples from prompt files and fixtures (prompts/, evals/, fixtures/, *.prompt.md, and JSON/JSONL with input, prompt or chat messages). Drops any candidate with detected personal data or secrets and reports only categories and counts. Drafts have empty checks: agree checks with the user before modelfinder_create_eval_config. Paginated; ids are stable across pages.
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | Directory inside the workspace, relative to the project root (e.g. "services/api"). Defaults to the project root. If a call fails because the project is unknown, pass the absolute path of the project (your current working directory). | |
| limit | No | Items per page (1-200, default 30). | |
| offset | No | Items to skip; use next_offset from the previous page. | |
| response_format | No | markdown (default) for a readable summary, json for the full machine-readable result. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| drafts | Yes | |
| excluded | Yes | |
| pagination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the read-only/idempotent/non-destructive profile, and the description adds substantial behavior beyond them: candidates with personal data or secrets are dropped, only categories and counts are reported, drafts have empty checks, and pagination yields stable ids across pages. This is rich, non-obvious disclosure an agent could not infer.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by data-handling behavior, the downstream-tool caveat, and pagination notes. Four dense clauses all carry information, though the parenthetical source list is somewhat heavy for a single sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers source scope, sensitive-data handling, output shape (categories and counts), pagination stability, and the required user-agreement step before downstream creation. With an output schema present, return values need no explanation, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so path, limit, offset, and response_format are already fully documented. The description's 'Paginated; ids are stable across pages' lightly reinforces the paging parameters but adds no syntax or format detail beyond the schema, making baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb 'Draft' plus resource 'eval examples,' scoped to concrete sources (prompt files, fixtures, *.prompt.md, JSON/JSONL with input/prompt/chat messages). It is clearly distinguishable from siblings like modelfinder_create_eval_config, which it explicitly names as the downstream step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description routes the agent forward: drafts have empty checks, and the user must agree on checks before calling modelfinder_create_eval_config. That establishes workflow context, though it does not state explicit when-not-to-use conditions or compare against alternative drafting paths.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
modelfinder_estimate_costEstimate monthly token costARead-onlyIdempotent
Planning estimate of monthly token cost from requests, average tokens per request and USD-per-million prices, with optional cached-input share and pass rate (cost per accepted result, counting retries). Prices must come from the provider's official pricing page.
| Name | Required | Description | Default |
|---|---|---|---|
| pass_rate | No | Optional eval pass rate; failures are assumed retried. | |
| input_tokens | Yes | Average input tokens per request. | |
| output_tokens | Yes | Average output tokens per request (include reasoning tokens). | |
| cached_fraction | No | Share of input tokens billed at the cached rate (0-1). | |
| response_format | No | markdown (default) for a readable summary, json for the full machine-readable result. | markdown |
| requests_per_month | Yes | e.g. 100000 | |
| input_price_per_million | Yes | USD per 1M input tokens. | |
| output_price_per_million | Yes | USD per 1M output tokens. | |
| cached_input_price_per_million | No | Required when cached_fraction > 0. |
Output Schema
| Name | Required | Description |
|---|---|---|
| assumptions | Yes | |
| monthly_cost_usd | Yes | |
| cost_per_request_usd | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe, idempotent, read-only, closed-world computation, so the safety bar is met. The description adds real context beyond that: the pass-rate model ('cost per accepted result, counting retries') and the sourcing requirement for prices. It doesn't discuss rounding, currency, or accuracy caveats, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Effectively one sentence, front-loaded with the core purpose. It is dense with parentheticals but every clause carries information; there is no filler. Not perfectly scannable, so short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-format explanation is unnecessary, and annotations cover the safety profile. Parameters are fully documented in the schema. The remaining gap is the retry/pass-rate computation mechanics, which are gestured at but not fully specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented, establishing a baseline of 3. The description restates the cached-input share and pass-rate parameters and clarifies that retries count toward cost, which adds marginal meaning but largely duplicates the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (estimate) and resource (monthly token cost) and enumerates the driving inputs. It is clearly distinguishable from the sibling modelfinder_estimate_memory by resource (cost vs. memory). An agent knows exactly what this computes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'Planning estimate' signals it is for pre-hoc budgeting rather than measured spend, and it states that prices must come from the provider's official pricing page. However, it never names an alternative tool or an explicit when-not condition. Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
modelfinder_estimate_memoryEstimate local model memoryARead-onlyIdempotent
Estimate memory to run an open-weight model locally: weights at a precision plus KV cache for a context length and concurrency (standard MHA/GQA attention only), with headroom against available memory. Give all four of layers, kv_heads, head_dim and context to include the KV cache.
| Name | Required | Description | Default |
|---|---|---|---|
| bits | Yes | Effective bits per weight: 16, 8, about 4.5 for common 4-bit formats. | |
| layers | No | num_hidden_layers from the model config. | |
| context | No | Context tokens per sequence actually used. | |
| kv_bits | No | KV cache precision in bits. | |
| head_dim | No | head_dim, or hidden_size / num_attention_heads. | |
| kv_heads | No | num_key_value_heads (or num_attention_heads if absent). | |
| params_b | Yes | Total stored parameters in billions (for MoE, all experts). | |
| concurrency | No | Sequences served at once. | |
| overhead_pct | No | Allowance on top, in percent. | |
| available_gib | No | GPU or unified memory available, in GiB. | |
| response_format | No | markdown (default) for a readable summary, json for the full machine-readable result. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| caveats | Yes | |
| total_gib | Yes | |
| weights_gib | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safe, read-only, idempotent profile, so the description's added value is the computational model and its limits: which components are summed, the headroom concept against available memory, and the explicit MHA/GQA-only restriction. That limitation disclosure is real behavioral context not present in the annotations. It does not discuss precision/rounding or how headroom is applied, leaving a small gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the first front-loads the computation and scope, the second carries the actionable parameter rule. No filler, and the parenthetical attention restriction is placed exactly where it matters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full output schema, rich annotations, and 100% parameter descriptions, the description only needs to explain the model and its scope, which it does. The one remaining ambiguity is behavior when only some KV inputs are supplied (it implies KV cache is omitted, but does not say whether that is an error or a graceful degradation).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes beyond the field-by-field docs by explaining an inter-parameter dependency: the four KV-related fields must all be supplied together to trigger KV-cache inclusion. That relational semantics is not encoded anywhere in the schema and is the kind of guidance an agent needs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (estimate) and resource (memory to run an open-weight model locally), and breaks the computation into its components: weights at a precision plus KV cache for context length and concurrency. It is clearly distinguishable in domain terms from the sibling estimate_cost, though it never names that sibling to sharpen the contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete conditional usage rule: 'Give all four of layers, kv_heads, head_dim and context to include the KV cache,' which tells the agent how to steer the computation. It also bounds applicability with 'standard MHA/GQA attention only.' It stops short of stating when to prefer this over the cost estimator or what to do for unsupported attention variants.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
modelfinder_generate_routingGenerate cheapest-first routingARead-onlyIdempotent
Turn a results.json object into a cheapest-first routing.json (with guards and a personal-data policy) and a LiteLLM proxy config. Returns both; nothing is written or deployed.
| Name | Required | Description | Default |
|---|---|---|---|
| chain | No | Explicit model order (candidate ids), overriding cost order. | |
| guards | No | Checks applied to every production reply; a failure escalates to the next model. | |
| results | Yes | The full results.json object written by eval_models.py. | |
| pii_policy | No | block: never send prompts with personal data or secrets; warn: send and report; off: no check. | warn |
| response_format | No | markdown (default) for a readable summary, json for the full machine-readable result. | markdown |
| include_unknown_cost | No | Append passing models whose price is unknown. |
Output Schema
| Name | Required | Description |
|---|---|---|
| chain | Yes | |
| notes | Yes | |
| routing_json | Yes | |
| litellm_config_yaml | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the bar is lower; the description still adds real value by stating the outputs are returned and 'nothing is written or deployed,' which closes the loop on side effects. It does not cover failure modes for invalid guard specs or oversized input.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the core transformation, then names both artifacts and the no-side-effect guarantee. No filler, nothing repeated from the name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the description confirms both artifacts are returned alongside a clear side-effect statement. The only gap is workflow context: when in the eval-to-routing pipeline it should be invoked relative to rank_eval_results or modelfinder_validate_eval_config.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter, including guards, pii_policy, and response_format enums, is documented in the schema itself. The description only alludes to guards and the personal-data policy, so it adds almost nothing beyond structured data; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb-and-artifact transformation: results.json becomes a cheapest-first routing.json plus a LiteLLM proxy config. That is clearly distinct from sibling tools like rank_eval_results or create_eval_config, though it never names those alternatives to sharpen the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The mention of results.json 'written by eval_models.py' implies the tool is used downstream of evaluation, but there is no explicit when-to-use statement, no prerequisites, and no routing to a sibling when the caller only wants ranking or config validation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
modelfinder_rank_eval_resultsRank eval resultsARead-onlyIdempotent
Read a results.json object and return the cheapest model that met the pass threshold, ranked by cost per passing call, plus the cost/reliability cascade and models dropped as dominated.
| Name | Required | Description | Default |
|---|---|---|---|
| results | Yes | The full results.json object written by eval_models.py. | |
| response_format | No | markdown (default) for a readable summary, json for the full machine-readable result. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| ranked | Yes | |
| cascade | Yes | |
| dominated | Yes | |
| recommendation | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, non-destructive, closed-world behavior, lowering the bar. The description usefully discloses that it computes rankings, a cost/reliability cascade, and dropped dominated models, but says nothing about handling of malformed input, missing threshold, or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that front-loads the primary output (cheapest passing model) and then appends the secondary artifacts. Efficient, though the clause stacking makes it slightly heavy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and full annotation coverage, the description need not restate return structure, yet it still characterizes the result meaningfully. It is complete enough to call correctly, with only usage-context guidance missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both 'results' and the 'response_format' enum are already fully documented in the schema; the description merely echoes that it reads a results.json object. Baseline 3 is appropriate since the schema carries the parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb ('Read') and resource ('results.json object') and spells out the exact return: the cheapest model meeting the pass threshold, ranked by cost per passing call, plus the cascade and dominated models. An agent can distinguish this ranking/analysis tool from siblings like estimate_cost or generate_routing without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies its place in the workflow (consume a results.json written by eval_models.py), but it never states when to reach for this versus alternatives, nor any prerequisites or exclusions. Usage is only inferred from the input/output description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
modelfinder_scan_sensitive_dataScan text for personal data and secretsARead-onlyIdempotent
Detect Aadhaar (Verhoeff checked), PAN, payment cards (Luhn checked), email addresses, UPI IDs, Indian mobile numbers and API or private keys in text. Returns categories and counts only, never the values.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Text to scan, up to 1,000,000 characters. | |
| response_format | No | markdown (default) for a readable summary, json for the full machine-readable result. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| clean | Yes | |
| secrets | Yes | |
| personal_data | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds genuinely useful behavior beyond that: the detection algorithms used (Verhoeff for Aadhaar, Luhn for cards) and, importantly, the privacy guarantee that it 'Returns categories and counts only, never the values' – a non-obvious disclosure an agent could not derive from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both load-bearing: the first defines scope and rigor of detection, the second defines the return contract. Nothing is repeated from the title or annotations and the most decision-relevant information (what is detected) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, single-argument scanner with a full output schema and complete annotation coverage, the description supplies everything an agent needs: target entity types, validation strictness, and the guarantee that raw values are never returned. Input limit and output format are handled by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both 'text' (with its 1,000,000-character limit) and 'response_format' are fully documented in the schema. The description adds nothing about either parameter, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Detect') and resource (text) and enumerates exactly what it looks for: Aadhaar, PAN, payment cards, email, UPI IDs, Indian mobile numbers, API/private keys. That level of specificity leaves no ambiguity about what the tool does, and none of the sibling tools (eval config, cost/memory estimation, routing) overlap with it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the verb 'Detect ... in text' – an agent can infer it is for scanning arbitrary text for sensitive content. However, there is no explicit when-to-use guidance, no stated prerequisites or exclusions, and no named alternative, so it stays at the implied-usage level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
modelfinder_validate_eval_configValidate an eval configARead-onlyIdempotent
Check an eval config before running: schema, no keys in the config, HTTPS endpoints, no template placeholders, valid checks. Reports API call count, required environment variable names, unpriced models, and whether the personal-data guard would block the run. Makes no network calls.
| Name | Required | Description | Default |
|---|---|---|---|
| config | Yes | The eval config object (as saved for eval_models.py). | |
| response_format | No | markdown (default) for a readable summary, json for the full machine-readable result. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| valid | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuinely new behavioral detail: "Makes no network calls" reinforces the closed-world claim, and it lists what the report contains (API call count, required env var names, unpriced models, personal-data guard outcome).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler. The purpose and check list are front-loaded, and the behavioral caveat about network calls is placed last as a supporting note.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no elaboration, yet the description still summarizes the report contents. Combined with the enumerated checks and the no-network-call guarantee, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with only two parameters, so the schema already documents both the config object and the markdown/json response_format. The description adds nothing about parameter syntax or the config's expected shape, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ("Check an eval config before running") and enumerates the exact checks performed (schema, embedded keys, HTTPS endpoints, template placeholders, valid checks), which cleanly separates it from siblings like modelfinder_create_eval_config or modelfinder_check_output.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase "before running" gives a clear precondition for when to call this tool. It stops short of naming an alternative (e.g. create_eval_config) or stating when not to use it, so it's clear context rather than full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v1.3.5- First observed
modelfinder_audit_models - First observed
modelfinder_check_output - First observed
modelfinder_create_eval_config - First observed
modelfinder_draft_eval_examples - First observed
modelfinder_estimate_cost - First observed
modelfinder_estimate_memory - First observed
modelfinder_generate_routing - First observed
modelfinder_rank_eval_results - First observed
modelfinder_scan_sensitive_data - First observed
modelfinder_validate_eval_config
TDQS
Scored across 10 tools
Each tool targets a distinct stage or artifact (audit, draft examples, create/validate config, check output, rank results, generate routing, cost/memory estimates, sensitive-data scan). The only mild overlap is between cost-related tools (rank_eval_results vs estimate_cost) and config-checking (validate_eval_config vs check_output), but the descriptions clearly separate config validation from single-reply checking.
All ten tools share the modelfinder_ prefix and use a consistent snake_case verb_noun pattern (audit_models, draft_eval_examples, create_eval_config, rank_eval_results, etc.). No convention mixing or vague names.
Ten tools is well within the ideal range and each maps to a concrete step in the model-eval-and-routing workflow, so none feel redundant or padded.
The surface covers the full planning pipeline: auditing model usage, drafting examples, building/validating configs, checking outputs, ranking results, generating routing, and estimating cost/memory, plus PII scanning. The only gap is that actual eval execution is delegated externally (config is saved for eval_models.py), leaving a slight end-to-end dead end.
Maintenance
Related MCP Connectors
Real-time, drift-verified LLM pricing across 26 providers with cost+quality model routing.
Sourced AI-model pricing and capability data — compare and route to the cheapest capable model.
Benchmark your own prompt on 100+ LLMs with real API calls; pick the cheapest model that passes.
Find AI models that fit a job from your requirements, sourced benchmarks and real cost.
Related MCP Servers
- AlicenseBqualityDmaintenancePredict the cost of an LLM call before you make it, and pick the cheapest model that still does the job, offline, from your editor.729 npmApache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables LLM clients and coding agents to analyze prompts and recommend the cheapest AI model that meets the task requirements across text, voice, video, and other modalities, projecting monthly cost savings against a flagship baseline.MIT
- AlicenseNot gradedqualityAmaintenanceEnables local LLMs to perform enterprise-grade code auditing, AST security screening, architectural planning, and real-time Discord observability with zero cloud API costs.1MIT
- AlicenseAqualityAmaintenanceEnables engineers to estimate LLM costs, check GPU VRAM fit, audit MCP configs for security risks, and analyze network device config changes and compliance—all locally, with no account or telemetry.7MIT