Every major chat, image and video model on one prepaid key. OpenAI, Anthropic and Gemini formats.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer <your RelaySwitch API key> from app.relayswitch.io/console/keys
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
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.
A chat model id from list_models.
The conversation, OpenAI chat format.
Instructions placed ahead of the conversation as a system message.
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.
Cap on completion tokens.
True: the model may search the web while it answers (billed per search, the price in GET /v1/catalog server_tools).
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http gateway https://api.relayswitch.io/mcp \ --header 'Authorization: Bearer YOUR_TOKEN'
Headers
Authorization (required): Bearer <your RelaySwitch API key> from app.relayswitch.io/console/keysSends 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.
| Argument | Type | Description |
|---|---|---|
| model* | string | A chat model id from list_models. |
| system | string | Instructions placed ahead of the conversation as a system message. |
| messages* | array | The conversation, OpenAI chat format. |
| image_urls | array | 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 | integer | Cap on completion tokens. |
| web_search | boolean | True: the model may search the web while it answers (billed per search, the price in GET /v1/catalog server_tools). |
| temperature | number |
{
"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
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| models* | array | 2 to 5 chat model ids from list_models, asked at the same time. |
| prompt | string | One user message, in place of messages. |
| system | string | Instructions placed ahead of the conversation as a system message. |
| messages | array | The conversation, OpenAI chat format. |
| image_urls | array | 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 | integer | Cap on completion tokens per model. Default 1024. |
| temperature | number |
{
"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
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| input* | any | One text, or up to 64 texts, to embed. |
| model* | string | An embedding model id from list_models (type embedding). |
{
"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)."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| models | array | Model ids to price. Default: every chat model, cheapest first. |
| prompt | string | Text to estimate the prompt tokens from, instead of input_tokens. |
| messages | array | Chat messages to estimate from, instead of input_tokens. |
| input_tokens | integer | Prompt tokens. Give this or a prompt / messages to count from. |
| output_tokens | integer | Completion tokens. Default 1000. |
{
"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."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| input* | object | 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. |
| model* | string | A media model id from list_media_models. |
| preview | boolean | Default true: a finished image comes back inline as image content besides its link. |
| wait_seconds | integer | 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. |
{
"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."
}
}
}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}.
| Argument | Type | Description |
|---|---|---|
| id* | string | The generation id generate answered with (gen_ then 24 hex characters). |
| preview | boolean | Default true: a finished image comes back inline as image content besides its link. |
| wait_seconds | integer | 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. |
{
"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."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| kind | string | |
| limit | integer | How many, newest first. Default 20. |
| model | string | Only this media model id. |
| before | integer | Only generations created before this Unix time (seconds, or the ms next_before of the last page). |
| status | string |
{
"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"
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| kind | string | Only models of this kind. |
| search | string | A substring of the model id or name (nano-banana, veo, kling...). |
{
"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...)."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| type | string | Only models of this type. Default: every text model. |
| search | string | A substring of the model id or name (opus, deepseek, uncensored...). |
| developer | string | Only models from this developer (Anthropic, OpenAI, Google, DeepSeek...). |
{
"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...)."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| model* | string | A media model id from list_media_models (nano-banana-2, kling-3.0-pro, seedance-2, elevenlabs-v3, image-upscaler...). |
{
"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...)."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| input* | object | 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. |
| model* | string | A media model id from list_media_models. |
{
"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."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| model | string | One model id. Default: every model. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"model": {
"type": "string",
"description": "One model id. Default: every model."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| model* | string | A rerank model id from list_models (type rerank). |
| query* | string | What the documents are ranked against. |
| top_n | integer | How many to return, best first. Default: all. |
| documents* | array | Up to 100 texts to rank. |
{
"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."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| query* | string | What to search for, up to 400 characters. |
| freshness | string | Only pages published inside this window. |
| max_results | integer | 1 to 10 results. Default 5. |
{
"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."
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| model* | string | A transcription model id from list_models (type transcription). |
| prompt | string | Names or words to spell right, or the text that came before. |
| language | string | The spoken language as an ISO-639-1 code (en, es, zh...), when known. |
| audio_url* | string | 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 | boolean | True: translate the speech into English instead (the models that can). |
{
"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)."
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 8, 2026.