Govern AI agents through
multi-party human authorization
AI agents or people request sensitive data or an action. At least M of N named human approvers must approve, and any single denial permanently vetoes the request. After the configured veto window, CAM makes one signed call to your system, delivers the result once to the approved destination, and discards it. CAM does not store the released data, and every step is recorded in a tamper-evident, hash-chained audit log.
Sandbox keys are free. Request one and LeAndrew will send it within one business day. Production keys are provisioned per integration.
Request production accessRoute sensitive data access and action requests.
CAM exposes a Streamable HTTP MCP endpoint at https://api.safeloc.co/mcp. Send Authorization: Bearer cam_<prefix>_<secret> as a transport header. The REST API base is https://api.safeloc.co/v1.
Streamable HTTP
Connect with Streamable HTTP to https://api.safeloc.co/mcp. The current API version is v1.0.0.
Bearer API key
Send Authorization: Bearer cam_<prefix>_<secret>. Keys are sandbox or production. Keep the key in the runtime or secret store, not in prompts or tool arguments.
Governed release
Approval links and response tokens go only to human circle members. MCP tools cannot approve for a member.
Three agent-facing tools
submit_access_requestCreates an M-of-N request through POST /v1/requests. It never exposes member response tokens.
get_access_request_statusReads the request state and per-member breakdown from GET /v1/requests/:id.
wait_for_access_request_outcomePolls until vetoed, expired, data_released, or fetch_failed, or until its bounded timeout. Returns outcome state, not the released payload.
Approval and denial stay with human circle members out of band. The MCP server does not expose their response tokens. Approving and break-glass are not MCP tools.
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
const client = new Client({ name: "advisor-agent", version: "1.0.0" });
const transport = new StreamableHTTPClientTransport(
new URL("https://api.safeloc.co/mcp"),
{
requestInit: {
headers: { Authorization: "Bearer " + process.env.CAM_API_KEY },
},
},
);
await client.connect(transport);
const result = await client.callTool({
name: "submit_access_request",
arguments: {
requester_identity: "advisor-agent@westfield.example.com",
requester_type: "ai_agent",
data_owner_id: "ACCT-78234",
data_category: "financial",
reason_code: "TRADE_AUTHORIZATION",
reason_detail: "Request authorization for the scheduled portfolio rebalance.",
threshold_m: 2,
threshold_n: 3,
data_endpoint_url: "https://api.example.com/cam-release/ACCT-78234",
// key_fragment_id values below are approver labels, not cryptographic key shares.
circle: [
{ member_identifier: "advisor@westfield.example.com", member_role: "senior_advisor", key_fragment_id: "kf-1" },
{ member_identifier: "compliance@westfield.example.com", member_role: "compliance_officer", key_fragment_id: "kf-2" },
{ member_identifier: "risk@westfield.example.com", member_role: "risk_manager", key_fragment_id: "kf-3" },
],
},
});Use REST when your system calls CAM directly
MCP endpoint: https://api.safeloc.co/mcp. REST base: https://api.safeloc.co/v1. REST supports request creation, member responses, request status, and audit retrieval. In the examples, key_fragment_id is an approver label only, not a cryptographic key share.
Request created
POST /v1/requests creates an M-of-N request with the data owner, category, reason, endpoint, circle, threshold, and expiry settings.
Approvers receive email notifications
Email is the default approver notification method. Approval links go only to approvers, never to the requester. The REST 201 response includes a single-use response_token for each circle member; the MCP tool does not expose these tokens.
Any denial permanently vetoes
A single denied response permanently vetoes the request, regardless of the approval count.
Customer system handles the signed call
The customer system handles the approved release or action.
Every transition is audited
Each decision is recorded in a tamper-evident, SHA-256 hash-chained audit log. GET /v1/audit/:id returns the log with chain_valid.
Create a governed request
Email is the default approver notification method. Approval links go only to approvers, never to the requester. POST /v1/requests returns 201 Created. The REST response includes one single-use response_token per circle member, while the MCP tool does not expose these tokens. Deliver each REST token to its human member out of band.
curl -X POST https://api.safeloc.co/v1/requests \
-H "Authorization: Bearer $CAM_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"requester_identity": "advisor-agent@westfield.example.com",
"requester_type": "ai_agent",
"data_owner_id": "ACCT-78234",
"data_category": "financial",
"reason_code": "TRADE_AUTHORIZATION",
"reason_detail": "Request authorization for the scheduled portfolio rebalance.",
"threshold_m": 2,
"threshold_n": 3,
"data_endpoint_url": "https://api.example.com/cam-release/ACCT-78234",
"circle": [
{"member_identifier":"advisor@westfield.example.com","member_role":"senior_advisor","key_fragment_id":"kf-1"},
{"member_identifier":"compliance@westfield.example.com","member_role":"compliance_officer","key_fragment_id":"kf-2"},
{"member_identifier":"risk@westfield.example.com","member_role":"risk_manager","key_fragment_id":"kf-3"}
]
}'201 Created
{
"request_id": "<request-uuid>",
"status": "pending",
"threshold_m": 2,
"threshold_n": 3,
"expires_at": "<server-generated ISO 8601 timestamp>",
"circle_members": [
{ "member_identifier": "advisor@westfield.example.com", "response_token": "<single-use response token>" },
{ "member_identifier": "compliance@westfield.example.com", "response_token": "<single-use response token>" },
{ "member_identifier": "risk@westfield.example.com", "response_token": "<single-use response token>" }
]
}curl -X POST "https://api.safeloc.co/v1/requests/$REQUEST_ID/respond" \
-H "Authorization: Bearer $CAM_API_KEY" \
-H "Content-Type: application/json" \
-d '{"response_token":"<single-use response token>","response":"approved"}'curl "https://api.safeloc.co/v1/audit/$REQUEST_ID" \ -H "Authorization: Bearer $CAM_API_KEY"
Sandbox and Production
Sandbox
Sandbox: free, approved within one business day, with a live simulator and test approvers. Usage limits apply.
Sandbox limits applyProduction
Production keys are provisioned per integration, with onboarding support.
Open interfaces
Works with your stack
CAM is a REST API. Anything that can make an HTTPS call can be governed: AI agent frameworks, internal tools, workflow automation platforms, and custom applications.
Learn how CAM handles governance metadata, contact data, and service providers.
Trust and data handlingBuild With CAM
Sandbox keys are free. Request one and LeAndrew will send it within one business day. Production keys are provisioned per integration.
Request production access