createmcps.com

Guide

How to generate an MCP server

Last verified: 10 August 2026 · spec 2026-07-28 · ruleset 1.4.2

The generator asks five questions and hands back a working 2026-07-28 server. This is what each answer changes, why several options are deliberately disabled, and what is inside the project you get.

What you get

A complete project, not a snippet. The protocol layer is finished — required headers, error codes, caching metadata, statelessness, discovery — so the only code left to write is the body of each tool.

A TypeScript project, streamable HTTP, Node target
src/mcp.ts          the protocol — headers, errors, caching, discovery
src/tools.ts        YOUR CODE GOES HERE
src/server.ts       node:http adapter
src/server.test.ts  a test per tool, plus protocol conformance
server.json         ready for registry publishing
package.json
tsconfig.json
README.md

Pick Cloudflare Workers and you get worker.ts and wrangler.toml instead of the node adapter; pick Vercel and you get vercel.json. Choose stdio and you get stdio.ts, which is byte-identical in behaviour to the HTTP path — the same handler behind a different transport.

The generated server is graded, not vouched for:

Every enabled combination is generated, compiled, booted on a real socket and run through the same validator the website uses. Not a unit test importing the handler — a real server answering real protocol requests. The script that does it is in the repository, so you can re-derive the claim instead of trusting it.

1. Name it

The project name becomes the folder, the package name and part of the registry identifier. The namespace is the reverse-DNS prefix that proves who published it — io.github.yourname if you will authenticate with GitHub, or your own domain if you will verify it over DNS.

It is worth getting right now: the namespace is what the registry checks you own, and changing it later means republishing under a different identifier.

2. Choose a language — and see why the frameworks are greyed out

TypeScript and Python both produce a conformant server. TypeScript has the wider host support; Python runs on the standard library alone, with nothing to install before it starts.

The framework row is the part that surprises people. No framework is the only enabled choice, and the other three are shown disabled with the reason rather than hidden:

  • Official SDK, FastMCP, xmcp — every TypeScript option here is built on @modelcontextprotocol/sdk, whose supported-version list stops at 2025-11-25. A server built on it cannot answer a 2026-07-28 client, and no application code changes that.
  • The Python SDK does ship the 2026-07-28 surface — but scored three MUST-level failures when we graded it, so it does not meet the bar this generator sets for itself.

Both halves were measured, and the check is re-runnable: if a framework ships support, the tripwire in the repository reports it and the option can be enabled. See the framework comparison for the full measurement.

3. Transport, authorization and host

Streamable HTTP is a server clients connect to over the network. stdio is a local program a client launches as a subprocess — the right choice for something that touches the user's own machine, and it requires the Node target.

Authorization has three levels. None is right for a server exposing nothing sensitive. API key adds a bearer token and a 401 challenge. OAuth 2.1 emits RFC 9728 protected-resource metadata and JWT verification with audience binding — the resource-server half of the OAuth guide.

The host only changes the entry point and its config file. The protocol layer is identical across all three, so switching later means swapping one file rather than rewriting the server.

4. Define your tools

Each tool needs a name, a description and its parameters. Two things are worth knowing because they are validated rather than silently accepted:

  • Parameter names become code. They are destructured into a binding, so a kebab-case name would produce a project that does not compile. The form rejects those, along with reserved words and a handful of names that would shadow something.
  • The description is what a model reads when deciding whether to call your tool. It is the highest-leverage text in the whole project — “Get the forecast for a city” beats “weather tool” by a wide margin.

5. Take it away

Three outputs, and they suit different moments:

  • Download .zip — the project on your machine, nothing sent anywhere.
  • Open in StackBlitz — running in the browser in a few seconds, with no local toolchain. TypeScript only: the sandbox is a Node runtime and cannot run Python.
  • Push to GitHub — creates a new public repository. Signing in asks for no permissions; repository access is requested only when you click this, and the token is used once and never stored.

With the Cloudflare Workers target, pushing to GitHub also offers a one-click deploy — you authenticate with Cloudflare directly and we never hold a credential.

What to do next

Write your tool bodies in src/tools.ts, run the generated tests, deploy, and then check the deployed URL:

Confirm the deployed server is still conformant
npx createmcps validate https://your-server.example.com/mcp

The generated project is conformant when it leaves here, but a proxy, gateway or platform can change headers on the way out — so the server that matters is the deployed one. How to read the report.

When you are ready to make it discoverable, publish it to the official registry — the server.json in your project is already shaped for it.

FAQ

Frequently asked

Does the generated MCP server actually pass the validator?

That is the design constraint, and it is measured rather than asserted. Every enabled combination is generated, compiled, booted on a real socket and graded by the same validator that runs on the website — not by a unit test that imports the handler directly. The verification script is in the repository, so the claim can be re-derived rather than taken on trust.

Why are FastMCP, xmcp and the official SDK disabled?

Because they cannot serve a 2026-07-28 client today. Every TypeScript framework in that list is built on @modelcontextprotocol/sdk, whose supported-version list stops at 2025-11-25, so the limit is inherited and no amount of application code moves it. The Python SDK does ship the 2026-07-28 surface but scored three MUST-level failures when we graded it. The options are shown disabled with the reason rather than hidden, because someone who came looking for FastMCP needs to know why it is not there.

What do I get when I generate a server?

A complete project: the protocol layer, a tools module where your code goes, a test file, a README, a server.json ready for registry publishing, and the config for whichever host you picked — vercel.json, wrangler.toml or a Dockerfile. You can download it as a zip, open it running in StackBlitz, or push it straight to a new GitHub repository.

Is the generated code produced by an AI model?

No. It is template-based and deterministic — the same options always produce byte-identical output. That matters for the compliance claim: the artefact we graded is exactly the artefact you receive, which would not be true of anything generated by a model at request time.

What do I have to write myself?

Only what your tools actually do. The protocol layer is finished — required headers, error codes, caching metadata, statelessness, the discovery method — so the code left to write is the body of each tool you defined.

Generate one now

Five questions, no account, and a project that passes all 79 rules before you have written a line.

Open the generator →