Repository navigation
test(e2e): cover the Skills extension (SEP-2640) - #3065
Conversation
@modelcontextprotocol/client
@modelcontextprotocol/codemod
@modelcontextprotocol/core
@modelcontextprotocol/server
@modelcontextprotocol/server-legacy
@modelcontextprotocol/express
@modelcontextprotocol/fastify
@modelcontextprotocol/hono
@modelcontextprotocol/node
commit: |
There was a problem hiding this comment.
Nothing blocking. The comments below are optional suggestions. There is no need to push a fix for them before merging.
Beyond the inline comments, I also checked whether skills:cache-fields:present needs a raw wire assertion for ttlMs and cacheScope. It does not: on 2026-07-28 the client parses these results with both fields required and no defaults (packages/client/src/ext/skills/pageSchemas.ts), so the values SkillsClient returns can only have come from the server's response.
Extended reasoning...
Test-only change (three files under test/e2e, no SDK source), touching no security-sensitive surface. This note records one concern beyond the inline comments that was examined and ruled out; it is informational, and the 1183-line addition under a CODEOWNERS-covered path still merits a human look.
3 optional notes from this repository's REVIEW.md or CLAUDE.md checks were not posted as comments, over this review's limit for such notes; they are on this commit's check card.
|
|
Two of the notes on the review's check card are left as they are:
|
There was a problem hiding this comment.
I re-reviewed this after the follow-up commit and found no bugs; that commit changes each of the places my earlier comments pointed at. Since this adds about 1,200 lines that fix 40-odd requirements and their spec citations into the e2e manifest, a maintainer look is still worthwhile.
What was reviewed:
test/e2e/requirements.ts: bothsupersedes/supersededBypairs are symmetric with matchingaddedInSpecVersion/removedInSpecVersion; theentryModern-only entries and theskills:directory:undeclaredexclusion follow the conventions intest/e2e/CLAUDE.md.test/e2e/scenarios/skills.test.ts: read each body against itsbehaviorstring, including the newtypescript:skills:catalog:reload-listenbody, which follows the same self-hostedcreateMcpHandlerpattern asresources:listen:list-changed.test/e2e/tsconfig.json: both new path aliases point atsrc/ext/skills/index.tsfiles that exist in the client and server packages.- Not checked: the
L<line>anchors against the pinned ext-skills page (no network access in this run), and the suite was not executed.
Extended reasoning...
Test-only change across three files in test/e2e (manifest entries, a new 980-line scenario file, two tsconfig path aliases); no SDK source is touched and it has no security-sensitive surface. The second commit drops the relaxed wire-sniffer option from the bodies named earlier, adds a 2026-07-28 sibling for the reload requirement, and cites the spec line on the limits entry. This run found no bugs. It is not approved automatically because of its size, because CODEOWNERS assigns every path to the SDK maintainers, and because the spec line citations and the one dismissed human review could not be assessed from here.
Adds the Skills extension (SEP-2640, #3047) to the e2e manifest: 41 requirements in
test/e2e/requirements.ts, each proved in the newtest/e2e/scenarios/skills.test.tsacross the transport and spec-version matrix. Follow-up to this comment on #3047.Motivation and Context
#3047 shipped with unit and integration tests, but none of its behaviours were in the e2e manifest, so the coverage gate did not track them and they never ran across the transports. This covers the list from the review comment and the rest of the extension surface: discovery, listing, get, reading and verification, directories, cache fields, custom sources, and
attach()/reload().skills:ids cite the line of the stable spec page they come from;typescript:skills:ids are this SDK's own API.resultType) runs onentryModern. The absence of cache fields on 2025-11-25 is the entry it supersedes.handler.notifystay intest/integration.How Has This Been Tested?
vitest run scenarios/skills.test.ts coverage.test.ts: 431 passed, no known failures.protocol:timeout:max-total [sse *]. That test also fails locally onmainunder full-suite load, and passes in isolation.Breaking Changes
None. Test-only, no changeset.
Types of changes
Checklist
Additional context
The spec says servers SHOULD NOT serve a skill over the per-skill limits. The SDK serves it with a warning, and fails the load under
strict.typescript:skills:catalog:limitspins that choice rather than recording it as a known failure.