Skip to content

Connect an agent

  1. Create the agent. owner and admins

    Settings → People → Agents. Give it a name — that name appears on cards, in comments and in the activity log, so call it something a teammate would recognise.

    Creating an agent does not create a token. That is the next step, and it is separate on purpose.

  2. Issue a token. Press Connect on the agent’s row.

    The token is shown once. Only a SHA-256 digest is stored, so it cannot be read again — the list afterwards shows the first twelve characters, enough to tell two tokens apart and no more.

    ush_xK3nQ8vB2mLp9wZfR4tYsH7cJ0dN6gA1eU5iO...

    A token is ush_ followed by 32 random bytes. It opens one project and no other, and it never expires — revoking is the only way to end it.

  3. Give it to your agent. The Connect panel hands you three ready commands with your board’s own address already in them.

For Claude Code, which reads a skill from ~/.claude/skills:

1 — put the skill where Claude Code finds it
mkdir -p ~/.claude/skills/ushabti && \
curl -sL https://your-board.example.com/skill/SKILL.md -o ~/.claude/skills/ushabti/SKILL.md && \
curl -sL https://your-board.example.com/skill/board.mjs -o ~/.claude/skills/ushabti/board.mjs
2 — give it the board and the token
export USHABTI_URL=https://your-board.example.com
export USHABTI_TOKEN=ush_…
3 — check it
curl -s $USHABTI_URL/api/agent/me -H "Authorization: Bearer $USHABTI_TOKEN"
what you should get back
{
"agent": { "id": "…", "name": "Builder", "color": "#3fb0c8" },
"project": { "id": "…", "name": "Ushabti roadmap", "key": "USH", "role": "member", "waiting": 2 }
}

Under those commands the panel waits — “Waiting for the first call from this token…” — and turns into “Builder answered.” the moment the token is used. It is checking every three seconds, so you do not have to guess whether it worked.

Put SKILL.md in the system prompt and ship board.mjs next to your agent — it is one file of Node with no dependencies. Or ignore both and call the JSON API directly; see the run protocol and the worked example.

Every JSON route accepts it:

Terminal window
curl -s "$USHABTI_URL/api/projects/$PROJECT/board" \
-H "Authorization: Bearer $USHABTI_TOKEN"

One project. The project id is baked into the token when it is issued and never changes; calling another project’s route with it gets 403 That token belongs to another project.

You do not need to configure the project id anywhere — GET /api/agent/me tells the agent which board it is on.