Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion hindsight-api-slim/hindsight_api/api/mcp.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,6 @@ def create_mcp_server(memory: MemoryEngine, multi_bank: bool = True) -> FastMCP:
"delete_directive",
"list_memories",
"get_memory",
"delete_memory",
"list_documents",
"get_document",
"delete_document",
Expand Down
19 changes: 0 additions & 19 deletions hindsight-api-slim/hindsight_api/engine/interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -289,25 +289,6 @@ async def list_memory_units(
"""
...

@abstractmethod
async def delete_memory_unit(
self,
unit_id: str,
*,
request_context: "RequestContext",
) -> dict[str, Any]:
"""
Delete a specific memory unit.

Args:
unit_id: The memory unit ID.
request_context: Request context for authentication.

Returns:
Deletion result.
"""
...

@abstractmethod
async def get_graph_data(
self,
Expand Down
74 changes: 0 additions & 74 deletions hindsight-api-slim/hindsight_api/mcp_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@
"delete_directive",
"list_memories",
"get_memory",
"delete_memory",
"list_documents",
"get_document",
"delete_document",
Expand Down Expand Up @@ -223,7 +222,6 @@ def register_mcp_tools(
"delete_directive",
"list_memories",
"get_memory",
"delete_memory",
"list_documents",
"get_document",
"delete_document",
Expand Down Expand Up @@ -292,9 +290,6 @@ def register_mcp_tools(
if "get_memory" in tools_to_register:
_register_get_memory(mcp, memory, config)

if "delete_memory" in tools_to_register:
_register_delete_memory(mcp, memory, config)

# Document tools
if "list_documents" in tools_to_register:
_register_list_documents(mcp, memory, config)
Expand Down Expand Up @@ -441,7 +436,6 @@ async def _filtered_run(arguments, _name=name, _orig=original_run):
"refresh_mental_model",
"create_directive",
"delete_directive",
"delete_memory",
"delete_document",
"cancel_operation",
}
Expand Down Expand Up @@ -2163,74 +2157,6 @@ async def get_memory(
return {"error": str(e)}


def _register_delete_memory(mcp: FastMCP, memory: MemoryEngine, config: MCPToolsConfig) -> None:
"""Register the delete_memory tool."""

if config.include_bank_id_param:

@mcp.tool()
async def delete_memory(
memory_id: str,
bank_id: str | None = None,
) -> str:
"""
Delete a specific memory by ID.

Permanently removes a memory unit and its associated data.

Args:
memory_id: The ID of the memory to delete
bank_id: Optional bank (accepted for consistency, not used in deletion).
"""
try:
target_bank = bank_id or config.bank_id_resolver()
if target_bank is None:
return '{"error": "No bank_id configured"}'

result = await memory.delete_memory_unit(
unit_id=memory_id,
request_context=_get_request_context(config),
)
return json.dumps({"status": "deleted", "memory_id": memory_id, **result}, default=str)
except OperationValidationError as e:
logger.warning(f"Operation rejected: {e}")
return json.dumps({"error": str(e)})
except Exception as e:
logger.error(f"Error deleting memory: {e}", exc_info=True)
return f'{{"error": "{e}"}}'

else:

@mcp.tool()
async def delete_memory(
memory_id: str,
) -> dict:
"""
Delete a specific memory by ID.

Permanently removes a memory unit and its associated data.

Args:
memory_id: The ID of the memory to delete
"""
try:
target_bank = config.bank_id_resolver()
if target_bank is None:
return {"error": "No bank_id configured"}

result = await memory.delete_memory_unit(
unit_id=memory_id,
request_context=_get_request_context(config),
)
return {"status": "deleted", "memory_id": memory_id, **result}
except OperationValidationError as e:
logger.warning(f"Operation rejected: {e}")
return {"error": str(e)}
except Exception as e:
logger.error(f"Error deleting memory: {e}", exc_info=True)
return {"error": str(e)}


# =========================================================================
# DOCUMENT TOOLS
# =========================================================================
Expand Down
29 changes: 1 addition & 28 deletions hindsight-api-slim/tests/test_mcp_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,6 @@ async def _get_mental_model(**kwargs):
# Memory browsing methods
memory.list_memory_units = AsyncMock(return_value={"items": [{"id": "mem-1", "content": "Test"}], "total": 1})
memory.get_memory_unit = AsyncMock(return_value={"id": "mem-1", "content": "Test memory"})
memory.delete_memory_unit = AsyncMock(return_value={"deleted_count": 1})

# Document methods
memory.list_documents = AsyncMock(return_value={"items": [{"id": "doc-1", "name": "Test Doc"}], "total": 1})
Expand Down Expand Up @@ -313,7 +312,6 @@ def test_mental_model_tools_in_default_set(self):
memory.delete_directive = AsyncMock()
memory.list_memory_units = AsyncMock(return_value={})
memory.get_memory_unit = AsyncMock()
memory.delete_memory_unit = AsyncMock()
memory.list_documents = AsyncMock(return_value={})
memory.get_document = AsyncMock()
memory.delete_document = AsyncMock()
Expand Down Expand Up @@ -347,7 +345,7 @@ def test_mental_model_tools_in_default_set(self):
assert "delete_bank" in tools
assert "clear_memories" in tools
assert "sync_retain" in tools
assert len(tools) == 30
assert len(tools) == 29


@pytest.fixture
Expand Down Expand Up @@ -1106,12 +1104,6 @@ async def test_get_memory_not_found(self, mock_memory):
result = await _tools(mcp)["get_memory"].fn(memory_id="missing")
assert "not found" in result

async def test_delete_memory(self, mock_memory):
mcp = _make_mcp_server(mock_memory, {"delete_memory"}, include_bank_id=True)
result = await _tools(mcp)["delete_memory"].fn(memory_id="mem-1")
assert '"deleted"' in result
assert mock_memory.delete_memory_unit.call_args.kwargs["unit_id"] == "mem-1"

async def test_get_memory_invalid_uuid(self, mock_memory):
mock_memory.get_memory_unit.side_effect = ValueError("Invalid memory_id: 'nonexistent' is not a valid UUID")
mcp = _make_mcp_server(mock_memory, {"get_memory"}, include_bank_id=True)
Expand All @@ -1124,12 +1116,6 @@ async def test_get_memory_invalid_uuid_single_bank(self, mock_memory):
result = await _tools(mcp)["get_memory"].fn(memory_id="bad")
assert "not a valid UUID" in result["error"]

async def test_delete_memory_invalid_uuid(self, mock_memory):
mock_memory.delete_memory_unit.side_effect = ValueError("Invalid unit_id: 'bad' is not a valid UUID")
mcp = _make_mcp_server(mock_memory, {"delete_memory"}, include_bank_id=True)
result = await _tools(mcp)["delete_memory"].fn(memory_id="bad")
assert "not a valid UUID" in result

async def test_list_memories_single_bank(self, mock_memory):
mcp = _make_mcp_server(mock_memory, {"list_memories"}, include_bank_id=False)
result = await _tools(mcp)["list_memories"].fn()
Expand Down Expand Up @@ -1361,19 +1347,6 @@ async def test_cancel_operation_engine_error_single_bank(self, mock_memory):
class TestDeleteErrorHandling:
"""Error handling tests for delete operations."""

async def test_delete_memory_engine_error(self, mock_memory):
mock_memory.delete_memory_unit.side_effect = RuntimeError("DB error")
mcp = _make_mcp_server(mock_memory, {"delete_memory"}, include_bank_id=True)
result = await _tools(mcp)["delete_memory"].fn(memory_id="mem-1")
assert "error" in result
assert "DB error" in result

async def test_delete_memory_single_bank(self, mock_memory):
mcp = _make_mcp_server(mock_memory, {"delete_memory"}, include_bank_id=False)
result = await _tools(mcp)["delete_memory"].fn(memory_id="mem-1")
assert isinstance(result, dict)
assert result["status"] == "deleted"

async def test_delete_document_engine_error(self, mock_memory):
mock_memory.delete_document.side_effect = RuntimeError("DB error")
mcp = _make_mcp_server(mock_memory, {"delete_document"}, include_bank_id=True)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ const MCP_TOOL_GROUPS: { label: string; tools: string[] }[] = [
],
},
{ label: "Directives", tools: ["list_directives", "create_directive", "delete_directive"] },
{ label: "Memories", tools: ["list_memories", "get_memory", "delete_memory"] },
{ label: "Memories", tools: ["list_memories", "get_memory"] },
{ label: "Documents", tools: ["list_documents", "get_document", "delete_document"] },
{ label: "Operations", tools: ["list_operations", "get_operation", "cancel_operation"] },
{ label: "Tags", tools: ["list_tags"] },
Expand Down
1 change: 0 additions & 1 deletion hindsight-docs/docs-integrations/local-mcp.md
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,6 @@ The local server exposes the full tool set (29 tools in multi-bank mode, 26 in s
|------|-------------|
| `list_memories` | Browse memories with filtering and pagination |
| `get_memory` | Get a specific memory by ID |
| `delete_memory` | Delete a specific memory |

**Documents**

Expand Down
2 changes: 1 addition & 1 deletion hindsight-docs/docs/developer/api/memory-banks.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ An allowlist of MCP tool names that are enabled for this bank. When set, only th
["recall", "reflect"]
```

Available tool names: `retain`, `recall`, `reflect`, `list_banks`, `create_bank`, `list_mental_models`, `get_mental_model`, `create_mental_model`, `update_mental_model`, `delete_mental_model`, `refresh_mental_model`, `list_directives`, `create_directive`, `delete_directive`, `list_memories`, `get_memory`, `delete_memory`, `list_documents`, `get_document`, `delete_document`, `list_operations`, `get_operation`, `cancel_operation`, `list_tags`, `get_bank`, `get_bank_stats`, `update_bank`, `delete_bank`, `clear_memories`.
Available tool names: `retain`, `recall`, `reflect`, `list_banks`, `create_bank`, `list_mental_models`, `get_mental_model`, `create_mental_model`, `update_mental_model`, `delete_mental_model`, `refresh_mental_model`, `list_directives`, `create_directive`, `delete_directive`, `list_memories`, `get_memory`, `list_documents`, `get_document`, `delete_document`, `list_operations`, `get_operation`, `cancel_operation`, `list_tags`, `get_bank`, `get_bank_stats`, `update_bank`, `delete_bank`, `clear_memories`.

### llm_gemini_safety_settings

Expand Down
2 changes: 1 addition & 1 deletion hindsight-docs/docs/developer/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -1121,7 +1121,7 @@ export HINDSIGHT_API_MCP_ENABLED_TOOLS=recall
export HINDSIGHT_API_MCP_ENABLED_TOOLS=recall,reflect
```

Available tool names: `retain`, `recall`, `reflect`, `list_banks`, `create_bank`, `list_mental_models`, `get_mental_model`, `create_mental_model`, `update_mental_model`, `delete_mental_model`, `refresh_mental_model`, `list_directives`, `create_directive`, `delete_directive`, `list_memories`, `get_memory`, `delete_memory`, `list_documents`, `get_document`, `delete_document`, `list_operations`, `get_operation`, `cancel_operation`, `list_tags`, `get_bank`, `get_bank_stats`, `update_bank`, `delete_bank`, `clear_memories`.
Available tool names: `retain`, `recall`, `reflect`, `list_banks`, `create_bank`, `list_mental_models`, `get_mental_model`, `create_mental_model`, `update_mental_model`, `delete_mental_model`, `refresh_mental_model`, `list_directives`, `create_directive`, `delete_directive`, `list_memories`, `get_memory`, `list_documents`, `get_document`, `delete_document`, `list_operations`, `get_operation`, `cancel_operation`, `list_tags`, `get_bank`, `get_bank_stats`, `update_bank`, `delete_bank`, `clear_memories`.

This can also be overridden per bank via the [config API](#hierarchical-configuration):

Expand Down
10 changes: 0 additions & 10 deletions hindsight-docs/docs/developer/mcp-server.md
Original file line number Diff line number Diff line change
Expand Up @@ -371,16 +371,6 @@ Retrieve a specific memory by ID.

---

### delete_memory

Permanently delete a specific memory.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `memory_id` | string | Yes | The ID of the memory to delete |

---

### list_documents

List documents that have been ingested into the memory bank.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ An allowlist of MCP tool names that are enabled for this bank. When set, only th
["recall", "reflect"]
```

Available tool names: `retain`, `recall`, `reflect`, `list_banks`, `create_bank`, `list_mental_models`, `get_mental_model`, `create_mental_model`, `update_mental_model`, `delete_mental_model`, `refresh_mental_model`, `list_directives`, `create_directive`, `delete_directive`, `list_memories`, `get_memory`, `delete_memory`, `list_documents`, `get_document`, `delete_document`, `list_operations`, `get_operation`, `cancel_operation`, `list_tags`, `get_bank`, `get_bank_stats`, `update_bank`, `delete_bank`, `clear_memories`.
Available tool names: `retain`, `recall`, `reflect`, `list_banks`, `create_bank`, `list_mental_models`, `get_mental_model`, `create_mental_model`, `update_mental_model`, `delete_mental_model`, `refresh_mental_model`, `list_directives`, `create_directive`, `delete_directive`, `list_memories`, `get_memory`, `list_documents`, `get_document`, `delete_document`, `list_operations`, `get_operation`, `cancel_operation`, `list_tags`, `get_bank`, `get_bank_stats`, `update_bank`, `delete_bank`, `clear_memories`.

### llm_gemini_safety_settings

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1121,7 +1121,7 @@ export HINDSIGHT_API_MCP_ENABLED_TOOLS=recall
export HINDSIGHT_API_MCP_ENABLED_TOOLS=recall,reflect
```

Available tool names: `retain`, `recall`, `reflect`, `list_banks`, `create_bank`, `list_mental_models`, `get_mental_model`, `create_mental_model`, `update_mental_model`, `delete_mental_model`, `refresh_mental_model`, `list_directives`, `create_directive`, `delete_directive`, `list_memories`, `get_memory`, `delete_memory`, `list_documents`, `get_document`, `delete_document`, `list_operations`, `get_operation`, `cancel_operation`, `list_tags`, `get_bank`, `get_bank_stats`, `update_bank`, `delete_bank`, `clear_memories`.
Available tool names: `retain`, `recall`, `reflect`, `list_banks`, `create_bank`, `list_mental_models`, `get_mental_model`, `create_mental_model`, `update_mental_model`, `delete_mental_model`, `refresh_mental_model`, `list_directives`, `create_directive`, `delete_directive`, `list_memories`, `get_memory`, `list_documents`, `get_document`, `delete_document`, `list_operations`, `get_operation`, `cancel_operation`, `list_tags`, `get_bank`, `get_bank_stats`, `update_bank`, `delete_bank`, `clear_memories`.

This can also be overridden per bank via the [config API](#hierarchical-configuration):

Expand Down
10 changes: 0 additions & 10 deletions skills/hindsight-docs/references/developer/mcp-server.md
Original file line number Diff line number Diff line change
Expand Up @@ -371,16 +371,6 @@ Retrieve a specific memory by ID.

---

### delete_memory

Permanently delete a specific memory.

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| `memory_id` | string | Yes | The ID of the memory to delete |

---

### list_documents

List documents that have been ingested into the memory bank.
Expand Down
Loading