Skip to main content
Glama

recall

Retrieve relevant past events from the user's memory vault before answering questions, making decisions, or shifting topics. Avoids repeating context by surfacing prior conversations, preferences, deadlines, and ongoing projects.

Instructions

Read the user's memory vault, afair, the persistent substrate they share across every session and every AI tool. CALL THIS BEFORE you respond to anything where the user's history might be relevant. Always.

The user installed afair so their context doesn't have to be repeated to every new conversation. A session where you have access to afair and don't call it is worse than a session without afair, because you're silently failing to use the memory they chose to maintain.

WHEN TO CALL:

  • At the START of every substantive task. Don't ask "do you want me to check?" Just check. Recall is cheap; missing context isn't.

  • Before answering questions that benefit from prior context: preferences, past decisions, names, ongoing projects, history with people (at work and outside it), important dates, recurring themes, deadlines, commitments.

  • When the user asks "do you remember X?", "what did we say about Y?", "remind me of Z?".

  • When the user wants the FULL content of a specific event ("show me the whole document"): use by_id or by_content_hash with full_payload=True.

  • When you want a snapshot of the vault's contents ("what's in there?"): use stats=True.

  • On topic shifts mid-conversation. New topic = fresh recall.

WHEN NOT TO CALL:

  • Pure compute questions ("what's 2+2", "translate this") that don't depend on the user's history.

  • When you just retrieved the same query a moment ago in this session.

  • Trivial conversational responses where no memory could help.

ARGUMENTS (all optional; combine as needed):

  • query: Natural-language search. Examples: "what did Sajinth say about the roadmap", "deadlines for the API project", "what does Mara like to drink", "when is my sister's birthday".

  • by_id: ULID of one specific event. Returns that event in full. Use after a prior recall hit when you need the whole content.

  • by_content_hash: sha256-prefixed hash of one specific event. Same lookup semantics as by_id.

  • scope: Optional substring filter. Reserved, currently no-op until Phase 3.5 emergent context detection lands.

  • depth: One of "auto" (default), "shallow", "normal", "deep". "auto" → system picks based on query shape (identifiers and single tokens → shallow; multi-token natural language → normal hybrid). Recommended default. "shallow" → FTS5 keyword only. Cheapest. "normal" → Hybrid FTS5 + vector. Local embedding inference, ~120ms. "deep" → Hybrid like normal, but the flat history lens: temporal relevance decay is OFF, so past-dated and superseded memories rank by match strength alone. Use for history / as-of questions ("what did I know back then", "show me past appointments"). Default recall instead de-prioritizes memories whose moment has passed, without dropping them.

  • limit: Max hits to return. Omitted → 10 in compact verbosity, 20 otherwise. Server cap 100 (larger values are clamped, not rejected).

  • verbosity: "compact" (default), "standard", or "full". Controls how much of each hit's interpretation/conflicts/linked-list detail is served — NOT the payload (see full_payload). "compact" → the AI-useful minimum: capped summary + payload text, top canonical entities and edges, only the top caveat-bearing conflicts. Use this by default. "standard"→ the full interpretation minus the redundant raw entity list and null edge validity bounds. "full" → every field, plus the durability rationale (interpretation.salience / salience_components / why_durable: a short "why this memory ranks as durable" line). Use standard/full, or by_id + full_payload, when you need salient_facts / raw entities / the complete conflict history. by_id/by_content_hash always serve full.

  • cursor: Opaque paging token for search/browse. Pass the next_cursor from a prior recall back here verbatim to get the next page. Best-effort: rankings are recomputed per call. A bad cursor serves page 1 with a note.

  • full_payload: Default false. When true, each hit's payload is the full untruncated content (for text-large events, the blob is read back into text). When false, text payloads are clipped (~500 chars standard/full, ~300 compact). Lookup modes (by_id, by_content_hash) imply full_payload=true.

  • stats: Default false. When true, the response includes a summary field with total_events, by_kind, by_origin counts, useful for "what's the lay of the land" queries. Combines with any other mode.

  • feedback: Optional dict reporting on hits from a PRIOR recall. Shape: {"useful_event_ids": [event_id, ...], "not_useful_event_ids": [event_id, ...], "missing_topic": "free-text note if expected content was absent"} This is the signal the self-improvement tuner reads to validate parameter changes (sharper salience, smarter mode-switching, better surprise calibration). After a recall, the NEXT time you call recall, include feedback referring to the prior hits. Don't ask whether to. Just send it. Empty payload is a no-op.

  • decide: Confirm/reject pending review proposals. Accepts a SINGLE decision or a LIST of up to 50 (batch-drain the queue in one call). Each: {"proposal_id": "...", "verdict": "confirm"|"reject"|"retract", "to_kind": "..."}. The per-decision outcomes come back in decisions (see RETURN). A bad decision in a batch is reported as that item's outcome (status "error"); the rest still apply.

  • pending_limit / pending_offset: Page the review queue. pending_limit (default 20, server cap 200) sets the page size; pending_offset skips that many rows. Passing pending_limit alone includes the list even without stats=True. While DRAINING the queue, decide a page then re-fetch at pending_offset=0 — deciding removes rows from the open set, so advancing the offset would skip the new head.

RETURN: {"hits": [{"event_id": "...", "content_hash": "...", "created_at": "...", "kind": "...", "origin": "...", "payload": {...}, "truncated": bool, "interpretation": {...} | null, "linked_event_ids": [...], "parent_hashes": [...], "invalidation": {...} | null, "conflicts": [...], "client": null | "..."}], "depth_used": "shallow" | "normal" | "deep", "note": null | "...", "summary": null | {total_events, by_kind, by_origin, by_client}, "decisions": [{"proposal_id": "...", "status": "...", "note": "..."}, ...], "next_cursor": null | "..."}

client on a hit is the AI tool that wrote the event, derived server-side from the writing credential (not something the caller set). It is null for events written before provenance existed, and is served at verbosity "standard"/"full" and on by_id/by_content_hash lookups. The summary.by_client map (on stats=True) counts events per writing client — a different axis from by_origin, useful for "which tools have touched this vault".

decisions is populated only when this call carried decide= — one outcome per decision sent, in order (empty otherwise). next_cursor is non-null when a next page is reachable; pass it back verbatim as cursor. It is null once the pageable window is exhausted OR capped (the server bounds how deep paging can go — at that edge a note says the window was capped, so a client paging "until next_cursor is None" always terminates).

Each hit's payload is either the truncated summary or the full content, depending on the full_payload flag (and lookup mode). truncated tells you which form you got.

If hits is empty for a query, the user genuinely has no relevant memory yet. Consider asking them for context rather than guessing.

If invalidation is non-null on a hit, the fact was marked superseded by a later event. For current-state questions, prefer hits where invalidation is null. For historical questions, treat all hits as relevant context.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
by_idNo
depthNoauto
limitNo
queryNo
scopeNo
statsNo
cursorNo
decideNo
feedbackNo
verbosityNocompact
full_payloadNo
pending_limitNo
pending_offsetNo
by_content_hashNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
hitsYes
noteNo
summaryNo
coverageNo
decisionsNo
depth_usedYes
next_cursorNo
pending_countsNo
pending_correctionsNo
pending_corrections_countNo

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. First observedv0.1.0

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It thoroughly discloses behavioral traits: read-only nature ('read the user's memory vault'), cheapness ('Recall is cheap'), no side effects from reading, the effect of feedback (drives self-improvement tuner), the mutation via decide (explained as additive optional arg permitted under I1). Return format, field meanings, and edge cases (empty hits, invalidation, cursor cap) are all covered. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but well-structured with clear sections (purpose, when-to, arguments, return). It front-loads the essential purpose and usage mandate. However, some argument documentation is verbose, e.g., the repeated why-optional rationale for decide and feedback could be consolidated. Still, the complexity justifies the length, and the structure aids readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (14 optional parameters, rich return fields, multiple usage patterns), the description is remarkably complete. It covers all parameters, all return fields with meanings, edge cases (empty hits, invalidation, cursor cap, truncation), and even explains the client field and summary. The output schema is effectively documented inline. No gaps are apparent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate for all 14 parameters. It does so extensively: provides natural-language examples for query, explains depth modes with timing and behavior, clarifies limit clamping, verbosity per-level, cursor paging mechanics, full_payload and stats behavior, feedback schema with purpose, decide with verdict options and batch handling, and pending pagination. This adds rich semantic meaning far beyond the bare schema definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb+resource statement: 'Read the user's memory vault, afair, the persistent substrate they share across every session and every AI tool.' It explicitly identifies the tool as a read operation on the shared memory vault, distinguishing it from sibling tools 'remember' (likely write) and 'observe' (likely watch). This provides unambiguous purpose and scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a detailed 'WHEN TO CALL' and 'WHEN NOT TO CALL' section, with explicit scenarios (starting substantive tasks, before context-dependent questions, on topic shifts) and exclusions (pure compute, trivial responses, recent same query). It also suggests alternatives like by_id for full events and stats for snapshots. This is exemplary guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/afairai/afair'

If you have feedback or need assistance with the MCP directory API, please join our Discord server