A side-by-side look at the Copilot Studio and Relay MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose Copilot Studio for conversational ai work as a local process; choose Relay for conversational ai as a local process. You can also run both side by side in one mcpServers block.
discover_resources, get_consumption, manage_agents.RELAY_API_KEY, RELAY_BASE_URL.search_models, get_model, get_pricing.Rows where the two servers differ are marked.
| Spec | C Copilot Studio | |
|---|---|---|
| Category | Conversational AI | Conversational AI |
| Quality signal | 59/100 · Good | 61/100 · Good |
| Install command | Confirmed | Confirmed |
| Transport | Local subprocess (stdio) | Local subprocess (stdio) |
| Auth | OAuth 2.0 | Not declared |
| Pricing | Not declared | Not declared |
| Required env vars | None listed | RELAY_API_KEYRELAY_BASE_URL |
| Verified owner | Community listing | Community listing |
| GitHub stars | 3 | 0 |
| Directory activity | 0 views 0 installs 0 upvotes | 1 views 0 installs 0 upvotes |
| Tools | 5 | 14 |
| Full listing | View Copilot Studio | View Relay |
discover_resourcesDiscover connector operations and schemas, existing connections, dependent parameter values, and attachable resources.get_consumptionRead historical agent or workflow credit consumption, or current environment credit capacity.manage_agentsManage agent inventory, complete draft authoring, lifecycle, published-agent sharing, saved-draft previews, and agent evaluation suites and runs.manage_workflowsManage workflow inventory, complete draft authoring, lifecycle, real tests, and run diagnostics.get_copilot_studio_skillsStart here for Copilot Studio guidance. Read the matching core skill before authoring, then read `schema.json`.search_modelsLists 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). Then call get_model with a name for its input schema.get_modelReturns one model's route, request_schema (what run_model's input must follow), request_example, pricing and availability. Then call run_model with an input shaped like request_example.get_pricingReturns Relay's public list prices (USD), optionally for one model, plus media_storage: the per-file fees of the store_output / upload retention SKUs (relay1d, relay7d, …). Then estimate_cost for a number.estimate_costEstimates the USD cost of a call from the public price list: 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.run_modelRuns 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.check_taskChecks 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.upload_fileHosts 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.list_workflowsList 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.run_workflowStart 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.check_workflow_runPoll 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.cancel_workflow_runCancel 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.get_creditsRead 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.Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
{
"mcpServers": {
"copilot-studio": {
"command": "npx",
"args": [
"-y",
"@microsoft/copilot-studio-mcp@latest"
]
}
}
}
{
"mcpServers": {
"relay-4": {
"command": "npx",
"args": [
"-y",
"@relaygpu/mcp"
],
"env": {
"RELAY_API_KEY": "YOUR_RELAY_API_KEY_HERE",
"RELAY_BASE_URL": "YOUR_RELAY_BASE_URL_HERE"
}
}
}
}