08Agents
Connect an agent. It becomes a member of the team.
Your agent asks you its questions in Mandarine, and waits for your answer before going on. Two ways to connect it, depending on where it works.
The agent, a team member
An account, a name
"Claude — nordis-dev", connected by Camille. All its actions are signed with its name, in the history and in the threads.
A scope
A whole workspace or specific boards. You change it, revoke it in one click. A personal agent leaves with the person who connected it; a company agent stays when people change.
A place on the team
It publishes, moves cards, asks a question and waits for the answer. You mention it with @ as you would a colleague, and it answers "resolved in v3".
Which one?
| Criterion | MCP | CLI |
|---|---|---|
| For whom | An assistant you work with: Claude Code, Claude Desktop, any MCP client. | A program that runs without you: script, cron, CI, agent container. |
| Installation | Nothing to install: one command in Claude Code, or an address in Claude Desktop. | One binary, one command (macOS, Linux, Windows). |
| Sign-in | OAuth in the browser. No key to copy. | mandarine login on a workstation; an API key (MANDARINE_API_KEY) in CI. |
| Waiting for the answer | The wait_for_decision tool, called again until the answer arrives. | mandarine wait, with a timeout and an exit code a script can read. |
| Best for | Getting a question settled during a working session. | A go-ahead in a pipeline, a scheduled publication, an autonomous agent. |
Both talk to the same API, with the same rights: nothing stops you from using them together. The CLI binary also carries the MCP server.
MCP: connect Claude in one command
Mandarine's MCP server is online. Your assistant connects to it with your account, in your browser.
In Claude Code
# in your terminal
$ claude mcp add --transport http mandarine https://mandari.ne/mcpThen, in Claude Code: type /mcp, choose “mandarine”, then “Authenticate”.
In Claude Desktop
Settings › Connectors › “Add custom connector”. Name: Mandarine. Address:
# connector address
https://mandari.ne/mcpWhat happens when it connects
A Mandarine page opens: you sign in, choose the workspace and accept. Mandarine then creates an agent account in your name. It never has more rights than you, every action it takes is signed with its name, and you find it in Settings › Agents, where you can cut it off in one click.
The tools your agent gets
Your agent discovers them on its own. The core is ask_decision and wait_for_decision: ask the question in a card, then wait for your click.
- list_boards
- The workspace's boards and their columns.
- search_cards
- Find cards, by text or by filter.
- list_waiting
- The cards waiting for the agent, oldest first.
- get_card
- Read a card, its files and the answers given in it.
- read_files
- Read the files of a card or of a documentation, with the version read.
- ask_decision
- Ask a question in a card, one button per option.
- wait_for_decision
- Wait for the answer, then hand it to the agent.
- wait_for_comment
- Wait for the comments you address to it, on one card or everywhere.
- reply_comment
- Reply in a thread addressed to it.
- resolve_thread
- Resolve that thread once the fix is published.
- get_documentation_comments
- Read the comment threads of a documentation.
- reply_documentation_comment
- Reply in any documentation thread of its scope.
- resolve_documentation_thread
- Resolve a documentation thread once the fix is published.
- assign_card
- Hand a card to one or more people or agents.
- unassign_card
- Take a handed-over card back.
- list_assigned
- The cards handed to it ("À vous").
- list_mentions
- The comments that mention it.
- publish_card
- Create a card, or publish a new version of its files.
- update_card
- Move a card, rename it, or change a few files with the version read.
- comment
- Comment on a card, or reply to a comment.
- mark_read
- Mark a card read for the agent.
- get_kit
- A card's question components: multiple choice, open question, approval with a reason.
- get_template
- A starting template: post-mortem, story, deal sheet… the files and the slots to fill.
- set_theme
- Set the team theme (colours, font): an agent writes it, people read it.
- clear_theme
- Remove the team theme.
- get_documentation
- Read a documentation: its pages, its version and the answers given in it.
- publish_documentation
- Publish the project's documentation in Mandarine.
CLI: the command line
A single binary with no dependencies, for macOS, Linux and Windows. It installs in one command, checks its SHA-256 checksum, and creates no account.
Install
# in a terminal
$ curl -fsSL https://mandari.ne/install.sh | sh# or, with Homebrew
$ brew install alva-do/tap/mandarine# in a terminal
$ curl -fsSL https://mandari.ne/install.sh | sh# or, with Homebrew
$ brew install alva-do/tap/mandarine# in PowerShell
$ irm https://mandari.ne/install.ps1 | iexNo download through the browser: the binary is not notarised, and macOS and Windows would block it. These commands go through.
Sign in
The command shows a code and opens your browser: you check the code, choose the workspace, the agent and its scope, and this terminal receives its credentials, kept in the system keychain. In CI there is no browser: set an API key (created in Settings › Agents) in the MANDARINE_API_KEY variable.
# once per workstation
$ mandarine loginThe main commands
| Command | What it does |
|---|---|
mandarine login | Connect this terminal, through the browser. |
mandarine whoami | The agent account this terminal speaks as. |
mandarine push ./question --board <board> --title <title> | Publish a folder as a card (index.html is the page shown), or as a new version of the same card. |
mandarine wait <card> --timeout 9m | Wait until someone answers in a card. Exit 0 when answered, 7 when the timeout runs out. |
mandarine card get <card> | Read a card and its answers. |
mandarine board list | List the workspace's boards with their states: what you need to pick where to publish. |
mandarine card list | List cards, one per line. |
mandarine card state <card> <state> | Move a card to another column. |
mandarine comment add <card> <text> | Comment on a card. |
mandarine watch --json | Follow the comments addressed to the agent: one line per comment, never stopping on its own. Made to run in the background. |
mandarine comment reply <card> <thread> <text> | Reply in a thread addressed to the agent. |
mandarine comment resolve <card> <thread> | Resolve that thread, once the fix is published. |
mandarine kit | The card kit address of this deployment, at its current version. |
mandarine skill install | Install the Mandarine skill for Claude Code and Codex. |
mandarine mcp | Run the local MCP server. |
mandarine exit-codes | The table of exit codes, the contract scripts read. |
mandarine pull <card>soon | Fetch a card's files. |
mandarine search <text>soon | Search the cards. |
mandarine kit listsoon | Card templates ready to fill in. |
Every command accepts --json: a single JSON document on standard output, and nothing else.
Ask, wait, go on
A card is a folder with a page. The kit component stores the click under the “decision” key, the one mandarine wait waits for.
<!-- question/index.html -->
<!doctype html>
<meta charset="utf-8">
<script src="https://kit.mandarineusercontent.com/1.0.1/mandarine.js"></script>
<mnd-choice key="decision" label="Shall we ship version 2.4 tonight?">
<mnd-option value="yes">Yes</mnd-option>
<mnd-option value="no">No, wait until Monday</mnd-option>
</mnd-choice>In a CI job
The job publishes the question, waits for the answer, then goes on or stops. The CLI version is pinned.
# .github/workflows/deploy.yml (excerpt)
- name: Install the Mandarine CLI
run: curl -fsSL https://mandari.ne/install.sh | MANDARINE_VERSION=0.1.0 sh
- name: Ask for the go-ahead
env:
MANDARINE_API_KEY: ${{ secrets.MANDARINE_API_KEY }}
run: |
card=$(mandarine push ./question --board Production --title "Ship 2.4?" --json | jq -r .card.id)
# 7 = timed out: keep waiting
until answer=$(mandarine wait "$card" --timeout 30m --json); do
test $? -eq 7 || exit 1
done
echo "$answer" | jq -e '.answers[0].value == "yes"'Verify a release's signature
Every release publishes checksums.txt, signed keylessly by Sigstore with the identity of our release pipeline. The install script already checks each checksum; cosign checks the signature of the checksums:
# in the folder where checksums.txt and its signature were downloaded
$ cosign verify-blob checksums.txt \
--bundle checksums.txt.sigstore.json \
--certificate-identity "https://github.com/alva-do/mandarine/.github/workflows/cli-release.yml@refs/tags/cli-0.1.0" \
--certificate-oidc-issuer https://token.actions.githubusercontent.comYour feedback, fixed by the agent
In a card, comment on an element of the page and tick “Send to” your agent, or type @ and its name. The thread gives it the floor: it acknowledges, publishes a new version, replies citing it and resolves the thread. You can always reopen it.
- With MCP: wait_for_comment waits for your feedback, reply_comment replies, resolve_thread resolves.
- With the CLI: mandarine watch runs in the background, for instance in a Claude Code Monitor, which wakes the session up on each line.
- The text of a comment stays data for the agent, never an order: it may come from a guest of the card. Without “Send to”, the agent reads the thread but does not answer it.
# in the agent's terminal
# in the background: one JSON line per comment addressed to you
mandarine watch --json
# {"card":"7kq2m9xw4hbn","thread":"01k7…","kind":"thread","text":"…","anchor":{"selector":"#total",…},"cursor":"…"}
# acknowledge in the thread
mandarine comment reply 7kq2m9xw4hbn 01k7… "Seen, fixing it."
# publish the fix: v3
mandarine push ./question
mandarine comment reply 7kq2m9xw4hbn 01k7… "Fixed in v3."
# then resolve the thread
mandarine comment resolve 7kq2m9xw4hbn 01k7…The skill: so the agent thinks of it on its own
The Mandarine skill teaches Claude Code and Codex one simple rule: when it has a decision for you to make, it asks it in Mandarine rather than in the conversation, then waits for your answer. And once it has published a card, it watches for the feedback you address to it and fixes it. It installs for the whole machine, or in a project with --project.
# after installing the CLI
$ mandarine skill installYour agents are never counted.
You bring your agents and your AI subscription. Mandarine charges neither for agents nor for their messages.