Skip to main content

Memory Tools

The hosted server returns only the tools allowed by the OAuth grant or MCP key. A local mcp-server-omi stdio process currently exposes the eight memory and conversation tools in the first two sections below; the additional tools are hosted-server tools.
Retrieve a list of user memories with optional filtering.Parameters:Returns: { "memories": [...], "returned_count": 25, "has_more": true, "offset": 0, "limit": 25, "sort": "created_desc" }The response may also include scan diagnostics such as scanned_count and scan_truncated.Example:
Memory categories: interesting, core, hobbies, lifestyle, interests, habits, work, skills, learnings, other
Semantic search across memories. Returns results ranked by relevance using vector similarity.Parameters:Returns: { "memories": [{ ..., "relevance_score": 0.92 }, ...] }Each result includes a relevance_score (0.0 to 1.0) indicating how well it matches the query.Example:
Create a new memory. Category is auto-detected if not provided.Parameters:Returns: { "success": true, "memory": { ... } }
Create up to 25 memories in one call — prefer this over repeated create_memory calls when saving several facts.Parameters:Returns: { "results": [...] } — every item is rate-limited individually and returns its own status: created, duplicate (exact content+category already created earlier in the same batch), or error.
Edit an existing memory’s content.Parameters:Returns: { "success": true }
Delete a memory by ID.Parameters:Returns: { "success": true }

Conversation Tools

Retrieve a list of conversations with optional date and category filtering.Parameters:Returns: { "conversations": [...] } — metadata only. Use get_conversation_by_id for full transcripts.Example:
Conversation categories: personal, education, health, finance, technology, business, work, social, travel, entertainment, sports, family, and more.
Semantic search across conversations. Returns results ranked by relevance using vector similarity.Parameters:Returns: { "conversations": [...] } — ranked by relevance to the query.Example:
Retrieve a single conversation by ID, including the full transcript with speaker segments.Parameters:Returns: Full conversation object with transcript segments, timestamps, structured summary, and metadata.
Deep-read up to 20 conversations in one call — the preferred follow-up after get_conversations or search_conversations returns several relevant ids.Parameters:Returns: { "conversations": [...], "not_found": [...], "truncated": false } — each item carries the same bounded card and transcript as get_conversation_by_id with its own truncated flag; ids that resolve to nothing are listed in not_found. When the response budget is hit, later items are omitted and top-level truncated is true — retry them with smaller max_segments/max_chars.

Profile, Imported Data, and Activity Tools

Dates use YYYY-MM-DD. get_screen_activity defaults to 200 raw rows per page (max 1000); limit is ignored when summary is true. group_by buckets rows by app, hour, or day with counts, estimated observation seconds (bounded capture gaps — never actual usage duration), and top window titles. Screen summaries count synced observations, not elapsed app usage. OCR gating, frame deduplication, privacy exclusions, and sync compaction mean a row cannot be converted to a fixed number of seconds or treated as proof of the user’s intent. The same summary contract serves hosted MCP, REST MCP, and GET /v1/screen-activity/summary:
  • total_screenshots and per-app count count only the summarized rows.
  • coverage.source is synced_screen_activity; coverage.row_limit is 5000.
  • coverage.truncated is true only when a lookahead row proves more matching rows exist. Only the earliest 5000 rows contribute to the summary. Narrow the date range to inspect later observations.
  • coverage.first_observed_at and last_observed_at bound the summarized rows, in UTC (YYYY-MM-DD HH:MM:SS.mmm), and are null for an empty result. They do not establish continuous activity or the device’s latest capture time.
  • coverage.capture_completeness is unknown, even when truncated is false: the cloud query cannot attest to device capture status, excluded activity, retention, or pending sync. An empty result does not prove inactivity.
Window titles are samples, not a ranking by dwell time. Summaries remain derived views of screen evidence; they do not create or promote semantic memories.

Pagination and cursors

List tools that can return more results emit an opaque next_cursor in the response. Pass it back as the cursor argument — together with the same filters — to fetch the next page (cursor and a non-zero offset are mutually exclusive). The field is absent when no further page exists. The same key authenticates the REST /v1/mcp/* list endpoints; they carry the cursor in the X-Next-Cursor response header instead of the body.

Incremental sync (updated_since)

GET /v1/mcp/action-items accepts updated_since, a strict ISO-8601 timestamp with an explicit timezone offset. It switches the feed to an incremental (updated_at ASC, id ASC) keyset — combine it with the X-Next-Cursor cursor to page through updates. On each sync pass, re-read starting from watermark − 60 seconds and deduplicate by id: updated_at is a timestamp, not a transaction sequence, and the overlap covers delayed-commit visibility. Note that action-item deletes are hard deletes — a deleted item leaves no row and is not emitted by the feed. GET /v1/mcp/conversations and GET /v1/mcp/memories do not support updated_since: a valid timestamp returns HTTP 400 with detail incremental_sync_unsupported (permanent capability gap — no Retry-After, do not retry). For conversations, page instead with the (created_at DESC, id) keyset cursor.

Action Item Tools

Due dates accept YYYY-MM-DD or an ISO 8601 date-time where noted by the client schema.

Error Handling

A tools/call result always carries structuredContent (a JSON value) plus a matching text block for compatibility. Tool execution failures come back as a tool result — visible to the model — with isError: true and structuredContent.error of { "code": string, "message": string }; code is one of: Protocol failures stay JSON-RPC errors: unknown method/tool (-32601), malformed params (-32602), unsupported protocol version (-32022), and header/body mismatches (-32020) never reach the tool result. Example tool failure — the text block mirrors the serialized structuredContent, so both forms carry the same error:

Locked Content

Memories and conversations behind the paid plan are handled gracefully:
  • Memories: Content is truncated to 70 characters with ...
  • Conversations: Action items and events are hidden from the structured data
  • Direct access: Returns a tool result with isError: true and structuredContent.error.code of paid_plan_required, with a clear message