v2.11.0: Auth to a Good Start
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.
What's Changed
New Features 🎉
- Introduce experimental OpenAPI parser with improved performance and maintainability by @jlowin in #1209
- Add state dict to Context (#1118) by @mukulmurthy in #1160
- Expose FastMCP tags to clients via component
metadict by @jlowin in #1281 - Add _fastmcp meta namespace by @jlowin in #1290
- Add TokenVerifier protocol support alongside existing OAuthProvider authentication by @jlowin in #1297
- Add comprehensive OAuth 2.1 authentication system with WorkOS integration by @jlowin in #1327
Enhancements 🔧
- [🐶] Transform MCP Server Tools by @strawgate in #1132
- Add --python, --project, and --with-requirements options to CLI commands by @jlowin in #1190
- Support
fastmcp run mcp.jsonby @strawgate in #1138 - Support from future import annotations by @jlowin in #1199
- Optimize OpenAPI parser performance with single-pass schema processing by @jlowin in #1214
- Log tool name on transform validation error by @strawgate in #1238
- Refactor
get_http_requestandcontext.session_idby @hopeful0 in #1242 - Support creating tool argument descriptions from string annotations by @jlowin in #1255
- feat: Add Annotations support for resources and resource templates by @chughtapan in #1260
- Add UV Transport by @strawgate in #1270
- Improve OpenAPI-to-JSONSchema conversion utilities by @jlowin in #1283
- Ensure proxy components forward meta dicts by @jlowin in #1282
- fix: server argument passing in CLI run command by @chughtapan in #1293
- Add meta support to tool transformation utilities by @jlowin in #1295
- feat: Allow Resource Metadata URL as field in OAuthProvider by @dacamposol in #1287
- Use a simple overwrite instead of a merge for meta by @jlowin in #1296
- Remove unused TimedCache by @strawgate in #1303
- refactor: standardize logging usage across OpenAPI utilities by @chi2liu in #1322
- perf: optimize OpenAPI parsing by reducing dict copy operations by @chi2liu in #1321
- Structured client-side logging by @cjermain in #1326
Fixes 🐞
- fix: preserve def reference when referenced in allOf / oneOf / anyOf by @algirdasci in #1208
- fix: add type hint to custom_route decorator by @zzstoatzz in #1210
- chore: typo by @richardkmichael in #1216
- fix: handle non-string $ref values in experimental OpenAPI parser by @jlowin in #1217
- Skip repeated type conversion and validation in proxy client elicitation handler by @chughtapan in #1222
- Ensure default fields are not marked nullable by @jlowin in #1224
- Fix stateful proxy client mixing in multi-proxies sessions by @hopeful0 in #1245
- Fix invalid async context manager usage in proxy documentation by @zzstoatzz in #1246
- fix: experimental FastMCPOpenAPI server lost headers in request when init(client with headers) by @itaru2622 in #1254
- Fix typing, add tests for tool call middleware by @jlowin in #1269
- Fix: prune hidden parameter defs by @muhammadkhalid-03 in #1257
- Fix nullable field handling in OpenAPI to JSON Schema conversion by @jlowin in #1279
- Ensure fastmcp run supports v1 servers by @jlowin in #1332
Breaking Changes 🛫
Docs 📚
- Remove unused import from FastAPI integration documentation by @mariotaddeucci in #1194
- Update fastapi docs by @jlowin in #1198
- Add docs for context state management by @jlowin in #1227
- Permit.io integration docs by @orweis in #1226
- Update docs to reflect sync tools by @jlowin in #1234
- Update changelog.mdx by @jlowin in #1235
- Update SDK docs by @jlowin in #1236
- Update --name flag documentation for Cursor/Claude by @adam-conway in #1239
- Add annotations docs by @jlowin in #1268
- Update openapi/fastapi URLs README.md by @jbn in #1278
- Add 2.11 version badge for state management by @jlowin in #1289
- Add meta parameter support to tools, resources, templates, and prompts decorators by @jlowin in #1294
- docs: update get_state and set_state references by @Maxi91f in #1306
- Add unit tests and docs for denying tool calls with middleware by @jlowin in #1333
- Remove reference to stacked decorators by @jlowin in #1334
- Eunomia authorization server can run embedded within the MCP server by @tommitt in #1317
Other Changes 🦾
- Update README.md by @jlowin in #1230
- Logcapture addition to test_server file by @Sourav-Tripathy in #1229
- Add tests for headers with both legacy and experimental openapi parser by @jlowin in #1259
- Small clean-up from MCP Tool Transform PR by @strawgate in #1267
- Add test for proxy tags visibility by @jlowin in #1302
- Add unit test for sampling with image messages by @jlowin in #1329
- Remove redundant resource_metadata_url assignment by @jlowin in #1328
- Update bug.yml by @jlowin in #1331
- Ensure validation errors are raised when masked by @jlowin in #1330
New Contributors
- @mariotaddeucci made their first contribution in #1194
- @algirdasci made their first contribution in #1208
- @chughtapan made their first contribution in #1222
- @mukulmurthy made their first contribution in #1160
- @orweis made their first contribution in #1226
- @Sourav-Tripathy made their first contribution in #1229
- @adam-conway made their first contribution in #1239
- @muhammadkhalid-03 made their first contribution in #1257
- @jbn made their first contribution in #1278
- @dacamposol made their first contribution in #1287
- @chi2liu made their first contribution in #1322
- @cjermain made their first contribution in #1326
Full Changelog: v2.10.6...v2.11.0