@cpenned/mcp 0.8.3 → 0.8.5

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 (47) hide show
  1. package/README.md +24 -6
  2. package/dist/client.js +40 -6
  3. package/dist/client.js.map +1 -1
  4. package/dist/config.js +1 -0
  5. package/dist/config.js.map +1 -1
  6. package/dist/server.js +16 -0
  7. package/dist/server.js.map +1 -1
  8. package/dist/tools/api.js +39 -0
  9. package/dist/tools/api.js.map +1 -0
  10. package/dist/tools/attachments.js +43 -0
  11. package/dist/tools/attachments.js.map +1 -0
  12. package/dist/tools/books.js +18 -17
  13. package/dist/tools/books.js.map +1 -1
  14. package/dist/tools/gardens.js +8 -7
  15. package/dist/tools/gardens.js.map +1 -1
  16. package/dist/tools/habits.js +26 -18
  17. package/dist/tools/habits.js.map +1 -1
  18. package/dist/tools/index.js +2 -34
  19. package/dist/tools/index.js.map +1 -1
  20. package/dist/tools/keys.js +23 -7
  21. package/dist/tools/keys.js.map +1 -1
  22. package/dist/tools/lists.js +6 -5
  23. package/dist/tools/lists.js.map +1 -1
  24. package/dist/tools/people.js +17 -15
  25. package/dist/tools/people.js.map +1 -1
  26. package/dist/tools/projects.js +11 -9
  27. package/dist/tools/projects.js.map +1 -1
  28. package/dist/tools/reading.js +11 -10
  29. package/dist/tools/reading.js.map +1 -1
  30. package/dist/tools/render.js +6 -0
  31. package/dist/tools/render.js.map +1 -1
  32. package/dist/tools/schemas.js +5 -0
  33. package/dist/tools/schemas.js.map +1 -1
  34. package/dist/tools/shares.js +4 -3
  35. package/dist/tools/shares.js.map +1 -1
  36. package/dist/tools/strava.js +13 -9
  37. package/dist/tools/strava.js.map +1 -1
  38. package/dist/tools/tags.js +8 -7
  39. package/dist/tools/tags.js.map +1 -1
  40. package/dist/tools/tasks.js +12 -10
  41. package/dist/tools/tasks.js.map +1 -1
  42. package/dist/tools/ui.js +34 -13
  43. package/dist/tools/ui.js.map +1 -1
  44. package/dist/tools/views.js +12 -10
  45. package/dist/tools/views.js.map +1 -1
  46. package/package.json +1 -1
  47. package/skills/open-brain-mcp/SKILL.md +34 -14
@@ -122,7 +122,9 @@ pre-guessing constraints.
122
122
  `assignee: "me"|"unassigned"|<userId>` filters the home vault by assignee),
123
123
  `get_task`, `update_task` (drives status), `delete_task`, batch
124
124
  `create_tasks`/`update_tasks`, `add_task_tags`/`remove_task_tags`.
125
- `create_task`/`update_task` accept `eventId` to link a synced calendar event
125
+ `create_task`/`create_tasks` accept an initial `status` (default `todo`;
126
+ e.g. `backlog` to park it). `create_task`/`update_task` accept `eventId` to
127
+ link a synced calendar event
126
128
  (read-only mirror); `eventId: null` on update unlinks it.
127
129
  `create_task`/`create_tasks`/`update_task`/`update_tasks` also accept
128
130
  `assigneeUserId` (a user id, `"me"`, or `null` to unassign) - only
@@ -132,6 +134,10 @@ pre-guessing constraints.
132
134
  `sharedFrom` marker).
133
135
  - **Projects**: `create_project`, `list_projects`, `get_project`,
134
136
  `update_project`, `delete_project`, `create_projects`/`update_projects`.
137
+ `create_project(s)` accept an initial `status` (default `todo`).
138
+ Project reads carry `taskCounts {open, done}` (canceled in neither) and
139
+ `nextTaskId` (first open task by manual order; `get_task` it to see what's
140
+ next), so progress needs no extra task listing.
135
141
  - **Gardens**: `create_garden`, `list_gardens`, `get_garden`, `update_garden`,
136
142
  `delete_garden` (archives).
137
143
  - **Tags**: `create_tag`, `list_tags`, `get_tag`, `update_tag`, `delete_tag`
@@ -142,8 +148,8 @@ pre-guessing constraints.
142
148
  (null clears a field, e.g. `contactInterval: null`; `archived: false`
143
149
  restores), `delete_person` (archives, links kept), `mark_contacted`
144
150
  (optional `at` backdates the touch), `add_person_links`/`remove_person_links`
145
- (`{id, taskIds?, projectIds?, gardenIds?, readingListItemIds?, bookIds?,
146
- people?}` — `people` is `[{id, label?}]` for person-to-person connections;
151
+ (`{id, taskIds?, projectIds?, gardenIds?, readingListItemIds?, habitIds?,
152
+ bookIds?, people?}`: `people` is `[{id, label?}]` for person-to-person connections;
147
153
  symmetric, shown on both people, re-link with a new label to change it or
148
154
  `label: null` to clear it; unlink takes the same shape, ids only for
149
155
  `people`). `create_task(s)` accept `personIds` inline; `list_tasks` filters
@@ -156,9 +162,10 @@ pre-guessing constraints.
156
162
  `archived`/`deleted` toggle independently of status), `delete_reading_item`
157
163
  (true soft delete, hidden everywhere; restore with `update_reading_item
158
164
  {deleted: false}`), `add_reading_tags`/`remove_reading_tags`.
159
- - **Habits**: `create_habit`, `list_habits`, `get_habit`, `update_habit`,
165
+ - **Habits**: `create_habit`, `list_habits` (pages; pass `cursor`), `get_habit`, `update_habit`,
160
166
  `archive_habit`/`unarchive_habit`, `complete_habit` (`quantity?`, `durationMinutes?`,
161
- `force?` skips time window), `remove_habit_completion` (by `completionId` or `day`),
167
+ `force?` skips time window), `remove_habit_completion` (by `completionId` or `day`;
168
+ a `day` lookup reaches back through the newest 200 check-ins),
162
169
  `reorder_habits`, `add_habit_tags`/`remove_habit_tags`.
163
170
  Schedules: `{kind: daily}`, `{kind: weekly, times, byWeekday?}`, `{kind: monthly, times}`,
164
171
  `{kind: every_n_days, interval}`. Optional `graceDays` (daily streak tolerance),
@@ -194,14 +201,21 @@ pre-guessing constraints.
194
201
  `bookIds`.
195
202
  - **Saved lists** (named, reusable task-list filters): `list_saved_lists`,
196
203
  `create_saved_list`, `update_saved_list`, `delete_saved_list`.
197
- - **Views & reviews**: `get_view` (today/upcoming/overdue, timezone-aware),
204
+ - **Attachments** (read-only; upload is web/app-only): `list_task_attachments
205
+ {taskId}`, `get_attachment {id}` (metadata), `get_attachment_url {id,
206
+ variant?}` (short-lived signed URL; `variant` is `served` (default),
207
+ `original`, or `thumbnail`). Needs `tasks:read`.
208
+ - **Views & reviews**: `get_view` (today/upcoming/overdue, timezone-aware;
209
+ without `tz` it uses the timezone of the machine running the MCP server),
198
210
  `get_reviews` (due queue), `review_garden` (deep review),
199
211
  `request_garden_review`, `mark_task_reviewed`, `mark_project_reviewed`.
200
212
  - **AI**: `find_tasks` (hybrid keyword + semantic search), `ai_triage`
201
213
  (brain dump → garden-assigned tasks, recurring habits, reading-list
202
214
  saves/edits/cancels, and books - see Workflows).
203
- - **UI (read-only)**: `ui_view`, `ui_review_queue`, `ui_garden_board` return
204
- `ui://` HTML resources.
215
+ - **UI (read-only)**: `ui_view`, `ui_review_queue`, `ui_garden_board`,
216
+ `ui_habits` return `ui://` HTML resources. `ui_view` and `ui_habits` take a
217
+ `cursor`; when a page is cut short the result adds a text note with the
218
+ cursor for the next page.
205
219
  - **Settings**: `get_settings`, `update_settings` (the default review period
206
220
  applied to new tasks/projects; `defaultReviewInterval: null` disables it;
207
221
  `defaultTimezone`, an IANA string, is also settable - it's what date-only
@@ -217,7 +231,9 @@ pre-guessing constraints.
217
231
  `update_profile {displayName}` (1-60 chars; avatar upload is web-only).
218
232
  - **Keys**: `create_key` (optional `includeGrants` to let the new key see
219
233
  gardens shared with its owner - only settable if the calling key itself
220
- has it), `list_keys`, `rotate_key`, `revoke_key`.
234
+ has it), `list_keys`, `rotate_key`, `revoke_key`. `rotate_key` and
235
+ `revoke_key` refuse the key this MCP server itself authenticates with (it
236
+ would lock the server out); rotate or revoke that one from the CLI or web app.
221
237
 
222
238
  ## Workflows
223
239
 
@@ -232,8 +248,9 @@ pre-guessing constraints.
232
248
  archives it, reversibly, independent of status) — it matches existing
233
249
  items by exact title, so an unmatched or ambiguous reference comes back as a
234
250
  reading-list clarification rather than a silent no-op or a task.
235
- - **Plan today** → `get_view today`. Pass the user's IANA `tz` if known so the
236
- day boundary is correct.
251
+ - **Plan today** → `get_view today`. It defaults to this machine's timezone;
252
+ pass the user's IANA `tz` if they are somewhere else so the day boundary is
253
+ correct.
237
254
  - **Add a task** → need a garden: `list_gardens` first, then `create_task` with
238
255
  `gardenId`. Set `deadline` for "today"/hard dates — that's what lands it in
239
256
  the Today view. `create_task`/`create_tasks` accept `tagIds`, `recurrence`,
@@ -241,7 +258,9 @@ pre-guessing constraints.
241
258
  habit) **inline** — set them at creation, never create-then-patch.
242
259
  `deferDate`/`deadline` are calendar days `"YYYY-MM-DD"` (no timezone); inputs
243
260
  also accept relative tokens (`"today"`, `"tomorrow"`, `"+3d"`), so no
244
- client-side date math. Returned values are always `"YYYY-MM-DD"`.
261
+ client-side date math. The local (stdio) server sends the machine's
262
+ timezone, so relative tokens resolve in the user's zone; the hosted server
263
+ falls back to the vault timezone. Returned values are always `"YYYY-MM-DD"`.
245
264
  - **Recurring task** → set `recurrence` at creation:
246
265
  `{mode, frequency, interval, byWeekday?}`. `mode`: `on_schedule` (next = prior
247
266
  due + interval; self-heals missed days) or `on_completion` (next = completed +
@@ -295,8 +314,9 @@ pre-guessing constraints.
295
314
  `people:read|write`, settings tools `settings:read|write`, reading list tools
296
315
  `reading:read|write`, Strava tools `strava:read|write`, book tools
297
316
  `books:read|write`, calendar tools `calendar:read|write`), review tools
298
- `reviews:*`, `find_tasks`/`ai_triage` need
299
- `ai:invoke`, the `*_key` tools need `keys:manage`. A missing scope returns a
317
+ `reviews:*`, `find_tasks` needs `ai:invoke` + `tasks:read`, `ai_triage` needs
318
+ `ai:invoke` + `tasks:write`, `reading:write`, `habits:write`, and
319
+ `books:write` (it can create any of those), the `*_key` tools need `keys:manage`. A missing scope returns a
300
320
  403 tool error. Keys minted before a feature shipped won't carry its scope
301
321
  unless they hold `*`. There is no upload tool here (cover uploads are a
302
322
  web-only flow, `POST /v1/uploads` before setting `coverStorageId`), but a