From 9f1297d74ba8aa0a9b2902dfe4603ab9398ed621 Mon Sep 17 00:00:00 2001 From: AgentStatus Date: Sun, 30 Aug 2026 15:12:23 -0700 Subject: [PATCH 1/6] Docs: optional TOA verify after doctor/conformance in CI. Adds a short section to docs/cli/ci.mdx. MCPJam checks stay primary; TOA is an optional delivery-evidence step when toa.json is present. --- docs/cli/ci.mdx | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/docs/cli/ci.mdx b/docs/cli/ci.mdx index 700935cc01..be1b4f38ce 100644 --- a/docs/cli/ci.mdx +++ b/docs/cli/ci.mdx @@ -242,6 +242,32 @@ Run the server-side MCP Apps surface checks from a config file and publish JUnit Single-run `protocol conformance`, `oauth conformance`, and `apps conformance` also accept `--reporter junit-xml` when you only need one target/check selection instead of a suite config file. +### Optional: verify Tool Outcome Attestation (TOA) after doctor / conformance + +Doctor and protocol conformance cover connect, capabilities, and protocol behavior. [Tool Outcome Attestation](https://github.com/Carmel-Labs-Inc/toa) (`toa/0.1`) is a separate, Apache-2.0 signed JSON artifact for **tool delivery** grades (reach, invoke, functional, shape, and related layers). It is not a wire protocol and is not meant to run on every live `tools/call`. + +If your pipeline already has a `toa.json` from any emitter, you can fail the job when verify fails. No AgentStatus account is required to verify. + +```yaml + - name: Doctor + run: npx -y @mcpjam/cli@latest server doctor --url ${{ secrets.MCP_SERVER_URL }} --format json + + - name: Protocol conformance + run: | + npx -y @mcpjam/cli@latest protocol conformance \ + --url ${{ secrets.MCP_SERVER_URL }} \ + --reporter junit-xml > protocol-report.xml + + # Optional. Skip when toa.json is absent. + - name: Verify tool delivery attestation + if: hashFiles('toa.json') != '' + run: | + pip install "git+https://github.com/Carmel-Labs-Inc/toa.git#subdirectory=python" + toa-verify toa.json --require-layer functional=pass +``` + +Pin the emitter public key using the flags documented in the toa repo when you need a specific signer. + --- ## GitLab CI From e91f3c7a1fd288625159a4de824959af340f8762 Mon Sep 17 00:00:00 2001 From: dulrajnr <181255277+dulrajnr@users.noreply.github.com> Date: Sun, 30 Aug 2026 16:32:43 -0700 Subject: [PATCH 2/6] Docs: pin toa-verify install to a commit SHA. Addresses CodeRabbit: avoid installing from a moving default branch revision. --- docs/cli/ci.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cli/ci.mdx b/docs/cli/ci.mdx index be1b4f38ce..1fa5c50a65 100644 --- a/docs/cli/ci.mdx +++ b/docs/cli/ci.mdx @@ -262,7 +262,7 @@ If your pipeline already has a `toa.json` from any emitter, you can fail the job - name: Verify tool delivery attestation if: hashFiles('toa.json') != '' run: | - pip install "git+https://github.com/Carmel-Labs-Inc/toa.git#subdirectory=python" + pip install "git+https://github.com/Carmel-Labs-Inc/toa.git@345f24607919b5bdf143719b9ea062543cdfe88e#subdirectory=python" toa-verify toa.json --require-layer functional=pass ``` From 7b7e0fc0fc8423da8afe7e282c7270e412c1b5e1 Mon Sep 17 00:00:00 2001 From: AgentStatus Date: Sun, 30 Aug 2026 20:26:31 -0700 Subject: [PATCH 3/6] Docs: pin emitter and max-age on toa-verify examples Match toa-verify --require-emitter / --max-age 7d after Carmel-Labs-Inc/toa#1. --- docs/cli/ci.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/cli/ci.mdx b/docs/cli/ci.mdx index 1fa5c50a65..72f8348e20 100644 --- a/docs/cli/ci.mdx +++ b/docs/cli/ci.mdx @@ -262,8 +262,8 @@ If your pipeline already has a `toa.json` from any emitter, you can fail the job - name: Verify tool delivery attestation if: hashFiles('toa.json') != '' run: | - pip install "git+https://github.com/Carmel-Labs-Inc/toa.git@345f24607919b5bdf143719b9ea062543cdfe88e#subdirectory=python" - toa-verify toa.json --require-layer functional=pass + pip install "git+https://github.com/Carmel-Labs-Inc/toa.git@5a1bf1cf6a15a4864ea809fe7b2a073f2cef4e22#subdirectory=python" + toa-verify toa.json --require-emitter agentstatus --require-layer functional=pass --max-age 7d ``` Pin the emitter public key using the flags documented in the toa repo when you need a specific signer. From 12b297574a32cfcdfa0edbb10a60712820e42e19 Mon Sep 17 00:00:00 2001 From: AgentStatus Date: Sun, 30 Aug 2026 20:30:30 -0700 Subject: [PATCH 4/6] Docs: pin toa-verify to packaged-key release Carmel-Labs-Inc/toa@99e2690fec24a5290d9542e58383a8bf753e8b74 ships keys/agentstatus-v1.json inside the python package (toa#2). --- docs/cli/ci.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cli/ci.mdx b/docs/cli/ci.mdx index 72f8348e20..b5c7291e9a 100644 --- a/docs/cli/ci.mdx +++ b/docs/cli/ci.mdx @@ -262,7 +262,7 @@ If your pipeline already has a `toa.json` from any emitter, you can fail the job - name: Verify tool delivery attestation if: hashFiles('toa.json') != '' run: | - pip install "git+https://github.com/Carmel-Labs-Inc/toa.git@5a1bf1cf6a15a4864ea809fe7b2a073f2cef4e22#subdirectory=python" + pip install "git+https://github.com/Carmel-Labs-Inc/toa.git@99e2690fec24a5290d9542e58383a8bf753e8b74#subdirectory=python" toa-verify toa.json --require-emitter agentstatus --require-layer functional=pass --max-age 7d ``` From da3880e8c9a1033b99da3a22ff5b10141e57591e Mon Sep 17 00:00:00 2001 From: AgentStatus Date: Sun, 30 Aug 2026 20:38:34 -0700 Subject: [PATCH 5/6] Docs: align TOA emitter prose with --require-emitter example CodeRabbit noted the text allowed any emitter while the sample command requires agentstatus and the bundled key. Co-authored-by: Cursor --- docs/cli/ci.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cli/ci.mdx b/docs/cli/ci.mdx index b5c7291e9a..7f5bb09952 100644 --- a/docs/cli/ci.mdx +++ b/docs/cli/ci.mdx @@ -246,7 +246,7 @@ Single-run `protocol conformance`, `oauth conformance`, and `apps conformance` a Doctor and protocol conformance cover connect, capabilities, and protocol behavior. [Tool Outcome Attestation](https://github.com/Carmel-Labs-Inc/toa) (`toa/0.1`) is a separate, Apache-2.0 signed JSON artifact for **tool delivery** grades (reach, invoke, functional, shape, and related layers). It is not a wire protocol and is not meant to run on every live `tools/call`. -If your pipeline already has a `toa.json` from any emitter, you can fail the job when verify fails. No AgentStatus account is required to verify. +If your pipeline already has a `toa.json` from AgentStatus (or another emitter whose key you pin), you can fail the job when verify fails. The example below requires `emitter.name=agentstatus` and uses the packaged AgentStatus key; pass `--public-key` for another issuer. No AgentStatus account is required to verify. ```yaml - name: Doctor From a8ce31792fdcec02194c637f3c3bbffe1dc62186 Mon Sep 17 00:00:00 2001 From: AgentStatus Date: Sun, 30 Aug 2026 21:20:02 -0700 Subject: [PATCH 6/6] Docs: separate TOA license from signature description CodeRabbit: Apache-2.0 is the project license, not the signing method; describe Ed25519 signing explicitly. Co-authored-by: Cursor --- docs/cli/ci.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cli/ci.mdx b/docs/cli/ci.mdx index 7f5bb09952..79928d185e 100644 --- a/docs/cli/ci.mdx +++ b/docs/cli/ci.mdx @@ -244,7 +244,7 @@ Single-run `protocol conformance`, `oauth conformance`, and `apps conformance` a ### Optional: verify Tool Outcome Attestation (TOA) after doctor / conformance -Doctor and protocol conformance cover connect, capabilities, and protocol behavior. [Tool Outcome Attestation](https://github.com/Carmel-Labs-Inc/toa) (`toa/0.1`) is a separate, Apache-2.0 signed JSON artifact for **tool delivery** grades (reach, invoke, functional, shape, and related layers). It is not a wire protocol and is not meant to run on every live `tools/call`. +Doctor and protocol conformance cover connect, capabilities, and protocol behavior. [Tool Outcome Attestation](https://github.com/Carmel-Labs-Inc/toa) (`toa/0.1`) is a separate, Ed25519-signed JSON artifact (Apache-2.0 project) for **tool delivery** grades (reach, invoke, functional, shape, and related layers). It is not a wire protocol and is not meant to run on every live `tools/call`. If your pipeline already has a `toa.json` from AgentStatus (or another emitter whose key you pin), you can fail the job when verify fails. The example below requires `emitter.name=agentstatus` and uses the packaged AgentStatus key; pass `--public-key` for another issuer. No AgentStatus account is required to verify.