@sequesign/mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@sequesign/mcpStart a session to record my approval for the quarterly report, then finalize."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@sequesign/mcp
A Model Context Protocol server for Sequesign — let an MCP-capable agent produce a cryptographically verifiable receipt of its own delegated work, then verify it offline.
It is a thin local-stdio wrapper over @sequesign/sdk. The
agent's signing key never leaves the machine: in direct mode the SDK signs each
action locally and the hosted witness only co-signs a hash.
Tools
Tool | What it does |
| Open a recording session (one signed action chain). Returns a |
| Append a signed action to the chain. |
| Attach a locally signed approval for a recorded action (e.g. a human or agent reviewer signing off). |
| Attach a counterparty's signed confirmation of a recorded action (e.g. a vendor confirming an amount). The SDK derives the content binding from the attested action. |
| Attach an independently-witnessed approval to an already-sealed receipt (a deferred satellite). For a reviewer — human or another agent — signing off after the fact. The approver must be distinct from the recording agent. |
| Attach an independently-witnessed counterparty confirmation to an already-sealed receipt (a deferred satellite), bound to a specific action. |
| Seal + witness the receipt and run the SDK's own verification. Closes the session. |
| Verify a sealed receipt offline. Three modes: integrity self-check of the local package (default); third-party |
Choosing a mode per session
The server default is SEQUESIGN_MODE, but sequesign_start_session accepts a
mode argument (direct or managed) so one running server can do both
without editing config. A mode: "managed" session still requires the managed
secrets (SEQUESIGN_API_KEY + SEQUESIGN_AGENT_PRIVATE_KEY); the call fails
fast if they're absent.
Verifying the stored (registered-identity) receipt
In managed mode the broker stamps the registered agent_identity_attestation
into the stored receipt, not the local envelope — so a local verify reads
self_asserted. Pass the receipt_url from finalize as receiptUrl to
sequesign_verify: it fetches the stored receipt (using SEQUESIGN_API_KEY),
verifies it against your local package, and auto-fetches the published witness
and registration anchors, so the result shows external trust and the
registered identity.
Multi-party / deferred attestation (after sealing)
sequesign_approve_receipt and sequesign_countersign_receipt attest to a
receipt that's already finalized, without modifying it. Each produces a
detached satellite that's bound to the sealed receipt by hash, independently
witnessed at its own time, and written to the package's attestations.jsonl
sidecar; the verifier folds a valid satellite into the same approval/counterparty
leg as an in-receipt one. They take the sealed packageDirectory (not a live
session), so a different party — even a different model on a different machine,
as long as it has the package — can approve or countersign later. This is the
basis for a multi-party flow: one agent records and seals the work, a second
party approves it, a third confirms it — three independent, timestamped
signatures on one receipt.
Binding to the registered (stored) receipt. By default a satellite binds to
the local receipt.json. In managed mode the broker-stored copy carries the
registered agent_identity_attestation (a different hash), so pass the
receipt_url as receiptUrl to approve_receipt / countersign_receipt:
the tool fetches the stored receipt (authenticated, origin-allowlisted) and
binds the satellite to it. A later sequesign_verify --receiptUrl then shows
the registered identity AND the folded approval/counterparty legs on one
receipt. Set the satellite's mode to match how the receipt was sealed.
Convergence note (cross-platform). The broker does not store satellites
— a sealed satellite is appended to the local package's attestations.jsonl.
So for parties on different machines/platforms to converge on one verifiable
receipt, the .sequesign package must travel between them (an orchestrator
moves it, each appends its satellite). Independent submission with server-side
satellite storage is a future broker capability.
Vouching (verified parties)
sequesign_record_approval and sequesign_record_counterparty_attestation
mint an ephemeral key when you don't pass one, so the leg verifies as
present_unverified. To get a present_verified (vouched) leg, enroll the
party's key with the platform first and pass both the enrolled private key PEM
and the returned identityProofRef. Then sequesign_verify flips the leg to
present_verified when given the platform's published registration keys.
Related MCP server: emilia-mcp-server
Configuration
All configuration is via environment variables:
Variable | Default | Notes |
|
| Default transport: |
|
| Direct-mode witness. |
|
| Managed-mode broker. |
|
| Source of the published registration keys for the |
|
| Receipt-store origin. The API key is forwarded only to this or the broker origin when fetching a |
| — | Required in managed mode (write-class key). In direct mode it's passed to the witness too — the hosted witness authenticates the signing POST, so direct mode needs it unless you point |
|
| Managed tier: |
| — | Ed25519 PKCS#8 PEM for the agent key. In direct mode, if unset a fresh ephemeral key is minted per session (identity reads |
|
| Where receipt packages are written. |
Sessions are held in memory for the life of the process. A
sessionIddoes not survive a server restart orsequesign_finalize.
Install
As a Claude Desktop Extension (.mcpb) — recommended
The one-click path: download sequesign.mcpb from the
GitHub releases and open it
with Claude Desktop (Settings → Extensions → install from file). Desktop renders
a setup form from the manifest's user_config; fill in:
Field | Notes |
Mode |
|
API key | Your write-class key. Required for |
Agent private key (PEM) | Ed25519 PKCS#8 PEM. Required in |
Receipt package directory | Where sealed packages are written. Blank → a temp directory. |
Secrets go to the OS keychain (never the manifest), and blank optional fields
fall back to their defaults. The bundle is self-contained — no npm/node
project setup required. Where do the API key and agent key come from? See
Getting your keys below.
Building the .mcpb from source:
npm run build:mcpb -w @sequesign/mcp
# → packages/sequesign-mcp/sequesign.mcpb (+ the staged mcpb-dist/ directory)The build bundles the server and all dependencies into a single file with
esbuild and copies the protocol registry/schemas/profiles next to it, then packs
and validates via @anthropic-ai/mcpb. Attach the resulting .mcpb (and its
printed SHA-256) to a GitHub release.
Releasing to npm and the official MCP registry is automated — see PUBLISHING.md.
Via npm
For non-Desktop MCP clients (or if you prefer managing config yourself), install from npm and configure via environment variables — see Usage below.
Getting your keys (and which identity you get)
The two secrets — your API key and your agent private key — come from the Sequesign dashboard's Create-API-key flow. The key you use in managed mode must be the one registered to your API key.
Managed mode — registered identity
Create an API key in the dashboard (Settings → API keys → Create key). Registration is off by default, so you must opt in:
Enable "Register this key with an agent public key" (the checkbox in the create dialog — it's unchecked by default; without it you get a plain API key and no private-key PEM, which is not enough for managed mode).
Choose "Generate keypair (recommended)". The dashboard then generates an Ed25519 keypair in your browser (the private key never reaches our servers), registers the public key to your account (the platform signs a registration record bound to its fingerprint), and shows you the private-key PEM once — download it then.
Copy the API key and that private-key PEM.
Paste both into the setup form (or set SEQUESIGN_API_KEY and
SEQUESIGN_AGENT_PRIVATE_KEY). Reuse them across installs and machines — you do
not make a new key each time.
Bring your own key (advanced). Instead of "Generate keypair", you can pick "Bring your own public key (advanced)" and paste the public PEM of a key you generated yourself (e.g. in an HSM). You hold the private key; the platform records the public half. Fully supported in managed mode.
The broker accepts only the agent key your API key is registered to — whether the dashboard generated it or you brought your own. An unregistered key (generated locally and never registered) is rejected (
agent_public_key_not_registered). That's the rule: the key must be on file against your API key, and that binding happens at API-key creation.
Verifying the broker-stored receipt then shows a registered agent identity
(see the receiptUrl verify path below).
Direct mode — self-asserted identity
Direct mode has no account and no registration. The agent key only proves continuity (the same signer produced these receipts), not a platform-vouched identity. Two choices:
Leave the key blank → the server mints a fresh ephemeral key per session. Good for quick, one-off, anonymous-but-verifiable receipts; each receipt has a different
self_assertedkey.Paste a fixed PEM → one stable identity reused across sessions. Any Ed25519 PKCS#8 PEM works (e.g. the one the dashboard can generate for you, or
openssl genpkey -algorithm ed25519). It staysself_assertedunless that key is the one registered to yourSEQUESIGN_API_KEY: in that case the witness (which authenticates the same key) confirms the match and the receipt verifies as a registered identity — direct signing and a registered identity. (The witness also rejects signing under a key that isn't the one registered to your API key, so an API key can't mint receipts under an unregistered key.)
Usage
Add it to an MCP client (e.g. Claude Desktop) as a stdio server:
{
"mcpServers": {
"sequesign": {
"command": "npx",
"args": ["-y", "@sequesign/mcp"],
"env": {
"SEQUESIGN_MODE": "direct"
}
}
}
}Or run it directly:
npm install -g @sequesign/mcp
sequesign-mcpExample prompts
Drop these into any MCP-capable agent (Claude Desktop, etc.) once the server is configured. They're written the way you'd actually ask — the agent picks the tools.
1. Record and seal a single piece of work, then verify it.
Using Sequesign, open a session for task
q3-refund-reviewdelegated byops@acme.example, record an actionrefund_approvedwith the evidence{ "invoice": "INV-2231", "amount_usd": 480, "reason": "duplicate charge" }, then finalize the receipt and verify it. Tell me the package directory and whether it verified.
Exercises start_session → record_action → finalize → verify (the local
integrity self-check).
2. Multi-party: one agent records, two others attest after the fact.
The receipt at
<packageDirectory>is already sealed. Have Sequesign attach an approval to it ascfo@acme.example(a human reviewer), then attach a counterparty confirmation asvendor-globexfor therefund_approvedaction with purposerefund_amount_confirmation. Then verify the package and show me the approval and counterparty legs.
Exercises approve_receipt and countersign_receipt (deferred satellites bound
to an already-finalized receipt), then verify. A different party — even a
different model on another machine that has the package — can run these.
3. Verify the broker-stored, registered-identity copy (managed mode).
I finalized a managed-mode receipt; its
receipt_urlis<receipt_url>and the local package is at<packageDirectory>. Use Sequesign to verify the stored receipt against my package and tell me whether it shows external trust and a registered agent identity.
Exercises verify with receiptUrl — fetches the authoritative stored
envelope (carrying the registered agent_identity_attestation), auto-fetches
the published witness + registration anchors, and reports external trust plus
the registered identity.
Example flow
sequesign_start_session→{ taskId, delegatorId, policyContext }→ returnssessionId.sequesign_record_action→{ sessionId, actionType, evidence }→ returnsactionId.(optional)
sequesign_record_counterparty_attestation→{ sessionId, counterpartyId, attestedActionId, attestationPurpose }.(optional)
sequesign_record_approval→{ sessionId, approverId, approvedActionType, approvalContext }.sequesign_finalize→{ sessionId }→ returns the package directory + verification summary.sequesign_verify→{ packageDirectory }→ re-verify offline any time.
License
Apache-2.0
Available Tools
11 toolssequesign_approve_receiptApprove a sealed receipt (deferred satellite)A
Attach an independently-witnessed APPROVAL to an already-finalized receipt, without modifying it. Use this when a reviewer (human or another agent) signs off after the receipt was sealed — e.g. one model approves work another model recorded. The approval is bound to the sealed receipt by hash, witnessed at its own time, and written to the package's attestations sidecar. The approver MUST be distinct from the recording agent. If no approverPrivateKeyPem is given an ephemeral key is minted (present_unverified); pass an enrolled key + identityProofRef to vouch.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Transport for the witness seal. It MUST match how the receipt was sealed — the satellite must be witnessed by the same witness that sealed the receipt, or the verifier drops it (satellite_seal_untrusted_witness). Defaults to SEQUESIGN_MODE; set it if the receipt was finalized with a different per-call mode. | |
| partyType | No | Whether the approver is a human or an agent reviewer. Defaults to 'human'. | |
| approverId | Yes | Identity of the approver (lowercase email or label, e.g. 'reviewer@acme.example'). | |
| receiptUrl | No | Bind the approval to the broker-STORED receipt at this URL instead of the local package's receipt.json. In managed mode the stored copy carries the registered agent identity (different hash), so binding to it lets a later `verify --receiptUrl` show the registered identity AND this approval on one receipt. Fetched authenticated; must be a configured Sequesign receipt-store origin. | |
| approvalContext | No | What is being approved (any JSON value). Hashed into the signed approval. | |
| identityProofRef | No | base64url SignedRegistrationRecord (issuer 'sequesign') from enrollment, to make the approval vouched (present_verified). | |
| packageDirectory | Yes | Path to the sealed .sequesign package directory (the receipt to approve). | |
| approvedActionType | Yes | The action_type being approved (must match an action in the sealed receipt). | |
| approverPrivateKeyPem | No | Ed25519 private-key PEM of the approver. Omit to mint an ephemeral key. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the sparse annotations, the description discloses that the approval is hash-bound, witnessed at its own time, written to the attestations sidecar, and does not modify the receipt. It also explains the ephemeral-key path yielding present_unverified versus the vouched present_verified path with identityProofRef. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and every sentence earns its place: usage context, behavioral guarantees, binding mechanism, and identity constraints. There is no filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 9-parameter complexity and no output schema, the description covers the critical operational caveats: witness-mode matching, distinct approver, sidecar write, ephemeral vs enrolled key behavior, and the receiptUrl alternative. An agent has enough context to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds the crucial cross-parameter constraint that the approver MUST be distinct from the recording agent and links approverPrivateKeyPem to the present_unverified vs present_verified distinction. This is extra meaning beyond the individual schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: attach an independently-witnessed APPROVAL to an already-finalized receipt without modifying it. It also frames this as a deferred satellite and mentions hash-binding, which clearly distinguishes it from in-session approval or finalization siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this when a reviewer signs off after the receipt was sealed, e.g. one model approves work another model recorded. It gives important conditions like distinct approver and matching witness mode, but it does not explicitly name an alternative for in-session approvals, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sequesign_check_actionCheck an action against a templateARead-onlyIdempotent
Pre-flight a single action against a workflow template BEFORE recording it, so you learn a violation up front instead of in the finalized receipt's conformance report. Given a template (profileId), the action type, the session's bound parameters, and optionally the actions already recorded (priorActionTypes) and a draft evidence object, it reports: whether the action is allowed, whether the transition is valid, any parameter-binding errors, the concrete evidence schema for this action (with $param/$allowlist resolved against your params), whether a session can even be started for this template (startable — false for a registry template that cannot be bound under the intended transport: managed mode, or the template declares no usable parameters, uses a non-bundled action, or you did not pass params for its V1 binding — pass mode to model the transport you'll start with); and whether the action is recordable (recordSchemaValid — false when the action type has no registered schema, or supplied evidence does not satisfy that bundled schema). allowed is true only when the template is startable AND the mandate AND the recording gate all pass, so a green pre-flight means the action can actually be recorded. It is advisory and never records anything.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | The transport you intend to start the session with (mirrors sequesign_start_session's mode override). Determines startability for a registry template — remote binding is direct-only. Defaults to the server's configured mode. | |
| params | No | The parameter values you would bind at session start, bound against the template's `parameters` block (same rules as sequesign_start_session). Required if the template declares required parameters. | |
| evidence | No | A draft evidence object for the action. When the template declares an evidence_schema for actionType, the evidence is validated against the resolved schema and evidenceValid is reported. | |
| profileId | Yes | The template's profile_id to check against (from sequesign_list_templates). | |
| actionType | Yes | The action type you intend to record next. | |
| priorActionTypes | No | The action types already recorded on the chain, in order. Supply to check the transition into actionType (START -> actionType for an empty array). Omit to skip the transition check. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial behavior beyond them: the composed 'allowed' gating (startable AND mandate AND recording gate), the precise false-conditions for startable (managed mode, no usable parameters, non-bundled action, missing V1 params), the false-conditions for recordSchemaValid, and the $param/$allowlist resolution of the evidence schema. There is no contradiction with the annotations — 'never records anything' aligns with readOnlyHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in a strong first clause, and no content is wasted. However, the body is one dense run-on sentence with deeply nested parentheticals (the startable clause alone chains four false-conditions inside em-dashes), which makes it hard for an agent to parse quickly. The structure does not match the information density.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with six output flags and no output schema, the description carries the return-value burden well: it names and explains allowed, transition validity, parameter-binding errors, resolved evidence schema, startable, and recordable. The only notable gap is that 'the mandate' is referenced in the allowed composition without ever being defined or sourced, leaving one gate unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, setting a baseline of 3, but the description meaningfully enriches parameter meaning: it explains that params are bound against the template's parameters block, that evidence is validated against the resolved evidence schema (evidenceValid), that priorActionTypes drives the transition check (including the empty-array START case), and that mode determines startability for remote binding. This goes beyond the schema's per-parameter text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clause 'Pre-flight a single action against a workflow template BEFORE recording it' gives a specific verb, resource, and temporal scope, and the final clause 'advisory and never records anything' explicitly distinguishes it from the recording siblings. The tool's job — a pre-record validation gate — is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use it before recording to surface violations up front rather than in the finalized receipt's conformance report, and 'never records anything' tells the agent this is not the recording path. However, it never explicitly names the alternative (e.g., use sequesign_record_action when you intend to persist) or states when NOT to use it beyond implication.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sequesign_countersign_receiptCountersign a sealed receipt (deferred counterparty satellite)A
Attach an independently-witnessed COUNTERPARTY confirmation to an already-finalized receipt, without modifying it. Use this when a counterparty (e.g. a vendor, or another model acting as one) confirms an action after the receipt was sealed. The confirmation is bound to the sealed receipt + the attested action by hash, witnessed at its own time, and written to the package's attestations sidecar. If no counterpartyPrivateKeyPem is given an ephemeral key is minted (present_unverified); pass an enrolled key + identityProofRef to vouch.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Transport for the witness seal. It MUST match how the receipt was sealed — the satellite must be witnessed by the same witness that sealed the receipt, or the verifier drops it (satellite_seal_untrusted_witness). Defaults to SEQUESIGN_MODE; set it if the receipt was finalized with a different per-call mode. | |
| receiptUrl | No | Bind the confirmation to the broker-STORED receipt at this URL instead of the local package's receipt.json. In managed mode the stored copy carries the registered agent identity (different hash), so binding to it lets a later `verify --receiptUrl` show the registered identity AND this confirmation on one receipt. Fetched authenticated; must be a configured Sequesign receipt-store origin. | |
| counterpartyId | Yes | Canonical counterparty id (lowercase alphanumeric segments joined by single dots or hyphens, e.g. 'vendor-abc'). | |
| attestedActionId | Yes | The actionId in the sealed receipt the counterparty is confirming. | |
| identityProofRef | No | base64url SignedRegistrationRecord (issuer 'sequesign') from enrollment, to make the attestation vouched (present_verified). | |
| packageDirectory | Yes | Path to the sealed .sequesign package directory (the receipt to countersign). | |
| attestationPurpose | Yes | Why the counterparty is signing (e.g. 'delivery_confirmation'). | |
| counterpartyPrivateKeyPem | No | Ed25519 private-key PEM of the counterparty. Omit to mint an ephemeral key. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important behavioral details beyond the annotations: the confirmation does not modify the sealed receipt, it is hash-bound to the receipt and action, it is independently witnessed, and it is written to the attestations sidecar. It also clearly explains the ephemeral-key vs. enrolled-key identity behavior (present_unverified vs. present_verified), which is valuable execution context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three focused sentences: the core action, the when-to-use condition, and the behavioral/identity consequences. It is front-loaded with the primary purpose and every sentence contributes new, non-redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's 8 parameters and complex domain, the description is remarkably complete. It covers the core operation, the temporal constraint, the sidecar write, the hash binding, and the two identity modes. There is no output schema, but the description provides enough behavioral context for an agent to invoke the tool correctly and understand what the operation produces.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all parameters. The description goes beyond this for key parameters: it explains the counterpartyPrivateKeyPem omission/minting behavior, the role of identityProofRef in vouching, and the receiptUrl's purpose for showing registered identity on a stored receipt. This adds meaningful semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Attach an independently-witnessed COUNTERPARTY confirmation to an already-finalized receipt'. This clearly distinguishes the tool from the sibling record_counterparty_attestation by emphasizing deferred action on a sealed receipt, and it is further reinforced by the title's 'deferred counterparty satellite'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit context for use: 'Use this when a counterparty ... confirms an action after the receipt was sealed.' This is a clear trigger condition. However, it does not explicitly name alternatives or state when not to use the tool, especially relative to the closely related sibling sequesign_record_counterparty_attestation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sequesign_finalizeFinalize the receiptA
Seal the session into a verifiable receipt package and run the SDK's own verification. After finalize the sessionId is closed (removed from memory). Returns the package directory (and the stored receipt URL in managed mode) plus a verification summary.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | The receiptId returned by sequesign_start_session. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey the read/write and destructive profile, but the description adds meaningful behavior beyond that: finalize closes and removes the session from memory, and it produces a package directory plus verification summary. It does not mention irreversibility or failure behavior, but the added context is useful and does not conflict with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences carry all the essential information: the primary action, the lifecycle side effect, and the return contents. The description is front-loaded with the main behavior and contains no filler or redundant restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with no output schema, the description covers the critical return information: package directory, managed-mode receipt URL, and verification summary. A minor gap is that the shape of the 'verification summary' is unspecified, but the definition is still sufficiently complete for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single parameter, so the baseline is 3. The description reinforces that the sessionId is closed after finalize but adds no new format, validation, or source details. There is also a mild inconsistency in the schema, which calls the value 'receiptId' while the parameter is named 'sessionId,' and the description does not resolve it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Seal') and object ('the session into a verifiable receipt package'), making it clear this is the finalization step rather than a read/verification-only action. It also includes 'run the SDK's own verification' and describes the post-finalize closure, which helps distinguish it from general verify tools. However, it does not explicitly contrast itself with sequesign_verify, so full sibling differentiation is missing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The sentence 'After finalize the sessionId is closed (removed from memory)' clearly establishes this as the terminal step in the session lifecycle, implying the agent should call it only after all recording/approval actions are complete. This gives clear context but no explicit exclusions or alternatives, so it falls short of a top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sequesign_get_templateGet a workflow templateARead-onlyIdempotent
Fetch one workflow template by profile_id (bundled, or from the configured registry): its full profile document (allowed_actions, required_actions, allowed_transitions, parameters, conditional_requirements, required_attestations, and any evidence_schemas), plus its profile_hash, curation tier, source, session_ready, and whether it is author-signed. session_ready reflects the intended transport (the mode argument, else the server's default): a registry template is session_ready only under direct mode. Use this to learn a template's rules before starting a profile_constrained session or before sequesign_check_action.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | The transport you intend to start the session with (mirrors sequesign_start_session's mode override). Determines session_ready for a registry template — remote binding is direct-only. Defaults to the server's configured mode. | |
| profileId | Yes | The template's profile_id (e.g. from sequesign_list_templates). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and idempotent, and the description adds valuable non-obvious behavior: session_ready depends on the mode argument, falls back to the server default, and is direct-only for registry templates. It also clarifies that templates may be bundled or fetched from a configured registry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: what is fetched, what is returned, how session_ready behaves, and when to use it. The main action is front-loaded and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by listing all returned fields and explaining the tricky session_ready semantics. An agent can call this tool knowing exactly what to expect and why it matters for downstream decisions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters thoroughly. The description adds some context about template provenance and mode-dependent session_ready, but it largely reinforces rather than extends the schema's parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: fetching one workflow template by profile_id. It enumerates the exact return fields, which distinguishes it clearly from list_templates (list vs. single item) and check_action (inspect rules vs. validate an action).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool: before starting a profile_constrained session or before sequesign_check_action. It does not explicitly name alternatives or state when-not-to-use it, so it stops just short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sequesign_list_templatesList workflow templatesARead-onlyIdempotent
List the Sequesign workflow templates (profiles) available for profile_constrained sessions: the bundled templates (full detail), plus — when a template registry is configured (SEQUESIGN_TEMPLATE_REGISTRY_URL) — templates published to it (manifest-level entries; call sequesign_get_template for a remote template's full detail). Every entry gives the profile_id (pass it to sequesign_start_session), its curation tier (official | verified | community | experimental — discovery metadata, NOT a security control), its source (bundled vs the registry), and details_available (false for remote manifest-level entries). Bundled entries additionally give session_ready (whether start_session can bind AND run it), description, the parameters you must bind, allowed/required actions, and whether the template is author-signed. Optionally filter by tier.
| Name | Required | Description | Default |
|---|---|---|---|
| tier | No | Only return templates in this curation tier. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only/idempotent, and the description adds genuinely useful behavior: entry details differ between bundled and registry sources, details_available indicates remote manifest-level entries, and the curation tier is explicitly 'NOT a security control.' It also discloses the SEQUESIGN_TEMPLATE_REGISTRY_URL dependency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph, but every clause carries information – no filler or repetition. It front-loads the core purpose and then layers detail logically, though it could be more scannable with bulleted lists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating every field an entry contains, distinguishing bundled vs remote entries, and connecting profile_id to sequesign_start_session. It also specifies the optional filter and the environment-variable prerequisite, making the tool callable without additional lookups.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully documents the optional tier parameter with an enum, so the baseline is 3. The description adds meaningful nuance by calling the tier 'discovery metadata, NOT a security control' and by confirming the filter is optional, which helps the agent treat it as a soft filter rather than a security boundary.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and resource – 'List the Sequesign workflow templates (profiles) available for profile_constrained sessions' – and clearly distinguishes bundled from registry templates. It also names the sibling tool sequesign_get_template for remote detail, so an agent can tell this list operation apart from related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to call sequesign_get_template when a remote template's full detail is needed, and notes that profile_id should be passed to sequesign_start_session, which frames list_templates as the discovery step. Although it doesn't state 'when not to use' broadly, the contrast with get_template is explicit enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sequesign_record_actionRecord an actionA
Append a signed action to the session's chain. evidence is the structured record of what the agent did or observed; it is hashed and signed. Returns the actionId (use it as attestedActionId for a counterparty attestation).
| Name | Required | Description | Default |
|---|---|---|---|
| evidence | No | Structured evidence for the action (any JSON value). Hashed and signed. | |
| metadata | No | Optional non-signed-over metadata (e.g. agent reasoning). | |
| schemaId | No | Override the registered schema for this action (a schema_id). Only used when the session is schema/profile-bound; by default the schema is resolved from actionType. Ignored for freeform sessions. | |
| sessionId | Yes | The receiptId returned by sequesign_start_session. | |
| actionType | Yes | Short snake_case label for the action (e.g. 'invoice_policy_checked'). | |
| verifiabilityClass | No | How the evidence can be verified. Defaults to 'deterministic'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a non-read-only, non-idempotent write operation. The description adds meaningful behavioral context beyond that: the action is appended to the session chain, evidence is hashed and signed, and an actionId is returned. This clarifies the side effects and the role of the evidence without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no fluff. It front-loads the core operation first, then explains the key parameter's role and the return value's downstream use. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with six parameters, two required, and no output schema, the description covers the essential operation, the purpose of evidence, and the return value. The schema supplies parameter details and defaults. The main omission is explicit error or precondition information, but nothing suggests that is critical for a well-formed session.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter. The description adds some useful framing around 'evidence' being a structured record of what the agent did or observed and notes that the return value is an actionId, but it does not materially extend the per-parameter semantics already present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Append a signed action to the session's chain.' This clearly identifies what the tool does and distinguishes it from sibling tools like record_approval or record_counterparty_attestation by focusing on a generic recorded action rather than an approval or attestation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when the tool should be used: when the agent has performed or observed something that should be recorded as a signed action. It also gives downstream guidance by explaining how to use the returned actionId. However, it does not explicitly contrast this tool with alternatives such as record_approval or record_counterparty_attestation, so routing among siblings is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sequesign_record_approvalRecord an approvalA
Attach a signed approval for an action already recorded in this session (e.g. a human or independent agent reviewer signing off). The action being approved must already be recorded. If no approverPrivateKeyPem is given, an ephemeral key is minted and the approval leg stays present_unverified; supply an enrolled key plus identityProofRef to make it a vouched (present_verified) approval.
| Name | Required | Description | Default |
|---|---|---|---|
| partyType | No | Whether the approver is a human or an agent reviewer. Defaults to 'human'. | |
| sessionId | Yes | The receiptId returned by sequesign_start_session. | |
| approverId | Yes | Identity of the approver (lowercase email or label, e.g. 'cfo@acme.example'). | |
| approvalContext | No | What is being approved (any JSON value). Hashed into the signed approval. | |
| identityProofRef | No | base64url SignedRegistrationRecord (issuer 'sequesign') from enrollment, to make the approval vouched (present_verified). | |
| approvedActionType | Yes | The action_type being approved (must match a recorded action). | |
| approverPrivateKeyPem | No | Ed25519 private-key PEM of the approver. Omit to mint an ephemeral key. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses important behavior: omitting approverPrivateKeyPem mints an ephemeral key and results in a present_unverified approval leg, while supplying an enrolled key plus identityProofRef produces a vouched present_verified approval. This is substantive and not inferable from the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The core purpose and prerequisite come first, followed by the key behavioral conditional about ephemeral keys and verification state. Every part earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with full schema coverage, the description covers the critical prerequisite, verification states, and key-handling behavior. It could be slightly more complete by naming sibling tools for routing and mentioning return expectations, but nothing essential to calling the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds meaningful cross-parameter semantics by explaining the consequence of omitting approverPrivateKeyPem and the role of identityProofRef in achieving a verified approval, which is more than the individual property descriptions convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb and scope: 'Attach a signed approval for an action already recorded in this session.' This clearly differentiates it from receipt- or session-level operations and tells an agent exactly what resource it acts on.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context and a hard prerequisite: the action being approved must already be recorded. It also gives a realistic use case (human or independent agent reviewer signing off). It does not explicitly name sibling alternatives like sequesign_approve_receipt, so exclusion guidance is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sequesign_record_counterparty_attestationRecord a counterparty attestationA
Attach a counterparty's signed confirmation of an action already recorded in this session (e.g. a vendor confirming a corrected invoice total). The SDK derives the content binding from the attested action, so the confirmation cannot be pointed at content the counterparty never saw. If no counterpartyPrivateKeyPem is given, an ephemeral key is minted (present_unverified); supply an enrolled key plus identityProofRef for a vouched (present_verified) attestation.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes | The receiptId returned by sequesign_start_session. | |
| counterpartyId | Yes | Canonical counterparty id (lowercase alphanumeric segments joined by single dots or hyphens, e.g. 'vendor-abc'). | |
| attestedActionId | Yes | The actionId (from sequesign_record_action) the counterparty is confirming. | |
| identityProofRef | No | base64url SignedRegistrationRecord (issuer 'sequesign') from enrollment, to make the attestation vouched (present_verified). | |
| attestationPurpose | Yes | Why the counterparty is signing (e.g. 'invoice_amount_confirmation'). | |
| counterpartyPrivateKeyPem | No | Ed25519 private-key PEM of the counterparty. Omit to mint an ephemeral key. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false, so the description carries the behavioral burden. It discloses that content binding is SDK-derived from the attested action and cannot be pointed at unseen content, and it explains ephemeral key vs. enrolled key behavior for present_unverified vs. present_verified attestations. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three purposeful sentences with no filler. The main operation is front-loaded, followed by the key integrity constraint and mode-selection guidance. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter write tool with no output schema, the description covers the essential selection and invocation knowledge: what it does, the binding constraint, and the key-mode decision. It does not state the return value or explicitly contrast with related sibling tools, but these are not severe gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter already has descriptive schema text. The description adds cross-parameter meaning by explaining that attestedActionId is cryptographically bound, not freely selectable, and by linking counterpartyPrivateKeyPem plus identityProofRef to the vouched attestation mode.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Attach a counterparty's signed confirmation of an action already recorded in this session', with a concrete example. It is semantically distinct from sibling tools like record_approval or countersign_receipt, though it does not name those alternatives explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context for when to use the tool: when a counterparty confirms an action that was already recorded in the current session. It also describes two usage modes based on whether counterpartyPrivateKeyPem is supplied, but it does not explicitly say when not to use it or compare it with sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sequesign_start_sessionStart a Sequesign sessionA
Open a new receipt-recording session (one signed action chain). Returns a sessionId (the receiptId) used by the other tools. Provide a policyContext object to bind the receipt to a policy (reaches verification level L3_POLICY_BOUND).
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Override the server's default transport for this session. 'direct' signs locally and the independent witness co-signs (self_asserted identity, you keep the envelope). 'managed' routes through the broker (registered identity, broker-stored). Defaults to SEQUESIGN_MODE. | |
| params | No | Bind concrete values to a parameterized template's `parameters` (e.g. { max_amount: 5000 }). Requires `profile`, and that template must declare usable parameters. When supplied, the values are committed into the chain genesis (params_hash / SEQUESIGN_GENESIS_V1) so the template's parameterized evidence constraints apply and travel in the receipt. Use sequesign_list_templates / sequesign_check_action to learn a template's parameters and pre-flight them first. Omit for an unparameterized (V0) session. | |
| taskId | Yes | Stable identifier for the delegated task. | |
| agentId | No | Identifier for the acting agent. Defaults to 'sequesign-mcp-agent'. | |
| profile | No | Registered workflow template to bind this receipt to, given by its profile_id (e.g. 'sequesign.invoice_payment.v0.1'). When set, the session records in profile_constrained mode: each action must be a registered action type whose evidence validates against its JSON Schema, and the chain must satisfy the template's required actions/transitions — reaching schema_valid + workflow_profile_valid. Omit for a freeform receipt (the default). | |
| delegatorId | Yes | Who delegated the task (the principal the agent acts for). | |
| policyContext | No | Policy the agent operates under (object). Hashed into the receipt's policy_context_hash; presence raises the receipt to L3_POLICY_BOUND. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish non-read-only, non-idempotent, non-destructive behavior. The description adds meaningful context beyond that: each session maps to 'one signed action chain,' the sessionId doubles as the receiptId, and providing policyContext raises verification to L3_POLICY_BOUND. No contradiction with the annotations — readOnlyHint=false aligns with 'Open a new session.'
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the first names the action, the second the return value, the third the one high-value optional parameter. The parenthetical '(one signed action chain)' compresses a key behavioral constraint into minimal space. Fully front-loaded with the core action in the opening phrase.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 7 parameters, nested objects, and no output schema, the description covers the most critical gap by naming the return value (sessionId/receiptId). Combined with the schema's exceptionally rich parameter descriptions (template binding, transport modes, verification levels), an agent has enough to call this correctly. Slightly incomplete in that it doesn't note each call opens a fresh chain (relevant given idempotentHint=false), but the surrounding schema context mitigates this.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema richly documents all 7 parameters including the mode enum, profile template binding, and pre-flight guidance via sequesign_list_templates/check_action. The description's only parameter note — that policyContext binds the receipt to a policy reaching L3_POLICY_BOUND — largely restates the schema's own policyContext description, adding no new semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: 'Open a new receipt-recording session (one signed action chain).' This clearly distinguishes it from all ten siblings, which operate on an existing session (record_action, approve_receipt, finalize, verify, etc.). The clarification that it returns the sessionId used by the other tools further anchors its unique role as the session initializer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Returns a sessionId (the receiptId) used by the other tools' gives clear workflow-position context: this is the entry point that must precede record/approve/finalize operations. Sibling names make the sequence inferable. However, it does not explicitly state when not to use it (e.g., if a session already exists) or name alternatives, stopping short of the full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sequesign_verifyVerify a receipt packageARead-onlyIdempotent
Verify a sealed Sequesign receipt. Modes: (1) default — an integrity self-check of the local package (trust anchor is the receipt's own embedded witness keys); (2) pass trustedWitnessKeysJson and/or trustedRegistrationKeysJson for a third-party 'external' trust check and registered-identity promotion; (3) set fetchAnchors:true to auto-fetch those witness + registration anchors from the configured well-knowns (so a local direct-mode receipt reports external trust and a registered identity without pasting JSON); (4) pass receiptUrl to verify the broker-STORED receipt (the authoritative copy that carries the registered agent_identity_attestation), auto-fetching the anchors. receiptUrl still needs packageDirectory (the stored envelope is verified against the package's evidence/keys).
| Name | Required | Description | Default |
|---|---|---|---|
| receiptUrl | No | The broker-stored receipt URL (the receipt_url from finalize). When set, the stored envelope is fetched (with SEQUESIGN_API_KEY) and verified against packageDirectory, with witness + registration anchors auto-fetched — surfacing external trust and the registered identity. | |
| fetchAnchors | No | Local verify only (ignored with receiptUrl): auto-fetch the witness keys and platform registration-keys from the configured SEQUESIGN_WITNESS_URL / SEQUESIGN_DASHBOARD_API_URL well-knowns, so the result surfaces external witness trust and the registered agent/approver/counterparty identity without pasting JSON. Explicit trustedWitnessKeysJson / trustedRegistrationKeysJson override the matching fetch. Best-effort: an unreachable endpoint falls back (witness → self; registration → leg not promoted) and is noted in the result. Default false = fully offline self-check. | |
| packageDirectory | Yes | Path to the .sequesign package directory (the actions/evidence/keys live here). | |
| trustedWitnessKeysJson | No | Contents of the witness's published keys.json. Provided → 'external' trust check; omitted (and no receiptUrl) → the receipt's embedded keys are used ('self', integrity only). With receiptUrl it overrides the auto-fetched witness anchors. | |
| trustedRegistrationKeysJson | No | Contents of the platform's published registration-keys.json, to flip the agent/approver/counterparty legs to verified. With receiptUrl it overrides the auto-fetched registration anchors. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial behavioral context beyond them: the trust-anchor model (embedded vs supplied vs auto-fetched keys), precise best-effort fallback semantics ("witness → self; registration → leg not promoted"), the SEQUESIGN_API_KEY auth requirement for receiptUrl, and the surprising constraint that receiptUrl still requires packageDirectory. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description front-loads its purpose and uses numbered modes that make a complex 4-mode tool scannable. It is dense and heavily parenthetical, but every clause carries operational meaning; the length is justified by the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity tool with 5 interacting parameters and no output schema, the description covers all modes, auth needs, fallback behavior, and required parameter combinations. The only gap is that return value shape and error conditions are never described, though the description hints at outputs ("surfacing external trust", "noted in the result").
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds genuine value by explaining cross-parameter interactions the per-property schema cannot: override semantics ("Explicit trustedWitnessKeysJson / trustedRegistrationKeysJson override the matching fetch"), mode exclusivity (fetchAnchors ignored with receiptUrl), and the packageDirectory dependency of receiptUrl.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Verify a sealed Sequesign receipt" is a specific verb+resource statement that immediately conveys the tool's function. The four enumerated modes further clarify scope, and the verification purpose is clearly distinct from the sibling tools that record actions, approve/countersign, or finalize receipts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance for each mode: default self-check for offline integrity, trusted JSON params for third-party checks, fetchAnchors for auto-fetching, and receiptUrl for the broker-stored authoritative copy. It also notes exclusions ("Local verify only (ignored with receiptUrl)" and "Default false = fully offline self-check"), though it never names sibling alternatives explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
v0.4.1- First observed
sequesign_approve_receipt - First observed
sequesign_check_action - First observed
sequesign_countersign_receipt - First observed
sequesign_finalize - First observed
sequesign_get_template - First observed
sequesign_list_templates - First observed
sequesign_record_action - First observed
sequesign_record_approval - First observed
sequesign_record_counterparty_attestation - First observed
sequesign_start_session - First observed
sequesign_verify
TDQS
Scored across 11 tools
The tools are largely distinct, with clear phase boundaries: session lifecycle (start/record/finalize), post-finalization attestations, verification, and template management. However, the four attestation tools (record_approval vs approve_receipt, record_counterparty_attestation vs countersign_receipt) have similar names and differ mainly by whether the receipt is finalized, which creates some misselection risk despite detailed descriptions.
All tools share the uniform sequesign_ prefix and use snake_case verb-first naming, which is highly predictable. The minor deviation is that finalize and verify are bare verbs rather than verb_noun, and the record_approval vs approve_receipt pair shifts verb style, but overall the pattern is clear and consistent.
At 11 tools, the server is well-scoped and each tool earns its place across the receipt lifecycle: session recording, in-session attestations, post-finalization attestations, verification, and template management. The count is substantial enough to cover the domain without feeling bloated or redundant.
The core workflow is fully covered: start_session, record_action, attestations (both before and after finalization), finalize, and verify form a complete lifecycle with no dead ends. Template discovery and pre-flight checking are also well covered, though minor gaps exist such as no way to inspect a session's recorded actions or discover previously sealed receipts.
Maintenance
Related MCP Connectors
Issue signed receipts for AI agent actions; verify any receipt offline - free, no account.
AI agent infrastructure for discovery, authorization, execution, identity, and signed receipts.
Human-in-the-loop approval for agent actions, with verifiable action-bound receipts.
Cryptographically anchored evidence for agents: verified run receipts, proof-gated settlement.
Related MCP Servers
AlicenseNot gradedqualityCmaintenanceTamper-evident receipts for AI agent actions. The notary layer for agent-to-agent transactions.23 npm1MIT
emilia-mcp-serverofficial
AlicenseAqualityAmaintenanceThe accountability layer for AI agents — a named human's signed yes before an agent does anything irreversible (payment, record change, deploy), then an offline-verifiable Trust Receipt. Apache-2.0, formally verified.3650Apache 2.0- AlicenseNot gradedqualityDmaintenanceVerifiable action receipts for AI agents — agents sign claims locally, an independent witness countersigns and timestamps, anyone can verify offline.12 npmMIT
- AlicenseAqualityAmaintenanceProvides tools to issue, verify, and export cryptographically signed receipts for AI agent actions, enabling tamper-proof audit trails for compliance with regulations like the EU AI Act.439 npm1MIT