Migrate off Stainless to an MCP server you own
Stainless was acquired by Anthropic (~May 2026) and its hosted MCP generator is winding down. If you have an MCP server generated/hosted by Stainless, this guide moves you to an mcpmake server you fully own: editable code you can run anywhere, kept in sync with your spec by CI, with self-hosting and your existing inputs preserved.
What you keep and gain
| Stainless (hosted generator) | mcpmake | |
|---|---|---|
| Generated code | Managed for you | Yours — exported, editable, committed to your repo |
| Hosting | Their platform | Self-host (Docker), your VPS, or mcpmake Cloud |
| Input | OpenAPI spec | OpenAPI + HAR / Postman / live website / plain-English describe |
| Spec sync | Auto-regenerate on spec change | mcpmake ci init — same workflow, in your CI |
| Lock-in | Platform-managed | None — plain TypeScript (or Python) you control |
Migrate in five steps
1. Find your source of truth
Use the same OpenAPI spec Stainless generated from (often openapi.yaml /
openapi.json in your API repo, or your provider's published spec). No spec?
See No spec? below.
2. Generate a server you own
# HTTP server (for remote/hosted use); drop -t http for stdio/local
mcpmake from openapi ./openapi.yaml -o ./my-mcp-server -t http
The output is a complete, self-contained project: tools, auth wiring, schemas, tests, a Dockerfile, and a README. Commit it — it's yours to edit.
Large API (50+ operations)? Add
--dynamic-discoveryso the agent loads tool schemas on demand instead of paying upfront token cost for every tool.
3. Review and own it
Open my-mcp-server/. Each tool is a readable file under src/tools/; auth is
in src/auth.ts; the HTTP/transport entry is src/index.ts. Edit anything —
there's no hidden runtime.
cd my-mcp-server && npm install && npm run build && npm test
4. Keep it in sync with the spec (the Stainless habit)
mcpmake ci init ./openapi.yaml -o ./my-mcp-server
This writes .github/workflows/mcpmake.yaml, which on every spec change
regenerates the server, runs mcpmake verify, and fails CI if the committed
server has drifted from the spec — the auto-regenerate-on-spec-change
guarantee, now in your own repo.
5. Run it
- Self-host: the generated
Dockerfilebuilds a hardened, non-root, read-only-filesystem container. Set the bearer token your client sends asMCP_AUTH_TOKENand run it behind your reverse proxy. - mcpmake Cloud:
mcpmake deploy ./openapi.yaml(or use the dashboard) to build + host it with auth, metering, and quotas. - Connect: point Claude/Cursor at
https://<host>/mcpwithAuthorization: Bearer <token>.
No spec?
mcpmake doesn't require an OpenAPI spec — most APIs don't have one:
mcpmake from har ./session.har -o ./my-mcp-server # a browser/devtools recording
mcpmake from postman ./collection.json -o ./my-mcp-server # a Postman collection
mcpmake from website https://app.example.com -o ./my-mcp-server # a live site
mcpmake from describe "manage GitHub issues" -o ./my-mcp-server # plain English
FAQ
Do I have to change my clients? No — it still speaks MCP over the same
/mcp endpoint. Update the URL/token to point at your new server.
Is there a one-click importer? Yes:
mcpmake from stainless ./stainless.yml -o ./my-mcp-server
reads your Stainless config directly (the spec it references plus its knobs,
translated into x-mcp-* overlays), generates the owned project, and prints a
migration report. Pass --spec <file> if the config doesn't reference the
OpenAPI document. Manual alternative: point mcpmake at the same spec, generate,
commit, wire up ci init.
TypeScript or Python? Both — add --format python for a Python server.
Questions: support@mcpmake.dev