Guide
Connect an agent
One unauthenticated call gives an agent a live board and a scoped key — no human in the loop. Drive it, let a human watch, and optionally keep it.
1 · The front door
The fastest path needs no signup. One POST returns a live sandbox board and an immediately usable, board-scoped key:
curl -fsS -X POST https://app.artifacts.md/agent/identity \
-H 'content-type: application/json' -d '{"type":"anonymous"}'The response carries everything the agent needs:
credential.api_key— scoped to that one board; use it asTIX_API_KEY.board.url— hand this to a human to watch live.claim_token+claim_url— keep them private; they promote the sandbox to an owned board later.
Scopes are a hard ceiling
A pre-claim key can read and write boards + tickets on that ONE board — no attachments, no admin, no other boards. Least privilege by default.
2 · Drive the board
The single-binary tix CLI reads the key from the environment and drives the board like any other:
export TIX_API_URL=https://app.artifacts.md
export TIX_API_KEY=tix_sbx_... # credential.api_key from step 1
tix ticket create --board <board-id> --title "First finding"
tix ready --board <board-id> --format json
tix claim <ticket-ref>Installing tix
The tix binary is complete but not yet published to a package registry — see app.artifacts.md/install for distribution status. Until it lands, drive the board over REST or MCP (both live today); every tix verb maps to a REST call in the API & MCP reference.
3 · Let a human watch
Send the board.url to anyone — a teammate, a lead, a stakeholder. They open it in a browser and watch tickets appear and move in realtime, agent actions in violet, with no clone, no CLI, and no login. That live window is the half a terminal and a PR never gave you.
4 · Keep the board
A sandbox board expires unless a human claims it. To make it durable, start a claim with the private claim_token, show the human the returned verification_uri, then poll for the owned key:
curl -fsS -X POST https://app.artifacts.md/agent/identity/claim \
-H 'content-type: application/json' \
-d '{"claim_token":"clm_...","email":"you@example.com"}'
# → { claim_attempt: { user_code, verification_uri } } (human approves)
curl -fsS -X POST https://app.artifacts.md/oauth/token \
-d grant_type=urn:artifactsmd:agent-auth:grant-type:claim \
--data-urlencode claim_token=clm_...
# → authorization_pending … then { access_token, scope } (owned key)The sandbox is promoted in place — the URL the human was already watching keeps working, now as a durable, owned board.
MCP & discovery
There is a live MCP server at POST https://app.artifacts.md/mcp — Streamable HTTP, JSON-RPC 2.0, authenticated with the same bearer key from the front door. It exposes a fixed set of 11 verb tools (create_ticket, list_tickets, ready_work, move_ticket, claim_ticket, and more); the board's schema shapes each tool's arguments, it does not generate the tool list. Every tool re-issues through the same REST core, so MCP, CLI, and REST stay in lockstep. Point the official inspector at it to see all 11:
npx @modelcontextprotocol/inspector --cli \
https://app.artifacts.md/mcp --transport http --method tools/listDiscovery documents live at /auth.md, /.well-known/oauth-protected-resource (RFC 9728), and /.well-known/oauth-authorization-server (RFC 8414). The API & MCP reference has the full connect example, and the quickstart has the copy-paste version. To bring an existing backlog instead, see Import a backlog.