A Python function can become an MCP tool
FastMCP wraps an ordinary typed Python function and derives its tool schema, validation, and documentation. The same project includes clients for local or remote servers and interactive apps that can render interfaces inside a conversation. Tools, resources, and prompts are the server building blocks. This is useful when a team wants application-level conventions around MCP rather than assembling protocol messages, transports, and lifecycle handling directly from lower-level pieces.
The checked-out code is substantial. At commit 258554d, our sandbox saw 1,554 files, about 237,504 source lines, and a 59.3 MB checkout. The repository contains a tests directory and 20 CI workflow files, with no Dockerfile. That size reflects more than the decorator shown in the quick example: server transports, client behavior, authentication providers, OpenAPI conversion, apps, and compatibility code all live behind the small public surface.
Servers, clients, and apps share one framework
The server API exposes Python functions as tools and supports resources and prompts. The client side connects to local processes or remote URLs while handling transport negotiation and protocol lifecycle. Apps add interactive interfaces to tool results. Prefect also maintains a separate TypeScript counterpart, but this repository is the Python implementation. For teams using both ends of an MCP connection, shared concepts can reduce glue code and make integration tests easier to read.
The core dependency result was modest for the repository's scope. Our install added 95 packages in 46 seconds and occupied 89 MB. A local stdio tool may need no remote service at all. HTTP changes the job: operators need a reachable URL, TLS termination, authentication policy, and client-specific redirect behavior. FastMCP supplies provider and proxy components, yet credentials, issuer settings, scopes, and deployment secrets remain the application's responsibility.
What happened when we ran it
We ran commit 258554d in a fresh unprivileged Debian container with 3 CPUs, 8 GB of RAM, Python 3.12, and no secrets. Installation succeeded in 46 seconds. The build completed in 9 seconds. Pip-audit found 0 known vulnerabilities in the installed Python environment. We did not publish a remote server, complete an OAuth login, connect an MCP host, or render an interactive app.
Pytest stopped with exit code 4 after 9 seconds while loading tests/conftest.py. The import from opentelemetry.sdk.trace import TracerProvider raised ModuleNotFoundError: No module named 'opentelemetry.sdk'. The log did not reach a test total, and it does not identify why the package was absent. The finding is therefore precise: the dependencies present in our sandbox could build FastMCP, but they could not collect its repository suite as configured.
OAuth behavior needs concurrency and client tests
Authentication is where the quick tool example stops being representative. Release v3.4.7 fixed an OAuth proxy assertion audience mismatch for one deployment shape. Open issue 4901 reports another edge: concurrent refresh requests can rotate the same client token, leaving the later request with an invalid token and forcing a new login. Issue 4839 describes Microsoft Entra rejecting the resource and scopes generated when ChatGPT Remote MCP connected through AzureProvider. Each report names a specific configuration, so neither supports a claim that FastMCP OAuth is generally broken.
They do support a stricter acceptance plan than our 9-second build. Test login, expiry, refresh, concurrent tabs, retries, and the exact MCP host before production. Also run more than one server worker if that is the intended deployment. Authentication failures can sit outside tool logic, which means a perfectly valid Python function may never be reached. Pin FastMCP, document the provider metadata, and preserve request traces that omit secrets.
OpenAPI conversion still has type edges
FastMCP can turn an OpenAPI description into MCP tools, which is attractive for an existing service. Issue 4897 reports that non-string header values raise type errors and array path values are serialized as Python list representations, while similar query parameters work. That issue applies to specific parameter types and says the relevant code is shared with the v3.4.7 line. Teams converting a large API should test arrays, booleans, headers, paths, and error responses rather than sampling one string query.
GitHub recorded the last push on August 26, 2026, with 27,393 stars and 286 combined issues and pull requests. Release v3.4.7 landed on August 10. That is active maintenance, and the 20 workflow files show considerable automation in the repository. The 46-second install and 89 MB dependency footprint make evaluation easy. Adoption depends on whether FastMCP's abstractions save more code than its version migrations and authentication surface add for your particular server.

