CHP Profile B spend/HITL gate: evaluate_spend_gate, approve_spend, content hash.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
@cubiczan/chp-mcpOne-command MCP install for CHP Profile B spend / capital gates and tool-approval receipts (an allowlist is not authorization), plus a structured deny ledger and receipt-gated finance tools.
Wraps @cubiczan/chp so Cursor,
Claude Code, or any MCP client can call evaluate_spend_gate without vendoring
protocol code. Engine digests match the normative golden vectors
(Profile B 30/30).
For AGENTS.md + skills + Profile A decision_gate / decision_adversary, use
agent-conductor instead.
| Tool | Maps to | Purpose |
|---|---|---|
evaluate_spend_gate | evaluateGate | LOCKED / HITL_REQUIRED / BLOCKED + claims + content hash. BLOCKED is also a ledgered policy_deny. |
approve_spend | approveHuman | Human lock when HITL_REQUIRED (cannot override hard fails). Optional tool + bound_args mint a signed receipt. |
evaluate_tool_approval | evaluateToolApproval | Allowlist is a pre-filter; host-bound fields merge into args_hash; a receipt is still required |
issue_approval_receipt | issueApprovalReceipt | Human allow/deny β HMAC-signed receipt + decision log |
authorize_tool_call | authorizeToolCall | Consume a receipt; deny on drift, host-bound override, expiry, replay, or a bad MAC |
request_authorization | runtime | Mint a receipt bound to a scoped reference tool, or return HITL / structured deny |
place_equity_order | reference | Synthetic equity order β scope trading:equities:place, receipt required |
wire_treasury_transfer | reference | Synthetic treasury wire β scope treasury:wire, always HITL |
rebalance_portfolio | reference | Synthetic rebalance β scope portfolio:rebalance |
inspect_audit_ledger | ledger | Trailing CHP-chained deny / authorize / execute entries |
chp_content_hash | contentHash | Float-aware canonical SHA-256 |
chp_version | β | Server + protocol versions + deny reason codes + receipt schema |
Managed MCP allowlists (Cursor mcpServers, Claude Desktop, Claude Code)
only answer βis this tool name installed?β. They do not bind tenant,
arguments, risk, or a human decision. This server treats that gap as a
hard deny unless a signed approval receipt still matches the call
that is about to run.
Receipts are HMAC-SHA256 over CHP canonical JSON
(the same payload discipline as Profile B contentHash / audit-ledger
sig). The MAC covers:
| Field | Role |
|---|---|
actor | Human who allowed or denied |
tool | Concrete tool name (no *) |
resource | Tenant / resource binding (no *) |
args_hash | contentHash(host βͺ model arguments, { floatAware: true }) |
policy_version | Policy the human saw |
risk | Policy risk for that tool |
issued_at / expiry | Lifetime |
decision | allow or deny |
nonce | Single-use; replay denies |
signature | HMAC-SHA256 hex |
Set CHP_RECEIPT_KEY (or AUDIT_LEDGER_KEY) in the MCP server env.
Without it the process falls back to a documented insecure default β
fine for the local cookbook, not for production.
Example policy: examples/tool-approval-policy.json.
stripe.create_charge is on the allowlist and still cannot run
without a receipt bound to acct_live_acme and the exact charge args.
Host-injected tenant/index bindings use
examples/host-injected-policy.json
(see the host-injected args cookbook below).
Claude/Cursor has stripe.create_charge enabled. That is not a grant.
Result: RECEIPT_REQUIRED, deny_code: "allowlist_is_not_authorization".
Calling authorize_tool_call with the same payload and no receipt
returns DENIED / allowlist_is_not_authorization.
The response includes receipt (take the whole object) and
decision_log (actor, decision, args hash, nonce). Pass that receipt
into authorize_tool_call with the same call. Result: AUTHORIZED.
Issue with "decision": "deny". The decision is logged. Authorizing
with that receipt returns DENIED / human_denied. A deny receipt
cannot be flipped to allow by editing decision β the MAC breaks.
Approve { "amount": 2500, ... }, then authorize with
{ "amount": 2500000, ... }. Result: DENIED / changed_arguments.
Key order does not matter; the hash is CHP canonical. The original
receipt remains valid for the args that were approved (until expiry or
a successful consume).
Issue with ttl_seconds: 30. After the expiry instant,
authorize_tool_call returns DENIED / expired_receipt. The nonce is
consumed so a clock rewind cannot resurrect it.
A successful AUTHORIZED consume burns the nonce. Presenting the same
receipt again returns DENIED / replayed_receipt.
These never produce a usable allow receipt:
resource: "*", any, all, or an empty stringargumentsversionFail-closed: deny_on_ambiguity cannot be turned off.
_metaSemantic Kernel and other hosts need to pass index, key, and tenant
without letting the model choose them
(SO-style routing).
Putting those fields on the tool schema so the LLM can βdecideβ is the
bug. An MCP allowlist does not fix it: the tool name can stay
allowlisted while the model swaps index_name to another tenant.
The host (or a gateway in front of this server) injects bound fields. This package hashes host βͺ model arguments into the receipt and denies when the model overrides a host-bound field. The allowlist is still only a pre-filter.
_meta.cubiczan (no hard dependency)@cubiczan/governed-mcp-gateway
already injects identity on every tools/call and SSE frame:
This server does not import that package. It reads the same
envelope. Hosts MAY add host_bound next to principal. A trusted
gateway should overwrite _meta.cubiczan so the model cannot self-attest.
No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/chp-mcp)<a href="https://allmcps.com/mcp/chp-mcp"><img src="https://allmcps.com/api/badge/chp-mcp?style=directory" alt="Chp MCP on AllMCPs" /></a>