keepsake-mcp 1.14.0 → 1.14.2

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.
Files changed (2) hide show
  1. package/build/tools.js +8 -4
  2. package/package.json +1 -1
package/build/tools.js CHANGED
@@ -145,6 +145,8 @@ export function registerAllTools(server, fetchApi) {
145
145
  last_name: z.string().optional().describe("Last name (optional)"),
146
146
  email: z.string().optional().describe("Email address"),
147
147
  phone: z.string().optional().describe("Phone number"),
148
+ job_title: z.string().optional().describe("Job title / profession, e.g. 'Product designer'"),
149
+ address: z.string().optional().describe("Postal address"),
148
150
  company: z.string().optional().describe("Company name. Links the contact to that company record (matched by name ignoring case and accents, created if missing). Adds a link, never removes one. The contact's companies are returned in `companies`."),
149
151
  birthday: z.string().optional().describe("Birthday as ISO date string (YYYY-MM-DD), e.g. '1980-02-14'"),
150
152
  notes: z.string().optional().describe("Notes about the contact"),
@@ -161,6 +163,8 @@ export function registerAllTools(server, fetchApi) {
161
163
  last_name: z.string().optional().describe("Last name"),
162
164
  email: z.string().optional().describe("Email address"),
163
165
  phone: z.string().optional().describe("Phone number"),
166
+ job_title: z.string().nullable().optional().describe("Job title / profession, e.g. 'Product designer'. Set to null to clear."),
167
+ address: z.string().nullable().optional().describe("Postal address. Set to null to clear."),
164
168
  company: z.string().optional().describe("Company name. Links the contact to that company record (matched by name ignoring case and accents, created if missing). Adds a link, never removes one. The contact's companies are returned in `companies`."),
165
169
  birthday: z.string().nullable().optional().describe("Birthday as ISO date string (YYYY-MM-DD), e.g. '1980-02-14'. Set to null to clear."),
166
170
  notes: z.string().optional().describe("Notes about the contact"),
@@ -657,7 +661,7 @@ export function registerAllTools(server, fetchApi) {
657
661
  // DAYS (Daily Summaries)
658
662
  // ===========================================================================
659
663
  server.registerTool("list_days", {
660
- description: "List stored days with their intention or question of the day. An intention stays in place until changed: `intention` is the one in force that day (the last one written on that day or before, `intention_date` = when it was written); `note` is what was written on that exact day (null = nothing written). Filter by date range.",
664
+ description: "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.",
661
665
  inputSchema: {
662
666
  from: z.string().optional().describe("Start date (YYYY-MM-DD)"),
663
667
  to: z.string().optional().describe("End date (YYYY-MM-DD)"),
@@ -669,7 +673,7 @@ export function registerAllTools(server, fetchApi) {
669
673
  return toContent(await fetchApi(`/days${qs({ from, to, limit, offset })}`));
670
674
  });
671
675
  server.registerTool("get_day", {
672
- description: "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`). An intention stays in place until changed: `intention` is the one in force that day, as the user sees it (the last one written on that day or before; `intention_date` = the day it was written), while `note` is what was written on that exact day (null = nothing written there, '' = intention stopped from that day). Always 200 — `exists: false` means no row is stored for that date; `intention` and the linked notes are returned regardless.",
676
+ description: "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.",
673
677
  inputSchema: {
674
678
  date: z.string().describe("Date (YYYY-MM-DD)"),
675
679
  },
@@ -678,10 +682,10 @@ export function registerAllTools(server, fetchApi) {
678
682
  return toContent(await fetchApi(`/days/${date}`));
679
683
  });
680
684
  server.registerTool("update_day", {
681
- description: "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.\n\nAn intention stays in place until changed: writing it on a day replaces the intention from that day onward (following days show it too, until the next day with its own intention — set one on a future date for a one-off, e.g. before a meeting). `null` removes what was written on that day (the day goes back to the intention in force before it); an empty string stops any intention from that day onward. Check `intention` with get_day before writing: you may be replacing a long-running intention the user cares about.\n\nNOT 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.",
685
+ description: "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.\n\nAn 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.\n\nNOT 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.",
682
686
  inputSchema: {
683
687
  date: z.string().describe("Date (YYYY-MM-DD)"),
684
- note: z.string().nullable().describe("The intention or question of the day: one short line (mantra, intention, single priority, or a question to keep in mind). Not a journal summary. null = remove what was written on this day (back to the previous intention); empty string = stop any intention from this day onward."),
688
+ note: z.string().nullable().describe("The intention or question of the day: one short line (mantra, intention, single priority, or a question to keep in mind). Not a journal summary. null or empty string = no intention that day."),
685
689
  },
686
690
  annotations: { title: "Update day", destructiveHint: false, idempotentHint: true, openWorldHint: false },
687
691
  }, async (params) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "keepsake-mcp",
3
- "version": "1.14.0",
3
+ "version": "1.14.2",
4
4
  "description": "MCP server for Keepsake personal CRM \u2014 connect your AI agent to your contacts, tasks, notes, and more",
5
5
  "type": "module",
6
6
  "bin": {