mcpField
K
keepsake

keepsake

Local
github.com/nicolascroceProductivity1Updated 3w ago

About keepsake

keepsake-mcp connects AI assistants to Keepsake, a workspace for creators and solo entrepreneurs to organize ideas, tasks, contacts, and notes. Its tools also manage daily intentions, linked records, and a publication workflow.

Key features

  1. 01Manage contacts and companies
  2. 02Log interactions and tasks
  3. 03Create and link notes
  4. 04Track daily intentions and time blocks
  5. 05Organize records with tags
  6. 06Search across data

Use cases

  1. 01Capture an idea and tag it for later
  2. 02Find recent interactions with a contact
  3. 03Check overdue tasks and schedule follow-ups
  4. 04Move notes through a publishing workflow

MCP support

The MCP server connects through remote Streamable HTTP or local stdio using an API key. It exposes tools for Keepsake records and a review_note prompt.

Configuration

Local server config is the same for every client. Copy it into your client’s MCP config file.

mcp.json · Universal config
{
"mcpServers": {
"nicolascroce-keepsake": {
"command": "npx",
"args": [
"-y",
"keepsake-mcp"
],
"env": {
"KEEPSAKE_API_KEY": "<KEEPSAKE_API_KEY>"
}
}
}
}
Run commandnpx -y keepsake-mcp
Environment variables to set
KEEPSAKE_API_KEYSecretYour Keepsake API key (starts with ksk_). Get one at https://keepsake.place → Account → API Keys.

Local servers need a runtime on your machine (e.g. Node.js 18+). Config file locations differ by client; see your client’s docs.

Packages
npmkeepsake-mcp1.16.0

Tools

88

Saved tool list · updated 2w ago

ParameterTypeRequiredDescription
sortstringNoSort field: last_name, first_name, created_at, updated_at
limitintegerNoMax results (default 20, max 100)
orderenumNoSort orderasc | desc
fieldsarrayNoOnly return these fields (id is always included). Columns: first_name, last_name, email, phone, job_title, address, birth_day, birth_month, birth_year, notes, created_at, updated_at. Computed: companies, last_interaction_date. Omit for everything.
offsetintegerNoPagination offset
companystringNoOnly contacts linked to this company: a company UUID, or part of its name (case and accents ignored)
has_companybooleanNotrue: only contacts linked to at least one company; false: only contacts without any company
updated_sincestringNoOnly contacts updated after this ISO date or timestamp
include_last_interactionbooleanNoInclude last_interaction_date for each contact (default: false)

Details

From the project README

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
Option A: Remote (HTTP) — recommended

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):

{
  "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):

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

Claude Code:

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:

{
  "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
Contact & company links
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

Comments

Markdown supported

New to MCP?

From what the protocol is to installing your first server, these answers cover most first questions.

An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.