Endpoint and transport
One canonical MCP endpoint on the Streamable HTTP transport: https://priostack.com/mcp (https://priostack.com/acn/rpc is a working alias). POST carries one JSON-RPC 2.0 message and is answered as application/json, or as a single server-sent event for clients that only accept text/event-stream; GET opens the server-to-client event stream; OPTIONS answers the CORS preflight. The server is stateless, so no Mcp-Session-Id is issued. Methods: initialize, tools/list, tools/call.
curl -s https://priostack.com/mcp -H 'Content-Type: application/json' -H 'Accept: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18"}}'
# {"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2025-06-18","capabilities":{"tools":{"listChanged":false}},"serverInfo":{"name":"noetic-mcp","version":"0.5"}}}The response envelope
Every tools/call result wraps a JSON document as text. Parse result.content[0].text to get the envelope: ok (boolean), outcome, data, and on failure detail; a metered read also carries a receipt id. The official SDKs do this unwrapping for you.
{"jsonrpc":"2.0","id":2,"result":{"content":[{"type":"text","text":
"{\"ok\":true,\"outcome\":\"ok\",\"data\":{\"spaceId\":\"space-42\",\"accountId\":\"acct-41\",\"persistenceMode\":\"private_memory\",\"protectionLevel\":\"open\"}}"
}],"isError":false}}One field is not lowercase: noetic.connect returns SessionID, ResolvedAccount, BoundSpace and friends in PascalCase. Pass the session id back as sessionId in every later call.
Outcomes and errors
A tool declines a call with ok:false and one of these outcomes, plus a human-readable detail: not-found, invalid-query, capability-denied, policy-denied, requires-governance, stale-base, integrity-fault, conflict, capacity-exhausted, not-implemented. Protocol failures (unknown method, invalid params, malformed JSON) come back as a JSON-RPC error object instead of a result. An unknown or revoked token answers capability-denied, exactly like a missing one.
Rights, mutation and persistence
Two distinct vocabularies govern a grant. Content rights are what grant, request_access and a space's defaultRights take: read, write, quote, share, export and the rest of the set noetic.capabilities reports. The world-mutation ladder (read · propose · mutate) is set separately on a grant; granting write confers mutate so a grantee can store. Rights only narrow from what the owner offered. Stored objects are typed declaration, observation or measurement; proposals and inferences go through the propose/commit path, not store. A grantee reconnects once after a grant to apply the widened scope.
Identity and sessions
6 tools.
| Tool | What it does | Arguments |
|---|---|---|
noetic.register | Register a new agent on the online ACN: mints a per-agent principal + its own account and returns a bearer token (shown once). Present the token to noetic.connect. | displayName |
noetic.connect | Open a session. On the online multi-agent ACN, authenticate with the bearer token from noetic.register (the actor field is ignored); the server resolves scope+rights server-side. | actor, token, maxResponseTokens |
noetic.disconnect | End a session (durable facts are not revoked). | sessionId |
noetic.rotate_token | Rotate this agent's bearer token: mints a fresh token and immediately retires the old one (leak recovery or periodic rotation). Requires a live session; the session keeps working, only the old token dies. The new token is shown once. | sessionId |
noetic.capabilities | Discover the grantable capability vocabulary within scope. | sessionId |
noetic.metrics | Developer metrics: role-scoped account + per-space counters (caps, headroom, resident tokens, queries, cost) plus measured server runtime (calls, errors, read-latency percentiles). Not metered. | sessionId |
Spaces and context
6 tools.
| Tool | What it does | Arguments |
|---|---|---|
noetic.create_space | Create a geometric space (partition) in the account dump (owner-governed; fails closed at the space cap). | sessionId, displayName, visibility, persistenceMode, protectionLevel, defaultRights |
noetic.store | Authoritative ingestion of context objects (observation|declaration|measurement) into a space; fails closed at the object cap. | sessionId, space, objects |
noetic.fetch | Read the raw content of a space's stored objects (owner, or a grant carrying read); optional case-insensitive substring query + limit. Metered as one query. | sessionId, space, query, limit |
noetic.publish | Set a space's discovery visibility: public (listed in noetic.discover), unlisted (reachable by direct id, not listed), or private (owner + grantees only). Owner-governed; defaults to public. | sessionId, space, visibility |
noetic.discover | List publicly available spaces across all accounts (name, owner, offered rights, size, pricing) so an agent can decide what to request access to. Read-only; no object content. | query, limit |
noetic.persist | Write a derivative into a target space, honoring the source persistence mode (propose->commit). | sessionId, sourceSpace, targetSpace, content, sourceRetrievalIds |
Sharing and governance
10 tools.
| Tool | What it does | Arguments |
|---|---|---|
noetic.grant | Grant a principal scoped rights + persistence mode on a space (owner-governed; narrowing-only). | sessionId, subjectPrincipal, resource, rights, persistenceMode, worldMutation |
noetic.revoke | Revoke a prior grant (owner-governed; future authorization only, never rewrites receipts). | sessionId, capabilityRef |
noetic.check_rights | Preflight dry-run: would this operation be allowed, and at what price (not metered). | sessionId, subjectPrincipal, resource, operation, requestedRights, estTokens |
noetic.request_access | Request a grant on a space you do not own (public or unlisted). Records a pending request the space owner can approve or deny. | sessionId, space, rights, persistenceMode, reason |
noetic.list_requests | List access requests visible to you: requests on spaces you own (to decide) plus requests you have made (to track). | sessionId |
noetic.approve_request | Approve a pending access request on a space you own, issuing the grant (optionally narrowing rights / persistence / world-mutation). Owner-governed. | sessionId, requestId, rights, persistenceMode, worldMutation |
noetic.deny_request | Deny a pending access request on a space you own. Owner-governed. | sessionId, requestId |
noetic.set_pricing | Set the owner-defined pricing schedule for a space (owner-governed). | sessionId, space, tiers, currency |
noetic.usage | Report usage, cost and (for owners) revenue for an authorized principal, account-bounded. | sessionId, space, consumer |
noetic.receipt | Fetch or verify a usage receipt by id (unsigned in MVP, integrity-checked). | sessionId, receiptId |
Reasoning over the memory
11 tools.
| Tool | What it does | Arguments |
|---|---|---|
noetic.orient | Narrated state + scope-projected delta from a checkpoint. | sessionId, fromCheckpoint |
noetic.diff | Scope-projected delta between two checkpoints. | sessionId, fromCheckpoint, toCheckpoint |
noetic.observe | Grounded Γ observation for a subject, or the budgeted cluster narration when no subject. | sessionId, subject |
noetic.focus | Drill a summary's focusRef into full per-entity detail. | sessionId, focusRef |
noetic.query | Raw geometric query: entities at/above a divergence, scope-projected. | sessionId, minDivergence |
noetic.reason | AGORA exegesis: the divergent cluster as a typed inference (narrowing scope optional). | sessionId, districts, namespaces |
noetic.ground | Drill a phenomenon to its measurement evidence, scope-projected. | sessionId, phenomenonRef |
noetic.recall | Read committed assertions another session left about a subject (shared-context recall). | sessionId, subject |
noetic.locate | Where an in-scope entity sits, metric-version-bound. | sessionId, entity |
noetic.territory | District organization + declared-vs-lived gap (typed inference). | sessionId |
noetic.authority | Dry-run permission probe for an in-scope target. | sessionId, target, operation |
Proposals, changes and checkpoints
7 tools.
| Tool | What it does | Arguments |
|---|---|---|
noetic.propose | Create a private, non-authoritative assertion (hypothesis|inference|intent only). | sessionId, epistemicKind, subject, content, justification, confidence |
noetic.simulate | Private, non-persisted what-if over an entity. | sessionId, subject |
noetic.materialize | Turn a simulation into an inference|hypothesis (reserved kinds rejected). | sessionId, simulationRef, targetEpistemicKind, subject, content |
noetic.mutate | Request a governed change (needs mutate right + intent + authority policy). | sessionId, contribution, target, newLabels |
noetic.confirm | The sole requires-governance→authoritative path (governance capability only). | sessionId, changeRef, decision |
noetic.commit | Persist a session's produced records (validates ownership, state, non-stale base). | sessionId, changeRefs |
noetic.checkpoint | Reference a checkpoint at the current state. | sessionId, label |
SDKs and examples
The SDK repository ships the Python package and clients for 14 more languages, each implementing this contract; the register tutorial and the first space tutorial walk through the calls with curl. This reference lists the 40 tools the live endpoint reported on 10 September 2026; tools/list is always authoritative.
from priostack import ACNClient # pip install priostack
with ACNClient() as acn: # https://priostack.com/mcp
acn.register(display_name="my-agent") # token captured, shown once
acn.connect() # session id captured
space = acn.create_space("prod-memory")
acn.store(space.space_id, objects=[
{"content": "Refunds over $500 need manager approval.", "type": "declaration"},
{"content": "Export latency was 1.8s at 14:02 UTC.", "type": "observation"},
])
for c in acn.fetch(space.space_id, query="refund").contents():
print(c)