Skip to content

feat(guard): add Seahorse memory MCP server contribution - #2989

Draft
ssanvi-builds wants to merge 1 commit into
hashgraph-online:mainfrom
ssanvi-builds:seahorse-mcp-contribution
Draft

ssanvi-builds wants to merge 1 commit into
hashgraph-online:mainfrom
ssanvi-builds:seahorse-mcp-contribution

Conversation

@ssanvi-builds

Copy link
Copy Markdown

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 as seahorse-memory, launched via uvx). Follows the v1 scope agreed with the maintainer: tool defaults only, no per-arg policy.

Tool defaults

  • block: the four mutation tools — remember, improve, forget, skill_add
  • allow: the eleven read tools — recall, recall_full, recall_timeline, context, freshness_view, audit_log, follow_supersedes_chain, build_pit, skill_list, skill_search, skill_show
  • other: inherit

The maintainer's starting sketch was block remember/forget, allow recall/skill_list. I extended it to the full 15-tool taxonomy because with other: inherit and 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.jsoncommand.mcp-seahorse under external (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, uvx seahorse-memory, surface mcp), per the contribution convention
  • tests/test_guard_extension_trust.py — the matching id in the hardcoded external set of test_trust_map_covers_every_builtin_extension

Testing

Targeted tests pass locally: tests/test_guard_mcp_server_contribution.py and tests/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

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>
@coderabbitai

coderabbitai Bot commented Sep 18, 2026

Copy link
Copy Markdown
Contributor

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Comment on lines +1 to +15
{
"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",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ 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 👍 / 👎

@gitar-bot

gitar-bot Bot commented Sep 18, 2026

Copy link
Copy Markdown
Code Review ⚠️ Changes requested 0 closed / 1 findings

🟡 Medium risk

Adds mcp.seahorse, a Guard MCP profile for the Seahorse memory server with tool defaults (4 mutation tools blocked, 11 read tools allowed). The baseline catalog fixture was not updated to reflect the new extension, causing catalog-parity tests to fail in CI — regenerate tests/fixtures/extension-controls/catalog-baseline.v1.json and docs/guard/extensions/catalog.v1.json to include command.mcp-seahorse before merge.

⚠️ Bug: New MCP extension not added to catalog baseline fixture

📄 contributions/mcp-servers/mcp.seahorse.json:1-15

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.

🤖 Prompt for agents
Code Review: Adds `mcp.seahorse`, a Guard MCP profile for the Seahorse memory server with tool defaults (4 mutation tools blocked, 11 read tools allowed). The baseline catalog fixture was not updated to reflect the new extension, causing catalog-parity tests to fail in CI — regenerate `tests/fixtures/extension-controls/catalog-baseline.v1.json` and `docs/guard/extensions/catalog.v1.json` to include `command.mcp-seahorse` before merge.

1. ⚠️ Bug: New MCP extension not added to catalog baseline fixture
   Files: contributions/mcp-servers/mcp.seahorse.json:1-15

   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.

Review coverage

Rules No rules evaluated

Functional validation Not enabled · Set up

Options

Auto-apply is off → Gitar will not commit updates to this branch.
Display: compact → Counting what did not apply, without listing it.

Comment with these commands to change the behavior for this request:

Auto-apply Compact
gitar auto-apply:on         
gitar display:verbose         

Was this helpful? React with 👍 / 👎 | Powered by Gitar — free for open source

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant