Skip to main content

ARC developer documentation

Agent access

Every blocklet running on ARC exposes an MCP endpoint and a set of discovery documents, so an external agent can find it, connect, and read what the blocklet has declared.

A blocklet running on ARC exposes an MCP endpoint at /mcp and a set of discovery documents under /.well-known/. The runtime provides them; a blocklet does not opt in and cannot be deployed without them.

An agent that knows only the host URL can therefore reach the endpoint and list the available tools before any credential exists. What it can then read is decided by the blocklet, not by the runtime.

Three ways to connect

Client canEndpoint
Speak MCPPOST /mcp, streamable HTTP, stateless
Issue HTTP but has no tool-calling harnessPOST /api/afs/rpc, the same operations as JSON-RPC
Only fetch textGET /llms.txt, a pointer that names the other two

All three serve the same data. Prefer /mcp when your client supports it.

Check the baseline first

Anonymous tools/list must work on every blocklet: no credential, no initialize, no session.

bash
curl -s -X POST https://<host>/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

It answers with at least the eight generic AFS tools. If this fails, the problem is the host or the transport, not access. → Connect a client

Something already failed?

What you gotWhat it meansWhere
401 with WWW-AuthenticateThe method is not anonymous-safe, or your credential was rejectedErrors · Authorize a client
200 with "isError": true and AFS_FORBIDDENThe call reached the tool. The blocklet has not opened that path to network clientsAccess tiers
Writes still refused with an owner credentialExpected. A credential is not a write switchAccess tiers
tools/list returns only the eight AFS toolsThe blocklet declares no content collectionsTools
Not sure you have the right hostGET /.well-known/mcp.json and check its url fieldDiscovery surfaces

A 200 is not success. Check result.isError on every tools/call.

What decides whether a call succeeds

Four independent gates, decided by three different parties: the runtime, the blocklet, and the provider. A credential is an answer to the runtime, so it clears one gate and leaves the other three exactly where they were.

Gate 3 — what the blocklet declared for that path — is the one most agents hit, and no credential bypasses it, including an owner-role credential.

Access tiers for all four gates and why they are separate

Publishing a tool is not the same as allowing it

Anonymous tools/list publishes the write tools alongside the read tools. Calling one without a credential returns 401 with a challenge.

This is deliberate. A well-behaved MCP client only calls tools that were advertised to it, so hiding the write tools would mean the client never issues the request that produces the challenge. A challenge is what starts a standard authorization flow. Publishing the tools is what makes authorization discoverable.

Each blocklet issues its own credentials

The protected-resource document on a host names that same host as its authorization server. A credential obtained from one blocklet does not open another; it carries the instance it was issued for, and the runtime compares that instance on every call.

There is no cross-blocklet credential.

Where this board sits

AFS defines the paths, providers, and capability contract. This board is about reaching that contract from outside: which protocol surfaces exist on a host, how a client authenticates to them, and what a blocklet has to declare before an external caller sees anything.

If your question is "what does afs_read guarantee", read AFS. If it is "how does my agent get to call it", read on here.

Where to go next