Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
183 commits
Select commit Hold shift + click to select a range
d4a8354
Add settings and environment variables reference (#3384)
jlowin Mar 4, 2026
34d848b
feat: add `--config-path` flag to claude-desktop install command (#3380)
Sumanshu-Nankana Mar 4, 2026
1c64d1c
Forward scopes_supported through RemoteAuthProvider subclasses (#3388)
jlowin Mar 4, 2026
519f9c5
Fix auto-close MRE script posting comment without closing (#3386)
jlowin Mar 4, 2026
b8c37bf
Fix WorkOS token scope verification bypass 🤖 Generated with Codex (#3…
jlowin Mar 6, 2026
216f43d
Bind Discord token verifier to client ID (#3405)
jlowin Mar 6, 2026
9319a2c
Support ImageContent and AudioContent in Message class
ericrobinson-indeed Mar 5, 2026
72d04d7
Widen CachableMessage.content to match Message content types
jlowin Mar 6, 2026
e3b6b0c
Deprecate PromptToolMiddleware and ResourceToolMiddleware (#3389)
jlowin Mar 6, 2026
56b1655
Fix initialize McpError fallthrough 🤖 Generated with Codex (#3413)
jlowin Mar 6, 2026
799c4f1
Escape client_id in OAuth consent details (#3418)
jlowin Mar 6, 2026
85c71fa
Bound client auto-pagination loops to prevent unbounded list fetches …
jlowin Mar 6, 2026
9ccaef2
Raise ValueError for invalid boolean query params in resource templat…
jlowin Mar 7, 2026
fadb630
Validate workspace path is a directory in cursor install (#3426) (#3435)
jlowin Mar 7, 2026
9ec4e7a
Validate version metadata to reject non-scalar types (#3437)
jlowin Mar 7, 2026
1708e53
Bind AWS Cognito token verification to configured app client (#3406)
jlowin Mar 7, 2026
163c168
Avoid stale context leakage when proxying with an already‑connected P…
jlowin Mar 7, 2026
ea19a2a
Block out-of-skill symlink hashing in skills scan (#3410)
jlowin Mar 7, 2026
706b56d
Harden fastmcp metadata parsing in proxy paths (#3412)
jlowin Mar 7, 2026
0b97aca
Re-hash response cache keys 🤖 Generated with GPT-5.2-Codex (#3414)
jlowin Mar 7, 2026
dcaeef0
Handle missing npx.cmd fallback on Windows 🤖 Generated with GPT-5.2-C…
jlowin Mar 7, 2026
544f072
Guard OAuth callback result from post-completion overwrites (#3417)
jlowin Mar 7, 2026
901d8cd
Block HS* algorithms when JWTVerifier is configured with JWKS (#3419)
jlowin Mar 7, 2026
d316f19
Fix transform arg collisions with passthrough params (#3431)
jlowin Mar 7, 2026
44b8238
Guard default progress handler against zero totals (#3432)
jlowin Mar 7, 2026
297880b
Block recursive self-invocation in BulkToolCaller (#3433)
jlowin Mar 7, 2026
9f8347d
Fix get_* returning None when latest version is disabled (#3439)
jlowin Mar 7, 2026
6637bce
Fix server lifespan overlap teardown (#3415)
jlowin Mar 7, 2026
ceb8ff1
Fix $ref output schema object detection regression (#3420)
jlowin Mar 7, 2026
58e25cc
Preserve kw-only defaults when rebuilding functions for resolved anno…
jlowin Mar 7, 2026
bafd541
Redact sensitive headers in OpenAPI provider debug logging (#3436)
jlowin Mar 7, 2026
ad517d0
Fix async partial callables rejected by iscoroutinefunction (#3438)
jlowin Mar 7, 2026
5ed1465
Block insecure HS* JWT verification with JWKS/public keys (#3430)
jlowin Mar 7, 2026
08f590f
Sanitize untrusted output in `fastmcp list` and `fastmcp call` (#3409)
jlowin Mar 7, 2026
3030833
Add FastMCPApp — a Provider for composable MCP applications (#3385)
jlowin Mar 9, 2026
f082057
fix: add version to components (#3458)
martimfasantos Mar 13, 2026
33c3acf
fix: use intent-based flag for OIDC scope patch in load_access_token …
voidborne-d Mar 13, 2026
2c451bf
chore: Update SDK documentation (#3378)
marvin-context-protocol[bot] Mar 13, 2026
f7d46e7
Add dependency version compatibility guidance to code-review skill
jlowin Mar 13, 2026
e1338e0
Set readOnlyHint=True on ResourcesAsTools generated tools
jlowin Mar 13, 2026
59a6fb3
fix: normalize Google scope shorthands and surface valid_scopes (#3477)
jlowin Mar 13, 2026
cfff8e8
remove "good first issue" from triage workflow (#3482)
jlowin Mar 13, 2026
a52036e
Cache component lists in ProxyProvider (#3479)
jlowin Mar 13, 2026
e41e1fe
fix: resolve ty 0.0.23 type-checking errors and bump pin (#3481)
jlowin Mar 13, 2026
24d7aef
fix: shield lifespan teardown from cancellation (#3480)
jlowin Mar 13, 2026
fcae127
Bump authlib (#3390)
dependabot[bot] Mar 13, 2026
68e76fe
fix: forward custom_route endpoints from mounted servers (#3462)
voidborne-d Mar 14, 2026
e2bdc92
Support logging/setLevel and add client_log_level setting (#3491)
jlowin Mar 14, 2026
139d2d8
Propagate x-fastmcp-wrap-result in tool result _meta (#3490)
jlowin Mar 14, 2026
7235029
feat: type require_authorization_consent as bool | Literal["external"…
mtthidoteu Mar 14, 2026
0b8479a
Add `verify` parameter for SSL certificate configuration (#3487)
jlowin Mar 14, 2026
dc7ae0b
fix: remove hardcoded version from CLI help text (#3456)
saschabuehrle Mar 14, 2026
11960b1
fix: monty 0.0.8 compatibility, drop external_functions from construc…
hkc5 Mar 14, 2026
e35a74f
Add fastmcp dev apps command with browser UI preview (#3489)
jlowin Mar 14, 2026
cedf734
fix: task test teardown hanging 5s per test (#3499)
jlowin Mar 14, 2026
32f1118
Expose minimum_check_interval, reduce task pickup latency (#3500)
jlowin Mar 14, 2026
01c57a9
fix: validate workspace path is a directory before cursor install (#3…
nightcityblade Mar 14, 2026
ca8069c
Enforce per-tool auth checks in SamplingTool.from_callable_tool wrapp…
jlowin Mar 14, 2026
d5d5c45
Add contributing guidelines and update issue/PR templates (#3485)
jlowin Mar 14, 2026
5ff64ce
fix: handle re.error from malformed URI templates in build_regex (#3501)
jlowin Mar 14, 2026
71ba030
fix: reject empty/OIDC-only required_scopes in AzureProvider (#3503)
jlowin Mar 14, 2026
7017106
fix: restrict $ref resolution to local refs only (SSRF/LFI) (#3502)
jlowin Mar 14, 2026
9be42d9
perf: reduce PBKDF2 iterations in tests, fix warnings and timeouts (#…
jlowin Mar 14, 2026
959ac2b
Auto-close upgrade check issue when build passes (#3505)
jlowin Mar 14, 2026
c861862
Add too-long label to Marvin triage workflow (#3508)
jlowin Mar 14, 2026
40bdfb6
fix: URL-encode path params to prevent SSRF/path traversal (GHSA-vv7q…
jlowin Mar 15, 2026
abc8987
Bump actions/create-github-app-token from 2 to 3 (#3511)
dependabot[bot] Mar 15, 2026
ea529f6
feat: make upstream_client_secret optional in OAuthProxy (#3486)
jlowin Mar 15, 2026
b720fc5
fix: prevent path traversal in skill download (#3493)
jlowin Mar 15, 2026
3bea192
fix: prefer IdP-granted scopes over client-requested scopes in OAuthP…
jlowin Mar 15, 2026
226bfb4
fix: remove forced follow_redirects from httpx_client_factory calls (…
jlowin Mar 15, 2026
d1ed7cd
Bump PyJWT >= 2.12.0 (CVE-2026-32597) (#3515)
jlowin Mar 15, 2026
b5a4503
Add security label to triage and release notes (#3516)
jlowin Mar 15, 2026
32dfe50
Treat refresh_expires_in=0 as missing, fall back to 30-day default (#…
jlowin Mar 15, 2026
943af98
move stateless_http transport kwarg to http_app as FastMCP constructo…
mhallo Mar 15, 2026
00ed31f
Upgrade examples/testing_demo lockfile, drops diskcache (CVE-2025-698…
jlowin Mar 15, 2026
e0455fe
Update security policy (#3521)
jlowin Mar 15, 2026
93753e1
Claude/review contributor guidelines (#3517)
jlowin Mar 15, 2026
8fdb3cc
fix: CSRF double-submit cookie check in consent flow (#3519)
jlowin Mar 15, 2026
b2d4cc9
fix: validate server names in install commands (#3522)
jlowin Mar 15, 2026
b0b3a6d
fix: use raw strings for regex in pytest.raises match (#3523)
jlowin Mar 15, 2026
bb37c3b
fix: reject refresh tokens used as Bearer access tokens (#3524)
jlowin Mar 15, 2026
f9ed061
fix: route ResourcesAsTools/PromptsAsTools through server middleware …
jlowin Mar 15, 2026
25d550c
chore: Update SDK documentation (#3478)
marvin-context-protocol[bot] Mar 15, 2026
3407671
chore: gitignore .claude/worktrees/ (#3529)
jlowin Mar 16, 2026
6bffb22
pin pydantic-monty to 0.0.8 (#3539)
jlowin Mar 17, 2026
360c9c3
fix: resolve Pyright "Module is not callable" on @tool, @resource, @p…
jlowin Mar 17, 2026
754fb01
chore: Update SDK documentation (#3541)
marvin-context-protocol[bot] Mar 18, 2026
62dcea6
chore(deps): bump pyasn1 in the uv group across 1 directory (#3538)
dependabot[bot] Mar 18, 2026
a50dcd8
fix: filter warnings by message in KEY_PREFIX test (#3549)
jlowin Mar 18, 2026
9aa31d5
fix: suppress output schema for ToolResult subclass annotations (#3548)
jlowin Mar 18, 2026
734b93b
Support ImageContent and AudioContent in sampling handlers (#3550)
jlowin Mar 18, 2026
02d55de
Graceful degradation for multi-server proxy setup (#3546)
jlowin Mar 18, 2026
269c9c9
Extract TokenCache utility, add caching to GitHubTokenVerifier (#3547)
jlowin Mar 18, 2026
ff20c56
Add review-pr skill for Codex bot workflow (#3552)
jlowin Mar 18, 2026
27e65fc
Bump anthropic minimum to 0.48.0 for Base64ImageSourceParam (#3553)
jlowin Mar 18, 2026
55094fd
chore: Update SDK documentation (#3551)
marvin-context-protocol[bot] Mar 18, 2026
f01c8fd
Update startup banner deploy URL to Prefect Horizon (#3557)
zzstoatzz Mar 19, 2026
196e2b4
fix: increase sleep duration in proxy cache tests (#3567)
strawgate Mar 21, 2026
faef74b
fix: store absolute token expiry to prevent stale expires_in on reloa…
jlowin Mar 21, 2026
85faad5
Add MCP message inspector to dev apps UI (#3570)
jlowin Mar 21, 2026
1be9b4d
Comprehensive MCP Apps docs, string CallTool resolution (#3575)
jlowin Mar 21, 2026
718ed8b
fix: preserve tool properties named 'title' during schema compression…
jlowin Mar 22, 2026
2d7bc4e
Add `encoding` parameter to `FileResource` (#3580)
shulkx Mar 22, 2026
9d1a9cc
Add release instructions to CLAUDE.md (#3583)
jlowin Mar 22, 2026
d27c26e
Replace UUID global keys with (app_name, tool_name) registry (#3585)
jlowin Mar 22, 2026
52feff6
Transparently refresh upstream token in OAuthProxy.load_access_token(…
jlowin Mar 22, 2026
96497ac
Route app tool calls through provider chain, remove process-level reg…
jlowin Mar 22, 2026
204e566
Fix loopback redirect URI port matching per RFC 8252 §7.3 (#3589)
radoshi Mar 22, 2026
e5dce51
Fix app tool routing: visibility check and middleware propagation (#3…
jlowin Mar 22, 2026
352525c
chore: Update SDK documentation (#3573)
marvin-context-protocol[bot] Mar 22, 2026
b92f566
chore(deps): bump j178/prek-action from 1 to 2 (#3578)
dependabot[bot] Mar 22, 2026
6f30e89
Fix query parameter serialization to respect OpenAPI explode/style se…
jlowin Mar 23, 2026
d23f553
Fix dev apps form: union types, textarea support, JSON parsing (#3597)
jlowin Mar 23, 2026
39af268
Dev apps: show more/less for long tool descriptions (#3600)
jlowin Mar 23, 2026
c04ce89
Apps Phase 1: docs, examples, app-only tool filtering (#3593)
jlowin Mar 24, 2026
7c98326
Forward enable_cimd to OAuthProxy in all provider subclasses (#3608)
jlowin Mar 24, 2026
6f4df1e
Tune too-long triage heuristic (#3610)
jlowin Mar 24, 2026
ca76b82
Respect OpenAPI content type in request body serialization (#3611)
jlowin Mar 24, 2026
c397e68
Update ty ignore comments for 0.0.25 compatibility (#3614)
jlowin Mar 25, 2026
c04c9d0
chore: Update SDK documentation (#3592)
marvin-context-protocol[bot] Mar 25, 2026
1eabe7f
Move app modules to fastmcp.apps package (#3616)
jlowin Mar 25, 2026
c3f0223
fix(google): replace deprecated /oauth2/v1/tokeninfo with /oauth2/v3/…
shigechika Mar 25, 2026
00df243
Tighten too-long heuristic for design-document issues (#3620)
jlowin Mar 25, 2026
492db99
fix: resolve EntraOBOToken dependency injection through MultiAuth (#3…
jer805 Mar 25, 2026
145dbbf
chore: Update SDK documentation (#3615)
marvin-context-protocol[bot] Mar 25, 2026
ec5de0d
fix(docs): correct misleading stateless_http header (#3622)
jlowin Mar 25, 2026
6c76bea
Add tag to deployment pages (#3624)
jlowin Mar 25, 2026
65ea579
fix: filesystem provider import machinery (#3626)
strawgate Mar 26, 2026
f5804f4
fix: recover StdioTransport after subprocess exits (#3630)
strawgate Mar 27, 2026
396bf15
chore(deps): bump requests from 2.32.5 to 2.33.0 in the uv group acro…
dependabot[bot] Mar 27, 2026
b1505ba
Run MCP conformance tests in CI (#3628)
strawgate Mar 27, 2026
59a126a
fix(server): preserve mounted tool task metadata (#3632)
pandego Mar 27, 2026
ce7758e
Add GenerativeUI provider, bump prefab-ui 0.14.0 (#3647)
jlowin Mar 27, 2026
77d8b3a
fix: scope deprecation warning filter to FastMCPDeprecationWarning (#…
jlowin Mar 27, 2026
b7cb7ce
Add PrefabAppConfig for customizable Prefab tool setup (#3648)
jlowin Mar 27, 2026
4265726
Docs: generative UI page, fix imports, add PrefabAppConfig (#3650)
jlowin Mar 27, 2026
b9ea536
fix: resolve CurrentFastMCP/ctx.fastmcp to child server in mounted ba…
jlowin Mar 27, 2026
8ff28c1
Fix blocking docs issues: chart imports, Select API, Rx consistency (…
jlowin Mar 27, 2026
cd483a1
docs: improve contributor guidelines for framework contributions (#3653)
jlowin Mar 27, 2026
2a2f4c8
Clean error when dev apps ports are in use (#3658)
jlowin Mar 27, 2026
c63be5d
Add release notes for v3.1.0, v3.1.1, and v2.14.6 (#3659)
jlowin Mar 27, 2026
3e1aadb
Docs: showcase hero, narrative improvements, panel closed by default …
jlowin Mar 27, 2026
773f658
Route app tool calls via ___-prefixed names instead of _meta
jlowin Mar 28, 2026
376a4a5
Docs: add FileTreeStore sanitization warnings and update examples (#3…
strawgate Mar 28, 2026
2491993
Fix prompt caching middleware missing wrap/unwrap round-trip (#3666)
strawgate Mar 28, 2026
16eb2ff
fix: serialize object query params per OpenAPI style/explode rules (#…
4444J99 Mar 28, 2026
5683c0f
Merge pull request #3667 from PrefectHQ/app-tool-prefixed-names
jlowin Mar 28, 2026
5879119
fix: HTTP request headers not accessible in background task workers (…
pandego Mar 28, 2026
1d8a8bc
chore: Update SDK documentation (#3668)
marvin-context-protocol[bot] Mar 28, 2026
90bd4ff
fix: restore HTTP headers in worker execution path for background tas…
jlowin Mar 28, 2026
5338629
Add FileUpload provider (#3669)
jlowin Mar 28, 2026
923695b
fix: strip discriminator after dereferencing schemas (#3682)
jlowin Mar 28, 2026
8c10bb8
fix: remove stale ty:ignore directives for ty 0.0.26 (#3684)
jlowin Mar 29, 2026
beb35a4
Add Approval and Choice providers (#3686)
jlowin Mar 29, 2026
2c08ede
Add FormInput provider, bump prefab-ui to 0.15.0 (#3687)
jlowin Mar 29, 2026
d4289b2
Add prefab-ui version pinning warning to docs (#3688)
jlowin Mar 29, 2026
7ed31e4
chore(deps): bump cryptography from 46.0.5 to 46.0.6 in /examples/tes…
dependabot[bot] Mar 29, 2026
3354c40
chore: Update SDK documentation (#3670)
marvin-context-protocol[bot] Mar 29, 2026
79821c4
Reorganize apps overview TOC (#3689)
jlowin Mar 29, 2026
596210c
Fix docs gaps in app provider pages (#3690)
jlowin Mar 29, 2026
d1f7195
chore(deps): bump actions/setup-node from 4 to 6 (#3691)
dependabot[bot] Mar 29, 2026
57a7f12
Add Clerk OAuth provider (#3677)
mostafa6765 Mar 29, 2026
60d2817
Polish apps docs for 3.2 release (#3693)
jlowin Mar 29, 2026
9b89eb1
Add apps quickstart tutorial (#3695)
jlowin Mar 29, 2026
dd7d89a
fix: dev apps log panel UX improvements (#3698)
jlowin Mar 29, 2026
493989f
Improve quickstart: pie chart, interactive row selection, screenshots…
jlowin Mar 29, 2026
27abe3c
Add sales dashboard and live system monitor examples, bump prefab-ui …
jlowin Mar 30, 2026
85b7efd
chore: Update SDK documentation (#3694)
marvin-context-protocol[bot] Mar 30, 2026
f01d0c5
Add quiz example app, fix dev server empty string args (#3700)
jlowin Mar 30, 2026
961dd50
Add interactive map example with geocoding (#3702)
jlowin Mar 30, 2026
4a54be2
Add examples gallery page (#3705)
jlowin Mar 30, 2026
d274959
docs: note that custom routes are unauthenticated (#3706)
jlowin Mar 30, 2026
dd8816c
chore: Update SDK documentation (#3701)
marvin-context-protocol[bot] Mar 30, 2026
6faa2d6
Remove hardcoded prefab-ui version from pinning warnings (#3708)
jlowin Mar 30, 2026
f189d1f
Bump pydantic-monty to 0.0.9 (#3707)
jlowin Mar 30, 2026
665514e
Add forward_resource flag to OAuthProxy (#3711)
jlowin Mar 30, 2026
5be249a
fix(google): use sub (user ID) for client_id instead of aud (app ID) …
shigechika Mar 31, 2026
61f3fee
fix: use explicit None checks for JWT exp validation (#3724)
jlowin Mar 31, 2026
4f76688
chore: Update SDK documentation (#3712)
marvin-context-protocol[bot] Mar 31, 2026
c3c41b4
[codex] Add FastMCP docs telemetry (#3727)
aaazzam Mar 31, 2026
1cccdc2
chore(deps): bump fastmcp from 3.1.1 to 3.2.0 in /examples/testing_de…
dependabot[bot] Mar 31, 2026
a52ab0e
chore: Update SDK documentation (#3725)
marvin-context-protocol[bot] Mar 31, 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 .claude/skills/code-review/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,13 @@ Be friendly and welcoming while maintaining high standards. Call out what works

Even perfect code for unwanted features should be rejected.

### Dependency version compatibility

When a PR adapts code to a new version of a dependency (e.g., removing a parameter that was dropped upstream, using a new API):
- **The version pin in `pyproject.toml` must match.** If the change breaks compatibility with the previously-pinned minimum version, the minimum version must be bumped. Otherwise users on the old version get a regression.
- **If backwards compatibility with the old version is desired**, the code must handle both versions (e.g., try/except, version check). Simply deleting the old API usage without bumping the pin is always wrong — it silently breaks users on the old version.
- **Lock file (`uv.lock`) changes should be scoped to the PR's purpose.** A PR fixing a ty compatibility issue should not also include unrelated dependency version bumps (anthropic, google-auth, etc.) from running `uv sync --upgrade`. These create noise and make the diff harder to review.

### API design and naming

Identify confusing patterns or non-idiomatic code:
Expand Down
102 changes: 102 additions & 0 deletions .claude/skills/review-pr/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
---
name: review-pr
description: Monitor and respond to automated PR reviews (Codex bot). Use when pushing a PR, checking review status, or responding to bot feedback. Handles the full cycle of push -> wait for review -> evaluate comments -> fix -> re-push.
---

# PR Review Workflow

This repo has `chatgpt-codex-connector[bot]` configured as an automated reviewer. After every push to a PR branch, Codex reviews the diff and either:
- Reacts with a thumbs-up on its review body (no suggestions — PR is clean)
- Posts inline comments with suggestions (each tagged with a priority badge)

## Checking review status

After pushing, check whether Codex has reviewed the latest commit:

```bash
# Get the latest commit SHA on the branch
LATEST=$(git rev-parse HEAD)

# Check if Codex has reviewed that specific commit
gh api repos/PrefectHQ/fastmcp/pulls/{PR_NUMBER}/reviews \
| jq "[.[] | select(.user.login == \"chatgpt-codex-connector[bot]\" and .commit_id == \"$LATEST\")] | length"
```

If the count is 0, Codex hasn't reviewed the latest push yet. Wait and check again.

If the count is > 0, check for inline comments on the latest review:

```bash
# Get the review body to check for thumbs-up
gh api repos/PrefectHQ/fastmcp/pulls/{PR_NUMBER}/reviews \
| jq '[.[] | select(.user.login == "chatgpt-codex-connector[bot]") | {state, body: .body[:300], commit_id: .commit_id}] | last'
```

A clean review from Codex looks like a review body that contains a thumbs-up reaction or says "no suggestions." If the body contains "Here are some automated review suggestions," there are inline comments to evaluate.

## Evaluating Codex comments

Fetch all inline comments from Codex:

```bash
gh api repos/PrefectHQ/fastmcp/pulls/{PR_NUMBER}/comments \
| jq '[.[] | select(.user.login == "chatgpt-codex-connector[bot]") | {body, path, line, created_at}]'
```

Codex comments include priority badges:
- `P0` (red) — Critical issue, likely a real bug
- `P1` (orange) — Important, worth fixing
- `P2` (yellow) — Moderate, evaluate on merit

**How to evaluate Codex comments:**

1. **Treat Codex as a competent but sometimes overzealous reviewer.** It catches real bugs (cache eviction ordering, silent data loss, missing validation) but also suggests scope expansions and hypothetical improvements.

2. **Fix real bugs** — issues in code you actually changed where behavior is incorrect or data is silently lost.

3. **Dismiss scope expansion** — if a comment points out a pre-existing limitation unrelated to your diff, note it as a potential follow-up but don't block the PR.

4. **Dismiss speculative concerns** — if a comment describes a scenario that requires very specific conditions and the existing behavior is acceptable, dismiss it.

5. **When fixing, be proactive** — if Codex found one instance of a pattern bug (e.g., missing role validation in one handler), check all similar code paths before pushing. Codex will find the next instance on the next review cycle, so get ahead of it.

## Responding to every comment

**Every Codex comment must get a visible response** — either a fix or a reply explaining why it was dismissed. The maintainer can't see your reasoning otherwise.

- **If fixing**: The fix itself is the response. No reply needed unless the fix is non-obvious.
- **If dismissing**: Reply to the comment thread with a brief explanation of why. Keep it to 1-2 sentences. Examples:
- "This is pre-existing behavior unrelated to this diff — the scope lookup fallback existed before caching was added. Worth a follow-up issue but not blocking this PR."
- "The AsyncExitStack handles cleanup when the session exits, so the subprocess isn't leaked — just kept alive slightly longer than necessary in this edge case."
- "Gemini supports a much wider range of media types than OpenAI/Anthropic, so a restrictive allowlist would be inaccurate here."

Use `gh api` to reply (note: use `in_reply_to`, not a `/replies` sub-path):

```bash
# Reply to a specific review comment
gh api repos/PrefectHQ/fastmcp/pulls/{PR_NUMBER}/comments \
-f body="Your reply here" \
-F in_reply_to={COMMENT_ID}
```

## The fix-push-review cycle

After evaluating comments:

1. Fix all real issues in one batch
2. Reply to all dismissed comments with reasoning
3. Think about what patterns Codex might flag next — check similar code paths proactively
4. Commit and push
5. Check that Codex reviews the new commit
6. Repeat until Codex gives a clean review (thumbs-up) or only has dismissible comments

## Responding to stale comments

Codex sometimes re-posts old comments that reference code you've already fixed (they appear on the old commit's diff). These are stale — verify the fix is in the latest commit and reply noting the fix is already in place.

## When a PR is ready

A PR is ready for human review when:
- All Codex comments are either fixed or replied to with dismissal reasoning
- CI checks pass
- The diff is clean and focused on the stated purpose
27 changes: 12 additions & 15 deletions .github/ISSUE_TEMPLATE/bug.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,30 @@ description: Report a bug or unexpected behavior in FastMCP
labels: [bug, pending]

body:
- type: markdown
attributes:
value: Thanks for contributing to FastMCP! 🙏

- type: markdown
attributes:
value: |
### Before you submit
Thanks for reporting a bug!

To help us help you, please:
A good bug report is one of the most valuable contributions you can make — see [CONTRIBUTING.md](../../CONTRIBUTING.md). If the fix is straightforward, a PR is also welcome.

- 🔄 **Make sure you're testing on the latest version of FastMCP** - many issues are already fixed in newer versions
- 🔍 **Check if someone else has already reported this issue** or if it's been fixed on the main branch
- 📋 **You MUST include a copy/pasteable and properly formatted MRE** (minimal reproducible example) below or your issue may be closed without response
- 💡 **The ideal issue is a clear problem description and an MRE — that's it.** If you've done a genuine investigation and have a non-obvious insight into the root cause, include it. But please don't speculate or ask an LLM to generate a diagnosis or proposed fix. We have LLMs too, and an incorrect analysis is harder to work with than none at all.
- ✂️ **Keep it short.** A one-paragraph description and a working MRE is the ideal bug report. Issues that are difficult to parse — due to length, speculation, or generated content — may be closed without response.
### Before you submit

Thanks for helping to make FastMCP better! 🚀
- Make sure you're testing on the **latest version** of FastMCP — many issues are already fixed in newer releases
- Check if someone else has **already reported this** or if it's been fixed on the main branch
- You **must** include a copy/pasteable, properly formatted MRE (minimal reproducible example) or your issue may be closed without response
- **The ideal issue is a clear problem description and an MRE — that's it.** If you've done genuine investigation and have a non-obvious insight into the root cause, include it. But please don't speculate or ask an LLM to generate a diagnosis. We have LLMs too, and an incorrect analysis is harder to work with than none at all.
- **Keep it short.** A clear description plus a concise MRE is ideal — aim to fit in a single screen. Issues that include unsolicited root cause analysis, proposed fixes, or multi-section diagnostic writeups will be labeled `too-long` and not triaged until condensed.
- **Using an LLM?** Great — but it must follow these guidelines. Generic LLM output that ignores our contributing conventions will be closed. See [CONTRIBUTING.md](../../CONTRIBUTING.md).

- type: textarea
id: description
attributes:
label: Description
label: What happened?
description: |
Please explain what you're experiencing and what you would expect to happen instead.
Describe the bug in a few sentences. What did you do, what happened, and what did you expect instead?

Provide as much detail as possible to help us understand and solve your problem quickly.
Do NOT include root cause analysis, proposed fixes, or diagnostic writeups — just describe the problem.
validations:
required: true

Expand Down
24 changes: 9 additions & 15 deletions .github/ISSUE_TEMPLATE/enhancement.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,27 @@ description: Suggest an idea or improvement for FastMCP
labels: [enhancement, pending]

body:
- type: markdown
attributes:
value: Thanks for contributing to FastMCP! 🙏

- type: markdown
attributes:
value: |
### Before you submit
Thanks for suggesting an improvement to FastMCP!

To help us evaluate your enhancement request:
Enhancement issues are the **primary way** features and improvements get into FastMCP. Maintainers use well-written issues to implement changes that fit the codebase's patterns and ship quickly. A clear issue here is more impactful than a PR — see [CONTRIBUTING.md](../../CONTRIBUTING.md) for why.

- 🔍 **Check if this has already been requested** - search existing issues first
- 💭 **Think about the broader impact** - how would this affect other users?
- 📋 **Consider implementation complexity** - is this a small change or a major feature?
- ✂️ **Keep it short.** Describe the problem you're trying to solve and why existing behavior falls short. Skip proposed implementations unless you have a specific, well-considered suggestion — we don't need LLM-generated API designs. Requests that are difficult to parse may be closed without response.
### Before you submit

Thanks for helping to make FastMCP better! 🚀
- 🔍 **Check if this has already been requested** — search existing issues first
- 🎯 **Describe the problem you're trying to solve**, not the solution you want — we'll figure out the best implementation
- ✂️ **Keep it short.** A motivating description and a concrete use case is the ideal request — aim to fit in a single screen. Skip proposed implementations, API designs, or multi-option analyses — maintainers will figure out the approach. Requests that are difficult to parse will be labeled `too-long` and not triaged until condensed.
- 🤖 **Using an LLM?** Great — but it must follow these guidelines. Generic LLM output that ignores our contributing conventions will be closed. See [CONTRIBUTING.md](../../CONTRIBUTING.md).

- type: textarea
id: description
attributes:
label: Enhancement
description: |
Please describe the enhancement:
What problem or use case does this solve? How does current behavior fall short?

- What problem or use case would it solve?
- How would it improve your workflow or experience with FastMCP?
- Are there any alternative solutions you've considered?
Focus on the *what* and *why* — the motivating scenario. You don't need to propose an API or implementation.
validations:
required: true
10 changes: 8 additions & 2 deletions .github/actions/run-pytest/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ description: "Run pytest with appropriate flags for the test type and platform"

inputs:
test-type:
description: "Type of tests to run: unit, integration, or client_process"
description: "Type of tests to run: unit, integration, client_process, or conformance"
required: false
default: "unit"

Expand All @@ -23,8 +23,13 @@ runs:
TIMEOUT="5"
MAX_PROCS="0"
EXTRA_FLAGS="-x"
elif [ "${{ inputs.test-type }}" == "conformance" ]; then
MARKER="conformance"
TIMEOUT="120"
MAX_PROCS="0"
EXTRA_FLAGS="-x"
else
MARKER="not integration and not client_process"
MARKER="not integration and not client_process and not conformance"
TIMEOUT="5"
MAX_PROCS="4"
EXTRA_FLAGS=""
Expand All @@ -38,6 +43,7 @@ runs:
uv run --no-sync pytest \
--inline-snapshot=disable \
--timeout=$TIMEOUT \
--durations=50 \
-m "$MARKER" \
$PARALLEL_FLAGS \
$EXTRA_FLAGS \
Expand Down
34 changes: 14 additions & 20 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -1,28 +1,22 @@
## Description
<!--
Please provide a clear and concise description of the changes made in this pull request.

Using AI to generate code? Please include a note in the description with which AI tool you used.
-->
<!-- What does this PR do? Link to the issue it addresses. -->

**Contributors Checklist**
<!--
NOTE:
1. You must create an issue in the repository before making a Pull Request.
2. You must not create a Pull Request for an issue that is already assigned to someone else.
Closes #

If you do not follow these steps, your Pull Request will be closed without review.
-->
## Contribution type

- [ ] My change closes #(issue number)
- [ ] I have followed the repository's development workflow
- [ ] I have tested my changes manually and by adding relevant tests
- [ ] I have performed all required documentation updates
<!-- Check the one that applies. If you're unsure whether your change is welcome, please open an issue first — see CONTRIBUTING.md. -->

**Review Checklist**
<!-- Your Pull Request will not be reviewed if tests are failing, you have not self-reviewed your changes, or you have not checked all of the following: -->
- [ ] Bug fix (simple, well-scoped fix for a clearly broken behavior)
- [ ] Documentation improvement
- [ ] Enhancement (maintainers typically implement enhancements — see [CONTRIBUTING.md](../CONTRIBUTING.md))

- [ ] I have self-reviewed my changes
- [ ] My Pull Request is ready for review
## Checklist

---
- [ ] This PR addresses an existing issue (or fixes a self-evident bug)
- [ ] I have read [CONTRIBUTING.md](../CONTRIBUTING.md)
- [ ] I have added tests that cover my changes
- [ ] I have run `uv run prek run --all-files` and all checks pass
- [ ] I have self-reviewed my changes
- [ ] If I used an LLM, it followed the repo's contributing conventions (not generic output)
26 changes: 18 additions & 8 deletions .github/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,26 +8,33 @@ changelog:
labels:
- feature

- title: Enhancements 🔧
- title: Breaking Changes ⚠️
labels:
- enhancement
- breaking change
exclude:
labels:
- breaking change
- contrib
- security

- title: Fixes 🐞
- title: Enhancements ✨
labels:
- bug
- enhancement
exclude:
labels:
- contrib
- breaking change
- security

- title: Breaking Changes 🛫
- title: Security 🔒
labels:
- breaking change
- security

- title: Fixes 🐞
labels:
- bug
exclude:
labels:
- contrib
- security

- title: Docs 📚
labels:
Expand All @@ -41,6 +48,9 @@ changelog:
- title: Dependencies 📦
labels:
- dependencies
exclude:
labels:
- security

- title: Other Changes 🦾
labels:
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/auto-close-duplicates.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:

- name: Generate Marvin App token
id: marvin-token
uses: actions/create-github-app-token@v2
uses: actions/create-github-app-token@v3
with:
app-id: ${{ secrets.MARVIN_APP_ID }}
private-key: ${{ secrets.MARVIN_APP_PRIVATE_KEY }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/auto-close-needs-mre.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ jobs:

- name: Generate Marvin App token
id: marvin-token
uses: actions/create-github-app-token@v2
uses: actions/create-github-app-token@v3
with:
app-id: ${{ secrets.MARVIN_APP_ID }}
private-key: ${{ secrets.MARVIN_APP_PRIVATE_KEY }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/martian-test-failure.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ jobs:

- name: Generate Marvin App token
id: marvin-token
uses: actions/create-github-app-token@v2
uses: actions/create-github-app-token@v3
with:
app-id: ${{ secrets.MARVIN_APP_ID }}
private-key: ${{ secrets.MARVIN_APP_PRIVATE_KEY }}
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/martian-triage-issue.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ jobs:

- name: Generate Marvin App token
id: marvin-token
uses: actions/create-github-app-token@v2
uses: actions/create-github-app-token@v3
with:
app-id: ${{ secrets.MARVIN_APP_ID }}
private-key: ${{ secrets.MARVIN_APP_PRIVATE_KEY }}
Expand Down
7 changes: 1 addition & 6 deletions .github/workflows/marvin-comment-on-issue.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,9 @@ jobs:
- name: Install dependencies
run: uv sync --python 3.12

- name: Run prek
uses: j178/prek-action@v1
env:
SKIP: no-commit-to-branch

- name: Generate Marvin App token
id: marvin-token
uses: actions/create-github-app-token@v2
uses: actions/create-github-app-token@v3
with:
app-id: ${{ secrets.MARVIN_APP_ID }}
private-key: ${{ secrets.MARVIN_APP_PRIVATE_KEY }}
Expand Down
Loading
Loading