How to fix: Set the top-level tool.title to a short human-readable label (for example, "Search catalog"). Claude directory submission requires tool titles; annotations.title remains accepted only as a legacy fallback.
Add a human-readable title so users do not have to interpret the tool identifier.
Description92/100
Compare model quality beyond price using third-party benchmarks. The optional source arg selects the dataset and the result shape: source=artificial-analysis returns intelligence, coding, and agentic index scores; source=design-arena returns head-to-head standings (elo, win rate) filterable by arena and category. Omit source to get results from all sources in one call. Optional task_type (coding, intelligence, agentic) narrows to models suited for that workload.
The description explains the capability, when to use it, and what to expect.
Inputs81/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
request › arena
Design Arena only: arena to query. Defaults to `models` when source is `design-arena`.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
request › benchmark_type
Return results for one exact OpenRouter benchmark. A `search_*` value narrows the response to search results only; a classic value narrows the OpenRouter items and leaves other sources' items as they are.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
request › category
Design Arena only: category within the arena (e.g. `codecategories`, `uicomponent`, `gamedev`, `3d`, `dataviz`, `image`, `video`, `svg`). When omitted, returns all categories.
Clear enough to supply this argument.
request › include_run_config
Search benchmarks only: include the published lane configuration whitelist in each search item. Defaults to false. The whitelist is limited to agent turn count, reasoning effort, and temperature so future harness configuration changes do not change the public contract.
Clear enough to supply this argument.
request › max_results
Maximum number of items to return. When omitted, all matching results are returned.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
request › search_engine
OpenRouter search benchmarks only: filter by the search engine used.
Explain the meaning of this value, not just its name.
request › search_surface
OpenRouter search benchmarks only: filter by the request surface the lane ran on.
Explain the meaning of this value, not just its name.
request › source
Benchmark source to query. Determines the shape of the returned items. When omitted, returns results from all sources.
Clear enough to supply this argument.
request › task_type
Filter results by task type. For Artificial Analysis, maps to the corresponding index. For Design Arena, maps to the matching category. `search` returns OpenRouter search benchmark results only.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list-benchmarks",
"description": "Compare model quality beyond price using third-party benchmarks. The optional source arg selects the dataset and the result shape: source=artificial-analysis returns intelligence, coding, and agentic index scores; source=design-arena returns head-to-head standings (elo, win rate) filterable by arena and category. Omit source to get results from all sources in one call. Optional task_type (coding, intelligence, agentic) narrows to models suited for that workload.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"request": {
"type": "object",
"properties": {
"arena": {
"enum": [
"models",
"builders",
"agents"
],
"type": "string",
"description": "Design Arena only: arena to query. Defaults to `models` when source is `design-arena`."
},
"source": {
"enum": [
"artificial-analysis",
"design-arena",
"openrouter"
],
"type": "string",
"description": "Benchmark source to query. Determines the shape of the returned items. When omitted, returns results from all sources."
},
"category": {
"type": "string",
"description": "Design Arena only: category within the arena (e.g. `codecategories`, `uicomponent`, `gamedev`, `3d`, `dataviz`, `image`, `video`, `svg`). When omitted, returns all categories."
},
"task_type": {
"enum": [
"coding",
"intelligence",
"agentic",
"search"
],
"type": "string",
"description": "Filter results by task type. For Artificial Analysis, maps to the corresponding index. For Design Arena, maps to the matching category. `search` returns OpenRouter search benchmark results only."
},
"max_results": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Maximum number of items to return. When omitted, all matching results are returned."
},
"search_engine": {
"type": "string",
"description": "OpenRouter search benchmarks only: filter by the search engine used."
},
"benchmark_type": {
"enum": [
"gpqa_diamond",
"tau_bench_verified_airline",
"search_browsecomp",
"search_hle",
"search_dsqa",
"search_widesearch"
],
"type": "string",
"description": "Return results for one exact OpenRouter benchmark. A `search_*` value narrows the response to search results only; a classic value narrows the OpenRouter items and leaves other sources' items as they are."
},
"search_surface": {
"enum": [
"server-tool",
"plugin"
],
"type": "string",
"description": "OpenRouter search benchmarks only: filter by the request surface the lane ran on."
},
"include_run_config": {
"type": "boolean",
"default": false,
"description": "Search benchmarks only: include the published lane configuration whitelist in each search item. Defaults to false. The whitelist is limited to agent turn count, reasoning effort, and temperature so future harness configuration changes do not change the public contract."
}
}
}
}
},
"annotations": {
"title": "",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description96/100
See what OpenRouter traffic is actually used for: a market-share breakdown by task type (code generation, web search, summarization, ...) over a trailing window, each with its top models by usage, plus macro-category (Code, Data, Agent, General) aggregates. Use to learn which models real usage favors for a given kind of work. All shares are fractions (0-1) of sampled traffic; absolute volumes are not exposed.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
request › window
Trailing time window for the classification data. Currently only `7d` (trailing 7 days) is supported.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list-task-classifications",
"description": "See what OpenRouter traffic is actually used for: a market-share breakdown by task type (code generation, web search, summarization, ...) over a trailing window, each with its top models by usage, plus macro-category (Code, Data, Agent, General) aggregates. Use to learn which models real usage favors for a given kind of work. All shares are fractions (0-1) of sampled traffic; absolute volumes are not exposed.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"request": {
"type": "object",
"properties": {
"window": {
"enum": [
"7d"
],
"type": "string",
"default": "7d",
"description": "Trailing time window for the classification data. Currently only `7d` (trailing 7 days) is supported."
}
}
}
}
},
"annotations": {
"title": "",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description88/100
See which APPS/products drive the most OpenRouter traffic, filterable by category, to gauge ecosystem adoption and find example use cases. For model rankings use list-daily-model-rankings instead.
The description explains the capability, when to use it, and what to expect.
Inputs57/100
6 of 7 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
request › category
Marketplace category group to filter by (e.g. `coding`). Only apps tagged with a subcategory inside this group are returned. Mutually combinable with `subcategory` — when both are supplied the `subcategory` must belong to the `category` group.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
request › end_date
End of the date window in YYYY-MM-DD (UTC), inclusive. Defaults to the most recent completed UTC day. Must be on or after 2025-01-01; earlier values are rejected with a 400.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
request › limit
Maximum number of apps to return (1-100). Defaults to 50.
Resolve the mismatch between this description and its schema constraints.
request › offset
Not provided
Missing description. Explain what this value means and how to supply it.
request › sort
`popular` ranks apps by total token volume inside the date window. `trending` ranks apps by absolute excess token growth: window volume minus the average volume of the three equal-length periods immediately preceding the window. Apps with no excess growth are omitted from `trending` results.
Clear enough to supply this argument.
request › start_date
Start of the date window in YYYY-MM-DD (UTC), inclusive. Defaults to 30 days before `end_date`. The dataset begins at 2025-01-01; earlier values are clamped forward to that floor and the resolved value is echoed in `meta.start_date`.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
request › subcategory
Marketplace subcategory to filter by (e.g. `cli-agent`). Takes precedence over `category` for the actual filter; when `category` is also supplied the pair must be consistent.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list-app-rankings",
"description": "See which APPS/products drive the most OpenRouter traffic, filterable by category, to gauge ecosystem adoption and find example use cases. For model rankings use list-daily-model-rankings instead.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"request": {
"type": "object",
"properties": {
"sort": {
"enum": [
"popular",
"trending"
],
"type": "string",
"default": "popular",
"description": "`popular` ranks apps by total token volume inside the date window. `trending` ranks apps by absolute excess token growth: window volume minus the average volume of the three equal-length periods immediately preceding the window. Apps with no excess growth are omitted from `trending` results."
},
"limit": {
"type": "integer",
"default": 50,
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Maximum number of apps to return (1-100). Defaults to 50."
},
"offset": {
"anyOf": [
{
"type": "integer",
"default": 0,
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Number of ranked apps to skip before the first returned row (0-100). Defaults to 0. `rank` stays absolute, so the first row of `offset=50` is `rank: 51`."
},
{
"type": "null"
}
]
},
"category": {
"enum": [
"coding",
"creative",
"productivity",
"entertainment"
],
"type": "string",
"description": "Marketplace category group to filter by (e.g. `coding`). Only apps tagged with a subcategory inside this group are returned. Mutually combinable with `subcategory` — when both are supplied the `subcategory` must belong to the `category` group."
},
"end_date": {
"type": "string",
"description": "End of the date window in YYYY-MM-DD (UTC), inclusive. Defaults to the most recent completed UTC day. Must be on or after 2025-01-01; earlier values are rejected with a 400."
},
"start_date": {
"type": "string",
"description": "Start of the date window in YYYY-MM-DD (UTC), inclusive. Defaults to 30 days before `end_date`. The dataset begins at 2025-01-01; earlier values are clamped forward to that floor and the resolved value is echoed in `meta.start_date`."
},
"subcategory": {
"enum": [
"cli-agent",
"ide-extension",
"cloud-agent",
"programming-app",
"native-app-builder",
"creative-writing",
"video-gen",
"image-gen",
"audio-gen",
"roleplay",
"game",
"writing-assistant",
"general-chat",
"personal-agent",
"legal"
],
"type": "string",
"description": "Marketplace subcategory to filter by (e.g. `cli-agent`). Takes precedence over `category` for the actual filter; when `category` is also supplied the pair must be consistent."
}
}
}
}
},
"annotations": {
"title": "",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description84/100
See which MODELS are most used and trending by token volume, to pick a proven model. Optionally slice by period (day/week/month), modality, context_bucket, or by category / language_type (sampled weekly estimates). For app/product rankings use list-app-rankings instead.
Describe the returned information so the agent knows whether it will answer the request.
Inputs86/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
request › category
Restrict to a use-case category (e.g. `programming`, `roleplay`). Sourced from a sampled, upsampled dataset, so `total_tokens` is an estimate and is aggregated weekly (the trailing weekly bucket may include traffic past `end_date`). Cannot be combined with `modality`, `context_bucket`, or `language_type`.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
request › context_bucket
Restrict to requests whose context length falls in this bucket (`1K`, `10K`, `100K`, `1M`, or `10M`). Exact dataset — cannot be combined with `category` or `language_type`.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
request › end_date
End of the date window in YYYY-MM-DD (UTC), inclusive. Defaults to the most recent completed UTC day. Must be on or after 2025-01-01; earlier values are rejected with a 400.
Clear enough to supply this argument.
request › language_type
Restrict to natural-language or programming-language tagged activity. Sourced from a sampled, upsampled dataset, so `total_tokens` is an estimate and is aggregated weekly (the trailing weekly bucket may include traffic past `end_date`). Cannot be combined with `modality`, `context_bucket`, or `category`.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
request › modality
Restrict to models for a modality surface: `text` / `image_output` match output modality, `image` / `audio` match input modality, and `tool_calling` keeps only rows that recorded at least one tool call. Exact dataset — cannot be combined with `category` or `language_type`.
Clear enough to supply this argument.
request › period
Time grain of each row. `day` (default) returns the per-UTC-day series; `week` buckets by ISO week start; `month` buckets by month start. With `category` or `language_type` only `week` (default) and `month` are available — `day` is rejected with a 400 because those datasets are aggregated weekly. For those sampled datasets `period=month` buckets each week by its week-start month, so totals are approximate at month boundaries.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
request › start_date
Start of the date window in YYYY-MM-DD (UTC), inclusive. Defaults to 30 days before `end_date`. The dataset begins at 2025-01-01; earlier values are clamped forward to that floor and the resolved value is echoed in `meta.start_date`.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list-daily-model-rankings",
"description": "See which MODELS are most used and trending by token volume, to pick a proven model. Optionally slice by period (day/week/month), modality, context_bucket, or by category / language_type (sampled weekly estimates). For app/product rankings use list-app-rankings instead.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"request": {
"type": "object",
"properties": {
"period": {
"enum": [
"day",
"week",
"month"
],
"type": "string",
"description": "Time grain of each row. `day` (default) returns the per-UTC-day series; `week` buckets by ISO week start; `month` buckets by month start. With `category` or `language_type` only `week` (default) and `month` are available — `day` is rejected with a 400 because those datasets are aggregated weekly. For those sampled datasets `period=month` buckets each week by its week-start month, so totals are approximate at month boundaries."
},
"category": {
"enum": [
"programming",
"roleplay",
"marketing",
"marketing/seo",
"technology",
"science",
"translation",
"legal",
"finance",
"health",
"trivia",
"academia"
],
"type": "string",
"description": "Restrict to a use-case category (e.g. `programming`, `roleplay`). Sourced from a sampled, upsampled dataset, so `total_tokens` is an estimate and is aggregated weekly (the trailing weekly bucket may include traffic past `end_date`). Cannot be combined with `modality`, `context_bucket`, or `language_type`."
},
"end_date": {
"type": "string",
"description": "End of the date window in YYYY-MM-DD (UTC), inclusive. Defaults to the most recent completed UTC day. Must be on or after 2025-01-01; earlier values are rejected with a 400."
},
"modality": {
"enum": [
"text",
"image",
"image_output",
"audio",
"tool_calling"
],
"type": "string",
"description": "Restrict to models for a modality surface: `text` / `image_output` match output modality, `image` / `audio` match input modality, and `tool_calling` keeps only rows that recorded at least one tool call. Exact dataset — cannot be combined with `category` or `language_type`."
},
"start_date": {
"type": "string",
"description": "Start of the date window in YYYY-MM-DD (UTC), inclusive. Defaults to 30 days before `end_date`. The dataset begins at 2025-01-01; earlier values are clamped forward to that floor and the resolved value is echoed in `meta.start_date`."
},
"language_type": {
"enum": [
"natural",
"programming"
],
"type": "string",
"description": "Restrict to natural-language or programming-language tagged activity. Sourced from a sampled, upsampled dataset, so `total_tokens` is an estimate and is aggregated weekly (the trailing weekly bucket may include traffic past `end_date`). Cannot be combined with `modality`, `context_bucket`, or `category`."
},
"context_bucket": {
"enum": [
"1K",
"10K",
"100K",
"1M",
"10M"
],
"type": "string",
"description": "Restrict to requests whose context length falls in this bucket (`1K`, `10K`, `100K`, `1M`, or `10M`). Exact dataset — cannot be combined with `category` or `language_type`."
}
}
}
}
},
"annotations": {
"title": "",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description90/100
Inspect cost, token counts, and serving provider for a specific generation id, to debug spend and routing. send-message returns the generation id of each call in its output.
Describe the returned information so the agent knows whether it will answer the request.
Inputs50/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
request › id
The generation ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
Add a human-readable title so users do not have to interpret the tool identifier.
Description89/100
Submit structured feedback on a specific generation the caller made — a category plus an optional comment. Use after a generation had a problem (wrong or incoherent output, latency, formatting, billing, or an API error) so the OpenRouter team can act on it. Requires the generation id, which get-generation and send-message both return. In the comment, include diagnostic context OpenRouter cannot infer from the generation id: what agent you are and your version, the harness you run in (CLI, desktop app, IDE extension, server SDK), the model you intended to call, what you expected the generation to do, and what it actually did (quote the problematic part of the response if relevant).
The description explains the capability, when to use it, and what to expect.
Inputs58/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
request › category
The category of feedback being reported
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
request › comment
An optional free-text comment describing the feedback
Explain the meaning of this value, not just its name.
request › generation_id
The generation to submit feedback on
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "send-feedback",
"description": "Submit structured feedback on a specific generation the caller made — a category plus an optional comment. Use after a generation had a problem (wrong or incoherent output, latency, formatting, billing, or an API error) so the OpenRouter team can act on it. Requires the generation id, which get-generation and send-message both return. In the comment, include diagnostic context OpenRouter cannot infer from the generation id: what agent you are and your version, the harness you run in (CLI, desktop app, IDE extension, server SDK), the model you intended to call, what you expected the generation to do, and what it actually did (quote the problematic part of the response if relevant).",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"request"
],
"properties": {
"request": {
"type": "object",
"required": [
"category",
"generation_id"
],
"properties": {
"comment": {
"type": "string",
"description": "An optional free-text comment describing the feedback"
},
"category": {
"enum": [
"latency",
"incoherence",
"incorrect_response",
"formatting",
"billing",
"api_error",
"other"
],
"type": "string",
"description": "The category of feedback being reported"
},
"generation_id": {
"type": "string",
"description": "The generation to submit feedback on"
}
},
"description": "Structured feedback about a specific generation"
}
}
},
"annotations": {
"title": "",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description85/100
Get full details for one model by author/slug (supports :variant suffixes and slug aliases) without fetching the whole catalog. Use this instead of list-models when the model is already known.
The description explains the capability, when to use it, and what to expect.
Inputs86/100
Input documentation gives an agent enough context to populate the arguments.
request › author
The author/organization of the model
Clear enough to supply this argument.
request › slug
The model slug, optionally including a variant suffix (e.g. gpt-4 or gpt-4:free)
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get-model",
"description": "Get full details for one model by author/slug (supports :variant suffixes and slug aliases) without fetching the whole catalog. Use this instead of list-models when the model is already known.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"request"
],
"properties": {
"request": {
"type": "object",
"required": [
"author",
"slug"
],
"properties": {
"slug": {
"type": "string",
"description": "The model slug, optionally including a variant suffix (e.g. gpt-4 or gpt-4:free)"
},
"author": {
"type": "string",
"description": "The author/organization of the model"
}
}
}
}
},
"annotations": {
"title": "",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description89/100
List the live OpenRouter model catalog with pricing, context length, modalities, supported parameters, and benchmark scores, to pick a model and wire the right slug into code. Prefer the server-side params over fetching the full list and post-processing. Search/sort: q (free-text name/slug search), sort (pricing-low-to-high/high-to-low, context-high-to-low, throughput-high-to-low, latency-low-to-high, most-popular, top-weekly, newest, intelligence-high-to-low, coding-high-to-low, agentic-high-to-low, design-arena-elo-high-to-low). Filters: category (use case, e.g. programming), min_price/max_price (prompt $/M), min_output_price/max_output_price (completion $/M), context (minimum tokens), min_age_days/max_age_days (model age), min_intelligence_index/max, min_coding_index/max, min_agentic_index/max (Artificial Analysis indices), min_tool_success_rate/max (0-1), arch (model family), model_authors, providers (case-sensitive display names, e.g. Groq), input/output_modalities, supported_parameters, zdr, and region.
The description explains the capability, when to use it, and what to expect.
Inputs40/100
14 of 29 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
request › arch
Filter models by architecture/model family (e.g. GPT, Claude, Gemini, Llama).
Clear enough to supply this argument.
request › category
Filter models by use case category
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
request › context
Minimum context length (tokens). Models with smaller context are excluded.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
request › distillable
Filter by distillation capability. "true" returns only distillable models, "false" excludes them.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
request › input_modalities
Filter models by input modality. Comma-separated list of: text, image, audio, file.
Clear enough to supply this argument.
request › limit
Maximum number of records to return (max 1000). When both offset and limit are omitted, the full list is returned
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
request › max_age_days
Not provided
Missing description. Explain what this value means and how to supply it.
request › max_agentic_index
Not provided
Missing description. Explain what this value means and how to supply it.
request › max_coding_index
Not provided
Missing description. Explain what this value means and how to supply it.
request › max_intelligence_index
Not provided
Missing description. Explain what this value means and how to supply it.
request › max_output_price
Not provided
Missing description. Explain what this value means and how to supply it.
request › max_price
Not provided
Missing description. Explain what this value means and how to supply it.
request › max_tool_success_rate
Not provided
Missing description. Explain what this value means and how to supply it.
request › min_age_days
Not provided
Missing description. Explain what this value means and how to supply it.
request › min_agentic_index
Not provided
Missing description. Explain what this value means and how to supply it.
request › min_coding_index
Not provided
Missing description. Explain what this value means and how to supply it.
request › min_intelligence_index
Not provided
Missing description. Explain what this value means and how to supply it.
request › min_output_price
Not provided
Missing description. Explain what this value means and how to supply it.
request › min_price
Not provided
Missing description. Explain what this value means and how to supply it.
request › min_tool_success_rate
Not provided
Missing description. Explain what this value means and how to supply it.
request › model_authors
Filter models by the organization that created the model. Comma-separated list of author slugs.
Clear enough to supply this argument.
request › offset
Not provided
Missing description. Explain what this value means and how to supply it.
request › output_modalities
Filter models by output modality. Accepts a comma-separated list of modalities (text, image, embeddings, audio, video, rerank, decisions, speech, transcription) or "all" to include all models. Defaults to "text".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
request › providers
Filter models by hosting provider. Comma-separated list of provider names.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
request › q
Free-text search by model name or slug.
Clear enough to supply this argument.
request › region
Filter to models with endpoints in the given data region ("eu" or "us").
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
request › sort
Sort the returned models server-side. Prefer this over fetching the full list and sorting client-side. Options: pricing-low-to-high, pricing-high-to-low (average prompt/completion price), context-high-to-low (context length), throughput-high-to-low, latency-low-to-high (recent median performance), most-popular, top-weekly (tokens processed in the last week), newest (creation date), intelligence-high-to-low, coding-high-to-low, agentic-high-to-low (Artificial Analysis indices), design-arena-elo-high-to-low (best Design Arena ELO across arenas). Models without a score for the chosen benchmark are placed last. When omitted, the existing default ordering is preserved.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
request › supported_parameters
Filter models by supported parameter (comma-separated)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
request › zdr
When set to "true", return only models with zero data retention endpoints.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Add a human-readable title so users do not have to interpret the tool identifier.
Description94/100
List the caller's saved presets (named bundles of model, system prompt, and sampling config created in the OpenRouter dashboard), ordered by most recently updated. Use to discover which presets exist and get their slugs; use get-preset to inspect one preset's full config.
The description explains the capability, when to use it, and what to expect.
Inputs38/100
1 of 2 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
request › limit
Maximum number of records to return (max 100)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
request › offset
Not provided
Missing description. Explain what this value means and how to supply it.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list-presets",
"description": "List the caller's saved presets (named bundles of model, system prompt, and sampling config created in the OpenRouter dashboard), ordered by most recently updated. Use to discover which presets exist and get their slugs; use get-preset to inspect one preset's full config.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"request": {
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 50,
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Maximum number of records to return (max 100)"
},
"offset": {
"anyOf": [
{
"type": "integer",
"default": 0,
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Number of records to skip for pagination"
},
{
"type": "null"
}
]
}
}
}
}
},
"annotations": {
"title": "",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description96/100
Get one saved preset by slug, including its designated version's config bundle (model, system prompt, temperature, and other sampling parameters), to inspect or reuse that configuration in a request. Find slugs with list-presets.
The description explains the capability, when to use it, and what to expect.
Inputs50/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
request › slug
URL-safe slug identifying the preset.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Search the full OpenRouter documentation to answer "how do I…" questions with correct, current API usage. Each result includes a "View docs" link to the source page; if a result is marked truncated or you need the complete page, fetch that link or share it with the user.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
query
What to look up in the OpenRouter docs, e.g. "stream responses"
Clear enough to supply this argument.
max_results
How many doc sections to return
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "search-docs",
"description": "Search the full OpenRouter documentation to answer \"how do I…\" questions with correct, current API usage. Each result includes a \"View docs\" link to the source page; if a result is marked truncated or you need the complete page, fetch that link or share it with the user.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"query"
],
"properties": {
"query": {
"type": "string",
"description": "What to look up in the OpenRouter docs, e.g. \"stream responses\""
},
"max_results": {
"type": "integer",
"default": 4,
"maximum": 10,
"minimum": 1,
"description": "How many doc sections to return"
}
}
},
"annotations": {
"title": "Search OpenRouter docs",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description80/100
Chat with a model and get its plain-text response, to test a prompt or compare models without leaving the editor. Model slug suffixes activate routing variants: ":online" enables web search (e.g. "deepseek/deepseek-v4-pro:online"), ":nitro" prioritizes throughput, ":floor" prioritizes lowest price, ":free" uses a free endpoint if one exists. For normal chats, omit "provider" and let the router choose. Set "provider" to pin the upstream provider only when you need zero variance, such as running evals or reproducing a result.
Describe the returned information so the agent knows whether it will answer the request.
Inputs80/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
model
Model slug, e.g. "openai/gpt-4o-mini"
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
message
The user message to send
Clear enough to supply this argument.
system
Optional system prompt
Explain the meaning of this value, not just its name.
provider › order
Ordered provider slugs to try first, e.g. ["fireworks", "together"]
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
provider › only
Restrict routing to these provider slugs only
Clear enough to supply this argument.
provider › ignore
Provider slugs to exclude from routing
Clear enough to supply this argument.
provider › allow_fallbacks
When false, use only the pinned provider(s) and fail instead of falling back. Set false to hard-pin for evals.
Explain what happens when this optional value is omitted.
provider › sort
Routing strategy when "order" is not set
Explain the meaning of this value, not just its name.
reasoning_effort
How hard a reasoning model should think: "max" | "xhigh" | "high" | "medium" | "low" | "minimal" | "none". Omit to use the model's own default. Use a lower value to cap cost/latency on reasoning models that over-think, or a higher value for hard prompts. Non-reasoning models ignore it. Discover a model's supported/default efforts via list-models or get-model.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
max_tokens
Cap the total tokens generated (including reasoning). The single most effective lever to stop a reasoning model from running unbounded on a hard prompt. Omit for the model default.
Clear enough to supply this argument.
timeout_ms
Abort the call locally after this many milliseconds. Returns a typed client_timeout error with elapsed_ms. If the timeout fires before any response, no generation id is available; if it fires while reading the response body, the generation may have completed upstream and been billed. Omit to wait for the default gateway timeout.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "send-message",
"description": "Chat with a model and get its plain-text response, to test a prompt or compare models without leaving the editor. Model slug suffixes activate routing variants: \":online\" enables web search (e.g. \"deepseek/deepseek-v4-pro:online\"), \":nitro\" prioritizes throughput, \":floor\" prioritizes lowest price, \":free\" uses a free endpoint if one exists. For normal chats, omit \"provider\" and let the router choose. Set \"provider\" to pin the upstream provider only when you need zero variance, such as running evals or reproducing a result.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"model",
"message"
],
"properties": {
"model": {
"type": "string",
"description": "Model slug, e.g. \"openai/gpt-4o-mini\""
},
"system": {
"type": "string",
"description": "Optional system prompt"
},
"message": {
"type": "string",
"description": "The user message to send"
},
"provider": {
"type": "object",
"properties": {
"only": {
"type": "array",
"items": {
"type": "string"
},
"description": "Restrict routing to these provider slugs only"
},
"sort": {
"enum": [
"price",
"throughput",
"latency",
"exacto"
],
"type": "string",
"description": "Routing strategy when \"order\" is not set"
},
"order": {
"type": "array",
"items": {
"type": "string"
},
"description": "Ordered provider slugs to try first, e.g. [\"fireworks\", \"together\"]"
},
"ignore": {
"type": "array",
"items": {
"type": "string"
},
"description": "Provider slugs to exclude from routing"
},
"allow_fallbacks": {
"type": "boolean",
"description": "When false, use only the pinned provider(s) and fail instead of falling back. Set false to hard-pin for evals."
}
},
"description": "Provider routing preferences. Leave this unset for normal chats so the router picks the best provider. Set it ONLY when the request needs zero provider variance — running evals, benchmarking, or reproducing a result — because providers differ in quantization, throughput, and sampling, so the same model can return different outputs depending on who serves it. To hard-pin one provider: { only: [\"fireworks\"], allow_fallbacks: false }."
},
"max_tokens": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Cap the total tokens generated (including reasoning). The single most effective lever to stop a reasoning model from running unbounded on a hard prompt. Omit for the model default.",
"exclusiveMinimum": 0
},
"timeout_ms": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Abort the call locally after this many milliseconds. Returns a typed client_timeout error with elapsed_ms. If the timeout fires before any response, no generation id is available; if it fires while reading the response body, the generation may have completed upstream and been billed. Omit to wait for the default gateway timeout.",
"exclusiveMinimum": 0
},
"reasoning_effort": {
"enum": [
"max",
"xhigh",
"high",
"medium",
"low",
"minimal",
"none"
],
"type": "string",
"description": "How hard a reasoning model should think: \"max\" | \"xhigh\" | \"high\" | \"medium\" | \"low\" | \"minimal\" | \"none\". Omit to use the model's own default. Use a lower value to cap cost/latency on reasoning models that over-think, or a higher value for hard prompts. Non-reasoning models ignore it. Discover a model's supported/default efforts via list-models or get-model."
}
}
},
"annotations": {
"title": "Send a chat message",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
Generate an image from a text prompt and return it inline. The image is sent back as an image content block: clients that render images (e.g. desktop apps) display it, and the model can see it. This bills the authenticated user for the generation.
The description explains the capability, when to use it, and what to expect.
Inputs81/100
Explain what happens when this optional value is omitted.
model
Image model slug, e.g. "bytedance-seed/seedream-4.5"
Clear enough to supply this argument.
prompt
Text description of the desired image
Clear enough to supply this argument.
size
Optional output size, e.g. "2K", "4K", or explicit "1024x1024"
Explain what happens when this optional value is omitted.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "generate-image",
"description": "Generate an image from a text prompt and return it inline. The image is sent back as an image content block: clients that render images (e.g. desktop apps) display it, and the model can see it. This bills the authenticated user for the generation.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"model",
"prompt"
],
"properties": {
"size": {
"type": "string",
"description": "Optional output size, e.g. \"2K\", \"4K\", or explicit \"1024x1024\""
},
"model": {
"type": "string",
"description": "Image model slug, e.g. \"bytedance-seed/seedream-4.5\""
},
"prompt": {
"type": "string",
"description": "Text description of the desired image"
}
}
},
"annotations": {
"title": "Generate an image",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Transcribe speech from an audio file to text. Pass exactly one of audio_url (preferred; fetched server-side) or audio_base64. Returns the transcript plus the cost and generation id. This bills the authenticated user. Find STT models via list-models with output_modalities=transcription.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
model
STT model slug, e.g. "openai/whisper-large-v3"
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
audio_url
HTTPS URL of the audio file to transcribe; fetched server-side (max 25 MB). Preferred over audio_base64.
Clear enough to supply this argument.
audio_base64
Base64-encoded audio bytes, for small clips only. Requires format.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
format
Audio container format. Required with audio_base64; inferred from the URL or Content-Type otherwise.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
language
ISO-639-1 language hint (e.g. "en", "ja"). Auto-detected if omitted.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Synthesize speech from text and return it inline as an audio content block (clients that can play audio render it; not all MCP clients can). This bills the authenticated user. Find TTS models via list-models with output_modalities=speech, and each model's voices via get-model (supported_voices). Cost is available afterwards via get-generation.
The description explains the capability, when to use it, and what to expect.
Inputs93/100
Input documentation gives an agent enough context to populate the arguments.
model
TTS model slug, e.g. "mistralai/voxtral-mini-tts-2603"
Clear enough to supply this argument.
input
Text to synthesize
Clear enough to supply this argument.
voice
Voice identifier (provider-specific); list a model's supported_voices via get-model
Clear enough to supply this argument.
response_format
Audio output format; defaults to mp3
Clear enough to supply this argument.
speed
Playback speed multiplier; only honored by models that support it
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "generate-speech",
"description": "Synthesize speech from text and return it inline as an audio content block (clients that can play audio render it; not all MCP clients can). This bills the authenticated user. Find TTS models via list-models with output_modalities=speech, and each model's voices via get-model (supported_voices). Cost is available afterwards via get-generation.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"model",
"input",
"voice"
],
"properties": {
"input": {
"type": "string",
"description": "Text to synthesize"
},
"model": {
"type": "string",
"description": "TTS model slug, e.g. \"mistralai/voxtral-mini-tts-2603\""
},
"speed": {
"type": "number",
"description": "Playback speed multiplier; only honored by models that support it"
},
"voice": {
"type": "string",
"description": "Voice identifier (provider-specific); list a model's supported_voices via get-model"
},
"response_format": {
"enum": [
"mp3",
"pcm"
],
"type": "string",
"description": "Audio output format; defaults to mp3"
}
}
},
"annotations": {
"title": "Generate speech audio",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Get the instructions for running a model eval with Ori, then follow them. Ori runs the user's own agent on their own prompts, on a pinned harness and model, and grades what it did — so a score change means the model changed, not the environment. Call this tool FIRST, before writing any eval code: it returns a step-by-step recipe (install and auth checks, how to spawn `ori code -p`, how to relay Ori's scoping questions to the user, how to report results) that you carry out yourself. Do not hand-roll an eval instead.
Use it when the user asks which model they should use, wants to compare or bake off models, wants to measure whether their agent or prompt does the right thing, wants to catch regressions in agent behavior, or asks how good their current model is. Works for any codebase in any language.
Do not use it for plain unit tests that involve no model, and do not use it to re-run an eval that already exists (run `ori eval <file>` directly instead). Takes no arguments; the same document is published at https://openrouter.ai/skills/spawn-ori-eval.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
No input fields.
Annotations100/100
All four behavior hints are declared.
{
"title": "Spawn an Ori eval",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "spawn-ori-eval",
"description": "Get the instructions for running a model eval with Ori, then follow them. Ori runs the user's own agent on their own prompts, on a pinned harness and model, and grades what it did — so a score change means the model changed, not the environment. Call this tool FIRST, before writing any eval code: it returns a step-by-step recipe (install and auth checks, how to spawn `ori code -p`, how to relay Ori's scoping questions to the user, how to report results) that you carry out yourself. Do not hand-roll an eval instead.\n\nUse it when the user asks which model they should use, wants to compare or bake off models, wants to measure whether their agent or prompt does the right thing, wants to catch regressions in agent behavior, or asks how good their current model is. Works for any codebase in any language.\n\nDo not use it for plain unit tests that involve no model, and do not use it to re-run an eval that already exists (run `ori eval <file>` directly instead). Takes no arguments; the same document is published at https://openrouter.ai/skills/spawn-ori-eval.",
"inputSchema": {
"type": "object",
"properties": {}
},
"annotations": {
"title": "Spawn an Ori eval",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description86/100
Get the hourly uptime history of every provider endpoint serving a model over the last 72 hours — the same per-provider uptime timeline shown on the model page. Use it to find which provider degraded during a window (e.g. "model X was failing between 05:00 and 08:30 UTC — whose uptime dipped?").
Describe the returned information so the agent knows whether it will answer the request.
Inputs88/100
Explain what happens when this optional value is omitted.
author
The model author/organization, e.g. "deepseek"
Clear enough to supply this argument.
slug
The model slug, optionally with a variant suffix, e.g. "deepseek-chat" or "deepseek-chat:free"
Clear enough to supply this argument.
from
Optional ISO 8601 start of the window, e.g. "2026-07-23T05:00:00Z". Data covers the last 72 hours.
Explain what happens when this optional value is omitted.
to
Optional ISO 8601 end of the window, e.g. "2026-07-23T09:00:00Z"
Explain what happens when this optional value is omitted.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get-endpoint-uptime-history",
"description": "Get the hourly uptime history of every provider endpoint serving a model over the last 72 hours — the same per-provider uptime timeline shown on the model page. Use it to find which provider degraded during a window (e.g. \"model X was failing between 05:00 and 08:30 UTC — whose uptime dipped?\").",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"author",
"slug"
],
"properties": {
"to": {
"type": "string",
"description": "Optional ISO 8601 end of the window, e.g. \"2026-07-23T09:00:00Z\""
},
"from": {
"type": "string",
"description": "Optional ISO 8601 start of the window, e.g. \"2026-07-23T05:00:00Z\". Data covers the last 72 hours."
},
"slug": {
"type": "string",
"description": "The model slug, optionally with a variant suffix, e.g. \"deepseek-chat\" or \"deepseek-chat:free\""
},
"author": {
"type": "string",
"description": "The model author/organization, e.g. \"deepseek\""
}
}
},
"annotations": {
"title": "Get endpoint uptime history",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Get the instructions for installing and using Ori Harness, then follow them. Call this tool FIRST when the user asks to install Ori, run their existing coding agent CLI through Ori, sign in to Ori, upgrade Ori, or choose an OpenRouter model for a local agent. It returns the complete recipe for installing Ori, signing in with OAuth without an API key, running an agent CLI under Ori, passing any OpenRouter model id with `--model`, upgrading with `ori update`, and verifying the installation. Do not use it for Ori model evaluations, plain unit tests, or when the user only wants to run an already-installed agent directly. Takes no arguments; the same document is published at https://openrouter.ai/skills/install-ori-harness.
The description explains the capability, when to use it, and what to expect.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "install-ori-harness",
"description": "Get the instructions for installing and using Ori Harness, then follow them. Call this tool FIRST when the user asks to install Ori, run their existing coding agent CLI through Ori, sign in to Ori, upgrade Ori, or choose an OpenRouter model for a local agent. It returns the complete recipe for installing Ori, signing in with OAuth without an API key, running an agent CLI under Ori, passing any OpenRouter model id with `--model`, upgrading with `ori update`, and verifying the installation. Do not use it for Ori model evaluations, plain unit tests, or when the user only wants to run an already-installed agent directly. Takes no arguments; the same document is published at https://openrouter.ai/skills/install-ori-harness.",
"inputSchema": {
"type": "object",
"properties": {}
},
"annotations": {
"title": "Install Ori Harness",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Submit many inference requests as one asynchronous batch (Batch API) at discounted batch pricing with results within a 24-hour window. Use it for offline/bulk workloads (evals, backfills, classification over a dataset) that do not need an immediate answer; use send-message for a single interactive reply. Returns the batch id and initial status ("validating"); poll get-batch to follow it to completed/failed and read the results. Completed requests are billed to the authenticated user.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
endpoint
API shape every request body in this batch targets, e.g. "/v1/chat/completions"
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
model
Model slug every request runs on, e.g. "openai/gpt-6-astra"
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
requests › items › custom_id
Caller-chosen id echoed back on the matching result
Clear enough to supply this argument.
requests › items › body
The request body exactly as you would POST it to the endpoint (omit "model")
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
provider_only
Restrict routing to these provider slugs only, e.g. ["google-vertex"]
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "send-batch",
"description": "Submit many inference requests as one asynchronous batch (Batch API) at discounted batch pricing with results within a 24-hour window. Use it for offline/bulk workloads (evals, backfills, classification over a dataset) that do not need an immediate answer; use send-message for a single interactive reply. Returns the batch id and initial status (\"validating\"); poll get-batch to follow it to completed/failed and read the results. Completed requests are billed to the authenticated user.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"endpoint",
"model",
"requests"
],
"properties": {
"model": {
"type": "string",
"description": "Model slug every request runs on, e.g. \"openai/gpt-6-astra\""
},
"endpoint": {
"enum": [
"/v1/chat/completions",
"/v1/responses",
"/v1/messages",
"/v1/embeddings"
],
"type": "string",
"description": "API shape every request body in this batch targets, e.g. \"/v1/chat/completions\""
},
"requests": {
"type": "array",
"items": {
"type": "object",
"required": [
"custom_id",
"body"
],
"properties": {
"body": {
"type": "object",
"description": "The request body exactly as you would POST it to the endpoint (omit \"model\")",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"custom_id": {
"type": "string",
"minLength": 1,
"description": "Caller-chosen id echoed back on the matching result"
}
}
},
"maxItems": 1000,
"minItems": 1,
"description": "Requests to run (at most 1000 per call, 8 MB serialized); all share the same endpoint and model. Larger batches go to POST /api/v1/batches directly."
},
"provider_only": {
"type": "array",
"items": {
"type": "string"
},
"description": "Restrict routing to these provider slugs only, e.g. [\"google-vertex\"]"
}
}
},
"annotations": {
"title": "Send batch",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
Get the current status of a batch submitted with send-batch: lifecycle state (validating, in_progress, finalizing, completed, failed, expired, cancelling, cancelled), per-request completed/failed counts, the failure reason when the batch failed, and — once the batch is terminal — the inline results keyed by custom_id. Poll it until the status is terminal; batches usually take minutes to hours, so wait between polls rather than looping tightly.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
id
Batch id returned by send-batch, e.g. "batch_abc123"
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "get-batch",
"description": "Get the current status of a batch submitted with send-batch: lifecycle state (validating, in_progress, finalizing, completed, failed, expired, cancelling, cancelled), per-request completed/failed counts, the failure reason when the batch failed, and — once the batch is terminal — the inline results keyed by custom_id. Poll it until the status is terminal; batches usually take minutes to hours, so wait between polls rather than looping tightly.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"minLength": 1,
"description": "Batch id returned by send-batch, e.g. \"batch_abc123\""
}
}
},
"annotations": {
"title": "Get batch",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
List batches in the workspace of the authenticating API key, newest first, with id, status, model, and per-request completed/failed counts. Use status to narrow to in-flight work (validating, in_progress) and after with the returned last_id to page. List items never include inline results; call get-batch for a single batch to read them.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Page size, 1-100 (default 20)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
after
Cursor: the last_id from the previous page, to fetch the next page
Clear enough to supply this argument.
status
Only include batches in these states, e.g. ["validating","in_progress"] for in-flight batches. Omit to list every status.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "list-batches",
"description": "List batches in the workspace of the authenticating API key, newest first, with id, status, model, and per-request completed/failed counts. Use status to narrow to in-flight work (validating, in_progress) and after with the returned last_id to page. List items never include inline results; call get-batch for a single batch to read them.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"after": {
"type": "string",
"minLength": 1,
"description": "Cursor: the last_id from the previous page, to fetch the next page"
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100 (default 20)"
},
"status": {
"type": "array",
"items": {
"enum": [
"validating",
"in_progress",
"completed",
"failed",
"expired",
"cancelled"
],
"type": "string"
},
"minItems": 1,
"description": "Only include batches in these states, e.g. [\"validating\",\"in_progress\"] for in-flight batches. Omit to list every status."
}
}
},
"annotations": {
"title": "List batches",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
Loading score analytics…
Put your MCP to the test
A few tasks worth trying with this server, chosen from its reviewed tools. These have not been run.
01Search OpenRouter docsSearch the full OpenRouter documentation to answer "how do I…" questions with correct, current API usage.
02List modelsList the live OpenRouter model catalog with pricing, context length, modalities, supported parameters, and benchmark scores, to pick a model and wire the rig…
03List batchesList batches in the workspace of the authenticating API key, newest first, with id, status, model, and per-request completed/failed counts.
04List app rankingsSee which APPS/products drive the most OpenRouter traffic, filterable by category, to gauge ecosystem adoption and find example use cases.
05Compare model quality beyond price using third-party benchmarks
Want to run these tasks against your MCP server with us?
OpenRouterMcp setup, tools, quality score, publishing readiness, and alternatives.
How do I add OpenRouterMcp to Claude, ChatGPT, or Cursor?
Add OpenRouterMcp to Claude, ChatGPT, or Cursor by connecting its remote MCP URL in each client's MCP settings. In Claude, add a custom connector. In ChatGPT, add an MCP app. In Cursor, add an MCP server under Settings. The MCP URL is https://mcp.openrouter.ai/mcp.
Is OpenRouterMcp MCP ready for ChatGPT and Claude?
As of October 14, 2026, OpenRouterMcp scores 94/100 on Manufact's MCP publishing checklist. The scan meets ChatGPT publishing checks and does not yet meet Claude publishing checks. Passing these checks does not guarantee marketplace approval.
How clear is OpenRouterMcp's MCP tool documentation?
As of October 14, 2026, OpenRouterMcp scores 68/100 in Manufact's review of tool titles, descriptions, input and output schemas, and behavior annotations. The review covers 25 of 25 discovered tools. The quality score measures documentation clarity; runtime behavior and marketplace readiness require separate checks.
What are the best alternatives to OpenRouterMcp?
As of October 14, 2026, alternatives to OpenRouterMcp in developer-tools on the Manufact MCP catalog include killfear-held-at-the-gate.netlify.app, AgentMail, Manufact Cloud, Authdog, and Apify MCP Server.
How can OpenRouterMcp improve its MCP documentation?
list-models is the lowest-scoring reviewed tool at 45/100. No output schema is declared. Add one for structured results so clients can interpret returned fields. Open its review for feedback and a copyable fix prompt, then rerun the documentation review after updating your tool metadata.
Not your MCP?
Review any public or OAuth MCP server for protocol compatibility, tool documentation, and ChatGPT and Claude publishing readiness. No account required.