CI Test Coverage job fails: unpinned fastmcp resolves to 4.x / mcp 2.x on a fresh install #37
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Symptom
The
Test Coveragejob insecurity.ymlfails on the PR #36 merge into main. The last green run (and the last coverage badge update) was the v6.5.1 merge on 2026-07-24.The job has no
--cov-fail-under, so coverage isn't what fails it: pytest exits non-zero on one test.Reproduced locally by running the job's exact steps on Python 3.12 against a clean worktree of
origin/main.Cause
mcp_server/requirements.txtpinsfastmcp>=2.13.0with no upper bound. A fresh install now resolves:In mcp 2.x
OAuthClientInformationFull.client_idis a required field, so the test's_make_client(client_id=None)no longer constructs. Nothing in the OmniMem code changed; the dependency moved two majors underneath it.Wider impact
The Docker images build from the same unpinned requirements, so the images the v6.7.1 tag just triggered will have picked up fastmcp 4 / mcp 2, a combination nothing has been tested against. The OAuth provider, the middleware and
server.pyall import from both packages. Those images should be rebuilt once the pin lands.Also found
tools/briefing.pylines 46 and 54-58 (the empty-row skip and the exception fallback in_skill_source_keys, added for #34) are uncovered, sotools/sits at 99% rather than the 100% the changelog states. It doesn't fail the job, but it's worth closing in the same fix.Plan
Fixed on
v6.7.xin332fab3, with a PR open into main.fastmcp>=2.13.0,<4andmcp>=1.24.0,<2inmcp_server/requirements.txt. mcp gets its own bound because fastmcp's package metadata doesn't declare it_skill_source_keysbranches intools/briefing.py[6.7.2] - UnreleasedVerified by re-running the job's exact steps on a clean Python 3.12 install with no cache: resolved fastmcp 3.4.7 / mcp 1.30.0, 1916 passed, 1 skipped, every
memory/andtools/module at 100%, badge generation succeeds.Still to do once it's on main: rebuild the images, since the v6.7.1 tag build resolved fastmcp 4 / mcp 2.
Merged into main via #38 (
9de0fc2). The next security workflow run on main should install fastmcp 3.4.x / mcp 1.x and go green.Open follow-up, not part of this issue: the images built from the v6.7.1 tag resolved fastmcp 4 / mcp 2 and should be replaced, most simply by tagging v6.7.2 from
v6.7.x.Correction to the diagnosis above. There's nothing wrong with fastmcp 4. Production has been running OmniMem 6.7.1 on fastmcp 4.0.3 / mcp 2.2.0 without trouble, so the
<4/<2bound from #38 was the wrong fix, and the v6.7.1 images don't need rebuilding.What broke was test-side only. mcp 2 requires
client_idonOAuthClientInformationFulland stripsnull/""at parse, while its registration handler assigns a uuid before calling the provider, so real registrations always carry an id. Only the test built a client without one.Fixed properly in
66272a2onv6.7.x(PR into main):fastmcp>=4.0.3,<5,mcp>=2.2.0,<3, the test registers a client with its id assigned, and a new test reaches the generate-if-missing fallback viamodel_copy. CI's steps on a clean 3.12 install: fastmcp 4.0.3 / mcp 2.2.0, 1917 passed, 100% onmemory/andtools/.