platehome

Connect your agent

MCP · streamable http · oauth or bearer tokens

plate exposes a remote MCP server — any MCP-capable agent can read and write your journal. This page is the honest, kept-in-sync statement of what that surface can and cannot do.

  • Endpoint — https://journal.crisislabs.dev/api/mcp (MCP Streamable HTTP, stateless)
  • Auth — OAuth if your client supports connectors (claude.ai, ChatGPT): nothing to paste. Otherwise a personal access token as a bearer header, created in self · tokens, shown once at creation and stored hashed.
  • Rate limit — 120 requests per minute per token.

claude.ai / ChatGPT connectors

Add a custom connector pointed at the endpoint above and pick OAuth when asked how to authenticate — no token pasting needed. The connector registers itself, sends you here to sign in, and shows a consent screen naming exactly what it may do (read your journal, write entries). Approve and you're connected.

Connected apps are listed at self · tokens — disconnect there any time; the app has to re-ask from scratch. Access granted to an app already holding a token ends within the hour.

Claude Code

claude mcp add --transport http plate https://journal.crisislabs.dev/api/mcp \
  --header "Authorization: Bearer YOUR_TOKEN"

Claude Desktop

Desktop launches stdio servers, so bridge the remote endpoint with mcp-remote in claude_desktop_config.json:

{
  "mcpServers": {
    "plate": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "https://journal.crisislabs.dev/api/mcp",
        "--header",
        "Authorization: Bearer YOUR_TOKEN"
      ]
    }
  }
}

Any other MCP client

Anything that speaks MCP Streamable HTTP and can send a custom header works the same way: POST JSON-RPC to the endpoint with Authorization: Bearer YOUR_TOKEN and Accept: application/json, text/event-stream.

What the surface offers

Read tools — ping, get_agenda (the agenda as the app shows it: open tasks with how long each has waited, deferred tasks, the week's events, the month's tasks; Google Calendar events are not included), get_daily_log (one day), get_carryover (every task still open from a day before today, with how long each has been open and how many times it has been carried forward), query_entries (date-range + status/type/tag filters, capped at 100 with a truncated flag), search_entries (text search, up to 50 matches), get_monthly_log (the month's monthly-log entries), get_stats (aggregate counts by status/type/tag), get_habits (each habit with its streak and the days it was kept).

Write tools — create_entry, update_entry_status, update_entry_content, set_entry_signifiers, update_entry_tag, update_entry_time, delete_entry (soft delete), migrate_entry (defer a task to a later day or month), create_habit, check_in_habit (tick or untick a day). Every write accepts an optional clientMutationId making retries exactly-once. Migration in particular should always pass one: a blind retry duplicates the target.

Prompts — daily-review, weekly-reflection and plan-the-week: guided rituals that surface as slash commands in clients that support MCP prompts.

What your agent can and can't see

Every entry sits in one of two zones: agent-visible or private. Agent-visible entries are readable in full. A private entry's content is encrypted under a key the server does not hold, so the surface cannot serve it to an agent even if asked — this is a property of the keys, not a filter that could be flipped off.

  • Listing reads (get_daily_log, query_entries, get_monthly_log) return private entries as structure only: content: null, private: true, plus a privateCount on the result. Date, type, status, signifiers, and tag are plaintext columns, so the shape of your day stays legible without the words.
  • search_entries never covers the private zone — the server can't match text it can't decrypt. It reports privateNotSearched so an agent can tell you it skipped entries rather than conclude you wrote nothing.
  • get_stats counts both zones, with privateCount naming the difference. "You wrote 3 private entries yesterday" is answerable; what they said is not.
  • Entries your agent creates are always agent-visible. It saw the text as it wrote it and the server sealed it — marking that private would be a false claim, and would hide the entry from the one reader who already has it.

The trade this encodes: sharing an entry with your agent means sharing it with the server. Agent search covering the visible zone only is the trust model, not a gap in it.

Limits, honestly stated

Tokens are full-access or read-only, chosen at creation — no finer scopes yet (OAuth mirrors the same two as journal:write / journal:read). Write tools refuse read-only tokens with a clear error. No collections access. Deletes are soft but irreversible via the API.