Reference

Tool Reference

Every tool the Cogni server exposes, what it takes, and what it gives back.

45 tools · Last updated: August 17, 2026

Group

Core memory

Storing facts and getting them back. If you only ever learn two tools, learn these.

remember

Remember a fact All plans Counts as a write

Stores a fact, note, or observation in long-term memory — a preference, a person, a decision, a deadline, or anything worth keeping across conversations.

Naming the people, projects or identifiers a fact is about (via entities) strengthens the cross-document connections that recall can later follow. If the fact clearly connects to something already stored, remember_connected is the better choice.

Health and safety facts — an allergy, a medication, an emergency contact — are automatically treated as high importance and marked protected, so they are never auto-evicted, whatever importance was passed.

This is the only tool that consumes your write quota, alongside remember_connected. It is subject to the target store's monthly write quota and memory cap.

ParameterTypeDefaultWhat it does
text
required
str—The fact to store, as text.
importance
optional
str | float | NoneNoneA salience band — "high" (a deadline, a key person, a stated preference), "medium" (the default), "low" (disposable chitchat) — or a raw numeric multiplier. It drives what gets kept long term; it does not change recall ranking.
entities
optional
list[str] | NoneNoneNames of the people, projects or identifiers the fact is about. These become entity-graph edges that spreading recall can traverse. They are connections, not a retrieval key — recall still ranks by similarity to the query, so asking for an exact tag does not guarantee the memories carrying it come back. Use list_by_entity to pull back every memory sharing a tag.
affect
optional
str | NoneNoneA passive sentiment tag (e.g. "frustrated", "delighted") describing how you feel about this. It is stored and shown back on recall as context, but never used to rank results. Best left unset unless the emotional reaction is itself worth remembering.
space
optional
str | NoneNoneA shared team space to write into instead of your private memory. Requires a write role in that space — a viewer is read-only.
Returns

Whether the memory was stored (it is false, with a reason, when the text was rejected as a near-duplicate of something already held), the substrate node id, the durable mem_id handle you can pass to other tools, the entities that were indexed, and the space_id written to. If a retention sweep archived anything just before the write, an archived list is included too.

remember_connected

Remember a connected fact All plans Counts as a write

Stores a fact that connects to things already in memory, and wires it into them.

Use it when a fact relates to an existing person, project or decision — someone's allergy that matters for a project's event, a decision that shifts a deadline. The text should be a self-contained sentence that names what it connects to, for example “Alex Rivera is allergic to shellfish (relevant to the Meridian team dinner)”, with those names also passed as entities. Those names become precise connections, so a later question about any one of them can surface this fact even when the wording shares no keywords.

That naming is what does the work, and it is identical to calling remember with entities.

It counts as one write, exactly like remember; the internal lookup it does is free.

ParameterTypeDefaultWhat it does
text
required
str—The fact to store. Should be a self-contained sentence naming what it connects to.
importance
optional
str | float | NoneNoneSalience band or raw multiplier; behaves exactly as in remember.
entities
optional
list[str] | NoneNoneNames of the related people, projects or decisions. These become the precise connections.
space
optional
str | NoneNoneA team space to write into instead of your private memory. Requires a write role.
Returns

The same fields as remember (stored, id, mem_id, entities, space_id), plus connected_to — the related memories that were linked, each with its mem_id, text, score and folded entities — and folded_entities. Both of those last two are empty unless the server-side auto-link is switched on.

recall

Recall memories All plans · always free

Retrieves memories relevant to a question — people, projects, decisions, preferences, deadlines, earlier conversations. It is read-only, safe to call constantly, and never billed or counted against a quota on any plan.

By default it searches your active memory and every shared team space you can read, returning merged results each tagged with the space it came from; spaces_searched reports which stores were actually consulted. Pass space to narrow it — one space id, or a list of them to search just those.

Narrowing is worth doing when you know where the answer lives. Results are merged with a shared k across every space searched, so each extra space costs the relevant one depth: with many spaces you get each store's top hit or two rather than the best k from the store that actually knows. If a first recall shows the answer coming from one space, asking again scoped to that space returns more of its chain. Naming a space you cannot read is an error, never a quietly partial answer.

The default mode of auto runs a genuine dense-vector search plus the cross-document, multi-hop hits from entity-graph spreading — so the plain vector search you would have had is still running underneath, and you additionally get facts about related things that share no words with your query. auto returns at most k rows: the two channels are interleaved by rank and the response is capped, so a spreading hit is never simply appended past your budget. The other modes narrow the mix rather than the size: spreading returns only the entity-graph hits, each reporting its hop distance from the direct match; rag is a plain dense similarity search; flat is the bare substrate similarity.

Each returned memory carries when it was stored, which retrieval path found it, and — for a spreading hit — how many hops away it was and which entities connected it. Memories stored with a salience also report their importance band. The response as a whole carries a confidence band and, when nothing relevant is stored or only weak matches turn up, a notice saying so rather than letting the model invent an answer.

Time-filtered recall composes with everything else. Passing as_of or between scopes the search to a window without giving up the connection graph, so “what did we know about this in March, and what was it connected to?” is a single call. The window decides which memories come back, not which connections may be followed — a fact stored last week is still reachable through an entity first mentioned a year ago. It is applied before ranking, across the whole store rather than over a similarity prefix.

ParameterTypeDefaultWhat it does
query
required
str—The text to search memory with.
k
optional
int | NoneNone (server default 8)How many memories to return.
mode
optional
str | NoneNone (server default auto)Retrieval strategy: auto, spreading, rag or flat.
as_of
optional
str | NoneNoneAn ISO-8601 instant (e.g. 2026-06-01T00:00:00Z). Returns only memories known as of that moment.
between
optional
list[str] | NoneNoneTwo ISO-8601 timestamps, start and end, restricting recall to that window.
space
optional
str | list[str] | NoneNone (active space plus every readable team space)Narrow the search: one space id, or a list of them. Every id must be one you belong to — naming one you cannot read fails the whole call rather than returning a partial answer.
depth
optional
int | NoneNone (process default 2)How many entity-graph hops spreading follows. Larger for “how are X and Y connected” questions, smaller for a quick single-fact lookup. Clamped to 1–5 and echoed back.
supersede
optional
bool | NoneNone (follows your account setting, which is off by default)Hides recalled memories that a newer near-duplicate has corrected, so only the current version of a changed fact surfaces — a moved deadline, a new address. Pass false to see every version. Safety and high-importance facts are never hidden.
Returns

The query, the effective mode and k, and results — each with id, text, score, source (rag, spreading, semantic or flat), space_id, created_at, and where applicable hop, entities, band, importance and affect. A row that both the vector search and the connection graph found independently also carries also_spreading, with that connection's hop and entities alongside its direct score — two retrieval paths agreeing is the strongest signal in the response. Plus memories_found, a confidence band (high, moderate, low or none) with its raw similarity, channels (how many results came from each retrieval path, including rag_and_spreading for the corroborated rows), spaces_searched, the effective depth when spreading ran, and a notice string when nothing was found or only weak matches surfaced.

Group

Memory management

Inspecting, correcting, deleting and moving your memories. Deleting works on every plan — removing your own data is never gated. The rest of this group requires Pro or above on the store being acted on.

list_memories

Browse memories Pro and above

Browses your stored memories, oldest first, a page at a time — the way to actually see what Cogni is holding on you.

Each record comes with its durable mem_id, which is the handle you pass to get_memory, forget or update_memory. Records also carry how often and when recall last surfaced them; these survive a restart, but treat them as advisory usage hints rather than an exact audit trail, because they are a lower bound — a memory reached only through the connection graph does not always bump the count. The creation time is the durable recency anchor.

ParameterTypeDefaultWhat it does
limit
optional
int50How many memories per page. Clamped to 1–500.
cursor
optional
str | NoneNoneThe mem_id to resume after — pass the next_cursor from the previous page.
space
optional
str | NoneNoneA team space to browse. Requires read membership.
Returns

A page of memories, oldest first, each with mem_id, text, entities, created_at, and importance, band, protected and affect where set, alongside the access count and last-accessed time (these survive a restart, but are a lower bound — advisory, not audit). Plus count (total live memories) and next_cursor, which is null on the last page.

list_by_entity

List memories about a subject Pro and above

Lists every memory that mentions a particular person, place or project — the exhaustive “what do you have about X” browse.

Recall is a relevance search: it returns the best few matches. This returns all of them, paginated, which matters as a store grows — a memory that never scores well against any particular question can otherwise become effectively unreachable. Use it for auditing, or for reviewing everything on one topic.

Matching is on the indexed names, not on the memory text, and it expands across name parts in both directions: asking for “Ian” also returns memories filed under “Ian Hamilton”, and vice versa. The names actually matched come back as matched_entities, so you can see whether the answer is broader than you asked for. An empty result means no indexed name matched — which is not quite the same as Cogni knowing nothing about the subject, so it is worth trying recall too.

Archived memories are not included, and browsing does not count as revisiting a memory — so an audit sweep never changes what retention decides to keep.

ParameterTypeDefaultWhat it does
entity
required
str—The name to look up. Case and punctuation do not matter.
limit
optional
int50How many memories per page. Clamped to 1–500.
offset
optional
int0Where to resume — pass the next_offset from the previous page.
space
optional
str | NoneNoneA team space to browse. Requires write membership, because an exhaustive listing can reproduce a whole shared store.
Returns

The normalised entity, the matched_entities it resolved to, the total count, the current offset, a next_offset (null on the last page), and a page of memories in the same shape list_memories returns.

get_memory

Get a memory Pro and above

Fetches one memory's full record by its mem_id.

Like list_memories, it includes access count and last-accessed time. These survive a restart and are a lower bound — advisory rather than audit, though a high count is the real signal the retention policy uses to decide what to keep.

ParameterTypeDefaultWhat it does
mem_id
required
str—The durable handle, as returned by remember or list_memories.
space
optional
str | NoneNoneA team space to read from. Requires read membership.
Returns

The full record — mem_id, text, entities, created_at, importance, band, protected and affect where set, access count and last accessed. If there is no such live memory it reports found: false rather than erroring.

forget

Delete a memory All plans Destructive

Deletes a memory by its mem_id. Available on every plan — removing your own data is never gated behind an upgrade.

In your private memory, deleting an ordinary memory cannot be undone. The memory is pruned from every index, including the entity graph, so it is no longer returned by recall in any mode, no longer appears in an export, and no longer acts as a connection between your other memories. The deletion is recorded durably, so it stays deleted across restarts.

In a team space, deletion is reversible. Shared memory is not permanently destroyed by a single member: a team-space forget soft-archives the memory instead, returning reversible: true, and any member can bring it back for free with restore_memory. This is the counterpart of deletion being free — nobody, and no assistant tidying up on their behalf, can quietly erase the team's shared knowledge. A protected memory is refused outright for a member, reporting forgotten: false with a reason naming which rule applied — safety (an allergy or medication, the memories the system marks undeletable), protected (an explicit flag) or high-importance.

The space owner can remove a protected memory from their own space. It is still only archived, so any member brings it back for free and a team-space delete can never be made permanent — the reply says so, with overridden_by: "space-owner" alongside the tier that was overridden. The route exists so that a team whose ordinary work vocabulary overlaps with health and safety language is not left holding notes it can never tidy up. Rewriting a protected memory with update_memory stays refused for everyone, owner included — a rewritten safety fact reads as current and authoritative, where an archived one is visibly absent.

In your own memory, a safety-critical memory is archived first. You can delete it — it is your data, and the protection exists to stop the system quietly retiring a safety fact that simply has not come up in a long time, not to overrule you. But the first forget archives it rather than erasing it: it stops being recalled and returns reversible: true, and restore_memory brings it back. Erasing it for good takes a second call with permanent: true. This tool is normally invoked by an assistant rather than by you directly, so the first delete is made undoable in case it was not something you asked for — and a repeated identical call will not complete the erase.

What private deletion does not do. Memories are held in an append-only log, so deleting one records the deletion rather than overwriting the original entry in place. That entry is cleared the next time the store's log is compacted — a routine maintenance rewrite that keeps the live entries and drops the deleted ones — and a copy remains in any backup snapshot taken before you deleted it until those age out. Nothing in the service reads those entries back — a deleted memory is genuinely unreachable from the moment you delete it — but it is not physically erased at that instant. The Privacy Policy covers this in full.

Finding the handle. Every remember call returns the mem_id of what it just stored, so your assistant can delete something it stored earlier in the same conversation. Looking up the handle for an older memory means browsing with list_memories, which is a Pro tool.

Calling it twice is harmless: an unknown id simply reports forgotten: false. Deleting from a team space requires a write role there.

ParameterTypeDefaultWhat it does
mem_id
required
str—The handle of the memory to delete.
space
optional
str | NoneNoneA team space to delete from. Requires a write role.
permanent
optional
boolfalseCompletes the erase of a safety-critical memory that is already archived. No effect on a live memory (always archived first) or on an ordinary one.
Returns

forgotten — false if there was no such live memory — and the mem_id.

update_memory

Replace a memory Pro and above Destructive

Replaces a memory's text — the way to correct a fact that has changed.

This replaces the old memory. It is a delete followed by a fresh store, so the replacement gets a new mem_id. In your private memory the original text is not recoverable; in a team space the replaced version is soft-archived and can be brought back with restore_memory, and a teammate's safety fact cannot be overwritten (it reports updated: false, protected).

One safety behaviour worth knowing: if the new text is rejected as a near-duplicate of some other existing memory, the update is refused and the original is deliberately left intact rather than deleted.

ParameterTypeDefaultWhat it does
mem_id
required
str—The handle of the memory being replaced.
text
required
str—The new text to store in its place.
importance
optional
str | float | NoneNoneSalience band or raw multiplier for the replacement memory.
entities
optional
list[str] | NoneNoneEntity names to index the replacement under.
affect
optional
str | NoneNonePassive sentiment tag on the new memory; never used to rank recall.
space
optional
str | NoneNoneA team space to update in. Requires a write role.
Returns

Whether the update succeeded and the new mem_id. It reports updated: false with a reason when the id does not exist, or when the new text was near-duplicate-rejected.

export_memories

Export memories Pro and above

Produces a portable JSON snapshot of your memories — your data, in a form you can keep.

The snapshot covers the live set only; deleted memories are never included. Feed the memories list back into import_memories to restore or copy them elsewhere.

ParameterTypeDefaultWhat it does
space
optional
str | NoneNoneA team space to export. Requires a write role — one call returns the whole store, so a viewer is limited to ordinary recall.
Returns

A version number, a count, and memories — the live records, each with mem_id, text, entities, created_at and salience metadata.

import_memories

Import memories Pro and above

Adds memories from an export_memories snapshot.

The default merge mode mints fresh ids and skips near-duplicates, which makes it safe to run against any target. The restore mode preserves the original ids and timestamps, and for that reason is allowed only into your own private memory — attempting it against a team space is an error.

An import is metered like any other write: it is refused up front if it would take the target store past its memory cap or monthly write quota, and each memory actually stored counts once (a skipped near-duplicate does not).

ParameterTypeDefaultWhat it does
memories
required
list[dict]—The memories list from an export snapshot.
mode
optional
str"merge"merge mints fresh ids and skips near-duplicates; restore preserves original ids and timestamps and is private-space only. Any other value is rejected.
space
optional
str | NoneNoneA team space to import into, in merge mode only. Requires a write role.
Returns

How many memories were imported, how many were skipped — skips being empty text, an id that already exists live or archived, or a near-duplicate — and how many were rejected. A rejected row is one the snapshot could not be read from, such as an unparseable timestamp; it is dropped on its own rather than failing the whole import, so one bad row never costs you the rest of a backup.

Group

Memory curation

Tidying a store that has grown large: compressing repeated facts, finding duplicates, and reversibly retiring what you no longer need.

consolidate

Consolidate memories Effectively Pro and above

Compresses recurring memories into stable generalisations.

It groups memories that keep saying the same thing and represents each group as a single row in recall, tagged source: "semantic", which survives the eviction of any individual memory in the group. The text you see on such a row is a representative example — the most recent memory in the group, word for word — rather than a written summary; Cogni runs no language model on the server, so there is nothing to compose one. It carries no memory id (there is no single record to revise — correct the underlying memories instead) and no timestamp. A pass also runs automatically, roughly every 200 saved memories and whenever your store is loaded from disk, so calling it yourself is optional. It rewrites nothing you stored and creates no new billable memory.

This tool has no explicit plan check, but it only does anything when the consolidation feature is switched on, and that feature is restricted to Pro and above. On a Free plan it returns enabled: false and does nothing. Consolidating a team space requires a write role there.

ParameterTypeDefaultWhat it does
n_samples
optional
int | NoneNone (falls back to the service default of 400)Bounds how many recent memories the pass samples. Hard-clamped to 10,000. There is no documented recommended value — leaving it unset uses the service default.
space
optional
str | NoneNoneA team space to consolidate. Requires a write role.
Returns

enabled: false when the consolidation feature is off. Otherwise enabled: true together with the statistics from the consolidation pass.

consolidate_review

Review duplicate memories Pro and above

Returns clusters of near-duplicate memories, so you and your assistant can walk through and tidy them.

The intended flow: for each cluster, write one merged summary with remember, then archive_memory each source in it — which is reversible via restore_memory. The review tool itself changes nothing at all. Protected, safety-critical and high-importance memories are excluded entirely and are never offered as candidates.

It is gated to Pro because it reveals memory content in bulk, in the same way list_memories does. For the same reason, using it against a team space requires a write role.

ParameterTypeDefaultWhat it does
min_similarity
optional
float0.5How alike memories must be to cluster together. Must be greater than 0 and no more than 1; out-of-range values are an error.
max_samples
optional
int500How many of the most recent live memories to scan. Clamped to 2,000.
space
optional
str | NoneNoneA team space to review. Requires read membership.
Returns

clusters — each a list of two or more {mem_id, text} entries. Nothing is mutated.

archive_memory

Archive a memory Pro and above Destructive

Soft-archives one memory: removes it from recall, but keeps it.

This removes the memory from every recall path — your assistant will no longer find it. It is not a hard delete, though: the record is retained and can be brought back with restore_memory.

This is the reversible way to retire a source after merging a cluster during a consolidate_review walkthrough, or to retire a memory that has since been superseded.

Three tiers of memory are guarded, and a refusal says which one applied. safety means the deterministic safety floor caught it — an allergy, a medication, that class of fact. protected means it carries an explicit undeletable flag. high-importance means only that it was stored with a high salience band. The reply also carries overridable, so you can tell whether there is anything else to try.

Setting force retires a high-importance memory and nothing else. Safety and explicitly protected memories are refused whatever you pass: that tier exists precisely so that a tool argument cannot clear it. To retire one of those, correct it in place with update_memory, or ask the person whose memory it is.

ParameterTypeDefaultWhat it does
mem_id
required
str—The handle of the memory to soft-archive.
space
optional
str | NoneNoneA team space to archive in. Requires a write role.
force
optional
boolfalseRetire a memory held back only by a high importance band. Has no effect on the safety or protected tiers. The archive stays reversible either way.
Returns

archived and the mem_id. When refused it also carries a reason — no such live memory, safety, protected or high-importance — and overridable, which says whether force would change the answer.

restore_memory

Restore a memory Pro and above

Brings one archived memory back into active recall — the per-memory undo for archive_memory, for a reversible team-space delete, and for anything retention archived automatically.

The memory comes back under the same mem_id, with its original text, band, protected flag and creation time, so recall reaches it again and it survives a restart. It quietly does nothing for an unknown or not-archived id, or if the text now duplicates a live memory.

Undoing a team delete is free. When you bring back a memory a teammate deleted or replaced in a shared space, this works on every plan — it is the counterpart of deletion being free, so a team is never left able to delete but not recover. The Pro requirement applies only to restoring what the Free-tier retention window archived automatically, which is the keep-my-older-memories upgrade.

ParameterTypeDefaultWhat it does
mem_id
required
str—The handle of the archived memory to reactivate.
space
optional
str | NoneNoneA team space to restore in. Requires a write role.
Returns

Whether the memory was restored. restored: false for an unknown or not-archived id, or when the text now duplicates a live memory.

Group

Retention

Retention only ever runs when a Free store is already full. When a new memory arrives at a store sitting at its memory cap, memories left untouched for longer than the retention window are soft-archived first — removed from recall, but kept and restorable — so the write has room. Below the cap, nothing is archived however old it gets, and paid plans keep everything. These two tools let you see and undo that.

retention_status

Retention status All plans · free to call

Shows how retention is configured for your store, and how much of it would be archived if the store filled up right now.

Read the eligible count as a forecast, not as something in progress: it is how many memories a sweep would archive, and a sweep only happens when a write arrives at a store already at its memory cap. A store below its cap archives nothing, whatever the numbers here say.

The idea behind retention is that a busy store bounds its own size without losing what you actually use — a memory you keep touching is never a candidate. Safety facts are marked protected and are never archived.

ParameterTypeDefaultWhat it does
space
optional
str | NoneNoneA team space to report on. Requires read membership.
Returns

Whether retention is enabled, the window in days (null on paid plans, meaning keep forever), how many memories are live, how many are archived, how many are protected, how many would be archived if a sweep ran right now, and the oldest idle age.

restore_archived

Restore archived memories Pro and above

Brings back every memory that retention soft-archived — the bulk undo for the Free-tier retention window.

This is the intended recovery path after upgrading: Pro keeps everything indefinitely, so upgrading and then calling this recovers a churn-heavy Free store's aged-out memories in one go. For a single memory, use restore_memory instead.

ParameterTypeDefaultWhat it does
space
optional
str | NoneNoneA team space to restore in. Requires a write role.
Returns

restored — how many archived memories were brought back — and skipped, those whose text now duplicates a live memory.

Group

Time & effort

Language models have no clock and no sense of how long their own work takes — they guess durations from human-speed text and are wildly wrong for an agent. These tools give an assistant a real clock and a record of its own measured history to estimate from. Every one of them is free and unmetered on all plans.

clock_now

Current date and time All plans

The current date and time, so your assistant can reason about when, not just what.

A model has no internal clock, so this is what it needs whenever an answer depends on the current time or an elapsed interval — a memory's age, how long since your last session, a deadline, a duration.

ParameterTypeDefaultWhat it does
tz
optional
str | NoneNoneAn IANA timezone name, e.g. America/New_York. When given, the local time there is returned as well. An unknown name is an error.
Returns

UTC as ISO-8601, unix seconds, and the weekday; plus a local block with timezone, time and weekday when a timezone was passed. Returns enabled: false if the operator has disabled the clock tool server-wide.

estimate_effort

Estimate task effort All plans

Estimates how long a task will take, grounded in what tasks of that type have actually taken before.

Once durations for a task type have been recorded, this returns the empirical median instead of a guess, with confidence that grows as the sample grows, and a summary of the full observed spread for reasoning about the tail. A model's own guess can be passed in, but it is used only as a fallback when there is no history at all.

ParameterTypeDefaultWhat it does
task_type
required
str—The repeatable task label whose history grounds the estimate.
llm_estimate_seconds
optional
float | NoneNoneThe model's own guessed duration, used only when there is no recorded history.
space
optional
str | NoneNoneA team space whose shared history to read — “how long does this take our team”. Requires membership.
Returns

The task type, the estimated seconds, the source of that number (empirical, llm or unknown), a confidence level, the sample count, the passed-through guess, and a summary of the observed spread — mean, p95, min and max — which is null until there is history.

record_effort

Record task effort All plans

Logs that a task of a given type actually took a given number of seconds.

This is what grounds future estimates in measured reality. Call it after finishing a task whose duration you can attribute to a repeatable type — or use effort_start and effort_stop to have the server do the measuring instead. It does not consume the memory write quota.

ParameterTypeDefaultWhat it does
task_type
required
str—The repeatable task label to log this duration under.
seconds
required
float—How long the task actually took. Must be zero or greater.
notes
optional
str | NoneNoneQualitative context recorded alongside the duration — complexity, scope.
space
optional
str | NoneNoneA team space whose shared history to log into. Requires a write role.
Returns

What was recorded (the task type and seconds), and the updated calibrated estimate — seconds, source, confidence and sample count.

effort_start

Start an effort timer All plans

Starts measuring how long a task takes — the server stamps the start time and hands back a correlation id.

Called right before beginning a repeatable task, then paired with effort_stop when it finishes, this means the server computes the elapsed time and the model never has to guess a duration it cannot perceive. Open timers are persisted and survive a restart.

ParameterTypeDefaultWhat it does
task_type
required
str—The repeatable task label this timing will be recorded under.
notes
optional
str | NoneNoneQualitative context captured with the timer — complexity, scope.
space
optional
str | NoneNoneA team space to time against. Requires a write role.
Returns

The correlation_id to pass to effort_stop or check_timeout, the task type, and the server-stamped start time.

effort_stop

Stop an effort timer All plans

Stops a running timer and records its measured duration.

The result feeds straight into future estimate_effort calls. The space, if one was used, must match where the timer was started.

ParameterTypeDefaultWhat it does
correlation_id
required
str—The id returned by effort_start for the task to close.
notes
optional
str | NoneNoneQualitative context recorded with the completed measurement.
space
optional
str | NoneNoneThe team space the timer was started in. Must match, and requires a write role.
Returns

What was recorded — correlation id, task type and measured seconds — and the updated calibrated estimate. An unknown or already-stopped id is an error.

effort_active

List open effort timers All plans

Lists tasks that were started but never stopped, with how long each has been open — how you find a forgotten timer or a still-running task.

ParameterTypeDefaultWhat it does
space
optional
str | NoneNoneA team space whose open timers to list. Requires membership.
Returns

active — one entry per unstopped timer, with correlation id, task type, start time, idle seconds and notes. Empty when nothing is open.

compare_effort

Compare plan effort All plans

Ranks candidate approaches by how long they will actually take, fastest first — so an agent picks the genuinely faster plan, not the one that merely looks faster.

Every step in every plan is calibrated against recorded history, with the model's own guess as a fallback. A step is only treated as unknown when it has neither — no recorded history and no supplied guess; a plan containing one of those is flagged incomplete and is not recommended.

The consequence is worth watching: a plan whose steps are all guesses is still marked complete and can still win the comparison, because a guess counts as an estimate. Check each plan's coverage figure — the fraction of its steps backed by real recorded history — before trusting a recommendation. A winner at zero coverage is the model ranking its own guesses.

ParameterTypeDefaultWhat it does
plans
required
list[dict]—The candidate plans. Each is {"name": str, "steps": [{"task_type": str, "llm_estimate_seconds": float | null}, ...]}.
space
optional
str | NoneNoneA team space whose shared history to compare against. Requires membership.
Returns

The recommendation (the winning plan's name), savings_seconds, and every plan with its total seconds, coverage (what fraction of its steps are backed by real history), whether it is complete, and per-step estimates.

savings_seconds is the spread between the slowest and the fastest complete plan — not the margin over the runner-up. With two plans those are the same number. With three or more it is the cost of the worst option you rejected, so it overstates what the decision actually saved you; compare the plans' own total_seconds for that.

list_task_types

List task types All plans

Lists the task-type labels that have recorded history — the exact strings the estimate and compare tools can ground against.

Useful for discovering the label a duration was recorded under before estimating with it, since the labels are free text and must match.

ParameterTypeDefaultWhat it does
space
optional
str | NoneNoneA team space whose labels to list. Requires membership.
Returns

task_types — the distinct effort task-type labels that have logged history.

recommend_timeout

Recommend a timeout All plans

Suggests a timeout in seconds for a repeatable task, derived from its recorded history rather than a guess.

The number is a chosen percentile of past durations (p95 by default) multiplied by a safety margin. It is a heuristic on the observed tail, not a guarantee — and with only a couple of recorded runs, confidence is low. With no history at all it returns null seconds and a note explaining why.

ParameterTypeDefaultWhat it does
task_type
required
str—The repeatable task label whose logged durations to derive a timeout from.
percentile
optional
float0.95Which percentile of past durations to base the timeout on. Must be greater than 0 and no more than 1.
safety_margin
optional
float1.5The multiplier applied to that percentile duration. Must be finite and at least 1.0.
space
optional
str | NoneNoneA team space whose shared history to read. Requires membership.
Returns

The task type, the recommended seconds (null with no history), the percentile used and its raw duration, the safety margin, a confidence level, the sample count, and a note explaining a null. An out-of-range percentile or safety margin is an error.

check_timeout

Check a task's timeout All plans

Checks whether a currently running task is overrunning, by comparing how long it has been going against the recommended timeout for its type.

It applies to a task started with effort_start and not yet stopped, identified by its correlation id.

ParameterTypeDefaultWhat it does
correlation_id
required
str—The id returned by effort_start for the running task.
percentile
optional
float0.95Percentile used for the underlying timeout recommendation. Must be greater than 0 and no more than 1.
safety_margin
optional
float1.5Safety multiplier used for the underlying recommendation. Must be at least 1.0.
space
optional
str | NoneNoneThe team space the timer was started in. Requires read membership.
Returns

Whether the task was found; if so, whether it is at_risk (true once elapsed time reaches the recommended timeout), the elapsed seconds, how far over it is, what fraction of the budget is used, and the recommended timeout. If the id was never started or is already stopped it reports found: false with a reason.

stats_all

All effort estimates All plans

The calibrated estimate for every task type with recorded history, in a single call.

It saves looping list_task_types and then estimate_effort for each label — useful for a summary of what an agent has learned about its own pace.

ParameterTypeDefaultWhat it does
space
optional
str | NoneNoneA team space whose shared history to read. Requires membership.
Returns

task_types — one entry per recorded label, each with the empirical median seconds, confidence, sample count, and a summary of mean, p95, min and max. Empty when nothing has been recorded.

Group

Health & status

memory_status

Memory status All plans · free to call

An aggregate health snapshot of your memory store — how much is in there, and how close you are to your limits.

It returns no memory contents at all, only counts and configuration, which is why it is free on every plan. This is the tool to ask for when you want to know whether you're near the memory cap or this month's write quota.

ParameterTypeDefaultWhat it does
space
optional
str | NoneNoneA team space to report on. Requires read membership.
Returns

A plan block — name, status, memory cap used, limit and archived count, monthly writes used and limit, retention days — and a store block: total memories with the episodic and semantic split, entity-graph size, retention-tier breakdown, on-disk size, which cognitive features are enabled, and a bounded access and importance rollup. Returns enabled: false if the operator has disabled it server-wide.

get_diagnostics

Recent request diagnostics All plans · free to call

Your own recent Cogni requests and how long each one took — for troubleshooting, and for attaching to a bug report when something felt slow or failed.

Each entry says which tool ran, when, how many milliseconds it took, and whether it succeeded. The interesting part is where the time went: build_ms is your memory being rebuilt from scratch, wait_ms is time queued behind another rebuild of the same store, and replayed is how many memories that rebuild had to re-read. A slow call that is mostly build or wait time is a cold start — normal after a deploy or a long idle period. A slow call with neither is worth telling us about.

Metadata only. This records the shape of a request, never its contents: no queries, no memory text, no identifiers taken from them. error_class is an exception type name, never a message. Only your own requests are ever returned, and the log keeps roughly your last 200 calls or 7 days, whichever comes first.

The same information is on your account page at /portal/diagnostics — useful precisely when the connection itself is misbehaving and a tool call cannot get through.

To actually report what you find here, ask your assistant to prepare a report — prepare_report folds these rows into a complete message addressed to support.

ParameterTypeDefaultWhat it does
limit
optional
int20How many recent calls to return.
Returns

calls, newest first — each with at, tool, duration_ms, outcome, error_class, store_id, n_results, cold_builds, build_ms, wait_ms and replayed — plus your account_id and the retention window.

prepare_report

Prepare a bug report or feature request All plans · free to call

Turns “this is broken” into a complete, well-formed report you can send us — with the technical detail already filled in.

Tell your assistant what went wrong, or what you wish Cogni could do, and ask it to prepare a report. It writes up your description and automatically attaches the context we would otherwise have to ask you for: your recent request timings from get_diagnostics, your plan, the exact server build you were talking to, and the Cogni version. What comes back is markdown, ready to paste into an email.

It does not send anything. Preparing the report is all this tool does — nothing is transmitted, nothing is filed, and nothing is stored on our side. Your report reaches us when you email it to support@getcogni.io, which remains our support channel and where a person reads every message. If your assistant tells you an issue has been created, it is mistaken; the tool reports plainly that it sent nothing.

Your description is included verbatim, so please don't paste passwords, API keys, card numbers or anyone else's personal data into it — the same rule that applies to anything you store in Cogni. The attached diagnostics are metadata only: timings and outcomes, never your queries or memory text.

ParameterTypeDefaultWhat it does
kind
required
str—"bug" or "feature".
title
required
str—A one-line subject. Trimmed to 200 characters.
description
required
str—What was expected, what happened, and how to reproduce it. Trimmed to 4,000 characters — and you're told if it was.
include_diagnostics
optional
booltrueAttach your recent request timings. Set false to leave them out.
Returns

The assembled markdown, the send_to address, the normalised kind and title, whether diagnostics were attached/omitted/unavailable and how many rows came with them, what was truncated, and sent, stored and filed — all three always false.

subject_coverage

Subject coverage Pro and above

How much is stored about one subject — counts and spread, with no memory text.

This is the honest answer to “how well do you actually know about X?”. It reports how many memories mention the subject, how many other topics those memories connect to, the oldest and newest, how many are recent, and the importance and retention mix.

It measures breadth held, not correctness. A subject can have forty memories and none of them answer the question you just asked. So it is the right tool for hedging honestly — “that's everything I have on X”, or “I only have one note about this, from a year ago” — and the wrong basis for trusting any particular fact. For that, read what recall actually returned.

The association counts are the interesting part: a subject that appears in ten memories which each connect to other topics is understood far better than one appearing in forty that connect to nothing. Coverage understates when a name was never picked up as an entity in the first place, so a low number is a floor rather than a verdict.

ParameterTypeDefaultWhat it does
subject
required
str—The person, place or project to summarise. Case and punctuation do not matter.
space
optional
str | NoneNoneA team space to report on. Requires read membership.
Returns

The normalised subject, whether it matched, the matched_entities it resolved to, n_memories, the association breadth (n_neighbour_entities and n_linked_memories), oldest, newest and n_recent_90d, the bands and retention_tiers mix, protected_count, store_share, archived_matches (retained but not reachable by recall) and replay_skipped_lines.

Group

Spaces

A space is a memory store. You always have a private one; team spaces are shared, and are provisioned by an operator rather than created from a tool.

list_spaces

List team spaces All plans

Lists the memory spaces you can reach — your private space plus any shared team spaces you belong to, each with your role and whether you can write.

This is how you find the space id to pass to remember or recall. It shows only your own memberships and reveals nothing about other members.

Takes no parameters.

Returns

Your personal_space id, the active_space currently in use, my_spaces (your own separate personal spaces, each flagged if active) and team_spaces — each with its space id, display name, your role in it, and whether you can write.

space_activity

Check for new memories All plans

Tells you whether anything has been written to a space since you last looked — how an assistant notices that a teammate’s assistant added something.

Recall is pull-only, so without this the only way to learn of someone else’s write is to run a full recall again and hope you picked a good moment. This reads the store’s write log directly: no search, no memory contents, and it never loads a store into memory — which is what makes it cheap enough to check often, where repeatedly running recall is not.

How to use it. Call it once with no since to get a cursor, then pass that cursor back on the next call. changed says whether to re-read and changed_spaces says which spaces are worth re-reading. When there is no usable baseline changed is null rather than false — that means “unknown”, so re-read.

By default it covers every space you can read in a single call. It reports only spaces you are a member of.

It answers whether something changed, never what changed — follow up with recall on the spaces it names. Housekeeping that rewrites the log can also move the cursor without anything being added, so an occasional changed that turns up no new memories is expected rather than a fault.
ParameterTypeDefaultWhat it does
space
optional
str | list[str] | NoneNoneOne space, or a list of them. Omitted, it covers every space you can read.
since
optional
str | NoneNoneA cursor from a previous call. Without it you get a cursor but no comparison.
Returns

A cursor to pass back next time, changed and changed_spaces (both null without a baseline), and per-space entries carrying last_write_at — when that space last changed, for telling a person.

create_space

Create a personal space Pro and above

Creates a separate personal memory space — a “work” store kept apart from your everyday one.

The separation is physical, not a filter: each space is its own store, so memories in one genuinely cannot surface from the other. That is the same mechanism team spaces use.

A new space is not searched by default. Unqualified remember and recall keep using whichever space is currently active, so a new one is reached either by naming it or by switching to it with set_active_space. That is deliberate — if new spaces were folded into every search, nothing would actually be kept apart — but it does mean a memory filed in a space you are not in will not turn up until you switch.

The space id is generated for you from the name you give. There is a limit on how many you can have (three on Pro), because each space is a separate store with its own startup cost.

ParameterTypeDefaultWhat it does
name
required
str—A human label for the space, e.g. “Work”.
Returns

The generated space_id, the name, the plan it inherits from you, active (false — creating does not switch), and spaces_used / spaces_limit.

set_active_space

Switch active space Pro and above

Switches which space unqualified remember and recall use — “switch to my work memory”.

The choice persists across sessions until you change it. Omit space to switch back to your main personal memory.

While a personal space is active your main memory is not searched by an unqualified recall, and vice versa — that separation is the point of having spaces at all. Shared team spaces are always searched either way, since those are collaborative by nature.

ParameterTypeDefaultWhat it does
space
optional
str | NoneNoneThe space id to switch to. Omit to return to your main memory.
Returns

The new active_space and your personal_space id.

delete_space

Delete a personal space Pro and above

Permanently deletes one of your own personal spaces and everything in it.

Irreversible. The memories are erased, not archived, and there is no restore. Calling without confirm tells you how many memories would be lost rather than doing anything, so you can check first.

Only a personal space you created can be deleted here — not a shared team space, and not your main memory.

ParameterTypeDefaultWhat it does
space
required
str—The space id to delete.
confirm
optional
boolfalseMust be true to actually delete. Without it you get a count of what is at stake.
Returns

deleted, the space_id, and whether the underlying store_removed.

Group

Account & identity

Cogni keys your memory store on an account, not on a login. Linking two sign-ins — say a Claude login and a ChatGPT login — makes them resolve to the same account, so both read and write the one memory. The last tool here goes the other way: it disconnects the app you are using right now.

whoami

Account identity All plans

A diagnostic: reports which identity this request is authenticated as, and which account its memory store is keyed on.

The distinction matters when you have linked sign-ins. The resolved account id is the store this request actually reaches; the raw sign-in is what you authenticated as. When two sign-ins are linked they report the same account id — running whoami on each is how you confirm that cross-vendor shared memory took effect. It exposes only your own token and account, never anything about other users.

Takes no parameters.

Returns

When authenticated: that you are authenticated, the resolved account keying the store, the raw sign-in principal, any linked identities, your personal space, your team spaces with roles, and the token claims and client id. On a local connection with authentication off, it reports that instead, along with the fallback account id.

logout

Sign out All plans Destructive

Disconnects the app you are talking to right now from your memory. Nothing stored is deleted or changed — reconnecting returns you to the same store.

This disconnects the app; it does not end your sign-in. The app will lose access immediately, but it may be able to reconnect without asking you for credentials again. To stop that, remove the Cogni connector in the app's own settings.

The app's next request gets a 401 and an invitation to reconnect. Because it may be able to reconnect without being asked for credentials again, removing the Cogni connector in the app's own settings is what finishes the job.

On a connection authenticated with an API key there is no sign-in session at all, and it deliberately refuses to block anything. An account may hold many keys and the token does not say which one is calling, so blocking the account would disconnect every other client you have — from a client that could no longer undo it. Instead it points you at list_api_keys and revoke_api_key; removing the key from that app's configuration also stops it being sent.

Takes no parameters.

Returns

signed_out — reporting what actually happened rather than what was attempted, so a failed sign-out never reads as a successful one — the method it took (a sign-in session, an API key, or a local connection with no session to end), workos_session_ended reported separately because it decides something different, and a plain-language message and detail. It returns no session identifier: no session id, token id or expiry.

Group

Settings

Two different things are configurable here, with different defaults. Feature flags are mostly opt-in, and some require a higher plan — the exception is the retention policy, which ships on for every plan, so you turn it off rather than on. The cognitive-overlay toggles — importance, decay and priming — are all off by default. Both tools operate on your personal store only; team-space configuration is not exposed here.

get_settings

Get memory settings All plans

Shows your account's effective memory configuration: which feature flags and cognitive toggles are currently in force, what you have overridden, and what your plan permits you to enable.

Three feature flags can be switched: retention_policy, which is on by default on every plan, supersession, and consolidation on Pro or above. Both of the latter start off. The server also recognises four further names — anti_fabrication_notice, deep_chain_spreading, gist and meta_gist — which it reports but will not let you enable, because doing so would change nothing. The cognitive toggles reported alongside them — use_importance, use_decay and use_priming — are off by default. Read-only — use configure to change anything.

Takes no parameters.

Returns

Your account id and plan, the effective resolved settings, the raw override you have set, available_features (what your plan may enable) and known_features (all seven).

configure

Configure memory All plans · features are plan-gated

Changes your account's memory configuration — turning feature flags on or off, and setting cognitive-overlay options.

Three features can be switched today: retention_policy and supersession on every plan, and consolidation on Pro or above. An unknown flag, or a feature above your plan, is rejected rather than silently ignored — so is a flag the server recognises but does not yet act on, because being told a switch worked when it did nothing is the worse outcome. Changes apply from your next recall.

ParameterTypeDefaultWhat it does
enable
optional
list[str] | NoneNoneFeature flag names to turn on. Rejected if unknown or not allowed on your plan.
disable
optional
list[str] | NoneNoneFeature flag names to turn off. Rejected if unknown.
cognitive
optional
dict | NoneNoneCognitive-overlay toggles and hyperparameters, for example {"use_priming": true, "priming_associative": true}. Documented keys include use_importance, use_decay, use_priming, priming_associative and priming_spread_decay; the accepted set is derived from the server's configuration object, and values are type- and range-checked.
Returns

Your account id, your plan, and the new effective settings. The write is atomic. Unknown flags, wrongly typed cognitive values, or a feature above your plan raise an error.

Group

API keys

Keys are how a terminal or editor reaches the same memory you're signed into elsewhere. Every user can mint keys for their own account on any plan, and all three tools are scoped strictly to your own keys.

create_api_key

Create an API key All plans

Creates a bearer API key for reaching this account's memory from a CLI or editor — Cursor, Claude Code, OpenClaw — the same store you are signed into right now.

The key is shown exactly once. Only a hashed form and a short recognition prefix are stored, so it cannot be displayed again. Save it when your assistant shows it, paste it into the other client's config as the bearer token, and don't repeat it back into a conversation.

The key binds to your resolved account, so if you later link sign-ins, all of that account's keys reach the one shared store. See the Connect guide for where each client wants the key pasted.

ParameterTypeDefaultWhat it does
label
optional
str | NoneNoneA human-readable name for the key, e.g. “Cursor on my laptop”.
Returns

The raw api_key, shown this once only, plus its key_id, recognition prefix, label, creation time, and a reminder to save it now.

list_api_keys

List API keys All plans

Lists this account's API keys — metadata only, never the secret itself.

Use the key_id from here when you want to revoke one. Only your own account's keys are ever shown.

Each key also reports the sign-in it was created under. That is usually the account you are using now — but if you minted a key on one sign-in and later linked that sign-in onto this account, the key shows that earlier sign-in. It still works, and it can still be revoked from here.

Takes no parameters.

Returns

keys — for each: key id, recognition prefix, label, creation and last-used times, whether it is revoked, and the account_id it was created under. The key value itself is never returned.

revoke_api_key

Revoke an API key All plans Destructive

Revokes one of this account's API keys by its id.

The key stops working immediately and cannot be reinstated. Any client configured with it will lose access until you mint a new one.

You can only revoke your own account's keys. An unknown or already-revoked id simply reports revoked: false without erroring. This includes keys minted on any sign-in you have since linked onto this account.

ParameterTypeDefaultWhat it does
key_id
required
str—The id of the key to revoke, from list_api_keys.
Returns

revoked — false for an unknown or already-revoked id, with no error raised — and the key_id.