Skip to main content
Glama
NOTE

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

find-model

Recommends models across Claude, Gemini, OpenAI, cloud, and local options for your task, budget, and route, including coding subtasks in an IDE.

eval-models

Runs your examples against shortlisted models and measures pass rate, latency, and billed cost with your own keys.

route-models

Builds a cheapest-first routing setup: a standalone router with quality guards plus a LiteLLM config.

size-local-model

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

/plugin marketplace add Abhiindigloo/EvalHarness then /plugin install model-finder@model-finder

✅

✅ via .mcp.json

OpenAI Codex CLI

codex plugin marketplace add Abhiindigloo/EvalHarness then codex plugin add model-finder@model-finder

✅

✅ via mcp.json (Agent Plugins format, runs ./mcp/server.py). Codex gives the server no workspace, so the agent passes the project path

GitHub Copilot CLI

copilot plugin marketplace add Abhiindigloo/EvalHarness then copilot plugin install model-finder@model-finder

✅

✅ via mcp.json

Gemini CLI

gemini extensions install https://github.com/Abhiindigloo/EvalHarness

✅

✅ via gemini-extension.json

Cursor

Install from the Cursor marketplace or cursor.directory once listed. Until then, clone into ~/.cursor/plugins/local/model-finder and reload the window

✅

✅ via mcp.json or .cursor-plugin/plugin.json → .mcp.json

Any MCP client, from PyPI

uvx model-finder-mcp (published by the release workflow; see Releases)

—

✅

VS Code, JetBrains, Windsurf, others

Add the server to the client's MCP settings (manual setup)

—

✅

Other Agent Skills clients

Copy skills/<name>/ into the client's skills directory

✅

—

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

modelfinder_audit_models

Lists AI model IDs and SDKs in your repo with file:line locations, routes and hard-coded IDs

modelfinder_draft_eval_examples

Drafts eval examples from prompt files and fixtures, dropping anything with personal data or secrets

modelfinder_create_eval_config · modelfinder_validate_eval_config

Builds and checks an eval config: call count, env var names, unpriced models, guard verdict

modelfinder_check_output

Tests a reply against eval checks or routing guards

modelfinder_rank_eval_results

Ranks results by cost per passing answer, with the cost/reliability cascade

modelfinder_generate_routing

Returns routing.json and a LiteLLM config from eval results

modelfinder_estimate_cost

Monthly token cost and cost per accepted result

modelfinder_estimate_memory

Local memory for weights and KV cache

modelfinder_scan_sensitive_data

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 24

Tests

python3 -m unittest discover -s tests -v

End-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

  1. Bump the version everywhere (python3 tests/check_release_version.py lists any field that differs) and add a CHANGELOG entry.

  2. Push a tag vX.Y.Z. release.yml runs the tests, checks the versions, builds the package, publishes it to PyPI with trusted publishing, then publishes server.json to the official MCP Registry.

  3. One-time setup:

    • PyPI: add a pending trusted publisher for project model-finder-mcp (owner Abhiindigloo, repository EvalHarness, workflow release.yml, environment pypi), ideally from the Indigloo PyPI organization, and create the pypi environment 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 secret MCP_REGISTRY_PRIVATE_KEY, then delete mcp-registry-key.pem or 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 tools
modelfinder_audit_modelsAudit AI models in the repoA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoDirectory 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).
limitNoItems per page (1-200, default 50).
offsetNoItems to skip; use next_offset from the previous page.
hard_coded_onlyNoOnly IDs not read from configuration or environment.
provider_familyNoOnly models from this family, e.g. "anthropic".
response_formatNomarkdown (default) for a readable summary, json for the full machine-readable result.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
sdksYes
modelsYes
summaryYes
paginationYes

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 checksA
Read-onlyIdempotent

Run deterministic checks on one model reply. Use it to design eval checks and routing guards before spending money on a run.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesThe model reply to test.
checksYesDeterministic 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_formatNomarkdown (default) for a readable summary, json for the full machine-readable result.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
passedYes
failuresYes
checks_runYes

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 configA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
taskNoOne-line description of what the model must do.
repeatsNoRuns per example (3+ for noisy tasks).
examplesYesInputs with the checks each reply must pass.
settingsNomax_output_tokens (default 1024), timeout_s (default 60), temperature, system (system prompt).
candidatesYes1-10 models to compare.
pass_thresholdNoShare of calls that must pass every check (0-1).
response_formatNomarkdown (default) for a readable summary, json for the full machine-readable result.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
validYes
configYes

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 repoA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoDirectory 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).
limitNoItems per page (1-200, default 30).
offsetNoItems to skip; use next_offset from the previous page.
response_formatNomarkdown (default) for a readable summary, json for the full machine-readable result.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
draftsYes
excludedYes
paginationYes

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 costA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pass_rateNoOptional eval pass rate; failures are assumed retried.
input_tokensYesAverage input tokens per request.
output_tokensYesAverage output tokens per request (include reasoning tokens).
cached_fractionNoShare of input tokens billed at the cached rate (0-1).
response_formatNomarkdown (default) for a readable summary, json for the full machine-readable result.markdown
requests_per_monthYese.g. 100000
input_price_per_millionYesUSD per 1M input tokens.
output_price_per_millionYesUSD per 1M output tokens.
cached_input_price_per_millionNoRequired when cached_fraction > 0.

Output Schema

ParametersJSON Schema
NameRequiredDescription
assumptionsYes
monthly_cost_usdYes
cost_per_request_usdYes

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 memoryA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bitsYesEffective bits per weight: 16, 8, about 4.5 for common 4-bit formats.
layersNonum_hidden_layers from the model config.
contextNoContext tokens per sequence actually used.
kv_bitsNoKV cache precision in bits.
head_dimNohead_dim, or hidden_size / num_attention_heads.
kv_headsNonum_key_value_heads (or num_attention_heads if absent).
params_bYesTotal stored parameters in billions (for MoE, all experts).
concurrencyNoSequences served at once.
overhead_pctNoAllowance on top, in percent.
available_gibNoGPU or unified memory available, in GiB.
response_formatNomarkdown (default) for a readable summary, json for the full machine-readable result.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
caveatsYes
total_gibYes
weights_gibYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 routingA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
chainNoExplicit model order (candidate ids), overriding cost order.
guardsNoChecks applied to every production reply; a failure escalates to the next model.
resultsYesThe full results.json object written by eval_models.py.
pii_policyNoblock: never send prompts with personal data or secrets; warn: send and report; off: no check.warn
response_formatNomarkdown (default) for a readable summary, json for the full machine-readable result.markdown
include_unknown_costNoAppend passing models whose price is unknown.

Output Schema

ParametersJSON Schema
NameRequiredDescription
chainYes
notesYes
routing_jsonYes
litellm_config_yamlYes

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 resultsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
resultsYesThe full results.json object written by eval_models.py.
response_formatNomarkdown (default) for a readable summary, json for the full machine-readable result.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
rankedYes
cascadeYes
dominatedYes
recommendationYes

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 secretsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesText to scan, up to 1,000,000 characters.
response_formatNomarkdown (default) for a readable summary, json for the full machine-readable result.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
cleanYes
secretsYes
personal_dataYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 configA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
configYesThe eval config object (as saved for eval_models.py).
response_formatNomarkdown (default) for a readable summary, json for the full machine-readable result.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
validYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 10 tool updatesv1.3.5
    • First observedmodelfinder_audit_models
    • First observedmodelfinder_check_output
    • First observedmodelfinder_create_eval_config
    • First observedmodelfinder_draft_eval_examples
    • First observedmodelfinder_estimate_cost
    • First observedmodelfinder_estimate_memory
    • First observedmodelfinder_generate_routing
    • First observedmodelfinder_rank_eval_results
    • First observedmodelfinder_scan_sensitive_data
    • First observedmodelfinder_validate_eval_config

TDQS

A4.1/5.0

Scored across 10 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers