Guides · 2026-10-16

Best MCP Server Starter for TypeScript

The short answer

Start from a TypeScript server on the official MCP SDK that already has one tool, one resource, one prompt, and a test that talks to it over stdio. Add your own tool by copying that pattern. A blank file costs you a day on transport, schemas, and a client config before you have anything to call.

Tools, resources, and prompts

A tool is something the model can run, like saving a note or fetching a page. A resource is data the client can read, such as every note as JSON. A prompt is a template the client can fill, such as "summarize these notes." A starter that shows each one once is enough. The official SDK covers it.

Validate arguments and mark side effects

Treat tool arguments as untrusted. A zod schema (or the equivalent in the SDK you use) should reject a bad input before your function runs. Mark tools that change or delete data so the client can ask the user first. Return an error the model can see and recover from, instead of crashing the process.

Fetch pages without opening your network

If the server can fetch a URL, a prompt can point it at localhost, a cloud metadata address, or a private IP. A safe fetch allows only http and https, blocks local and private addresses, checks again after every redirect, and caps the body. Leave private fetches off unless you turn them on on purpose.

Test through a real client

Unit tests of a handler miss the protocol. Spawn the server over stdio, connect a client, and call the tool. That is the same path Claude Code and Cursor use. Also remember the stdio rule: logs go to stderr. Anything you write to stdout corrupts the protocol.

Connect it in one line

Build, then point the client at the absolute path of the built file. In Claude Code that is a single mcp add command. In Cursor it is an mcpServers entry in .cursor/mcp.json. Restart Claude Desktop after you edit its config. Ask the model to save a note and search for it before you add your own tools.

When a starter is the wrong base

stdio is the right transport for a server on your machine. A remote server needs HTTP and authentication in front of it, which a local starter will not include. If several clients write at once, replace a JSON file with a real database. The tool shape stays the same.

A starter that already has the pieces

The MCP Server Starter on ShipReadyAgents is that TypeScript project: note tools, a notes resource, a summarize prompt, an SSRF-safe fetch, and an end-to-end test over stdio. Swap the note store for your API and copy the registerTool pattern for each new tool.

Related

FAQ

What is an MCP server?

A Model Context Protocol server exposes tools, resources, and prompts that clients such as Claude Code, Cursor, and Claude Desktop can call. The model decides when to call a tool from its description.

Should I use stdio or HTTP?

Use stdio for a server that runs on your machine, which is how local clients launch it. Add HTTP and authentication only when the server has to be reachable on the network.

Can I write the same server in Python?

Yes. The shape transfers: one registration per tool, validated inputs, and a test through a real client. This starter is TypeScript because that is what the official SDK examples use most often.

Agent Drop: the weekly newsletter

One new agent template, one tool worth using, three links. Free, weekly.