RelaySwitch MCP
An official MCP server that exposes every AI model available on the RelaySwitch platform as tools within compatible clients like Claude Code, Cursor, and Cline. It allows agents to perform chat, compare multiple models, search the web, embed text, rerank documents, transcribe audio, and generate images, video, and speech, all managed through a single prepaid key with built-in routing and observability.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://api.relayswitch.io/mcpWhat its tools do
15 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Read-only (12)
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Passed Official MCP Registry namespace is tied to relayswitch.io ·
- Passed Endpoint is on the registry namespace domain ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Ask any chat model or compare multiple models side-by-side for a second opinion
- Generate images, video, speech, or music using specific model settings
- Search the web, embed text into vectors, or rerank documents for relevance
- Transcribe audio or video files from a URL into text
Source and maintenance
Protocol and capabilities
- Server
- relayswitch 2026-10-19
- MCP protocol negotiated in check
- 2025-11-25
- Tools
- 15 advertised
- Resources
- Not advertised
- Resource templates
- Not advertised
- Prompts
- 4 advertised
{
"tools": {
"listChanged": true
},
"prompts": {
"listChanged": true
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
15 advertised
list_models — List every text model and price
Every chat, embedding, rerank and transcription model on RelaySwitch with its id, type, the routes and tools that take it, our price (per million tokens, or per audio minute for transcription), the developer's list price where recorded, the wire formats it answers (openai, anthropic, gemini) and its specs. Image, video, speech, music and 3D models are in list_media_models. No key needed. Live from GET /v1/catalog.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"type": {
"enum": [
"chat",
"embedding",
"rerank",
"transcription"
],
"type": "string",
"description": "Only models of this type. Default: every text model."
},
"search": {
"type": "string",
"description": "A substring of the model id or name (opus, deepseek, uncensored...)."
},
"developer": {
"type": "string",
"description": "Only models from this developer (Anthropic, OpenAI, Google, DeepSeek...)."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}list_media_models — List image, video, speech and 3D models and prices
Every media model on RelaySwitch with its id, kind, endpoint, unit and price per image, second, generation or minute at each setting, next to the developer's price where recorded. No key needed. Live from GET /v1/catalog/media.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"kind": {
"enum": [
"image",
"video",
"audio",
"3d"
],
"type": "string",
"description": "Only models of this kind."
},
"search": {
"type": "string",
"description": "A substring of the model id or name (nano-banana, veo, kling...)."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}media_model — One media model's settings and prices
Everything generate needs to call one image, video, speech, music or 3D model: each setting under params with its type, the values it takes, its range and its default, and the price per unit at each setting under pricing. No key needed. Live from GET /v1/catalog/media.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"model"
],
"properties": {
"model": {
"type": "string",
"description": "A media model id from list_media_models (nano-banana-2, kling-3.0-pro, seedance-2, elevenlabs-v3, image-upscaler...)."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}estimate — Estimate what a request costs
The cost of a request on every chat model (or the ids given), cheapest first, with the developer's list cost and the saving. Give input_tokens, or a prompt / messages to count from. With the caller's key, prices are the key's own (price locks included). Live from POST /v1/estimate.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"models": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 200,
"description": "Model ids to price. Default: every chat model, cheapest first."
},
"prompt": {
"type": "string",
"description": "Text to estimate the prompt tokens from, instead of input_tokens."
},
"messages": {
"type": "array",
"items": {
"type": "object",
"required": [
"role",
"content"
],
"properties": {
"role": {
"type": "string"
},
"content": {
"type": "string"
}
}
},
"description": "Chat messages to estimate from, instead of input_tokens."
},
"input_tokens": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Prompt tokens. Give this or a prompt / messages to count from."
},
"output_tokens": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0,
"description": "Completion tokens. Default 1000."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}media_quote — Price a generation before running it
What generate would charge for exactly these settings, at the key's own rates: the units billed, the charge, and the developer's own price for the same request where one is on record. The settings are checked as a real request's would be, so a wrong value fails here, not at the model. Nothing runs and nothing is charged. Needs the key. Live from POST /v1/generations/quote.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"model",
"input"
],
"properties": {
"input": {
"type": "object",
"description": "The model's settings, as media_model lists them under params: prompt, size or aspect_ratio, resolution, duration, image_urls, text, voice... A setting left out takes the model's default.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"model": {
"type": "string",
"description": "A media model id from list_media_models."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}proof — Daily real-model check
Whether each model is still the model it says it is: every day one fixed prompt goes to every model and the verdict per model is stable, changed, failed or unchecked, with the time of the last check and how long the answer has been unchanged. No key needed. Live from GET /v1/proof.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"model": {
"type": "string",
"description": "One model id. Default: every model."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}chat — Send a chat request
Sends messages to any chat model id through POST /v1/chat/completions and returns the answer, the token usage and what the request cost. system adds instructions, image_urls lets a model that sees images look at them (a file generate made works), web_search lets the model search while it answers. Billed to the key in the MCP request's Authorization header (Bearer sk-relay-live-...); without one it fails.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"model",
"messages"
],
"properties": {
"model": {
"type": "string",
"description": "A chat model id from list_models."
},
"system": {
"type": "string",
"maxLength": 100000,
"description": "Instructions placed ahead of the conversation as a system message."
},
"messages": {
"type": "array",
"items": {
"type": "object",
"required": [
"role",
"content"
],
"properties": {
"role": {
"enum": [
"system",
"user",
"assistant"
],
"type": "string"
},
"content": {
"type": "string"
}
}
},
"minItems": 1,
"description": "The conversation, OpenAI chat format."
},
"image_urls": {
"type": "array",
"items": {
"type": "string",
"format": "uri"
},
"maxItems": 8,
"description": "Image URLs attached to the last user message, for the chat models that take images (input_modalities in list_models). A file generate made works."
},
"max_tokens": {
"type": "integer",
"maximum": 128000,
"minimum": 1,
"description": "Cap on completion tokens."
},
"web_search": {
"type": "boolean",
"description": "True: the model may search the web while it answers (billed per search, the price in GET /v1/catalog server_tools)."
},
"temperature": {
"type": "number",
"maximum": 2,
"minimum": 0
}
}
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}compare — Ask several models the same thing
Sends the same conversation (or one prompt) to 2 to 5 chat model ids at once through POST /v1/chat/completions and returns every answer side by side with its token usage, cost and time, plus the total. For a second opinion from another model, or to pick the model that answers a kind of question best. Completions are capped at max_tokens each (default 1024). Each model is billed to the key in the MCP request's Authorization header; a model that fails is reported and not charged.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"models"
],
"properties": {
"models": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 5,
"minItems": 2,
"description": "2 to 5 chat model ids from list_models, asked at the same time."
},
"prompt": {
"type": "string",
"description": "One user message, in place of messages."
},
"system": {
"type": "string",
"maxLength": 100000,
"description": "Instructions placed ahead of the conversation as a system message."
},
"messages": {
"type": "array",
"items": {
"type": "object",
"required": [
"role",
"content"
],
"properties": {
"role": {
"enum": [
"system",
"user",
"assistant"
],
"type": "string"
},
"content": {
"type": "string"
}
}
},
"minItems": 1,
"description": "The conversation, OpenAI chat format."
},
"image_urls": {
"type": "array",
"items": {
"type": "string",
"format": "uri"
},
"maxItems": 8,
"description": "Image URLs attached to the last user message, for the chat models that take images (input_modalities in list_models). A file generate made works."
},
"max_tokens": {
"type": "integer",
"maximum": 32000,
"minimum": 1,
"description": "Cap on completion tokens per model. Default 1024."
},
"temperature": {
"type": "number",
"maximum": 2,
"minimum": 0
}
}
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}search — Search the web
One web search through POST /v1/search: titles, URLs, snippets and publish dates, up to 10 results, optionally only from the last day, week, month or year. Billed as one search to the key in the MCP request's Authorization header (the price in GET /v1/catalog server_tools); a search that fails is not charged.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"query"
],
"properties": {
"query": {
"type": "string",
"maxLength": 400,
"minLength": 1,
"description": "What to search for, up to 400 characters."
},
"freshness": {
"enum": [
"day",
"week",
"month",
"year"
],
"type": "string",
"description": "Only pages published inside this window."
},
"max_results": {
"type": "integer",
"maximum": 10,
"minimum": 1,
"description": "1 to 10 results. Default 5."
}
}
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}embed — Turn text into vectors
Embeds one text or up to 64 through POST /v1/embeddings with an embedding model id from list_models (type embedding) and returns one vector per text, in order, with the token usage and the charge. Billed to the key in the MCP request's Authorization header.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"model",
"input"
],
"properties": {
"input": {
"anyOf": [
{
"type": "string",
"minLength": 1
},
{
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"maxItems": 64,
"minItems": 1
}
],
"description": "One text, or up to 64 texts, to embed."
},
"model": {
"type": "string",
"description": "An embedding model id from list_models (type embedding)."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}rerank — Rank documents by relevance
Orders up to 100 documents by relevance to a query through POST /v1/rerank with a rerank model id from list_models (type rerank): each result's index into documents, its score and its text, best first. Billed per input token to the key in the MCP request's Authorization header.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"model",
"query",
"documents"
],
"properties": {
"model": {
"type": "string",
"description": "A rerank model id from list_models (type rerank)."
},
"query": {
"type": "string",
"maxLength": 4000,
"minLength": 1,
"description": "What the documents are ranked against."
},
"top_n": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "How many to return, best first. Default: all."
},
"documents": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"maxItems": 100,
"minItems": 1,
"description": "Up to 100 texts to rank."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}transcribe — Transcribe audio or video
Turns the speech in an audio or video file at an https URL (25 MB at most; a file generate made works) into text through POST /v1/audio/transcriptions, or into English with translate. Use a transcription model id from list_models (type transcription). Billed per second of audio to the key in the MCP request's Authorization header; a request that fails is not charged.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"model",
"audio_url"
],
"properties": {
"model": {
"type": "string",
"description": "A transcription model id from list_models (type transcription)."
},
"prompt": {
"type": "string",
"maxLength": 1000,
"description": "Names or words to spell right, or the text that came before."
},
"language": {
"type": "string",
"maxLength": 16,
"minLength": 2,
"description": "The spoken language as an ISO-639-1 code (en, es, zh...), when known."
},
"audio_url": {
"type": "string",
"format": "uri",
"description": "An https URL of the audio or video file: mp3, mp4, m4a, wav, webm, ogg, flac or aac, 25 MB at most. A file generate made works."
},
"translate": {
"type": "boolean",
"description": "True: translate the speech into English instead (the models that can)."
}
}
}{
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}generate — Generate an image, video, speech, music or 3D file
Runs any media model id from list_media_models with its settings (see media_model) through POST /v1/generations, waits up to wait_seconds for the files, and returns the generation: a link per file (kept 30 days), a finished image inline, and the charge. A video that is still running when the wait ends is returned as it stands; call generation with its id to keep waiting. Charged to the key in the MCP request's Authorization header when the model accepts the task; a failed generation is refunded in full. To go from an image to a video or an edit, pass the image's URL in image_urls.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"model",
"input"
],
"properties": {
"input": {
"type": "object",
"description": "The model's settings, as media_model lists them under params: prompt, size or aspect_ratio, resolution, duration, image_urls, text, voice... A setting left out takes the model's default.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"model": {
"type": "string",
"description": "A media model id from list_media_models."
},
"preview": {
"type": "boolean",
"description": "Default true: a finished image comes back inline as image content besides its link."
},
"wait_seconds": {
"type": "integer",
"maximum": 120,
"minimum": 0,
"description": "Seconds to wait for the files before answering with the generation as it stands, 0 to 120. Images usually finish inside the default 60; a video takes minutes, so follow up with generation."
}
}
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}generation — A generation's status and files
One generation by id: its status, progress, files and charge, waiting up to wait_seconds for it to finish first. Use it after generate answers with a video still running. Needs the key the generation was made with. Live from GET /v1/generations/{id}.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"pattern": "^gen_[0-9a-f]{24}$",
"description": "The generation id generate answered with (gen_ then 24 hex characters)."
},
"preview": {
"type": "boolean",
"description": "Default true: a finished image comes back inline as image content besides its link."
},
"wait_seconds": {
"type": "integer",
"maximum": 120,
"minimum": 0,
"description": "Seconds to wait for the files before answering with the generation as it stands, 0 to 120. Images usually finish inside the default 60; a video takes minutes, so follow up with generation."
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}generations — List the generations made on this key's organization
The organization's generations, newest first, each with its status, model, files and charge: the asset library behind generate. Filter by kind, model or status; page with before. Files are kept 30 days. Needs the key. Live from GET /v1/generations.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"kind": {
"enum": [
"image",
"video",
"audio",
"3d"
],
"type": "string"
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "How many, newest first. Default 20."
},
"model": {
"type": "string",
"description": "Only this media model id."
},
"before": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only generations created before this Unix time (seconds, or the ms next_before of the last page)."
},
"status": {
"enum": [
"queued",
"running",
"succeeded",
"failed"
],
"type": "string"
}
}
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}Prompts
4 advertised
picture_to_clip — Picture to clip
Make a picture from a description, then animate it into a video clip. No key to get it; the tools it calls bill your key.
- picture
- What the picture shows: subject, setting, light, style. Leave out to take it from the conversation.
- motion
- What moves in the clip and how the camera moves. Default: natural motion with a slow push-in.
- aspect_ratio
- Aspect ratio. Default 16:9.
- image_model
- A image model id from list_media_models. Default nano-banana-2.
- video_model
- A video model id from list_media_models. Default veo-3.1-fast.
- max_usd
- Optional budget in USD: the agent stops before the first generate if the quoted total is above it.
product_shot_set — Product shot set
One product prompt rendered in several aspect ratios on one image model. No key to get it; the tools it calls bill your key.
- product
- The product and the shot: what it is, the surface, the light, the background. Leave out to take it from the conversation.
- ratios
- Aspect ratios, comma separated. Default 1:1, 4:5, 9:16, 16:9.
- model
- A image model id from list_media_models. Default nano-banana-2.
- resolution
- The image model's resolution setting (1K, 2K, 4K on Nano Banana 2). Default 2K where the model takes it.
- max_usd
- Optional budget in USD: the agent stops before the first generate if the quoted total is above it.
clip_with_voiceover — Clip with voice-over
A video clip and a spoken voice-over of your script, made side by side. No key to get it; the tools it calls bill your key.
- scene
- What the clip shows. Leave out to take it from the conversation.
- script
- The words the voice-over says. Leave out to take it from the conversation.
- voice
- A voice the speech model takes (media_model lists them). Default: the model's own.
- aspect_ratio
- Aspect ratio. Default 16:9.
- video_model
- A video model id from list_media_models. Default veo-3.1-fast.
- voice_model
- A speech model id from list_media_models. Default elevenlabs-v3.
- max_usd
- Optional budget in USD: the agent stops before the first generate if the quoted total is above it.
upscale_and_animate — Upscale and animate
Upscale an image, then animate the sharper copy into a video clip. No key to get it; the tools it calls bill your key.
- image_url
- The image to upscale: a file URL from generate, or any public http(s) image URL. Leave out to take it from the conversation.
- motion
- What moves in the clip and how the camera moves. Default: natural motion with a slow push-in.
- scale
- How many times larger. Default 2.
- aspect_ratio
- Aspect ratio. Default 16:9.
- video_model
- A video model id from list_media_models. Default veo-3.1-fast.
- max_usd
- Optional budget in USD: the agent stops before the first generate if the quoted total is above it.
Resources
Not advertised
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 359 ms
- 95th percentile latency
- 359 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 359 ms · metadata changed · 15 tool(s), 4 prompt(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http relayswitch-mcp https://api.relayswitch.io/mcpCodex
codex mcp add relayswitch-mcp --url https://api.relayswitch.io/mcpCursor
{
"mcpServers": {
"relayswitch-mcp": {
"url": "https://api.relayswitch.io/mcp"
}
}
}Cline
{
"mcpServers": {
"relayswitch-mcp": {
"type": "streamableHttp",
"url": "https://api.relayswitch.io/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"relayswitch-mcp": {
"type": "http",
"url": "https://api.relayswitch.io/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http relayswitch-mcp https://api.relayswitch.io/mcpClaude Desktop
https://api.relayswitch.io/mcpWindsurf
{
"mcpServers": {
"relayswitch-mcp": {
"serverUrl": "https://api.relayswitch.io/mcp"
}
}
}Let your agent find its tools
Find servers like RelaySwitch MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other ai and machine learning servers
Do you run RelaySwitch MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.