MCP server
For assistants and agents. Connect Claude, ChatGPT or your own agent. Everything your team does in chat, your agent can do too.
See what it can doDevelopers
The same engine your team runs from Claude or ChatGPT, for your own product. Create applications, send upload links, read checked facts with their source pages, and get told the moment a file is complete.
{
"type": "application.complete",
"application": {
"id": "app_7Hk2Qe",
"name": "Mokoena Logistics"
},
"requirements": { "met": 4, "total": 4 },
"facts": [{
"label": "Average monthly deposits",
"value": 183200,
"source": { "document": "doc_91Fx", "page": 3 }
}],
"flags": [],
"pack_url": "https://…/packs/app_7Hk2Qe.zip"
}
Use whichever fits. They share the same applications, so your team can work in their assistant while your systems listen for events.
For assistants and agents. Connect Claude, ChatGPT or your own agent. Everything your team does in chat, your agent can do too.
See what it can doFor your product and back office. Create applications from your own onboarding flow, read facts into your models, and download the pack into your system of record.
Start in five minutesFor reacting as things happen. Get a signed event when an applicant uploads, when a check finds something, and when a file is complete.
See the eventsStart from a template, add an applicant, and Sigmund sends them their upload link. Everything after that is checked for you.
curl -X POST "$SIGMUND_API_URL/v1/applications" \
-H "Authorization: Bearer $SIGMUND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Mokoena Logistics",
"template": "sme-lending",
"applicants": [{
"name": "Lindiwe Mokoena",
"email": "lindiwe@example.com",
"invite": true
}]
}'import Sigmund from "@sigmund/sdk";
const sigmund = new Sigmund({ apiKey: process.env.SIGMUND_API_KEY });
const application = await sigmund.applications.create({
name: "Mokoena Logistics",
template: "sme-lending",
applicants: [
{ name: "Lindiwe Mokoena", email: "lindiwe@example.com", invite: true },
],
});
console.log(application.applicants[0].uploadLink);import os
from sigmund import Sigmund
sigmund = Sigmund(api_key=os.environ["SIGMUND_API_KEY"])
application = sigmund.applications.create(
name="Mokoena Logistics",
template="sme-lending",
applicants=[
{"name": "Lindiwe Mokoena", "email": "lindiwe@example.com", "invite": True},
],
)
print(application.applicants[0].upload_link)
{
"id": "app_7Hk2Qe",
"status": "collecting",
"requirements": [
{ "label": "Bank statements",
"period": "6 months",
"status": "outstanding" },
{ "label": "Annual financial statements",
"status": "outstanding" },
…
],
"applicants": [{
"id": "apl_3Ld9",
"upload_link": "https://…",
"invited": true
}]
}
What your team does in Claude or ChatGPT works through this server. Point your own agent at it and it can do the same, signed in as the person who connected.
Start one from a template or your own list, see what is in, missing or flagged, and close it when you have what you need.
Add people, send their private links in your own words, ask for something specific, and switch off a link if it goes astray.
Read the facts with the page they came from, approve or send back an upload, and correct what a file was matched to.
Turn a good application into a template, so the next one of its kind starts the same way.
Every event is signed, retried until you acknowledge it, and safe to receive twice.
application.createdA new application exists, from the API or from chat.applicant.link_openedAn applicant opened their upload link.document.uploadedA file arrived and was matched to a requirement.document.issue_foundSomething the applicant can fix, and they’ve been told.review.flag_raisedSomething only a reviewer should see. Never shown to the applicant.requirement.addedA new requirement, often because of something in the documents.application.completeEvery requirement met. The pack is ready.POST https://your-app.example.com/webhooks/sigmund
Sigmund-Signature: t=1793001200,v1=5f2b…
{
"type": "document.issue_found",
"application": { "id": "app_7Hk2Qe" },
"requirement": "Bank statements",
"issue": {
"code": "period_short",
"detail": "Covers Jul to Sep; 6 months required",
"applicant_told": true
}
}
Workspace-scoped API keys for the REST API. OAuth sign-in for MCP clients, so actions run as the person who connected.
Separate test keys with sample documents, so you can build against realistic packs without real applicants.
Every event carries a signature and timestamp. Retries back off for up to three days.
Send an Idempotency-Key header on any create, and retries never make duplicates.
Cursor-based on every list, so long-running jobs never skip or repeat.
Official JavaScript and Python libraries, typed.