Everything you need to take an MCP server from your laptop to a production endpoint.
Four commands. The adapter ships inside the CLI, so your project needs nothing from the platform.
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, releaseThe deploy streams every stage and ends with your live endpoint. Any MCP client that speaks Streamable HTTP can call it with a bearer token.
Every command reads mcp.toml from the current directory.
The manifest is validated on your laptop before anything is uploaded.
[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.
Three lines wrap the official SDK. Nothing else in your server changes.
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.
Pick the region once, per server. Everything about that server stays there.
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.
Two different credentials, on purpose.
Any Streamable HTTP client works. For Claude Code, Cursor and similar tools:
{ "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.
What the dashboard shows and where it comes from.
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.