If you have a FastAPI app and need to expose it to an LLM over the Model Context Protocol, you have two Python libraries with confusingly similar names. FastMCP is the actively maintained, decorator-first framework for building MCP servers from scratch, including a from_fastapi() converter; fastapi_mcp is a narrower FastAPI-to-MCP mount tool that has not shipped a release since July 2025 (Source: fastapi_mcp releases). For a new project or anything you plan to maintain past this quarter, FastMCP is the safer default. Keep reading for the maintenance data, an OAuth 2.1 comparison, and a first-hand test of both conversion paths.
Key takeaways
- Maintenance: FastMCP shipped v3.4.3 in early July 2026 across 105+ tagged releases; fastapi_mcp's last release is v0.4.0 from July 28, 2025 (Source: fastapi_mcp releases).
- Model: FastMCP is a full framework (servers, clients, and interactive apps); fastapi_mcp is a single-purpose converter that mounts MCP onto an existing FastAPI app.
- Auth: FastMCP ships an
OAuthProxywith full OAuth 2.1 and PKCE support; fastapi_mcp added baseline OAuth 2.1 support in v0.3.1 and has not extended it since. - Conversion: both libraries can turn a FastAPI app into an MCP server, but the docs for both recommend it mainly for prototyping, not production.
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 (Source: FastMCP repo). fastapi_mcp (imported as fastapi_mcp, published to PyPI as fastapi-mcp) is a separate, smaller project from Tadata Inc. that mounts an MCP server directly onto an existing FastAPI app, converting routes into tools with FastAPI's own dependency injection carried through (Source: fastapi-mcp on PyPI).
The name collision is the whole reason this comparison exists. Google autocomplete surfaces "fastmcp vs fastapi mcp" and "fastapi-mcp vs fastmcp" as real, repeated queries. Inference: the confusion is common enough among developers wiring up an existing FastAPI app that it is worth a dedicated, maintenance-aware comparison rather than folding it into either project's own docs.
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 | v3.4.5 (as of August 2026) | v0.4.0 (Jul 28, 2025, 370+ days with no release) |
| Release cadence | 105+ tagged releases, weekly-ish cadence | 10 releases total, none since Jul 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'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 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 (Source: fastapi_mcp releases). A library that stalls right after adding transport-layer support is a real risk if you are betting a production integration on it.
Operator note (first-hand): re-measured on a clean uv venv, uv pip install fastmcp resolves fastmcp==3.4.5 today, up from 3.4.3 a month earlier. fastapi-mcp has not moved: still 0.4.0, and PyPI's own upload timestamp puts that release 370 days ago as of this check.
How each library converts a FastAPI app
FastMCP's converter is a single classmethod:
from fastmcp import FastMCP mcp = FastMCP.from_fastapi(app=app)
from_fastapi() reads the app's OpenAPI schema and generates one MCP tool per route (Source: FastMCP docs). fastapi_mcp works the other direction: instead of a converter, you mount an FastApiMCP instance onto your existing app object, which then exposes your routes as MCP tools while keeping your app's own dependency injection intact (Source: fastapi-mcp on PyPI).
Operator note (first-hand): I tested FastMCP.from_fastapi() against a two-line FastAPI app with a single GET /items/{item_id} route. The call succeeded and await mcp.list_tools() returned one tool named read_item_items, derived from the route's function name and path. Note the method is list_tools(), not get_tools(); the latter raises AttributeError on v3.4.3, so don't trust older snippets that reference it.
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" (Source: FastMCP docs). 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 | 19 dedicated provider modules, including GitHubProvider, GoogleProvider, AzureProvider, AWSProvider, Auth0Provider, DiscordProvider, WorkOSProvider | 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 exists specifically to bridge traditional OAuth providers, which mostly do not support MCP's dynamic client registration flow, into something MCP clients can use (Source: FastMCP docs). fastapi_mcp's approach leans on whatever auth you already wired into your FastAPI dependencies, which is simpler if your app already has working auth, but it has not evolved since April 2025.
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 and timeout handling around it. fastapi_mcp added "Streamable HTTP Transport Support" and stateful session management in v0.4.0 and simultaneously deprecated its old mount() method (Source: fastapi_mcp releases). That release is also the last one; anyone hitting a transport bug in fastapi_mcp today is on their own.
If you are choosing an MCP implementation for an existing FastAPI service, compare the API conversion path with the protocol's job. Our MCP vs RAG test shows where MCP tools fit when the agent needs current structured state rather than document recall.
Which should you pick
Decision rule: 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 in a year. 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 (Source: FastMCP docs).
FAQ
Are FastMCP and FastAPI the same?
No. FastAPI is a general-purpose Python web framework for building HTTP APIs; FastMCP is a standalone framework for building MCP servers, clients, and apps, and it does not require FastAPI. FastMCP offers FastMCP.from_fastapi() as an optional converter for teams that already have a FastAPI app, but the two projects are unrelated.
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.
Is fastapi_mcp still maintained?
Its most recent release is v0.4.0 from July 28, 2025, over a year old as of mid-2026. The repository still shows open issues and pull requests, but no tagged release has followed, which is the practical definition of a stalled project for anything you plan to run in production.
Can I use OAuth 2.1 with FastMCP?
Yes. FastMCP ships an OAuthProxy with full OAuth 2.1 and PKCE support, introduced in v2.12.0, with built-in providers for GitHub, Google, and Azure and documented compatibility with several other identity providers.
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.
A plain install of fastapi-mcp is broken today
Every figure below comes from one script that builds both venvs from scratch and is re-runnable: fastmcp-vs-fastapi-mcp benchmark.
Operator note (first-hand): uv pip install fastapi-mcp fastapi in a clean venv, then FastApiMCP(app) on a one-route FastAPI app, raises TypeError: Server.__init__() takes 2 positional arguments but 3 were given. The cause is a version collision: fastapi-mcp declares mcp>=1.12.0 with no upper bound, so a fresh install today pulls mcp==2.0.0, the release covered in our FastMCP vs MCP Python SDK piece that rewrote the SDK's server internals. fastapi-mcp hasn't shipped since July 2025, so it was never tested against that rewrite.
Operator note (first-hand): the fix is a manual downgrade: uv pip install "mcp<2" after installing fastapi-mcp resolves mcp==1.29.0, and the same conversion call then succeeds, mounting /mcp on the FastAPI app. It also prints mount() is deprecated and will be removed in a future version. Use mount_http() for HTTP transport (recommended) or mount_sse() for SSE transport instead on every call, a warning from a library with no maintainer left to act on it.
| Finding | fastmcp | fastapi_mcp |
|---|---|---|
| Fresh install works out of the box | yes | no (TypeError on construction) |
| Works after pinning mcp<2 | n/a | yes |
| Days since last release | actively shipping | 370 |
| Dedicated OAuth provider modules | 19 | 0 (relies on FastAPI's own auth dependencies) |
If you're evaluating fastapi_mcp today: pin mcp<2 in your requirements before you install it, or the constructor fails immediately. No amount of correct application code works around a dependency that resolves broken.
Related coverage
- FastMCP vs MCP Python SDK: Which to Use in 2026
- How to Test a FastMCP Server with Pytest once you have picked FastMCP and need a test suite.
- FastMCP from OpenAPI: Build an MCP Server from Your Existing API
- FastMCP OAuth Token Validation: Server-Side Patterns and Pitfalls
- MCP OAuth 2.1: Implement Auth Without Dynamic Client Registration
References
- fastapi-mcp on PyPI - https://pypi.org/project/fastapi-mcp/
- fastapi_mcp releases - https://github.com/tadata-org/fastapi_mcp/releases
- FastMCP docs - https://gofastmcp.com
- FastMCP repo - https://github.com/jlowin/fastmcp




