Discover verified AI inference nodes, get the best node+model per task, pre-price chains.
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Pre-price an invocation chain BEFORE spending money. Each step is either a concrete offering ("node_id/offering_id") or a `select` query that picks the best match, plus expected input and output tokens. Returns per-step cost bounds in USD, the pinned card_revision that makes each estimate enforceable at invocation, and chain totals. Use it to compare routes or budget a multi-model pipeline; nothing is invoked or charged.
Steps in execution order.
Pre-price an invocation chain BEFORE spending money. Each step is either a concrete offering ("node_id/offering_id") or a `select` query that picks the best match, plus expected input and output tokens. Returns per-step cost bounds in USD, the pinned card_revision that makes each estimate enforceable at invocation, and chain totals. Use it to compare routes or budget a multi-model pipeline; nothing is invoked or charged.
| Argument | Type | Description |
|---|---|---|
| steps* | array | Steps in execution order. |
{
"type": "object",
"required": [
"steps"
],
"properties": {
"steps": {
"type": "array",
"items": {
"type": "object",
"required": [
"est_input_tokens",
"est_output_tokens"
],
"properties": {
"select": {
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Free-text match against the model metadata, offering id, and node id, e.g. \"bielik\" or \"coder\"."
},
"lang": {
"type": "string",
"description": "Language with minimum grade, \"<iso-code>[:basic|strong|native]\", e.g. \"pl:strong\" or \"de\"."
},
"tier": {
"enum": [
"unverified",
"community",
"verified",
"attested"
],
"type": "string",
"description": "Minimum trust tier. unverified < community (passed automated checks) < verified (identity and context verified) < attested."
},
"family": {
"type": "string",
"description": "Model family or exact artifact, e.g. \"llama-3.3\" or \"qwen3\". Matches model.family or model.artifact exactly."
},
"scheme": {
"enum": [
"free",
"prepaid",
"x402"
],
"type": "string",
"description": "Payment scheme the offering must accept. \"free\" finds no-cost offerings."
},
"modality": {
"enum": [
"text",
"image",
"audio",
"video",
"embedding",
"multimodal",
"agent"
],
"type": "string",
"description": "What the model consumes/produces. Use \"text\" for chat and completion models."
},
"supports": {
"type": "string",
"description": "Comma-separated features the offering must all support: tool_calls, json_mode, vision, streaming. Example: \"tool_calls,json_mode\"."
},
"min_context": {
"type": "integer",
"minimum": 1,
"description": "Minimum context window in tokens, e.g. 32768."
},
"jurisdiction": {
"type": "string",
"description": "Only operators that declare a country inside it: \"eea\" (EU + Iceland, Liechtenstein, Norway) or comma-separated ISO country codes, e.g. \"DE,FI\". Registered nodes declare their country; imported listings of known providers carry an inferred one (jurisdiction.basis = \"inferred\"); listings without a country are excluded."
},
"max_input_price": {
"type": "number",
"minimum": 0,
"description": "Maximum input price in USD per million tokens."
}
},
"description": "Pick the best-ranked offering matching these filters (same as search_offerings). Give this or `offering`.",
"additionalProperties": false
},
"offering": {
"type": "string",
"description": "Concrete offering as \"node_id/offering_id\". Give this or `select`."
},
"est_input_tokens": {
"type": "integer",
"minimum": 0,
"description": "Expected prompt tokens for this step."
},
"est_output_tokens": {
"type": "integer",
"minimum": 0,
"description": "Expected completion tokens for this step."
}
},
"additionalProperties": false
},
"maxItems": 20,
"minItems": 1,
"description": "Steps in execution order."
}
},
"additionalProperties": false
}Who runs a node and how it has behaved: operator, country and regions, endpoints, declared hardware, trust tier and its history (verifications, suspensions, reinstatements, with reasons), recent registry probe results with an availability summary, and its offerings with context window and price. Use it to vet a provider before relying on it; take node_id from search_offerings, recommend or get_offering results. For one offering's full card, use get_offering.
| Argument | Type | Description |
|---|---|---|
| node_id* | string | Reverse-DNS node id, e.g. "io.opennodes.demo-node" or "import.openrouter.ai". |
| offering_limit | integer | Maximum offerings to list; imported catalogs can hold hundreds. `offerings_total` always gives the full count. |
{
"type": "object",
"required": [
"node_id"
],
"properties": {
"node_id": {
"type": "string",
"minLength": 1,
"description": "Reverse-DNS node id, e.g. \"io.opennodes.demo-node\" or \"import.openrouter.ai\"."
},
"offering_limit": {
"type": "integer",
"default": 25,
"maximum": 200,
"minimum": 0,
"description": "Maximum offerings to list; imported catalogs can hold hundreds. `offerings_total` always gives the full count."
}
},
"additionalProperties": false
}Full detail for one offering: endpoints, pricing, serving capabilities (context window, supported features, languages, hardware), data policy, trust tier, and the registry's observed probe results. Take node_id and offering_id from search_offerings or recommend results.
| Argument | Type | Description |
|---|---|---|
| node_id* | string | Reverse-DNS node id, e.g. "io.opennodes.demo-node". |
| offering_id* | string | Offering id within that node, as returned by search_offerings. |
{
"type": "object",
"required": [
"node_id",
"offering_id"
],
"properties": {
"node_id": {
"type": "string",
"minLength": 1,
"description": "Reverse-DNS node id, e.g. \"io.opennodes.demo-node\"."
},
"offering_id": {
"type": "string",
"minLength": 1,
"description": "Offering id within that node, as returned by search_offerings."
}
},
"additionalProperties": false
}Recommend the best AI node + model for a task, with an enforceable cost estimate and human-readable reasons. Use this first when you know the task but not the model. Pass `task` (sent to this registry, which extracts features and discards the text) or `features` already extracted on your side with extractFeatures from @opennodes/core, which keeps the prompt private. Returns ranked candidates with score components, a cost estimate pinned to the node's card revision, an optional cheaper two-step scenario, and MCP tool categories the task likely needs. To browse instead, use search_offerings; to price a specific chain, use estimate.
| Argument | Type | Description |
|---|---|---|
| task | string | The task description or the prompt itself. Sent to the registry for feature extraction; use `features` to keep it private. Give this or `features`. |
| policy | object | Optional constraints and preferences for the recommendation. |
| features | object | Features from extractFeatures(prompt) in @opennodes/core: task class, size, language and needs, no prompt text. Give this or `task`. |
| est_output_tokens | integer | Expected answer length in tokens, if known. Improves the cost estimate; otherwise inferred from the task. |
{
"type": "object",
"required": [],
"properties": {
"task": {
"type": "string",
"minLength": 1,
"description": "The task description or the prompt itself. Sent to the registry for feature extraction; use `features` to keep it private. Give this or `features`."
},
"policy": {
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 3,
"maximum": 20,
"minimum": 1,
"description": "Number of candidates to return."
},
"preset": {
"enum": [
"cheap",
"fast",
"quality",
"private"
],
"type": "string",
"description": "Weighting preset: cheap favours price, fast favours latency/throughput, quality favours model strength, private favours trust tier."
},
"region": {
"type": "string",
"description": "Required data region, e.g. \"eu\". Offerings pinned to other regions are excluded."
},
"min_tier": {
"enum": [
"unverified",
"community",
"verified",
"attested"
],
"type": "string",
"description": "Exclude offerings below this trust tier."
},
"jurisdiction": {
"type": "string",
"description": "Only operators in this jurisdiction: \"eea\" or ISO country codes (\"DE,FI\"). Local and LAN models always qualify."
},
"prefer_local": {
"type": "boolean",
"description": "Give a bonus to nodes on this machine or LAN."
},
"max_total_usd": {
"type": "number",
"minimum": 0,
"description": "Maximum estimated total cost of the call in USD."
},
"max_input_per_mtok": {
"type": "number",
"minimum": 0,
"description": "Maximum input price in USD per million tokens."
}
},
"description": "Optional constraints and preferences for the recommendation.",
"additionalProperties": false
},
"features": {
"type": "object",
"description": "Features from extractFeatures(prompt) in @opennodes/core: task class, size, language and needs, no prompt text. Give this or `task`."
},
"est_output_tokens": {
"type": "integer",
"minimum": 1,
"description": "Expected answer length in tokens, if known. Improves the cost estimate; otherwise inferred from the task."
}
},
"additionalProperties": false
}Search AI inference offerings in the OpenNodes registry — registered nodes AND imported catalogs (OpenRouter, Hugging Face Inference Providers, models.dev, local nodes). All filters are optional and combine with AND. Returns { offerings, total }: each offering has node_id, offering_id, model, pricing (USD per MTok), trust tier, serving capabilities, measured probe results, and a rank explanation. Use get_offering for one offering's full card, recommend to let the advisor choose.
| Argument | Type | Description |
|---|---|---|
| q | string | Free-text match against the model metadata, offering id, and node id, e.g. "bielik" or "coder". |
| lang | string | Language with minimum grade, "<iso-code>[:basic|strong|native]", e.g. "pl:strong" or "de". |
| sort | string | rank = registry ranking (price, trust, reliability); price = cheapest input first; ttft = fastest first token; tps = highest throughput. |
| tier | string | Minimum trust tier. unverified < community (passed automated checks) < verified (identity and context verified) < attested. |
| limit | integer | Maximum offerings to return; `total` still counts every match. |
| family | string | Model family or exact artifact, e.g. "llama-3.3" or "qwen3". Matches model.family or model.artifact exactly. |
| scheme |
| string |
| Payment scheme the offering must accept. "free" finds no-cost offerings. |
| modality | string | What the model consumes/produces. Use "text" for chat and completion models. |
| supports | string | Comma-separated features the offering must all support: tool_calls, json_mode, vision, streaming. Example: "tool_calls,json_mode". |
| min_context | integer | Minimum context window in tokens, e.g. 32768. |
| jurisdiction | string | Only operators that declare a country inside it: "eea" (EU + Iceland, Liechtenstein, Norway) or comma-separated ISO country codes, e.g. "DE,FI". Registered nodes declare their country; imported listings of known providers carry an inferred one (jurisdiction.basis = "inferred"); listings without a country are excluded. |
| max_input_price | number | Maximum input price in USD per million tokens. |
{
"type": "object",
"properties": {
"q": {
"type": "string",
"description": "Free-text match against the model metadata, offering id, and node id, e.g. \"bielik\" or \"coder\"."
},
"lang": {
"type": "string",
"description": "Language with minimum grade, \"<iso-code>[:basic|strong|native]\", e.g. \"pl:strong\" or \"de\"."
},
"sort": {
"enum": [
"rank",
"price",
"ttft",
"tps"
],
"type": "string",
"default": "rank",
"description": "rank = registry ranking (price, trust, reliability); price = cheapest input first; ttft = fastest first token; tps = highest throughput."
},
"tier": {
"enum": [
"unverified",
"community",
"verified",
"attested"
],
"type": "string",
"description": "Minimum trust tier. unverified < community (passed automated checks) < verified (identity and context verified) < attested."
},
"limit": {
"type": "integer",
"default": 50,
"maximum": 200,
"minimum": 1,
"description": "Maximum offerings to return; `total` still counts every match."
},
"family": {
"type": "string",
"description": "Model family or exact artifact, e.g. \"llama-3.3\" or \"qwen3\". Matches model.family or model.artifact exactly."
},
"scheme": {
"enum": [
"free",
"prepaid",
"x402"
],
"type": "string",
"description": "Payment scheme the offering must accept. \"free\" finds no-cost offerings."
},
"modality": {
"enum": [
"text",
"image",
"audio",
"video",
"embedding",
"multimodal",
"agent"
],
"type": "string",
"description": "What the model consumes/produces. Use \"text\" for chat and completion models."
},
"supports": {
"type": "string",
"description": "Comma-separated features the offering must all support: tool_calls, json_mode, vision, streaming. Example: \"tool_calls,json_mode\"."
},
"min_context": {
"type": "integer",
"minimum": 1,
"description": "Minimum context window in tokens, e.g. 32768."
},
"jurisdiction": {
"type": "string",
"description": "Only operators that declare a country inside it: \"eea\" (EU + Iceland, Liechtenstein, Norway) or comma-separated ISO country codes, e.g. \"DE,FI\". Registered nodes declare their country; imported listings of known providers carry an inferred one (jurisdiction.basis = \"inferred\"); listings without a country are excluded."
},
"max_input_price": {
"type": "number",
"minimum": 0,
"description": "Maximum input price in USD per million tokens."
}
},
"additionalProperties": false
}