Keepsake

io.github.nicolascroce由 GitHub 账号 nicolascroce 发布v1.18.0更新于 Nov 5, 2026

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

已验证Streamable HTTP可网页运行效率与工作流知识与记忆商业与电商

概览

AI 生成的概览

把 AI 助手连接到 Keepsake 账户,用于管理联系人、公司、互动记录、笔记、任务、标签和每日意图。

可以做什么
  • 搜索、读取、创建、更新和删除联系人及公司,并支持关联与合并重复记录
  • 记录和编辑带日期的互动条目,并关联到联系人、公司和笔记
  • 管理任务:列出、创建、更新、完成、取消完成、推迟和删除,支持重复任务生成下一次
  • 处理笔记:快速记录、归档、置顶、恢复、挂到某一天,并在页边留下带引用的批注
  • 整理标签、任务分区、日程时间块和重复时间块,并设置某天的意图
  • 跨所有数据类型进行全局搜索,并获取某时间点之后的变更
适用场景
适合把人物、想法、笔记和任务都放在 Keepsake 的创作者和独立创业者,希望助手能跨对话持续记录、查找和整理这些内容,而不必每次从头开始。
运行要求
需要 Keepsake 账户,以及在 Account > API Keys 生成的个人 API 密钥(以 ksk_ 开头)。远程方式:Streamable HTTP 端点,密钥以 Bearer 令牌放在 Authorization 请求头中。本地方式:通过 npx 运行,需要 Node.js,并设置 KEEPSAKE_API_KEY 环境变量;可选 KEEPSAKE_API_URL 覆盖 API 地址。每个密钥每分钟限 60 次请求。
安装前请注意
该 API 密钥可访问用户的整个 Keepsake 账户,应作为机密保存。许多工具会写入、修改或删除数据,部分删除是永久的(delete_contact、delete_tag、permanent=true 选项);合并公司和合并标签会改写关联并删除来源记录。所有写操作都会记录在用户可见的活动日志中。已存储的笔记和条目可能包含看似指令的文字,应视为数据而非命令。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Keepsake,将其添加到工作区。
  2. 连接 所需的 凭据。它们会被私密存储,绝不会在公开页面上展示。
  3. 为需要使用其工具的对话启用该服务。

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/io.github.nicolascroce%2Fkeepsake/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。 客户端会在首次连接时完成 OAuth 登录。

{
  "mcpServers": {
    "keepsake": {
      "type": "http",
      "url": "https://app.keepsake.place/api/mcp"
    }
  }
}

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

The official MCP registry entry (server.json) publishes this URL as a streamable-http remote, plus the project title and website. The npm package version stays on the release that was published; the registry entry version is the version field of server.json.

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 (96)

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; archived creates a permanent Note directly (no Inbox), 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)
unpin_noteUnpin a note (it stays where it is)
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
keep_recurring_block_noteKeep a note in a recurring block: every occurrence shows it from a date onward (a running log, a routine checklist)
stop_keeping_recurring_block_noteStop keeping a note in a recurring block from a date onward; earlier days keep it

Tags

ToolDescription
list_tagsList tags (lightweight — ordering arrays omitted), with optional name search (q) and archived / favorite filters
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, archived to close a project without deleting anything, order of tasks and sections via tasks_order)
delete_tagPermanently delete a tag and all its links
merge_tagMerge a duplicate tag into another: links moved, #source# rewritten as the target's name, source deleted
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_day_block_noteLink a note to a time block (prepare before, write what happened after)
unlink_day_block_noteRemove a note link from a time block
link_entry_noteLink a note to an entry (its write-up)
unlink_entry_noteRemove a note link from an entry
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

来源:README.md,提交 5a5924f

工具

96

list_contacts

List contacts

List contacts in the user's Keepsake CRM. Supports pagination, sorting, field selection (use `fields` to skip long notes when scanning many contacts), filters on linked companies and on last update, and optional last_interaction_date enrichment. Each contact's companies are company records, returned in `companies`.

输入参数sortlimitorderfieldsoffsetcompanyhas_companyupdated_sinceinclude_last_interaction

get_contact

Get contact

Get a single contact by ID, including recent entries (interactions), tags, last_interaction_date, and total_entries count.

输入参数id必填entries_limit

create_contact

Create contact

Create a new contact. first_name is required. last_name is optional (useful for contacts where you only know the first name).

输入参数emailnotesphoneaddresscompanybirthdayjob_titlelast_namefirst_name必填

update_contact

Update contact

Update an existing contact. Only send the fields you want to change.

输入参数id必填emailnotesphoneaddresscompanybirthdayjob_titlelast_namefirst_name

delete_contact

Delete contact

Permanently delete a contact and all associated data.

输入参数id必填

search_contacts

Search contacts

Search contacts by name, email, company, etc. Search is accent-insensitive.

输入参数q必填

list_companies

List companies

List all companies/organizations in the user's Keepsake CRM. Supports pagination and sorting.

输入参数sortlimitorderoffset

get_company

Get company

Get a single company by ID, including linked contacts (with roles) and tags.

输入参数id必填

create_company

Create company

Create a new company/organization. Only 'name' is required.

输入参数name必填emailnotesphoneaddresswebsite

update_company

Update company

Update an existing company. Only send the fields you want to change.

输入参数id必填nameemailnotesphoneaddresswebsite

delete_company

Delete company

Soft-delete a company. Use permanent=true for hard delete.

输入参数id必填permanent

merge_companies

Merge companies

Merge a duplicate company INTO another one: its contacts, entries and tags move to the target (no duplicates), the target's empty details (website, email, phone, address) are filled from it, its notes are appended to the target's, then it is deleted. Use it when two records describe the same organization (e.g. 'CNCP' and 'Cncp'). Confirm with your user which record to keep.

输入参数source_id必填target_id必填

search_companies

Search companies

Search companies by name, email, website, or address. Search is accent-insensitive.

输入参数q必填

list_entries

List entries

List interaction entries (calls, emails, meetings, events, etc.). Supports filtering by type, contact, company, tag (page) and date range.

输入参数tofromtypelimitoffsettag_idcompany_idcontact_id

create_entry

Create entry

An ENTRY is a dated interaction log tied to contacts. Records something that happened (call, meeting, email…) on a specific date. Create a new interaction entry. Content supports #tag# and [[tag]] syntax for automatic tag linking.

输入参数date必填type必填contenttag_idsnote_idscompany_idscontact_idsday_block_id

update_entry

Update entry

Update an existing entry. Only send fields you want to change.

输入参数id必填datetypecontenttag_idscompany_idscontact_ids

delete_entry

Delete entry

Delete an interaction entry.

输入参数id必填

list_tasks

List tasks

List tasks. Filter by status (pending/completed), date_type, specific date, company, or tag (page) — e.g. tag_id + status=pending lists a project's open tasks.

输入参数datelimitoffsetstatustag_iddate_typecompany_id

get_task

Get task

Get a single task by ID, with its tags, linked contacts (contact_ids), linked companies (company_ids) and linked notes (note_ids). Use it when you already know which task you need instead of listing everything.

输入参数id必填

create_task

Create task

A TASK is an action item to accomplish. Can have due date, recurrence, priority, linked to contacts and tags. Create a new task. Title supports #tag# and [[tag]] for automatic tag linking.

输入参数datetitle必填tag_idsprioritydate_typestart_timecompany_idscontact_idsdescriptionrecurrence_typeduration_minutesrecurrence_interval

update_task

Update task

Update an existing task. Only send fields you want to change.

输入参数id必填datetitletag_idsprioritydate_typestart_timecompany_idscontact_idsdescriptionduration_minutes

delete_task

Delete task

Delete a task.

输入参数id必填

complete_task

Complete task

Mark a task as completed. If the task is recurring, this automatically creates the next occurrence.

输入参数id必填

uncomplete_task

Uncomplete task

Mark a completed task as pending again.

输入参数id必填

snooze_task

Snooze task

Reschedule a task to a new date.

输入参数id必填date必填date_type

list_notes

List notes

List notes. QuickNotes (inbox, not yet archived) and Notes (archived, permanent). Filter by pinned or archived status, by tag (page) with `tag_id`, by the day(s) a note is linked to (`date`, or `date_from`/`date_to`) — e.g. "what did I note for tomorrow?" —, or by publication-flow stage with `status` — e.g. "which notes are waiting for review?". Each note carries `dates` (the days it is linked to) and `status` (its stage in the publication flow, or null).

输入参数datelimitoffsetpinnedstatustag_iddate_toarchiveddate_fromcompany_id

list_note_statuses

List note statuses

List the stages of the user's publication flow, in order (by default: Idea → In progress → To review → Ready → Published). A note enters this flow when the user may publish it — most notes never do and have no stage. Stages are the user's own: they can rename, recolor, add or remove them, so read this list before setting a stage with update_note or create_note. `category` is fixed: unstarted, started, or published (exactly one stage). Names are in the user's app language.

无需输入参数。

get_note

Get note

Get a single note by ID, including its tags, linked contacts, linked tasks, linked notes and the days it is linked to (`dates`). Use this when the user points you at one specific note (e.g. gives you its URL — the UUID is the last path segment) instead of listing everything.

输入参数id必填

create_note

Create note

Create a new QuickNote in the Inbox. QuickNotes are temporary captures — use archive_note to transform one into a permanent Note, or pass archived=true to create the permanent Note directly (reference material the user asked you to keep — a project's status note, meeting minutes filed on a page — rather than a capture for them to sort). Content supports #tag# and [[tag]] for automatic tag linking. Pass `dates` to attach the note to one or more days ("note for tomorrow", meeting prep for Thursday): it then surfaces in that day's view while staying in the notes list. A dated note is NOT a task (no action to complete) and NOT the day's intention (see update_day).

输入参数datesstatuscontent必填archivedis_pinnedcompany_idscontact_ids

update_note

Update note

Update an existing QuickNote or Note. `dates` REPLACES the full set of days the note is linked to — the way to move a note to another day ("not done, push it to tomorrow"). To add or remove a single day without touching the others, prefer link_note_date / unlink_note_date. `status` moves the note along the publication flow ("this one is ready"); setting a stage on an Inbox QuickNote also keeps it as a Note.

输入参数id必填datesstatuscontenttag_idscompany_idscontact_ids

delete_note

Delete note

Soft-delete a QuickNote or Note. Use permanent=true for hard delete.

输入参数id必填permanent

pin_note

Pin note

Pin a QuickNote or Note so it stays in view. A pin is a POST-IT: a short reference the user wants always at hand (gate code, hotel room number, Wi-Fi password). Do not pin a note just because it is important — meeting prep is linked to its day, project material to a tag, actions become tasks. Pin only when the user asks or the note is clearly such a post-it.

输入参数id必填

unpin_note

Unpin note

Unpin a note: it leaves the pinned post-its and stays where it is (Inbox or Notes), nothing else changes. Use when a pinned reference is no longer needed at hand — e.g. a project status note replaced by a newer one, or a project being closed.

输入参数id必填

archive_note

Archive note

Transform a QuickNote into a permanent Note (archive it). Notes appear on contact pages, tag pages, and the Notes section.

输入参数id必填

restore_note

Restore note

Restore a Note back to a QuickNote in the Inbox (unarchive), or restore a deleted note from trash.

输入参数id必填

list_days

List days

List stored days with their intention or question of the day (`note`; `intention` repeats it, null when empty). An intention is valid for its own day only — it does not carry over to the following days. Filter by date range.

输入参数tofromlimitoffset

get_day

Get day

Get a specific day by date: its intention or question of the day AND the notes linked to that day (field `notes`, via link_note_date / `dates`). `note` is the intention written for that day (null or '' = none; `intention` repeats it). An intention is valid for its own day only — it does not carry over. Always 200 — `exists: false` means no row is stored for that date; `intention` and the linked notes are returned regardless.

输入参数date必填

update_day

Update day

Create or update a day's intention or question of the day (upsert on the date). The `note` field is the intention or question of the day — one short line at the top of the Today view (a mantra, an intention, a single priority, or a question to keep in mind). Not a journal: never write a summary of the day here. An intention is valid for its own day only: it does not carry over to the following days. The user types it by hand each morning, on purpose — do not set it for them unless they ask. `null` or an empty string removes it. NOT for attaching a note to a day: this field is a single line and you would overwrite the user's intention. To put a note on a day, use create_note with `dates` or link_note_date.

输入参数date必填note必填

list_day_blocks

List day blocks

List the time blocks of a day's timeline (Day view), in timeline order. A block is either an activity (type 'block') or a task bucket (type 'tasks' — groups the day's untimed tasks). The meta carries the day's raw timeline_order: "b:<uuid>" refs are blocks, bare uuids are tasks inside a bucket's run. Recurring blocks: listing today or a future day first creates that day's recurring blocks if they do not exist yet (same as opening the day in the app), so every block returned has a real id you can update or mark done. A block that repeats carries `repeats: { recurring_block_id, weekdays }` (ISO weekdays, 1 = Monday … 7 = Sunday); otherwise `repeats` is null. Past days are never filled in afterwards. Notes: each block carries `notes` ([{ id, title, content }], real Keepsake notes linked to the block — prepared before, completed after), `note` (the first note's text) and `entry_id` (the short entry that tells the block, created by the app's "Add details" or by create_entry with day_block_id; null if none). A recurring block also carries `kept_notes` (same shape): notes kept by its repetition, shown on every occurrence from the day they were kept (see keep_recurring_block_note) — `notes` and `note` are that day's own notes only.

输入参数date必填

create_day_block

Create day block

Create a time block on a day's timeline. The block is auto-placed in the earliest free gap large enough for it (same first-fit engine as the app); pass anchor_time to pin it at a fixed hour instead. Its "b:<id>" ref is inserted into the day's timeline_order for you — never write timeline_order by hand.

输入参数date必填notetypetitleanchor_timeduration_minutes

update_day_block

Update day block

Update a time block (title, duration, anchor, note, done). Only send fields you want to change. The block keeps its position in the timeline order. Marking a block done records when it actually happened: it ends now and starts its planned duration earlier (never before the previous done block ended). In the app, a done block then stays at that time in the past of the day, while what is left to do stacks from the current time. A block with a fixed time keeps its hour.

输入参数id必填donenotetitleanchor_timeduration_minutes

delete_day_block

Delete day block

Delete a time block. Its ref is pruned from the day's timeline_order; for a task bucket, the tasks themselves are untouched (they fall back to the day's computed bucket). On a recurring block, this removes it from THAT DAY ONLY (the app's "Remove from today"): the block keeps coming back on the other days, and the skipped day does not break the habit streak. To stop the repetition itself, use stop_recurring_block.

输入参数id必填

list_recurring_blocks

List recurring blocks

List the user's recurring time blocks: their ideal day / ideal week ("Meditation" every day at 08:00, "Writing" on weekday mornings). A recurring block is also a habit: each day it appears on the timeline as a regular block the user checks off (see list_day_blocks), and consecutive checked days form a streak. `weekdays` is the rule in force on the given date; `next_change` announces a rule already recorded for later (a repetition that starts or stops on a future date). `notes` lists the notes the repetition keeps ([{ note_id, title, from_date, until_date }], until_date excluded, null = no end; see keep_recurring_block_note).

输入参数dateinclude_stopped

create_recurring_block

Create recurring block

Make a time block come back on chosen weekdays. Two ways: pass `block_id` to turn an EXISTING block into a recurring one (it becomes the first occurrence and keeps its title, duration and fixed time — do this when the block is already on the timeline, otherwise that day would get it twice), or describe a new one (title, duration, optional fixed time) starting on `start_date`. Nothing is created on the timeline right away: each day's block appears when that day is opened in the app or listed with list_day_blocks. With `anchor_time` the block sits at that hour every day; without it, it is placed from the user's wake time and shifts with it.

输入参数typetitleblock_idweekdays必填start_dateanchor_timeduration_minutes

update_recurring_block

Update recurring block

Change a recurring block FROM A DATE ONWARD (title, duration, fixed time, weekdays). The past is never rewritten: earlier days keep their blocks as they were, and the habit keeps its history. Upcoming occurrences already created and not yet checked are updated, or removed if their day is no longer planned. To change a single day only, use update_day_block on that day's block instead.

输入参数id必填titleweekdaysfrom_dateanchor_timeduration_minutes

stop_recurring_block

Stop recurring block

Stop a recurring block from a date onward (the app's "Stop repeating"). Past days keep their blocks and the habit keeps its history; upcoming occurrences already created and not yet checked are removed. To skip a single day and keep the repetition, use delete_day_block on that day's block.

输入参数id必填from_date

list_tags

List tags

List tags (lightweight: the manual tasks_order arrays are omitted — use get_tag for a tag's full ordering). Tags organize contacts, entries, tasks, notes, and companies. Use q to find a tag by name. Archived tags (closed projects) are included unless you pass archived=false; each tag's archived_at tells which.

输入参数qlimitoffsetarchivedfavorite

get_tag

Get tag

Get a single tag by ID with all its properties (name, description, color, icon, view mode, favorite status). Includes tasks_order, the manual ordering of the tag page's task list, where entries of the form "h:<header_id>" are section separators (see list_task_headers).

输入参数id必填

get_tag_items

Get tag items

Get items linked to a tag. By default returns every type in full — on large tags that can be a huge response, so prefer types/status/summary to narrow it (e.g. types=['tasks'], status='pending', summary=true to review a project's open tasks). When tasks are included, the response also contains `sections`: the tag page's task sections with their task_ids (header_id null = tasks outside any section).

输入参数id必填typesstatussummary

create_tag

Create tag

A TAG is a thematic grouping space. Syntax: #name# or [[name]]. Groups notes, entries, tasks, and contacts. Create a new tag. If a tag with the same name already exists, returns the existing tag.

输入参数name必填description

update_tag

Update tag

Update an existing tag. Only send the fields you want to change. Supports name, description, color, icon, favorite status, archiving, and the order of the page's tasks and sections (tasks_order). The description is the place for a page's state (status, deadline, next step): there is no separate field for it.

输入参数id必填iconnamecolorarchiveddescriptionis_favoritetasks_order

delete_tag

Delete tag

Permanently delete a tag and all its links to contacts, entries, tasks, notes, and companies. Its #tag# / [[tag]] markers are stripped from all content (the words stay). To fold a duplicate into another tag, use merge_tag instead.

输入参数id必填

merge_tag

Merge tags

Merge a duplicate tag (page) INTO another one: all its links (contacts, entries, tasks, notes, companies) move to the target without duplicates, every #source# / [[source]] in content is rewritten as the target's name, then the source tag is deleted. Use it when two pages describe the same project or theme (e.g. 'Livre' and 'livre photo'), or when update_tag refuses a rename because the name already exists. Confirm with your user which page to keep.

输入参数source_id必填target_id必填

list_task_headers

List task headers

List all task headers (section separators used to group tasks on tag pages and day views).

输入参数limitoffset

get_task_header

Get task header

Get a single task header by ID.

输入参数id必填

create_task_header

Create task header

Create a new task header (section separator). To show it on a tag page, insert "h:<header_id>" into that tag's tasks_order (get_tag, then update_tag) where the section should start: the tasks listed after it belong to that section.

输入参数name必填collapseddescription

update_task_header

Update task header

Update a task header. Only send the fields you want to change.

输入参数id必填namecollapseddescription

delete_task_header

Delete task header

Permanently delete a task header.

输入参数id必填

link_entry_contact

Link entry contact

Link an existing contact to an entry.

输入参数entry_id必填contact_id必填

unlink_entry_contact

Unlink entry contact

Remove the link between a contact and an entry.

输入参数entry_id必填contact_id必填

link_entry_company

Link entry company

Link a company to an entry (the company becomes a participant of that interaction). Idempotent. Companies are separate records from contacts: use this (or company_ids) for an organization, link_entry_contact for a person.

输入参数entry_id必填company_id必填

unlink_entry_company

Unlink entry company

Remove the link between a company and an entry.

输入参数entry_id必填company_id必填

keep_recurring_block_note

Keep recurring block note

Keep a note in a recurring block (the app's "Keep for the following days"): from `from_date` on, every occurrence of the repetition shows it — a running log for a project block, a checklist for a routine. Days already planned are included, earlier days are untouched. Nothing is copied: it is one note, the same everywhere. A note written in a recurring block belongs to that day only until it is kept. Get repetition ids from list_recurring_blocks (or `repeats.recurring_block_id` in list_day_blocks); each repetition lists its kept notes in `notes`.

输入参数note_id必填from_daterecurring_block_id必填

stop_keeping_recurring_block_note

Stop keeping recurring block note

Stop keeping a note in a recurring block (the app's "Stop keeping"): occurrences on or after `from_date` no longer show it, earlier days keep it. The note itself survives. To keep it on one particular day only, link it to that day's block afterwards with link_day_block_note.

输入参数note_id必填from_daterecurring_block_id必填

link_entry_note

Link entry note

Link an existing note to an entry (N-N, non-destructive): the note is the write-up of that interaction, shown as a preview on the entry's card. Typical case: after a meeting block, the short entry ("Meeting · Coffee with Constance") points to the note where the user prepared then wrote the meeting.

输入参数note_id必填entry_id必填

unlink_entry_note

Unlink entry note

Remove the link between a note and an entry. Both the entry and the note survive.

输入参数note_id必填entry_id必填

get_contact_timeline

Get contact timeline

Get a unified, chronological feed of ALL items related to a contact — entries, tasks, and notes — sorted by date (most recent first). Much more efficient than fetching entries, tasks, and notes separately.

输入参数id必填tofromtypelimitoffset

get_tasks_today

Get today's tasks

Get all tasks for today: overdue tasks + tasks due today + ASAP tasks. Each task has a 'category' field ('overdue', 'today', or 'asap'). Includes counts per category.

无需输入参数。

get_tasks_overdue

Get overdue tasks

Get only overdue tasks (pending tasks with a due date before today). Sorted by date ascending (oldest first).

无需输入参数。

get_changelog

Get changelog

Get all items modified since a given timestamp, across all entity types. Perfect for 'heartbeat' checks to see what changed since your last visit. Returns server_time to use as 'since' for the next call.

输入参数typelimitsince必填

list_note_comments

List note comments

List the marginalia attached to a note. A marginalia is working material the user keeps ALONGSIDE a note without it entering the text: an idea, a reference, a link, an excerpt pasted to rewrite a passage later. They are never published, and they are meant to be TEMPORARY — anything worth keeping becomes a note or a linked task. Each one is either attached to a specific passage (`quote` is set) or to the whole note (`quote` is null).

输入参数note_id必填

create_note_comment

Create note comment

Write in the margin of a note. This is the right move whenever your user asks you to review, critique, proofread or annotate their text: the remark lives alongside the note without ever entering it, and it stays there after the conversation ends — unlike anything you write in the chat. Anchor a remark to a passage by copying that passage VERBATIM into `quote`; the server locates it and stores the surrounding context so the comment survives later edits. Omit `quote` to comment on the note as a whole. A quote that is not found verbatim is refused rather than attached to the wrong place. Your comments render in blue ink in the app, your user's in red — they always know who wrote what. Do not use this to rewrite their text: propose, they decide. And keep comments few and substantive: a note peppered with them is a note the user abandons.

输入参数body必填quotenote_id必填

update_note_comment

Update note comment

Edit the content of a marginalia. There is no intermediate state: a marginalia exists, or it is deleted. A remark that should outlive the note's revision becomes a note or a linked task instead.

输入参数body必填note_id必填comment_id必填

delete_note_comment

Delete note comment

Delete a marginalia. Marginalia are temporary by design, so this is the normal way to retire one — there is no recoverable middle state.

输入参数note_id必填comment_id必填

get_agent_instructions

Get agent instructions

Get best practices and instructions for being an effective Keepsake AI agent. Call this at the start of each session to refresh your instructions.

无需输入参数。

版本历史

10
  1. v1.18.0最新Nov 4, 2026
  2. v1.17.0Nov 1, 2026
  3. v1.16.0Oct 11, 2026
  4. v1.15.1Oct 9, 2026
  5. v1.15.0Oct 9, 2026
  6. v1.14.2Oct 9, 2026
  7. v1.14.0Oct 6, 2026
  8. v1.13.0Oct 5, 2026
  9. v1.12.0Sep 29, 2026
  10. v1.10.0Sep 16, 2026

评分

已满足适用检查项的 100%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分