hermes - 💡(How to fix) Fix Basic Memory provider active but bm_* tools fail with Unknown tool [2 comments, 1 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
NousResearch/hermes-agent#23296Fetched 2026-05-11 03:30:07
View on GitHub
Comments
2
Participants
1
Timeline
4
Reactions
0
Author
Participants
Timeline (top)
commented ×2closed ×1cross-referenced ×1

In a Discord/gateway Hermes session with memory.provider: basic-memory, Basic Memory is installed, active, and successfully injecting recalled memory context into the model. The bm CLI also works, and the Basic Memory provider can initialize and expose the expected tool schemas when tested directly.

However, when the agent calls the native bm_search tool exposed in the tool list, the tool invocation fails immediately with:

{"error": "Unknown tool: bm_search"}

So the underlying Basic Memory provider appears healthy, but the runtime tool dispatcher / bridge for the bm_* tools is not routing correctly in this session.

Error Message

{"error": "Unknown tool: bm_search"} "error": "Unknown tool: bm_search" {"error": "Unknown tool: bm_search"}

Root Cause

This does not look like a Basic Memory provider failure, because:

Fix Action

Fix / Workaround

So the underlying Basic Memory provider appears healthy, but the runtime tool dispatcher / bridge for the bm_* tools is not routing correctly in this session.

The tool call is rejected at a higher dispatch layer with:

  1. The runtime/developer/gateway tool dispatcher that actually executes tool calls in this Discord session.

Code Example

{"error": "Unknown tool: bm_search"}

---

Hermes Agent v0.13.0 (2026.5.7)
Project: /Users/drew/.hermes/hermes-agent
Python: 3.11.14
OpenAI SDK: 2.36.0
Git branch: main
Git rev: 524cbabd8
Update status: 148 commits behind
Host: macOS 15.7.2

---

Memory status
────────────────────────────────────────
  Built-in:  always active
  Provider:  basic-memory

  Plugin:    installed ✓
  Status:    available ✓

  Installed plugins:
byterover  (requires API key)
hindsight  (API key / local)
holographic  (local)
honcho  (API key / local)
mem0  (API key / local)
openviking  (API key / local)
retaindb  (API key / local)
supermemory  (requires API key)
    • basic-memory  (local) ← active

---

which bm
# /Users/drew/.local/bin/bm

bm status

---

╭────────────────╮
│ main: Status│ └── No changes │
╰────────────────╯

---

bm tool search-notes "Hermes Session" --page-size 3 --project hermes-memory

---

from plugins.memory import load_memory_provider

p = load_memory_provider("basic-memory")
p.initialize(
    "issue-repro-test",
    hermes_home="/Users/drew/.hermes",
    platform="discord",
    agent_context="primary",
)

print("initialized", getattr(p, "_initialized", None))
print("schema_names", [s.get("name") for s in p.get_tool_schemas()])
print(p.handle_tool_call("bm_search", {"query": "Hermes Session", "limit": 1})[:1000])

p.shutdown()

---

initialized True
schema_names ['bm_search', 'bm_read', 'bm_write', 'bm_edit', 'bm_context', 'bm_delete', 'bm_move']

---

{
  "limit": 5,
  "query": "Hermes Session Basic Memory plugin working test"
}

---

{
  "error": "Unknown tool: bm_search"
}

---

bm_search({ "query": "Hermes Session", "limit": 5 })

---

{"error": "Unknown tool: bm_search"}
RAW_BUFFERClick to expand / collapse

Summary

In a Discord/gateway Hermes session with memory.provider: basic-memory, Basic Memory is installed, active, and successfully injecting recalled memory context into the model. The bm CLI also works, and the Basic Memory provider can initialize and expose the expected tool schemas when tested directly.

However, when the agent calls the native bm_search tool exposed in the tool list, the tool invocation fails immediately with:

{"error": "Unknown tool: bm_search"}

So the underlying Basic Memory provider appears healthy, but the runtime tool dispatcher / bridge for the bm_* tools is not routing correctly in this session.

Environment

Observed in Discord gateway session.

Hermes Agent v0.13.0 (2026.5.7)
Project: /Users/drew/.hermes/hermes-agent
Python: 3.11.14
OpenAI SDK: 2.36.0
Git branch: main
Git rev: 524cbabd8
Update status: 148 commits behind
Host: macOS 15.7.2

Memory status

hermes memory status reports Basic Memory as installed and available:

Memory status
────────────────────────────────────────
  Built-in:  always active
  Provider:  basic-memory

  Plugin:    installed ✓
  Status:    available ✓

  Installed plugins:
    • byterover  (requires API key)
    • hindsight  (API key / local)
    • holographic  (local)
    • honcho  (API key / local)
    • mem0  (API key / local)
    • openviking  (API key / local)
    • retaindb  (API key / local)
    • supermemory  (requires API key)
    • basic-memory  (local) ← active

What works

1. Basic Memory recall injection works

The current Discord turn received a <memory-context> block containing recalled Basic Memory notes, e.g. prior Hermes session notes from hermes-memory.

So provider prefetch/recall is functioning.

2. bm CLI works

which bm
# /Users/drew/.local/bin/bm

bm status

Output:

╭────────────────╮
│ main: Status   │
│ └── No changes │
╰────────────────╯

Searching the configured project works:

bm tool search-notes "Hermes Session" --page-size 3 --project hermes-memory

Returns valid results from hermes-memory, including session notes.

3. Direct provider initialization works

Manual provider test from repo root:

from plugins.memory import load_memory_provider

p = load_memory_provider("basic-memory")
p.initialize(
    "issue-repro-test",
    hermes_home="/Users/drew/.hermes",
    platform="discord",
    agent_context="primary",
)

print("initialized", getattr(p, "_initialized", None))
print("schema_names", [s.get("name") for s in p.get_tool_schemas()])
print(p.handle_tool_call("bm_search", {"query": "Hermes Session", "limit": 1})[:1000])

p.shutdown()

Output confirmed provider initialization and tool schemas:

initialized True
schema_names ['bm_search', 'bm_read', 'bm_write', 'bm_edit', 'bm_context', 'bm_delete', 'bm_move']

And p.handle_tool_call("bm_search", ...) returned valid Basic Memory search results.

What fails

In the live Hermes/Discord agent session, calling the direct bm_search tool failed:

{
  "limit": 5,
  "query": "Hermes Session Basic Memory plugin working test"
}

Actual result:

{
  "error": "Unknown tool: bm_search"
}

This happened even though the Basic Memory tool schemas are apparently known to the system prompt/tool docs and the memory context was being injected.

Expected behavior

If the Basic Memory provider is active and initialized, the bm_* tools should route through the provider’s MemoryManager / handle_tool_call path and return normal Basic Memory MCP results.

For example:

bm_search({ "query": "Hermes Session", "limit": 5 })

should return matching notes from the active Basic Memory project.

Actual behavior

The tool call is rejected at a higher dispatch layer with:

{"error": "Unknown tool: bm_search"}

This does not look like a Basic Memory provider failure, because:

  • hermes memory status says provider is available.
  • Recall injection works.
  • bm CLI works.
  • Direct provider initialization exposes bm_search, bm_read, bm_write, etc.
  • Direct BasicMemoryProvider.handle_tool_call("bm_search", ...) succeeds.

Suspected area

Likely a mismatch between:

  1. The Basic Memory provider’s dynamic tool schemas:
    • BasicMemoryProvider.get_tool_schemas()
    • MemoryManager.get_all_tool_schemas()
    • run_agent.py tool schema injection around memory provider tools

and

  1. The runtime/developer/gateway tool dispatcher that actually executes tool calls in this Discord session.

The provider itself maps bm_search correctly when initialized, so the failure seems to be outside BasicMemoryProvider.handle_tool_call.

Relevant code areas observed:

  • agent/memory_provider.py
  • agent/memory_manager.py
  • run_agent.py
    • memory provider initialization around lines ~1900
    • memory tool schema injection around lines ~1963
    • memory tool routing branch around lines ~10593
  • User plugin:
    • /Users/drew/.hermes/plugins/basic-memory/__init__.py

Extra note

The installed Hermes is v0.13.0, 148 commits behind current, so this may already be fixed on newer main. But the issue is reproducible on the current local install.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

FAQ

Expected behavior

If the Basic Memory provider is active and initialized, the bm_* tools should route through the provider’s MemoryManager / handle_tool_call path and return normal Basic Memory MCP results.

For example:

bm_search({ "query": "Hermes Session", "limit": 5 })

should return matching notes from the active Basic Memory project.

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING