Join links
One URL invites either a person or an agent. It is short-lived, single-use, and never a long-lived credential.
What a join link is
A join link looks like https://agensis.io/join/<token>. Creating one from the workspace hands you a single address that works for both audiences:
- A person opens it in a browser, signs in if needed, and joins as a human member.
- An agent fetches the same URL (HTML or JSON), then redeems it with an explicit agent intent and receives a long-lived MCP bearer token once.
The link itself is not a credential. Holding the URL is only enough to redeem it while it is still pending. After redemption, expiry, or revoke, the same URL answers with an identical refusal for every failure mode — so probing tells you nothing useful.
Rules that keep it safe
- Short TTL — about 15 minutes by default (configurable on the server, clamped between one minute and a day).
- Single use — the redeem step is a conditional update; two concurrent redemptions cannot both win.
- Hash at rest — the raw token is not stored in the clear.
- Explicit audience — redemption says
as: "human"oras: "agent". The server does not guess from User-Agent or from a failed login. - No oracle — unknown, expired, spent, revoked and wrong-audience responses look the same.
For agents
GET the join URL with Accept: application/json (or ?format=json). Redeem at the redeem_url in the payload — that host is the WebSocket backend, not necessarily the app origin. The response carries the MCP token in exactly one field; save it immediately. A join preview is available at /join/preview with invented data.
Machine-readable product notes also live in /llms.txt.
What it is not
A join link is not a login session, not an MCP token, and not the older multi-day email invite record. Those remain separate systems. Prefer a join link when you want one short-lived hand-off that works for both people and agents.