Connect an AI agent
pink-lemonade has no built-in chatbot. It hosts a local MCP server; you point your own AI agent at it from a terminal. The agent searches the open case, correlates activity, reads cached intel, and records findings — which land in Case mode for your review.
- Everything happens beside the app: keep it open with a workspace focused while the agent works.
- Claude Code is the documented, tested client. Any MCP client that supports a local HTTP endpoint with a custom
Authorizationheader can connect — open MCP in the header for the URL and token; approval controls vary by client.
Evidence rules the agent can’t skip
record_eventvalidates cited rows — evidence that matches nothing is refused. Each accepted citation stores a quoted line captured by the app, not a paraphrase.record_negativeruns the search itself and refuses to record an “absence” if anything matches, naming the term that hit.query_sqlaccepts one read-onlySELECT— writes,ATTACH,PRAGMAare rejected — and every query is logged into the case.- Log data is untrusted input: invisible/direction-flipping characters are made visible, and instruction-like text inside evidence is treated as evidence, never as a command.
Claude Code setup
Prereq: Claude Code installed and signed in. No Anthropic API key, no bundled binary. The server starts with the app — the MCP button’s dot shows 🟢 running / 🟡 starting / 🔴 error.
Register once, work from any folder:
-
Click MCP in the header → copy the one-time command:
claude mcp add --transport http pinklemonade http://127.0.0.1:8765/mcp \ --header "Authorization: Bearer <your token>" --scope user - Run it in any terminal. User scope = the tools load in every session, no per-folder files, no trust prompt.
- From then on:
cd ~/cases/acme-ir && claude. The agent drives whichever workspace is focused in the app.
Check or undo with claude mcp list / claude mcp remove pinklemonade.
Want the agent to import evidence itself? Set the Evidence folder in Settings → Storage first — it’s the only folder the agent may read files from. Unset = it can only use what you’ve imported.
Alternative — a self-contained case folder. The MCP dialog’s second option writes a dedicated folder with .mcp.json (URL + token), CLAUDE.md (the investigation methodology), pre-approved tool settings, and a .gitignore. Run claude from that folder. It’s project-scoped, so Claude Code asks you to trust it once.
The token. The server binds to 127.0.0.1 only, port fixed at 8765; every request needs the bearer token (generated on first run, stored locally, never in source). It stops other local programs from driving the app — tool approvals are your MCP client’s job.
What the agent can do
- Orient — list sources and host groups, describe columns, list evidence-folder files, list other cases.
- Search — one source or all at once (whole-token for IPs/hashes, substring for domains), structured filters, distinct values, group-and-count, read-only SQL.
- Correlate in time — rows within ±N seconds of a timestamp, across sources.
- Record — events, IOCs, leads, proven absences, entities and links; mark cited rows.
- Manage — create/open a case, import evidence, tag rows, assign hosts, maintain the plan and progress note.
- Read cached intel for free — it never spends fresh VirusTotal/MaxMind lookups. That’s your call.
Left for your approval in the terminal: import_evidence, tag_rows, set_source_group. Everything else is pre-approved in the generated settings; recording actions are reversible and reviewable in Case. The agent can never mark an entity Cleared or approve/reject a finding — analyst only.
The Case workflow
Agent output lands in Case mode (the badge counts pending review). Work it in order:
- Overview — case activity and status.
- Queue — approve or reject findings.
- Findings — Graph / Time axis / Table / IOC views over recorded events; Table exports l2t_csv-style.
- Report — assemble and export the deliverable.
Investigation, Systems & Accounts, and IOCs hold the plan, subjects, and indicator catalog.
Terms: Evidence = cited source rows · Finding = a recorded event, lead, absence, or entity assessment · Queue = the review line · ✨ marks = rows the agent flagged, filterable in the grid.
Queue
- Pending first, grouped by host. Approve (✓) or Reject (✗) — rejection requires a reason, kept and shown back to the agent. Nothing is deleted; anything can go back to pending.
- Amber flags call out what to read first:
overturned,caveat,stale,single-source,not-collected. - Each finding shows its quoted evidence rows; the telescope jumps to where the evidence lives.
- Reviewed items hide by default (show reviewed). Approve N batch-approves a host’s pending items after a confirm.
Systems & Accounts
- Machines and accounts in the case, from host groups and recorded events. Set status (Compromised / Suspected / Cleared / Unknown — Cleared is analyst-only), role, notes.
- A banner lists named systems with no collected data — you can’t pivot into what was never imported.
- Accounts never merge across domains:
EXAMPLE\admin≠OTHER\admin. Lookalikes are only suggested; merges must be confirmed.
IOC catalog
Indicators the agent cataloged, by type. Cataloging never sends anything anywhere — pushing to the Intel grid is your action.
Report
- Approved findings flow in. Edit metadata and narrative sections (double-click / pencil;
Ctrl+Entersaves,Escapecancels); unsaved drafts are marked and guarded on close. - Comments attach to sections, resolve/delete as addressed; they stay out of the export.
- Export as Markdown. Drafts can include unreviewed findings — labeled as such.
Report checks, measured from the case itself:
- Coverage — every source and host examined.
- Review — nothing pending, no unanswered rejection (hiding a finding doesn’t help).
- Evidence — every included finding cites rows.
- Verification — see below; an unresolved refutation blocks Ready.
Export is never blocked — a draft that fails checks just confirms first and carries a draft warning.
Independent verification
On request, a separate reviewer re-checks each finding from its cited rows and quotes, without the original explanation, recording supports / refutes / cannot-verify with a reason. Asymmetric on purpose: one refutation marks it refuted no matter the supporting votes. Verification sits beside your approve/reject; it never replaces it.
Proven absences
The agent records “didn’t happen” as negatives with their scope stored — sources, terms, time window — so they can be re-run, not taken on faith. A separate evidence gap records a limitation (unparsed artifact, failed parser) and can’t be machine-re-checked.
Negatives appear in Report with a Negative badge and their scope line. Flags:
stale— a source arrived after the absence was established; unverified against the current case, not wrong.overturned— a re-check found rows; kept and flagged, because those rows are the finding.
Read the scope line before treating not present as did not happen.
MITRE ATT&CK
Technique ids resolve against the official catalog baked in at build time — no network, nothing to configure. Retired ids upgrade automatically; unknown ids are kept but marked (unverified) instead of silently trusted. Hand-typed techniques go through the same resolution.
ATT&CK data © MITRE, CC BY 4.0 — attribute MITRE ATT&CK in published reports.
Where your data goes
- The agent’s MCP client sends what it reads (rows, columns, cached intel) to that client’s model provider, under your account and terms. pink-lemonade never sends case data anywhere on its own.
- No pink-lemonade account or server. MCP binds to
127.0.0.1; workspaces, tags, sightings, watchlists, and the intel cache are local files. Online enrichment providers see indicators only when you start a lookup.