Drew Cain
c9770375e9
feat(mcp): add title and tags annotations to all MCP tool decorators (issue #826 phase 1)
...
Adds human-readable `title` and categorization `tags` to all ~24 @mcp.tool
decorators across the MCP tools package. FastMCP 3.3.1 (pinned in pyproject.toml)
supports both fields natively. Tags used: notes, search, projects, cloud, schema,
navigation, canvas, ui.
Extends test_tool_contracts.py with an async test that asserts every registered
tool has a non-empty title and at least one tag to prevent future regressions.
output_schema is explicitly deferred as a follow-up (phase 2): it requires
per-tool design decisions about which tools reliably return structured JSON and
how to handle tools that return str|dict depending on output_format.
Co-Authored-By: Claude <noreply@anthropic.com >
Signed-off-by: Drew Cain <groksrc@gmail.com >
2026-06-11 15:21:25 -05:00
Drew Cain
0811c48252
fix(mcp): normalize note_types/entity_types/categories on direct call path and reject non-string list elements
...
Codex review of PR #962 identified two real issues:
1. CLI bypass: the BeforeValidator(parse_str_list) on note_types, entity_types, and
categories only fires through MCP/Pydantic validation. The CLI path in
cli/commands/tool.py calls search_notes() directly, so `bm tool search-notes
--type note,task` arrived as note_types=["note,task"] and matched nothing.
Fix: add in-body parse_str_list() normalization for all three params (mirroring
the existing parse_tags() call for tags on the same code path).
2. Silent stringify: parse_str_list used str(raw) in the list branch, so [42] became
["42"] before Pydantic saw it, accepting invalid input as a no-result search
instead of rejecting it. Fix: guard against non-string list elements and return
the original value unchanged so Pydantic rejects it with a clear error.
Tests added: annotation-level split tests for note_types/entity_types/categories,
non-string-element rejection tests, async direct-call regression for note_types,
and unit-level parse_str_list non-string list tests in test_coerce.py.
Co-Authored-By: Claude <noreply@anthropic.com >
Signed-off-by: Drew Cain <groksrc@gmail.com >
2026-06-11 14:38:24 -05:00
Drew Cain
747e64e5e9
feat(mcp): comma-split note_types/entity_types/categories in search_notes ( #930 )
...
Add `parse_str_list` to utils.py — like `parse_tags` but without stripping
'#' — and wire it as the BeforeValidator for note_types, entity_types, and
categories in search_notes. This makes passing "note,task" or
'["note","task"]' work correctly instead of being wrapped as a single literal
value by coerce_list.
coerce_list is left unchanged; canvas and other callers that depend on its
wrap-single-string behaviour are unaffected.
Co-Authored-By: Claude <noreply@anthropic.com >
Signed-off-by: Drew Cain <groksrc@gmail.com >
2026-06-11 14:38:24 -05:00
Paul Hernandez
db578ccfdb
fix(mcp): recover edit_note when file exists on disk but is not indexed ( #934 )
...
Closes #581
Signed-off-by: phernandez <paul@basicmemory.com >
2026-06-10 14:04:59 -05:00
Paul Hernandez
df485aa5a4
fix(mcp): tighten search_notes tags input and normalize for direct callers ( #941 )
...
Refs #910 . Follow-up to #932 .
Signed-off-by: phernandez <paul@basicmemory.com >
2026-06-10 14:04:56 -05:00
Paul Hernandez
c4b651f5b0
fix(mcp): accept page/page_size in read_note for parity with sibling tools ( #933 )
...
Closes #883
Refs #882
Signed-off-by: phernandez <paul@basicmemory.com >
2026-06-10 00:03:22 -05:00
Paul Hernandez
ca9a4d9c12
fix(mcp): split comma-separated tags in search_notes tags param ( #932 )
...
Closes #910
Signed-off-by: phernandez <paul@basicmemory.com >
2026-06-09 22:23:26 -05:00
Paul Hernandez
a8d034b940
fix(mcp): point move mismatch guidance at landing path ( #916 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-06-08 10:42:38 -05:00
Paul Hernandez
7c0937f658
fix(mcp): validate navigation pagination and fix recent_activity project display ( #915 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-07 23:03:00 -05:00
Paul Hernandez
480a2d9468
fix(mcp): resolve memory:// in move_note and stop false cross-project rejections ( #914 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-07 22:44:08 -05:00
Paul Hernandez
4fe6fe09c8
feat(core): add observation category filter to search ( #908 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-07 19:57:19 -05:00
Paul Hernandez
5b034f081d
fix(core): self-heal corrupt FastEmbed model cache ( #900 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-07 17:37:30 -05:00
Paul Hernandez
3ba3a9504d
fix(mcp): stop move_note reporting false success across boundaries ( #904 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-06-07 17:37:20 -05:00
Adit Karode
476239d878
feat(cli): add delete-note tool command
2026-06-06 21:41:46 -05:00
DoubleDeeRuffy
20bb19f4cd
fix(mcp): resolve write-note overwrite conflicts
2026-06-06 21:41:36 -05:00
Drew Cain
f07643d3a8
feat(cli): expose project sync support metadata
...
Signed-off-by: Drew Cain <groksrc@gmail.com >
2026-05-28 15:00:05 -05:00
Drew Cain
b109b7337f
fix(mcp): attach local state to one workspace project row ( #854 )
...
Signed-off-by: Drew Cain <groksrc@gmail.com >
2026-05-26 10:54:44 -05:00
Drew Cain
36b51b676e
fix(mcp): return workspace-qualified write permalinks ( #853 )
...
Signed-off-by: Drew Cain <groksrc@gmail.com >
2026-05-26 00:33:21 -05:00
Paul Hernandez
5a34a420c9
fix(mcp): preinitialize local ASGI database ( #838 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-05-25 15:57:00 -05:00
Sean Campbell
94c04ee456
fix(mcp): restore write_note overwrite schema for external clients ( #818 ) ( #841 )
...
Signed-off-by: rudi193-cmd <rudi193@gmail.com >
Co-authored-by: Cursor <cursoragent@cursor.com >
2026-05-23 14:19:43 -05:00
Drew Cain
5ae8a733ea
fix(mcp): route mixed local/cloud projects correctly ( #837 )
...
Signed-off-by: Drew Cain <groksrc@gmail.com >
2026-05-23 11:31:13 -05:00
Paul Hernandez
9e3fe26a83
fix(core): purge SQLite search_index on project delete ( #832 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-05-16 16:47:24 -05:00
Paul Hernandez
47ee982041
perf(cli): defer local ASGI app import ( #828 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-05-15 17:59:58 -05:00
Paul Hernandez
3bed6d8890
chore(deps): update deps and harden security ( #825 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-05-15 10:45:14 -05:00
Paul Hernandez
4cba7ba01c
fix(core): parse prose wikilinks as inline links ( #824 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-05-14 11:43:11 -05:00
Drew Cain
8eeec64e28
fix: basic-memory project list does not list projects from all workspaces ( #822 )
...
Signed-off-by: Drew Cain <groksrc@gmail.com >
2026-05-14 09:46:02 -05:00
Paul Hernandez
c6fa185bf3
fix(mcp): route edit_note workspace-qualified permalinks ( #813 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-05-11 12:56:26 -05:00
Paul Hernandez
415c2b3d6e
feat(cli): add orphan entity command ( #816 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-05-11 12:13:14 -05:00
Paul Hernandez
df5e8d805f
fix(mcp): centralize workspace permalink routing ( #808 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-05-08 16:44:57 -05:00
Paul Hernandez
831dc1ecdc
fix(mcp): make multi-project search opt-in ( #807 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-05-08 12:54:20 -05:00
Paul Hernandez
7918e5c6bf
fix(mcp): preserve workspace paths in build_context ( #801 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-05-08 09:53:54 -05:00
Paul Hernandez
f312341020
fix(mcp): add workspace routing to delete_project ( #803 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-05-08 09:48:51 -05:00
phernandez
177ae21ba7
pass context to recent_activity
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-05-07 18:50:02 -05:00
Paul Hernandez
a661e924df
feat(mcp): create projects by workspace slug ( #789 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-05-03 19:31:55 -05:00
Paul Hernandez
05adda1502
fix(mcp): route workspace-qualified memory urls ( #790 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-05-03 18:18:10 -05:00
Drew Cain
0a72d81bb3
fix(mcp): cap recent_activity rows with explicit truncation footer ( #785 )
...
Signed-off-by: Drew Cain <groksrc@gmail.com >
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-03 17:43:42 -05:00
Paul Hernandez
b4bf14ebf7
fix(mcp): list factory projects across workspaces ( #778 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-05-02 09:17:25 -05:00
Paul Hernandez
0b335476d6
fix(mcp): resolve projects by external_id, remove workspace from MCP tools ( #777 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com >
2026-05-01 05:15:44 -05:00
Paul Hernandez
799dd6c629
fix(mcp): remove no-op pagination params from read_note and view_note ( #768 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-04-28 23:05:14 -05:00
Paul Hernandez
ee1558ea68
feat(mcp): accept training-data-friendly parameter aliases ( #766 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-04-28 20:10:36 -05:00
Paul Hernandez
f3e46d7984
feat(mcp): discover projects across workspaces ( #757 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-04-18 14:04:57 -05:00
jope-bm
56d6f1b4a5
fix(mcp): report cloud projects as source=cloud in factory mode ( #752 )
...
Signed-off-by: Joe P <joe@basicmemory.com >
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com >
2026-04-18 11:10:20 -06:00
Paul Hernandez
1b39062ecd
refactor(core): rip telemetry wrappers, use logfire directly ( #754 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-04-17 13:58:19 -05:00
Paul Hernandez
4e53bb83fd
refactor(core): simplify note write flow ( #739 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-04-15 17:56:27 -05:00
Paul Hernandez
052545b661
chore(core): make ty the default typechecker ( #736 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-04-13 10:34:01 -05:00
Paul Hernandez
540da418b3
perf(sync): batch file indexing in core ( #726 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-04-08 01:21:49 -05:00
Paul Hernandez
fe04a0b2a2
fix(mcp): pass workspace parameter through client factory ( #722 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-04-06 16:57:37 -05:00
Paul Hernandez
e6b98a15c7
fix(cli): propagate cloud workspace routing and incremental sync ( #712 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-04-03 14:25:02 -05:00
phernandez
7696fca826
fix: restore MCP telemetry compatibility and outcomes
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-03-28 15:31:13 -05:00
phernandez
98a2a3cbaf
Unify MCP telemetry spans across routers and services
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-03-28 14:42:18 -05:00