FastMCP vs FastAPI-MCP is a framework-versus-adapter choice. FastMCP builds and composes MCP servers, clients, and integrations; FastAPI-MCP exposes an existing FastAPI application as MCP tools. Use FastMCP for a new MCP system, or FastAPI-MCP when your FastAPI routes remain the source of truth. Either way, treat auto-conversion as a prototype step and curate the tools you ship.

The maintenance gap between the two now shows up on a plain install. When I set up both in clean environments on October 3, 2026, FastMCP 4.0.10 converted a single-route FastAPI app into an MCP tool. A fresh FastAPI-MCP 0.4.0 install pulled in MCP SDK 2.3.0 and failed at construction with a TypeError until I pinned MCP to 1.30.0.

FastAPI vs FastMCP vs fastapi_mcp: what each one is

MCP (Model Context Protocol) is the open standard that lets an LLM call external tools and read external resources through a consistent interface. FastAPI is the widely used Python web framework for building typed HTTP APIs. FastMCP is a standalone framework, maintained by jlowin (a Prefect engineer), for building MCP servers, clients, and interactive apps in Python; it predates most of the ecosystem, and its 1.0 line was folded into the official MCP Python SDK. fastapi_mcp (imported as fastapi_mcp, published to PyPI as fastapi-mcp) is a separate, smaller project from Tadata Inc. According to its PyPI page, it mounts an MCP server directly onto an existing FastAPI app and converts routes into tools with FastAPI's own dependency injection carried through.

The names collide, and that is the whole reason this comparison exists. Google autocomplete suggests both "fastmcp vs fastapi mcp" and "fastapi-mcp vs fastmcp", which tells me plenty of developers wiring up an existing FastAPI app hit the same confusion and need a comparison that accounts for maintenance, not just features.

Maintenance status: one project is active, one is not

This is the fact that should decide most cases before you even compare features.

SignalFastMCPfastapi_mcp
Latest versionv4.0.10 (clean install, Oct 3, 2026)v0.4.0 (Jul 28, 2025)
Release cadence105+ tagged releases, weekly-ish cadence10 releases total, none in the 432 days since Jul 28, 2025
GitHub starsNot the headline metric (folded into MCP SDK)11.9k
Open issuesActively triaged90 open, 68 open PRs
GovernanceMaintained by jlowin; commercial "Prefect Horizon" hosting layerMaintained by Tadata Inc.; alpha dev status on PyPI

FastMCP is now on its 4.x line: a plain uv pip install fastmcp on October 3, 2026 resolved 4.0.10. FastAPI-MCP has not moved. PyPI still serves v0.4.0, uploaded on July 28, 2025, and the fastapi_mcp releases page lists it as the release that added Streamable HTTP and stateful session support. Check that page and FastMCP's updates page before pinning either package.

FastMCP's pace is not a vanity metric. It shipped Streamable HTTP transport improvements, OAuth proxy hardening, and app-level features across the 3.x line before starting the 4.x line, while fastapi_mcp's last shipped feature was also Streamable HTTP support, in the same v0.4.0 release that has not been followed up. A library that stalls right after adding transport-layer support is a real risk if you are betting a production integration on it.

That risk already has a cost. In my October 3 run, FastAPI-MCP 0.4.0 pulled in MCP SDK 2.3.0 and failed at construction with TypeError: Server.__init__() takes 2 positional arguments but 3 were given; pinning MCP to 1.30.0 restored the conversion. The package declares mcp>=1.12.0 with no upper bound, so a fresh install takes the newest 2.x SDK unless you pin mcp<2 yourself. The same install broke the same way when I first ran this check on August 2, so the failure is not a one-off. This is a dated compatibility result, not a claim about every later release.

If you are choosing between the official mcp package and standalone fastmcp, read FastMCP vs MCP Python SDK: Which to Use in 2026. This page is specifically about exposing an existing FastAPI app through MCP.

How each library converts a FastAPI app

FastMCP's converter is a single classmethod:

from fastmcp import FastMCP

mcp = FastMCP.from_fastapi(app=app)

According to the FastMCP docs, from_fastapi() reads the app's OpenAPI schema and generates one MCP tool per route. fastapi_mcp works the other direction: instead of a converter, you mount a FastApiMCP instance onto your existing app object, which then exposes your routes as MCP tools while keeping your app's own dependency injection intact.

FastMCP from_fastapi builds a separate server from OpenAPI; fastapi_mcp mounts MCP inside the existing app
Converter vs mount: where the MCP server runs (AgenticWire diagram)

In the same October 3 run, FastMCP 4.0.10 converted my single-route FastAPI app into one MCP tool. FastAPI-MCP, once pinned to MCP 1.30.0, also printed a deprecation warning for mount() in favor of mount_http() or mount_sse(). Those checks cover conversion and construction, not production authentication or runtime load.

Both projects' own docs caution against treating this as a production pattern. FastMCP's documentation is explicit: "LLMs achieve significantly better performance with well-designed and curated MCP servers than with auto-converted OpenAPI servers." Treat from_fastapi() and fastapi_mcp's mount pattern the same way: a fast way to get a demo running, not the shape you ship.

OAuth 2.1 and auth: the real difference

Both libraries support OAuth 2.1, but the depth is not close.

CapabilityFastMCPfastapi_mcp
OAuth 2.1 support addedv2.12.0 (OAuthProxy)v0.3.1
PKCEFull client-to-proxy and proxy-to-upstream PKCE by defaultFixed a default_scope bug in v0.3.7; no further auth releases since
Built-in providersGitHubProvider, GoogleProvider, AzureProvider, plus documented compatibility with AWS, Discord, Facebook, Auth0, Okta, WorkOSRelies on FastAPI's own dependency-injected auth, not a dedicated provider layer
Dynamic client metadata (CIMD)Added in v3.0.0Not documented

FastMCP's OAuthProxy bridges traditional OAuth providers that do not support MCP dynamic client registration into a flow MCP clients can use. fastapi_mcp leans on FastAPI dependencies instead, which is simpler when the existing app already owns authentication. Its release page lists OAuth support in v0.3.1 and Streamable HTTP in v0.4.0, so check the current release before assuming feature parity.

Streamable HTTP: both added it, only one kept building on it

Streamable HTTP replaced the older SSE transport as MCP's recommended way to run a server over plain HTTP. FastMCP has supported it since early in the 3.x line and continues to ship fixes around transport and auth. fastapi_mcp added Streamable HTTP and stateful session management in v0.4.0, while deprecating its old mount() method. Pin the version and test transport, auth, and session behavior before production.

To confirm a converted FastAPI app really serves its tools over Streamable HTTP, connect it to the MCP Inspector in CLI mode and call one tool before adding a client.

Which should you pick

If you are starting a new MCP server, pick FastMCP. It is actively maintained, has a broader feature surface (clients and interactive apps beyond just servers), and its OAuth layer is the more complete option if you need real authentication in front of your tools.

Pick fastapi_mcp only if you already have a working FastAPI app, want the absolute minimum code to expose it as MCP tools, and can tolerate a project that has not shipped a release in 432 days. Even then, budget time to fork or vendor it if you hit a bug the maintainers no longer triage. If your FastAPI app is the source of truth and you want the more maintained path, FastMCP.from_fastapi() gives you the same starting point with an actively developed project behind it.

Neither converter replaces hand-writing MCP tools for anything you plan to keep. Use the conversion path to get a demo in front of a client fast, then rebuild the tools you actually rely on directly in FastMCP once you know which ones matter, which is the approach FastMCP's own docs recommend.

FastAPI versus FastMCP: a three-way architecture decision

Comparing FastAPI with FastMCP mixes different layers. FastAPI exposes a conventional web API; FastMCP implements an MCP server; FastAPI-MCP adapts FastAPI routes into MCP tools. If the existing API is the source of truth, compare FastMCP's FastAPI integration with the FastAPI-MCP repository on route discovery, auth propagation, schema conversion, and maintenance status. If there is no existing web API, a direct FastMCP server may be simpler. Either way, test one authenticated endpoint with a nested request body and a failing response before converting an entire service.

How I tested this

The install and conversion results come from one script, re-run on October 3, 2026 on an Apple M1 (arm64) with macOS 26.3 and Python 3.13.5. It builds two fresh uv venvs, installs fastmcp with fastapi in one and fastapi-mcp with fastapi in the other, and records the resolved versions, the MCP SDK version that FastAPI-MCP pulls in, and the age of FastAPI-MCP's last PyPI upload. It then builds a single-route FastAPI app, mounts FastAPI-MCP on it, pins MCP below 2 and tries again, and converts the same app with FastMCP.from_fastapi() and lists the resulting tools.

I did not test production authentication, runtime load, or a live client session, and the feature and maintenance rows in the tables come from each project's docs and release pages, not from my runs. Check the run date before applying the results to a later release. The raw test record has every measurement, and the harness script is in the same folder.

FAQ

Is FastMCP based on FastAPI?

No. FastMCP is a standalone MCP framework and does not require FastAPI. It can convert an existing FastAPI application through FastMCP.from_fastapi(), which reads the app's OpenAPI schema, but that integration does not make FastMCP a FastAPI extension. Use it when the FastAPI app remains the source of truth.

Does FastAPI support MCP directly?

Not natively. FastAPI has no built-in MCP support. You need either FastMCP's from_fastapi() converter or the separate fastapi_mcp package to expose FastAPI routes as MCP tools; both work by reading the app's OpenAPI schema or mounting alongside it.

Why use MCP instead of OpenAPI directly?

MCP standardizes how an LLM discovers and calls tools across any server, while OpenAPI only describes an HTTP API for humans and codegen tools. Both FastMCP and fastapi_mcp can convert an OpenAPI-described FastAPI app into MCP tools, but their own docs recommend hand-curated MCP tools for anything beyond a prototype.

References