# Dayze — Life Context (remote · dayze.com)

Life context for agents: get_context_pack + public notable packs. x402 + OAuth.

- Trust score: 71/100 (medium)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-25

> **Recent critical change**: Authorization (2026-09-18). See the changelog below before you install this server.

## Components

- remote · `dayze.com`: 77/100, [markdown](https://verifymcp.io/servers/com-dayze-life-context/api-mcp.md), [page](https://verifymcp.io/servers/com-dayze-life-context/api-mcp)
- remote · `dayze.com`: 71/100 (this document), [markdown](https://verifymcp.io/servers/com-dayze-life-context/api-mcp-key.md), [page](https://verifymcp.io/servers/com-dayze-life-context/api-mcp-key)

## Channel facts

- Endpoint: `https://dayze.com/api/mcp/key`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.28.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-25.

- **Endpoint Security**: 63/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (delete_food).
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 78/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 15748 tokens (~119/item across 132 items; 129 tools + 3 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 45/100
  - Stability check failed: schema churn in the 14 days we've observed: 0 tool removals, 2 breaking changes, 1 auth/transport breaks, 42 additions.
- **Tool Coverage**: 84/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 43% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 6 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 131 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 60/100
  - Spec-recency check failed: implements MCP spec 2025-06-18; the latest is 2026-07-28.

## Install

### How do I install the Dayze — Life Context MCP server?

Dayze — Life Context is a hosted endpoint at https://dayze.com/api/mcp/key, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http com-dayze-life-context 'https://dayze.com/api/mcp/key'
```

### Cursor

```json
{
  "mcpServers": {
    "com-dayze-life-context": {
      "url": "https://dayze.com/api/mcp/key"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "com-dayze-life-context": {
      "type": "http",
      "url": "https://dayze.com/api/mcp/key"
    }
  }
}
```

### Codex

```toml
[mcp_servers.com-dayze-life-context]
url = "https://dayze.com/api/mcp/key"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-dayze-life-context": {
      "type": "remote",
      "url": "https://dayze.com/api/mcp/key",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-dayze-life-context --url 'https://dayze.com/api/mcp/key' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-dayze-life-context:
    url: "https://dayze.com/api/mcp/key"
```

### Netclaw

```json
{
  "McpServers": {
    "com-dayze-life-context": {
      "Transport": "http",
      "Url": "https://dayze.com/api/mcp/key"
    }
  }
}
```

### Vellum

```bash
assistant mcp add com-dayze-life-context -t streamable-http -u 'https://dayze.com/api/mcp/key'
```

### Other

```json
{
  "mcpServers": {
    "com-dayze-life-context": {
      "type": "http",
      "url": "https://dayze.com/api/mcp/key"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-25 (score 71, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-09-23 (score 70, +1)

No change was recorded against any check on this day. Stability & Change Management went from 35 to 38.

### 2026-09-22 (score 69, 0)

- [security] Tool “get_interactions” rewrote its description, which is the text the model reads

### 2026-09-21 (score 69, +1)

No change was recorded against any check on this day. Stability & Change Management went from 28 to 32.

### 2026-09-20 (score 68, 0)

- [functional] New tool “get_interactions”

### 2026-09-18 (score 68, −10)

- [critical] Authorization: Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (delete_food).
- [security] Tool “archive_event” is now declared destructive
- [security] Tool “archive_expense” is now declared destructive
- [security] Tool “archive_trip” is now declared destructive
- [security] Tool “bulk_dismiss_clarifications” is now declared destructive
- [security] Tool “cleanup_apply” is now declared destructive
- [security] Tool “commit_life_update” is now declared destructive
- [security] Tool “convert_contact_entity” is now declared destructive
- [security] Tool “delete_event” is now declared destructive
- [security] Tool “normalize_people_apply” is now declared destructive
- [security] Tool “reset_tracker” is now declared destructive
- [security] Tool “start_people_cleanup” is now declared destructive
- [security] Tool “undo_contact_change” is now declared destructive
- [functional] Server version: 1.32.1 → 1.33.0
- [cosmetic] “cleanup_preview” added an optional parameter “idempotency_key”
- [cosmetic] “cleanup_preview” added an optional parameter “request_id”
- [cosmetic] “normalize_people_preview” added an optional parameter “idempotency_key”
- [cosmetic] “normalize_people_preview” added an optional parameter “request_id”
- [cosmetic] “update_event” reworded the description of “request_id”

### 2026-09-17 (score 78, +1)

- [security regression] Stability: 0.17 → fail
- [security] Tool “update_person” rewrote its description, which is the text the model reads
- [security] Tool “undo_contact_change” rewrote its description, which is the text the model reads
- [security] Tool “start_people_cleanup” rewrote its description, which is the text the model reads
- [security] Tool “resolve_person” rewrote its description, which is the text the model reads
- [security] Tool “merge_people_preview” rewrote its description, which is the text the model reads
- [security] Tool “merge_people” rewrote its description, which is the text the model reads
- [security] Tool “get_people” rewrote its description, which is the text the model reads
- [security] Tool “delete_event” rewrote its description, which is the text the model reads
- [security] Tool “create_person” rewrote its description, which is the text the model reads
- [security] Tool “delete_event” no longer declares itself destructive
- [functional regression] “normalize_people_apply” added a required parameter “candidate_hash”, so existing callers break
- [functional regression] “merge_people” added a required parameter “restore_window_acknowledged”, so existing callers break
- [functional regression] “merge_people” added a required parameter “preview_id”, so existing callers break
- [functional regression] “normalize_people_apply” made “request_id” required, so existing callers break
- [functional regression] “delete_event” made “request_id” required, so existing callers break
- [functional] Destructive annotations: All 6 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
- [functional] Server version: 1.30.2 → 1.32.1
- [functional] New tool “restore_trip”
- [functional] New tool “restore_expense”
- [functional] New tool “restore_event”
- [functional] New tool “restore_cleanup”
- [functional] New tool “cleanup_preview”
- [functional] New tool “cleanup_apply”
- [functional] New tool “archive_trip”
- [functional] New tool “archive_expense”
- [functional] New tool “archive_event”
- [cosmetic] “search_transactions” added an optional parameter “include_archived”
- [cosmetic] “search_transactions” added an optional parameter “cursor”
- [cosmetic] “merge_people_preview” added an optional parameter “request_id”
- [cosmetic] “merge_people_preview” added an optional parameter “idempotency_key”
- [cosmetic] “log_transaction” added an optional parameter “message_id”
- [cosmetic] “log_transaction” added an optional parameter “extractor_version”
- [cosmetic] “log_transaction” added an optional parameter “account_id”
- [cosmetic] “get_trips” added an optional parameter “include_archived”
- [cosmetic] “get_trips” added an optional parameter “cursor”
- [cosmetic] “get_transactions” added an optional parameter “include_archived”
- [cosmetic] “get_transactions” added an optional parameter “cursor”
- [cosmetic] “get_people” added an optional parameter “cursor”
- [cosmetic] “get_events” added an optional parameter “limit”
- [cosmetic] “get_events” added an optional parameter “include_archived”
- [cosmetic] “get_events” added an optional parameter “cursor”
- [cosmetic] “normalize_people_apply” reworded the description of “request_id”
- [cosmetic] Tool “update_person” changed its title: Update Person (CRM write) → Update Contact (CRM write)
- [cosmetic] Tool “resolve_person” changed its title: Resolve Person → Resolve Contact
- [cosmetic] Tool “get_people” changed its title: User Contacts → Dayze Contacts
- [cosmetic] Tool “create_person” changed its title: Create Person → Create Contact

### 2026-09-15 (score 77, +1)

No change was recorded against any check on this day. Stability & Change Management went from 10 to 13. That category is still filling its 30-day observation window: 3 days of observed history at the previous scan, 4 at this one. The score rises as the window fills, whether or not the server changes.

## MCP tools (129)

### `notable_search` (~52 tokens)

Search Notable People

Search the public Dayze notable-people catalog by name, occupation, or slug. Use when you need to find a person before fetching a pack. Example slug: albert-einstein. ($0.01)

Output parameters:

- `results` (array)
- `total` (number): Number of matches returned.

### `notable_profile` (~71 tokens)

Notable Person Profile

Bio-only profile JSON by slug (no life-in-days, similar, or birthday peers). Prefer notable_pack for “who is X / age in days / peers”. Example: taylor-swift. ($0.02)

Input parameters:

- `slug` (string, required): Person slug, e.g. albert-einstein

Output parameters:

- `about` (string|null)
- `bio` (string|null)
- `birth_date` (string|null)
- `death_date` (string|null)
- `handle` (string|null)
- `image_url` (string|null)
- `name` (string)
- `occupation` (string|null)
- `profile_url` (string)
- `slug` (string)
- `sources` (array)
- `timeline` (array)

### `notable_pack` (~100 tokens)

Notable Knowledge Pack

DEFAULT for who is X: profile + life_in_days (age/day_number) + similar people + birthday peers. Timeline events include day_number. Prefer this over notable_profile. Example: albert-einstein. ($0.05)

Input parameters:

- `date` (string): YYYY-MM-DD target date
- `peers` (number)
- `similar` (number)
- `slug` (string, required): Person slug, e.g. albert-einstein

Output parameters:

- `birthday_peers` (array)
- `life_in_days` (object): Age and current day-number calculations.
- `profile` (object): Public notable-person profile.
- `similar_people` (array)
- `timeline` (array)

### `notable_pack_premium` (~94 tokens)

Premium Notable Pack

S-tier guaranteed pack (score≥85, timeline≥8, image, embedding). Errors if below bar. Use when you need high-quality, complete notable context. Example slug: elon-musk. ($0.10)

Input parameters:

- `date` (string)
- `peers` (number)
- `similar` (number)
- `slug` (string, required): Person slug, e.g. elon-musk

Output parameters:

- `birthday_peers` (array)
- `life_in_days` (object): Age and current day-number calculations.
- `profile` (object): Quality-gated public notable-person profile.
- `quality` (object): Pack quality signals.
- `similar_people` (array)
- `timeline` (array)

### `compare_lives` (~103 tokens)

Compare Two Lives

Side-by-side notable packs for two slugs (life_in_days + day_number timelines). One call instead of two notable_pack. Example: elon-musk vs steve-jobs. ($0.08)

Input parameters:

- `date` (string): YYYY-MM-DD target date for both packs
- `peers` (number)
- `similar` (number)
- `slug_a` (string, required): First person slug
- `slug_b` (string, required): Second person slug

Output parameters:

- `a` (object): First notable-person knowledge pack.
- `b` (object): Second notable-person knowledge pack.
- `compare` (object): Computed comparison fields and URLs.
- `pack` (string)

### `get_life_context` (~144 tokens)

Life Context Snapshot

Get a snapshot of the authenticated user's current life context (identity, today/upcoming events, pulse, trackers). Relationships and memories are included by default; pass include_*=false to omit. Location is opt-in. Requires an authenticated Dayze account via OAuth; scoped API keys are also supported for direct clients. ($0.15; API key required)

Input parameters:

- `include_location` (boolean): Include city/country label; never returns a precise address
- `include_memories` (boolean): Include recent memory summaries (default true; set false to omit)
- `include_relationships` (boolean): Include inner-circle and relationship summaries (default true; set false to omit)

Output parameters:

- `active_trackers` (array)
- `energy_score` (number|null)
- `identity` (object): Account identity and timezone.
- `inner_circle` (array)
- `mood_score` (number|null)
- `pending_responses` (array)
- `pending_responses_count` (number)
- `pulse_streak` (number|null)
- `recent_memories` (array)
- `relationship_health` (array)
- `social_edges` (array)
- `today_events` (array)
- `upcoming_events` (array)

### `get_context_pack` (~260 tokens)

Life Context Pack

Life Context Protocol (LCP) pack for the authenticated user: identity, pulse, who_matters, whats_next, memories, quiz_results. Pass include_relationships/include_memories/include_quiz_results false to omit those sections; location and money stay opt-in. Spec: https://dayze.com/docs/life-context ($0.20; API key required)

Input parameters:

- `focus` (string): Optional focus hint echoed in the pack (e.g. places, travel, people)
- `include_location` (boolean): Include city/country label; never returns a precise address
- `include_memories` (boolean): Include recent memories (default true). A query always enables focused memories.
- `include_money` (boolean): Include the private cashflow summary
- `include_places` (boolean): Include recent canonical places (venue-level, no GPS points)
- `include_quiz_results` (boolean): Include latest quiz results (slug, result_type, result_data). Default true.
- `include_relationships` (boolean): Include who_matters (inner-circle, relationship health, reach-out). Default true.
- `include_trips` (boolean): Include recent/upcoming trips from completed travel history
- `query` (string): Optional focus query for semantic memories

Output parameters:

- `error` (string): Present when life state is unavailable.
- `focus` (string|null)
- `generated_at` (string)
- `identity` (object)
- `memories` (object)
- `ok` (boolean)
- `partial` (boolean)
- `places` (object): Recent canonical places when include_places=true.
- `preferred_tool` (string)
- `protocol` (object): Life Context Protocol metadata.
- `pulse` (object)
- `query` (string|null)
- `sections` (object): Per-section ok/error status for partial packs.
- `trips` (object): Recent trips when include_trips=true.
- `whats_next` (object)
- `who_matters` (object)

### `get_life_graph` (~105 tokens)

Life Graph Export

Explicit private life-graph export: favorites/VIP plus people with edges or recent event tags. Pass full=true for a larger capped list. Optional event–people links. Requires OAuth or a supported scoped credential. ($0.25; API key required)

Input parameters:

- `event_links_limit` (number)
- `full` (boolean): Include additional people by last interaction, up to max_people
- `include_event_links` (boolean)
- `max_people` (number)

Output parameters:

- `edge_count` (number)
- `edges` (array)
- `event_people_links` (array)
- `hot` (boolean)
- `max_people_requested` (number)
- `node_count` (number)
- `nodes` (array)

### `get_person_neighborhood` (~102 tokens)

Person Neighborhood

Subgraph around one user-owned person_id — profile (avatar_url, photo_count, has_photos) plus declared connections. Use get_person_photos for the full gallery. Notes omitted unless include_notes=true (redacted). Requires OAuth or a supported scoped credential. ($0.15; API key required)

Input parameters:

- `include_notes` (boolean): When true, include center.notes (server-redacted). Default false.
- `person_id` (string, required): UUID

Output parameters:

- `center` (object): A Dayze person or contact record.
- `connection_count` (number)
- `connections` (array)
- `include_notes` (boolean)

### `get_events` (~173 tokens)

Calendar Events

Authenticated user's calendar events. Prefer explicit from/to (YYYY-MM-DD). Shortcuts: today|week|month|year (calendar year)|decade. Browsing noise excluded by default. ($0.10; API key required)

Input parameters:

- `cursor` (string)
- `from` (string): Inclusive YYYY-MM-DD (preferred over range)
- `include_archived` (boolean)
- `include_browsing` (boolean): Include extension "Browsed domain · Xm" auto-events (default false)
- `include_calendar_blocks` (boolean): Include Focus Time / calendar_block rows (default false)
- `kinds` (array): Filter event_kind e.g. ["life_event","todo"]
- `limit` (number)
- `range` (string)
- `to` (string): Inclusive YYYY-MM-DD

Output parameters:

- `cap` (number)
- `events` (array)
- `expires_at` (string)
- `from` (string|null): Inclusive YYYY-MM-DD lower bound; null for all records.
- `has_more` (boolean)
- `next_cursor` (string|null)
- `ordering` (string)
- `range` (string)
- `server_time` (string)
- `snapshot_at` (string)
- `snapshot_id` (string)
- `to` (string|null): Inclusive YYYY-MM-DD upper bound; null for all records.
- `total` (number)
- `truncated` (boolean)

### `get_people` (~199 tokens)

Dayze Contacts

List the authenticated user's Dayze Contacts (private CRM; table people). Each contact includes avatar_url, photo_count, and has_photos; use get_person_photos(person_id) for the full gallery. Notes omitted by default (has_notes flag); pass include_notes=true for progressive fetch (credential/secret spans are redacted server-side). Supports limit (default 100, max 500) and offset; returns total and truncated. Distinct from public notable People at /people. Advertised name get_people is stable; tools/call also accepts get_contacts / list_contacts. Requires OAuth or a supported scoped credential. ($0.10; API key required)

Input parameters:

- `cursor` (string)
- `include_notes` (boolean): When true, include notes (server-redacted). Default false.
- `limit` (number): Page size (default 100, max 500)
- `offset` (number): Skip N rows (default 0)

Output parameters:

- `expires_at` (string)
- `has_more` (boolean)
- `include_notes` (boolean)
- `limit` (number)
- `next_cursor` (string|null)
- `offset` (number)
- `ordering` (string)
- `people` (array)
- `server_time` (string)
- `snapshot_at` (string)
- `snapshot_id` (string)
- `total` (number)
- `truncated` (boolean)

### `update_person` (~380 tokens)

Update Contact (CRM write)

MUTATES Dayze Contacts. Patch one existing contact the user owns (person_id UUID required). Optional fields: name (renames + refreshes slug), is_favorite, tier (vip|normal|low), relationship, notes (replaces stored notes — read first if you need to append), birthday (YYYY|YYYY-MM|YYYY-MM-DD|MM-DD|--MM-DD or null to clear; MM-DD stores month_day precision). Rejects unknown fields. Does not create or delete contacts. Rebuilds life_state so the next get_context_pack inner_circle is fresh. Advertised name update_person is stable; tools/call also accepts update_contact. Requires API key or OAuth with scope context. Share tokens cannot write. ($0.10; API key required)

Input parameters:

- `birthday` (string): YYYY, YYYY-MM, YYYY-MM-DD, or MM-DD / --MM-DD (year unknown). Null/empty clears
- `idempotency_key` (string): Alias for request_id.
- `is_favorite` (boolean): Favorite flag. Favorites (and VIP) appear in get_context_pack inner_circle
- `name` (string): Rename contact (also refreshes URL slug). Prefer this over create+merge for spelling fixes
- `notes` (string): Replaces people.notes (does not append). Empty or null clears
- `person_id` (string, required): UUID of a person the authenticated user owns
- `preserve_old_name_as_alias` (boolean): When renaming, keep the previous name as a former_name alias (default true)
- `relationship` (string): Relationship label (friend, sister, …). Empty or null clears
- `request_id` (string): Client idempotency key (retries return original result).
- `tier` (string): Relationship priority. VIP stays in inner_circle even when not favorited

Output parameters:

- `changed` (object): Changed fields with before and after values.
- `life_state_rebuilt` (boolean)
- `person` (object): A Dayze person or contact record.

### `update_notable` (~240 tokens)

Update Notable (catalog write)

MUTATES public notable_people. Superuser only. Patch by slug (bio, about, occupation, birth_place, birth_date, net_worth, residence, before_fame, trivia, family_life, zodiac, flag). Rejects unknown fields. No create/delete. Stamps last_updated_via=mcp. ($0.10; API key required)

Input parameters:

- `about` (string)
- `before_fame` (string)
- `bio` (string)
- `birth_date` (string): YYYY, YYYY-MM, or YYYY-MM-DD. Null/empty clears
- `birth_place` (string)
- `family_life` (string)
- `flag` (string)
- `idempotency_key` (string): Alias for request_id.
- `net_worth` (string)
- `occupation` (string)
- `request_id` (string): Client idempotency key (retries return original result).
- `residence` (string)
- `slug` (string, required): Notable person slug (e.g. taylor-swift)
- `trivia` (string)
- `zodiac` (string)

Output parameters:

- `changed` (object): Changed fields with before and after values.
- `person` (object): Updated notable catalog row (name, slug).

### `log_food` (~380 tokens)

Log Food (diary write)

MUTATES the authenticated user Food Diary and calendar. Use when they ate or drank — do not store this as a chat memory. Example: “I had Mee Pok for late lunch with my parents” → log_food({ what: "Mee Pok", kind: "meal", meal_period: "late lunch", with: ["my parents"] }). Optional: place/merchant, amount, consumed_at (ISO). Resolves with/Mum/Dad via person aliases; unknown names do not fail the food write. Tags companions on the mirrored event. Rebuilds life_state. Requires API key or OAuth with scope context. Share tokens cannot write. ($0.10; API key required)

Input parameters:

- `amount` (number): Price if mentioned
- `consumed_at` (string): ISO instant; wins over meal_period
- `currency` (string): ISO currency, e.g. SGD
- `idempotency_key` (string): Alias for request_id.
- `kind` (string)
- `meal_period` (string): Spoken period when consumed_at is omitted, e.g. "late lunch"
- `merchant` (string): Restaurant, stall, or shop
- `notes` (string)
- `paid_by` (string): Who paid (name or alias)
- `people_names` (array): Alias for with
- `person_ids` (array): Owned person UUIDs to tag (user-scoped)
- `place` (string): Venue or location
- `request_id` (string): Client idempotency key (retries return original result).
- `what` (string, required): What they ate or drank (required). Example: Mee Pok
- `with` (array): Companion names, aliases, ids, or group tokens. "my parents" / Mum / Dad resolve via aliases; "family" expands to CRM rows with family relationship labels

Output parameters:

- `event_id` (string|null)
- `food_id` (string)
- `food_log` (object): Saved Food Diary row.
- `life_state_rebuilt` (boolean)
- `message` (string)
- `people_tagged` (array)
- `unresolved_people` (array)

### `update_food` (~453 tokens)

Update Food (diary patch)

MUTATES one existing Food Diary row the authenticated user owns. Required: food_id (UUID). Optional patch (same fields as log_food): what, kind, place, merchant, notes, append_notes (concat), consumed_at (ISO instant) / meal_period (profile TZ), amount, currency, paid_by / payment_method, with / people_names / person_ids. Example: add hot tea onto an existing Salmon Bento → update_food({ food_id, what: "Salmon Bento + hot tea" }). Unknown or other-user food_id returns an error and does not create a row. Syncs the mirrored calendar event and rebuilds life_state. Requires API key or OAuth with scope context. Share tokens cannot write. ($0.10; API key required)

Input parameters:

- `amount` (number): Price if mentioned
- `append_notes` (string): Append text to existing notes (newline-separated)
- `consumed_at` (string): ISO instant; wins over meal_period
- `currency` (string): ISO currency, e.g. SGD
- `food_id` (string, required): UUID of a food diary row the authenticated user owns
- `idempotency_key` (string): Alias for request_id.
- `kind` (string)
- `meal_period` (string): Spoken period when consumed_at is omitted, e.g. "late lunch"
- `merchant` (string): Restaurant, stall, or shop. Empty or null clears
- `notes` (string): Replaces notes. Empty or null clears
- `paid_by` (string): Who paid (name or alias)
- `payment_method` (string): Alias of paid_by for expense-style agents
- `people_names` (array): Alias for with
- `person_ids` (array): Owned person UUIDs to tag (user-scoped)
- `place` (string): Venue or location. Empty or null clears
- `request_id` (string): Client idempotency key (retries return original result).
- `what` (string): Full updated dish/drink text (replaces, does not append). Example: Salmon Bento + hot tea
- `with` (array): Companion names, aliases, or ids to add (does not remove existing tags)

Output parameters:

- `changed` (object): Changed fields with before and after values.
- `event_id` (string|null)
- `food_id` (string)
- `food_log` (object): Updated Food Diary row.
- `life_state_rebuilt` (boolean)
- `people_tagged` (array)
- `unresolved_people` (array)

### `delete_food` (~135 tokens)

Delete Food (Food Diary remove)

MUTATES by removing one Food Diary row the authenticated user owns and its mirrored calendar event. Required: food_id (UUID). Prefer this over delete_event for meals logged via log_food. Unknown or other-user food_id returns an error. Rebuilds life_state. Requires API key or OAuth with scope context. Share tokens cannot write. ($0.10; API key required)

Input parameters:

- `food_id` (string, required): UUID of a Food Diary row the authenticated user owns
- `idempotency_key` (string): Alias for request_id.
- `request_id` (string): Client idempotency key (retries return original result).

Output parameters:

- `deleted` (object): Deleted food diary row.
- `event_id` (string|null)
- `food_id` (string)
- `life_state_rebuilt` (boolean)

### `log_event` (~367 tokens)

Log Event (calendar write)

MUTATES the authenticated user calendar. Use for non-food days — funeral, cremation, appointment, dinner, anything that is not a food log. Do not store this as a chat memory. Example (funeral tonight): log_event({ title: "Funeral service — Mr Goh Choo Taw", date: "2026-08-29", time: "8pm", location: "Multi Purpose Hall, Blk 661 Jurong West St 64", category: "funeral" }). Example (Sunday cremation): log_event({ title: "Cremation — Mr Goh Choo Taw", date: "2026-08-30", location: "Mandai Crematorium", category: "funeral" }). Required: title + event_date (YYYY-MM-DD, YYYY-MM, or YYYY; alias date). Soft dates expand to first-of-period and set metadata.date_precision (day|month|year|approx). Optional: event_time (8pm or 20:00; alias time), end_date, end_time, location / city+country, description, category, external_url, visibility (private|friends|public), image_url, timezone, date_precision, share_with (Dayze handles e.g. ["boof"]), people / with / person_ids, idempotency_key (recommended; retries reuse the first write). For trips/residences prefer log_travel({ city, country, start_date, kind }). Unknown people names do not fail the write. Public events return share_url (/e/{id}) for Explore + social. Inserts public.events, optional event_people / shared_events, then rebuilds life_state. Requires API key or OAuth with scope context. Share tokens cannot write. ($0.10; API key required)

Output parameters:

- `event` (object): A Dayze calendar event record.
- `life_state_rebuilt` (boolean)
- `people_tagged` (array)
- `unresolved_people` (array)

### `update_event` (~455 tokens)

Update Event (calendar patch)

MUTATES one existing calendar event the authenticated user owns. Required: event_id (UUID). Optional patch (same fields as log_event): title, date / event_date, time / event_time, end_date, end_time, location, description, category, external_url, people / with / person_ids. Unknown or other-user event_id returns an error and does not create a row. For food-diary meals, prefer update_food (it syncs the mirrored event). Rebuilds life_state. Requires API key or OAuth with scope context. Share tokens cannot write. ($0.10; API key required)

Input parameters:

- `category` (string): e.g. funeral, family, work, travel. Stored as events.category and event_type.
- `date` (string): Alias for event_date.
- `date_precision` (string): Soft date precision stored in metadata.
- `description` (string): Empty or null clears
- `end_date` (string): Optional end date YYYY-MM-DD (all-day multi-day).
- `end_time` (string): Optional end time (same formats as event_time).
- `event_date` (string): Start date YYYY-MM-DD, YYYY-MM, or YYYY. Alias: date.
- `event_id` (string, required): UUID of a calendar event the authenticated user owns
- `event_time` (string): Start time: 8pm, 20:00, or 20:00:00. Empty or null clears. Alias: time.
- `external_url` (string)
- `idempotency_key` (string): Alias for request_id.
- `location` (string): Empty or null clears
- `people` (array): People names or person UUIDs to add (event_people role=with). Does not remove existing tags.
- `people_names` (array)
- `person_ids` (array): Owned person UUIDs to tag (user-scoped).
- `person_name` (string)
- `request_id` (string): Client idempotency key (retries return original successful result).
- `time` (string): Alias for event_time.
- `title` (string): Updated title (replaces). Cannot be empty.
- `with` (array): Alias for people.

Output parameters:

- `changed` (object): Changed fields with before and after values.
- `event` (object): A Dayze calendar event record.
- `life_state_rebuilt` (boolean)
- `people_tagged` (array)
- `unresolved_people` (array)

### `delete_event` (~123 tokens)

Delete Event (calendar remove)

Reversibly archives one owned event. Required event_id and request_id. Returns the prior row in deleted for compatibility, changed, restore_id and life_state_rebuilt. All food, people and asset links are preserved. Restore with restore_event. Replays perform no additional action. ($0.10; API key required)

Input parameters:

- `event_id` (string, required): UUID of a calendar event the authenticated user owns
- `idempotency_key` (string): Alias for request_id.
- `request_id` (string, required): Client idempotency key (retries return original result).

Output parameters:

- `deleted` (object): A Dayze calendar event record.
- `event_id` (string)
- `food_deleted_ids` (array)
- `life_state_rebuilt` (boolean)

### `log_favorite_song` (~248 tokens)

Log Favorite Song (music write)

MUTATES the authenticated user favorite tracks list at /music. Use when they favorite or save a song — do not store this as a chat memory or in music_preferences. Example: “Henry Mancini - Piano And Strings (1995 Remastered)” → log_favorite_song({ track: "Henry Mancini - Piano And Strings (1995 Remastered)" }) or title + artist. Optional year_note, source_url. Requires API key or OAuth with scope context. Share tokens cannot write. ($0.10; API key required)

Input parameters:

- `artist` (string): Artist name (required unless track blob parses)
- `idempotency_key` (string): Alias for request_id.
- `remaster_note` (string): Alias for year_note
- `request_id` (string): Client idempotency key (retries return original result).
- `source_url` (string): Optional https link
- `title` (string): Track title (required unless track blob parses)
- `track` (string): Optional "Artist - Title (year remaster)" blob
- `url` (string): Alias for source_url
- `year_note` (string): Optional year or remaster note

Output parameters:

- `created` (boolean): True when a new favorite was created.
- `message` (string)
- `track` (object): Saved favorite-track record.
- `track_id` (string)

### `get_memories` (~81 tokens)

Agent Memories

Authenticated user memories from Dayze Agent. Pass query for semantic/keyword retrieval. Prefer search for event-first trip and calendar titles. Requires OAuth or a supported scoped credential. ($0.10; API key required)

Input parameters:

- `limit` (number): Max rows 1–50, default 20
- `query` (string): Semantic focus (optional)

Output parameters:

- `events` (array)
- `memories` (array)
- `mode` (string)
- `people` (array)
- `query` (string)

### `get_expenses` (~44 tokens)

Expense Summary

Authenticated user cashflow summary: spend, income, net, and top spend categories. Requires OAuth or a supported scoped credential. ($0.10; API key required)

Output parameters:

- `by_currency` (array)
- `count` (number)
- `currency` (string|null)
- `income` (number)
- `multi_currency` (boolean)
- `net` (number)
- `period` (string)
- `period_days` (number)
- `spend` (number)
- `top_categories` (array)
- `usd` (object): Totals converted to USD (approximate FX).

### `resolve_person` (~151 tokens)

Resolve Contact

Resolve a nickname or surface name to a Dayze Contacts row via person_aliases → exact name → slug → unique substring. Returns avatar_url, photo_count, has_photos, and photos[{url,is_primary}] preview; use get_person_photos for full gallery. Notes omitted unless include_notes=true (redacted). Prefer this before money or relationship tools when the agent only has a nickname. Advertised name resolve_person is stable; tools/call also accepts resolve_contact. ($0.05; API key required)

Input parameters:

- `include_notes` (boolean): Include redacted notes (default false)
- `name` (string, required): Nickname or display name to resolve
- `query` (string): Alias for name

Output parameters:

- `aliases` (array)
- `candidates` (array)
- `matched_via` (string|null)
- `person` (object)
- `query` (string)
- `resolved` (boolean)

### `get_person_aliases` (~73 tokens)

Person Aliases

List canonical aliases (nicknames) for a CRM person. Pass person_id or name (resolved via aliases). Requires OAuth or a supported scoped credential. ($0.05; API key required)

Input parameters:

- `name` (string): Surface name if person_id unknown
- `person_id` (string): CRM people.id

Output parameters:

- `aliases` (array)
- `candidates` (array)
- `name` (string|null)
- `person_id` (string|null)

### `get_person_transactions` (~126 tokens)

Person Transactions

Me↔contact money ledger from expenses (paid_to_person_id / income_from_person_id). Pass person_id or name. Returns entries + per-currency totals. Reuses existing expenses — no parallel ledger table. ($0.10; API key required)

Input parameters:

- `from` (string): Inclusive YYYY-MM-DD filter
- `limit` (number): Max rows 1–200, default 50
- `name` (string): Surface name if person_id unknown
- `person_id` (string): CRM people.id
- `to` (string): Inclusive YYYY-MM-DD filter

Output parameters:

- `count` (number)
- `entries` (array)
- `name` (string)
- `person_id` (string)
- `totals` (array)

### `get_money_between_people` (~114 tokens)

Money Between People

Same as get_person_transactions: authenticated user ↔ one contact via expenses FKs. Prefer get_person_transactions; this alias exists for agent discoverability. ($0.10; API key required)

Input parameters:

- `from` (string): Inclusive YYYY-MM-DD filter
- `limit` (number): Max rows 1–200, default 50
- `name` (string): Surface name if person_id unknown
- `person_id` (string): CRM people.id
- `to` (string): Inclusive YYYY-MM-DD filter

Output parameters:

- `entries` (array)
- `model` (string)
- `name` (string)
- `person_id` (string)
- `totals` (array)

### `get_person_interactions` (~155 tokens)

Person Interactions

Relationship timeline for one CRM person: interactions rows (message/call/meeting/note + extended kinds like visit/gift/stayed_over encoded in summary) plus co-tagged calendar events. Prefer this over dumping people.notes for “when did I last see X?”. Pass person_id or name. ($0.10; API key required)

Input parameters:

- `from` (string): Inclusive YYYY-MM-DD filter
- `kind` (string): Optional filter: meeting, visit, gift, stayed_over, met, …
- `limit` (number): Max rows 1–100, default 40
- `name` (string)
- `person_id` (string)
- `to` (string): Inclusive YYYY-MM-DD filter

Output parameters:

- `count` (number)
- `events` (array)
- `matched_via` (string|null)
- `name` (string)
- `person_id` (string)
- `truncated` (boolean)

### `get_interactions` (~206 tokens)

Life Update Interactions

Bounded graph read over life_updates (PHI-54/61): traverse interaction → person/event/expense/place with source/confidence on every hop. When life_update edges are missing, projects hops from CRM interactions, event_people, and expense person FKs (PHI-100). Prefer for “who was I with at X?”, “when am I meeting Y next?”, “how much at Z?”. 93-day default window. Pass person_name, place_query, or ids. ($0.10; API key required)

Input parameters:

- `event_id` (string)
- `expense_id` (string)
- `from` (string): Inclusive YYYY-MM-DD
- `limit` (number): Max 1–50, default 25
- `person_id` (string)
- `person_name` (string)
- `place_id` (string)
- `place_query` (string): Venue/merchant substring
- `to` (string): Inclusive YYYY-MM-DD

Output parameters:

- `error` (string|null)
- `interactions` (array)
- `no_data` (boolean)
- `ok` (boolean)
- `truncated` (boolean)
- `window` (object): Bounded from/to lookback window.

### `explain_fact` (~103 tokens)

Explain Fact

Return evidence/provenance for a claim: polaris_learned_facts, life_events / life_event_relationships when present, then memories. Use when the agent must cite why it believes something — do not invent sources. ($0.10; API key required)

Input parameters:

- `fact` (string): Alias for query
- `limit` (number): Max evidence rows 1–20, default 8
- `query` (string, required): Fact or phrase to explain

Output parameters:

- `count` (number)
- `evidence` (array)
- `message` (string|null)
- `query` (string)

### `list_clarifications` (~108 tokens)

List Clarifications

Ranked clarification queue: only person-typed mentions + duplicate CRM people. Non-person junk (places, orgs, media, command fragments) is auto-dismissed. Existing contacts auto-link. ($0.05; API key required)

Input parameters:

- `auto_cleanup` (boolean): Auto-dismiss non-person / auto-link existing (default true)
- `kind` (string): Optional: entity_mention | duplicate_people
- `limit` (number): Max rows 1–50, default 15

Output parameters:

- `clarifications` (array)
- `count` (number)
- `message` (string|null)
- `truncated` (boolean)

### `get_trackers` (~71 tokens)

Habit Trackers

Authenticated user live trackers only; expired countdowns and inactive streaks are omitted. Sobriety/streak trackers remain visible at day 0 after a reset. Merges event-backed trackers with the trackers table when present. Requires OAuth or a supported scoped credential. ($0.10; API key required)

Output parameters:

- `note` (string)
- `trackers` (array)

### `reset_tracker` (~184 tokens)

Reset Streak Tracker

MUTATES a sobriety/streak tracker for the authenticated user (sets current value to 0 and restarts the clock). Prefer tracker_id from get_trackers, or tracker_title fuzzy match. Optional reset_at (ISO) and note. Rebuilds life_state. Requires API key or OAuth with scope context. Share tokens cannot write. ($0.10; API key required)

Input parameters:

- `idempotency_key` (string): Alias for request_id.
- `note` (string): Optional note stored in tracking history
- `request_id` (string): Client idempotency key (retries return original result).
- `reset_at` (string): ISO datetime of the reset (default now)
- `title` (string): Alias of tracker_title
- `tracker_id` (string): Event UUID of the tracker
- `tracker_title` (string): Title match when id unknown

Output parameters:

- `error` (string)
- `invalidates` (array)
- `life_state_rebuilt` (boolean)
- `message` (string)
- `ok` (boolean)
- `previous_days` (number)
- `reset_date` (string)
- `reset_time` (string)
- `tracker_id` (string)
- `tracker_reset_count` (number)
- `tracker_title` (string|null)

### `search` (~101 tokens)

Semantic Life Search

Search the authenticated user life graph. Deterministic routing first: food + relative dates (e.g. "what did I eat yesterday?"); timeline/current-context; money+person; who-is → resolve_person. Otherwise semantic/keyword search. Event hits include event_date and food_id when mirrored from Food Diary. Browser-history titles are excluded. Credential/secret spans are redacted. Requires OAuth or a supported scoped credential. ($0.15; API key required)

Output parameters:

- `intent` (string)
- `mode` (string)
- `results` (array)

### `search_gmail` (~343 tokens)

Search Gmail (read-only)

Search one of the authenticated user's connected Gmail inboxes (read-only). Reuses Integrations hub Gmail (service_connections provider=gmail). Optional account/email selects a mailbox when multiple are connected — call list_gmail_accounts first. Prefer Gmail operators: from:, subject:, is:unread, newer_than:7d, has:attachment. For clock-time constraints, pass after/before as account-local civil datetimes; the tool converts them to precise UTC instants. Returns id, subject, from, canonical date, account-local date_local, time_zone, and snippet only (no body). Follow up with read_gmail_message. Cannot send, archive, or delete. Never invent email contents. If Gmail is not connected, connect at /integrations. Requires API key or OAuth with scope context. Share tokens cannot call this tool. ($0.10; API key required)

Input parameters:

- `account` (string): Mailbox email, connection id, or Google subject (from list_gmail_accounts)
- `after` (string): Exclusive lower bound as account-local YYYY-MM-DDTHH:mm, or an offset-aware ISO instant
- `before` (string): Exclusive upper bound as account-local YYYY-MM-DDTHH:mm, or an offset-aware ISO instant
- `email` (string): Alias for account
- `max_results` (number): Max messages to return (default 10, max 20)
- `q` (string): Alias for query
- `query` (string, required): Gmail search query, e.g. "is:unread newer_than:7d", "from:airline subject:itinerary", "receipt newer_than:30d"

Output parameters:

- `account` (string|null)
- `after` (string)
- `before` (string)
- `messages` (array)
- `query` (string)
- `result_size_estimate` (number|null)
- `time_zone` (string)

### `list_gmail_accounts` (~76 tokens)

List Gmail Accounts

List connected Gmail mailboxes for the authenticated user (id, email, is_default). Use account on search_gmail / read_gmail_* / import_*_gmail to pick a mailbox. Connect another inbox at /integrations (multi-mailbox after migration). Share tokens cannot call. ($0.05; API key required)

Output parameters:

- `accounts` (array)
- `connect_url` (string)
- `count` (number)

### `read_gmail_message` (~149 tokens)

Read Gmail Message (read-only)

Read one Gmail message by id from search_gmail. Returns subject, from, canonical date, account-local date_local, time_zone, snippet, plain-text body (truncated), and attachments[] metadata (attachment_id, filename, mime_type, size). Use read_gmail_attachment for text/csv/vcf contents. Optional account when multiple mailboxes. Read-only. Share tokens cannot call. ($0.10; API key required)

Input parameters:

- `account` (string): Mailbox selector (email or connection id)
- `email` (string): Alias for account
- `id` (string): Alias for message_id
- `message_id` (string, required): Gmail message id from search_gmail

Output parameters:

- `message` (object)

### `read_gmail_attachment` (~110 tokens)

Read Gmail Attachment (read-only)

Download one Gmail attachment by message_id + attachment_id (from read_gmail_message.attachments). Returns utf-8 text for text/csv/vcf/vcard; binary types return filename/mime/size + a note (no base64 dump). Optional account. Read-only. Share tokens cannot call. ($0.10; API key required)

Input parameters:

- `account` (string)
- `attachment_id` (string, required)
- `email` (string)
- `message_id` (string, required)

Output parameters:

- `attachment` (object)
- `message_id` (string)

### `log_sleep` (~154 tokens)

Log Sleep

Sleep: log overnight or nap. Cross-midnight OK (e.g. 14:00→03:00 = 13h / 780m). ($0.10; API key required)

Input parameters:

- `ended_at` (string, required): ISO end
- `idempotency_key` (string): Alias for request_id.
- `notes` (string)
- `quality` (number)
- `request_id` (string): Client idempotency key (retries return original result).
- `sleep_type` (string)
- `source` (string)
- `started_at` (string, required): ISO start
- `timezone` (string)
- `timezone_end` (string)
- `timezone_start` (string)

Output parameters:

- `message` (string|null)
- `ok` (boolean)
- `sleep` (object)

### `get_sleep` (~50 tokens)

Get Sleep

Sleep: list typed sleep/nap records with duration_minutes. ($0.05; API key required)

Input parameters:

- `from` (string)
- `limit` (number)
- `to` (string)

Output parameters:

- `count` (number)
- `sleeps` (array)

### `get_sleep_summary` (~34 tokens)

Sleep Summary

Sleep: day/week/month totals and averages. ($0.05; API key required)

Input parameters:

- `range` (string)

Output parameters:

- `average_minutes` (number)
- `count` (number)
- `nights` (number)
- `range` (string)
- `total_minutes` (number)

### `update_sleep` (~114 tokens)

Update Sleep

Sleep: patch an existing sleep record by sleep_id. ($0.10; API key required)

Input parameters:

- `ended_at` (string)
- `idempotency_key` (string): Alias for request_id.
- `notes` (string)
- `quality` (number)
- `request_id` (string): Client idempotency key (retries return original result).
- `sleep_id` (string, required)
- `sleep_type` (string)
- `started_at` (string)
- `timezone` (string)

Output parameters:

- `message` (string|null)
- `ok` (boolean)
- `sleep` (object)

### `resolve_place` (~51 tokens)

Resolve Place

Canonicalize a venue name via place aliases and fuzzy match. ($0.10; API key required)

Input parameters:

- `name` (string)
- `place` (string)
- `query` (string)

Output parameters:

- `candidates` (array)
- `matched_via` (string|null)
- `place` (object|null): Canonical place record.
- `query` (string)
- `resolved` (boolean)

### `get_places` (~120 tokens)

List Places

Known venues: visit-graph `places` plus saved place cards (`saved_places` from business_contacts) with address, opening_hours, and affordability ($/$$/$$$). ($0.10; API key required)

Input parameters:

- `affordability` (string): $ | $$ | $$$
- `area` (string)
- `city` (string)
- `country` (string)
- `limit` (number)
- `near` (string): Filter saved cards by area/tag/notes (e.g. Madeira).
- `tag` (string)

Output parameters:

- `count` (number)
- `places` (array)
- `saved_count` (number)
- `saved_places` (array)

### `get_place` (~63 tokens)

Get Place Card

Fetch one saved place card (business_contacts) by place_id — address, opening hours, affordability, notes. ($0.05; API key required)

Input parameters:

- `business_contact_id` (string)
- `id` (string)
- `place_id` (string)

Output parameters:

- `business_contact_id` (string)
- `message` (string|null)
- `place` (object): Saved place card.
- `place_id` (string)

### `create_place` (~270 tokens)

Create Place Card

Save a venue card (business_contacts): address, opening_hours, affordability ($/$$/$$$), notes, tags. Idempotent by name or idempotency_key — does not create calendar notes. ($0.10; API key required)

Input parameters:

- `address` (string)
- `affordability` (string): $ | $$ | $$$ (or 1–3)
- `area` (string)
- `category` (string): restaurant|cafe|supermarket|shop|hawker|… (aliases mapped to business_contacts.category)
- `city` (string)
- `country` (string)
- `description` (string)
- `hours` (string): Alias for opening_hours
- `hours_source` (string): agent | google_places | user
- `idempotency_key` (string)
- `latitude` (number)
- `longitude` (number)
- `name` (string, required)
- `notes` (string)
- `opening_hours` (string)
- `phone` (string)
- `phone_numbers` (array)
- `price_level` (string): Alias for affordability
- `request_id` (string): Client idempotency key (retries return original result).
- `tags` (array)
- `website` (string)

Output parameters:

- `business_contact_id` (string)
- `created` (boolean)
- `duplicate` (boolean)
- `message` (string|null)
- `place` (object): Saved place card.
- `place_id` (string)

### `update_place` (~240 tokens)

Update Place Card

Patch a saved place card by place_id / business_contact_id. Unspecified fields stay unchanged (hours, affordability, address, notes, …). ($0.10; API key required)

Input parameters:

- `address` (string)
- `affordability` (string)
- `area` (string)
- `business_contact_id` (string)
- `category` (string)
- `city` (string)
- `country` (string)
- `description` (string)
- `hours` (string)
- `hours_source` (string)
- `id` (string)
- `idempotency_key` (string): Alias for request_id.
- `latitude` (number)
- `longitude` (number)
- `name` (string)
- `notes` (string)
- `opening_hours` (string)
- `phone` (string)
- `phone_numbers` (array)
- `place_id` (string)
- `price_level` (string)
- `request_id` (string): Client idempotency key (retries return original result).
- `tags` (array)
- `website` (string)

Output parameters:

- `business_contact_id` (string)
- `message` (string|null)
- `place` (object): Saved place card.
- `place_id` (string)
- `updated` (boolean)

### `get_place_visits` (~76 tokens)

Place Visits

When was I at a venue — merges place_visits, location_visits, and event locations. ($0.10; API key required)

Input parameters:

- `from` (string)
- `person_ids` (array)
- `place` (string, required)
- `place_id` (string)
- `to` (string)

Output parameters:

- `confidence` (number)
- `count` (number)
- `matching_events` (array)
- `people_present` (array)
- `place` (string)
- `visits` (array)

### `get_location_history` (~87 tokens)

Location History

Normalized visit history (venue-level by default). Merges GPS location_visits + place_visits (MCP/Uber digs). ($0.10; API key required)

Input parameters:

- `city` (string)
- `country` (string)
- `from` (string)
- `place` (string)
- `precision` (string)
- `to` (string)

Output parameters:

- `count` (number)
- `visits` (array)

### `log_place_visit` (~228 tokens)

Log Place Visit

MUTATES place_visits for map/history digs (Uber dropoff, address evidence). Required: place (or place_id) + arrived_at/date. Optional: departed_at, source (uber|mcp|…), evidence_expense_id (idempotent), city/country/address. Prefer this over stuffing streets only into expenses. ($0.10; API key required)

Input parameters:

- `address` (string)
- `arrived_at` (string): ISO or YYYY-MM-DD
- `city` (string)
- `confidence` (number)
- `country` (string)
- `date` (string): Alias for arrived_at
- `departed_at` (string)
- `evidence_event_id` (string)
- `evidence_expense_id` (string)
- `idempotency_key` (string): Alias for request_id.
- `name` (string): Alias for place
- `place` (string)
- `place_id` (string)
- `request_id` (string): Client idempotency key (retries return original result).
- `source` (string)

Output parameters:

- `created_place` (boolean)
- `duplicate` (boolean)
- `message` (string|null)
- `place` (object): Canonical place record.
- `place_id` (string)
- `visit` (object): Normalized place visit.

### `get_location_context` (~39 tokens)

Location Context

Likely current or at-time place with confidence and provenance. ($0.10; API key required)

Input parameters:

- `at` (string): ISO timestamp

Output parameters:

- `at` (string|null)
- `confidence` (number)
- `place` (object|null): Canonical place record.
- `provenance` (array)

### `get_current_states` (~83 tokens)

Current States

Permitted assertion states for a person (flagged life-graph; off by default). ($0.10; API key required)

Input parameters:

- `known_at` (string)
- `people_id` (string): CRM people.id UUID
- `person_id` (string): Alias for people_id
- `predicates` (array)
- `valid_at` (string)

Output parameters:

- `count` (number)
- `enabled` (boolean)
- `states` (array)

### `propose_life_update` (~106 tokens)

Propose Life Update

Propose assertion create/correct without committing (flagged; off by default). ($0.10; API key required)

Input parameters:

- `client_id` (string)
- `idempotency_key` (string)
- `operations` (array)
- `people_id` (string)
- `person_id` (string)
- `predicate` (string)
- `request_id` (string)
- `source_text` (string)
- `value` (object)

Output parameters:

- `enabled` (boolean)
- `message` (string|null)
- `payload_hash` (string)
- `proposal_id` (string)

### `commit_life_update` (~81 tokens)

Commit Life Update

Owner approve+commit via payload_hash + owner_session_id (flagged; off by default). ($0.10; API key required)

Input parameters:

- `idempotency_key` (string)
- `owner_session_id` (string, required)
- `payload_hash` (string, required)
- `proposal_id` (string, required)
- `request_id` (string)

Output parameters:

- `assertionIds` (array)
- `enabled` (boolean)
- `graphVersion` (number)
- `message` (string|null)

### `update_current_location` (~250 tokens)

Update Current Location

MUTATES where the user is now: profiles.location + polaris current_city/country (same as in-app Dayze chat). Pass location ("The Madeira, Singapore") and/or city+country; optional place/venue + lat/lon records a fresh location_visits check-in so get_location_context returns is_current. set_home defaults true; check_in defaults true when place or coordinates are set. Does not invent GPS when omitted. ($0.10; API key required)

Input parameters:

- `address` (string)
- `check_in` (boolean): Write a location_visits row when place or coordinates are set (default true in that case)
- `city` (string)
- `country` (string)
- `idempotency_key` (string)
- `latitude` (number)
- `location` (string): Freeform “City, Country” or “Venue, City, Country”
- `longitude` (number)
- `place` (string): Venue / residence name (e.g. The Madeira)
- `request_id` (string)
- `set_home` (boolean): Also write profiles.location / home_location (default true)
- `venue` (string): Alias for place

Output parameters:

- `check_in` (boolean)
- `context` (object): Fresh get_location_context after write.
- `current_city` (string|null)
- `current_country` (string|null)
- `location` (string|null)
- `message` (string)
- `place` (string|null)
- `set_home` (boolean)
- `updated` (boolean)
- `visit_id` (string|null)

### `get_trips` (~105 tokens)

List Trips

User trips with status filter (planned/completed/etc.). Residences also appear here with metadata.kind=residence — prefer get_residences for home history. ($0.10; API key required)

Input parameters:

- `cursor` (string): Continue the same immutable one-hour snapshot; other filters remain frozen.
- `from` (string)
- `include_archived` (boolean)
- `limit` (number)
- `status` (string)
- `to` (string)

Output parameters:

- `count` (number)
- `trips` (array)

### `get_residences` (~95 tokens)

List Residences

Home / residence history separate from trips: trips with metadata.kind=residence (from log_travel) plus optional life_eras. Use for Boylston / Madeira / current home cards. ($0.10; API key required)

Input parameters:

- `from` (string)
- `include_eras` (boolean): Include life_eras rows (default true)
- `limit` (number)
- `to` (string)

Output parameters:

- `count` (number)
- `eras` (array)
- `residences` (array)

### `get_trip` (~33 tokens)

Get Trip

Single trip with linked places and people. ($0.10; API key required)

Input parameters:

- `trip_id` (string, required)

Output parameters:

- `people` (array)
- `places` (array)
- `trip` (object)

### `get_travel_history` (~39 tokens)

Travel History

Completed/confirmed travel only. ($0.10; API key required)

Input parameters:

- `from` (string)
- `to` (string)

Output parameters:

- `count` (number)
- `trips` (array)

### `get_countries_visited` (~55 tokens)

Countries Visited

Canonical countries from completed trips (not other people travel). ($0.10; API key required)

Input parameters:

- `from` (string)
- `include_residence` (boolean)
- `to` (string)

Output parameters:

- `count` (number)
- `countries` (array)

### `get_cities_visited` (~67 tokens)

Cities Visited

Canonical cities from confirmed/completed trips only (excludes soft pins / status=possible). Inference requires category=travel + structured location — not todo titles. ($0.10; API key required)

Input parameters:

- `from` (string)
- `to` (string)

Output parameters:

- `cities` (array)
- `count` (number)

### `log_travel` (~241 tokens)

Log Travel

MUTATES trips (+ optional calendar travel event). Prefer this over free-text log_event for map/history. Required: city + start_date. Optional: country, end_date, kind (trip|residence|soft_pin), confidence (confirmed|likely|possible), evidence, title, mirror_event. Soft pins default to status=possible and stay off cities/map until confidence=confirmed. Zelle/Venmo money belongs in log_transaction — not here. ($0.10; API key required)

Input parameters:

- `city` (string, required)
- `confidence` (string)
- `country` (string)
- `date` (string): Alias for start_date
- `end_date` (string)
- `evidence` (string): Source note (Gmail id, address, etc.)
- `idempotency_key` (string): Alias for request_id.
- `kind` (string)
- `mirror_event` (boolean): Also insert category=travel calendar event (default true)
- `request_id` (string): Client idempotency key (retries return original result).
- `start_date` (string): YYYY-MM-DD
- `title` (string)

Output parameters:

- `confidence` (string)
- `event_id` (string|null)
- `kind` (string)
- `message` (string|null)
- `note` (string|null)
- `trip` (object)

### `create_person` (~126 tokens)

Create Contact

Add a Dayze Contacts record; checks duplicates first. Advertised name create_person is stable; tools/call also accepts create_contact. ($0.10; API key required)

Input parameters:

- `aliases` (array)
- `email` (string)
- `idempotency_key` (string): Alias for request_id.
- `name` (string, required)
- `notes` (string)
- `phone` (string)
- `relationship` (string)
- `request_id` (string): Client idempotency key (retries return original result).
- `tier` (string)

Output parameters:

- `created` (boolean)
- `message` (string|null)
- `person` (object): CRM person record.

### `merge_people` (~178 tokens)

Merge People

Apply a reviewed durable preview atomically; undo_contact_change accepts restore_id for 30 days if unchanged. Fold duplicate CRM contact(s) into primary_person_id (same human, spelling variants). Prefer score_people_duplicates first. Not for “X knows Y” — use link_people for relationships. ($0.10; API key required)

Input parameters:

- `duplicate_person_ids` (array, required)
- `idempotency_key` (string): Alias for request_id.
- `preview_id` (string, required): Durable preview_id returned by merge_people_preview; review the 30-day restore window before applying.
- `primary_person_id` (string, required)
- `request_id` (string): Client idempotency key (retries return original result).
- `restore_window_acknowledged` (boolean, required): Must be true — confirms the 30-day restore window was reviewed before apply.

Output parameters:

- `merged_person_ids` (array)
- `message` (string|null)
- `person` (object): CRM person record.
- `restore_expires_at` (string)
- `restore_id` (string)
- `reversible` (boolean)

### `score_people_duplicates` (~59 tokens)

Score People Duplicates

Score likely CRM duplicate pairs before merge_people. ($0.05; API key required)

Input parameters:

- `limit` (number)
- `min_probability` (number)
- `person_id` (string): Score against one person; omit for global scan.

Output parameters:

- `candidates` (array)
- `count` (number)

### `link_people` (~142 tokens)

Link People

NON-DESTRUCTIVE: create/update a person_connections edge between two distinct people (friends/family/knows/…). Both contacts remain. Do not use for duplicate cleanup — use merge_people. ($0.10; API key required)

Input parameters:

- `confidence` (number)
- `direction` (string)
- `idempotency_key` (string): Alias for request_id.
- `notes` (string)
- `other_person_id` (string, required)
- `person_id` (string, required)
- `relationship_type` (string)
- `request_id` (string): Client idempotency key (retries return original result).
- `source` (string)

Output parameters:

- `connection` (object)
- `linked` (boolean)
- `message` (string|null)

### `get_person_connections` (~34 tokens)

Get Person Connections

List graph edges for one CRM person. ($0.05; API key required)

Input parameters:

- `person_id` (string, required)

Output parameters:

- `connections` (array)
- `count` (number)
- `person` (object)

### `unlink_people` (~84 tokens)

Unlink People

Remove a person↔person graph edge. ($0.10; API key required)

Input parameters:

- `connection_id` (string)
- `idempotency_key` (string): Alias for request_id.
- `other_person_id` (string)
- `person_id` (string)
- `request_id` (string): Client idempotency key (retries return original result).

Output parameters:

- `message` (string|null)
- `unlinked` (boolean)

### `set_primary_person_name` (~122 tokens)

Set Primary Person Name

Rename a CRM contact’s canonical name and refresh slug. By default preserves the old name as a former_name alias. Prefer this over create+merge for spelling fixes. Dayze is the context layer — bounded mutation only. ($0.10; API key required)

Input parameters:

- `idempotency_key` (string): Alias for request_id.
- `name` (string, required)
- `person_id` (string, required)
- `preserve_old_name_as_alias` (boolean)
- `request_id` (string): Client idempotency key (retries return original result).

Output parameters:

- `change_id` (string|null)
- `message` (string|null)
- `person` (object): CRM person record.
- `previous_name` (string)

### `update_person_identity` (~159 tokens)

Update Person Identity

Patch identity fields (legal/preferred name, pronouns, social handles, user_relationships[]). Never infer sensitive identity from appearance. Confirmed user_relationships are preserved unless force=true. ($0.10; API key required)

Input parameters:

- `aliases` (array)
- `force` (boolean)
- `idempotency_key` (string): Alias for request_id.
- `legal_name` (string)
- `person_id` (string, required)
- `preferred_name` (string)
- `pronouns` (string)
- `request_id` (string): Client idempotency key (retries return original result).
- `social_handles` (object)
- `user_relationships` (array)
- `website` (string)

Output parameters:

- `change_id` (string|null)
- `changed` (object)
- `message` (string|null)
- `person` (object)

### `add_person_alias` (~96 tokens)

Add Person Alias

Add a nickname/payment handle/misspelling alias for one CRM person. ($0.05; API key required)

Input parameters:

- `alias` (string, required)
- `alias_kind` (string)
- `idempotency_key` (string): Alias for request_id.
- `person_id` (string, required)
- `request_id` (string): Client idempotency key (retries return original result).
- `source` (string)

Output parameters:

- `alias` (string)
- `aliases` (array)
- `change_id` (string|null)
- `message` (string|null)
- `person_id` (string)

### `remove_person_alias` (~74 tokens)

Remove Person Alias

Remove one alias from a CRM person. ($0.05; API key required)

Input parameters:

- `alias` (string, required)
- `idempotency_key` (string): Alias for request_id.
- `person_id` (string, required)
- `request_id` (string): Client idempotency key (retries return original result).

Output parameters:

- `alias` (string)
- `change_id` (string|null)
- `message` (string|null)
- `person_id` (string)
- `removed` (boolean)

### `update_person_alias` (~99 tokens)

Update Person Alias

Update alias_kind/source/display for an existing alias. ($0.05; API key required)

Input parameters:

- `alias` (string, required)
- `alias_display` (string)
- `alias_kind` (string)
- `idempotency_key` (string): Alias for request_id.
- `person_id` (string, required)
- `request_id` (string): Client idempotency key (retries return original result).
- `source` (string)

Output parameters:

- `alias` (object)
- `change_id` (string|null)
- `message` (string|null)
- `person_id` (string)

### `audit_people` (~79 tokens)

Audit People (compact)

CONTEXT LAYER: server-side contact hygiene. Returns compact candidate clusters only (duplicates, entity-type hints, normalization, payment-handle collisions). Do NOT use get_people bulk dumps for cleanup. ($0.10; API key required)

Input parameters:

- `checks` (array)
- `limit` (number)
- `min_confidence` (number)

Output parameters:

- `candidates` (array)
- `count` (number)
- `guidance` (string)
- `summary` (object)

### `merge_people_preview` (~105 tokens)

Merge People Preview

Save a durable restore snapshot without modifying contacts before merge_people. Returns resulting name/aliases, preserved counts, field conflicts, safe_to_merge. ($0.05; API key required)

Input parameters:

- `duplicate_person_ids` (array, required)
- `field_choices` (object)
- `idempotency_key` (string): Alias for request_id.
- `primary_person_id` (string, required)
- `request_id` (string): Client idempotency key (retries return original result).

Output parameters:

- `field_conflicts` (array)
- `graph_edges_preserved` (number)
- `interactions_preserved` (number)
- `manifest` (object)
- `photos_preserved` (number)
- `preview_id` (string)
- `primary_person_id` (string)
- `restore_window_days` (number)
- `resulting_aliases` (array)
- `resulting_name` (string|null)
- `reversible` (boolean)
- `safe_to_merge` (boolean)
- `transactions_preserved` (number)
- `warnings` (array)

### `undo_contact_change` (~101 tokens)

Undo Contact Change

Reverse a reversible contact_mutations row (rename, alias, identity, classify, link). For merges, pass restore_id as change_id within 30 days. Restore rejects later edits rather than overwriting them. ($0.10; API key required)

Input parameters:

- `change_id` (string, required)
- `idempotency_key` (string): Alias for request_id.
- `request_id` (string): Client idempotency key (retries return original result).

Output parameters:

- `change_id` (string)
- `message` (string|null)
- `undone` (boolean)

### `update_people_link` (~121 tokens)

Update People Link

Patch an existing person↔person graph edge (type/context/source/confidence). ($0.10; API key required)

Input parameters:

- `confidence` (number)
- `connection_id` (string)
- `idempotency_key` (string): Alias for request_id.
- `notes` (string)
- `other_person_id` (string)
- `person_id` (string)
- `relationship_type` (string)
- `request_id` (string): Client idempotency key (retries return original result).
- `source` (string)

Output parameters:

- `connection` (object)
- `message` (string|null)
- `updated` (boolean)

### `get_people_links` (~40 tokens)

Get People Links

Alias of get_person_connections — list graph edges for one CRM person. ($0.05; API key required)

Input parameters:

- `person_id` (string, required)

Output parameters:

- `connections` (array)
- `count` (number)
- `person` (object)

### `classify_contact` (~116 tokens)

Classify Contact

Set entity_type (person/company/merchant/…) on a CRM row without losing transactions or links. ($0.10; API key required)

Input parameters:

- `confidence` (number)
- `entity_id` (string)
- `entity_type` (string, required)
- `idempotency_key` (string): Alias for request_id.
- `identity_status` (string)
- `person_id` (string)
- `request_id` (string): Client idempotency key (retries return original result).
- `source` (string)

Output parameters:

- `change_id` (string|null)
- `message` (string|null)
- `person` (object)

### `convert_contact_entity` (~92 tokens)

Convert Contact Entity

Convert a contact’s entity_type (same as classify_contact). Preserves FKs. ($0.10; API key required)

Input parameters:

- `entity_id` (string)
- `idempotency_key` (string): Alias for request_id.
- `person_id` (string)
- `request_id` (string): Client idempotency key (retries return original result).
- `target_type` (string, required)

Output parameters:

- `change_id` (string|null)
- `message` (string|null)
- `person` (object)

### `find_identity_candidates` (~61 tokens)

Find Identity Candidates

Compact identity resolution candidates by person_id or query (alias/name/payment signals). Prefer over bulk get_people. ($0.05; API key required)

Input parameters:

- `limit` (number)
- `person_id` (string)
- `query` (string)

Output parameters:

- `candidates` (array)
- `count` (number)

### `normalize_people_preview` (~75 tokens)

Normalize People Preview

Preview whitespace/phone/handle normalization changes (no title-case of stylized names). ($0.05; API key required)

Input parameters:

- `idempotency_key` (string): Alias for request_id.
- `request_id` (string): Client idempotency key (retries return original result).
- `rules` (array)

Output parameters:

- `changes` (array)
- `count` (number)
- `preview_id` (string)

### `normalize_people_apply` (~65 tokens)

Normalize People Apply

Apply a normalize_people_preview by preview_id. ($0.10; API key required)

Input parameters:

- `candidate_hash` (string, required)
- `idempotency_key` (string): Alias for request_id.
- `preview_id` (string, required)
- `request_id` (string, required)

Output parameters:

- `applied` (number)
- `change_id` (string|null)
- `message` (string|null)

### `start_people_cleanup` (~94 tokens)

Start People Cleanup

Server-side read-only cleanup audit. Returns a review queue; never automatically merges contacts. Use normalize_people_preview/apply for reversible normalization. ($0.15; API key required)

Input parameters:

- `auto_merge_threshold` (number)
- `checks` (array)
- `idempotency_key` (string): Alias for request_id.
- `request_id` (string): Client idempotency key (retries return original result).

Output parameters:

- `auto_merged_count` (number)
- `cleanup_id` (string)
- `items_needing_approval` (number)
- `message` (string|null)
- `status` (string)

### `get_people_cleanup_result` (~36 tokens)

Get People Cleanup Result

Fetch start_people_cleanup result by cleanup_id. ($0.05; API key required)

Input parameters:

- `cleanup_id` (string, required)

Output parameters:

- `cleanup_id` (string)
- `status` (string)

### `dismiss_clarification` (~79 tokens)

Dismiss Clarification

Dismiss a pending entity clarification (not_person, etc.). ($0.05; API key required)

Input parameters:

- `clarification_id` (string, required)
- `idempotency_key` (string): Alias for request_id.
- `reason` (string)
- `request_id` (string): Client idempotency key (retries return original result).

Output parameters:

- `dismissed` (boolean)
- `message` (string|null)

### `resolve_clarification` (~85 tokens)

Resolve Clarification

Link a clarification surface to an existing person. ($0.10; API key required)

Input parameters:

- `clarification_id` (string, required)
- `idempotency_key` (string): Alias for request_id.
- `person_id` (string)
- `person_name` (string)
- `request_id` (string): Client idempotency key (retries return original result).

Output parameters:

- `message` (string|null)
- `person_id` (string)
- `resolved` (boolean)

### `bulk_dismiss_clarifications` (~81 tokens)

Bulk Dismiss Clarifications

Dismiss non-person / typed junk from the clarification queue. ($0.05; API key required)

Input parameters:

- `entity_type` (string)
- `idempotency_key` (string): Alias for request_id.
- `reason` (string)
- `request_id` (string): Client idempotency key (retries return original result).

Output parameters:

- `dismissed` (number)
- `message` (string|null)

### `link_entities` (~113 tokens)

Link Entities

Link Trip→Stay→Place / Event→Person (graph, not prose). ($0.10; API key required)

Input parameters:

- `from_id` (string, required)
- `from_type` (string, required)
- `idempotency_key` (string): Alias for request_id.
- `link_type` (string)
- `notes` (string)
- `request_id` (string): Client idempotency key (retries return original result).
- `to_id` (string, required)
- `to_type` (string, required)

Output parameters:

- `link` (object)
- `linked` (boolean)
- `message` (string|null)

### `get_entity_links` (~48 tokens)

Get Entity Links

List graph edges for an event, trip, place, or person. ($0.05; API key required)

Input parameters:

- `entity_id` (string, required)
- `entity_type` (string, required)

Output parameters:

- `count` (number)
- `links` (array)

### `add_inventory_item` (~66 tokens)

Add Inventory Item

Add an owned object to Life Inventory. ($0.10; API key required)

Input parameters:

- `idempotency_key` (string): Alias for request_id.
- `name` (string, required)
- `request_id` (string): Client idempotency key (retries return original result).

Output parameters:

- `inventory_id` (string)
- `item` (object): Inventory item record.
- `message` (string|null)

### `get_inventory` (~23 tokens)

Get Inventory

Browse owned inventory with filters. ($0.10; API key required)

Output parameters:

- `count` (number)
- `items` (array)

### `get_inventory_item` (~36 tokens)

Get Inventory Item

Full item with valuations, people links, assets. ($0.10; API key required)

Input parameters:

- `inventory_id` (string, required)

Output parameters:

- `assets` (array)
- `item` (object): Inventory item record.
- `people_links` (array)
- `valuations` (array)

### `update_inventory_item` (~243 tokens)

Update Inventory Item

PATCH semantics — unspecified fields untouched. ($0.10; API key required)

Input parameters:

- `brand` (string)
- `category` (string): Broad type: clothing, instruments, electronics, …
- `condition` (string)
- `estimated_value` (number)
- `idempotency_key` (string): Alias for request_id.
- `inventory_id` (string, required)
- `item_type` (string): Alias for subtype.
- `location` (string)
- `model` (string)
- `name` (string): What the user naturally calls the item.
- `notes` (string)
- `purchase_price` (number)
- `reference_number` (string)
- `request_id` (string): Client idempotency key (retries return original result).
- `serial_number` (string)
- `status` (string)
- `subtype` (string): Specific subtype (sweatshirt, jacket, guitar). Alias: item_type.
- `subtype_confidence` (number): 0–1 confidence when subtype is uncertain (agent_inferred).
- `tags` (array): Replace tags array (sanitized against category mismatches).

Output parameters:

- `changed` (object)
- `item` (object): Inventory item record.
- `message` (string|null)

### `archive_inventory_item` (~72 tokens)

Archive Inventory Item

Archive instead of destructive delete. ($0.10; API key required)

Input parameters:

- `idempotency_key` (string): Alias for request_id.
- `inventory_id` (string, required)
- `reason` (string)
- `request_id` (string): Client idempotency key (retries return original result).

Output parameters:

- `archived` (boolean)
- `inventory_id` (string)
- `message` (string|null)

### `search_inventory` (~56 tokens)

Search Inventory

Search owned inventory by name/brand/model/notes. Returns photo_count, has_photos, cover_url; when empty, photo_hint explains upload_asset linkage. ($0.10; API key required)

Input parameters:

- `query` (string)

Output parameters:

- `count` (number)
- `items` (array)
- `query` (string|null)

### `add_inventory_valuation` (~79 tokens)

Add Inventory Valuation

Append immutable valuation observation. ($0.10; API key required)

Input parameters:

- `currency` (string)
- `idempotency_key` (string): Alias for request_id.
- `inventory_id` (string, required)
- `request_id` (string): Client idempotency key (retries return original result).
- `value` (number, required)

Output parameters:

- `message` (string|null)
- `valuation` (object)

### `get_inventory_valuations` (~36 tokens)

Get Inventory Valuations

Chronological valuation history for an item. ($0.10; API key required)

Input parameters:

- `inventory_id` (string, required)

Output parameters:

- `count` (number)
- `valuations` (array)

### `link_inventory_person` (~86 tokens)

Link Inventory Person

Provenance link e.g. inherited_from, gifted_by. ($0.10; API key required)

Input parameters:

- `idempotency_key` (string): Alias for request_id.
- `inventory_id` (string, required)
- `person_id` (string, required)
- `relationship` (string, required)
- `request_id` (string): Client idempotency key (retries return original result).

Output parameters:

- `link` (object)
- `message` (string|null)

### `upload_asset` (~214 tokens)

Upload Asset

Upload image bytes to Dayze storage (WebP re-encode strips EXIF/AI metadata). Returns asset_id. For inventory item photos: pass entity_type=inventory, entity_id=inventory_id, role=photo, image_base64 from chat images. Or upload then attach_asset. ($0.15; API key required)

Input parameters:

- `asset_type` (string): photo | receipt | certificate | document | thumbnail | …
- `description` (string)
- `entity_id` (string)
- `entity_type` (string): inventory_item maps to inventory
- `filename` (string)
- `idempotency_key` (string): Alias for request_id.
- `image_base64` (string)
- `metadata` (object)
- `mime_type` (string)
- `parent_asset_id` (string)
- `request_id` (string): Client idempotency key (retries return original result).
- `role` (string): original | cover | thumbnail | …
- `url` (string)

Output parameters:

- `asset` (object)
- `asset_id` (string)
- `message` (string|null)
- `metadata_stripped` (boolean)

### `get_asset` (~48 tokens)

Get Asset

Fetch one asset by asset_id with signed_url for download/processing. ($0.05; API key required)

Input parameters:

- `asset_id` (string, required)
- `include_signed_url` (boolean)

Output parameters:

- `asset` (object)
- `count` (number)

### `update_asset` (~128 tokens)

Update Asset

Patch role, metadata, description, or parent_asset_id (e.g. mark as processed). ($0.08; API key required)

Input parameters:

- `asset_id` (string, required)
- `asset_type` (string)
- `description` (string)
- `filename` (string)
- `idempotency_key` (string): Alias for request_id.
- `metadata` (object)
- `parent_asset_id` (string)
- `request_id` (string): Client idempotency key (retries return original result).
- `role` (string): original | cover | thumbnail | …

Output parameters:

- `asset` (object)
- `asset_id` (string)
- `message` (string|null)
- `updated` (boolean)

### `archive_asset` (~75 tokens)

Archive Asset

Soft-delete an asset (sets archived_at). Original rows are preserved for versioning. ($0.05; API key required)

Input parameters:

- `asset_id` (string, required)
- `idempotency_key` (string): Alias for request_id.
- `request_id` (string): Client idempotency key (retries return original result).

Output parameters:

- `archived` (boolean)
- `asset` (object)
- `asset_id` (string)
- `message` (string|null)

### `upload_photo` (~73 tokens)

Upload Photo

Upload a photo to a Life Graph entity. Accepts image_base64 or url (one required). Re-encodes via WebP (strips EXIF/AI metadata). Person uploads also write the CRM gallery (person_photos) and avatar when set_as_avatar=true. ($0.15; API key required)

Output parameters:

- `asset` (object)
- `asset_id` (string)
- `avatar_updated` (boolean)
- `message` (string|null)
- `metadata_stripped` (boolean)
- `optimized` (object)
- `photo_id` (string|null)
- `url` (string|null)

### `attach_asset` (~157 tokens)

Attach Asset

Link an existing asset_id to another entity by creating a linked copy (does not move the original row). Roles: original | processed | thumbnail | cover | document | receipt | certificate | other. Legacy: pass url instead of asset_id. ($0.10; API key required)

Input parameters:

- `asset_id` (string)
- `asset_type` (string)
- `entity_id` (string, required)
- `entity_type` (string, required)
- `idempotency_key` (string): Alias for request_id.
- `metadata` (object)
- `request_id` (string): Client idempotency key (retries return original result).
- `role` (string): original | cover | thumbnail | …
- `url` (string)

Output parameters:

- `asset` (object)
- `asset_id` (string)
- `attached` (boolean)
- `message` (string|null)

### `get_entity_assets` (~63 tokens)

Get Entity Assets

List assets linked to an entity (role, signed_url, versions). entity_type inventory_item → inventory. ($0.10; API key required)

Input parameters:

- `asset_type` (string)
- `entity_id` (string, required)
- `entity_type` (string, required)

Output parameters:

- `assets` (array)
- `count` (number)

### `log_expense` (~140 tokens)

Log Expense

Create an outgoing expense only. For money received (Venmo/Cash App/PayPal/Zelle) use log_transaction with direction=from and type=income. ($0.10; API key required)

Input parameters:

- `amount` (number, required)
- `category` (string)
- `currency` (string)
- `date` (string)
- `description` (string)
- `idempotency_key` (string): Alias for request_id.
- `merchant` (string): Payee name (defaults when omitted)
- `notes` (string)
- `request_id` (string): Client idempotency key (retries return original result).

Output parameters:

- `expense` (object): Expense/income transaction row.
- `expense_id` (string)
- `message` (string|null)

### `log_transaction` (~290 tokens)

Log Transaction

Income/expense/transfer write. direction=from + type=income for Venmo/Stripe/refunds received. Positive amount; external_id dedupes imports. Optional project/tags. Zelle always USD. Optional mirror_event creates a calendar Money · annotation (ledger is still the source of truth for /money). ($0.10; API key required)

Input parameters:

- `account_id` (string): Stable provider account identity for imported payments.
- `amount` (number, required)
- `currency` (string)
- `date` (string)
- `direction` (string, required)
- `external_id` (string)
- `extractor_version` (string)
- `idempotency_key` (string): Alias for request_id.
- `merchant` (string)
- `message_id` (string)
- `mirror_event` (boolean): Also insert optional Money · calendar event (default false)
- `notes` (string)
- `payment_method` (string)
- `person_id` (string)
- `project` (string): Venture/project label → stored as project:{slug} tag (e.g. Max Soko poker venture)
- `request_id` (string): Client idempotency key (retries return original result).
- `source` (string)
- `tags` (array): Optional tags. Prefer project: / ext: / rail: grammar.
- `type` (string)

Output parameters:

- `direction` (string)
- `duplicate` (boolean)
- `event_id` (string|null)
- `expense_id` (string)
- `message` (string|null)
- `transaction` (object): Expense/income transaction row.
- `transaction_id` (string)
- `type` (string)

### `import_venmo_gmail` (~178 tokens)

Import Venmo Gmail

Search connected Gmail for Venmo receipts and write log_transaction rows with external_id=venmo-gmail-{gmail_id} (idempotent). Optional dry_run, max_results, query, mirror_event, account. Prefer this over calendar-only Money · digs. ($0.15; API key required)

Input parameters:

- `account` (string): Mailbox email or connection id
- `dry_run` (boolean)
- `email` (string): Alias for account
- `idempotency_key` (string): Alias for request_id.
- `max_results` (number)
- `mirror_event` (boolean): Also create Money · calendar annotations
- `query` (string): Override Gmail search (default from:venmo.com paid/payment)
- `request_id` (string): Client idempotency key (retries return original result).

Output parameters:

- `duplicates` (number)
- `imported` (number)
- `query` (string)
- `results` (array)
- `scanned` (number)
- `skipped` (number)

### `import_uber_gmail` (~140 tokens)

Import Uber Gmail

Search connected Gmail for Uber trip receipts and write log_place_visit rows with sources gmail:uber-{gmail_id} (idempotent). Optional dry_run, max_results, query, account. ($0.15; API key required)

Input parameters:

- `account` (string)
- `dry_run` (boolean)
- `email` (string)
- `idempotency_key` (string): Alias for request_id.
- `max_results` (number)
- `query` (string): Override Gmail search (default from:uber.com receipt/trip)
- `request_id` (string): Client idempotency key (retries return original result).

Output parameters:

- `duplicates` (number)
- `imported` (number)
- `query` (string)
- `results` (array)
- `scanned` (number)
- `skipped` (number)

### `log_income` (~153 tokens)

Log Income

Record money received (Stripe, refunds, payroll, Venmo). Alias of log_transaction with type=income and direction=from. Use external_id for Stripe/Gmail idempotency. ($0.10; API key required)

Input parameters:

- `amount` (number, required)
- `currency` (string)
- `date` (string)
- `external_id` (string)
- `idempotency_key` (string): Alias for request_id.
- `merchant` (string)
- `notes` (string)
- `payment_method` (string)
- `person_id` (string)
- `request_id` (string): Client idempotency key (retries return original result).
- `source` (string)

Output parameters:

- `direction` (string)
- `duplicate` (boolean)
- `event_id` (string|null)
- `expense_id` (string)
- `message` (string|null)
- `transaction` (object): Expense/income transaction row.
- `transaction_id` (string)
- `type` (string)

### `update_expense` (~187 tokens)

Update Expense

PATCH an expense row. ($0.10; API key required)

Input parameters:

- `amount` (number)
- `category` (string)
- `currency` (string)
- `date` (string): YYYY-MM-DD expense_date
- `description` (string)
- `expense_id` (string, required)
- `external_id` (string): Optional; merges ext:{source}:{id} into tags
- `idempotency_key` (string): Alias for request_id.
- `merchant` (string)
- `notes` (string)
- `payment_method` (string): e.g. venmo, cash, card
- `project` (string): Venture label → project:{slug} tag
- `request_id` (string): Client idempotency key (retries return original result).
- `source` (string): Alias of payment_method
- `tags` (array)

Output parameters:

- `changed` (object)
- `expense` (object): Expense/income transaction row.
- `message` (string|null)

### `record_purchase` (~86 tokens)

Record Purchase

Atomic expense + optional inventory item creation. ($0.10; API key required)

Input parameters:

- `amount` (number, required)
- `currency` (string)
- `date` (string)
- `idempotency_key` (string): Alias for request_id.
- `name` (string, required)
- `request_id` (string): Client idempotency key (retries return original result).

Output parameters:

- `expense_id` (string|null)
- `inventory_id` (string|null)
- `message` (string|null)
- `transaction` (object): Expense/income transaction row.

### `record_sale` (~92 tokens)

Record Sale

Mark inventory sold + record sale proceeds with gain/loss. ($0.10; API key required)

Input parameters:

- `amount` (number, required)
- `currency` (string)
- `idempotency_key` (string): Alias for request_id.
- `inventory_id` (string, required)
- `request_id` (string): Client idempotency key (retries return original result).
- `sold_at` (string)

Output parameters:

- `expense_id` (string|null)
- `inventory_id` (string)
- `message` (string|null)
- `realized_gain_loss` (string|null)

### `get_transactions` (~138 tokens)

Get Transactions

List expense/income/transfer rows (includes tags, payment_method). Filter with tag=project:… or project=… ($0.10; API key required)

Input parameters:

- `cursor` (string): Continue the same immutable one-hour snapshot; other filters remain frozen.
- `from` (string)
- `include_archived` (boolean)
- `limit` (number)
- `project` (string): Project label or slug → project:{slug}
- `tag` (string): Exact tag, e.g. project:max-soko-poker-venture or rail:zelle
- `to` (string)
- `type` (string)

Output parameters:

- `count` (number)
- `transactions` (array)

### `search_transactions` (~93 tokens)

Search Transactions

Keyword search over merchant/description/category, or exact tag query (project:/ext:/rail:). ($0.10; API key required)

Input parameters:

- `cursor` (string): Continue the same immutable one-hour snapshot; other filters remain frozen.
- `include_archived` (boolean)
- `limit` (number)
- `project` (string)
- `query` (string)
- `tag` (string)

Output parameters:

- `count` (number)
- `query` (string)
- `transactions` (array)

### `search_photos` (~72 tokens)

Search Photos

Search person photos and entity assets by query/metadata. Returns inline MCP image attachments. ($0.10; API key required)

Input parameters:

- `from` (string)
- `person_ids` (array)
- `place_id` (string)
- `query` (string)
- `to` (string)

Output parameters:

- `count` (number)
- `photos` (array)
- `query` (string|null)

### `get_photo` (~40 tokens)

Get Photo

Single photo metadata + secure URL. Returns inline MCP image attachment when available. ($0.10; API key required)

Input parameters:

- `photo_id` (string, required)

Output parameters:

- `photo` (object): Photo or entity asset metadata.

### `get_photos_for_event` (~34 tokens)

Photos For Event

Assets linked to an event. ($0.10; API key required)

Input parameters:

- `event_id` (string, required)

Output parameters:

- `count` (number)
- `event_id` (string)
- `photos` (array)

### `get_person_photos` (~62 tokens)

Person Photos

Gallery image URLs for a CRM contact. Returns photos[{ id, url, is_primary, created_at }] plus inline MCP image attachments for chat render. Accepts person_id. ($0.10; API key required)

Input parameters:

- `person_id` (string, required)

Output parameters:

- `count` (number)
- `person_id` (string)
- `photos` (array)

### `get_photos_for_place` (~35 tokens)

Photos For Place

Assets linked to a canonical place. ($0.10; API key required)

Input parameters:

- `place_id` (string, required)

Output parameters:

- `count` (number)
- `photos` (array)
- `place_id` (string)

### `cleanup_preview` (~104 tokens)

cleanup preview

Read-only account audit and durable archive plan for events, expenses or trips. Returns source hashes, linked records, field differences, rollback payloads and a review queue. Review the exact candidate set before cleanup_apply. Preview expires after 30 minutes. ($0; API key required)

Input parameters:

- `family` (string, required)
- `idempotency_key` (string): Alias for request_id.
- `request_id` (string): Client idempotency key (retries return original result).

Output parameters:

- `candidate_hash` (string)
- `changed` (boolean)
- `expires_at` (string)
- `preview_id` (string)
- `restore_id` (string)
- `rows` (array)
- `server_time` (string)

### `cleanup_apply` (~90 tokens)

cleanup apply

Atomically archive the exact reviewed preview. Requires preview_id, candidate_hash and request_id. Refuses changed sources. Returns per-row statuses and restore_id; replay performs no additional actions. ($0; API key required)

Input parameters:

- `candidate_hash` (string, required)
- `idempotency_key` (string): Alias for request_id.
- `preview_id` (string, required)
- `request_id` (string, required)

Output parameters:

- `candidate_hash` (string)
- `changed` (boolean)
- `expires_at` (string)
- `preview_id` (string)
- `restore_id` (string)
- `rows` (array)
- `server_time` (string)

### `archive_event` (~78 tokens)

archive event

Reversibly archive one owned event; preserve linked data and return restore_id. Use a new request_id for each intended action. ($0; API key required)

Input parameters:

- `event_id` (string, required)
- `idempotency_key` (string): Alias for request_id.
- `reason` (string)
- `request_id` (string, required)

Output parameters:

- `candidate_hash` (string)
- `changed` (boolean)
- `expires_at` (string)
- `preview_id` (string)
- `restore_id` (string)
- `rows` (array)
- `server_time` (string)

### `archive_expense` (~79 tokens)

archive expense

Reversibly archive one owned expense; preserve linked data and return restore_id. Use a new request_id for each intended action. ($0; API key required)

Input parameters:

- `expense_id` (string, required)
- `idempotency_key` (string): Alias for request_id.
- `reason` (string)
- `request_id` (string, required)

Output parameters:

- `candidate_hash` (string)
- `changed` (boolean)
- `expires_at` (string)
- `preview_id` (string)
- `restore_id` (string)
- `rows` (array)
- `server_time` (string)

### `archive_trip` (~78 tokens)

archive trip

Reversibly archive one owned trip; preserve linked data and return restore_id. Use a new request_id for each intended action. ($0; API key required)

Input parameters:

- `idempotency_key` (string): Alias for request_id.
- `reason` (string)
- `request_id` (string, required)
- `trip_id` (string, required)

Output parameters:

- `candidate_hash` (string)
- `changed` (boolean)
- `expires_at` (string)
- `preview_id` (string)
- `restore_id` (string)
- `rows` (array)
- `server_time` (string)

### `restore_event` (~71 tokens)

restore event

Restore an archive or normalization receipt. Requires restore_id and request_id. Refuses intervening edits; repeats are no-ops. ($0; API key required)

Input parameters:

- `idempotency_key` (string): Alias for request_id.
- `request_id` (string, required)
- `restore_id` (string, required)

Output parameters:

- `candidate_hash` (string)
- `changed` (boolean)
- `expires_at` (string)
- `preview_id` (string)
- `restore_id` (string)
- `rows` (array)
- `server_time` (string)

### `restore_expense` (~72 tokens)

restore expense

Restore an archive or normalization receipt. Requires restore_id and request_id. Refuses intervening edits; repeats are no-ops. ($0; API key required)

Input parameters:

- `idempotency_key` (string): Alias for request_id.
- `request_id` (string, required)
- `restore_id` (string, required)

Output parameters:

- `candidate_hash` (string)
- `changed` (boolean)
- `expires_at` (string)
- `preview_id` (string)
- `restore_id` (string)
- `rows` (array)
- `server_time` (string)

### `restore_trip` (~71 tokens)

restore trip

Restore an archive or normalization receipt. Requires restore_id and request_id. Refuses intervening edits; repeats are no-ops. ($0; API key required)

Input parameters:

- `idempotency_key` (string): Alias for request_id.
- `request_id` (string, required)
- `restore_id` (string, required)

Output parameters:

- `candidate_hash` (string)
- `changed` (boolean)
- `expires_at` (string)
- `preview_id` (string)
- `restore_id` (string)
- `rows` (array)
- `server_time` (string)

### `restore_cleanup` (~71 tokens)

restore cleanup

Restore an archive or normalization receipt. Requires restore_id and request_id. Refuses intervening edits; repeats are no-ops. ($0; API key required)

Input parameters:

- `idempotency_key` (string): Alias for request_id.
- `request_id` (string, required)
- `restore_id` (string, required)

Output parameters:

- `candidate_hash` (string)
- `changed` (boolean)
- `expires_at` (string)
- `preview_id` (string)
- `restore_id` (string)
- `rows` (array)
- `server_time` (string)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/com-dayze-life-context/api-mcp-key#diagnostics

## Score history

- 2026-09-25: 71
- 2026-09-24: 70
- 2026-09-23: 70
- 2026-09-22: 69
- 2026-09-21: 69
- 2026-09-20: 68
- 2026-09-19: 68
- 2026-09-18: 68
- 2026-09-17: 78
- 2026-09-16: 77
- 2026-09-15: 77
- 2026-09-14: 76
- 2026-09-13: 76
- 2026-09-12: 75
- 2026-09-11: 75

## Common questions

### What is the Dayze — Life Context MCP server?

Dayze — Life Context is an MCP server listed in the public MCP registry as com.dayze/life-context. Life context for agents: get_context_pack + public notable packs. x402 + OAuth. This page covers its hosted endpoint (https://dayze.com/api/mcp/key).

### Is the Dayze — Life Context MCP server safe to use?

Dayze — Life Context scores 71 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Dayze — Life Context MCP server expose?

Dayze — Life Context exposes 129 tools: notable_search, notable_profile, notable_pack, notable_pack_premium, compare_lives, and 124 more. Their descriptions and schemas cost roughly 15,533 tokens of context every time the server is loaded.

### Does the Dayze — Life Context MCP server require authentication?

No. We connected to Dayze — Life Context without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the Dayze — Life Context MCP server still maintained?

Dayze — Life Context is still listed as active in the MCP registry. We last reached this channel on 25 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://dayze.com/api/mcp/key
- Repository: https://github.com/gohluke/dayze-mcp
- Website: https://dayze.com/
- Changelog RSS feed: https://verifymcp.io/servers/com-dayze-life-context/api-mcp-key.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-dayze-life-context/api-mcp-key.json
- HTML version of this page: https://verifymcp.io/servers/com-dayze-life-context/api-mcp-key
