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
3ce42de57e
test(mcp): narrow read_note return before string assertions for ty
...
Co-Authored-By: Claude <noreply@anthropic.com >
Signed-off-by: Drew Cain <groksrc@gmail.com >
2026-06-11 13:30:16 -05:00
Drew Cain
a143072d35
fix(core): require line-anchored frontmatter fences in file_utils
...
has_frontmatter(), parse_frontmatter(), and remove_frontmatter() detected
frontmatter by substring/split (`content.startswith("---")` plus
`content.split("---", 2)`) rather than by line-anchored fences. A single-line
string that merely starts with `---` — e.g. `---\nstatus: active\n---\nBody`
where `\n` are literal backslash-n characters, a common CLI/agent input shape —
was misread as frontmatter: yaml parsed `\nstatus` as a key that got merged into
the note's YAML on disk, and the body was silently transformed.
Introduce a shared `_split_frontmatter()` helper that anchors both fences to
their own lines (`^---[ \t]*$`), tolerating leading blank lines so dedented
heredoc-style content still parses. All three public helpers now delegate to it,
preserving existing behavior for valid frontmatter (BOM stripping, empty -> {},
non-dict -> ParseError, and the existing ParseError messages callers assert on).
Closes #972
Co-Authored-By: Claude <noreply@anthropic.com >
Signed-off-by: Drew Cain <groksrc@gmail.com >
2026-06-11 13:30:16 -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
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
phernandez
5365f971ef
chore(integrations): consolidate agent packages
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-05-30 14:16:04 -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
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
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
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
Drew Cain
3415fd1014
fix(core): parse picoschema modifier descriptions ( #796 )
...
Signed-off-by: Drew Cain <groksrc@gmail.com >
Signed-off-by: phernandez <paul@basicmachines.co >
Co-authored-by: phernandez <paul@basicmachines.co >
2026-05-06 12:21:35 -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
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
phernandez
8f2b25f0e0
test(core): stabilize postgres fixtures
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-04-13 14:25:26 -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
Drew Cain
b3403e96b3
fix: add workspace routing to cloud upload and API client ( #704 )
...
Signed-off-by: Drew Cain <groksrc@gmail.com >
Signed-off-by: phernandez <paul@basicmachines.co >
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
Co-authored-by: phernandez <paul@basicmachines.co >
2026-04-06 18:18:40 -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
phernandez
a4e0422926
perf fixes
...
Signed-off-by: phernandez <paul@basicmachines.co >
2026-03-27 22:12:44 -05:00
Paul Hernandez
4791e19685
feat: add Logfire phased instrumentation ( #692 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-24 20:39:42 -05:00
Paul Hernandez
36848410a1
feat(core): add default_search_type config setting ( #676 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-17 22:19:53 -05:00
Paul Hernandez
1a6a65571e
fix(mcp): add project detection from memory:// URLs in edit_note and delete_note ( #668 )
...
Signed-off-by: phernandez <paul@basicmachines.co >
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-15 19:14:22 -05:00