Skip to content

chore(deps): require fastmcp 4.1.0 and mcp 2.3.0 - #26

Merged
christianclaudio merged 2 commits into
mainfrom
cursor/fastmcp-4.1.0-floor
Oct 10, 2026
Merged

christianclaudio merged 2 commits into
mainfrom
cursor/fastmcp-4.1.0-floor

Conversation

@christianclaudio

@christianclaudio christianclaudio commented Oct 10, 2026 •

Copy link
Copy Markdown
Owner

Why

Template v1.7.0 (#82) raised the FastMCP floor to 4.1.0 and mcp to 2.3.0. This copies both floors here so the product matches the template. Nothing in src/ or tests/ needed to change.

Changes

  • pyproject.toml (core), fastmcp.json: fastmcp>=4.0.11 becomes >=4.1.0 and mcp>=2.2.0 becomes >=2.3.0.
  • uv.lock: refreshed with uv lock --upgrade-package fastmcp --upgrade-package mcp only. No other package was upgraded.
  • README.md: the template's idle-session line, added as a bullet under "Known limits" in the Streamable HTTP section, because this README documents serving Streamable HTTP in the default stateful mode.

No source or test changes. No version bump.

Audit (src, tests, docs, README)

  • Tool Search (#5467): No Tool Search transform is used. The lookarounds and backreferences in errors.py belong to the redaction patterns. Python's re compiles them, not Tool Search, so they are unaffected.
  • Code Mode: No Code Mode in this repo; no CodeMode( or max_duration_secs.
  • HTTP idle expiry (#5229): session_idle_timeout is not set anywhere, so stateful HTTP deployments now expire sessions after 30 idle minutes (HTTP 404, and the client starts a new session). The HTTP tests build stateless apps, and the stateless_http=False assertions only check the arguments passed to run(), so the tests are unaffected. The README line documents this.
  • No x-mcp-header annotations (#3620), no ctx.meta / ctx.params reads (#3628), no MultiAuth, no skills, and no OpenAPI ./.. path parameters.
  • src/mcp_server_kalshi/server.py:172-176,1250 builds experimental_capabilities={} for the low-level stdio path. Under mcp 2.3.0 (#3614) an empty experimental is left out of initialize. No test or client here reads it; the protocol and conformance runs pass.

FastMCP 4.1.0 (release) and mcp 2.3.0 (release)

The items that apply here are the Tool Search engine change, the 30-minute idle expiry and the Monty 1.1 rename above. The other breaking items in 4.1.0 (MultiAuth client IDs, skill file paths, OpenAPI path parameters, Python 3.15) touch nothing used here. In mcp 2.3.0, httpx2>=2.10.0 (#3600) was already satisfied. #3630 (Mcp-Param-* lookup by name) and #3635 (OAuth login vs request timeouts, client side) need nothing here.

Lock changes

Package Before After
fastmcp 4.0.11 4.1.0
fastmcp-slim 4.0.11 4.1.0
mcp 2.2.0 2.3.0
mcp-types 2.2.0 2.3.0
beartype 0.22.9 0.22.9 (Python < 3.15) and 0.23.0 (Python >= 3.15)

Why beartype is locked twice: this is deliberate, not drift, and it matches template v1.7.0. fastmcp-slim 4.1.0 adds beartype>=0.23.0rc2; python_version >= "3.15" (#5558), so uv forks the resolution at 3.15. Below 3.15, only py-key-value-aio's beartype>=0.20.0 applies, and uv keeps the 0.22.9 already locked because beartype wasn't upgraded. Python 3.10 to 3.13, the versions CI runs, still install 0.22.9.

Tests

No test changes. On Python 3.10, 3.11, 3.12 and 3.13, with CI=true and --all-extras, 639 passed, 1 deselected (the deselected one is the opt-in e2e test), at 100% coverage. The 3.12 run gave the same result with KALSHI_MCP_AUTH_TOKEN and KALSHI_MCP_ALLOW_UNAUTHENTICATED_BIND exported in the shell.

Gates

  • ruff check . and ruff format --check .: clean
  • black --check src tests: clean
  • mypy: clean
  • uv lock --check: clean
  • scripts/check_tool_contract.py: passed
  • scripts/check_openapi_drift.py: passed
  • scripts/check_version.py (on a fresh uv build): passed
  • scripts/check_conformance.sh: the baseline check passed (12 passed; all 20 failures are expected and in the baseline)
  • Documented the 30-minute idle timeout for stateful HTTP sessions and how to change or disable it.
  • Raised the minimum fastmcp and mcp versions to 4.1.0 and 2.3.0.

Tool surface: none
Config: Documented FASTMCP_HTTP_SESSION_IDLE_TIMEOUT.

## Why

Template v1.7.0 (#82) raised the FastMCP floor to 4.1.0 and mcp to 2.3.0. This copies both floors here so the product matches the template. Nothing in `src/` or `tests/` needed to change.

## Changes

- `pyproject.toml` (core), `fastmcp.json`: `fastmcp>=4.0.11` becomes `>=4.1.0` and `mcp>=2.2.0` becomes `>=2.3.0`.
- `uv.lock`: refreshed with `uv lock --upgrade-package fastmcp --upgrade-package mcp` only. No other package was upgraded.
- `README.md`: the template's idle-session line, added as a bullet under "Known limits" in the Streamable HTTP section, because this README documents serving Streamable HTTP in the default stateful mode.

No source or test changes. No version bump.

## Audit (src, tests, docs, README)

- Tool Search ([#5467](PrefectHQ/fastmcp#5467)): No Tool Search transform is used. The lookarounds and backreferences in `errors.py` belong to the redaction patterns. Python's `re` compiles them, not Tool Search, so they are unaffected.
- Code Mode: No Code Mode in this repo; no `CodeMode(` or `max_duration_secs`.
- HTTP idle expiry ([#5229](PrefectHQ/fastmcp#5229)): `session_idle_timeout` is not set anywhere, so stateful HTTP deployments now expire sessions after 30 idle minutes (HTTP 404, and the client starts a new session). The HTTP tests build stateless apps, and the `stateless_http=False` assertions only check the arguments passed to `run()`, so the tests are unaffected. The README line documents this.
- No `x-mcp-header` annotations ([#3620](modelcontextprotocol/python-sdk#3620)), no `ctx.meta` / `ctx.params` reads ([#3628](modelcontextprotocol/python-sdk#3628)), no `MultiAuth`, no skills, and no OpenAPI `.`/`..` path parameters.
- `src/mcp_server_kalshi/server.py:172-176,1250` builds `experimental_capabilities={}` for the low-level stdio path. Under mcp 2.3.0 ([#3614](modelcontextprotocol/python-sdk#3614)) an empty `experimental` is left out of `initialize`. No test or client here reads it; the protocol and conformance runs pass.

## FastMCP 4.1.0 ([release](https://github.com/PrefectHQ/fastmcp/releases/tag/v4.1.0)) and mcp 2.3.0 ([release](https://github.com/modelcontextprotocol/python-sdk/releases/tag/v2.3.0))

The items that apply here are the Tool Search engine change, the 30-minute idle expiry and the Monty 1.1 rename above. The other breaking items in 4.1.0 (MultiAuth client IDs, skill file paths, OpenAPI path parameters, Python 3.15) touch nothing used here. In mcp 2.3.0, `httpx2>=2.10.0` ([#3600](modelcontextprotocol/python-sdk#3600)) was already satisfied. [#3630](modelcontextprotocol/python-sdk#3630) (`Mcp-Param-*` lookup by name) and [#3635](modelcontextprotocol/python-sdk#3635) (OAuth login vs request timeouts, client side) need nothing here.

## Lock changes

| Package | Before | After |
|---|---|---|
| fastmcp | 4.0.11 | 4.1.0 |
| fastmcp-slim | 4.0.11 | 4.1.0 |
| mcp | 2.2.0 | 2.3.0 |
| mcp-types | 2.2.0 | 2.3.0 |
| beartype | 0.22.9 | 0.22.9 (Python < 3.15) and 0.23.0 (Python >= 3.15) |

**Why beartype is locked twice:** this is deliberate, not drift, and it matches template v1.7.0. `fastmcp-slim` 4.1.0 adds `beartype>=0.23.0rc2; python_version >= "3.15"` ([#5558](PrefectHQ/fastmcp#5558)), so uv forks the resolution at 3.15. Below 3.15, only `py-key-value-aio`'s `beartype>=0.20.0` applies, and uv keeps the 0.22.9 already locked because beartype wasn't upgraded. Python 3.10 to 3.13, the versions CI runs, still install 0.22.9.

## Tests

No test changes. On Python 3.10, 3.11, 3.12 and 3.13, with `CI=true` and `--all-extras`, 639 passed, 1 deselected (the deselected one is the opt-in e2e test), at 100% coverage. The 3.12 run gave the same result with `KALSHI_MCP_AUTH_TOKEN` and `KALSHI_MCP_ALLOW_UNAUTHENTICATED_BIND` exported in the shell.

## Gates

- `ruff check .` and `ruff format --check .`: clean
- `black --check src tests`: clean
- `mypy`: clean
- `uv lock --check`: clean
- `scripts/check_tool_contract.py`: passed
- `scripts/check_openapi_drift.py`: passed
- `scripts/check_version.py` (on a fresh `uv build`): passed
- `scripts/check_conformance.sh`: the baseline check passed (12 passed; all 20 failures are expected and in the baseline)
@coderabbitai

coderabbitai Bot commented Oct 10, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: QUIET
  • Plan: Advanced
  • Run ID: 016aef62-a7da-4b0e-ad8f-fd4bd51ed3fa

📥 Commits

Reviewing files that changed from the base of the PR and between c61eec0 and 896ea47.


⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock

📒 Files selected for processing (3)
  • README.md
  • fastmcp.json
  • pyproject.toml

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.


📜 Recent review details
⏰ Context from checks skipped due to timeout. (9)
  • GitHub Check: Tests (py3.12)
  • GitHub Check: Tests (py3.13)
  • GitHub Check: Tool contract verification
  • GitHub Check: Tests (py3.11)
  • GitHub Check: Tests (py3.10)
  • GitHub Check: MCP Protocol Conformance
  • GitHub Check: Lint, format and types
  • GitHub Check: Build and package check
  • GitHub Check: OpenAPI drift check

🧰 Additional context used
📚 Code guidelines (2)
AGENTS.md — configured
README.md — auto-discovered

📓 Path-based instructions (4)
Dependency floors.

⚙️ CodeRabbit configuration file

Files:

  • fastmcp.json
  • pyproject.toml

README is the user contract for env vars, tool lists, and install steps: flag text that contradicts the code in this PR (renamed or removed tools, env vars, defaults).

⚙️ CodeRabbit configuration file

Files:

  • README.md

Source excerpt: **Git Safety & Releases**: Never commit private keys or API credentials.

📄 CodeRabbit inference engine (AGENTS.md)

Files:

  • README.md
  • pyproject.toml

Source excerpt: To serve the image over HTTP, pass credentials and the token from your environment or an env file, never on the command line: Source excerpt: Replace `mcp.example.com` with the host name clients use to reach the server.

📄 CodeRabbit inference engine (README.md)

Files:

  • README.md

🔇 Additional comments (3)
fastmcp.json (1)

9-10: LGTM!


pyproject.toml (1)

10-11: LGTM!


README.md (1)

163-163: LGTM!



📝 Walkthrough

Walkthrough

The README documents the default stateful HTTP session idle timeout and its configuration options. The FastMCP and MCP minimum dependency versions increase in both manifests.

Changes

Session Timeout Documentation and Dependency Floors

Layer / File(s) Summary
Session timeout documentation and dependency requirements
fastmcp.json, pyproject.toml, README.md
The dependency minimums increase to fastmcp>=4.1.0 and mcp>=2.3.0. The README describes the default 30-minute idle timeout, the resulting HTTP 404 response, the need to start a new session, and the options for changing or disabling the timeout.

Priority: ⬇️ Low

Estimated code review effort: 2 (Simple) | ~5 minutes

Change: Other

Suggested labels: dependencies


Merge Risk: ⚪ Minimal · up to 896ea

The dependency requirements and lockfile agree, and the README documents the intended session timeout. No concrete merge-blocking risk is evident.

Pre-merge checks | Passed 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check Passed The title clearly and concisely identifies the primary change: raising the required FastMCP and MCP dependency versions.
Docstring Coverage Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0…
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@christianclaudio
christianclaudio merged commit 3896ce9 into main Oct 10, 2026
11 checks passed
@christianclaudio
christianclaudio deleted the cursor/fastmcp-4.1.0-floor branch October 10, 2026 13:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant