open-standards/jcp/jcp-rs/crates
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Transaction Science 0b9be6ce7c
All checks were successful
no-vanity-metrics / Scan committed Markdown for vanity metrics (pull_request) Successful in 3s
no-vanity-metrics / WAI public text names no comparison (pull_request) Successful in 3s
no-vanity-metrics / WAI public text names no company or product (pull_request) Successful in 3s
standards workspaces build + test / eoc-rs (pull_request) Successful in 1m58s
standards workspaces build + test / jcp-rs (pull_request) Successful in 1m27s
standards workspaces build + test / proof-rs (pull_request) Successful in 1m15s
standards workspaces build + test / sandbox-rs (pull_request) Successful in 2m17s
standards workspaces build + test / smart-byte-rs (pull_request) Successful in 3m44s
standards workspaces build + test / jouleclaw-rs (pull_request) Successful in 11m25s
standards workspaces build + test / aac-rs (pull_request) Successful in 6m26s
standards workspaces build + test / joule-code-rs (pull_request) Successful in 3m40s
standards workspaces build + test / joulecontract-rs (pull_request) Successful in 2m6s
standards workspaces build + test / map-rs (pull_request) Successful in 1m46s
standards workspaces build + test / mesh-rs (pull_request) Successful in 2m41s
standards workspaces build + test / openpay (pull_request) Successful in 12m23s
standards workspaces build + test / arl-rs (pull_request) Successful in 46m19s
standards workspaces build + test / joule-ui-rs (pull_request) Successful in 31m47s
standards workspaces build + test / jouledesk-rs (pull_request) Successful in 8m22s
standards workspaces build + test / joulehook-rs (pull_request) Successful in 4m58s
standards workspaces build + test / sense-rs (pull_request) Successful in 4m10s
standards workspaces build + test / macOS energy backends (pull_request) Successful in 5m46s
jcp-gateway: refuse a tool whose parameter schema changed under its name
A grant binds `mcp_resource(server, tool)` — a hash of the tool's **name** —
and the action list. `Capability { resource, actions }` has no field for the
tool's parameter shape, so nothing in a signed grant describes what the
arguments mean.

So a server can advertise `read_file(path: string)`, take a grant for it, and
later advertise `read_file(command: string)`. Same name, same content-addressed
resource, same action, same signature: every check passes and the chain still
verifies. The authority the client issued now covers arguments it never saw.
That is a rug-pull JCP could not see, and a grant cannot be made to see it
without changing the signed wire format.

Closed at the enforcement point, which is the only place the shape is
observable without that wire change. `tools/list` is now read on the way back —
read, never rewritten — and each tool's `inputSchema` is content-addressed.
A `tools/call` to a tool whose digest has since changed is refused **before any
flow labelling or debit**, and the refusal seals like every other, so it is
recorded rather than silently dropped.

Three properties worth stating because they are choices, not accidents:

- **Reverting is still a change.** A server that swaps the shape and swaps it
  back has still changed it, and nothing says which of the two a later call
  means, so the flag does not clear.
- **A tool that gains a schema where it had none is a change.** A listing
  without `inputSchema` records the null schema rather than nothing, so the
  first real schema is a contradiction and not a first sighting.
- **Key order is not a change.** The digest is over the canonical form, so a
  server reordering its JSON does not trip the gate.

And one honest limit, in the field's own doc comment: this is
**trust-on-first-listing**. It catches a shape that changes under a gateway
that has seen it listed, and promises nothing about a tool this gateway never
watched being listed. Binding the digest into the `Capability` itself is the
stronger fix and a wire change; this is what is enforceable today.

Composed with the advertisement from the previous commit: `tool_schema_pinned`
is announced in `initialize` and surfaced on `JcpAdvertisement`, so a client
can *require* it rather than hope for it — and an absent field does not read as
enforced.

398 tests across the jcp workspace, 0 clippy findings in the crate.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-10-05 10:20:47 -04:00
..
jcp-a2a jcp-a2a: an unverified AP2 mandate could set the ceiling, and name any payee 2026-10-05 07:22:11 -04:00
jcp-action-receipt jcp-gateway: the plaintext figure beside a receipt says whether it is a reading 2026-09-30 20:09:50 -04:00
jcp-bridge jcp-bridge: Identify the authorization server per RFC 9207 2026-07-21 06:32:50 -04:00
jcp-channel jcp: caveats — the open attenuation axis (SPEC §4.9, C24) 2026-07-19 11:03:04 -04:00
jcp-cite jcp-cite: tighten unreadable_by — real authorization via a caller predicate 2026-07-20 19:10:48 -04:00
jcp-cli jcp: caveats — the open attenuation axis (SPEC §4.9, C24) 2026-07-19 11:03:04 -04:00
jcp-conformance jcp: read the three pack files nothing read 2026-09-26 05:21:54 -04:00
jcp-efficiency jcp: a live vendor counter is a reading; intercept/1 keeps a partial figure partial 2026-09-30 20:06:16 -04:00
jcp-energy jcp-energy: the GPU rail's period was wrong by two orders, in the unsafe direction 2026-10-05 07:20:58 -04:00
jcp-flow jcp-flow: Compute propagated provenance from tool bytes 2026-07-22 02:09:29 -04:00
jcp-gateway jcp-gateway: refuse a tool whose parameter schema changed under its name 2026-10-05 10:20:47 -04:00
jcp-grant jcp: caveats — the open attenuation axis (SPEC §4.9, C24) 2026-07-19 11:03:04 -04:00
jcp-intercept jcp: a live vendor counter is a reading; intercept/1 keeps a partial figure partial 2026-09-30 20:06:16 -04:00
jcp-orchestrate jcp: caveats — the open attenuation axis (SPEC §4.9, C24) 2026-07-19 11:03:04 -04:00
jcp-policy jcp-policy: a receipt sealed the policy's name, so the rules could be swapped under it 2026-10-05 07:22:12 -04:00
jcp-prompt jcp-prompt: a signed, content-addressed prompt registry 2026-06-27 19:57:46 -04:00
jcp-receipt jcp: an erasure path that neither breaks the chain nor loses the joules 2026-09-03 15:15:51 -04:00
jcp-runtime jcp-runtime: Gate a call on its argument's propagated provenance 2026-07-22 04:03:15 -04:00
jcp-schema jcp: a live vendor counter is a reading; intercept/1 keeps a partial figure partial 2026-09-30 20:06:16 -04:00
jcp-threshold jcp: caveats — the open attenuation axis (SPEC §4.9, C24) 2026-07-19 11:03:04 -04:00
jcp-trace jcp-trace: a std-only OTLP /v1/traces receiver (server feature) 2026-06-27 20:53:48 -04:00
jcp-wire jcp: caveats — the open attenuation axis (SPEC §4.9, C24) 2026-07-19 11:03:04 -04:00
jcp-x402 jcp: caveats — the open attenuation axis (SPEC §4.9, C24) 2026-07-19 11:03:04 -04:00