feat(guard): add Seahorse memory MCP server contribution - #2989
ssanvi-builds wants to merge 1 commit into
Conversation
New mcp.seahorse profile (guard.mcp-server-contribution.v1), following the v1 scope agreed with the maintainer: tool defaults only, no per-arg policy. - Mutations block: remember, improve, forget, skill_add - Reads allow: recall, recall_full, recall_timeline, context, freshness_view, audit_log, follow_supersedes_chain, build_pit, skill_list, skill_search, skill_show - other: inherit Wiring the catalog also requires the trust-class map entry (command.mcp-seahorse under external) and the matching ids in the extension trust coverage test. Covered in test_guard_mcp_server_contribution.py (two new cases) per the contribution convention. Co-Authored-By: Claude Code <noreply@anthropic.com>
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: trueThanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
| { | ||
| "schemaVersion": "guard.mcp-server-contribution.v1", | ||
| "id": "mcp.seahorse", | ||
| "version": "1.0.0", | ||
| "name": "Seahorse Memory MCP", | ||
| "description": "Persistent bi-temporal memory for LLM agents (local-first SQLite, Obsidian vault). Mutations are remember, improve, forget, skill_add; every other tool is read-only. Off until you turn it on.", | ||
| "trustClass": "external", | ||
| "activation": "opt-in", | ||
| "publisher": { | ||
| "id": "community.seahorse", | ||
| "displayName": "Seahorse", | ||
| "url": "https://github.com/ssanvi-builds/seahorse" | ||
| }, | ||
| "icon": { "kind": "react-icon", "name": "HiMiniCube", "background": "#0E7490" }, | ||
| "homepage": "https://github.com/ssanvi-builds/seahorse", |
There was a problem hiding this comment.
⚠️ Bug: New MCP extension not added to catalog baseline fixture
Registering mcp.seahorse adds command.mcp-seahorse (and its permission) to BUILT_IN_COMMAND_EXTENSION_REGISTRY, which changes extension_count, extension_ids, permission_count, permission_ids, permission_examples, and catalog_digest. test_catalog_identity_matches_generated_baseline_fixture in tests/test_guard_extension_control_catalog_detail.py asserts the live registry snapshot equals tests/fixtures/extension-controls/catalog-baseline.v1.json, and that fixture (which lists command.mcp-filesystem but not command.mcp-seahorse) was not updated in this PR. This test — and other catalog-parity tests keyed on catalog_digest/docs/guard/extensions/catalog.v1.json — will fail in CI. Regenerate/update the baseline fixture (and catalog.v1.json if covered) to include the new extension.
Was this helpful? React with 👍 / 👎
Code Review
|
| Auto-apply | Compact |
|
|
Was this helpful? React with 👍 / 👎 | Powered by Gitar — free for open source
What
Adds
mcp.seahorse, a Guard MCP profile for the Seahorse memory server (persistent bi-temporal memory for LLM agents, local-first SQLite, Apache-2.0, published on PyPI asseahorse-memory, launched viauvx). Follows the v1 scope agreed with the maintainer: tool defaults only, no per-arg policy.Tool defaults
remember,improve,forget,skill_addrecall,recall_full,recall_timeline,context,freshness_view,audit_log,follow_supersedes_chain,build_pit,skill_list,skill_search,skill_showThe maintainer's starting sketch was block remember/forget, allow recall/skill_list. I extended it to the full 15-tool taxonomy because with
other: inheritand a restrictive default, unlisted read tools would end up blocked; enumerating all reads keeps every recall surface read-only while every write requires approval. Happy to trim if you prefer the minimal list.Files
contributions/mcp-servers/mcp.seahorse.json— the profile (guard.mcp-server-contribution.v1)contracts/extensions/trust-class-map.v1.json—command.mcp-seahorseunderexternal(without the map entry the id defaults to first-party and the catalog comes up enabled)tests/test_guard_mcp_server_contribution.py— two new cases: tool-state matrix (4 block / 11 allow / unknown inherit) and catalog wiring (external, opt-in, uvxseahorse-memory, surface mcp), per the contribution conventiontests/test_guard_extension_trust.py— the matching id in the hardcoded external set oftest_trust_map_covers_every_builtin_extensionTesting
Targeted tests pass locally:
tests/test_guard_mcp_server_contribution.pyandtests/test_guard_extension_trust.py(27 passed, ~0.2s).One honest note: a full local suite run showed one unrelated failure in
test_daemon_bounded_http.py::test_bounded_server_returns_fast_retryable_overload, which looks environmental (macOS timing on the daemon HTTP test) and touches none of the four files above; CI should confirm.🤖 Generated with Claude Code