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. rename_person requires people.rename, which is part of the compatible default MCP key grant. dismiss_person requires the explicitly requested people.cleanup scope. Dismissal is soft: it hides the person from default app and MCP People reads while preserving the record for data export. Existing and newly created default keys do not receive people.cleanup automatically.

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