The csp.* family (33 verbs). Every verb enters through the one front door: it is capability-checked, permission-checked, scope-checked and audited before it runs (see Security & permissions). Each entry below lists its capability, risk class (which fixes the minimum autonomy level), the minimum caller permission, its availability tier, whether it is idempotent, and any outbound egress.
Createcsp.address.create
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Write - autonomy L1 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
workspace_id from ctx.
Call POST /v/csp.address.create with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.address.create.
Updatecsp.address.update
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Write - autonomy L1 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
Partial patch fenced by workspace_id.
Call POST /v/csp.address.update with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.address.update.
Createcsp.bankAccount.create
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Sensitive - autonomy L2 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
Fence entityId in ctx.workspace_id (no workspace_id column).
Call POST /v/csp.bankAccount.create with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.bankAccount.create.
Deletecsp.bankAccount.delete
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Write - autonomy L1 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | Yes |
| Egress | None - in-box (pure Postgres, no outbound call) |
Fence via parent entity in ctx.workspace_id.
Call POST /v/csp.bankAccount.delete with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.bankAccount.delete.
Updatecsp.bankAccount.update
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Sensitive - autonomy L2 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
Fence via parent entity in ctx.workspace_id.
Call POST /v/csp.bankAccount.update with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.bankAccount.update.
Degradecsp.complianceObligation.degrade
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Write - autonomy L1 |
| Min. permission | Admin |
| Availability | Admin only (CLI/HTTP; never advertised over MCP) |
| Idempotent | Yes |
| Egress | None - in-box (pure Postgres, no outbound call) |
Only (cron). The time-based status machine for ctx.workspace_id: UPCOMING->WARNING (warning_date<=now), WARNING->DUE (due_date<=now), DUE->OVERDUE (past the grace window). Returns changed ids per stage. Idempotent. BEARERLESS - DEFERRED.
Call POST /v/csp.complianceObligation.degrade with a JSON body; returns JSON (or { error, code }). Not advertised over MCP (admin-only); reachable via the CLI and HTTP doors.
Updatecsp.complianceObligation.update
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Write - autonomy L1 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
User status transition (COMPLETED|WAIVED|NOT_APPLICABLE).
Call POST /v/csp.complianceObligation.update with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.complianceObligation.update.
Upsertcsp.complianceObligation.upsert
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Write - autonomy L1 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | Yes |
| Egress | None - in-box (pure Postgres, no outbound call) |
Conflict key (entity_id, obligation_type, period_year).
Call POST /v/csp.complianceObligation.upsert with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.complianceObligation.upsert.
Createcsp.entity.create
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Write - autonomy L1 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
workspace_id from ctx.
Call POST /v/csp.entity.create with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.entity.create.
Updatecsp.entity.update
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Sensitive - autonomy L2 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
Partial patch fenced by workspace_id (direct column).
Call POST /v/csp.entity.update with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.entity.update.
Createcsp.entityEvent.create
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Write - autonomy L1 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
Immutable append-only change log. workspace_id from ctx.
Call POST /v/csp.entityEvent.create with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.entityEvent.create.
Mark Dispatchedcsp.entityEvent.markDispatched
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Write - autonomy L1 |
| Min. permission | Admin |
| Availability | Admin only (CLI/HTTP; never advertised over MCP) |
| Idempotent | Yes |
| Egress | None - in-box (pure Postgres, no outbound call) |
Only. Flip notifications_dispatched=true (idempotent). BEARERLESS bookkeeping - DEFERRED.
Call POST /v/csp.entityEvent.markDispatched with a JSON body; returns JSON (or { error, code }). Not advertised over MCP (admin-only); reachable via the CLI and HTTP doors.
Purgecsp.entityPresence.purge
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Sensitive - autonomy L2 |
| Min. permission | Admin |
| Availability | Admin only (CLI/HTTP; never advertised over MCP) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
Only. COURT-GATED cross-workspace: deletes presence rows for the given custodian workspace ids (revoke + org-teardown cascade). BEARERLESS - DEFERRED (built, not wired).
Call POST /v/csp.entityPresence.purge with a JSON body; returns JSON (or { error, code }). Not advertised over MCP (admin-only); reachable via the CLI and HTTP doors.
Upsertcsp.entityPresence.upsert
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Write - autonomy L1 |
| Min. permission | Admin |
| Availability | Admin only (CLI/HTTP; never advertised over MCP) |
| Idempotent | Yes |
| Egress | None - in-box (pure Postgres, no outbound call) |
Only (background-computed). custodian_workspace_id IS the RLS root (must equal ctx.workspace_id). Conflict key (global_identity_id, custodian_workspace_id). BEARERLESS.
Call POST /v/csp.entityPresence.upsert with a JSON body; returns JSON (or { error, code }). Not advertised over MCP (admin-only); reachable via the CLI and HTTP doors.
Createcsp.individual.create
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Sensitive - autonomy L2 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
(DOB/PII). workspace_id from ctx.
Call POST /v/csp.individual.create with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.individual.create.
Updatecsp.individual.update
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Sensitive - autonomy L2 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
(pepStatus/sourceOfWealth). Partial patch fenced by workspace_id.
Call POST /v/csp.individual.update with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.individual.update.
Createcsp.kycDocument.create
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Sensitive - autonomy L2 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
Exactly-one-holder, fenced in ctx.workspace_id. Unique file_record_id -> Conflict (the extraction caller catches + falls back to update).
Call POST /v/csp.kycDocument.create with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.kycDocument.create.
Deletecsp.kycDocument.delete
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Write - autonomy L1 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | Yes |
| Egress | None - in-box (pure Postgres, no outbound call) |
Fence via the holder in ctx.workspace_id.
Call POST /v/csp.kycDocument.delete with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.kycDocument.delete.
Expiry Sweepcsp.kycDocument.expirySweep
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Write - autonomy L1 |
| Min. permission | Admin |
| Availability | Admin only (CLI/HTTP; never advertised over MCP) |
| Idempotent | Yes |
| Egress | None - in-box (pure Postgres, no outbound call) |
Only (cron). For ctx.workspace_id: valid -> expiring_soon (expiry within warningDays) and valid|expiring_soon -> expired (past expiry). Returns the changed ids so the frontend emits the per-row compliance events. Idempotent (predicated). BEARERLESS - DEFERRED.
Call POST /v/csp.kycDocument.expirySweep with a JSON body; returns JSON (or { error, code }). Not advertised over MCP (admin-only); reachable via the CLI and HTTP doors.
Updatecsp.kycDocument.update
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Sensitive - autonomy L2 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
Fence via the holder in ctx.workspace_id.
Call POST /v/csp.kycDocument.update with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.kycDocument.update.
Upsertcsp.kycDocument.upsert
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Sensitive - autonomy L2 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | Yes |
| Egress | None - in-box (pure Postgres, no outbound call) |
INSERT ON CONFLICT(file_record_id). Fence holder in workspace.
Call POST /v/csp.kycDocument.upsert with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.kycDocument.upsert.
Createcsp.obligationRule.create
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Write - autonomy L1 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
workspace-owned rule (workspace_id from ctx).
Call POST /v/csp.obligationRule.create with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.obligationRule.create.
Seedcsp.obligationRule.seed
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Write - autonomy L1 |
| Min. permission | Admin |
| Availability | Admin only (CLI/HTTP; never advertised over MCP) |
| Idempotent | Yes |
| Egress | None - in-box (pure Postgres, no outbound call) |
Only. COURT-GATED: writes workspace_id=NULL global SYSTEM rules (cannot fence on ctx.workspace_id). Idempotent upsert keyed (workspace_id IS NULL, jurisdiction, obligation_type, entity_types). SYSTEM/genesis principal. BEARERLESS - DEFERRED (built, not wired).
Call POST /v/csp.obligationRule.seed with a JSON body; returns JSON (or { error, code }). Not advertised over MCP (admin-only); reachable via the CLI and HTTP doors.
Updatecsp.obligationRule.update
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Write - autonomy L1 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
Fence workspace_id = ctx (REFUSE the NULL-workspace SYSTEM rules, mirroring the route 403). Soft-delete = isActive
.Call POST /v/csp.obligationRule.update with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.obligationRule.update.
Approvecsp.riskAssessment.approve
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Sensitive - autonomy L2 |
| Min. permission | Admin |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
Atomic PENDING -> APPROVED.
Call POST /v/csp.riskAssessment.approve with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.riskAssessment.approve.
Createcsp.riskAssessment.create
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Sensitive - autonomy L2 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
Score/rating computed by the caller and passed in.
Call POST /v/csp.riskAssessment.create with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.riskAssessment.create.
Rejectcsp.riskAssessment.reject
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Sensitive - autonomy L2 |
| Min. permission | Admin |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
Atomic PENDING -> REJECTED.
Call POST /v/csp.riskAssessment.reject with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.riskAssessment.reject.
Updatecsp.riskAssessment.update
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Sensitive - autonomy L2 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
PENDING-only edit (precondition guard moved into the verb).
Call POST /v/csp.riskAssessment.update with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.riskAssessment.update.
Createcsp.role.create
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Write - autonomy L1 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
Fence entityId AND the holder (individual/holderEntity) in ctx.workspace_id.
Call POST /v/csp.role.create with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.role.create.
Deletecsp.role.delete
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Write - autonomy L1 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | Yes |
| Egress | None - in-box (pure Postgres, no outbound call) |
Hard-delete fenced via parent entity in ctx.workspace_id.
Call POST /v/csp.role.delete with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.role.delete.
Createcsp.sourceOfFunds.create
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Sensitive - autonomy L2 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
Exactly-one subject, fenced in ctx.workspace_id.
Call POST /v/csp.sourceOfFunds.create with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.sourceOfFunds.create.
Deletecsp.sourceOfFunds.delete
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Write - autonomy L1 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | Yes |
| Egress | None - in-box (pure Postgres, no outbound call) |
Fence via subject in ctx.workspace_id.
Call POST /v/csp.sourceOfFunds.delete with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.sourceOfFunds.delete.
Updatecsp.sourceOfFunds.update
| Property | Value |
|---|---|
| Capability | csp.write |
| Risk class | Sensitive - autonomy L2 |
| Min. permission | Member |
| Availability | On demand (MCP tier 2) |
| Idempotent | No |
| Egress | None - in-box (pure Postgres, no outbound call) |
Fence via subject in ctx.workspace_id.
Call POST /v/csp.sourceOfFunds.update with a JSON body; returns JSON (or { error, code }). Also exposed as the MCP tool csp.sourceOfFunds.update.