Sandbox environment — realistic simulated data · everything is explorable, nothing is actionable
sim-today 2026-07-12
MCP surface · Angel One Limited

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.

7Tools exposedschema-typed, examples grounded in real ids
43Register entries queryableMaster Circular + CUSPA amendment
0Write operationsread-only by design — approvals stay human
SSETransportbearer-token auth, tenant-scoped
Endpoint
servinghttps://mcp.poneglyph.dev/v1· SSE

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.

Seven tools over the ontologyevery example cites real register ids — OBL-SB-101, TSK-001, EV-015
get_obligationsread-only

List obligations from the register, optionally filtered by chapter, status, type or source circular. Returns register entries with clause references, owners and deadlines.

inputSchema
{
  "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" }
  ]
}
get_obligationread-only

Fetch one register entry in full: clause reference with verbatim excerpt and character offsets, control, evidence spec, bound evidence, status, approval and content hash.

inputSchema
{
  "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"
}
check_compliance_statusread-only

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.

inputSchema
{
  "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"]
}
explain_mappingread-only

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.

inputSchema
{
  "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"]
}
get_evidenceread-only

Fetch evidence artifacts by id or by obligation: kind, connector, capture time, content hash, history and the obligations each artifact is bound to.

inputSchema
{
  "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)."
    }
  ]
}
get_amendmentsread-only

List amendments to the corpus with their diff blocks: paragraph, change kind, old/new text and the delta obligations each block created or updated.

inputSchema
{
  "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_gapsread-only

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?".

inputSchema
{
  "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" }
  ]
}
Connect a client
Claude Desktop
claude_desktop_config.json
{
  "mcpServers": {
    "poneglyph": {
      "type": "sse",
      "url": "https://mcp.poneglyph.dev/v1",
      "headers": {
        "Authorization": "Bearer <PONEGLYPH_TENANT_KEY>"
      }
    }
  }
}
Claude Code
one command, project or user scope
$ 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.

Playground — the CUSPA question, over the protocolrecorded 2026-07-12 · deterministic replay
scripted replay · 4 turns · no live model
0/4
starting replay

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.

Share with SEBI
inspector scoperead-only
Hand an inspector the endpoint, not a data-room export

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.

Preview the inspector view
token formatpgl_insp_… — bearer, single tenant
scope7 read-only tools · no approve, no upload, no task edits
validity30 days, revocable at any time from the console
access logevery call appended to the hash-chained audit trail as actor inspector
ontologyopen schema — the same structure any SEBI intermediary can publish