keepsake-mcp 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -1
- package/build/tools.js +40 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -100,7 +100,7 @@ Add to `.cursor/mcp.json` in your project:
|
|
|
100
100
|
}
|
|
101
101
|
```
|
|
102
102
|
|
|
103
|
-
## Available tools (
|
|
103
|
+
## Available tools (62)
|
|
104
104
|
|
|
105
105
|
### Contacts
|
|
106
106
|
| Tool | Description |
|
|
@@ -192,6 +192,10 @@ Add to `.cursor/mcp.json` in your project:
|
|
|
192
192
|
| `unlink_entry_contact` | Remove a contact link from an entry |
|
|
193
193
|
| `link_task_contact` | Link a contact to a task |
|
|
194
194
|
| `unlink_task_contact` | Remove a contact link from a task |
|
|
195
|
+
| `link_task_note` | Link a note to a task (non-destructive, the note survives) |
|
|
196
|
+
| `unlink_task_note` | Remove a note link from a task |
|
|
197
|
+
| `link_notes` | Link two notes together (symmetric, non-destructive) |
|
|
198
|
+
| `unlink_notes` | Remove the manual link between two notes |
|
|
195
199
|
|
|
196
200
|
### Utilities
|
|
197
201
|
| Tool | Description |
|
package/build/tools.js
CHANGED
|
@@ -692,6 +692,46 @@ export function registerAllTools(server, fetchApi) {
|
|
|
692
692
|
}, async ({ task_id, contact_id }) => {
|
|
693
693
|
return toContent(await fetchApi(`/tasks/${task_id}/contacts/${contact_id}`, "DELETE"));
|
|
694
694
|
});
|
|
695
|
+
server.registerTool("link_task_note", {
|
|
696
|
+
description: "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.",
|
|
697
|
+
inputSchema: {
|
|
698
|
+
task_id: z.string().uuid().describe("Task UUID"),
|
|
699
|
+
note_id: z.string().uuid().describe("Note UUID"),
|
|
700
|
+
},
|
|
701
|
+
annotations: { title: "Link task note", destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
702
|
+
}, async ({ task_id, note_id }) => {
|
|
703
|
+
return toContent(await fetchApi(`/tasks/${task_id}/notes/${note_id}`, "POST"));
|
|
704
|
+
});
|
|
705
|
+
server.registerTool("unlink_task_note", {
|
|
706
|
+
description: "Remove the link between a note and a task. Both the task and the note survive.",
|
|
707
|
+
inputSchema: {
|
|
708
|
+
task_id: z.string().uuid().describe("Task UUID"),
|
|
709
|
+
note_id: z.string().uuid().describe("Note UUID"),
|
|
710
|
+
},
|
|
711
|
+
annotations: { title: "Unlink task note", destructiveHint: true, idempotentHint: true, openWorldHint: false },
|
|
712
|
+
}, async ({ task_id, note_id }) => {
|
|
713
|
+
return toContent(await fetchApi(`/tasks/${task_id}/notes/${note_id}`, "DELETE"));
|
|
714
|
+
});
|
|
715
|
+
server.registerTool("link_notes", {
|
|
716
|
+
description: "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](note:uuid) in a note's content.",
|
|
717
|
+
inputSchema: {
|
|
718
|
+
note_id: z.string().uuid().describe("First note UUID"),
|
|
719
|
+
target_note_id: z.string().uuid().describe("Second note UUID"),
|
|
720
|
+
},
|
|
721
|
+
annotations: { title: "Link notes", destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
722
|
+
}, async ({ note_id, target_note_id }) => {
|
|
723
|
+
return toContent(await fetchApi(`/notes/${note_id}/links/${target_note_id}`, "POST"));
|
|
724
|
+
});
|
|
725
|
+
server.registerTool("unlink_notes", {
|
|
726
|
+
description: "Remove the manual link between two notes (both notes survive). Links derived from inline [label](note:uuid) markdown in a note's content are preserved — edit the content to remove those.",
|
|
727
|
+
inputSchema: {
|
|
728
|
+
note_id: z.string().uuid().describe("First note UUID"),
|
|
729
|
+
target_note_id: z.string().uuid().describe("Second note UUID"),
|
|
730
|
+
},
|
|
731
|
+
annotations: { title: "Unlink notes", destructiveHint: true, idempotentHint: true, openWorldHint: false },
|
|
732
|
+
}, async ({ note_id, target_note_id }) => {
|
|
733
|
+
return toContent(await fetchApi(`/notes/${note_id}/links/${target_note_id}`, "DELETE"));
|
|
734
|
+
});
|
|
695
735
|
// ===========================================================================
|
|
696
736
|
// CONTACT TIMELINE
|
|
697
737
|
// ===========================================================================
|