Logo StartupKit
FR

Prospect Memory for AI Agents

Durable per-company research memory that external AI agents recall before researching and write back to afterwards, shared across every campaign in your account.

External agents — Claude Cowork, Claude Code, anything connected to Kit’s MCP server — forget everything between runs. Prospect memory is where they put research so the next run reads it instead of paying for it again.

What It Stores

One memory per company domain, per account. [email protected], https://www.acme.dev/careers and acme.dev all resolve to acme.dev.

Each note holds:

  • A markdown body, encrypted at rest
  • One or more source URLs
  • observed_at — the date the fact was true
  • An optional short title, also encrypted, e.g. Funding or Hiring signals
  • Attribution: the member, and the OAuth client if the note arrived over MCP

Kit sends each note’s title and body — up to the first 6 KB — to Google’s gemini-embedding-001, which returns the vector used for overlap detection and ranked recall. That happens for every account, whatever AI provider you have configured.

The memory is account-wide, not campaign-scoped. Approach the same company in three campaigns and it has one dossier, not three. A note saved during a recruiting campaign is there when a sales campaign hits the same domain six weeks later.

Notes observed more than 30 days ago are flagged stale. Recall also reports one dossier-level stale, true when the newest stored note has passed 30 days and true when nothing is stored at all. Stale means re-verify the fact before you use it in a draft, not discard the dossier.

The Loop

Four tools. Full parameters and return shapes are in the MCP Tools Reference.

  1. outreach_recall_prospect_context — first call of every run, before any web search. Returns stored notes plus what your account already did to this company: the campaigns the prospect is in, how many messages were sent, the last reply and its sentiment, and whether the address or domain is suppressed.
  2. outreach_save_prospect_research — one call per distinct finding, not one per run. At least one source URL is required and the tool rejects a note without one.
  3. Read data.overlap on the save response. It is computed against everything already stored for that domain and it is the only signal that the memory is going redundant.
  4. outreach_compact_prospect_context — merges notes into one dossier. Only when you ask for it.

outreach_get_writing_guide returns Kit’s de-slop writing guide for en, de, fr, es or pl — the patterns that make drafted outreach read as machine-written. Agents should read it before drafting, not after.

Two stop conditions come back on every recall: relationship.suppressed is true, or relationship.last_reply.sentiment is negative. Either one means do not add the prospect and do not draft.

Scheduled-Task Prompt

Paste this into a Claude Cowork scheduled task, replacing <CAMPAIGN NAME> with your campaign. It lands in the agent’s context on every run, which is why it works better than hoping the agent remembers the loop.

Run today's outreach research pass for the <CAMPAIGN NAME> campaign.

For every company on the list, in this order:

1. Call outreach_recall_prospect_context with the company domain FIRST, before any
   web search. Read data.known, data.stale, and data.relationship.
2. If data.relationship.suppressed is true, or data.relationship.last_reply.sentiment
   is "negative" or "bounce": skip the company entirely. Do not add a prospect, do not
   draft. Add it to a "skipped" list in your summary with the reason.
3. If data.known is true and data.stale is false, do NOT re-research. Use the stored
   notes.
4. Otherwise research the company, then call outreach_save_prospect_research once per
   distinct finding, each with at least one source URL and the observed_at date the
   fact was true.
5. Read data.overlap on every save response. Report any near_duplicates you created
   and any shared_sources that show you re-read a page already cited.
6. Before drafting anything, call outreach_get_writing_guide for the campaign's
   language and follow it.
7. Do NOT call outreach_compact_prospect_context. If data.compaction_suggested is true
   for a company, list that company under "compaction suggested" in your summary and
   stop there.

Finish with a summary containing four lists: researched, reused-from-memory, skipped
(with reasons), and compaction suggested.

The number to watch in that summary is reused-from-memory. A run that researched everything is a run where recall was skipped.

What the Agent Is Told About Overlap

Every save response carries three buckets. Notes are compared by cosine distance between their embeddings.

Bucket Trigger What the agent should do
near_duplicates distance ≤ 0.10 — this note nearly restates an existing one. The existing note’s full body comes back. Compare both. If the new note adds nothing, delete it and keep the older one. If it updates the fact, flag it for compaction.
overlaps distance ≤ 0.30 — same territory, different detail. A 300-character excerpt comes back. Keep both. Note it for the next compaction.
shared_sources A stored note already cites one of the new note’s source URLs. The agent re-read a page it had already read. Worth fixing in the next run’s plan.

All three empty means the note is clean and new.

Separately, data.compaction_suggested turns true once a domain holds more than 8 notes. It appears on both recall and save. It is a report, not an instruction: agents are told to surface it and leave the merge to you.

Recall adds overlap_pairs: the pairs of stored notes already within 0.30 cosine distance of each other, computed over the 20 newest notes. That is the list a compaction request should be built from.

Compaction

outreach_compact_prospect_context writes one merged dossier and supersedes the notes it replaces. The survivor inherits the union of every source URL and the earliest observed_at of its sources.

Superseded notes are archived, not deleted. They keep a pointer to the note that replaced them, so a bad merge is recoverable.

The tool takes expected_note_count — the note_count from the recall the merge was based on. If someone saved a note in between, the count no longer matches and the merge aborts instead of swallowing that note.

Limits

Limit Value
Note body 10 KB. Larger is rejected.
Note title Collapsed to one line and trimmed to 120 characters.
Source URLs At least one, at most 20. Each must be an http or https URL string under 2 KB.
observed_at Required by the save tool and never defaulted. Set it to when the fact was true, since that is what staleness measures.
Notes saved per day 200 per account. Past that the save tool returns an error until the next day.
Notes per domain 50. Past that saving is rejected; compaction still works and is the way back under it.
Stale after 30 days
Compaction suggested after More than 8 notes on one domain
Recall payload 100 KB. Above it, notes are ranked semantically instead of returned whole and truncated comes back true.

Recall needs the outreach_read scope. Saving and compacting need outreach_write and Outreach module admin. All of it needs the Outreach add-on and an active subscription.

Where Notes Appear in Kit

The prospect page shows the three newest notes for that company by observation date, with a View all link to the full list.

The list is read plus delete. Deleting removes the note from the dossier and from every future recall. There is no way to write or edit a note from the browser — the tools are the only write path.

What This Is Not

  • Not a CRM. It stores research about a company, not contacts, deals, or a pipeline.
  • Not general agent memory. It is keyed by company domain and reachable only through the four outreach tools. It will not hold arbitrary notes, task state, or conversation history.
  • Not shared between accounts. Every query is fenced to the connected account. No note ever crosses a tenant boundary, and nothing is pooled or aggregated across customers.
  • Not a send path. Nothing on this page emails anyone. Sending stays human-in-the-loop through the normal message review flow.

Next Steps

Tapez pour rechercher...