MCP Server
Seven read-only tools expose the obligation ontology over the Model Context Protocol — the same register the tabs above render, spoken as a protocol. Any MCP client can ask “are we compliant?” and walk the answer back to a clause. No tool can write.
Authenticate with a tenant-scoped bearer token. Every call is logged against the hash-chained audit trail, so a protocol query leaves the same evidence as a click in the console. The sandbox endpoint is simulated — it does not accept live connections.
List obligations from the register, optionally filtered by chapter, status, type or source circular. Returns register entries with clause references, owners and deadlines.
{
"type": "object",
"properties": {
"chapter": {
"type": "string",
"enum": ["registration", "client-dealings", "unpaid-securities",
"margin", "supervision", "grievance", "books-records",
"advertisement", "cyber"]
},
"status": {
"type": "string",
"enum": ["met", "gap", "at-risk", "pending-review"]
},
"circularId": { "type": "string" },
"limit": { "type": "integer", "default": 50 }
},
"required": []
}example call ▸
$ get_obligations({ "chapter": "unpaid-securities", "status": "gap" })
// result
{
"count": 6,
"obligations": [
{ "id": "OBL-SB-101", "title": "Open dedicated CUSPA pledgee account",
"clause": "CIRC-CUSPA-2026 §46.1", "deadline": "2026-11-02" },
{ "id": "OBL-SB-102", "title": "Auto-pledge unpaid securities to CUSPA",
"clause": "CIRC-CUSPA-2026 §46.2", "deadline": "2026-11-02" },
{ "id": "OBL-SB-103", "title": "Email/SMS intimation on pledge creation",
"clause": "CIRC-CUSPA-2026 §46.3", "deadline": "2026-11-02" },
{ "id": "OBL-SB-105", "title": "Day-6 auto-release of un-invoked pledges",
"clause": "CIRC-CUSPA-2026 §46.5", "deadline": "2026-11-02" },
{ "id": "OBL-SB-107", "title": "Daily reconciliation of pledgeable value",
"clause": "CIRC-CUSPA-2026 §46.11", "deadline": "2026-11-02" },
{ "id": "OBL-SB-110", "title": "Update client agreements & T&C for pledge regime",
"clause": "CIRC-CUSPA-2026 §46.12", "deadline": "2027-01-03" }
]
}Fetch one register entry in full: clause reference with verbatim excerpt and character offsets, control, evidence spec, bound evidence, status, approval and content hash.
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Register id, e.g. OBL-SB-101",
"pattern": "^OBL-[A-Z]{2}-[0-9]{3}$"
}
},
"required": ["id"]
}example call ▸
$ get_obligation({ "id": "OBL-SB-105" })
// result
{
"id": "OBL-SB-105",
"title": "Day-6 auto-release of un-invoked pledges",
"clause": {
"circularId": "CIRC-CUSPA-2026", "para": "46.5",
"excerpt": "where the pledge is not invoked, it shall be auto-released on the sixth trading day and the securities shall be free in the client's demat account",
"charStart": 152, "charEnd": 298
},
"type": "ongoing", "status": "gap", "deadline": "2026-11-02",
"control": { "id": "CTL-105", "name": "Invoke/auto-release scheduler", "owner": "Dev Khanna" },
"evidenceSpec": [{ "kind": "data-check", "description": "Pledge lifecycle log: invocations and day-6 releases" }],
"evidenceIds": [],
"createdByRun": "RUN-047", "approvedBy": "Priya Nair",
"hash": "ee72c48d15a3"
}Compute the compliance posture against a circular or chapter: counts by status, the obligations behind each count, and the nearest regulatory deadlines. This is the tool an inspector or an assistant calls first.
{
"type": "object",
"properties": {
"circularId": {
"type": "string",
"description": "e.g. CIRC-CUSPA-2026 or MC-SB-2025"
},
"chapter": { "type": "string" },
"asOf": { "type": "string", "format": "date" }
},
"required": ["circularId"]
}example call ▸
$ check_compliance_status({ "circularId": "CIRC-CUSPA-2026", "asOf": "2026-07-12" })
// result
{
"circularId": "CIRC-CUSPA-2026",
"asOf": "2026-07-12",
"obligations": 10,
"byStatus": { "met": 0, "gap": 6, "pending-review": 3, "at-risk": 1 },
"gaps": ["OBL-SB-101", "OBL-SB-102", "OBL-SB-103",
"OBL-SB-105", "OBL-SB-107", "OBL-SB-110"],
"pendingReview": ["OBL-SB-104", "OBL-SB-106", "OBL-SB-108"],
"atRisk": ["OBL-SB-109"],
"nearestDeadlines": [
{ "date": "2026-11-02", "phase": "paras 46.1–46.11", "obligations": 8 },
{ "date": "2027-01-03", "phase": "paras 46.12–46.14", "obligations": 2 }
],
"openTasks": ["TSK-001", "TSK-002", "TSK-003", "TSK-004",
"TSK-005", "TSK-006", "TSK-007"]
}Walk one obligation back to its source: the verbatim clause text with character offsets, the extraction run that created it, the verifier checks it passed, and who approved the mapping.
{
"type": "object",
"properties": {
"obligationId": { "type": "string" }
},
"required": ["obligationId"]
}example call ▸
$ explain_mapping({ "obligationId": "OBL-SB-101" })
// result
{
"obligationId": "OBL-SB-101",
"clauseText": "Every trading member shall open a separate demat account designated as the 'Client Unpaid Securities Pledgee Account' (CUSPA), tagged as such with the depository, exclusively for taking a pledge of unpaid securities of clients.",
"grounding": { "circularId": "CIRC-CUSPA-2026", "para": "46.1", "charStart": 27, "charEnd": 167 },
"extractedBy": "RUN-047",
"verifierChecks": ["citations-resolve", "deadlines-parse",
"applicability-match", "schema-valid", "hash-chain-append"],
"approvedBy": "Priya Nair",
"auditTrail": ["AE-0032", "AE-0038"]
}Fetch evidence artifacts by id or by obligation: kind, connector, capture time, content hash, history and the obligations each artifact is bound to.
{
"type": "object",
"properties": {
"id": { "type": "string", "description": "e.g. EV-015" },
"obligationId": { "type": "string" }
},
"anyOf": [
{ "required": ["id"] },
{ "required": ["obligationId"] }
]
}example call ▸
$ get_evidence({ "obligationId": "OBL-SB-021" })
// result
{
"artifacts": [
{
"id": "EV-015", "kind": "live-scan", "connector": "poneglyph-scan",
"title": "VAPT report + re-test verification",
"boundTo": ["OBL-SB-021"],
"hash": "sha256:…",
"history": [
{ "event": "captured" },
{ "event": "re-verified", "note": "2 medium findings still open" }
],
"note": "Obligation at-risk — closure re-validation due 2026-08-20 (TSK-009)."
}
]
}List amendments to the corpus with their diff blocks: paragraph, change kind, old/new text and the delta obligations each block created or updated.
{
"type": "object",
"properties": {
"circularId": {
"type": "string",
"description": "The amended circular, e.g. MC-SB-2025"
},
"since": { "type": "string", "format": "date" }
},
"required": []
}example call ▸
$ get_amendments({ "circularId": "MC-SB-2025", "since": "2026-01-01" })
// result
{
"amendments": [
{
"id": "AMD-2026-CUSPA",
"circularId": "CIRC-CUSPA-2026",
"number": "HO/38/11/(9)2026-MIRSD-POD/I/15382/2026",
"issuedOn": "2026-07-03",
"changes": 10,
"kinds": { "modified": 3, "added": 7 },
"deltaObligations": ["OBL-SB-101", "OBL-SB-102", "OBL-SB-103",
"OBL-SB-104", "OBL-SB-105", "OBL-SB-106",
"OBL-SB-107", "OBL-SB-108", "OBL-SB-109", "OBL-SB-110"],
"effectivity": { "phase1": "paras 46.1–46.11, +3 months from exchange guidelines",
"phase2": "paras 46.12–46.14, 2027-01-03" }
}
]
}List every obligation with no bound evidence or a gap/at-risk status, with the remediation task, owner and due date covering each one. The shortest answer to "what is outstanding?".
{
"type": "object",
"properties": {
"includeAtRisk": { "type": "boolean", "default": true },
"owner": { "type": "string" }
},
"required": []
}example call ▸
$ list_gaps({ "includeAtRisk": true })
// result
{
"gaps": [
{ "obligation": "OBL-SB-101", "task": "TSK-001", "owner": "Rohan Iyer", "due": "2026-08-15" },
{ "obligation": "OBL-SB-102", "task": "TSK-002", "owner": "Dev Khanna", "due": "2026-10-01" },
{ "obligation": "OBL-SB-103", "task": "TSK-003", "owner": "Dev Khanna", "due": "2026-09-15" },
{ "obligation": "OBL-SB-105", "task": "TSK-002", "owner": "Dev Khanna", "due": "2026-10-01" },
{ "obligation": "OBL-SB-107", "task": "TSK-005", "owner": "Dev Khanna", "due": "2026-10-15" },
{ "obligation": "OBL-SB-110", "task": "TSK-007", "owner": "Rohan Iyer", "due": "2026-10-30" }
],
"atRisk": [
{ "obligation": "OBL-SB-009", "task": "TSK-008", "owner": "Rohan Iyer", "due": "2026-09-30" },
{ "obligation": "OBL-SB-021", "task": "TSK-009", "owner": "Dev Khanna", "due": "2026-08-20" },
{ "obligation": "OBL-SB-109", "task": "TSK-006", "owner": "Priya Nair", "due": "2026-12-01" }
]
}{
"mcpServers": {
"poneglyph": {
"type": "sse",
"url": "https://mcp.poneglyph.dev/v1",
"headers": {
"Authorization": "Bearer <PONEGLYPH_TENANT_KEY>"
}
}
}
}$ claude mcp add --transport sse poneglyph \ https://mcp.poneglyph.dev/v1 \ --header "Authorization: Bearer <PONEGLYPH_TENANT_KEY>"
Replace the placeholder with a tenant key issued from the console. Keys are scoped to INZ000161534 and never grant write access.
The assistant calls check_compliance_status, receives the register’s posture as structured JSON, and answers with clause citations. Follow any id it names into the register or remediation tabs — the protocol and the console read the same ontology.
An inspector-scoped token grants the same seven tools against the same register — no stale PDF bundle, no divergent copy of the truth. Every query the inspector runs is appended to the audit chain, so the inspection itself becomes part of the evidence. Revoke the token and access ends; the log of what was asked remains.