Memory Tools
The hosted server returns only the tools allowed by the OAuth grant or MCP key. A localmcp-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.
get_memories
get_memories
Retrieve a list of user memories with optional filtering.Parameters:Memory categories:
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:interesting, core, hobbies, lifestyle, interests, habits, work, skills, learnings, othersearch_memories
search_memories
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_memory
create_memory
Create a new memory. Category is auto-detected if not provided.Parameters:
Returns:
{ "success": true, "memory": { ... } }create_memories
create_memories
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_memory
edit_memory
Edit an existing memory’s content.Parameters:
Returns:
{ "success": true }delete_memory
delete_memory
Delete a memory by ID.Parameters:
Returns:
{ "success": true }Conversation Tools
get_conversations
get_conversations
Retrieve a list of conversations with optional date and category filtering.Parameters:Conversation categories:
Returns:
{ "conversations": [...] } — metadata only. Use get_conversation_by_id for full transcripts.Example:personal, education, health, finance, technology, business, work, social, travel, entertainment, sports, family, and more.search_conversations
search_conversations
Semantic search across conversations. Returns results ranked by relevance using vector similarity.Parameters:
Returns:
{ "conversations": [...] } — ranked by relevance to the query.Example:get_conversation_by_id
get_conversation_by_id
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.
get_conversations_by_ids
get_conversations_by_ids
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_screenshotsand per-appcountcount only the summarized rows.coverage.sourceissynced_screen_activity;coverage.row_limitis 5000.coverage.truncatedis 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_atandlast_observed_atbound 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_completenessisunknown, even whentruncatedis false: the cloud query cannot attest to device capture status, excluded activity, retention, or pending sync. An empty result does not prove inactivity.
Pagination and cursors
List tools that can return more results emit an opaquenext_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
Atools/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: trueandstructuredContent.error.codeofpaid_plan_required, with a clear message