Skip to main content
Glama

@relaygpu/mcp

Relay's MCP server. Your agent can find a Relay model, read its input schema, run it, poll long tasks, upload files, run workflows and search the Relay docs, all from Claude Code, Cursor, VS Code or Claude Desktop. It is built on @relaygpu/client. The tools are generic and take the model as a string, so a model added to Relay works without a new release.

Connect to the hosted server, or run it locally:

How

Credential

Hosted (Streamable HTTP)

https://mcp.relaygpu.com/mcp, nothing to install

X-API-Key: relay_sk_... header, or Authorization: Bearer <relay key or dashboard JWT>

Local (stdio)

npx -y @relaygpu/mcp (Node ≥ 20)

RELAY_API_KEY=relay_sk_... in its environment; optional RELAY_BASE_URL (default https://relaygpu.com)

The server never stores your key: the hosted one reads it from each request and uses it for that request only, the local one reads it from its environment.

Install

Claude Code, Codex, Cursor and VS Code connect to the hosted server: no Node, no npx. Claude Desktop accepts remote servers only through OAuth, which v0 does not offer yet, so it uses the local server through a one-click bundle. Every client can also run the local server; see Local server.

Claude Code

Terminal, in the CLI or the VS Code / JetBrains extension alike:

claude mcp add --transport http --scope user relay https://mcp.relaygpu.com/mcp --header "X-API-Key: relay_sk_..."

--scope user makes it available in every project; without it the server exists only in the directory you ran the command in. Check it with /mcp in a new session. If the terminal answers command not found: claude, the extension is installed but the CLI is not: install it with curl -fsSL https://claude.ai/install.sh | bash (or npm install -g @anthropic-ai/claude-code).

Codex

Codex sends the key as a Bearer token from an environment variable, so the key stays out of config.toml. Set RELAY_API_KEY in your shell profile, then:

codex mcp add relay --url https://mcp.relaygpu.com/mcp --bearer-token-env-var RELAY_API_KEY

Cursor

Add relay MCP server to Cursor

The button installs the entry below with a placeholder key; replace relay_sk_... in Cursor's MCP settings afterwards. By hand: ~/.cursor/mcp.json (all projects) or .cursor/mcp.json (one project).

{
  "mcpServers": {
    "relay": {
      "url": "https://mcp.relaygpu.com/mcp",
      "headers": { "X-API-Key": "relay_sk_..." }
    }
  }
}

VS Code (Copilot agent mode)

This installs the server for VS Code's own agent (Copilot Chat). Using Claude Code inside VS Code? Use the Claude Code command instead: the Claude Code extension does not read VS Code's MCP config.

Install in VS Code

VS Code asks for the key once and keeps it in its secret storage. By hand, in .vscode/mcp.json (one workspace) or with MCP: Open User Configuration (every workspace):

{
  "inputs": [{ "type": "promptString", "id": "relay-key", "description": "Relay API key (relay_sk_...)", "password": true }],
  "servers": {
    "relay": {
      "type": "http",
      "url": "https://mcp.relaygpu.com/mcp",
      "headers": { "X-API-Key": "${input:relay-key}" }
    }
  }
}

Claude Desktop

  1. Download relay.mcpb.

  2. Double-click it. Claude Desktop opens an install dialog: click Install.

  3. The extension installs switched off. Open Settings → Extensions → Relay → Configure.

  4. Paste your Relay key and click Save. The key stays in Claude Desktop's secure storage.

  5. Switch Relay on.

The bundle runs on Claude Desktop's built-in Node, so nothing else needs to be installed. get_credits and get_usage read the account, so they take a dashboard JWT or a custom-tier superkey, never a plain key; every other tool works with a plain key.

By hand instead: Settings → Developer → Edit Config opens claude_desktop_config.json in your default editor. Add the block below at the top level, save, then quit Claude Desktop (⌘Q) and reopen it:

{
  "mcpServers": {
    "relay": {
      "command": "npx",
      "args": ["-y", "@relaygpu/mcp"],
      "env": { "RELAY_API_KEY": "relay_sk_..." }
    }
  }
}

Local server (stdio)

Any client can run the server on your machine instead; it needs Node 20 or newer on the PATH the client sees (see Troubleshooting).

claude mcp add relay --scope user --env RELAY_API_KEY=relay_sk_... -- npx -y @relaygpu/mcp
codex mcp add relay --env RELAY_API_KEY=relay_sk_... -- npx -y @relaygpu/mcp

Cursor (~/.cursor/mcp.json) and VS Code take the same command / args / env entry as the Claude Desktop block above; VS Code adds "type": "stdio" and lists it under "servers".

Ready-to-copy files are in examples/.

Related MCP server: avots-mcp

Troubleshooting

  • "Server disconnected", "spawn npx ENOENT" or "Executable not found: npx" (Claude Desktop, Cursor). Apps opened from the Dock or Start menu do not load your shell profile, so a Node installed with nvm, Volta or Homebrew is not on their PATH. Use the Claude Desktop bundle, or put the full path in "command": run which npx in a terminal and paste the result (for example /Users/you/.nvm/versions/node/v22.22.0/bin/npx).

  • TypeError: Relay: no global fetch: the client started Node 16 or older. Install Node 20 or newer, or point "command" at a newer npx.

  • Windows: if the client cannot start npx, use "command": "cmd" with "args": ["/c", "npx", "-y", "@relaygpu/mcp"].

  • The first start takes a few seconds: npx downloads the package once (about 5 s); later starts take about 1 s.

Tools

Tools marked keyless work without a credential on the local server. Keyless tools answer the public catalog; with a credential, search_models, get_model, get_pricing, estimate_cost and run_model's model lookup answer your account's: the models your tier and grants can run appear and run. The others are billed or account tools and need one. A hosted server with OAuth on (see Self-hosting) takes no request without a credential, keyless tools included.

Tool

What it does

Example

search_models keyless

Find models by tag and/or text; image-to-image also lists every image model that takes an input image (accepts: ["image"])

"Find a text-to-video model from Kling" → {tag: "text-to-video", query: "kling"}

get_model keyless

Route, request schema, example, pricing and status of one model

{model: "Qwen/qwen-image"}

get_pricing keyless

Prices (public; your account's with a credential) for one model or all of them, including the media_storage SKUs

{model: "KlingTeam/v3-T2V"}

estimate_cost keyless

Estimate from the price list (public; your account's with a credential; not an invoice)

{model: "KlingTeam/v3-T2V", usage: {duration_seconds: 5, quality_mode: "std"}}

run_model

Run any model by name and wait up to 45 s

{model: "Qwen/qwen-image", input: {prompt: "a red fox", size: "512x512"}}

check_task keyless

Poll a task (waits up to 30 s)

{task_id: "direct:…", wait_seconds: 30}

upload_file

Host a file and get a URL for any *_url input (or an image editor's image), or a one-time upload slot for a local file on the hosted server

{path: "./clip.mp4", retention: "relay1d"} · {slot: true}

list_workflows

List the workflow templates

"Which workflows can I run?"

run_workflow

Start a workflow run, wait up to 45 s

{workflow_id: "script-voiceover", inputs: {messages: [{role: "user", content: "a lighthouse at dusk"}], voice: "Cherry"}}

check_workflow_run keyless

Poll a run (waits up to 30 s)

{run_id: "…", wait_seconds: 30}

cancel_workflow_run

Cancel a run that is still in progress

{run_id: "…"}

get_credits

Credit balance, promos and consumption (JWT or custom-tier superkey)

"How many credits do I have left?"

get_usage

Usage analytics (JWT or custom-tier superkey)

{period: "7d"}

search_docs keyless

Search the Relay docs

{query: "idempotency key"}

Local files

The hosted server cannot read files on your computer. How a local file reaches a model, per client:

Client

Local file → model

Claude Code, Cursor, VS Code, Codex (hosted server)

upload_file({slot: true}) returns a curl line; the agent runs it in your shell with the file's path (no key in the shell, single use, 10 minutes) and it prints the file's url; pass that url to run_model (for example as image).

claude.ai, Claude Desktop, ChatGPT

upload_file({slot: true}) returns a link: open the link in your browser, pick the photo, and paste the link the page shows back into the chat; the model passes it to run_model. No key leaves the chat, single use, 10 minutes. A public URL of the file works too.

Local server (stdio), any client

upload_file({path: "./photo.png"}) uploads the file and returns its url.

Image editors: search_models({tag: "image-to-image"}) lists every image model that takes an input image, each with accepts: ["image"].

Notes

  • Auth. On the local server, and on a hosted server without OAuth, tools/list and the keyless tools answer without a credential. A hosted server with OAuth on answers every /mcp request without a credential with 401 and WWW-Authenticate: Bearer resource_metadata="…", scope="relay", which is how clients start the "Connect Relay" sign-in; X-API-Key and Authorization: Bearer <relay key or dashboard JWT> keep working there. A billed tool called without one returns a MISSING_CREDENTIALS tool error that names what to set: the X-API-Key header (hosted) or RELAY_API_KEY (stdio). Errors from Relay come back as tool errors that include the error class, code, requestId and the server's detail. Your key never appears in a tool result or a log line.

  • Long tasks. run_model waits up to 45 s (wait_seconds, 0–45). If the task is still running after that, it returns the task_id and the line "Do not resubmit: call check_task with this task_id". Every submit carries an Idempotency-Key, so a retry does not bill twice. Pass your own idempotency_key if your agent might send the same submit again. Since 0.1.7 every model whose input schema takes async (image, video, audio) is submitted as a task, so a long image run returns a task_id, never a 524; chat models still answer inline.

  • Expiry. Each result link comes with its expiry: "expires 1 h after completion unless store_output was set". To keep results longer, pass store_output with a media_storage SKU from get_pricing (for example relay7d). That SKU adds a per-file fee.

  • Image links. The image routes that answer base64 (Gemini, gpt-image, FLUX-2-pro) also answer Relay's own links (urls); the server returns those links in place of the base64, for 1 h or the store_output lifetime. A result that carries base64 without a Relay link is uploaded through /v2/files (at the store_output retention, else relay1h, free within the daily quota) and comes back as a URL and a file_id. Image content blocks are opt-in: pass inline_images: true, which applies to images of 1 MB or less.

  • Uploads. On stdio, upload_file streams a local path of up to 100 MB. The hosted server cannot read your disk: use slot: true (see Local files), base64 (up to 4 MB) or a public url. Retention defaults to relay1h.

Self-hosting

docker build -t relaygpu-mcp .
docker run -p 2300:2300 -e PORT=2300 -e RELAY_BASE_URL=https://relaygpu.com relaygpu-mcp

The server listens on PORT (default 2300) and calls Relay at RELAY_BASE_URL. Endpoints:

  • POST /mcp: Streamable HTTP, stateless.

  • GET /healthz: returns {status, version}.

  • GET /metrics: Prometheus text with mcp_tool_calls_total{tool,outcome} and mcp_tool_seconds{tool}.

  • GET /.well-known/mcp/server-card.json: the server and its tools.

  • GET /.well-known/oauth-protected-resource (and …/mcp): the RFC 9728 protected-resource metadata, only with OAuth on.

OAuth ("Connect Relay")

OAuth is on when both OAUTH_ISSUER and MCP_RESOURCE_URL are set; with either unset the server behaves as above (no metadata route, keyless tools answer without a credential). All three variables belong to the MCP app and are read once at start:

Variable

Prod

Staging (VPN)

Notes

OAUTH_ISSUER

https://relaygpu.com

https://staging-back-c54ef4a.opengpu.network

Relay's authorization server; the JWKS is read from {issuer}/v2/oauth/jwks, the exchange posts to {issuer}/v2/oauth/token

MCP_RESOURCE_URL

https://mcp.relaygpu.com/mcp

http://relay-mcp-staging.internal.opengpu.network/mcp

This server's public /mcp URL: the access token's aud must equal it, and the metadata URL is its origin + /.well-known/oauth-protected-resource

OAUTH_MCP_CLIENT_SECRET

secret

secret

The relay-mcp client's secret: the same value as Relay's OAUTH_MCP_CLIENT_SECRET in the same environment, never shared across environments. Without it every exchange fails (503)

A Bearer value that is a JWT issued by OAUTH_ISSUER is an access token: the server verifies it (ES256 against the issuer's JWKS, aud, exp with 60 s skew), exchanges it at Relay for a 5-minute Relay credential and keeps that credential in memory per token hash until 30 s before it expires. A bad, expired or revoked token gets 401 with WWW-Authenticate: Bearer error="invalid_token", …; an authorization server that cannot be reached gets 503. Tokens, credentials and the secret are never logged.

Logs are JSON lines on stderr, WARNING and above by default (LOG_LEVEL). Without Docker, run npm ci && npm run build && node dist/http.js.

License

MIT

Available Tools

14 tools
cancel_workflow_runCancel a workflow runA
DestructiveIdempotent
Inspect

Cancel a workflow run. Cancels between steps only: a step already running completes and bills. A run that has already ended answers WORKFLOW_RUN_NOT_CANCELLABLE. Needs a Relay credential.

NameRequiredDescriptionDefault
run_idYesThe run id returned by run_workflow (`wf:…`).

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (destructive, idempotent, non-read-only), and the description adds value beyond them: cancellation granularity (mid-step work completes and still bills), the specific error code for ended runs, and the credential requirement. That is meaningful operational context an agent needs before invoking.

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?

Three short sentences, front-loaded with the core action, then constraint, then failure mode and prerequisite. No filler; every sentence carries distinct information.

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?

No output schema exists, yet the description supplies the relevant return behavior (WORKFLOW_RUN_NOT_CANCELLABLE) and billing consequence of a partial cancel. Combined with the annotations, 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% and run_id is fully documented in the schema with its `wf:…` format. The description adds no parameter-level detail, 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 verb+resource ('Cancel a workflow run') and immediately narrows scope with 'Cancels between steps only'. It does not explicitly name or contrast with siblings like run_workflow or check_workflow_run, so it falls short of full sibling differentiation.

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 clear preconditions and boundaries: cancellation only occurs between steps, an already-ended run returns WORKFLOW_RUN_NOT_CANCELLABLE, and a Relay credential is required. It stops short of explicitly naming alternative tools or when-not-to-use-this-instead scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_taskCheck a Relay taskA
Read-onlyIdempotent
Inspect

Checks a task run_model returned (no key needed: the task_id is the capability). Waits up to 30 s for it to finish; returns the result when completed, else its status: then call check_task again, never resubmit. Task results are kept 1 h after they finish.

NameRequiredDescriptionDefault
task_idYesThe task_id from run_model, e.g. direct:2f9c…
wait_secondsNoSeconds to wait for it to finish (0–30, default 30); 0 just reads the status.
inline_imagesNoAlso return images ≤ 1 MB as image content blocks (default false: links only).

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/openWorld/idempotent annotations, it discloses genuinely useful traits: no authentication key is required, the call blocks for at most 30 s, incomplete calls return status rather than results, and results expire 1 h after completion. These are non-obvious operational facts an agent could not infer from the annotations or schema, and they are consistent with the declared hints.

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 tight sentences with the core behavior front-loaded and no filler; the retention, wait and polling-loop facts each earn their place. The punctuation is slightly dense (a parenthetical plus a colon splice), which marginally hurts readability.

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?

There is no output schema, so the description carries the return-value burden itself and does so: it states that a completed task returns the result and an incomplete one returns status, plus how long results remain retrievable. For a 3-parameter polling tool, nothing an agent needs to call it correctly 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 explains task_id, wait_seconds (0–30, default 30) and inline_images. The description restates the 30 s wait but adds no format or edge-case meaning beyond the schema, so the baseline of 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+resource ('Checks a task') and ties it directly to the tool that produced it ('a task run_model returned'), which cleanly separates it from siblings like check_workflow_run. The parenthetical 'no key needed: the task_id is the capability' further pins down the exact identifier it operates on.

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?

It gives explicit polling guidance: wait up to 30 s, and if it isn't done, 'call check_task again, never resubmit.' That directly answers the when-to-use-again question. It doesn't explicitly name or exclude the alternate workflow-checking sibling, so it falls just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_workflow_runCheck a workflow runA
Read-only
Inspect

Poll a workflow run by run_id, waiting up to wait_seconds (≤ 30) for it to end. Completed → the final output; failed / cancelled → the error; still running → its steps so far: call check_workflow_run again. No key needed: the run_id is the access token.

NameRequiredDescriptionDefault
run_idYesThe run id returned by run_workflow (`wf:…`).
wait_secondsNoSeconds to wait for it to finish (0–30, default 30); 0 answers the current state at once.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no output schema, the description carries the burden and does so well: it maps every terminal state to a result (completed → final output, failed/cancelled → error, running → steps so far) and discloses the auth model ('the run_id is the access token'), which is behavior the readOnlyHint/openWorldHint annotations do not cover.

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?

Front-loaded with the action, then the outcome mapping, then the auth note. The arrow notation ('Completed → ...; failed / cancelled → ...') packs three branches into one sentence with zero waste.

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 two-param polling tool with no output schema, the description covers everything an agent needs: how to wait, what each outcome returns, how to continue polling, and why no key is required. Nothing material is missing.

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 schema already documents both params (baseline 3). The description adds meaning beyond the schema by framing run_id as the access token and reinforcing the wait_seconds cap and polling contract, which is useful context the schema alone doesn't convey.

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 and resource ('Poll a workflow run by run_id') and immediately clarifies it is a polling/status tool, which cleanly separates it from siblings like run_workflow, cancel_workflow_run, and list_workflows. An agent knows what it does without opening the schema.

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 explicit runtime guidance: wait up to wait_seconds, and if the run is still going, 'call check_workflow_run again'. It also ties run_id to its origin ('returned by run_workflow' in the schema). It does not name a when-not case or an alternative (e.g., cancel_workflow_run), so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

estimate_costEstimate a Relay costA
Read-onlyIdempotent
Inspect

Estimates the USD cost of a call from the price list (with a credential your account's view: its tier and grants; public otherwise): an estimate, not an invoice (the bill uses provider-reported usage and any custom pricing on your account). Pass only the usage fields the model's billing_type (see get_model or get_pricing) reads: per_token: input_tokens, output_tokens, cached_input_tokens; per_image: image_count, resolution_tier; per_second_video: duration_seconds, quality_mode, sound; per_second_audio: duration_seconds; per_character: character_count; per_media_token: media_input_tokens, media_output_tokens. Add store_output / retention / file_count for storage fees.

NameRequiredDescriptionDefault
modelYesExact model name, e.g. KlingTeam/v3-T2V.
usageYesWhat the call uses; only the fields of the model's billing type matter.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/openWorld/idempotent, so the bar is lower, yet the description still adds real context: the estimate may diverge from the invoice due to provider-reported usage and account-specific custom pricing, and pricing depends on the caller's tier and grants (public otherwise). It also documents defaults and that relay1h and provider storage are free. Missing: the returned structure.

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?

The estimate-vs-invoice caveat is front-loaded within the first sentence and there is no filler; however, the heavy nested-parenthesis construction and the long comma-run of billing-type field lists make it dense to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries full responsibility for describing the return value, and it only says it 'estimates the USD cost' without indicating a total vs. an itemized breakdown, currency/rounding, or what happens for an unpriced model or unsupported billing_type. Inputs are thoroughly covered, so the omission is on the output side only.

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 coverage is 100%, so the per-field descriptions already carry the definitions; the description's contribution is organizing fields by billing_type and instructing the agent to pass only the relevant subset, which is useful but largely restates the schema's existing 'per_token:'/'per_second_video:' prefixes. It adds the storage-fee trio (store_output/retention/file_count) grouping but little beyond that.

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 opening clause gives a specific verb (estimates) and resource (USD cost of a call from the price list), which is clearly distinct from get_pricing (returns the list) and get_usage (actual billed usage). An agent can distinguish it from every sibling without reading the schema.

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?

It explicitly directs the agent to consult get_model or get_pricing to find the model's billing_type, and warns off misuse by stating the result is an estimate, not an invoice, with the bill driven by provider-reported usage. It does not state a hard when-not (e.g., 'do not use to reconcile spend, use get_usage'), so it stops short of full alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_creditsGet credit balanceA
Read-only
Inspect

Read the account's credit balance, active promo credits and consumption. Needs a dashboard JWT or a custom-tier superkey; a plain inference key gets PERMISSION_DENIED (403). Needs a Relay credential.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the safety profile is covered. The description adds meaningful behavioral detail beyond that: the credential tiers accepted and the concrete failure mode (PERMISSION_DENIED 403 for a plain inference key). It stops short of describing return shape, but adds real value.

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 sentences that front-load the resource and then the auth constraints. Slightly repetitive with two consecutive 'Needs ...' clauses, but 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?

For a zero-parameter read with no output schema, the description covers what is returned (balance, promo credits, consumption) and what credentials are required. Sufficient for correct invocation, though it could be more explicit about the account/workspace scope of the read.

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?

The tool takes zero parameters, so per the rubric the baseline is 4. There is nothing for the description to compensate for, and the schema is trivially complete.

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 ('Read') and a precise resource set: credit balance, active promo credits, and consumption. This is clearly distinct from sibling cost/usage tools like get_usage, estimate_cost, and get_pricing, so an agent can select it without opening the 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 gives access prerequisites (dashboard JWT or custom-tier superkey; Relay credential) but no guidance on when to prefer this over get_usage or estimate_cost. Usage context is implied by the resource, not made explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_modelGet a Relay modelA
Read-onlyIdempotent
Inspect

Returns one model's route, request_schema (what run_model's input must follow), request_example, pricing and availability. With a credential the answer is your account's view (what its tier and grants can run), public otherwise. Then call run_model with an input shaped like request_example.

NameRequiredDescriptionDefault
modelYesExact model name from search_models, e.g. google/gemini-nano-banana-2.1.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only supply readOnly/idempotent/openWorld; the description adds genuinely new behavior: the response is auth-dependent ('with a credential the answer is your account's view ... public otherwise'), which materially changes how the agent should interpret results. Missing rate limits or how availability is expressed, so not a top score.

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?

Three tight sentences, front-loaded with the return fields, followed by the credential caveat and the follow-up action. Nothing is repeated and every clause carries information.

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?

There is no output schema, and the description compensates by enumerating the returned fields and explaining the account-vs-public variability. For a one-parameter read tool, an agent has everything needed to call it and interpret the result.

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 coverage is 100% with a single required parameter already documented as 'Exact model name from search_models, e.g. ...'. The description does not add format or naming guidance beyond that, so the schema does the work; 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?

Names a specific verb and resource ('Returns one model's route, request_schema, request_example, pricing and availability') and enumerates exactly what comes back. This clearly separates it from search_models (discovery) and get_pricing (cost-only) without the agent needing to open the schema.

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?

"Then call run_model with an input shaped like request_example" gives an explicit next step and sequencing, which is strong guidance. It stops short of naming when to prefer search_models first (only the schema carries "Exact model name from search_models") or when to skip get_model in favor of get_pricing, so no exclusion rules.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_pricingGet Relay pricingA
Read-onlyIdempotent
Inspect

Returns Relay's list prices (USD), optionally for one model (with a credential your account's view: its tier and grants; public otherwise), plus media_storage: the per-file fees of the store_output / upload retention SKUs (relay1d, relay7d, …). Then estimate_cost for a number.

NameRequiredDescriptionDefault
modelNoModel name (e.g. google/gemini-nano-banana-2.1) to keep only its rows. Omit for every model.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent and open-world traits, so the bar is lower, and the description still adds real context: results differ depending on whether a credential is supplied (account tier/grants view vs public list prices) and it names the media_storage section of the response. It does not describe response shape in detail or ordering, keeping it below 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the main purpose in the first clause, which is good. However, the nested parenthetical 'with a credential your account's view: its tier and grants; public otherwise' is dense and awkward to parse, and the final fragment 'Then estimate_cost for a number' is clipped. Information-dense but not cleanly structured.

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?

No output schema exists, so the description carries the return-shape burden and does reasonably well: it names USD list prices, per-model rows, and the media_storage per-file fee section with example SKU names. What is missing is any indication of row structure or volume for the no-model case, which matters for an open-world read.

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?

With one optional parameter at 100% schema coverage, the schema already documents the model filter including the 'omit for every model' behavior. The description adds the nuance that credentialed calls return the account's own tier/grants pricing, but that is about the call context rather than the parameter itself. 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 resource ('Returns Relay's list prices (USD)') and enumerates the payload sections (per-model rows, media_storage per-file fees for retention SKUs). It also names the sibling it is not ('Then estimate_cost for a number'), so an agent can distinguish it from the cost-calculation tool. The parenthetical about credentialed vs public views muddies it slightly but the core purpose is unmistakable.

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?

Explicitly routes the agent: call this to get price data, then call estimate_cost to turn it into a number. It also states the model-omission behavior ('Omit for every model'), which is a usage rule. No explicit when-not beyond that, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_usageGet usageA
Read-only
Inspect

Read the account's usage and spend per API key, newest keys first, 10 keys per page (pass starting_after = the previous answer's next_cursor for the next page; limit up to 1000). Pass period (e.g. 7d, max 30d) for a by-date breakdown, or from + to. Needs a dashboard JWT or a custom-tier superkey; a plain inference key gets PERMISSION_DENIED (403). Needs a Relay credential.

NameRequiredDescriptionDefault
toNoEnd date `YYYY-MM-DD`; use together with `from`.
fromNoStart date `YYYY-MM-DD`; use together with `to`.
limitNoKeys per page (default 10, max 1000).
periodNoTime period shorthand, e.g. `7d` or `30d` (max 30 days); adds a by-date breakdown.
starting_afterNoCursor: the `next_cursor` of the previous page.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only supply readOnlyHint and openWorldHint, but the description adds the auth/authorization profile (dashboard JWT or custom-tier superkey; plain inference key returns PERMISSION_DENIED 403), the Relay credential requirement, and pagination mechanics including the next_cursor handoff. Those are the details an agent most needs before calling and are not available in structured fields.

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 tightly packed sentences with the core purpose front-loaded and no filler. The parenthetical pagination and auth clauses are dense but each carries operative information; a small readability cost from cramming them into a single flow.

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?

With no output schema, the description still hints at the return shape via 'the previous answer's next_cursor', and it covers auth, credential requirements, pagination, and the two query modes. An agent has everything needed to call it correctly and iterate through pages.

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 coverage is 100%, so every parameter is already documented with its format and bounds. The description largely restates the schema (limit up to 1000, period max 30d, from+to pairing), adding only the 'newest keys first' ordering and the pagination workflow, which earns baseline rather than above-baseline credit.

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 and resource ('Read the account's usage and spend per API key') plus the sort order and page size. It is clearly distinguishable from sibling tools like get_credits, get_pricing, and estimate_cost, which concern balance, rates, and projection rather than per-key spend.

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 explicit conditions for the alternative parameter modes: use period for a by-date breakdown, or from + to for an explicit range, and warns that only dashboard JWT/custom-tier superkeys can call it. It does not name which sibling to use instead for related questions (e.g. get_credits for remaining balance), so it falls just short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_workflowsList workflowsA
Read-only
Inspect

List Relay's workflow templates: multi-step pipelines (e.g. script → voiceover) run as one call. Each entry has workflow_id, input_schema and its steps (step_id + model). Run one with run_workflow; inputs follow input_schema.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=true), so the description's burden is lighter. It nonetheless adds real value by disclosing the shape of each returned entry (workflow_id, input_schema, steps with step_id + model), which is important because there is no output 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 dense sentences with no filler; the identity/shape of the resource is front-loaded and the follow-up action (run_workflow) comes last where an agent expects it.

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?

For a zero-param, read-only listing tool with no output schema, the description covers the essential return fields and the next step. It omits minor context such as scope (are templates global or workspace-specific) or expected volume, but nothing that would cause a mis-invocation.

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?

The tool takes zero parameters, so the baseline is 4. The description's mention of input_schema refers to the listed workflows' schemas rather than to this tool's inputs, so there is no parameter semantics to clarify.

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 and resource ('List Relay's workflow templates') and immediately defines what a workflow template is (multi-step pipeline run as one call), which distinguishes it from run_workflow, check_workflow_run, and cancel_workflow_run.

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?

Explicitly routes the agent onward: 'Run one with run_workflow; inputs follow input_schema.' That names the alternative tool and the handoff condition. It does not state when this listing tool itself is preferred over other discovery tools, so it falls short of full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_modelRun a Relay modelAInspect

Runs any Relay model by name (billed to your key). input follows get_model's request_schema (request_example runs as is). Every model whose schema takes async (image, video, audio) is submitted as a task: it waits up to 45 s, past that it returns a task_id — do not resubmit, call check_task. Chat models answer inline. Result links expire 1 h after completion unless store_output names a media_storage SKU from get_pricing. Pass an idempotency_key if you may retry the same submit. Needs a Relay credential.

NameRequiredDescriptionDefault
inputYesRequest body per get_model's request_schema, without model, store_output or async (run_model sets them). Pass media as *_url links (upload_file makes one). mode: direct (Relay's providers, the default) or opengpu (the decentralized network, priced separately).
modelYesExact model name from search_models / get_model, e.g. google/gemini-nano-banana-2.1.
store_outputNoKeep result media longer: a media_storage SKU from get_pricing (e.g. relay7d, adds its per-file fee), or provider (default, 1 h).
wait_secondsNoSeconds to wait for it to finish (0–45, default 45); 0 returns the task_id at once.
inline_imagesNoAlso return images ≤ 1 MB as image content blocks (default false: links only).
idempotency_keyNoYour key for this submit (task models; a chat answer is not replayed): a retry with the same key and the same input replays the first task instead of starting (and billing) a new one; the same key with a changed input is refused with 422 IDEMPOTENCY_KEY_REUSED.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say it's a non-read-only, open-world, non-idempotent call; the description adds the material behavior: billing to the caller's key, a 45 s wait ceiling before returning a task_id, inline vs. task submission by schema type, 1 h link expiry, and the idempotency replay/422 semantics. That is substantially more than the annotations provide.

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?

It is front-loaded with the core action and scope, and every clause carries operational content, but the prose is dense and run-on ('45 s', '1 h', SKU references) in places. Slightly more sentence splitting would improve scanability without losing information.

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 6-parameter, open-world, mutating tool with no output schema, the description covers what matters: how to build input, what the return looks like (inline answer vs. task_id), how long result links last, and how to extend retention. Nothing an agent needs before invoking it is missing.

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?

With 100% schema coverage the schema already documents each parameter, so the baseline is 3. The description still adds cross-tool guidance for constructing `input` (follow get_model's request_schema, request_example runs as is) and ties store_output to a media_storage SKU from get_pricing, which the schema alone does not connect.

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 opening sentence states a specific verb and resource ('Runs any Relay model by name') and immediately marks it as billed, which distinguishes it from the free/metadata siblings like search_models and get_model. The model-by-name framing implicitly separates it from run_workflow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It names concrete alternatives and the conditions selecting them: call check_task instead of resubmitting a timed-out async task, pass idempotency_key if you may retry, and use store_output/get_pricing when results must outlive the 1 h expiry. It also states the credential prerequisite, so no routing decision is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_workflowRun a workflowAInspect

Start a workflow run (one submit) and wait up to wait_seconds (≤ 45) for it to finish. Completed → the final output; still running → run_id: call check_workflow_run with it, never resubmit (a new run bills again). Each step is billed as an ordinary request. webhook_url gets ONE signed workflow.completed / workflow.failed delivery when the run ends. Get workflow_id and the inputs shape from list_workflows. Needs a Relay credential.

NameRequiredDescriptionDefault
inputsYesTemplate inputs, an object matching the workflow's input_schema.
webhook_urlNoHTTPS URL for one signed workflow.completed / workflow.failed delivery when the run ends.
workflow_idYesWorkflow template id from list_workflows, e.g. `script-voiceover`.
store_outputNoRun-level storage for every media step: `provider` (default, 1 h link) or `relay1d` / `relay7d` / `relay30d` (billed per file, see get_pricing).
wait_secondsNoSeconds to wait for it to finish (0–45, default 45); 0 returns the run_id at once.
idempotency_keyNoIdempotency-Key for the submit: the same key and inputs within 24 h return the same run_id instead of a new run. Generated when omitted.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations only covering safety/openness flags, the description adds substantial behavioral context the annotations cannot: per-step billing ("each step is billed as an ordinary request"), the cost of a mistaken resubmit, the single signed webhook.completed / workflow.failed delivery, and the Relay credential requirement. These are exactly the cost- and side-effect facts an agent needs before invoking a billable, non-idempotent submit.

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?

The most decision-relevant facts (submit, wait, follow-up, billing) are front-loaded in two dense sentences with semicolons and no filler. It is slightly run-on and could be split, but essentially every clause carries information the agent needs.

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 billable async submit with six parameters, nested inputs, and no output schema, the description covers the return dichotomy (final output vs. run_id), the follow-up path, idempotency-adjacent behavior, webhook semantics, credential prerequisites, and where to obtain inputs. Nothing needed to call it correctly is missing.

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; the description still adds cross-tool guidance the schema cannot supply, telling the agent that workflow_id and the inputs shape come from list_workflows, and framing wait_seconds as a wait budget rather than a bare integer. It adds modest but real semantic value on top of the well-documented 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 first clause gives a specific verb + resource + scope ("Start a workflow run (one submit) and wait up to wait_seconds (≤ 45)"), which immediately distinguishes it from siblings like run_model (single model call) and check_workflow_run (status polling). An agent knows exactly what operation this is without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly routes the agent: if the run is still going, "call check_workflow_run with it, never resubmit (a new run bills again)", and it points to list_workflows for workflow_id and input shape. It names the alternative tool and the condition that selects it, plus the correct behavior on the negative outcome.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_docsSearch the Relay docsA
Read-only
Inspect

Search Relay's public docs (bundled, offline) for how-to, auth, errors, limits, retries, webhooks, files and pricing rules. Returns the best-matching sections: page, heading, docs path with anchor and an excerpt. For a model's input fields use get_model instead; to find a model use search_models.

NameRequiredDescriptionDefault
limitNoHow many sections to return (1–10, default 5).
queryYesWhat to look for, in plain words, e.g. `idempotency key` or `file retention`.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations declare readOnlyHint and openWorldHint=false, and the description corroborates that with 'bundled, offline', telling the agent results come from a local corpus with no network dependency. It also discloses the return shape (page, heading, docs path with anchor, excerpt), which the annotations do not cover. It says nothing about ranking/recency or corpus staleness, keeping it below 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences: purpose and corpus scope first, then return shape, then sibling routing. Every sentence carries distinct information with no redundancy or filler.

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?

There is no output schema, so the description's enumeration of returned fields ('page, heading, docs path with anchor and an excerpt') is genuinely necessary and present. With only two fully documented parameters and annotations covering the safety profile, nothing an agent needs to call this correctly 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 coverage is 100%, so both parameters (query, limit) are already fully documented in the schema, including the 1-10 range and default. The description adds no syntax, format, or query-construction guidance beyond what the schema states, so the baseline of 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 and resource ('Search Relay's public docs') and scopes what is searchable (how-to, auth, errors, limits, retries, webhooks, files, pricing rules), plus the offline/bundled nature. It explicitly distinguishes itself from two siblings (get_model, search_models), so an agent can route correctly 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 Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit routing: 'For a model's input fields use get_model instead; to find a model use search_models.' That resolves the main ambiguity against siblings. It stops short of stating when-not to use this tool (e.g. that it does not cover private/internal docs beyond the listed topics), so it is clear context without full exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_modelsSearch Relay modelsA
Read-onlyIdempotent
Inspect

Lists Relay models by tag and/or text. Common tags: text-to-image, image-to-image, text-to-video, image-to-video, video-to-video, text-to-speech, speech-to-text, text-to-text, text-to-embedding. image-to-image also lists every image model that takes an input image. Returns name, tag, route and accepts (input media the model takes, e.g. ["image"]; [] for none) per model (at most 50). With a credential the list is your account's view (what its tier and grants can run), public otherwise. Then call get_model with a name for its input schema.

NameRequiredDescriptionDefault
tagNoModel type tag, e.g. text-to-image or image-to-video. Omit for every tag.
queryNoWords to match, case-insensitive; every word must appear in the name, display name or tag (e.g. 'kling v3').

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/openWorld, yet the description still adds real value: a hard result cap ("at most 50"), the fact that visibility differs with and without a credential, and the exact per-model return fields. It omits pagination/truncation behavior and says nothing about rate limits.

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?

Front-loaded with purpose, then capabilities, then return shape, then the next step. The tag enumeration is long but earns its space as the only source of that vocabulary; a couple of clauses could still be tightened.

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 two-param read tool with no output schema, it supplies return fields, the result cap, the auth-dependent scoping, and the next call to make. An agent has everything needed to invoke it and act on results.

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; the description goes beyond it by enumerating the valid tag vocabulary (absent from the schema's enums) and by clarifying that image-to-image deliberately widens to all image-in models. The query semantics are already in the schema, so the gain is partial rather than decisive.

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?

Opens with a specific verb and resource ("Lists Relay models by tag and/or text") and explicitly separates itself from get_model, which it names as the follow-up for input schemas. An agent can distinguish it from run_model or get_pricing 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 Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear two-step flow ("Then call get_model with a name for its input schema") and explains the credential-dependent view. It stops short of naming exclusions against other siblings such as get_pricing or list_workflows, but the usage context is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_fileUpload a file to RelayAInspect

Hosts an image, video or audio file on Relay and returns its url: pass that url to any *_url input of run_model. Give exactly one of path (local server only, ≤ 100 MB), base64 (≤ 4 MB) or url (a public link Relay copies). retention: relay1h (default, free within a daily quota) or a media_storage SKU from get_pricing. Needs a Relay credential.

NameRequiredDescriptionDefault
urlNoPublic http(s) link to copy onto Relay.
pathNoLocal file path (stdio server only; the hosted server cannot read your disk). Max 100 MB.
slotNotrue: get a single-use upload URL (10 minutes): run the curl line in your shell on the local file, or open open_url in a browser and pick the file; either prints the hosted link.
base64NoFile content as base64 or a data: URI, at most 4 MB decoded. Larger files: pass url.
filenameNoFile name to record (defaults to the path's base name).
retentionNoHow long the link lives: relay1h (default, free within a daily quota) or a media_storage SKU from get_pricing (relay1d, relay7d, …).

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only say this is a non-read-only, non-destructive, non-idempotent open-world call; the description adds the material context — size ceilings per input mode, the daily free quota on relay1h, and the requirement for a Relay credential. It stops short of saying whether repeated uploads of the same file create distinct URLs or can be cleaned up, which is the remaining gap for a write tool.

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 tight paragraph: outcome first, then how to consume the result, then the input constraint, then retention policy, then the credential prerequisite. No sentence is filler.

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 6-parameter upload tool with no output schema, it covers the full lifecycle an agent needs: what gets hosted, what URL comes back, where that URL goes next, size/transport limits, retention options and the auth prerequisite. Nothing required to invoke it correctly is missing.

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 per-parameter text is already present. The description still adds value the schema cannot express: the exclusive-or relationship among path/base64/url (the schema has no oneOf) and the size limits restated at the decision point. The slot parameter is left entirely to the schema, which is acceptable since it is well documented there.

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 and resource ('Hosts an image, video or audio file on Relay and returns its url') and immediately names the consumer of the output ('any *_url input of run_model'). This distinguishes it from every sibling, none of which handle file hosting.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit decision rule for the three mutually exclusive inputs ('Give exactly one of path, base64 or url'), scopes path to local server only, caps base64 at 4 MB and routes larger/published files to url. It also points to get_pricing for non-default retention, so the agent knows where the alternative lives.

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. 14 tool updatesv0.1.8
    • First observedcancel_workflow_run
    • First observedcheck_task
    • First observedcheck_workflow_run
    • First observedestimate_cost
    • First observedget_credits
    • First observedget_model
    • First observedget_pricing
    • First observedget_usage
    • First observedlist_workflows
    • First observedrun_model
    • First observedrun_workflow
    • First observedsearch_docs
    • First observedsearch_models
    • First observedupload_file

TDQS

A4.3/5.0

Scored across 14 tools

Disambiguation4/5

Tools are largely distinct and the descriptions explicitly cross-reference their partners (run_model → check_task, run_workflow → check_workflow_run), which resolves most ambiguity. The only soft overlaps are the account/money trio get_pricing, estimate_cost, get_usage and get_credits, which an agent could momentarily confuse, plus the parallel check_task/check_workflow_run pair that requires reading descriptions to separate.

Naming Consistency5/5

Every tool follows a strict snake_case verb_noun pattern (list_workflows, search_models, get_model, run_model, check_task, cancel_workflow_run, upload_file, estimate_cost). The run/check/cancel triplet for workflows and the run/check pair for tasks are named symmetrically, reinforcing the pattern.

Tool Count5/5

14 tools sit squarely in the well-scoped range for an inference/media platform. Each tool maps to a distinct stage: discovery, schema lookup, pricing, execution, polling, cancellation, upload, and account state, with no obviously redundant entries.

Completeness4/5

The surface covers the full lifecycle for models and workflows: discover → inspect schema → estimate cost → run → poll → cancel → store outputs, plus upload, usage, credits, and docs. The notable gap is asymmetry in cancellation: workflow runs can be cancelled but async model tasks (check_task) have no cancel or list/history operation, which could strand long-running or unwanted tasks.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers