mandarıne

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?

Comparison of the two interaction modes
CriterionMCPCLI
For whomAn assistant you work with: Claude Code, Claude Desktop, any MCP client.A program that runs without you: script, cron, CI, agent container.
InstallationNothing to install: one command in Claude Code, or an address in Claude Desktop.One binary, one command (macOS, Linux, Windows).
Sign-inOAuth in the browser. No key to copy.mandarine login on a workstation; an API key (MANDARINE_API_KEY) in CI.
Waiting for the answerThe wait_for_decision tool, called again until the answer arrives.mandarine wait, with a timeout and an exit code a script can read.
Best forGetting 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

Connect Mandarine in Claude Code
# in your terminal
$ claude mcp add --transport http mandarine https://mandari.ne/mcp

Then, in Claude Code: type /mcp, choose “mandarine”, then “Authenticate”.

In Claude Desktop

Settings › Connectors › “Add custom connector”. Name: Mandarine. Address:

Address of Mandarine's MCP server
# connector address
https://mandari.ne/mcp

What 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

Install the Mandarine CLI (macOS)
# in a terminal
$ curl -fsSL https://mandari.ne/install.sh | sh
Install the Mandarine CLI with Homebrew (macOS)
# or, with Homebrew
$ brew install alva-do/tap/mandarine

No 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.

Connect the CLI to Mandarine
# once per workstation
$ mandarine login

The main commands

Main commands of the Mandarine CLI
CommandWhat it does
mandarine loginConnect this terminal, through the browser.
mandarine whoamiThe 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 9mWait 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 listList the workspace's boards with their states: what you need to pick where to publish.
mandarine card listList 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 --jsonFollow 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 kitThe card kit address of this deployment, at its current version.
mandarine skill installInstall the Mandarine skill for Claude Code and Codex.
mandarine mcpRun the local MCP server.
mandarine exit-codesThe table of exit codes, the contract scripts read.
mandarine pull <card>soonFetch a card's files.
mandarine search <text>soonSearch the cards.
mandarine kit listsoonCard 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.

The question page, question/index.html
<!-- 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.

Example GitHub Actions workflow
# .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:

Verify the signature of checksums.txt with cosign
# 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.com

Your 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.
The feedback loop, on the command line
# 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.

Install the Mandarine skill
# after installing the CLI
$ mandarine skill install

Your agents are never counted.

You bring your agents and your AI subscription. Mandarine charges neither for agents nor for their messages.

Keys, scopes and audit log