Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
3124 commits
Select commit Hold shift + click to select a range
c0a36f0
Add `fastmcp list` and `fastmcp call` CLI commands (#3054)
jlowin Feb 1, 2026
8b6b528
Add `fastmcp discover` and name-based server resolution (#3055)
jlowin Feb 2, 2026
76aab59
Fix Field() handling in prompts (#3050)
strawgate Feb 2, 2026
f2a8c24
Merge branch 'main' into claude/issue-3049-20260131-2232
jlowin Feb 2, 2026
eeb4425
fix: use SkipJsonSchema to exclude callable fields from JSON schema g…
strawgate Feb 2, 2026
33e0a8f
Merge branch 'main' into claude/issue-3049-20260131-2232
strawgate Feb 2, 2026
00c8664
fix: Preserve metadata in FastMCPProvider component wrappers (#3057)
NeelayS Feb 2, 2026
6acdf03
feat(context): Add background task support for Context (SEP-1686) (#2…
gfortaine Feb 3, 2026
c47d272
Merge branch 'main' into claude/issue-3049-20260131-2232
strawgate Feb 3, 2026
b86e73c
Add AzureJWTVerifier for Managed Identity token verification (#3058)
jlowin Feb 3, 2026
a235418
Merge branch 'main' into claude/issue-3049-20260131-2232
strawgate Feb 3, 2026
23c1d6f
Mock network calls in CLI tests and use MemoryStore for OAuth tests
strawgate Feb 3, 2026
65b5b2f
Add release notes for v2.14.4 and v2.14.5 (#3064)
jlowin Feb 3, 2026
63a1416
Remove OpenAPI timeout parameter, make client optional, surface timeo…
jlowin Feb 4, 2026
2dc4041
chore: Update SDK documentation (#2995)
marvin-context-protocol[bot] Feb 4, 2026
8b93a51
Add `fastmcp generate-cli` command (#3065)
jlowin Feb 4, 2026
35c9912
fix: enforce redirect URI validation when allowed_client_redirect_uri…
nathanwelsh8 Feb 4, 2026
3cf6fd1
Fix --reload port conflict when using explicit port (#3070)
jlowin Feb 4, 2026
94a42b3
Add server version to banner (#3076)
richardkmichael Feb 4, 2026
ab1714b
Add @handle_tool_errors decorator for standardized error handling (#2…
dgenio Feb 4, 2026
883dd68
chore: Update SDK documentation (#3069)
marvin-context-protocol[bot] Feb 4, 2026
06c6545
Update Anthropic and OpenAI clients to use Omit instead of NotGiven (…
jlowin Feb 5, 2026
8e28864
Add CIMD (Client ID Metadata Document) support for OAuth (#2871)
jlowin Feb 6, 2026
e454974
Add ResponseLimitingMiddleware for tool response size control (#3072)
dgenio Feb 6, 2026
b86082f
Add note about output_schema incongruity when responses are truncated…
jlowin Feb 6, 2026
4ae1b11
Document token passthrough security in OAuth Proxy docs (#3100)
jlowin Feb 6, 2026
5b99d77
Fix compress_schema to preserve additionalProperties: false for MCP c…
jlowin Feb 6, 2026
cf237f6
Infer MIME types from OpenAPI response definitions (#3101)
jlowin Feb 7, 2026
e7a20b7
Fix CIMD redirect allowlist bypass and cache revalidation (#3098)
jlowin Feb 7, 2026
511eb72
Remove require_auth; fix auth docs re: component-level enforcement (#…
jlowin Feb 7, 2026
5d90cb5
Exclude content-type header from get_http_headers() to prevent HTTP 4…
jlowin Feb 7, 2026
dd998ac
chore: Update SDK documentation (#3089)
marvin-context-protocol[bot] Feb 7, 2026
ac5a96d
Add missing beta2 features to v3 release tracking (#3105)
jlowin Feb 7, 2026
7c18555
Updated deprecation URL (#3108)
SrzStephen Feb 7, 2026
195bec4
Update docs to reference beta 2 (#3112)
jlowin Feb 7, 2026
ff70dda
feat: distributed notification queue for background task elicitation
gfortaine Feb 8, 2026
04e9295
fix: store progress in Redis and use BLPOP for elicitation
gfortaine Feb 8, 2026
6cac937
test: rewrite as integration tests with zero mocks
gfortaine Feb 8, 2026
4d60b48
fix: stabilize task notification integration tests
gfortaine Feb 8, 2026
400e345
generate-cli: auto-generate SKILL.md agent skill (#3115)
jlowin Feb 8, 2026
fd86aad
Rename ui= to app= and consolidate ToolUI/ResourceUI into AppConfig (…
jlowin Feb 9, 2026
4825ded
Scope Martian triage to bug-labeled issues for jlowin (#3124)
jlowin Feb 9, 2026
5b0be56
Add Azure OBO dependencies, auth token injection, and documentation (…
jlowin Feb 10, 2026
6f501e5
feat: add Static Client Registration (#3085) (#3086)
martimfasantos Feb 10, 2026
cc596b8
Add concurrent tool execution with sequential flag (#3022)
strawgate Feb 10, 2026
fa14aa7
CI: Commit generated artifacts back to PR branch instead of opening s…
jlowin Feb 10, 2026
37e15db
chore: Update SDK documentation (#3116)
marvin-context-protocol[bot] Feb 10, 2026
1b2809f
docs: add pre-registered OAuth clients to v3-features (#3129)
jlowin Feb 10, 2026
40cd750
Fix Windows test timeouts in OAuth proxy provider tests (#3123)
strawgate Feb 10, 2026
76802ec
Merge branch 'main' into fix/statusMessage-not-forwarded
chrisguidry Feb 10, 2026
3291687
Fix session visibility marks leaking across sessions (#3132)
jlowin Feb 10, 2026
651b1b9
Fix unhandled exceptions in OpenAPI POST tool calls (#3133)
jlowin Feb 10, 2026
c0b0883
Add validate_output option for OpenAPI tools (#3134)
jlowin Feb 10, 2026
5d0cee5
Merge branch 'main' into fix/statusMessage-not-forwarded
chrisguidry Feb 10, 2026
6c58ee0
Relay task elicitation through standard MCP protocol
chrisguidry Feb 10, 2026
927d4e9
Merge pull request #2906 from gfortaine/fix/statusMessage-not-forwarded
chrisguidry Feb 10, 2026
0971785
Address review: set status key on cancel fallback, prevent relay task GC
chrisguidry Feb 10, 2026
72811e4
chore: Update SDK documentation
marvin-context-protocol[bot] Feb 10, 2026
3bea348
Merge branch 'main' into task-elicitation-relay
chrisguidry Feb 10, 2026
94385bf
Move relay logic to elicitation.py, fix related-task metadata key
chrisguidry Feb 10, 2026
10f8f8c
chore: Update SDK documentation
marvin-context-protocol[bot] Feb 10, 2026
bbaeb3e
Merge pull request #3136 from jlowin/task-elicitation-relay
chrisguidry Feb 10, 2026
776eb8a
Bump py-key-value-aio to >=0.4.0,<0.5.0 (#3143)
strawgate Feb 11, 2026
74a928c
docs: add v3.0.0rc1 section to v3-features tracking (#3145)
jlowin Feb 11, 2026
edc4fd2
docs: remove nonexistent MSALApp from rc1 notes (#3146)
jlowin Feb 11, 2026
784367d
chore(deps): bump cryptography (#3140)
dependabot[bot] Feb 11, 2026
6e0bccb
fix: snapshot access token for background tasks (#3095) (#3138)
gfortaine Feb 11, 2026
f80b777
Stop duplicating path parameter descriptions into tool prose (#3149)
jlowin Feb 11, 2026
5e8704a
Remove deprecated FastMCP() constructor kwargs (#3148)
jlowin Feb 11, 2026
6273085
Support async auth checks (#3152)
jlowin Feb 11, 2026
2be38d8
Make $ref dereferencing optional via FastMCP(dereference_refs=...) (#…
jlowin Feb 11, 2026
ebd4133
Updates to github actions / workflows for claude
strawgate Feb 11, 2026
74593a2
Merge origin/main into update-claude-workflows
strawgate Feb 11, 2026
644d766
update conditionals
strawgate Feb 11, 2026
3d85de5
pretty yaml
strawgate Feb 11, 2026
7d71a9b
Expose local_provider property, deprecate FastMCP.remove_tool() (#3155)
jlowin Feb 12, 2026
c52bbcf
Add helpers for converting FunctionTool and TransformedTool to Sampli…
strawgate Feb 12, 2026
79f17f4
fix: guard client pagination loops against misbehaving servers (#3167)
jlowin Feb 12, 2026
b61576b
docs: fix stale get_* references, now list_* (#3168)
jlowin Feb 12, 2026
84f8324
Merge pull request #3157 from jlowin/update-claude-workflows
jlowin Feb 12, 2026
f3b5745
Support non-serializable values in Context.set_state (#3171)
jlowin Feb 12, 2026
4a807a0
Fix stale request context in StatefulProxyClient handlers (#3172)
jlowin Feb 12, 2026
1b719db
docs: update all references from 3.0.0b2 to 3.0.0rc1 (#3173)
jlowin Feb 12, 2026
09d88ac
chore(deps): bump cryptography in the uv group across 1 directory (#3…
dependabot[bot] Feb 13, 2026
972019b
Fix include_tags/exclude_tags ignored without tools in MCPConfig (#3186)
jlowin Feb 14, 2026
9ffef86
Move `fastmcp dev` to `fastmcp dev inspector`
jlowin Feb 14, 2026
094f3c9
chore: Update SDK documentation
marvin-context-protocol[bot] Feb 14, 2026
2176861
Merge pull request #3188 from jlowin/feature/dev-subcommand-group
jlowin Feb 14, 2026
c89714d
fix: correct dark mode logo file extension in README
jfBiswajit Feb 16, 2026
7d4019e
Merge pull request #3193 from jfBiswajit/fix/readme-logo
jlowin Feb 16, 2026
a7aca76
Add cache key identity note to middleware docs
jlowin Feb 16, 2026
def21a8
Merge pull request #3194 from jlowin/docs/caching-identity-note
jlowin Feb 16, 2026
bf85534
Return 405 for GET requests on stateless HTTP servers
jlowin Feb 16, 2026
d47ddf9
Merge pull request #3195 from jlowin/fix/stateless-http-disable-get-sse
jlowin Feb 16, 2026
40e1e89
Reorganize docs navigation around Server/Client/Apps pillars (#3197)
jlowin Feb 16, 2026
dd0b0fa
Fix ty 0.0.17 diagnostics and bump lockfile
jlowin Feb 16, 2026
5d1108d
Merge pull request #3198 from jlowin/fix/ty-errors
jlowin Feb 16, 2026
0324c33
Drop diskcache dependency (CVE-2025-69872) (#3185)
jlowin Feb 16, 2026
0bd7b4d
Minimize resolved review threads in PRs (#3200)
strawgate Feb 17, 2026
111e102
Fix confused deputy attack via consent binding cookie (#3201)
jlowin Feb 17, 2026
c0d8885
Add JWT audience validation and RFC 8707 warnings to auth providers (…
jlowin Feb 17, 2026
133c903
Exclude auto-generated python-sdk docs from CodeRabbit reviews (#3206)
jlowin Feb 17, 2026
2ec8e5b
Overhaul v3.0 upgrade guide (#3205)
jlowin Feb 18, 2026
b9af420
Update repository references for transfer to prefecthq (#3207)
jlowin Feb 18, 2026
4b7e1a4
Cache OBO credentials on AzureProvider for token reuse (#3212)
jlowin Feb 18, 2026
6844bb9
Fix MDX parsing error and update card images (#3213)
jlowin Feb 18, 2026
50e7fe9
Update docs for 3.0 GA release (#3216)
jlowin Feb 18, 2026
2704b96
Add upgrade guides for users coming from the MCP SDK (#3215)
jlowin Feb 18, 2026
9b6051f
Fix invalid uv add fastmcp@latest command (#3217)
jlowin Feb 18, 2026
9b837f4
Normalize repo references to PrefectHQ/fastmcp casing (#3218)
jlowin Feb 18, 2026
01657d8
Use standard traceparent/tracestate keys per OTel MCP semconv (#3221)
chrisguidry Feb 18, 2026
f1da533
Update thumbnail background (#3219)
jlowin Feb 18, 2026
0bbc686
v3.0.0 release notes, changelog, and README updates (#3222)
jlowin Feb 18, 2026
29e05fb
Fix v3.0.0 changelog compare link: v2.14.5, not v2.14.1 (#3223)
jlowin Feb 18, 2026
cf1f79a
Sync README with welcome.mdx, fix install count (#3224)
jlowin Feb 18, 2026
6a25e00
Document dict-to-Message prompt migration in v2 upgrade guide (#3225)
jlowin Feb 19, 2026
e06b3db
Fix v2 upgrade guide: remove incorrect v1 import advice (#3226)
jlowin Feb 19, 2026
21f045a
Fix MDX parse error: escape curly braces in upgrade guide prompts (#3…
jlowin Feb 19, 2026
9bb4154
Fix non-serializable state lost between middleware and tools (#3234)
jlowin Feb 19, 2026
41e523b
Accept callables in Tool.from_tool() (#3235)
jlowin Feb 19, 2026
2e98df2
Animated (#3231)
jlowin Feb 19, 2026
a456000
Document mounted server state store isolation in upgrade guide (#3236)
jlowin Feb 19, 2026
7474a43
Preserve skill metadata through provider wrapping (#3237)
jlowin Feb 19, 2026
e9bd701
Fix dedupe bot labeling pipeline (#3244)
jlowin Feb 20, 2026
c4232af
Fix circular reference crash in OpenAPI schemas (#3245)
jlowin Feb 20, 2026
2447874
Fix NameError with future annotations and Context/Depends parameters …
jlowin Feb 20, 2026
b5ff3a3
Fix Marvin app token to use PrefectHQ org installation (#3249)
jlowin Feb 20, 2026
d23cfec
Update Marvin workflow models to claude-sonnet-4-6 (#3250)
jlowin Feb 20, 2026
fad0442
Add verify_id_token option to OIDCProxy (#3248)
jlowin Feb 20, 2026
8c1781a
Fix ty ignore syntax in OpenAPI provider (#3253)
jlowin Feb 20, 2026
8554e74
Use max_completion_tokens instead of deprecated max_tokens in OpenAI …
jlowin Feb 21, 2026
2a13444
Fix ty compatibility with upgraded deps (#3257)
jlowin Feb 21, 2026
b8b1f5d
Fix decorator overload return types for function mode (#3258)
jlowin Feb 21, 2026
04b9aa8
Add v3.0.1 release notes (#3259)
jlowin Feb 21, 2026
30ba92e
fix: prevent MCP transport auth header from leaking to downstream Ope…
stakeswky Feb 21, 2026
8b03c64
Allow Marvin to open PRs on comment (#3267)
strawgate Feb 21, 2026
3cff055
Revert to long-lived PR approach for auto-generated docs/schema (#3272)
jlowin Feb 22, 2026
5679646
fix: propagate origin_request_id to background task workers (#3175)
gfortaine Feb 22, 2026
4809644
docs: add context-aware tool factory example (#3264)
machov Feb 22, 2026
692e711
Add v3.0.2 release notes (#3276)
jlowin Feb 22, 2026
bd9af1b
fix: remove position override from docs banner CSS (#3282)
jlowin Feb 23, 2026
a387805
fix: Replace hardcoded TTL with DEFAULT_TTL_MS - issue #3279 (#3280)
cedric57 Feb 23, 2026
5badc56
fix: stop suppressing server stderr in fastmcp call (#3283)
jlowin Feb 23, 2026
a43ea31
fix: skip max_completion_tokens when maxTokens is None (#3284)
eon01 Feb 24, 2026
db16430
Fix link to loq repository in AGENTS.md (#3289)
jlowin Feb 25, 2026
ac595cb
reverse CLAUDE.md/AGENTS.md symlink direction (#3294)
jlowin Feb 25, 2026
72f1abc
Lazy-load heavy imports to reduce import time
jlowin Feb 25, 2026
7f3b3c6
Lazily expose server.dependencies instead of dropping it
jlowin Feb 25, 2026
d12cca6
Add http_client parameter to token verifiers for connection pooling
claude Feb 25, 2026
be76fda
Raise error when http_client and ssrf_safe=True are both provided
claude Feb 25, 2026
ef5bff1
Allow http_client with static public_key in JWTVerifier
claude Feb 25, 2026
d08b3c6
Add in-memory caching for token introspection results (#3298)
jlowin Feb 26, 2026
6242708
Add SessionStart hook to install gh CLI in cloud sessions (#3308)
jlowin Feb 26, 2026
e17dbbe
chore: Update SDK documentation (#3273)
marvin-context-protocol[bot] Feb 26, 2026
9c2099d
Fix ty 0.0.19 type errors (#3310)
jlowin Feb 26, 2026
69775e0
OpenAPI: rewrite $ref under propertyNames and patternProperties in _r…
manojPal23234 Feb 26, 2026
5170fa6
Remove stale add_resource() key parameter from docs (#3309)
jlowin Feb 26, 2026
3fed4e2
feat: Search transforms for tool discovery (#3154)
jlowin Feb 27, 2026
f248375
Update docs/servers/server.mdx(Fix "FastMCP Constructor Parameters")
wangyy04 Feb 27, 2026
7e789c6
Fix stale docs: update tag filtering API and add output_schema ParamF…
jlowin Feb 27, 2026
6d703b3
Add experimental CodeMode transform (#3297)
aaazzam Feb 27, 2026
1bf117c
Narrate search example clients (#3321)
jlowin Feb 27, 2026
7ff0a68
Add Prefab Apps integration for MCP tool UIs (#3316)
jlowin Feb 27, 2026
3319586
Add resource limits to MontySandboxProvider
jlowin Feb 28, 2026
01534ed
Accept transforms as FastMCP init kwarg
jlowin Feb 27, 2026
f3e5f00
Use transforms= kwarg in docs examples
jlowin Feb 27, 2026
efcd143
Document transforms kwarg in server constructor reference
jlowin Feb 28, 2026
560ec64
Document resource limits for MontySandboxProvider
jlowin Feb 28, 2026
660a4df
Improve code-mode docs formatting; add docs formatting guideline
jlowin Feb 28, 2026
870f2bb
Fix symlink note in CLAUDE.md
jlowin Feb 28, 2026
6612484
Don't advertise sampling.tools capability by default
claude Feb 28, 2026
324219e
Add tests for default sampling capability (issue #3329)
claude Feb 28, 2026
70345e6
Split large test files to comply with loq line limit (#3328)
jlowin Feb 28, 2026
f3581a7
Handle AuthorizationError as exclusion in AuthMiddleware list hooks
yangbaechu Mar 1, 2026
dee90b8
Add -m/--module flag to fastmcp run and dev inspector
dgenio Feb 28, 2026
d5f2e26
Skip load_server() in inspector when --module is active
dgenio Feb 28, 2026
526181e
Use bare python for module mode when uv wraps the command
dgenio Feb 28, 2026
08da7dc
Fix module mode docstring example order
dgenio Feb 28, 2026
7625789
Add integration tests for module mode in run and inspector
dgenio Feb 28, 2026
eab6c0c
Apply ruff formatting to test file
dgenio Feb 28, 2026
806372d
Address maintainer review: reload support, type annotation, test imports
dgenio Mar 1, 2026
f393c65
Add search_result_serializer hook and serialize_tools_for_output_mark…
MagnusS0 Mar 1, 2026
7e24137
Add MultiAuth for composing multiple token verification sources (#3335)
jlowin Mar 2, 2026
715a881
Fix flaky timing test on Windows CI
geopopos Mar 2, 2026
ab07900
Fix flaky SSE timeout test
jlowin Mar 1, 2026
4430a86
Bump tool sleep to actually validate timeout precedence
jlowin Mar 1, 2026
a652f37
Add reverse proxy (nginx) section to HTTP deployment docs
dgenio Mar 1, 2026
0b7856e
Add SSE Polling cross-reference to nginx timeout guidance
dgenio Mar 1, 2026
601ee80
Add proxy_set_header Connection '' to nginx configs
dgenio Mar 1, 2026
7b8f2ad
Adds PropelAuth as an AuthProvider
andrew-propelauth Feb 27, 2026
d3d1875
Replace vendored DI with uncalled-for (#3301)
chrisguidry Mar 2, 2026
6ab180d
Decompose CodeMode into composable discovery tools (#3354)
jlowin Mar 2, 2026
288135a
Remove system role references from docs (#3356)
jlowin Mar 2, 2026
994415c
Fix session persistence across tool calls in multi-server MCPConfigTr…
jer805 Mar 2, 2026
7b48c89
chore: Update SDK documentation (#3313)
marvin-context-protocol[bot] Mar 2, 2026
b2e3a7b
feat(contrib): auto-sync MCPMixin decorators with from_function signa…
AnkeshThakur Mar 2, 2026
03959bc
Add Google GenAI Sampling Handler (#2977)
strawgate Mar 2, 2026
28ef22b
Add ListTools, search limit, and catalog size annotation to CodeMode …
jlowin Mar 2, 2026
9c26a19
Add FASTMCP_TRANSPORT setting for default transport selection (#1796)
jvdmr Mar 2, 2026
34a5ac6
Add include_unversioned option to VersionFilter (#3349)
yangbaechu Mar 3, 2026
e317f8f
Restructure docs navigation: CLI section, Composition, More (#3361)
jlowin Mar 3, 2026
11d4dcb
Add early-development warning to Prefab docs (#3362)
jlowin Mar 3, 2026
675b61f
Update docs banner and fix mobile layout
jlowin Mar 3, 2026
aebc77f
Remove form-action from default consent CSP, forward consent_csp_poli…
jlowin Mar 3, 2026
9b9262f
Fix resource templates with query params on mounted servers
jlowin Mar 3, 2026
6810aae
Fix flaky test_multi_client_lifespan and test_multi_client_force_close
jlowin Mar 3, 2026
fabfbc3
Increase uv transport test timeout to 60s for cold-start CI
jlowin Mar 3, 2026
53c4e5a
Remove stale catalog cache from CodeMode execute
jlowin Mar 3, 2026
b0409a1
Deduplicate versioned tools in CatalogTransform.get_tool_catalog()
jlowin Mar 3, 2026
59acb2d
Add test: VersionFilter applied before CatalogTransform is respected
jlowin Mar 3, 2026
3e88cf2
chore: Update SDK documentation
marvin-context-protocol[bot] Mar 3, 2026
f897a0d
Fix ty 0.0.20 compatibility and improve upgrade check notifications
jlowin Mar 3, 2026
3632ece
Fix uv sync flag in upgrade check notification
jlowin Mar 3, 2026
23c1d42
Add tag to docs
jlowin Mar 4, 2026
cee4ff8
Add settings and environment variables reference (#3384)
jlowin Mar 4, 2026
12c7316
feat: add `--config-path` flag to claude-desktop install command (#3380)
Sumanshu-Nankana Mar 4, 2026
d8ac9f7
Forward scopes_supported through RemoteAuthProvider subclasses (#3388)
jlowin Mar 4, 2026
52d07e8
Fix auto-close MRE script posting comment without closing (#3386)
jlowin Mar 4, 2026
8b065df
Fix WorkOS token scope verification bypass 🤖 Generated with Codex (#3…
jlowin Mar 6, 2026
775d424
Bind Discord token verifier to client ID (#3405)
jlowin Mar 6, 2026
fe55147
Support ImageContent and AudioContent in Message class
ericrobinson-indeed Mar 5, 2026
8f393e1
Widen CachableMessage.content to match Message content types
jlowin Mar 6, 2026
39d947c
Deprecate PromptToolMiddleware and ResourceToolMiddleware (#3389)
jlowin Mar 6, 2026
d32fcec
Fix initialize McpError fallthrough 🤖 Generated with Codex (#3413)
jlowin Mar 6, 2026
ec24c16
Escape client_id in OAuth consent details (#3418)
jlowin Mar 6, 2026
1ff62f2
Bound client auto-pagination loops to prevent unbounded list fetches …
jlowin Mar 6, 2026
10f6ece
Raise ValueError for invalid boolean query params in resource templat…
jlowin Mar 7, 2026
f3f5ded
Validate workspace path is a directory in cursor install (#3426) (#3435)
jlowin Mar 7, 2026
222c969
Validate version metadata to reject non-scalar types (#3437)
jlowin Mar 7, 2026
9b5ee91
Bind AWS Cognito token verification to configured app client (#3406)
jlowin Mar 7, 2026
47c67c7
Avoid stale context leakage when proxying with an already‑connected P…
jlowin Mar 7, 2026
8db3740
Block out-of-skill symlink hashing in skills scan (#3410)
jlowin Mar 7, 2026
6ba2980
Harden fastmcp metadata parsing in proxy paths (#3412)
jlowin Mar 7, 2026
6f94ce7
Re-hash response cache keys 🤖 Generated with GPT-5.2-Codex (#3414)
jlowin Mar 7, 2026
055cd5f
Handle missing npx.cmd fallback on Windows 🤖 Generated with GPT-5.2-C…
jlowin Mar 7, 2026
b279112
Guard OAuth callback result from post-completion overwrites (#3417)
jlowin Mar 7, 2026
c54f9a6
Block HS* algorithms when JWTVerifier is configured with JWKS (#3419)
jlowin Mar 7, 2026
c318562
Fix transform arg collisions with passthrough params (#3431)
jlowin Mar 7, 2026
75a69c0
Guard default progress handler against zero totals (#3432)
jlowin Mar 7, 2026
4b2d602
Block recursive self-invocation in BulkToolCaller (#3433)
jlowin Mar 7, 2026
d8fe7e4
Fix get_* returning None when latest version is disabled (#3439)
jlowin Mar 7, 2026
12f007c
Fix server lifespan overlap teardown (#3415)
jlowin Mar 7, 2026
8cdd132
Fix $ref output schema object detection regression (#3420)
jlowin Mar 7, 2026
1980d8c
Preserve kw-only defaults when rebuilding functions for resolved anno…
jlowin Mar 7, 2026
4427d6c
Redact sensitive headers in OpenAPI provider debug logging (#3436)
jlowin Mar 7, 2026
84accee
Fix async partial callables rejected by iscoroutinefunction (#3438)
jlowin Mar 7, 2026
e17c93d
Block insecure HS* JWT verification with JWKS/public keys (#3430)
jlowin Mar 7, 2026
72fab7f
Sanitize untrusted output in `fastmcp list` and `fastmcp call` (#3409)
jlowin Mar 7, 2026
f75beb6
remote sync plus admin-ui
svkrishna Mar 8, 2026
530292d
Stop tracking admin-ui/node_modules and add node_modules to .gitignore
svkrishna Mar 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 7 additions & 0 deletions .ccignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
.pre-commit-config.yaml
.github/
docs/changelog.mdx
docs/python-sdk/
examples/
src/fastmcp/contrib/
tests/contrib/
26 changes: 26 additions & 0 deletions .claude/hooks/session-init.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#!/bin/bash
set -e

# Only run in remote/cloud environments
if [ "$CLAUDE_CODE_REMOTE" != "true" ]; then
exit 0
fi

command -v gh &> /dev/null && exit 0

LOCAL_BIN="$HOME/.local/bin"
mkdir -p "$LOCAL_BIN"

ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/')
VERSION=$(curl -fsSL https://api.github.com/repos/cli/cli/releases/latest | grep '"tag_name"' | cut -d'"' -f4)
TARBALL="gh_${VERSION#v}_linux_${ARCH}.tar.gz"

echo "Installing gh ${VERSION}..."
TEMP=$(mktemp -d)
trap 'rm -rf "$TEMP"' EXIT
curl -fsSL "https://github.com/cli/cli/releases/download/${VERSION}/${TARBALL}" | tar -xz -C "$TEMP"
cp "$TEMP"/gh_*/bin/gh "$LOCAL_BIN/gh"
chmod 755 "$LOCAL_BIN/gh"

[ -n "$CLAUDE_ENV_FILE" ] && echo "export PATH=\"$LOCAL_BIN:\$PATH\"" >> "$CLAUDE_ENV_FILE"
echo "gh installed: $("$LOCAL_BIN/gh" --version | head -1)"
15 changes: 15 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "bash \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/session-init.sh",
"timeout": 120
}
]
}
]
}
}
94 changes: 94 additions & 0 deletions .claude/skills/code-review/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
---
name: reviewing-code
description: Review code for quality, maintainability, and correctness. Use when reviewing pull requests, evaluating code changes, or providing feedback on implementations. Focuses on API design, patterns, and actionable feedback.
---

# Code Review

## Philosophy

Code review maintains a healthy codebase while helping contributors succeed. The burden of proof is on the PR to demonstrate it adds value. Your job is to help it get there through actionable feedback.

**Critical**: A perfectly written PR that adds unwanted functionality must still be rejected. The code must advance the codebase in the intended direction. When rejecting, provide clear guidance on how to align with project goals.

Be friendly and welcoming while maintaining high standards. Call out what works well. When code needs improvement, be specific about why and how to fix it.

## What to Focus On

### Does this advance the codebase correctly?

Even perfect code for unwanted features should be rejected.

### API design and naming

Identify confusing patterns or non-idiomatic code:
- Parameter values that contradict defaults
- Mutable default arguments
- Unclear naming that will confuse future readers
- Inconsistent patterns with the rest of the codebase

### Specific improvements

Provide actionable feedback, not generic observations.

### User ergonomics

Think about the API from a user's perspective. Is it intuitive? What's the learning curve?

## For Agent Reviewers

1. **Read the full context**: Examine related files, tests, and documentation before reviewing
2. **Check against established patterns**: Look for consistency with codebase conventions
3. **Verify functionality claims**: Understand what the code actually does, not just what it claims
4. **Consider edge cases**: Think through error conditions and boundary scenarios

## What to Avoid

- Generic feedback without specifics
- Hypothetical problems unlikely to occur
- Nitpicking organizational choices without strong reason
- Summarizing what the PR already describes
- Star ratings or excessive emojis
- Bikeshedding style preferences when functionality is correct
- Requesting changes without suggesting solutions
- Focusing on personal coding style over project conventions

## Tone

- Acknowledge good decisions: "This API design is clean"
- Be direct but respectful
- Explain impact: "This will confuse users because..."
- Remember: Someone else maintains this code forever

## Decision Framework

Before approving, ask:

1. Does this PR achieve its stated purpose?
2. Is that purpose aligned with where the codebase should go?
3. Would I be comfortable maintaining this code?
4. Have I actually understood what it does, not just what it claims?
5. Does this change introduce technical debt?

If something needs work, your review should help it get there through specific, actionable feedback. If it's solving the wrong problem, say so clearly.

## Comment Examples

**Good comments:**

| Instead of | Write |
|------------|-------|
| "Add more tests" | "The `handle_timeout` method needs tests for the edge case where timeout=0" |
| "This API is confusing" | "The parameter name `data` is ambiguous - consider `message_content` to match the MCP specification" |
| "This could be better" | "This approach works but creates a circular dependency. Consider moving the validation to `utils/validators.py`" |

## Checklist

Before approving, verify:

- [ ] All required development workflow steps completed (uv sync, prek, pytest)
- [ ] Changes align with repository patterns and conventions
- [ ] API changes are documented and backwards-compatible where possible
- [ ] Error handling follows project patterns (specific exception types)
- [ ] Tests cover new functionality and edge cases
- [ ] The change advances the codebase in the intended direction
220 changes: 220 additions & 0 deletions .claude/skills/python-tests/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,220 @@
---
name: testing-python
description: Write and evaluate effective Python tests using pytest. Use when writing tests, reviewing test code, debugging test failures, or improving test coverage. Covers test design, fixtures, parameterization, mocking, and async testing.
---

# Writing Effective Python Tests

## Core Principles

Every test should be **atomic**, **self-contained**, and test **single functionality**. A test that tests multiple things is harder to debug and maintain.

## Test Structure

### Atomic unit tests

Each test should verify a single behavior. The test name should tell you what's broken when it fails. Multiple assertions are fine when they all verify the same behavior.

```python
# Good: Name tells you what's broken
def test_user_creation_sets_defaults():
user = User(name="Alice")
assert user.role == "member"
assert user.id is not None
assert user.created_at is not None

# Bad: If this fails, what behavior is broken?
def test_user():
user = User(name="Alice")
assert user.role == "member"
user.promote()
assert user.role == "admin"
assert user.can_delete_others()
```

### Use parameterization for variations of the same concept

```python
import pytest

@pytest.mark.parametrize("input,expected", [
("hello", "HELLO"),
("World", "WORLD"),
("", ""),
("123", "123"),
])
def test_uppercase_conversion(input, expected):
assert input.upper() == expected
```

### Use separate tests for different functionality

Don't parameterize unrelated behaviors. If the test logic differs, write separate tests.

## Project-Specific Rules

### No async markers needed

This project uses `asyncio_mode = "auto"` globally. Write async tests without decorators:

```python
# Correct
async def test_async_operation():
result = await some_async_function()
assert result == expected

# Wrong - don't add this
@pytest.mark.asyncio
async def test_async_operation():
...
```

### Imports at module level

Put ALL imports at the top of the file:

```python
# Correct
import pytest
from fastmcp import FastMCP
from fastmcp.client import Client

async def test_something():
mcp = FastMCP("test")
...

# Wrong - no local imports
async def test_something():
from fastmcp import FastMCP # Don't do this
...
```

### Use in-memory transport for testing

Pass FastMCP servers directly to clients:

```python
from fastmcp import FastMCP
from fastmcp.client import Client

mcp = FastMCP("TestServer")

@mcp.tool
def greet(name: str) -> str:
return f"Hello, {name}!"

async def test_greet_tool():
async with Client(mcp) as client:
result = await client.call_tool("greet", {"name": "World"})
assert result[0].text == "Hello, World!"
```

Only use HTTP transport when explicitly testing network features.

### Inline snapshots for complex data

Use `inline-snapshot` for testing JSON schemas and complex structures:

```python
from inline_snapshot import snapshot

def test_schema_generation():
schema = generate_schema(MyModel)
assert schema == snapshot() # Will auto-populate on first run
```

Commands:
- `pytest --inline-snapshot=create` - populate empty snapshots
- `pytest --inline-snapshot=fix` - update after intentional changes

## Fixtures

### Prefer function-scoped fixtures

```python
@pytest.fixture
def client():
return Client()

async def test_with_client(client):
result = await client.ping()
assert result is not None
```

### Use `tmp_path` for file operations

```python
def test_file_writing(tmp_path):
file = tmp_path / "test.txt"
file.write_text("content")
assert file.read_text() == "content"
```

## Mocking

### Mock at the boundary

```python
from unittest.mock import patch, AsyncMock

async def test_external_api_call():
with patch("mymodule.external_client.fetch", new_callable=AsyncMock) as mock:
mock.return_value = {"data": "test"}
result = await my_function()
assert result == {"data": "test"}
```

### Don't mock what you own

Test your code with real implementations when possible. Mock external services, not internal classes.

## Test Naming

Use descriptive names that explain the scenario:

```python
# Good
def test_login_fails_with_invalid_password():
def test_user_can_update_own_profile():
def test_admin_can_delete_any_user():

# Bad
def test_login():
def test_update():
def test_delete():
```

## Error Testing

```python
import pytest

def test_raises_on_invalid_input():
with pytest.raises(ValueError, match="must be positive"):
calculate(-1)

async def test_async_raises():
with pytest.raises(ConnectionError):
await connect_to_invalid_host()
```

## Running Tests

```bash
uv run pytest -n auto # Run all tests in parallel
uv run pytest -n auto -x # Stop on first failure
uv run pytest path/to/test.py # Run specific file
uv run pytest -k "test_name" # Run tests matching pattern
uv run pytest -m "not integration" # Exclude integration tests
```

## Checklist

Before submitting tests:
- [ ] Each test tests one thing
- [ ] No `@pytest.mark.asyncio` decorators
- [ ] Imports at module level
- [ ] Descriptive test names
- [ ] Using in-memory transport (not HTTP) unless testing networking
- [ ] Parameterization for variations of same behavior
- [ ] Separate tests for different behaviors
3 changes: 3 additions & 0 deletions .coderabbit.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
reviews:
path_filters:
- "!docs/python-sdk/**"
13 changes: 13 additions & 0 deletions .cursor/rules/core-mcp-objects.mdc
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
description:
globs:
alwaysApply: true
---
There are four major MCP object types:

- Tools (src/tools/)
- Resources (src/resources/)
- Resource Templates (src/resources/)
- Prompts (src/prompts)

While these have slightly different semantics and implementations, in general changes that affect interactions with any one (like adding tags, importing, etc.) will need to be adopted, applied, and tested on all others. Note that while resources and resource templates are different objects, they are both in `src/resources/`.
Loading
Loading