NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #400 most downloaded on PyPI
The fast, Pythonic way to build MCP servers and clients.
Last release today
04 Oct 2026
Ships fairly regularly
a new release about every 1 weeks
Nearly every release is documented
notes for 58 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
2 years old
129 releases · first in 2024
One column per month.
This patch release fixes an HTTP transport timeout bug where connections were defaulting to 5 seconds instead of respecting MCP's 30-second default, c
This patch release fixes an HTTP transport timeout bug where connections were defaulting to 5 seconds instead of respecting MCP's 30-second default, causing premature timeouts for slower operations. Also includes OAuth token storage fixes, Redis key isolation for ACL compliance, and improved ContextVar propagation for ASGI-mounted servers. Plus, the CLI will now nudge you when updates are available (you're welcome, future you).
<!-- Release notes generated using configuration in .github/release.yml at release/2.x -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.14.2...v2.14.3
Add v3 breaking changes notice to README and docs by @jlowin in https://github.com/jlowin/fastmcp/pull/2713
FastMCP 2.14.2 brings a wave of community contributions safely into the 2.x line. A variety of important fixes backported from 3.0 work improve OpenAPI 3.1 compatibility, MCP spec compliance for output schemas and elicitation, and correct a subtle base_url fallback issue. The CLI now gently reminds you that FastMCP 3.0 is on the horizon.
<!-- Release notes generated using configuration in .github/release.yml at release/2.x -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.14.1...v2.14.2
Deprecate exclude_args in favor of Depends() by @jlowin in https://github.com/jlowin/fastmcp/pull/2621
FastMCP 2.14.1 adds support for sampling with tools (SEP-1577). This exciting new feature lets servers pass tools to ctx.sample(), enabling agentic workflows where the server borrows the client's LLM and controls tool execution automatically. Pass any callable as a tool and FastMCP handles the loop: calling the LLM, executing tools, and feeding results back until a final response is produced. For fine-grained control, ctx.sample_step() makes a single LLM call and returns a SampleStep, letting you inspect tool calls, add custom logic, or build your own execution loop. Structured output via result_type returns validated Pydantic models instead of raw text. This release also adds AnthropicSamplingHandler alongside the existing OpenAI handler (newly promoted out of the experimental module), so clients and servers can provide sampling capability across major providers with ease.
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.14.0...v2.14.1
…for several new spec features, and removes deprecated APIs accumulated across the 2.x series.
FastMCP 2.14 begins adopting the MCP 2025-11-25 specification, headlined by protocol-native background tasks that let long-running operations report progress without blocking clients. This release also graduates the OpenAPI parser to standard, adds first-class support for several new spec features, and removes deprecated APIs accumulated across the 2.x series.
Long-running operations (like tool calls) normally block MCP clients until they complete. The new MCP background task protocol (SEP-1686) lets clients start operations, track progress, and retrieve results without blocking. For FastMCP users, taking advantage of this new functionality is as easy as adding task=True to any async decorator. Under the hood, it's powered by Docket, the enterprise task scheduler at the heart of Prefect Cloud that handles millions of concurrent tasks every day.
from fastmcp import FastMCP
from fastmcp.dependencies import Progress
mcp = FastMCP("MyServer")
@mcp.tool(task=True)
async def train_model(dataset: str, progress: Progress = Progress()) -> str:
await progress.set_total(100)
for epoch in range(100):
# ... training work ...
await progress.increment()
return "Model trained successfully"
Clients that call this tool in task-augmented mode (for FastMCP clients, that merely means another task=True!) receive a task ID immediately, poll for progress updates, and fetch results when ready. Background tasks work out-of-the-box with an in-memory backend, and users can optionally provide a Redis URL for persistence, horizontal scaling, and single-digit millisecond task pickup latency. When using Redis, users can also add additional Docket workers to scale out their task processing.
Read the docs here!
The experimental OpenAPI parser graduates to standard. The new architecture delivers improved performance through single-pass schema processing and cleaner internal abstractions. Existing code works unchanged; users of the experimental module should update their imports.
This release begins adopting the MCP 2025-11-25 specification. Beyond the core SDK updates, FastMCP adds first-class developer experiences for:
AsyncKeyValue supportAs the MCP SDK continues to adopt more of the specification, FastMCP will add corresponding high-level APIs.
This release removes deprecated APIs accumulated across the 2.x series: BearerAuthProvider, Context.get_http_request(), the dependencies parameter, legacy resource prefix formats, and several deprecated methods. The upgrade guide provides migration paths for each.
<!-- Release notes generated using configuration in .github/release.yml at main -->
from fastmcp.settings import settings by @jlowin in https://github.com/jlowin/fastmcp/pull/2581Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.13.2...v2.14.0
MCP SDK 1.23 introduced some changes related to the 11/25/25 MCP protocol update that break some patches/workarounds that FastMCP had implemented prev
MCP SDK 1.23 introduced some changes related to the 11/25/25 MCP protocol update that break some patches/workarounds that FastMCP had implemented previously. In particular, OAuth changes in the new protocol changed some implementation details that FastMCP patched; as such 1.23 is not necessarily a breaking SDK change but it is "breaking" for certain FastMCP behaviors.
As a precaution, this release pins mcp<1.23. FastMCP 2.14 will introduce 11/25/25 support (and require mcp>=1.23).
FastMCP 2.13.2 polishes the authentication stack with fixes for token refresh, scope handling, and multi-instance deployments. Discord joins the growi
FastMCP 2.13.2 polishes the authentication stack with fixes for token refresh, scope handling, and multi-instance deployments. Discord joins the growing roster of built-in OAuth providers, Azure and Google token handling gets more reliable, and proxy classes now properly forward icons and titles. This release also adds CSP customization for consent screens and fixes an edge case where $defs could mutate during tool transforms.
Welcome to 7 new contributors who made their first FastMCP contributions in this release!
<!-- Release notes generated using configuration in .github/release.yml at main -->
title attribute to ProxyTool, ProxyResource, … by @CNSeniorious000 in https://github.com/jlowin/fastmcp/pull/2497Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.13.1...v2.13.2
Security: Update authlib to 1.6.5 (CVE-2025-61920) by @ColeMurray in https://github.com/jlowin/fastmcp/pull/2347
FastMCP 2.13.1 introduces meta parameter support for ToolResult (#2283), letting tools return metadata alongside results to enable new use cases such as OpenAI's Apps SDK. It also supports client-sent meta (#2206) as well as improved OAuth capabilities and custom token verifiers (including the new DebugTokenVerifier) and an OCI authentication provider. A large list of enhancements and bugfixes round out the release.
Note that #2422 excludes MCP SDK 1.21.1 as a permitted dependency version due to a bug that fails FastMCP integration tests.
<!-- Release notes generated using configuration in .github/release.yml at main -->
logger.exception for fastmcp run/inspect by @jakekaplan in https://github.com/jlowin/fastmcp/pull/2294enhancement/support-jwt-multiple-issuers by @coderabbitai[bot] in https://github.com/jlowin/fastmcp/pull/2282Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.13.0.1...v2.13.1
This release includes two critical dependency fixes:
This release includes two critical dependency fixes:
This release includes an important bugfix for 2.13.0 that affects how the Azure OAuth provider handles scopes.
This release includes an important bugfix for 2.13.0 that affects how the Azure OAuth provider handles scopes.
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.13.0...v2.13.0.1
Fix Python 3.13 websockets deprecation warning by @jlowin in https://github.com/jlowin/fastmcp/pull/1949
FastMCP 2.13.0 "Cache Me If You Can" represents a fundamental maturation of the framework. After months of community feedback on authentication and state management, this release delivers the infrastructure FastMCP needs to handle production workloads: persistent storage, response caching, and pragmatic OAuth improvements that reflect real-world deployment challenges.
💾 Pluggable storage backends bring persistent state to FastMCP servers. Built on py-key-value-aio, a new library from FastMCP maintainer Bill Easton (@strawgate), the storage layer provides encrypted disk storage by default, platform-aware token management, and a simple key-value interface for application state. We're excited to bring this elegantly designed library into the FastMCP ecosystem - it's both powerful and remarkably easy to use, including wrappers to add encryption, TTLs, caching, and more to backends ranging from Elasticsearch, Redis, DynamoDB, filesystem, in-memory, and more! OAuth providers now automatically persist tokens across restarts, and developers can store arbitrary state without reaching for external databases. This foundation enables long-running sessions, cached credentials, and stateful applications built on MCP.
🔐 OAuth maturity brings months of production learnings into the framework. The new consent screen prevents confused deputy and authorization bypass attacks discovered in earlier versions while providing a clean UX with customizable branding. The OAuth proxy now issues its own tokens with automatic key derivation from client secrets, and RFC 7662 token introspection support enables enterprise auth flows. Path prefix mounting enables OAuth-protected servers to integrate into existing web applications under custom paths like /api, and MCP 1.17+ compliance with RFC 9728 ensures protocol compatibility. Combined with improved error handling and platform-aware token storage, OAuth is now production-ready and security-hardened for serious applications.
FastMCP now supports out-of-the-box authentication with:
⚡ Response Caching Middleware dramatically improves performance for expensive operations. Cache tool and resource responses with configurable TTLs, reducing redundant API calls and speeding up repeated queries.
🔄 Server lifespans provide proper initialization and cleanup hooks that run once per server instance instead of per client session. This fixes a long-standing source of confusion in the MCP SDK and enables proper resource management for database connections, background tasks, and other server-level state. Note: this is a breaking behavioral change if you were using the lifespan parameter.
✨ Developer experience improvements include Pydantic input validation for better type safety, icon support for richer UX, RFC 6570 query parameters for resource templates, improved Context API methods (list_resources, list_prompts, get_prompt), and async file/directory resources.
This release includes contributions from 20 new contributors and represents the largest feature set in a while. Thank you to everyone who tested preview builds and filed issues - your feedback shaped these improvements!
<!-- Release notes generated using configuration in .github/release.yml at main -->
initialize requests in middleware by @jlowin in https://github.com/jlowin/fastmcp/pull/1546jwt_signing_key from Client Secret, default to Encrypted Disk Store by @strawgate in https://github.com/jlowin/fastmcp/pull/2223run_http_async by @tradeqvest in https://github.com/jlowin/fastmcp/pull/2071fastmcp install claude-code by @valayDave in https://github.com/jlowin/fastmcp/pull/2165Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.12.4...v2.13.0
Release candidate 3 for 2.13.0
Release candidate 3 for 2.13.0
Release candidate 2 for 2.13.0
Release candidate 2 for 2.13.0
Release candidate 1 for 2.13.0
Release candidate 1 for 2.13.0
This is a point release to pin the MCP SDK below 1.17, which introduced a change that is affecting some FastMCP users who 1) are using FastMCP auth pr
This is a point release to pin the MCP SDK below 1.17, which introduced a change that is affecting some FastMCP users who 1) are using FastMCP auth providers and 2) are mounting their MCP servers as part of a larger application, resulting in the .well-known payload appearing in an unexpected location.
The only change in this release is pinning the SDK version: https://github.com/jlowin/fastmcp/commit/dab2b316ddc3883b7896a86da21cacb68da01e5c <!-- Release notes generated using configuration in .github/release.yml at v2.12.5 -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.12.4...v2.12.5
fix: correct documentation link in deprecation warning by @strawgate in https://github.com/jlowin/fastmcp/pull/1828
FastMCP 2.12.4 adds comprehensive OIDC support and expands authentication options with AWS Cognito and Descope providers. The release also includes improvements to logging middleware, URL handling for nested resources, persistent OAuth client registration storage, and various fixes to the experimental OpenAPI parser.
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.12.3...v2.12.4
This release adds an integration with Gemini CLI, improves the flexibility of the OAuth Proxy, and fixes some bugs with the install commands and tool
This release adds an integration with Gemini CLI, improves the flexibility of the OAuth Proxy, and fixes some bugs with the install commands and tool content generation.
<!-- Release notes generated using configuration in .github/release.yml at main -->
uv run --with fastmcp is used by install commands by @jlowin in https://github.com/jlowin/fastmcp/pull/1769Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.12.2...v2.12.3
This is a hotfix for a bug where the streamable-http transport was not recognized as a valid option in fastmcp.json configuration files, despite being
This is a hotfix for a bug where the streamable-http transport was not recognized as a valid option in fastmcp.json configuration files, despite being supported by the CLI. This resulted in a parsing error when the CLI arguments were merged against the configuration spec.
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.12.1...v2.12.2
Note: this release includes a minor breaking change for users of built-in IDP integrations, with resource_server_url renamed to base_url for clarity a…
FastMCP 2.12.1 strengthens the OAuth proxy implementation based on extensive community testing and feedback. This release fixes DCR client generation, improves client token storage reliability, adds PKCE forwarding for enhanced security, introduces configurable token endpoint authentication methods, and expands scope handling; all addressing real-world integration challenges discovered since 2.12.0. The enhanced test suite with mock providers ensures these improvements are robust and maintainable.
Note: this release includes a minor breaking change for users of built-in IDP integrations, with resource_server_url renamed to base_url for clarity and consistency. This is in line with FastMCP's breaking change policy for the auth module.
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.12.0...v2.12.1
Fix breaking change: restore output_schema=False compatibility by @jlowin in https://github.com/jlowin/fastmcp/pull/1482
FastMCP 2.12 represents one of our most significant releases to date, both in scope and community involvement. After extensive testing and iteration with the community, we're shipping major improvements to authentication, configuration, and MCP feature adoption.
🔐 OAuth Proxy for Broader Provider Support addresses a fundamental challenge: while MCP requires Dynamic Client Registration (DCR), many popular OAuth providers don't support it. The new OAuth proxy bridges this gap, enabling FastMCP servers to authenticate with providers like GitHub, Google, WorkOS, and Azure through minimal configuration. These native integrations ship today, with more providers planned based on community needs.
📋 Declarative JSON Configuration introduces a standardized, portable way to describe and deploy MCP servers. The fastmcp.json configuration file becomes the single source of truth for dependencies, transport settings, entrypoints, and server metadata. This foundation sets the stage for future capabilities like transformations and remote sources, moving toward a world where MCP servers are as portable and shareable as container images.
🧠 Sampling API Fallback tackles the chicken-and-egg problem limiting adoption of advanced MCP features. Sampling—where servers request LLM completions from clients—is powerful but underutilized due to limited client support. FastMCP now lets server authors define fallback handlers that generate sampling completions server-side when clients don't support the feature, encouraging adoption while maintaining compatibility.
This release took longer than usual to ship, and for good reason: the community's aggressive testing and feedback on the authentication system helped us reach a level of stability we're confident in. There's certainly more work ahead, but these foundations position FastMCP to handle increasingly complex use cases while remaining approachable for developers.
Thank you to our new contributors and everyone who tested preview builds. Your feedback directly shaped these features.
<!-- Release notes generated using configuration in .github/release.yml at main -->
pyright to ty by @zzstoatzz in https://github.com/jlowin/fastmcp/pull/1545StdioTransport in Client.new by @strawgate in https://github.com/jlowin/fastmcp/pull/1635just error message for static checks by @jlowin in https://github.com/jlowin/fastmcp/pull/1483Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.11.3...v2.12.0
Release candidate 1 for 2.12.0
Release candidate 1 for 2.12.0
Pin mcp SDK under 2.0 to avoid breaking changes by @jlowin in https://github.com/jlowin/fastmcp/pull/1428
<!-- Release notes generated using configuration in .github/release.yml at main -->
This release includes significant enhancements to the experimental OpenAPI parser and fixes a significant bug that led schemas not to be included in input/output schemas if they were transitive dependencies (e.g. A → B → C implies A depends on C). For users naively transforming large OpenAPI specs into MCP servers, this may result in ballooning payload sizes and necessitate curation.
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.11.2...v2.11.3
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.11.1...v2.11.2
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
RemoteAuthProvider for cleaner external identity provider integration, update docs by @jlowin in https://github.com/jlowin/fastmcp/pull/1346_key after model_copy() to enable prefixing Transformed Tools by @strawgate in https://github.com/jlowin/fastmcp/pull/1357Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.11.0...v2.11.1
FastMCP 2.11 doubles down on what developers need most: speed and simplicity. This massive release delivers significant performance improvements and a
FastMCP 2.11 doubles down on what developers need most: speed and simplicity. This massive release delivers significant performance improvements and a dramatically better developer experience.
🔐 Enterprise-Ready Authentication brings comprehensive OAuth 2.1 support with WorkOS's AuthKit integration. The new AuthProvider interface leverages MCP's support for separate resource and authorization servers, handling API keys and remote authentication with Dynamic Client Registration. AuthKit integration means you can plug into existing enterprise identity systems without rebuilding your auth stack, setting the stage for plug-and-play auth that doesn't require users to become security experts overnight.
⚡ The Experimental OpenAPI Parser delivers dramatic performance improvements through single-pass schema processing and optimized memory usage. OpenAPI integrations are now significantly faster, with cleaner, more maintainable code. (Note: the experimental parser is disabled by default, set FASTMCP_EXPERIMENTAL_ENABLE_NEW_OPENAPI_PARSER=1 to enable it. A message will be shown to all users on the legacy parser encouraging them to try the new one before it becomes the default.)
🧠 Context State Management finally gives you persistent state across tool calls with a simple dict interface, while enhanced meta support lets you expose rich component metadata to clients. Combined with improved type annotations, string-based argument descriptions, and UV transport support, this release makes FastMCP feel more intuitive than ever.
This release represents a TON of community contributions and sets the foundation for even more ambitious features ahead.
<!-- Release notes generated using configuration in .github/release.yml at main -->
meta dict by @jlowin in https://github.com/jlowin/fastmcp/pull/1281fastmcp run mcp.json by @strawgate in https://github.com/jlowin/fastmcp/pull/1138get_http_request and context.session_id by @hopeful0 in https://github.com/jlowin/fastmcp/pull/1242Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.10.6...v2.11.0
Remove deprecated proxy creation by @jlowin in https://github.com/jlowin/fastmcp/pull/1186
A special Saturday release with many fixes.
<!-- Release notes generated using configuration in .github/release.yml at v2.10.6 -->
mcp-json output format to include server name by @jlowin in https://github.com/jlowin/fastmcp/pull/1185mdxify version by @zzstoatzz in https://github.com/jlowin/fastmcp/pull/1182Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.10.5...v2.10.6
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.10.4...v2.10.5
A maintenance release focused on OpenAPI refinements and middleware fixes, plus console improvements.
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.10.3...v2.10.4
A quick fix to ensure the CLI accepts "streamable-http" as a valid transport option.
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
fastmcp install command by @jlowin in https://github.com/jlowin/fastmcp/pull/1056--path Option to CLI for HTTP/SSE Route by @davidbk-legit in https://github.com/jlowin/fastmcp/pull/1087Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.10.2...v2.10.3
A major CLI overhaul featuring a complete refactor from typer to cyclopts, new IDE integrations, and comprehensive OpenAPI improvements.
The headline feature of this release is the ability to "forward" advanced MCP interactions like logging, progress, and elicitation through proxy serve
The headline feature of this release is the ability to "forward" advanced MCP interactions like logging, progress, and elicitation through proxy servers. If the remote server requests an elicitation, the proxy client will pass that request to the new, "ultimate" client.
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.10.1...v2.10.2
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.10.0...v2.10.1
A quick patch to revert the CLI banner that was added in v2.10.0.
Note that this release includes a breaking change to the client.call_tool() return signature, which now returns a CallToolResult object with automatic…
FastMCP 2.10.0 delivers full compliance with the 6/18/2025 MCP spec update, introducing powerful new capabilities for building interactive MCP servers. This release adds elicitation support, which enables servers to request additional information from users during interactions, creating opportunities for human-in-the-loop workflows and more dynamic server-client communication. The update also introduces output schemas and structured outputs for tools, allowing servers to define structured response formats that provide more predictable and rich tool results.
Beyond these headline protocol features, 2.10.0 includes substantial improvements across the FastMCP ecosystem: enhanced HTTP routing with OpenAPI extensions support, updated authentication primitives, configurable algorithms, and more robust error handling throughout the transport layer. Note that this release includes a breaking change to the client.call_tool() return signature, which now returns a CallToolResult object with automatic deserialization of structured outputs while maintaining backward compatibility through the .content attribute.
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.9.2...v2.10.0
FastMCP 2.10 brings full compliance with the 6/18/2025 MCP spec update, introducing elicitation support for dynamic server-client communication and output schemas for structured tool responses. Please note that due to these changes, this release also includes a breaking change to the return signature of client.call_tool().
Elicitation allows MCP servers to request additional information from clients during tool execution, enabling more interactive and dynamic server behavior. This opens up new possibilities for tools that need user input or confirmation during execution.
Tools can now define structured output schemas, ensuring that responses conform to expected formats and making tool integration more predictable and type-safe.
This is a patch release to pin mcp below 1.10, which includes changes related to the 6/18/2025 MCP spec update and could potentially break functionali
This is a patch release to pin mcp below 1.10, which includes changes related to the 6/18/2025 MCP spec update and could potentially break functionality for some FastMCP users. Those will be incorporated into FastMCP 2.10
<!-- Release notes generated using configuration in .github/release.yml at v2.9.2 -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.9.1...v2.9.2
The headline of this release is the introduction of change notifications for tools/resources/prompts, as well as flexible client-side handling of arbi
The headline of this release is the introduction of change notifications for tools/resources/prompts, as well as flexible client-side handling of arbitrary messages.
<!-- Release notes generated using configuration in .github/release.yml at main -->
just api-ref-all to get new source links by @zzstoatzz in https://github.com/jlowin/fastmcp/pull/935create_thread tool to bsky MCP server by @zzstoatzz in https://github.com/jlowin/fastmcp/pull/927Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.9.0...v2.9.1
FastMCP 2.9.1 introduces automatic MCP list change notifications, allowing servers to notify clients when tools, resources, or prompts are dynamically updated. This enables more responsive and adaptive MCP integrations.
FastMCP 2.9 introduces two important features that push beyond the basic MCP protocol. MCP Middleware brings a flexible middleware system for intercep
FastMCP 2.9 introduces two important features that push beyond the basic MCP protocol. MCP Middleware brings a flexible middleware system for intercepting and controlling server operations - think authentication, logging, rate limiting, and custom business logic without touching core protocol code. Server-side type conversion solves a major developer pain point: while MCP requires string arguments, your functions can now work with native Python types like lists and dictionaries, with automatic conversion handling the complexity.
These features transform FastMCP from a simple protocol implementation into a powerful framework for building sophisticated MCP applications. Combined with the new File utility for binary data and improvements to authentication and serialization, this release makes FastMCP significantly more flexible and developer-friendly while maintaining full protocol compliance.
<!-- Release notes generated using configuration in .github/release.yml at main -->
--exclude flag by @zzstoatzz in https://github.com/jlowin/fastmcp/pull/907Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.8.1...v2.9.0
FastMCP 2.9 introduces two important features that push beyond the basic MCP protocol: MCP Middleware and server-side type conversion.
MCP middleware lets you intercept and modify requests and responses at the protocol level, giving you powerful capabilities for logging, authentication, validation, and more. This is particularly useful for building production-ready MCP servers that need sophisticated request handling.
This release also introduces server-side type conversion for prompt arguments, ensuring that data is properly formatted before being passed to your functions. This reduces the burden on individual tools and prompts to handle type validation and conversion.
2.8.1 introduces audio support, as well as minor fixes and updates for deprecated features.
2.8.1 introduces audio support, as well as minor fixes and updates for deprecated features.
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.8.0...v2.8.1
2.8.1 introduces audio support, as well as minor fixes and updates for deprecated features.
This release adds support for audio content in MCP tools and resources, expanding FastMCP's multimedia capabilities beyond text and images.
…are now converted to Tools by default. This is a breaking change but pragmatically necessitated by the fact that the majority of MCP clients available…
FastMCP 2.8.0 introduces powerful new ways to customize and control your MCP servers!
The highlight of this release is first-class Tool Transformation, a new feature that lets you create enhanced variations of existing tools. You can now easily rename arguments, hide parameters, modify descriptions, and even wrap tools with custom validation or post-processing logic—all without rewriting the original code. This makes it easier than ever to adapt generic tools for specific LLM use cases or to simplify complex APIs. Huge thanks to @strawgate for partnering on this, starting with https://github.com/jlowin/fastmcp/discussions/591 and https://github.com/jlowin/fastmcp/pull/599 and continuing offline.
This release also gives you more granular control over which components are exposed to clients. With new tag-based filtering, you can selectively enable or disable tools, resources, and prompts based on tags, perfect for managing different environments or user permissions. Complementing this, every component now supports being programmatically enabled or disabled, offering dynamic control over your server's capabilities.
Finally, to improve compatibility with a wider range of LLM clients, this release changes the default behavior for OpenAPI integration: all API endpoints are now converted to Tools by default. This is a breaking change but pragmatically necessitated by the fact that the majority of MCP clients available today are, sadly, only compatible with MCP tools. Therefore, this change significantly simplifies the out-of-the-box experience and ensures your entire API is immediately accessible to any tool-using agent.
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.7.1...v2.8.0
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
This release primarily contains a fix for parsing string tokens that are provided to FastMCP clients.
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.7.0...v2.7.1
This release primarily contains a fix for parsing string tokens that are provided to FastMCP clients.
Full Changelog: v2.7.0...v2.7.1 </Update>
<Update label="v2.7.0" description="2024-06-05">
However please note that as a result, this release has some minor breaking changes (which is why it's 2.7, not 2.6.2, in accordance with repo guidelin…
<!-- Release notes generated using configuration in .github/release.yml at main -->
This is primarily a housekeeping release to remove or deprecate cruft that's accumulated since v1. Primarily, this release refactors FastMCP's internals in preparation for features planned in the next few major releases. However please note that as a result, this release has some minor breaking changes (which is why it's 2.7, not 2.6.2, in accordance with repo guidelines) though not to the core user-facing APIs. Examples include:
Happily, this release DOES permit the use of "naked" decorators to align with Pythonic practice:
@mcp.tool
def my_tool():
...
#/components/schemas/ with #/$defs/ by @phateffect in https://github.com/jlowin/fastmcp/pull/697Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.6.1...v2.7.0
This is primarily a housekeeping release to remove or deprecate cruft that's accumulated since v1. Primarily, this release refactors FastMCP's internals in preparation for features planned in the next few major releases. However please note that as a result, this release has some minor breaking changes (which is why it's 2.7, not 2.6.2, in accordance with repo guidelines) though not to the core user-facing APIs.
#/components/schemas/ with #/$defs/ by @phateffect in #697Happily, this release DOES permit the use of "naked" decorators to align with Pythonic practice:
@mcp.tool
def my_tool():
...
Full Changelog: v2.6.2...v2.7.0 </Update>
<Update label="v2.6.1" description="2024-06-03">
Remove deprecation notice by @jlowin in https://github.com/jlowin/fastmcp/pull/677
<!-- Release notes generated using configuration in .github/release.yml at main -->
This is a patch release to restore py.typed in #686.
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.6.0...v2.6.1
This is a patch release to restore py.typed in #686.
Full Changelog: v2.6.0...v2.6.1 </Update>
<Update label="v2.6.0" description="2024-06-02">
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.5.2...v2.6.0
Full Changelog: v2.5.2...v2.6.0 </Update>
<Update label="v2.5.2" description="2024-05-29">
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.5.1...v2.5.2
Full Changelog: v2.5.1...v2.5.2 </Update>
<Update label="v2.5.1" description="2024-05-24">
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.5.0...v2.5.1
Full Changelog: v2.5.0...v2.5.1 </Update>
<Update label="v2.5.0" description="2024-05-24">
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
This release introduces completely new tools for generating and customizing MCP servers from OpenAPI specs and FastAPI apps, including popular requests like mechanisms for determining what routes map to what MCP components; renaming routes; and customizing the generated MCP components.
Context.sample for flexible model selection. by @davenpi in https://github.com/jlowin/fastmcp/pull/542Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.4.0...v2.5.0
This release introduces completely new tools for generating and customizing MCP servers from OpenAPI specs and FastAPI apps, including popular requests like mechanisms for determining what routes map to what MCP components; renaming routes; and customizing the generated MCP components.
Context.sample for flexible model selection. by @davenpi in #542Full Changelog: v2.4.0...v2.5.0 </Update>
<Update label="v2.4.0" description="2024-05-21">
Note: this release includes a backwards-incompatible change to how resources are prefixed when mounted in composed servers. However, it is only backwa
Note: this release includes a backwards-incompatible change to how resources are prefixed when mounted in composed servers. However, it is only backwards-incompatible if users were running tests or manually loading resources by prefixed key; LLMs should not have any issue discovering the new route. See https://gofastmcp.com/servers/composition#resource-prefix-formats for more.
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.3.5...v2.4.0
Note: this release includes a backwards-incompatible change to how resources are prefixed when mounted in composed servers. However, it is only backwards-incompatible if users were running tests or manually loading resources by prefixed key; LLMs should not have any issue discovering the new route.
Full Changelog: v2.3.5...v2.4.0 </Update>
<Update label="v2.3.5" description="2024-05-20">
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
fastmcp run to work with remote servers by @jlowin in https://github.com/jlowin/fastmcp/pull/491server.py by @zzstoatzz in https://github.com/jlowin/fastmcp/pull/476test_permission_error if runner is root. by @ZiadAmerr in https://github.com/jlowin/fastmcp/pull/502Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.3.4...v2.3.5
fastmcp run to work with remote servers by @jlowin in #491server.py by @zzstoatzz in #476test_permission_error if runner is root. by @ZiadAmerr in #502Full Changelog: v2.3.4...v2.3.5 </Update>
<Update label="v2.3.4" description="2024-05-15">
Deprecate passing settings to the FastMCP instance by @jlowin in https://github.com/jlowin/fastmcp/pull/424
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.3.3...v2.3.4
Full Changelog: v2.3.3...v2.3.4 </Update>
<Update label="v2.3.3" description="2024-05-10">
This is a hotfix for a bug introduced in 2.3.2 that broke SSE servers
This is a hotfix for a bug introduced in 2.3.2 that broke SSE servers
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.3.2...v2.3.3
This is a hotfix for a bug introduced in 2.3.2 that broke SSE servers
Full Changelog: v2.3.2...v2.3.3 </Update>
<Update label="v2.3.2" description="2024-05-10">
Deprecate transport-specific methods on FastMCP server by @jlowin in https://github.com/jlowin/fastmcp/pull/401
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.3.1...v2.3.2
Full Changelog: v2.3.1...v2.3.2 </Update>
<Update label="v2.3.1" description="2024-05-09">
This release primarily patches a long-standing bug with nested ASGI SSE servers.
This release primarily patches a long-standing bug with nested ASGI SSE servers.
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.3.0...v2.3.1
This release primarily patches a long-standing bug with nested ASGI SSE servers.
Full Changelog: v2.3.0...v2.3.1 </Update>
<Update label="v2.3.0" description="2024-05-08">
Note that get_http_request is deprecated by @jlowin in https://github.com/jlowin/fastmcp/pull/351
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.2.10...v2.3.0
Full Changelog: v2.2.10...v2.3.0 </Update>
<Update label="v2.2.10" description="2024-05-06">
Nothing published for this version
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.2.9...v2.2.10
Full Changelog: v2.2.9...v2.2.10 </Update>
<Update label="v2.2.9" description="2024-05-06">
This release is a hotfix for the issue detailed in #330
This release is a hotfix for the issue detailed in #330
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.2.8...v2.2.9
This release is a hotfix for the issue detailed in #330
Full Changelog: v2.2.8...v2.2.9 </Update>
<Update label="v2.2.8" description="2024-05-05">
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.2.7...v2.2.8
Full Changelog: v2.2.7...v2.2.8 </Update>
<Update label="v2.2.7" description="2024-05-03">
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.2.6...v2.2.7
Full Changelog: v2.2.6...v2.2.7 </Update>
<Update label="v2.2.6" description="2024-04-30">
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.2.5...v2.2.6
Full Changelog: v2.2.5...v2.2.6 </Update>
<Update label="v2.2.5" description="2024-04-26">
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.2.4...v2.2.5
Full Changelog: v2.2.4...v2.2.5 </Update>
<Update label="v2.2.4" description="2024-04-25">
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
The wildcard URI templates exposed in v2.2.3 were blocked by a server-level check which is removed in this release.
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.2.3...v2.2.4
The wildcard URI templates exposed in v2.2.3 were blocked by a server-level check which is removed in this release.
Full Changelog: v2.2.3...v2.2.4 </Update>
<Update label="v2.2.3" description="2024-04-25">
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.2.2...v2.2.3
Full Changelog: v2.2.2...v2.2.3 </Update>
<Update label="v2.2.2" description="2024-04-24">
<!-- Release notes generated using configuration in .github/release.yml at main -->
<!-- Release notes generated using configuration in .github/release.yml at main -->
Full Changelog: https://github.com/jlowin/fastmcp/compare/v2.2.1...v2.2.2
Full Changelog: v2.2.1...v2.2.2 </Update>
<Update label="v2.2.1" description="2024-04-23">
Your coding agent can read these notes before it upgrades. Set up the MCP server →