MCP server
Give Claude Code, Cursor, Claude Desktop, Codex or any MCP client the ability to deploy, configure and debug apps on Skiffly — hosted with OAuth, or locally through the CLI.
The Skiffly MCP server exposes 37+ tools over the Model Context Protocol: projects, services, variables, deployments, logs, domains, volumes, billing, a Railway importer and docs search. Tool names mirror the Railway MCP server where the concepts match, so an agent that knows Railway finds its way around.
There are two ways to run it:
Hosted (mcp.skiffly.dev) | Local (skiffly mcp) | |
|---|---|---|
| Transport | Streamable HTTP | stdio |
| Sign-in | OAuth 2.1 in the browser (or a bearer token) | the CLI's skiffly login |
| Install | nothing to install | Node.js 20+ and the skiffly CLI |
| Best for | Claude Code, Cursor, Claude Desktop, web clients | offline docs, CI, clients without remote MCP support |
Hosted server (recommended)#
The endpoint is https://mcp.skiffly.dev/mcp. It implements the MCP authorization spec — OAuth 2.1 with PKCE, dynamic client registration and discovery under /.well-known/oauth-authorization-server — so a client that supports remote MCP servers signs you in through the browser. No tokens to copy.
claude mcp add --transport http skiffly https://mcp.skiffly.dev/mcpThen run /mcp inside Claude Code and pick skiffly → Authenticate. The browser opens the Skiffly dashboard; sign in with GitHub if needed, review the permissions and click Allow. Claude Code stores the tokens and refreshes them by itself.
What the consent screen grants#
The client asks for read (view projects, services, deployments, logs, variables) and usually write (deploy, change variables and settings, add domains and volumes). Allowing issues a 1-hour access token plus a refresh token that the client rotates on its own; both act as you across all your workspaces. Requests are rate-limited per token by the plan of the workspace, exactly like the GraphQL API.
Revoking access#
Settings → Developer → CLI sessions & connected apps lists every connected MCP client (by its registered name, e.g. Claude Code) and every CLI session. Revoke cuts the access immediately, including the refresh token; the client asks you to connect again next time. Removing the server from the client's config does not revoke anything on the Skiffly side.
Local server (skiffly mcp)#
The CLI embeds the same server and runs it over stdio with the login from skiffly login, so the agent never sees a token:
npm i -g skiffly && skiffly login
claude mcp add skiffly -s user -- skiffly mcp # or: skiffly mcp install claudeskiffly mcp install claude also drops a skiffly skill into ~/.claude/skills/ that teaches the agent the deploy workflow.
What to ask#
Deploy this repo to Skiffly and give me the URL.
Add Postgres with a 20 GB volume and wire DATABASE_URL into the api service.
The last deploy of
webfailed, find out why and fix it.
Import my Railway project "acme-shop" into Skiffly and tell me what I still have to do by hand.
The agent typically calls whoami → list-projects → create-deployment → get-status → get-logs → generate-domain. Destructive tools (delete-*, scaling to zero) are annotated so the model asks first.
Tools by area#
| Area | Tools |
|---|---|
| Account | whoami, list-workspaces, billing-account, topup-create, github-installations, list-nodes |
| Projects | list-projects, create-project, delete-project, list-environments, create-environment, describe-environment, get-status |
| Services | list-services, create-service, create-deployment, describe-service, get-service-config, update-service, delete-service |
| Variables | list-variables, set-variables, delete-variables |
| Deployments | deploy, redeploy, restart-service, list-deployments, cancel-deployment, get-logs |
| Networking | generate-domain, list-domains, domain-status, delete-domain |
| Volumes | create-volume, list-volumes, delete-volume |
| Migration | import_from_railway — copies a Railway project (services, variables, volumes, domains, TCP proxies) into Skiffly, dryRun first; see Migrate from Railway |
| Docs | search-docs |
Arguments and return values for each tool are in the MCP tools reference. skiffly mcp tools prints the same list locally.
Environment (local server)#
| Variable | Meaning |
|---|---|
SKIFFLY_TOKEN | API token (required for npx @skiffly/mcp; the CLI's skiffly mcp uses the saved login) |
SKIFFLY_API_URL | GraphQL endpoint, default https://api.skiffly.dev/graphql |
Good practice#
- Prefer the hosted server with OAuth: tokens never touch prompts, config files or the agent's context.
- Start a session with
whoami: it confirms the token and returns workspace ids. - Variable values are secrets:
list-variablesreturns names unless the agent asks for values. - Plan limits come back as
PLAN_LIMITerrors rather than retries; rate limits asRATE_LIMITED. - Revoke clients you no longer use from Settings → Developer.