MCP server: One MCP server.

Keepsake

@nicolascroceMCP server · External

Keepsake (keepsake.place), the app where creators and solo entrepreneurs empty their heads

Note takingv1.16.0MITTypeScript
Freeno charge per call

Runs on your machine from its package; the steps are below.

What it does

  1. Reads
  2. Writes
  3. High impact

At most: only reads or looks up information.

What it costs

Free

Odel charges nothing per call. The publisher may charge for its own service.

Runs locally over stdio

This server isn't hosted — your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).

npmkeepsake-mcpv1.16.0

Run

npx -y keepsake-mcp

MCP client config

{
  "mcpServers": {
    "keepsake": {
      "command": "npx",
      "args": [
        "-y",
        "keepsake-mcp"
      ]
    }
  }
}
README9 min read

keepsake-mcp

MCP server for Keepsake (keepsake.place), the app where creators and solo entrepreneurs empty their heads: ideas, tasks and the people who matter, together and linked in one place, all the way to publishing.

Connect your AI assistant (Claude, Cursor, or any MCP-compatible client) to your Keepsake data: contacts, interactions, tasks, notes, daily intentions, companies, and tags.

Why

Your AI assistant forgets between conversations; Keepsake remembers. Ask it to:

  • "Capture this idea for my next article in #newsletter#"
  • "Who did I last talk to at Acme Corp?"
  • "Add a note that I ran into Sarah at the conference"
  • "What tasks are overdue?"
  • "Show me everything related to the #house-project tag"
  • "Create a follow-up task for my meeting with John next week"

Quick start

1. Get your API key

Sign up at keepsake.place, then go to Account > API Keys to generate one.

2. Choose your connection method

No installation required. Works with Claude iOS, Claude web, Claude Desktop Connectors, and any MCP client that supports Streamable HTTP.

Endpoint: https://app.keepsake.place/api/mcp

Authentication: Pass your API key as a Bearer token in the Authorization header.

Claude Desktop (Connectors):

Add a remote MCP server in Claude Desktop settings with:

  • URL: https://app.keepsake.place/api/mcp
  • Authentication: Bearer token with your ksk_ API key

Any MCP client (Streamable HTTP):

json
{
  "mcpServers": {
    "keepsake": {
      "type": "streamable-http",
      "url": "https://app.keepsake.place/api/mcp",
      "headers": {
        "Authorization": "Bearer ksk_YOUR_API_KEY"
      }
    }
  }
}

Option B: Local (stdio)

Runs locally via npx. Useful for Claude Code, Cursor, and local development.

Claude Desktop:

Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

json
{
  "mcpServers": {
    "keepsake": {
      "command": "npx",
      "args": ["-y", "keepsake-mcp"],
      "env": {
        "KEEPSAKE_API_KEY": "ksk_YOUR_API_KEY"
      }
    }
  }
}

Claude Code:

bash
claude mcp add keepsake -- npx -y keepsake-mcp

Then set KEEPSAKE_API_KEY in your environment.

Cursor:

Add to .cursor/mcp.json in your project:

json
{
  "mcpServers": {
    "keepsake": {
      "command": "npx",
      "args": ["-y", "keepsake-mcp"],
      "env": {
        "KEEPSAKE_API_KEY": "ksk_YOUR_API_KEY"
      }
    }
  }
}

Server instructions

On connection, the server sends MCP instructions — injected into the client's system prompt. It is the only channel that reaches an agent before it goes looking for a capability, so it stays short and points at the rest: call get_agent_instructions for the full doctrine, and put editorial remarks in a note's margin (create_note_comment) rather than in the chat, which disappears.

Prompts (1)

PromptArgumentsDescription
review_notenote_idAct as the editor of a note: read it, judge form and substance, leave anchored remarks in the margin, never rewrite the text

Available tools (88)

Contacts

ToolDescription
list_contactsList contacts with pagination, sorting, field selection and filters (linked company, has_company, updated_since)
get_contactGet a contact with recent interactions, tags, and stats
create_contactCreate a new contact (company links it to a company record, created if missing)
update_contactUpdate contact fields
delete_contactPermanently delete a contact
search_contactsAccent-insensitive search by name, email, notes, phone and linked company names
get_contact_timelineUnified chronological feed of all items for a contact

Companies

ToolDescription
list_companiesList all companies
get_companyGet company with linked contacts and tags
create_companyCreate a new company
update_companyUpdate company fields
delete_companySoft-delete (or permanent delete) a company
search_companiesAccent-insensitive company search
link_contact_companyLink a contact to a company (optional role)
unlink_contact_companyRemove a contact–company link
merge_companiesMerge a duplicate company into another (contacts, entries, tags, details, notes)

Entries (Interactions)

ToolDescription
list_entriesList interactions (calls, emails, meetings, etc.) — filter by type, contact, company, page (tag_id), dates
create_entryLog a new interaction — supports #tag# and [[tag]] syntax
update_entryUpdate an interaction
delete_entryDelete an interaction

Tasks

ToolDescription
list_tasksList tasks — filter by status, date, company, page (tag_id)
get_taskGet a task with its tags, contacts, companies and linked notes
create_taskCreate a task — supports #tag# and [[tag]] syntax
update_taskUpdate task fields
delete_taskDelete a task
complete_taskMark as completed (auto-creates next occurrence for recurring tasks)
uncomplete_taskMark as pending again
snooze_taskReschedule to a new date
get_tasks_todayToday's tasks: overdue + due today + ASAP
get_tasks_overdueOnly overdue tasks

QuickNotes

ToolDescription
list_notesList notes — filter by pinned/archived, day, company, page (tag_id), publication-flow stage (status)
list_note_statusesThe stages of the user's publication flow (Idea → In progress → To review → Ready → Published by default — the user can rename, add or remove them)
get_noteGet one note by ID with its tags, contacts, tasks and linked notes
create_noteCreate a note — supports #tag# and [[tag]] syntax; status puts it straight into the publication flow
update_noteUpdate note content, links, days, or its publication-flow stage (status)
delete_noteSoft-delete (or permanent)
pin_notePin as a post-it (short reference always at hand)
archive_noteArchive a note
restore_noteRestore a deleted/archived note

Note comments (marginalia)

Material kept alongside a note without entering its text — an idea, a reference, an excerpt pasted to rewrite a passage later. Anchored to a passage by quoting it, or to the whole note. Never published, and temporary by design: anything worth keeping becomes a note or a linked task.

ToolDescription
list_note_commentsList the marginalia attached to a note
create_note_commentAttach a marginalia to a passage (pass quote) or to the whole note
update_note_commentEdit the content of a marginalia
delete_note_commentPermanently delete a marginalia

Days (intention or question of the day)

ToolDescription
list_daysList days with their intention or question of the day (the one in force, which stays until changed), by date range
get_dayGet a day, its intention in force (intention, carried over until changed) and what was written that day (note)
update_daySet a day's intention or question — one short line, not a journal (upsert); it stays in place on the following days until changed

Day blocks (Day-view timeline)

ToolDescription
list_day_blocksList a day's time blocks, in timeline order (creates that day's recurring blocks first)
create_day_blockCreate a block, auto-placed first-fit (or pinned via anchor_time)
update_day_blockUpdate a block (title, duration, anchor, note, done)
delete_day_blockDelete a block and prune its timeline ref (on a recurring block: remove it from that day only)

Recurring blocks (ideal day / ideal week, habits)

ToolDescription
list_recurring_blocksList the blocks that come back on chosen weekdays (the user's ideal week and habits)
create_recurring_blockMake a block recurring — from an existing block, or from scratch
update_recurring_blockChange a recurring block from a date onward (title, duration, fixed time, weekdays) — the past is never rewritten
stop_recurring_blockStop a repetition from a date onward; past days keep their blocks

Tags

ToolDescription
list_tagsList tags (lightweight — ordering arrays omitted), with optional name search (q)
get_tagGet a tag by ID with all properties, including tasks_order (section markers h:<header_id>)
create_tagCreate a new tag
update_tagUpdate a tag (name, description, color, icon, favorite, order of tasks and sections via tasks_order)
delete_tagPermanently delete a tag and all its links
get_tag_itemsGet items linked to a tag — filter by types/status, summary mode, task sections included
link_tagLink any entity to a tag
unlink_tagRemove a tag link

Task Headers (Sections)

ToolDescription
list_task_headersList all task headers (section separators)
get_task_headerGet a task header by ID
create_task_headerCreate a task header (section) — insert h:<id> in the tag's tasks_order to place it
update_task_headerUpdate a task header (name, description, collapsed)
delete_task_headerPermanently delete a task header
ToolDescription
link_note_company / unlink_note_companyLink / unlink a company to a note
link_note_contactLink a contact to a note
unlink_note_contactRemove a contact link from a note
link_entry_company / unlink_entry_companyAdd / remove a company as participant of an entry
link_entry_contactLink a contact to an entry
unlink_entry_contactRemove a contact link from an entry
link_task_company / unlink_task_companyLink / unlink a company to a task
link_task_contactLink a contact to a task
unlink_task_contactRemove a contact link from a task
link_task_noteLink a note to a task (non-destructive, the note survives)
unlink_task_noteRemove a note link from a task
link_notesLink two notes together (symmetric, non-destructive)
unlink_notesRemove the manual link between two notes
link_note_dateAttach a note to a calendar day (it surfaces in that day's view)
unlink_note_dateRemove a note from a calendar day (the note survives)

Utilities

ToolDescription
searchGlobal search across all data types
get_changelogItems modified since a timestamp (for sync)
get_agent_instructionsBest practices for AI agents

Tool annotations

All tools include MCP safety annotations:

  • Read-only tools (list_*, get_*, search_*): marked readOnlyHint: true
  • Create tools: marked destructiveHint: false
  • Update tools: marked destructiveHint: false, idempotentHint: true
  • Delete tools: marked destructiveHint: true, idempotentHint: true

Activity tracking

Every write operation (create, update, delete) performed through the API is recorded in an Activity Feed visible to the user inside Keepsake. Each action shows the entity type, a content preview, and which API key was used.

This means your user can see everything you do. Be transparent and precise. If you make a mistake, let the user know so they can verify in the activity feed.

Call get_agent_instructions at the start of each session for the full best practices guide.

Environment variables

VariableRequiredDescription
KEEPSAKE_API_KEYYesYour API key (starts with ksk_)
KEEPSAKE_API_URLNoCustom API URL (default: https://app.keepsake.place/api/v1)

Rate limits

60 requests per minute per API key. Rate limit headers are included in responses.

API documentation

Full REST API docs: keepsake.place/api

Privacy

Keepsake MCP server only communicates with the Keepsake API (app.keepsake.place). It does not send data to any third-party service. Your data stays between your MCP client and your Keepsake account.

All API calls are authenticated with your personal API key and scoped to your account via Row Level Security. No other user's data is accessible.

See our privacy policy at keepsake.place/privacy.

License

MIT

Similar modules

Browse Note taking