TypeScript MCP frameworks compared
There are several ways to build an MCP server in TypeScript: the official SDK, which implements the protocol, and frameworks on top of it that decide how you declare tools, share code, sign users in, test and deploy. This page puts six of them side by side on the same criteria, says which fits which job, and links to a page for each that runs the same tool in both.
This site documents FrontMCP, so read it knowing who wrote it. Every fact about another library comes from that library's own documentation, repository, changelog or npm entry, checked on 2026-10-10 against the version named, and links to it. Every FrontMCP fact links to the page on this site that shows FrontMCP 1.9.4 doing it. Where a library's own sources don't mention something, the table says "not documented", which doesn't mean the library can't do it.
The libraries
| Library | npm | Made by | Built on | Checked |
|---|---|---|---|---|
| FrontMCP | @frontmcp/sdk | AgentFront | Official SDK v1 (1.29.0), with its own 2026-07-28 implementation | 1.9.4, published 2026-10-10 |
| Official MCP TypeScript SDK | @modelcontextprotocol/server, @modelcontextprotocol/client | The Model Context Protocol project | Its own core package | 2.3.1, published 2026-10-05 |
| FastMCP for TypeScript | fastmcp | Frank Fiegel (punkpeye) | Official SDK v1 | 4.22.4, published 2026-10-04 |
| mcp-framework | mcp-framework | Alex Andru (QuantGeekDev) | Official SDK v1 | 0.2.22, published 2026-04-16 |
| mcp-use | mcp-use | mcp-use, Inc. (Manufact) | Official SDK v2 | 2.8.2, published 2026-10-09 |
| xmcp | xmcp | basement.studio | Official SDK v2, bundled | 1.7.1, published 2026-10-09 |
FastMCP here is the TypeScript framework; the Python FastMCP is a different project, and Python libraries aren't compared on this page.
Compared on the same criteria
Each cell says what the library does and links to where its own sources say so.
| FrontMCP 1.9.4 | Official SDK 2.3.1 | FastMCP 4.22.4 | mcp-framework 0.2.22 | mcp-use 2.8.2 | xmcp 1.7.1 | |
|---|---|---|---|---|---|---|
| MCP revisions served | 2024-11-05 to 2026-07-28 (Error codes) | 2024-11-05 to 2026-07-28 through createMcpHandler() and serveStdio(); 2026-07-28 is opt-in (Protocol versions) | 2024-11-05 to 2025-11-25; the README says it doesn't support 2026-07-28 (README) | 2024-11-05 to 2025-11-25 (Introduction) | 2024-11-05 to 2026-07-28 (Server overview) | 2024-11-05 to 2026-07-28 (Transports) |
| Declaring a tool | A @Tool class, or the tool() function (@Tool) | server.registerTool() in a factory function (Tools) | server.addTool({ … }) (Tools) | A class extending MCPTool, one per file, found in a folder (Tools) | server.tool({ … }, handler) (Tools) | A file per tool, found in a folder (Tools) |
| Schema library | Zod 4 (Schemas Are Contracts) | Standard Schema: Zod 4, ArkType, Valibot; JSON Schema (Schema libraries) | Standard Schema: Zod, ArkType, Valibot; JSON Schema through an adapter (Tools) | Zod 3 (package.json) | Standard Schema: Zod 4, ArkType, Valibot (Server overview) | Zod (Tools) |
| Dependency injection or shared services | @Provider services, read with this.get() (@Provider) | Not documented; module-scope objects in the factory (HTTP) | Not documented; a per-call context with the session (Sessions) | Not documented | Not documented; a request context and middleware (Middleware) | Not documented; a request context and middleware (Request context) |
| Authentication and authorization | Public, static keys, JWTs from your identity provider, or FrontMCP as the OAuth server, with its own sign-in page or an upstream provider's; per-entry rules (Auth modes, Authorities) | OAuth resource server with a verifier you write, and scope checks per tool; the authorization-server helpers are frozen in server-legacy (Authorization) | An authenticate() hook; an OAuth proxy with Google, GitHub and Azure presets; canAccess per tool (Authentication) | API key, JWT, and an OAuth resource server (Authentication) | OAuth resource server with eight provider presets; no authorization server or proxy (Authentication) | API key and JWT middleware; OAuth through plugins for Auth0, Clerk, WorkOS, Better Auth and others (Authentication) |
| Testing tools | @frontmcp/testing with MCP matchers, run by frontmcp test (Testing) | An in-process client against the HTTP handler (Testing) | InMemoryTransport, fastmcp dev and fastmcp inspect (Unit testing) | The MCP Inspector (Debugging) | A built-in inspector and a CLI client (CLI reference) | Not documented |
| Resources, prompts, completions, elicitation | All four (@Resource, @Prompt, completers, this.elicit) | All four (Completion, Elicitation) | All four (completion, Elicitation) | Resources, prompts, elicitation; completion only in the changelog (Elicitation) | All four (Prompts, Elicitation) | All four (Resources, Tools) |
| Agents, jobs or workflows | @Agent, @Job, @Workflow (@Agent, @Job, @Workflow) | Not documented | Not documented | Not documented; experimental MCP tasks (Advanced features) | A client-side agent in @mcp-use/agent (Agent); server-side not documented | Not documented |
| Widgets (MCP Apps UI) | A tool's ui option, for MCP Apps hosts and the OpenAI Apps SDK (Tool UI) | A separate official package, @modelcontextprotocol/ext-apps (ext-apps) | Not documented | MCPApp classes, with React scaffolding (MCP Apps) | React views bound to tools, with ChatGPT extensions (MCP Apps) | Tools written as React components or HTML (MCP Apps) |
| Transports | Streamable HTTP with or without sessions, the older HTTP+SSE, stdio, a Unix socket, in-memory (FrontMcpInstance) | Streamable HTTP, stdio; HTTP+SSE only in the deprecated server-legacy (Legacy clients) | Streamable HTTP with an SSE endpoint, a stateless mode, stdio (HTTP Streaming) | stdio; HTTP Stream, which the README calls experimental; SSE, deprecated (Transports) | Streamable HTTP, stateless; stdio isn't served (Migration) | Streamable HTTP, stateless; stdio (Transports) |
| Runtimes and deployment | Node 24+; builds for Node, Vercel, AWS Lambda, Cloudflare Workers and a browser module (Production build); a fetch handler (createFetchHandler()) | Node 20+, Bun, Deno, Cloudflare Workers; Express, Hono and Fastify adapters (Web-standard runtimes) | Node, Bun; Cloudflare Workers and Deno Deploy with EdgeFastMCP (Edge Runtime Support) | Node 18.19+; AWS Lambda, and Cloudflare Workers and Vercel Edge through handleRequest() (Serverless) | Node 22.22.2+; fetch and Node handlers, Next.js, Docker, Manufact hosting (Self-hosted) | Node 22+; Vercel, Cloudflare Workers; adapters for ten web frameworks (Vercel, Next.js) |
| CLI and scaffolding | frontmcp create, dev, build, test, inspector; an Nx plugin (CLI) | No project CLI; a v1-to-v2 codemod (Packages) | fastmcp dev, inspect, validate; no project generator (Running Your Server) | mcp create, mcp add, mcp build, mcp validate (README) | create-mcp-use-app; mcp-use dev, build, start, deploy (CLI reference) | create-xmcp-app; xmcp dev, build, create (Installation) |
| License | Apache-2.0 (LICENSE) | Apache-2.0 since 2.3.0; v1 is MIT (LICENSE) | MIT (LICENSE) | MIT (LICENSE) | MIT (LICENSE) | MIT (license) |
| Version checked, date | 1.9.4, 2026-10-10 | 2.3.1, 2026-10-10 | 4.22.4, 2026-10-10 | 0.2.22, 2026-10-10 | 2.8.2, 2026-10-10 | 1.7.1, 2026-10-10 |
Popularity and age
On 2026-10-10, from the GitHub API and npm's download counts for 2026-10-02 to 2026-10-08:
| GitHub stars | npm downloads that week | First published | |
|---|---|---|---|
| FrontMCP | 146 | 8,479 (@frontmcp/sdk) | 2025-11-05 |
| Official SDK | 13,543 | 10,051,078 (@modelcontextprotocol/server); 65,440,256 (v1, @modelcontextprotocol/sdk) | v1 2024-11-11; v2 2026-04-01 |
| FastMCP | 3,274 | 709,121 (fastmcp) | 2024-12-23 |
| mcp-framework | 930 | 51,963 (mcp-framework) | 2024-12-08 |
| mcp-use | 10,738 (with the Python SDK) | 36,443 (mcp-use) | 2025-04-20 |
| xmcp | 1,333 | 17,014 (xmcp) | 2025-05-17 |
FrontMCP is the youngest and the least used of the six.
Which one fits
- The official SDK when you want the reference implementation of the protocol and the fewest dependencies, when you're building a client, a host or a gateway, when MCP is one route in an Express, Hono or Fastify app, or when you run on Bun, Deno or Workers. It's also what every other library here builds on. You write the structure around it yourself: shared services, sign-in, tests and deployment.
- FastMCP when you want one file and no build step, any Standard Schema library, and OAuth presets for Google, GitHub or Azure, and your clients speak MCP 2025-11-25 or earlier.
- mcp-framework when you want a class per tool, discovered from a folder, generators for each kind of component and a build that checks every field is described, on Node 18 or later, for clients on 2025-11-25 or earlier. Its last release was in April 2026.
- xmcp when you like file-based routing, your server lives in a Next.js or other web app, or you deploy to Vercel and want no configuration.
- mcp-use when you're building an MCP App with React views for ChatGPT or Claude, want an inspector in the dev server, or also need a client and an agent from the same vendor, and stateless HTTP behind an identity provider suits you.
- FrontMCP when a server is growing past a few tools and you want it organised: apps, providers, hooks and plugins; when you want FrontMCP to be the OAuth server; when you want agents, background jobs or widgets in the same framework; when you need sessions and 2026-07-28 on one endpoint; or when you want tests and builds for several platforms included.
FrontMCP is the wrong choice when you can't run Node 24, when you want a schema library other than Zod, when you want the smallest dependency tree (126 packages from npm install @frontmcp/sdk, against 3 for the SDK's server), or when you need a general-purpose MCP client or agent, which the SDK and mcp-use provide.
Each comparison
FrontMCP vs the official MCP TypeScript SDK
What each one is, what FrontMCP uses from the SDK, when the SDK alone is the better choice, and what FrontMCP adds, with the same server in both.
FrontMCP vs FastMCP for TypeScript
punkpeye's FastMCP: one object for the whole server, Standard Schema, and MCP revisions up to 2025-11-25.
FrontMCP vs mcp-framework
A class per tool found in a folder, a CLI that generates components, and MCP revisions up to 2025-11-25.
FrontMCP vs mcp-use
A stateless server with React views, plus a client, an agent, an inspector and hosting from the same company.
FrontMCP vs xmcp
A file per tool, adapters for ten web frameworks, and Vercel deployment without configuration.
How this was checked
On 2026-10-10, for each library, we:
- Read its own sources: its documentation site, README, repository at the release tag, changelog and npm entry. Nothing came from third-party articles or comparisons. Where those sources don't mention a feature, the table says "not documented".
- Ran its hello world. We installed the current version in an empty project, with Node 24.18.1 and npm 11.16.0, followed its documented quickstart, made it serve one tool,
add, and called it with{ "a": 2, "b": 3 }. The code each page shows for that library is the code we ran. Where something didn't work as documented, the page says what happened. - Asked the running server which MCP revisions it serves. A small client sent
initializewith each of 2024-11-05, 2025-03-26, 2025-06-18 and 2025-11-25 and calledaddon the session, then sent the 2026-07-28 requests, which have noinitialize:server/discoverandtools/call, with theMCP-Protocol-Version: 2026-07-28header and the revision in_meta. We ran it against FrontMCP 1.9.4 in Node too, which answered all five. - Counted popularity from the GitHub API and npm's download API, on the same day.
FrontMCP's side of each comparison is a Playground: the same add tool, with tests that this site runs on every build. There are no performance numbers on these pages; measuring them fairly needs a harness of its own.