CLI and MCP
Look at your loops, add steps and leads, and ask Iggy from your terminal, or let the agent app you already use do it.
What it is
Ignaru has three ways in besides the app. A command line, ignaru. An MCP server, so Claude Code, Claude Desktop, Cursor and Codex can work on your loops. And a small REST API under /api/v1 that both of them use. They all act as you, in your team, with a personal token.
Get a token
- Open Ignaru and go to Settings, API & CLI.
- Choose New token and name it after where it will live, like “Laptop” or “Cursor”.
- Copy it. It starts with
ig_and is shown once.
A token belongs to you and to the team you were in when you made it. Revoke it from the same page and it stops working straight away. Keep it out of repositories: put it in the CLI’s config, an environment variable, or your client’s secret store.
Install
The CLI needs Node 18 or newer and has no dependencies. It is not on npm yet. From a checkout of the repository, build it and link it:
npx tsc -p cli
npm i -g ./cli
ignaru loginOnce it is published you will be able to run npx ignaru with nothing installed.
ignaru login opens the token page, asks you to paste the token (it is not shown as you type), checks it, and saves it to ~/.config/ignaru/config.json with permissions for you only. To skip the file, set IGNARU_TOKEN or pass --token. To point at another server, use --api or IGNARU_API.
Commands
| Command | What it does |
|---|---|
ignaru login | Save a personal token. Opens Settings, API & CLI, then asks you to paste it. |
ignaru whoami | Which team and user the token acts as, and your credits. |
ignaru loops | Your loops with status, steps, leads and drafts waiting. |
ignaru loop <loop> | One loop's board in the terminal: steps coloured by family, counts, and where each pipe goes. |
ignaru new-loop "Name" | Create an empty draft loop. |
ignaru add-step <loop> <kind> --after <stepId> | Add a step and join it to the one before. The CLI places it on the board. |
ignaru set-status <loop> live|paused|draft | Start or stop a loop. |
ignaru leads --stage warm -q acme | Search leads by text, stage or loop. |
ignaru drafts | Drafts waiting for approval. Read-only. |
ignaru ask "…" --loop <loop> | Ask Iggy and print the answer. |
ignaru mcp | Print the MCP setup for each client. |
A <loop> can be the full id, the first few characters of it, or the loop’s name in quotes. Add --json to any read command for machine-readable output, and --no-color or NO_COLOR=1 for plain text.
A loop built from the terminal:
ignaru new-loop "Seed-stage founders"
ignaru add-step "Seed-stage founders" signals
ignaru add-step "Seed-stage founders" enrich --after n_ab12cd34
ignaru add-step "Seed-stage founders" coldemail --after n_ef56gh78
ignaru add-step "Seed-stage founders" approve --after n_ij90kl12
ignaru loop "Seed-stage founders"Each add-step prints the new step’s id, which is what the next one passes to --after.
MCP
The server speaks Streamable HTTP at https://ignaru.com/api/mcp/mcp and takes the same token as a Bearer header. Run ignaru mcp to print these with the address filled in.
Claude Code
claude mcp add --transport http ignaru https://ignaru.com/api/mcp/mcp \
--header "Authorization: Bearer ig_YOUR_TOKEN"Claude Desktop
Add this to claude_desktop_config.json (Settings, Developer, Edit Config). It uses the mcp-remote bridge, which needs Node.
{
"mcpServers": {
"ignaru": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://ignaru.com/api/mcp/mcp", "--header", "Authorization:${IGNARU_AUTH}"],
"env": { "IGNARU_AUTH": "Bearer ig_YOUR_TOKEN" }
}
}
}Cursor
Add this to ~/.cursor/mcp.json, or .cursor/mcp.json inside a project.
{
"mcpServers": {
"ignaru": {
"url": "https://ignaru.com/api/mcp/mcp",
"headers": { "Authorization": "Bearer ig_YOUR_TOKEN" }
}
}
}Codex
Add this to ~/.codex/config.toml, with IGNARU_TOKEN exported in your shell.
[mcp_servers.ignaru]
url = "https://ignaru.com/api/mcp/mcp"
bearer_token_env_var = "IGNARU_TOKEN"Tools
| Tool | What it does |
|---|---|
whoami | Which user and team the token acts as, and credits. |
list_loops | The team's loops with status and counts. |
get_loop | One loop's board as text, with step ids to build on. |
create_loop | A new empty draft loop. |
add_step | Add a step after another and join them. Lists every step kind. |
set_loop_status | Set a loop live, paused or draft. |
search_leads | Find leads by text, stage or loop. |
add_leads | Add up to 200 leads, de-duplicated by email. |
list_drafts_waiting | Drafts waiting for a human to approve. Read-only. |
ask_iggy | Ask Iggy to answer or change a loop. |
There is also one resource, ignaru://loops/{id}, that returns a loop’s board as JSON. Try a prompt like “Build me a loop that finds seed-stage fintech founders and drafts a short intro. Stop before anything is sent.”
REST
Everything above is a plain JSON API. Send the token as Authorization: Bearer ig_…. Errors come back as { "ok": false, "code": "...", "message": "..." }. Each token gets 120 requests a minute, and 10 questions to Iggy a minute.
| Endpoint | Notes |
|---|---|
GET /api/v1/me | User, team, credits |
GET /api/v1/loops | Loops |
POST /api/v1/loops | Create a loop. Body: { name } |
GET /api/v1/loops/:id | Board summary |
PATCH /api/v1/loops/:id | Body: { status } |
POST /api/v1/loops/:id/steps | Body: { kind, after?, title?, data? } |
GET /api/v1/leads | Query: q, stage, loopId, limit |
POST /api/v1/leads | Body: { leads: [...], loopId? } |
GET /api/v1/drafts | Query: status (default queued), limit |
POST /api/v1/ask | Body: { prompt, loopId?, threadId?, model? } |
curl https://ignaru.com/api/v1/loops \
-H "Authorization: Bearer $IGNARU_TOKEN"What it cannot do
Nothing leaves your team without a person pressing Approve in the app. The CLI, the MCP server and the API can read drafts. They cannot approve, edit or send them, and a token that tries to approve gets a 403 that says so.
Steps like cold email and LinkedIn only write drafts. Setting a loop live starts the finding and the writing, not the sending. An agent can build and run a whole loop up to the Approve step, and then it waits for you.
Tokens act with the Operator role: they can change loops and leads in the team, and they cannot do anything an admin alone can do. Make a separate token for each place you use one, so you can revoke it without touching the others.