Most agent frameworks give an agent a chat history and call it memory. When the process ends, it is gone. When two agents work on the
same project, they know nothing about each other.
Semurg gives every agent the same long-term memory, on your own machine, over MCP. Each agent stores the people, decisions and
documents it finds as a knowledge graph. Any agent on the same scope can later ask for them, and every answer cites where it came from.
One node serves them all, so a CrewAI crew can read what your LangChain agent stored this morning.
Start a node
It runs on Linux (x86-64); the first node is free:
curl -fsSL https://one.semurg.io/install | sudo bash
export SEMURG_API_TOKEN="$(sudo grep '^SEMURG_API_TOKEN=' /etc/semurg/semurg.env | cut -d= -f2-)"
Every snippet below reads the token from that variable and talks to http://127.0.0.1:4000/v1/mcp.
LangChain / LangGraph
pip install langchain-mcp-adapters
import asyncio, os
from langchain_mcp_adapters.client import MultiServerMCPClient
HEADERS = {"Authorization": "Bearer " + os.environ["SEMURG_API_TOKEN"], "X-Semurg-Scope": "default"}
FACTS = {"entities": [{"name": "Ada", "type": "person"}, {"name": "Acme", "type": "organisation"}],
"relations": [{"source": "Ada", "target": "Acme", "type": "WORKS_AT"}]}
async def main():
client = MultiServerMCPClient({"semurg": {"url": "http://127.0.0.1:4000/v1/mcp",
"transport": "streamable_http", "headers": HEADERS}})
tools = {t.name: t for t in await client.get_tools()}
await tools["memory_remember"].ainvoke({"facts": FACTS})
print(await tools["memory_recall"].ainvoke({"subject": "Ada"}))
asyncio.run(main())
Bind the same tools into your LangGraph agent and it stores and recalls on its own.
The blocks below are shortened and reuse HEADERS and FACTS from this one. The complete, runnable file for each is on
https://one.semurg.io/agents.
CrewAI
pip install 'crewai-tools[mcp]'
from crewai_tools import MCPServerAdapter
params = {"url": "http://127.0.0.1:4000/v1/mcp", "transport": "streamable-http", "headers": HEADERS}
with MCPServerAdapter(params, connect_timeout=60) as tools:
by = {t.name: t for t in tools}
by["memory_remember"].run(facts=FACTS)
print(by["memory_recall"].run(subject="Ada"))
LlamaIndex
pip install llama-index-tools-mcp
import asyncio
from llama_index.tools.mcp import BasicMCPClient, McpToolSpec
async def main():
client = BasicMCPClient("http://127.0.0.1:4000/v1/mcp", headers=HEADERS)
by = {t.metadata.name: t for t in await McpToolSpec(client=client).to_tool_list_async()}
await by["memory_remember"].acall(facts=FACTS)
print(await by["memory_recall"].acall(subject="Ada"))
asyncio.run(main())
Google ADK
pip install google-adk 'mcp<2'
from google.adk.tools.mcp_tool.mcp_toolset import McpToolset, StreamableHTTPConnectionParams
toolset = McpToolset(connection_params=StreamableHTTPConnectionParams(url="http://127.0.0.1:4000/v1/mcp", headers=HEADERS))
Put toolset in your agent's tools.
Hermes Agent and OpenClaw
Hermes takes one entry under mcp_servers in ~/.hermes/config.yaml, with the token in ~/.hermes/.env. OpenClaw takes one command:
openclaw mcp set semurg '{"url":"http://127.0.0.1:4000/v1/mcp","transport":"streamable-http","headers":{"Authorization":"Bearer ${SEMURG_API_TOKEN}","X-Semurg-Scope":"default"}}'
openclaw mcp doctor semurg --probe
How we know these work
We run every one of these against our published releases.
- The libraries run end to end: remember, recall, relate, recall again, forget, each answer read back.
- For Hermes, OpenClaw and Claude Code, the agent's own MCP client must list every memory tool the node serves.
Each result, with the release and the package versions it ran on, is at https://one.semurg.io/agents. Full guides for Hermes and
OpenClaw are on our blog: https://one.semurg.io/blog/semurg-memory-for-hermes-agent
Drafted with an AI assistant (Claude); every snippet is taken from our published agents page (shortened here; the full files are there).
Top comments (0)