Verify VSL Settlement Receipts and sign triggers in TypeScript, conforming to sdcreceipt.
MCPpedia last refreshed this data
io.github.SemanticDataCharter/sdcreceipt-ts is an MCP server that verify VSL Settlement Receipts and sign triggers in TypeScript, conforming to sdcreceipt. Its tool list has not been published yet over stdio, sse and http, requires no API key, and scores 89/100 on MCPpedia's security, maintenance and efficiency rubric.
Config is the same across clients - only the file and path differ.
{
"mcpServers": {
"io-github-semanticdatacharter-sdcreceipt-ts": {
"args": [
"-y",
"sdcreceipt-ts"
],
"command": "npx"
}
}
}Are you the author?
Add this badge to your README to show your security score and help users find safe servers.
Verify VSL Settlement Receipts and sign triggers in TypeScript, conforming to sdcreceipt.
Run this in your terminal to verify the server starts. Then let us know if it worked - your result helps other developers.
npx -y 'sdcreceipt-ts' 2>&1 | head -1 && echo "✓ Server started successfully"
After testing, let us know if it worked:
Five weighted categories - click any category to see the underlying evidence.
No known CVEs.
Checked sdcreceipt-ts against OSV.dev.
Click any tool to inspect its schema.
Be the first to review
Have you used this server?
Share your experience - it helps other developers decide.
Sign in to write a review.
Others in developer-tools
XcodeBuildMCP provides tools for Xcode project management, simulator management, and app utilities.
Manage Supabase projects — databases, auth, storage, and edge functions
MCP server for using the GitLab API
Codebase knowledge graph for AI agents — 162 languages, sub-ms queries, 99% fewer tokens.
MCP Security Weekly
Get CVE alerts and security updates for io.github.SemanticDataCharter/sdcreceipt-ts and similar servers.
Start a conversation
Ask a question, share a tip, or report an issue.
Sign in to join the discussion.
Verify VSL Settlement Receipts, sign settlement triggers and request Receipts from an issuer in TypeScript, with the same results as sdcreceipt, the reference implementation.
Conforms to:
CI runs both, pinned to a fixed commit and release.
It runs in Node (20 or later), Deno and browsers. Verifying and signing need no network and no
account. You supply the keys, so a Receipt can never nominate the key it is judged by. Only settle
reaches an issuer.
import { assembleKeys, verify } from 'sdcreceipt-ts';
// Key documents, each in the role YOU assign. Never from a location inside the Receipt.
const keys = await assembleKeys([
{ role: 'issuer', document: issuerKeyDocument }, // https://sdcstudio.axius-sdc.com/.well-known/sdcstudio-signing-keys.json
{ role: 'party', document: vendorKeyDocument },
{ role: 'party', document: buyerKeyDocument },
]);
const result = await verify(receipt, { ...keys, governanceReceipt, payload });
result.ok; // true only if every check passed
result.checks; // every check that ran, passed or not: receipt_hash, signature[...], trigger[...], ...
What verify checks:
receipt_hash: recomputed over the RFC 8785 canonical content.ES256 for Receipt 1.0, and both ES256 and ML-DSA-65 (FIPS 204) for Receipt 1.1.{condition_hash, receipt_id}, with the check that no party triggered twice.It reports every check, never only the first failure. A settled Receipt checked without party keys
does not verify: settlement.complete is recorded as unestablished, never decided by comparing
key_id strings.
What assembleKeys refuses:
A key marked revoked fails any signature it made.
import { generateKey, keyDocument, signTrigger } from 'sdcreceipt-ts';
const { privateKey, publicKey } = await generateKey(); // ECDSA P-256 (ES256)
const published = await keyDocument(publicKey, myKeyId); // publish this at your key_id
const trigger = await signTrigger(privateKey, receipt, myKeyId); // returned, never submitted
Keys exchange as PKCS#8 and SPKI PEM (privateKeyPem, loadPrivateKey), the files sdcreceipt reads
and writes. Triggers move both ways: sdcreceipt verifies a trigger signed here, and this library
verifies one sdcreceipt signed.
settle)import { settle, splitResponse, SettleRejected } from 'sdcreceipt-ts';
try {
const answer = await settle(payloadXml, {
token: process.env.SDCRECEIPT_TOKEN!, // an SDCStudio API token; the endpoint defaults to SDCStudio's
targetState: 'shipped', // currentState defaults to the payload's own <current-state>
condition: { on: 'goods received' }, // hashed by the issuer, never stored
parties: [vendorKeyId, buyerKeyId], // at least two, each a key_id its party controls
});
const { receipt } = splitResponse(answer); // the signed Receipt, out of the issuer's envelope
} catch (e) {
if (e instanceof SettleRejected) console.log(e.explain()); // the transitions that would have worked
}
This is the one function