Documentation

Everything you need to take an MCP server from your laptop to a production endpoint.

Quickstart

Four commands. The adapter ships inside the CLI, so your project needs nothing from the platform.

$_terminal
npm i -g runscalerunscale init my-server          # writes mcp.toml + src/index.tsexport RUNSCALE_API_KEY=<key>    # dashboard → API Keysrunscale deploy                  # bundle, upload, provision, health, release

The deploy streams every stage and ends with your live endpoint. Any MCP client that speaks Streamable HTTP can call it with a bearer token.

CLI reference

Every command reads mcp.toml from the current directory.

runscale init <name>
Scaffold mcp.toml and an example entrypoint. Already have a server? Point entrypoint at it.
runscale deploy
Build, upload and release. Streams the pipeline; ends with the live URL.
runscale deploy --preview
Provision and health-check, but hold traffic. A public preview URL is printed.
runscale deploy --open
Open the build page in the dashboard.
runscale promote [id]
Release a --preview deployment to production (atomic traffic flip).
runscale logs -m <minutes>
Runtime logs of this server, read in its region.
runscale secrets set NAME
Write a secret (value from stdin or --value). Never readable again.
runscale secrets list
Names, versions and last use. Values are never shown.
runscale secrets rm NAME
Delete a secret. Deploys that require it fail before building.

mcp.toml reference

The manifest is validated on your laptop before anything is uploaded.

TOMLmcp.toml
[server]name = "my-server"            # lowercase kebab-case, 3-40 charsruntime = "typescript"entrypoint = "src/index.ts"transport = "streamable-http" [deploy]tier = "sovereign"            # pinned to ONE region, chosen onceregion = "mx"                 # mx = Querétaro · us = N. Virginia [deploy.resources]memory_gb = 0.5               # 0.125 – 10min_instances = 0             # 0 = scale to zeromax_instances = 3             # concurrency cap = cost ceiling [secrets]required = ["API_KEY"]        # deploy fails early if any is missing [network]egress = "none"               # none | vpn | tunnel [[triggers.crons]]            # up to 5, UTCschedule = "0 */3 * * *"tool = "sync"arguments = { full = false }

Tier and region are immutable per server: changing them means creating a server with another name. That immutability is what makes the residency claim auditable.

The adapter

Three lines wrap the official SDK. Nothing else in your server changes.

TSsrc/index.ts
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'import { createMcpLambdaHandler } from 'runscale/adapter' function createServer() {  const server = new McpServer({ name: 'my-server', version: '1.0.0' })  server.tool('hello', async () => ({    content: [{ type: 'text', text: 'hello' }],  }))  return server} export const handler = createMcpLambdaHandler({ createServer })

The adapter handles transport, TLS termination and bearer authentication — and it fails closed: a request without a valid token never reaches your code. Secrets arrive as environment variables before the first request.

Regions

Pick the region once, per server. Everything about that server stays there.

mx · mx-central-1
Querétaro, Mexico. Data residency for CNSF, banking and health workloads. Endpoint shape: https://<id>.execute-api.mx-central-1.amazonaws.com/mcp/
us · us-east-1
N. Virginia. Closest to the model hosts, cheaper compute, no residency claim. Endpoint shape: https://<id>.execute-api.us-east-1.amazonaws.com/

Logs, secrets and metrics are read from the server's own region. The control plane and your organisation's metadata live in mx-central-1.

Secrets & access tokens

Two different credentials, on purpose.

Secrets (vault)
Values your server needs at runtime. Write-only: encrypted per organisation, never read back — not through the API, not by an owner. Rotating a secret propagates without a redeploy.
Access tokens
Credentials a client presents to call ONE server. Shown exactly once, revocable, and dead the moment you revoke them.
API keys
Credentials for the CLI and the REST API. Deploy keys can ship code; they can never destroy infrastructure.

Connecting a client

Any Streamable HTTP client works. For Claude Code, Cursor and similar tools:

{}.mcp.json
{  "mcpServers": {    "my-server": {      "type": "http",      "url": "https://<id>.execute-api.mx-central-1.amazonaws.com/mcp/",      "headers": { "Authorization": "Bearer <access token>" }    }  }}

Create the access token in the dashboard (server → Access tokens) or via the API. Keep it out of the repo.

Logs, metrics & audit

What the dashboard shows and where it comes from.

Runtime logs
Live tail and time windows, parsed per request: duration, memory, cold starts and your own console output. Read in-region.
Metrics
Invocations, errors, p50/p95 and cold starts per server, straight from the engine's telemetry.
Audit log
Append-only record of every action in the organisation, including refused attempts. Kept for 400 days.

Scheduled tool calls

Declare crons in mcp.toml and the platform invokes the tool on schedule (UTC), authenticated with a dedicated token.

Up to five schedules per server. Each firing is a normal tools/call, visible in logs and metered like any request. Failures are recorded with the reason.