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.
| Signal | FastMCP | fastapi_mcp |
|---|---|---|
| Latest version | v4.0.10 (clean install, Oct 3, 2026) | v0.4.0 (Jul 28, 2025) |
| Release cadence | 105+ tagged releases, weekly-ish cadence | 10 releases total, none in the 432 days since Jul 28, 2025 |
| GitHub stars | Not the headline metric (folded into MCP SDK) | 11.9k |
| Open issues | Actively triaged | 90 open, 68 open PRs |
| Governance | Maintained by jlowin; commercial "Prefect Horizon" hosting layer | Maintained 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.

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.
| Capability | FastMCP | fastapi_mcp |
|---|---|---|
| OAuth 2.1 support added | v2.12.0 (OAuthProxy) | v0.3.1 |
| PKCE | Full client-to-proxy and proxy-to-upstream PKCE by default | Fixed a default_scope bug in v0.3.7; no further auth releases since |
| Built-in providers | GitHubProvider, GoogleProvider, AzureProvider, plus documented compatibility with AWS, Discord, Facebook, Auth0, Okta, WorkOS | Relies on FastAPI's own dependency-injected auth, not a dedicated provider layer |
| Dynamic client metadata (CIMD) | Added in v3.0.0 | Not 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.
Related coverage
- FastMCP vs MCP Python SDK: Which to Use in 2026
- MCP vs RAG: Differences, Use Cases, and a 12-Query Test, on where MCP tools fit when the agent needs current structured state rather than document recall
- MCP Inspector: How to Use It, CLI Mode and Fixes (v2 Tested)
References
- fastapi-mcp on PyPI - https://pypi.org/project/fastapi-mcp/
- FastAPI-MCP repository - https://github.com/tadata-org/fastapi_mcp
- fastapi_mcp releases - https://github.com/tadata-org/fastapi_mcp/releases
- FastMCP docs - https://gofastmcp.com
- FastMCP FastAPI integration - https://gofastmcp.com/integrations/fastapi
- FastMCP repo - https://github.com/jlowin/fastmcp
- FastMCP updates - https://gofastmcp.com/updates

