Skip to content

CLI and MCP

Look at your workspaces, 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 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:

  1. Open Ignaru and go to Settings, You, API keys.
  2. Name it after where it will live, like “Laptop” or “Cursor”, pick all your teams or one, and an expiry.
  3. 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:

Terminal
npx tsc -p cli
npm i -g ./cli
ignaru login

Once 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

CommandWhat it does
ignaru contextStart here: team, role, what the key may do, credits, limits, and where work is waiting.
ignaru loginSign in through your browser. Check the code, press Approve, and this computer gets its own personal key (ig_pk_…).
ignaru whoamiWhich team and user the key acts as, your role, and your credits.
ignaru teamsYour teams and your role in each. teams create, teams switch, teams invite (which only emails with --yes) and teams link for invite links.
ignaru loopsYour 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,approveCreate a draft loop, with its whole chain of steps if you pass them.
ignaru add-step "<loop>" linkedin --after research --into approveAdd a step after another and, optionally, into a later one. Steps by id, title or kind.
ignaru connect | disconnect | remove-steps | renameJoin or unjoin two steps, remove steps, rename a loop.
ignaru set-status "<loop>" live|paused|draftStart or stop a loop (pause and resume do the same).
ignaru leads acme --stage warmSearch 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 callChange a lead.
ignaru replies · ignaru draft "<lead>" · ignaru draftsWhat leads wrote back; write a draft into Approve; drafts waiting (read-only).
ignaru credits --weekBalance, 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 mcpPrint 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:

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

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

claude_desktop_config.json
{
  "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.

~/.cursor/mcp.json
{
  "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.

~/.codex/config.toml
[mcp_servers.ignaru]
url = "https://ignaru.com/api/mcp/mcp"
bearer_token_env_var = "IGNARU_TOKEN"

Tools

ToolWhat it does
contextStart here: team, your role, what the key may do, credits and this week's spend, limits, where work is waiting, every loop.
whoamiWho am I
list_step_kindsStep kinds and prices
list_teamsList my teams
create_teamCreate a team
invite_teammatesEmail invites to a team. Admin only, and only with confirm: true after the user has seen the list.
create_team_linkA link anyone can open to join a team as Operator or Viewer (never Admin), for up to 30 days. Admin only.
list_team_linksA team's live invite links, without the links themselves. Admin only.
revoke_team_linkStop an invite link working. Admin only.
list_loopsList loops
get_loopDescribe a loop in one call: steps, pipes as from -> to, leads by stage, drafts waiting, spend, why it can't go live.
create_loopA new draft loop, optionally with its whole chain of steps in one call.
add_stepAdd a step after another (by id, title or kind), optionally also into a later one.
connect_stepsJoin two steps
disconnect_stepsUnjoin two steps
remove_stepsRemove steps
update_loopRename a loop or change its status.
set_loop_statusSet a loop live, paused or draft
search_leadsFind leads by text, stage or loop, with the total, counts per stage and the next cursor.
add_leadsAdd up to 200 leads, merged by email; counts added and merged. dryRun previews.
update_leadChange a lead's stage, warmth or details, by id, email or name.
enrich_leadsFind and check leads' details with sources. dryRun gives the credit estimate.
explain_fieldExplain an enriched fact
list_repliesWhat leads wrote back, with their intent.
draft_messageWrite a draft for a lead into Approve (Iggy writes it if you give no body). Sends nothing.
list_drafts_waitingDrafts waiting for an Admin's Approve, by loop. Read-only.
get_creditsBalance, and where credits went by reason and by loop.
digestWhat every loop did
stuck_stepsStuck steps
todayToday
list_notificationsList notifications
mark_notifications_readMark notifications read
list_callsList calls
list_bookingsList Cal.com bookings
booking_linkGet a booking link
ask_iggyAsk Iggy to answer or change a loop. Spends credits.
give_feedbackGive 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.

EndpointNotes
GET /api/v1/contextTeam, role, what the key may do, credits, limits, where work waits, loops
GET /api/v1/meUser, team, credits
GET /api/v1/stepsEvery step kind with what it does, its price, and whether it writes to people
GET /api/v1/loopsLoops
POST /api/v1/loopsCreate a loop. Body: { name, steps?, idempotencyKey? }
GET /api/v1/loops/:loopBoard. ?view=summary for steps, pipes, leads by stage, drafts waiting and spend. :loop is an id or a name
PATCH /api/v1/loops/:loopBody: { name?, status? }
POST /api/v1/loops/:loop/stepsBody: { kind, after?, into?, title?, data? }. after and into take an id, title or kind
GET /api/v1/leadsQuery: q, stage, loopId, limit, cursor. Returns total, byStage and next
POST /api/v1/leadsBody: { leads: [...], loopId?, dryRun? }. Returns added, merged and each lead
PATCH /api/v1/leads/:leadBody: { stage?, warmth?, why?, role?, company? }. :lead is an id, email or name
POST /api/v1/leads/enrichBody: { leadIds (ids, emails or names), fields?, dryRun?, verbose? }
GET /api/v1/repliesQuery: lead, open, limit
GET /api/v1/draftsQuery: status (default queued), loopId, full, limit, cursor. Returns total and next
POST /api/v1/draftsWrite a draft into Approve. Body: { lead, channel, body? or instruction? }
GET /api/v1/creditsQuery: period. Balance, byReason, byLoop
GET /api/v1/exportYour 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/askBody: { prompt, loopId?, threadId?, model? }
GET /api/v1/teamsYour teams with your role in each
POST /api/v1/teamsCreate a team, you as Admin. Body: { name, website? }
POST /api/v1/teams/:id/invitesAdmin only. Body: { invites: [{ email, role }], confirm: true }. Without confirm nothing is sent
GET /api/v1/keysYour personal keys (never the secret)
DELETE /api/v1/keys/currentRevoke the key making the call
Terminal
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.