Sync main to published-docs#3737
Conversation
* Add settings reference page * Note .env caveat for nested Docket settings
* feat: add --config-path flag to claude-desktop install command * feat: add --config-path flag to claude-desktop install command * docs: add --config-path option to install-mcp documentation * fix: show specific error message when provided --config-path does not exist
* Fix auto-close MRE script posting comment without closing issue * Surface partial failures when comment post fails after close
🤖 Generated with GPT-5.2-Codex
Message.content now accepts ImageContent and AudioContent in addition to TextContent and EmbeddedResource, matching MCP's ContentBlock type. This fixes ProxyPrompt.render() silently JSON-serializing image/audio content instead of preserving it. 🤖 Generated with Claude Code Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Deprecate PromptToolMiddleware and ResourceToolMiddleware * Remove deprecated middleware from docs entirely * Remove entire Tool Injection section from middleware docs
🤖 Generated with GPT-5.2-Codex
…3411) * Cap client auto-pagination pages 🤖 Generated with GPT-5.2-Codex * Raise on pagination limit instead of returning partial data Add max_pages kwarg (default 250) to list_tools/list_resources/ list_resource_templates/list_prompts so users can control the bound.
* Validate version metadata to reject non-scalar types (#3422) 🤖 Generated with Claude Code * Reject bool values in version coercion
* Bind Cognito verifier audience to client ID 🤖 Generated with GPT-5.2-Codex * Fix ty error: narrow return type of AWSCognitoProvider.get_token_verifier 🤖 Generated with Claude Code
…roxyClient (#3408) * Avoid reusing connected ProxyClient sessions 🤖 Generated with Codex * Fix static analysis: ruff format + ty type narrowing
🤖 Generated with GPT-5.2-Codex
🤖 Generated with GPT-5.2-Codex
* Guard OAuth callback result overwrite 🤖 Generated with GPT-5.2-Codex * Fix ruff formatting in test_oauth_callback_race.py Co-authored-by: Jeremiah Lowin <jlowin@users.noreply.github.com> Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Marvin Context Protocol <41898282+Marvin Context Protocol@users.noreply.github.com> Co-authored-by: Jeremiah Lowin <jlowin@users.noreply.github.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* Block HS* algorithms with JWKS in JWT verifier 🤖 Generated with GPT-5.2-Codex * Fix ruff format: remove extra blank line in test_supabase.py 🤖 Generated with Claude Code Co-authored-by: Jeremiah Lowin <jlowin@users.noreply.github.com> --------- Co-authored-by: Marvin Context Protocol <41898282+Marvin Context Protocol@users.noreply.github.com> Co-authored-by: Jeremiah Lowin <jlowin@users.noreply.github.com>
🤖 Generated with GPT-5.2-Codex
🤖 Generated with GPT-5.2-Codex
* Block BulkToolCaller self-invocation 🤖 Generated with GPT-5.2-Codex * Fix ruff format violation in test_bulk_tool_caller.py 🤖 Generated with Claude Code
* Fix get_* returning None when latest version is disabled (#3421) When a visibility transform disabled the highest version of a component, get_tool/get_resource/get_resource_template/get_prompt returned None instead of falling back to the next-highest enabled version. The list_* path already worked correctly because deduplication runs after visibility filtering. The get_* path now falls back to listing all versions and picking the highest enabled one when the top version is disabled. * Apply auth checks in version fallback paths The fallback code in get_tool, get_resource, get_resource_template, and get_prompt bypassed auth filtering when falling back to older versions after the highest version was disabled. This could expose auth-protected older versions to unauthorized users.
* Fix server lifespan overlap teardown 🤖 Generated with GPT-5.2-Codex * Clear lifespan state when non-owner session is last to exit
* Fix output schema object detection 🤖 Generated with GPT-5.2-Codex * Fix ty invalid-type-alias-type error Co-authored-by: Jeremiah Lowin <jlowin@users.noreply.github.com> 🤖 Generated with Claude Code * Fix $ref resolution to handle JSON Pointer escaping and nested paths --------- Co-authored-by: Marvin Context Protocol <41898282+Marvin Context Protocol@users.noreply.github.com> Co-authored-by: Jeremiah Lowin <jlowin@users.noreply.github.com>
…tations (#3429) * Preserve kw-only defaults in cloned adapters (🤖 GPT-5.2-Codex) * Fix ruff format violation in test_types.py
…ting_demo in the uv group across 1 directory (#3685) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: marvin-context-protocol[bot] <225465937+marvin-context-protocol[bot]@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: marvin-context-protocol[bot] <225465937+marvin-context-protocol[bot]@users.noreply.github.com>
Co-authored-by: marvin-context-protocol[bot] <225465937+marvin-context-protocol[bot]@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: marvin-context-protocol[bot] <225465937+marvin-context-protocol[bot]@users.noreply.github.com>
…mo in the uv group across 1 directory (#3728) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: marvin-context-protocol[bot] <225465937+marvin-context-protocol[bot]@users.noreply.github.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a52ab0e92d
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
| if token_id not in self._refresh_locks: | ||
| self._refresh_locks[token_id] = anyio.Lock() | ||
| lock = self._refresh_locks[token_id] |
There was a problem hiding this comment.
Release refresh locks after token refresh attempts
load_access_token() stores a new anyio.Lock in self._refresh_locks for each distinct upstream_token_id, but nothing ever removes entries after the refresh path completes. In a long-lived OAuth proxy serving many users/tokens, this dictionary will grow monotonically and retain lock objects indefinitely, causing avoidable memory growth over time even after tokens expire.
Useful? React with 👍 / 👎.
| oauth_client = self._create_upstream_oauth_client() | ||
|
|
||
| token_response: dict[str, Any] = await oauth_client.refresh_token( | ||
| url=self._upstream_token_endpoint, |
There was a problem hiding this comment.
Close transient OAuth clients in transparent refresh path
_try_transparent_refresh() creates an AsyncOAuth2Client and immediately uses it, but never closes it. Since this path runs during token validation when upstream tokens expire, repeated refreshes can accumulate unclosed HTTP client resources (connection pools/sockets) under load. Use async with or a finally: await oauth_client.aclose() around the refresh call.
Useful? React with 👍 / 👎.
Summary
docs/fastmcp-analytics.jsfor Amplitude tracking on gofastmcp.com🤖 Generated with Claude Code