keepsake-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| KEEPSAKE_API_KEY | Yes | Your Keepsake API key (starts with ksk_) | |
| KEEPSAKE_API_URL | No | Custom API URL (default: https://app.keepsake.place/api/v1) |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_contactsA | List all contacts in the user's Keepsake CRM. Supports pagination, sorting, and optional last_interaction_date enrichment. |
| get_contactA | Get a single contact by ID, including recent entries (interactions), tags, last_interaction_date, and total_entries count. |
| create_contactA | Create a new contact. first_name is required. last_name is optional (useful for contacts where you only know the first name). |
| update_contactA | Update an existing contact. Only send the fields you want to change. |
| delete_contactA | Permanently delete a contact and all associated data. |
| search_contactsA | Search contacts by name, email, company, etc. Search is accent-insensitive. |
| list_companiesA | List all companies/organizations in the user's Keepsake CRM. Supports pagination and sorting. |
| get_companyA | Get a single company by ID, including linked contacts (with roles) and tags. |
| create_companyB | Create a new company/organization. Only 'name' is required. |
| update_companyA | Update an existing company. Only send the fields you want to change. |
| delete_companyA | Soft-delete a company. Use permanent=true for hard delete. |
| search_companiesA | Search companies by name, email, website, or address. Search is accent-insensitive. |
| list_entriesA | List interaction entries (calls, emails, meetings, events, etc.). Supports filtering by type, contact, and date range. |
| create_entryA | 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. |
| update_entryA | Update an existing entry. Only send fields you want to change. |
| delete_entryA | Delete an interaction entry. |
| list_tasksB | List tasks. Filter by status (pending/completed), date_type, or specific date. |
| create_taskA | 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. |
| update_taskA | Update an existing task. Only send fields you want to change. |
| delete_taskB | Delete a task. |
| complete_taskA | Mark a task as completed. If the task is recurring, this automatically creates the next occurrence. |
| uncomplete_taskA | Mark a completed task as pending again. |
| snooze_taskB | Reschedule a task to a new date. |
| list_notesA | List notes. QuickNotes (inbox, not yet archived) and Notes (archived, permanent). Filter by pinned or archived status. |
| create_noteA | Create a new QuickNote in the Inbox. QuickNotes are temporary captures — use archive_note to transform one into a permanent Note. Content supports #tag# and [[tag]] for automatic tag linking. |
| update_noteA | Update an existing QuickNote or Note. |
| delete_noteA | Soft-delete a QuickNote or Note. Use permanent=true for hard delete. |
| pin_noteA | Pin a QuickNote or Note so it appears at the top of the Inbox. |
| archive_noteA | Transform a QuickNote into a permanent Note (archive it). Notes appear on contact pages, tag pages, and the Notes section. |
| restore_noteA | Restore a Note back to a QuickNote in the Inbox (unarchive), or restore a deleted note from trash. |
| list_daysA | List daily journal summaries. Filter by date range. |
| get_dayA | Get a specific day's journal summary by date. |
| update_dayA | Create or update a daily journal summary. If a day entry already exists for this date, it will be updated (upsert). |
| list_tagsB | List all tags. Tags organize contacts, entries, tasks, notes, and companies. |
| get_tagA | Get a single tag by ID with all its properties (name, description, color, icon, view mode, favorite status). |
| get_tag_itemsA | Get all items linked to a specific tag: contacts, entries, tasks, notes, and companies with counts. |
| create_tagA | 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. |
| update_tagA | Update an existing tag. Only send the fields you want to change. Supports name, description, color, icon, view mode, and favorite status. |
| delete_tagA | Permanently delete a tag and all its links to contacts, entries, tasks, notes, and companies. |
| link_tagA | Link an entity (contact, entry, task, note, or company) to a tag. |
| unlink_tagA | Remove the link between an entity and a tag. |
| list_task_headersA | List all task headers (section separators used to group tasks on tag pages and day views). |
| get_task_headerA | Get a single task header by ID. |
| create_task_headerA | Create a new task header (section separator). Add it to a tag's items_order to position it. |
| update_task_headerA | Update a task header. Only send the fields you want to change. |
| delete_task_headerB | Permanently delete a task header. |
| link_note_contactA | Link an existing contact to a note. |
| unlink_note_contactA | Remove the link between a contact and a note. |
| link_entry_contactB | Link an existing contact to an entry. |
| unlink_entry_contactA | Remove the link between a contact and an entry. |
| link_task_contactA | Link an existing contact to a task. |
| unlink_task_contactA | Remove the link between a contact and a task. |
| link_task_noteA | Link an existing note to a task (non-destructive, N-N). The note stays in the inbox/notes list and the task keeps a live link back to it — use this instead of deleting a note after creating a task from it. The note shows its linked tasks; the task shows the source note. |
| unlink_task_noteA | Remove the link between a note and a task. Both the task and the note survive. |
| link_notesA | Link two notes together (knowledge base, N-N, non-destructive). The link is symmetric: both notes list each other in their linked-notes section. Use this to connect related ideas — e.g. a note that made you think of another one. Notes can also be linked inline by writing label in a note's content. |
| unlink_notesA | Remove the manual link between two notes (both notes survive). Links derived from inline label markdown in a note's content are preserved — edit the content to remove those. |
| get_contact_timelineA | 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. |
| get_tasks_todayA | 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_overdueA | Get only overdue tasks (pending tasks with a due date before today). Sorted by date ascending (oldest first). |
| get_changelogA | 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. |
| searchA | Search across all Keepsake data — contacts, entries, tasks, notes, and companies. Search is accent-insensitive (e.g., 'berenice' finds 'Bérénice'). |
| get_agent_instructionsA | Get best practices and instructions for being an effective Keepsake AI agent. Call this at the start of each session to refresh your instructions. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/nicolascroce/keepsake-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server