11addffe05f6ff043de78fdd9d1f1cc5d4804e65source_git · kychee-com/kysigned · latest release
Observed 2026-08-25T08:45:59.178Z using mcpSecurity-inventory. Protocol 2025-06-18.
| Tool | Category | Risk |
|---|---|---|
check_envelope_statusCheck a signing envelope: per-signer signing status and times, plus each signer's delivery_status (pending / delivered / undeliverable — whether the signing-request email reached them, distinct from whether they signed). Accepts EITHER the ambient KYSIGNED_AUTHORIZATION creator key OR a per-envelope tracking_token (ktt_…, returned by every create — F-30.7): the token needs NO API key and reads exactly its own envelope, so the no-key wallet path polls through the same tool it created with. An explicit tracking_token wins over the ambient key.Input schema{
"type": "object",
"properties": {
"envelope_id": {
"type": "string",
"minLength": 1,
"description": "The envelope ID to check"
},
"tracking_token": {
"type": "string",
"description": "Envelope-scoped read-only observer token (ktt_…) from the create result — no API key needed."
}
},
"required": [
"envelope_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"title": "Check envelope status",
"readOnlyHint": true,
"openWorldHint": true
} | — | — |
create_envelopeCreate a new signing envelope. Sends a PDF to one or more signers (max 20); at completion every party receives a sealed evidence-bundle PDF. Provide EXACTLY ONE of pdf_base64 (≤ ~3 MB) or pdf_url (any size, fetched server-side). Consumes a creator credit and emails each signer.Input schema{
"type": "object",
"properties": {
"document_name": {
"type": "string",
"description": "Human-readable name for the document"
},
"pdf_base64": {
"type": "string",
"description": "Base64-encoded PDF, ≤ ~3 MB raw (synchronous-invoke body cap). For larger documents use pdf_url."
},
"pdf_url": {
"type": "string",
"format": "uri",
"description": "https URL the service fetches the PDF from server-side (the large-document escape)."
},
"signers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"email": {
"type": "string",
"format": "email",
"description": "Signer email address"
},
"name": {
"type": "string",
"description": "Signer display name"
}
},
"required": [
"email",
"name"
],
"additionalProperties": false
},
"minItems": 1,
"maxItems": 20,
"description": "1–20 signers (email + display name)"
},
"message": {
"type": "string",
"description": "Optional message included in the signing-request email"
},
"expiry_days": {
"type": "integer",
"exclusiveMinimum": 0,
"description": "Days until the envelope expires unsigned (omit for the operator default)."
},
"callback_url": {
"type": "string",
"format": "uri",
"description": "https completion-webhook URL; the 201 returns callback_secret once for verifying deliveries."
},
"auto_close": {
"type": "boolean",
"description": "false = manual seal (call seal after all signers sign) rather than auto-distribute."
}
},
"required": [
"document_name",
"signers"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"title": "Create envelope",
"readOnlyHint": false,
"destructiveHint": false,
"openWorldHint": true
} | — | — |
create_envelope_x402Create a signing envelope PAYING PER ENVELOPE from the local run402 wallet via x402 — no API key and no kysigned account needed (the payment itself establishes the creator record for creator_email). This tool SPENDS REAL FUNDS: it pays the operator's live per-envelope price (read from the x402 route's challenge; kysigned.com: $0.25 USDC on Base mainnet). Safety order: it first runs the FREE preflight validation, then checks the wallet balance, and only then pays — an invalid request or short balance never triggers a charge. Retries are safe: the spending-intent idempotency key (yours, or a generated one returned in the result) replays the same envelope without paying twice. The payer resolves once from: an explicit allowance file (KYSIGNED_RUN402_ALLOWANCE_PATH), an embedder-injected opaque signer (KMS/HSM), or the host-local run402 allowance wallet (`run402 init`); its key is never a tool argument and never appears in output. On success the result carries the payment receipt and a tracking block whose ktt_ token polls this envelope with NO account (pass it to check_envelope_status as tracking_token); creator_email sign-in stays available for the dashboard.Input schema{
"type": "object",
"properties": {
"creator_email": {
"type": "string",
"format": "email",
"description": "REQUIRED deliverable address that becomes the creator record: creation/completion mail and the evidence bundle land there, and signing in with it later (magic link) opens the dashboard for this envelope."
},
"document_name": {
"type": "string",
"description": "Human-readable name for the document"
},
"pdf_base64": {
"type": "string",
"description": "Base64-encoded PDF, ≤ ~3 MB raw (synchronous-invoke body cap). For larger documents use pdf_url."
},
"pdf_url": {
"type": "string",
"format": "uri",
"description": "https URL the service fetches the PDF from server-side (the large-document escape)."
},
"signers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"email": {
"type": "string",
"format": "email",
"description": "Signer email address"
},
"name": {
"type": "string",
"description": "Signer display name"
}
},
"required": [
"email",
"name"
],
"additionalProperties": false
},
"minItems": 1,
"maxItems": 20,
"description": "1–20 signers (email + display name)"
},
"message": {
"type": "string",
"description": "Optional message included in the signing-request email"
},
"expiry_days": {
"type": "integer",
"exclusiveMinimum": 0,
"description": "Days until the envelope expires unsigned (omit for the operator default)."
},
"callback_url": {
"type": "string",
"format": "uri",
"description": "https completion-webhook URL; the 201 returns callback_secret once for verifying deliveries."
},
"auto_close": {
"type": "boolean",
"description": "false = manual seal (call seal after all signers sign) rather than auto-distribute."
},
"idempotency_key": {
"type": "string",
"maxLength": 256,
"description": "Your spending-intent key: a retry with the same key replays the same envelope without paying twice. Omitted → one is generated and returned as spending_intent_key."
}
},
"required": [
"creator_email",
"document_name",
"signers"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"title": "Create envelope (wallet-paid)",
"readOnlyHint": false,
"destructiveHint": true,
"openWorldHint": true
} | — | — |
list_envelopesList the envelopes you (the authenticated creator) have sent, with each one's status.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {}
}Annotations{
"title": "List envelopes",
"readOnlyHint": true,
"openWorldHint": true
} | — | — |
send_reminderSend a reminder email to all pending signers on an envelope.Input schema{
"type": "object",
"properties": {
"envelope_id": {
"type": "string",
"minLength": 1,
"description": "The envelope ID"
}
},
"required": [
"envelope_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"title": "Send reminder",
"readOnlyHint": false,
"destructiveHint": false,
"openWorldHint": true
} | — | — |
void_envelopeVoid an active envelope. Cancels all pending signing requests and notifies signers. Irreversible.Input schema{
"type": "object",
"properties": {
"envelope_id": {
"type": "string",
"minLength": 1,
"description": "The envelope ID to void"
}
},
"required": [
"envelope_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Annotations{
"title": "Void envelope",
"readOnlyHint": false,
"destructiveHint": true,
"openWorldHint": true
} | — | — |
wallet_statusReport the payer's payment readiness for wallet-paid envelope creation: payer provenance (source kind + public address + network — never key material), asset, on-chain balance (read resiliently across independent RPC providers), the live per-envelope price (read from the x402 route's own challenge), and whether the balance covers it — when short, a structured QR-ready fund_wallet action (ERC-681 payment URI for exactly the shortfall). Read-only — never creates, spends, or initiates an on-chain transaction. Needs no API key: the wallet-paid path works without KYSIGNED_AUTHORIZATION. The payer resolves once from: an explicit allowance file (KYSIGNED_RUN402_ALLOWANCE_PATH), an embedder-injected opaque signer, or the host-local run402 allowance (`run402 init`); its key is never a tool argument and never appears in output.Input schema{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {}
}Annotations{
"title": "Wallet status",
"readOnlyHint": true,
"openWorldHint": true
} | — | — |
Compared with initial baseline using full_baseline.
| Risk | Change | Subject |
|---|---|---|
| No material changes recorded. | ||
| Severity | Finding | Advisory |
|---|---|---|
| No confirmed vulnerability is published for this version. | ||
Artifact SHA-256: b1185c79d00d851af8ee28bfc37df600eee2a9929bd618a2194ef55bab022b03
Scanner: mcp-proof-engine 0.1.0.