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 workspaces. And a small REST API under /api/v1 that both of them use. They all act as you, with your own personal key.

Writing an agent? Read Ignaru for agents (also plain text at /llms-full.txt): the first call to make, the rules, how to save calls, and every common job as one MCP tool or CLI command.
Get a key
The quickest way is ignaru login: it shows a code, opens Ignaru, and once you approve, that computer has its own key. For an agent, a script or CI, make one yourself:
- Open Ignaru and go to Settings, You, API keys.
- Name it after where it will live, like “Laptop” or “Cursor”, pick all your teams or one, and an expiry.
- Copy it. It starts with
ig_pk_and is shown once.
A key acts as you. In each team it has the role you have there today, never more, and it stops reaching a team you leave. A key for all your teams picks one with the X-Ignaru-Team header (the CLI sends it after ignaru teams switch). Revoke a key 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. Older ig_ team tokens keep working in their one team.
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 prints a code, opens ignaru.com/cli/authorize, and waits while you check the code and press Approve. The code lasts 10 minutes and works once. The new key is saved 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 context | Start here: team, role, what the key may do, credits, limits, and where work is waiting. |
ignaru login | Sign in through your browser. Check the code, press Approve, and this computer gets its own personal key (ig_pk_…). |
ignaru whoami | Which team and user the key acts as, your role, and your credits. |
ignaru teams | Your teams and your role in each. teams create, teams switch, teams invite (which only emails with --yes) and teams link for invite links. |
ignaru loops | Your loops with status, steps, leads and drafts waiting. |
ignaru loop "<loop>" | Describe a loop: the board, leads by stage, drafts waiting, spend, and why it can't go live. |
ignaru new-loop "Name" --steps signals,enrich,coldemail,approve | Create a draft loop, with its whole chain of steps if you pass them. |
ignaru add-step "<loop>" linkedin --after research --into approve | Add a step after another and, optionally, into a later one. Steps by id, title or kind. |
ignaru connect | disconnect | remove-steps | rename | Join or unjoin two steps, remove steps, rename a loop. |
ignaru set-status "<loop>" live|paused|draft | Start or stop a loop (pause and resume do the same). |
ignaru leads acme --stage warm | Search leads: ids, the total, and counts per stage. |
ignaru add-leads --file leads.csv --loop "<loop>" | Add up to 200 leads, merged by email. --dry-run previews. |
ignaru lead "<email or name>" --stage call | Change a lead. |
ignaru replies · ignaru draft "<lead>" · ignaru drafts | What leads wrote back; write a draft into Approve; drafts waiting (read-only). |
ignaru credits --week | Balance, and where credits went. |
ignaru ask "…" --loop "<loop>" | Ask Iggy and print the answer. |
ignaru tools · ignaru call <tool> '<json>' | Every MCP tool in one line each, and a way to call any of them. |
ignaru mcp | Print the MCP setup for each client. |
A <loop> can be the full id, the first few characters of it, or the workspace’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 workspace 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 |
|---|---|
context | Start here: team, your role, what the key may do, credits and this week's spend, limits, where work is waiting, every loop. |
whoami | Who am I |
list_step_kinds | Step kinds and prices |
list_teams | List my teams |
create_team | Create a team |
invite_teammates | Email invites to a team. Admin only, and only with confirm: true after the user has seen the list. |
create_team_link | A link anyone can open to join a team as Operator or Viewer (never Admin), for up to 30 days. Admin only. |
list_team_links | A team's live invite links, without the links themselves. Admin only. |
revoke_team_link | Stop an invite link working. Admin only. |
list_loops | List loops |
get_loop | Describe a loop in one call: steps, pipes as from -> to, leads by stage, drafts waiting, spend, why it can't go live. |
create_loop | A new draft loop, optionally with its whole chain of steps in one call. |
add_step | Add a step after another (by id, title or kind), optionally also into a later one. |
connect_steps | Join two steps |
disconnect_steps | Unjoin two steps |
remove_steps | Remove steps |
update_loop | Rename a loop or change its status. |
set_loop_status | Set a loop live, paused or draft |
search_leads | Find leads by text, stage or loop, with the total, counts per stage and the next cursor. |
add_leads | Add up to 200 leads, merged by email; counts added and merged. dryRun previews. |
update_lead | Change a lead's stage, warmth or details, by id, email or name. |
enrich_leads | Find and check leads' details with sources. dryRun gives the credit estimate. |
explain_field | Explain an enriched fact |
list_replies | What leads wrote back, with their intent. |
draft_message | Write a draft for a lead into Approve (Iggy writes it if you give no body). Sends nothing. |
list_drafts_waiting | Drafts waiting for an Admin's Approve, by loop. Read-only. |
get_credits | Balance, and where credits went by reason and by loop. |
digest | What every loop did |
stuck_steps | Stuck steps |
today | Today |
list_notifications | List notifications |
mark_notifications_read | Mark notifications read |
list_calls | List calls |
list_bookings | List Cal.com bookings |
booking_link | Get a booking link |
ask_iggy | Ask Iggy to answer or change a loop. Spends credits. |
give_feedback | Give feedback on Ignaru |
Also: social_status, create_social_workspace, list_demo_boards, add_video, list_projects, get_project, make_client, add_card, update_card, post_update, list_feedback, triage_feedback, list_node_templates, list_custom_nodes, get_custom_node, validate_custom_node, dry_run_custom_node, save_custom_node, archive_custom_node, add_custom_step, upgrade_custom_step, list_custom_actions, list_pages, get_page, get_page_data, create_page, update_page, reorder_pages, delete_page. ignaru tools lists every tool in one line each.
Tools take workspaces, leads and steps by name as well as by id, and every write takes an optional idempotencyKey. Errors end with Fix: (what to call next) and, where it helps, Valid: (the values that would have worked).
Resources: ignaru://context, ignaru://step-kinds, ignaru://guide and ignaru://loops/{id}. Prompts: quickstart and build_workspace. Try a prompt like “Build me a workspace 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": "...", "hint": "...", "valid": [...] }: hint says what to do next, valid lists the values that would have worked. Writes take an Idempotency-Key header: a retry with the same key returns the first answer. Each token gets 120 requests a minute, and 10 questions to Iggy a minute.
| Endpoint | Notes |
|---|---|
GET /api/v1/context | Team, role, what the key may do, credits, limits, where work waits, loops |
GET /api/v1/me | User, team, credits |
GET /api/v1/steps | Every step kind with what it does, its price, and whether it writes to people |
GET /api/v1/loops | Loops |
POST /api/v1/loops | Create a loop. Body: { name, steps?, idempotencyKey? } |
GET /api/v1/loops/:loop | Board. ?view=summary for steps, pipes, leads by stage, drafts waiting and spend. :loop is an id or a name |
PATCH /api/v1/loops/:loop | Body: { name?, status? } |
POST /api/v1/loops/:loop/steps | Body: { kind, after?, into?, title?, data? }. after and into take an id, title or kind |
GET /api/v1/leads | Query: q, stage, loopId, limit, cursor. Returns total, byStage and next |
POST /api/v1/leads | Body: { leads: [...], loopId?, dryRun? }. Returns added, merged and each lead |
PATCH /api/v1/leads/:lead | Body: { stage?, warmth?, why?, role?, company? }. :lead is an id, email or name |
POST /api/v1/leads/enrich | Body: { leadIds (ids, emails or names), fields?, dryRun?, verbose? } |
GET /api/v1/replies | Query: lead, open, limit |
GET /api/v1/drafts | Query: status (default queued), loopId, full, limit, cursor. Returns total and next |
POST /api/v1/drafts | Write a draft into Approve. Body: { lead, channel, body? or instruction? } |
GET /api/v1/credits | Query: period. Balance, byReason, byLoop |
GET /api/v1/export | Your data as one JSON download, every row. scope=team and format=csv&type=leads need an admin signed in to the app |
POST /api/v1/ask | Body: { prompt, loopId?, threadId?, model? } |
GET /api/v1/teams | Your teams with your role in each |
POST /api/v1/teams | Create a team, you as Admin. Body: { name, website? } |
POST /api/v1/teams/:id/invites | Admin only. Body: { invites: [{ email, role }], confirm: true }. Without confirm nothing is sent |
GET /api/v1/keys | Your personal keys (never the secret) |
DELETE /api/v1/keys/current | Revoke the key making the call |
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 workspace live starts the finding and the writing, not the sending. An agent can build and run a whole workspace up to the Approve step, and then it waits for you.
In a team’s workspaces and leads a key does at most what an Operator can, even an Admin’s key: approving sends, billing and team settings stay in the app. The one Admin power a key keeps is setting up teams: an Admin’s key can invite people, and only with an explicit confirm, because each invite emails a real person. Make a separate key for each place you use one, so you can revoke it without touching the others.
Not set up yet?
The web app is the main way in. The agent and terminal setups are on the download page too.