关于 Reverie
Reverie 是面向 AI Agent 的 Neo4j 图记忆 MCP 服务,用实体和类型化关系组织信息,而非孤立事实,并提供混合检索与图维护工具。
主要功能
- 01类型化实体与关系图
- 02关键词、语义和模糊混合搜索
- 03创建、更新和删除记忆
- 04关系遍历与日期查询
- 05dream 清理与重复项合并
适用场景
- 01在多个 Agent 间共享持久记忆
- 02按不同拼写查找实体
- 03探索人物、项目和决策的关联
- 04检查并整理记忆图
MCP 相关
向 MCP 客户端提供记忆搜索、图编辑、查询、统计、使用指导和清理工具。多个 Agent 可使用同一 Neo4j 图。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y @knowall-ai/reverieNEO4J_URIBolt URI of the Neo4j 5 database, e.g. bolt://localhost:7687NEO4J_USERNAMENeo4j userNEO4J_PASSWORD密钥Neo4j passwordNEO4J_DATABASEDatabase name (Enterprise only; omit on Community Edition)REVERIE_EMBEDDINGSEmbedding provider for semantic search: local (default, no API key), openai, azure, ollama, voyage or none本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Reverie — 会做梦的图谱记忆
Reverie 是 KnowAll AI 为 AI Agent 构建的 Neo4j 知识图谱记忆,通过 MCP 提供服务。它以 npm 包 @knowall-ai/reverie 的形式发布(是旧版软件包 @knowall-ai/mcp-neo4j-agent-memory 的后继版本)。GitHub 仓库现名为 knowall-ai/mcp-reverie,旧 URL 会重定向。

Reverie 将 Agent 的记忆从一堆事实变成一张展示其世界中各种实体及其关系的地图,并保持这张地图的健康。它是一个 MCP 服务,因此任何支持模型上下文协议(Claude Desktop、OpenClaw、Azure AI Foundry、Cursor……)的 Agent 都能使用同一张图谱;Hermes Agent 的记忆提供方版本位于 hermes-reverie。
为什么选择 Reverie
- 类型化实体图谱,而非事实存储。 人物、组织、项目、地点、概念、会议和决策都是带有类型化关系的节点。“我们和爱尔兰足协的谁聊过 Winnie?”是一次图谱遍历,而不是相似度搜索。
- 搜索“Benjamin”时也能找到“Ben”。 混合使用关键词、语义和模糊姓名搜索;默认使用本地嵌入(无需 API 密钥),也可通过配置切换为 OpenAI、Azure OpenAI、Ollama 或 Voyage。
- 它会做梦。
dream工具可安全合并重复项、规范标签、重新生成嵌入、统计孤立节点,并标记已变成属性堆积的节点,让夜间任务保持图谱整洁。 - 一张图谱,适用于任何 Agent。 KnowAll 使用相同的约定运行 Sallie(OpenClaw)和 Poppie(Hermes);Reverie 让它们共享所知。
- 由大模型驱动、操作透明的工具。 简单的原子操作;实体识别和冲突解决由模型负责,且每项操作都明确可见。
- 由你运行。 可在自己的机器或 VM 上运行 Neo4j。除非你选择远程嵌入提供方,否则数据不会离开本地。
快速开始 🚀
你可以直接使用 npx 运行此 MCP 服务:
npx -y @knowall-ai/reverie
也可以将其添加到 Claude Desktop 配置中:
{
"mcpServers": {
"reverie": {
"command": "npx",
"args": ["-y", "@knowall-ai/reverie"],
"env": {
"NEO4J_URI": "bolt://localhost:7687",
"NEO4J_USERNAME": "neo4j",
"NEO4J_PASSWORD": "your-password",
"NEO4J_DATABASE": "neo4j"
}
}
}
}
功能
- 🧠 持久化记忆存储 - 跨对话存储和检索记忆
- 🔗 语义关系 - 在记忆之间建立有意义的联系(KNOWS、WORKS_AT、CREATED 等)
- 🔍 混合搜索 - 对所有记忆属性进行关键词加语义搜索,默认使用本地嵌入
- 🏷️ 灵活的标签 - 可为记忆使用任意标签(person、place、project、idea 等)
- ⏰ 时间追踪 - 自动添加时间戳并支持基于日期的查询
- 🌐 图谱探索 - 遍历关系,发现关联信息
- 🎯 上下文感知 - 通过搜索深度纳入相关记忆
- 🔧 针对大模型优化 - 简单的工具,让 AI 处理复杂性
- 🏢 企业就绪 - 支持多个 Neo4j 数据库
- 📚 内置指南 - 获取最佳实践和使用模式方面的帮助
理念:由大模型驱动的智能
与将复杂逻辑嵌入工具的传统方案不同,此服务提供简单的原子操作,并让大模型处理所有智能任务:
- 没有隐藏逻辑:工具只执行其声明的操作——不会自动消歧或智能匹配
- 由大模型决定一切:实体识别、关系推断和冲突解决
- 操作透明:每项操作都明确且可预测
- 最大限度的灵活性:大模型可以不受工具限制地采用任何策略
搜索行为
search_memories 采用混合搜索:每个结果根据关键词、语义或模糊名称信号中得分最高的一项进行排序。请参阅下文的 搜索。
这种方法让系统更强大、更灵活,因为大模型能力的提升会直接转化为更出色的记忆管理。
搜索
search_memories 通过以下模式支持四种匹配信号——关键词、语义、模糊和精确:
hybrid(默认):按得分最高的信号排序——查询词的关键词占比、语义余弦相似度或模糊名称相似度keyword:将查询中的任意词作为子串,与任意可搜索内容属性进行匹配(时间戳、status和嵌入字段不会参与匹配)semantic:仅使用嵌入;如果嵌入不可用,则回退到关键词匹配(而hybrid会保留其关键词和模糊匹配信号)fuzzy:使用拼写、前缀和语音匹配拼错或听错的名称及别名;无需嵌入即可通过 “Ben Wicks” 找到 “Benjamin Weeks”exact:对name、aliases或email进行不区分大小写的完全匹配;这是创建记忆前应执行的精确查找,因此 “ben weeks” 只会找到 “Ben Weeks”,不会找到其他内容
已归档的记忆(status = 'archived')不会出现在结果中,也不会出现在 list_memory_labels 中,除非传入 include_archived: true。返回的关系包含 _start 和 _end 节点 ID,因此始终可以还原连接的方向。
使用 similarity_threshold(默认值为 0.4;必须介于 0 和 1 之间,其他值将被拒绝)控制语义匹配的严格程度。使用 fuzzy_threshold(默认值为 0.85,范围为 0–1)控制模糊匹配的严格程度。结果包含 _score、_match,以及模糊匹配时的 _matched(存储的名称或别名)。对于名称不同的匹配结果,请向用户确认;Bill/William 之类的昵称需要使用 aliases。
Neo4j Enterprise 支持
此服务现在支持连接到 Neo4j Enterprise Edition 中的指定数据库。默认情况下,它连接到 “neo4j” 数据库,但你可以使用 NEO4J_DATABASE 环境变量指定其他数据库。
记忆工具
-
search_memories:在知识图谱中搜索并检索记忆- 混合搜索:结合关键词、语义和模糊名称搜索;搜索
Ben Wicks可以找到Benjamin Weeks - 将
search_mode设为hybrid、keyword、semantic、fuzzy或exact - 调整
similarity_threshold(默认值为0.4)和fuzzy_threshold(默认值为0.85) - 返回的记忆中,模糊匹配结果包含
_score、_match和_matched - 可按记忆类型筛选(不区分大小写,因此
person和Person均可使用)、日期、深度、结果数量上限和排序方式
- 混合搜索:结合关键词、语义和模糊名称搜索;搜索
-
create_memory:在知识图谱中创建新记忆- 类型系统灵活——任何符合普通标识符格式的标签均可;首字母大写的单数形式是规范形式(Person、Place、Project、Skill 等),而
dream会将标签规范化为小写 - 以键值对的形式存储任意属性
- 自动添加时间戳,用于追踪时间信息
- 类型系统灵活——任何符合普通标识符格式的标签均可;首字母大写的单数形式是规范形式(Person、Place、Project、Skill 等),而
-
create_connection:在记忆之间创建关系- 使用语义关系类型连接记忆(KNOWS、WORKS_AT、LIVES_IN 等)
- 为关系添加属性(since、role、status 等)
- 构建复杂的知识网络
-
update_memory:更新现有记忆的属性- 当节点超出属性数量上限时会返回
_hint:图谱用于存储实体和关系,而不是充当笔记本 - 添加或修改任意属性
- 将属性设为 null 以移除
- 当节点超出属性数量上限时会返回
-
update_connection:更新关系属性- 修改关系元数据
- 追踪随时间发生的变化
-
delete_memory:移除记忆及其所有连接- 请谨慎使用——删除后无法恢复
- 自动移除所有关系
-
delete_connection:移除特定关系- 精确移除关系
- 保留记忆
-
list_memory_labels:列出当前使用的所有唯一记忆标签- 显示所有标签及其数量
- 有助于保持一致性
- 防止出现重复的标签变体
-
query_memories:运行只读 Cypher 查询- 接受 Cypher 字符串及可选参数
- 在 Neo4j READ 事务中运行(服务会拒绝写入),最多返回 200 行,超时设为 10 秒
- 拒绝写入子句、
CALL子查询,以及小型只读允许列表(db.labels、db.propertyKeys、db.index.*.query*、架构过程)以外的任何过程。为确保安全,建议在条件允许时使用只读 Neo4j 角色运行服务
-
memory_stats:汇总当前图谱- 返回节点、关系、标签、关系类型、嵌入和孤立节点的数量
-
dream:以确定性方式清理并整合图谱- 将小写标签重新标记为首字母大写的形式(
person→Person),在 APOC 可用时合并同一标签下名称相同的节点,并刷新嵌入 - 合并时保留幸存节点的
name、时间戳和向量,并合并其他所有属性(冲突值会变成列表,不会丢弃任何内容);跳过身份字段(email、phone、website、company、organisation、organization)不同的节点对,以免将两个不同的 “John Smith” 合并。报告会在duplicates下列出每个组,并说明已合并的内容以及跳过的内容和原因。请先使用dry_run: true进行检查 - 报告属性数量超过
REVERIE_MAX_PROPERTIES(默认值为 30 个实际属性)的bloated节点,并列出看起来像带日期事实或散文的键,以便夜间休整时将其归并为属性、关系或备注 - 支持
dry_run,生成不写入数据的报告
- 将小写标签重新标记为首字母大写的形式(
-
get_guidance:获取有关如何有效使用记忆工具的帮助- 主题:标签、关系、最佳实践、示例
- 为大模型提供全面指导
- 不确定如何命名标签或关系时使用
前提条件
-
Neo4j 数据库 5.9 或更高版本(
dream工具使用COUNT {}和IS :: STRING);合并重复项需要 APOC- 安装 Neo4j Community 或 Enterprise Edition
- 从 neo4j.com/download 下载
- 或使用 Docker:
docker run -p 7474:7474 -p 7687:7687 -e NEO4J_AUTH=neo4j/password neo4j
-
Node.js(v18 或更高版本)
- 运行 MCP 服务所需
- 从 nodejs.org 下载
-
Claude Desktop(用于 MCP 集成)
- 从 claude.ai/download 下载
安装
MCP Registry
Reverie 已列入 MCP Registry,名称为 ai.knowall/reverie(KnowAll 的域命名空间,已通过 knowall.ai 上的 DNS TXT 记录验证),是曾列在 modelcontextprotocol/servers README 中的“Neo4j Agent Memory”条目的后继项目。本仓库中的 server.json 即为该条目;发布工作流会在每次打标签时重新发布它。
通过 Smithery 安装
要通过 Smithery 自动为 Claude Desktop 安装 Reverie(目前仍以其旧版包名编入索引):
npx -y @smithery/cli install @knowall-ai/mcp-neo4j-agent-memory --client claude
开发
- 克隆仓库:
git clone https://github.com/knowall-ai/mcp-reverie.git
cd mcp-reverie
- 安装依赖:
npm install
- 构建项目:
npm run build
配置
环境变量
服务需要以下环境变量:
NEO4J_URI:Neo4j 数据库 URI(必填,例如 bolt://localhost:7687)NEO4J_USERNAME:Neo4j 用户名(必填)NEO4J_PASSWORD:Neo4j 密码(必填)NEO4J_DATABASE:Neo4j 数据库名称(可选)——适用于包含多个数据库的 Neo4j Enterprise
嵌入
设置 REVERIE_EMBEDDINGS,以选择混合搜索和语义搜索所用的嵌入提供方。更改 REVERIE_EMBEDDINGS 或 REVERIE_EMBEDDING_MODEL 后,节点会在下次搜索时延迟重新嵌入,也可在运行 dream 时立即重新嵌入。
REVERIE_EMBEDDINGS | 默认模型 | 必需的环境变量 |
|---|---|---|
local(默认) | Xenova/all-MiniLM-L6-v2 | 无;可选 REVERIE_MODEL_CACHE |
openai | text-embedding-3-small | OPENAI_API_KEY;可选 OPENAI_BASE_URL |
azure | 由部署提供 | AZURE_OPENAI_ENDPOINT、AZURE_OPENAI_API_KEY、AZURE_OPENAI_EMBEDDING_DEPLOYMENT;可选 AZURE_OPENAI_API_VERSION |
ollama | nomic-embed-text | 可选 OLLAMA_HOST |
voyage | voyage-3-lite | VOYAGE_API_KEY |
none | 已禁用 | 无 |
使用 REVERIE_EMBEDDING_MODEL 可覆盖任意提供方的模型名称。远程提供方每次请求最多批量处理 64 条文本,超时设为 REVERIE_EMBED_TIMEOUT_MS(默认值为 30000,最大值为 120000),且必须通过 https 访问;仅 localhost 接受纯 http。
local 提供方首次使用时会从 Hugging Face 下载模型(约 23 MB)并缓存。如果下载失败或任何提供方出错,语义搜索会退回到关键词匹配,混合搜索在本次调用中会保留关键词和模糊匹配;错误会记录到 stderr。设置 REVERIE_EMBEDDINGS=none 可完全关闭嵌入。
每个节点会存储两个向量:embedding(标签、名称和每个文本属性)以及 name_embedding(仅标签、名称和别名),此外还有 embedding_model 和 embedded_at。语义得分取两者中较高者,因此像 Ben Weeks 这样的简短查询仍能匹配描述丰富的 Benjamin Weeks。工具绝不会返回这些字段。
设置环境变量
开发环境
将 .env.example 复制为 .env,并填写你的凭据:
cp .env.example .env
# Edit .env with your Neo4j credentials
Claude Desktop
将环境变量添加到 Claude Desktop 配置中(参见上文的快速入门)。
使用示例
LLM 会处理所有复杂工作,包括判断要存储哪些信息,以及如何关联记忆:
存储信息
User: "Remember that John works at Google as a software engineer"
Assistant: I'll remember that John works at Google as a software engineer.
[Behind the scenes, the LLM does:
1. search_memories({"query": "John"}) - Check if John exists
2. search_memories({"query": "Google"}) - Check if Google exists
3. create_memory({"label": "Person", "properties": {"name": "John", "occupation": "software engineer"}})
4. create_memory({"label": "Organization", "properties": {"name": "Google"}})
5. create_connection({"fromMemoryId": 123, "toMemoryId": 456, "type": "WORKS_AT"})]
User: "Remember that Sarah is John's manager and she started in 2019"
Assistant: I'll add that information about Sarah.
[The LLM searches for John, creates Sarah, and connects them with a MANAGES relationship including the start date]
检索信息
User: "Who works at Google?"
Assistant: Let me search for people who work at Google.
[LLM uses: search_memories({"query": "Google", "depth": 2})]
Based on my memory:
- John - Software Engineer at Google
- Sarah - Manager at Google (manages John, started 2019)
User: "What do you remember about John?"
Assistant: Here's what I know about John:
[LLM uses: search_memories({"query": "John", "depth": 2})]
- Works at Google as a Software Engineer
- Sarah is his manager
- [Any other connected memories found in the search]
建立关系
User: "John and Sarah are working on Project Atlas together"
Assistant: I'll connect John and Sarah to Project Atlas.
[The LLM:
1. Searches for John and Sarah to get their IDs
2. Creates Project Atlas: create_memory({"label": "Project", "properties": {"name": "Project Atlas"}})
3. Connects them: create_connection({"fromMemoryId": johnId, "toMemoryId": projectId, "type": "WORKS_ON"})
4. create_connection({"fromMemoryId": sarahId, "toMemoryId": projectId, "type": "WORKS_ON"})]
连接到特定数据库
对于使用多个数据库的 Neo4j Enterprise 用户,可以指定要连接的数据库:
{
"env": {
"NEO4J_URI": "bolt://localhost:7687",
"NEO4J_USERNAME": "neo4j",
"NEO4J_PASSWORD": "your-password",
"NEO4J_DATABASE": "myCustomDatabase"
}
}
这会连接到“myCustomDatabase”,而不是默认的“neo4j”数据库。
更复杂的示例
查找相关信息
User: "Show me all employees in the Sales department"
Assistant: Let me search for employees in the Sales department.
[LLM uses: search_memories({"query": "Sales department", "depth": 2})]
I found these employees in the Sales department:
- John Smith (Sales Manager)
- Sarah Johnson (Sales Representative)
- Mike Brown (Account Executive)
创建特定领域的记忆
User: "Create a product called 'Premium Coffee' with price $24.99"
Assistant: I'll create that product for you.
[LLM uses: create_memory({"label": "Product", "properties": {"name": "Premium Coffee", "price": 24.99}})]
Created Premium Coffee product with ID: 456
管理关系
User: "The Premium Coffee uses beans from our Colombian Supplier"
Assistant: I'll connect Premium Coffee to the Colombian Supplier.
[LLM:
1. search_memories({"query": "Premium Coffee"})
2. search_memories({"query": "Colombian Supplier"})
3. create_connection({"fromMemoryId": 456, "toMemoryId": 789, "type": "SUPPLIED_BY"})]
Connected Premium Coffee to Colombian Supplier
高级查询
大模型可以通过智能使用搜索工具来处理复杂查询:
基于词语的搜索
User: "Find Ben Weeks"
Assistant: I'll search for memories containing "Ben" or "Weeks".
[LLM uses: search_memories({"query": "Ben Weeks"})]
I found several people matching your search:
- Ben Weeks - Software Engineer at TechCorp (exact match)
- Sarah Ben - Data Scientist at DataCo (contains "Ben")
- John Weeks - Project Manager (contains "Weeks")
The most likely match appears to be Ben Weeks, the Software Engineer.
关键词匹配会查找查询中的任意词语,并根据找到的词语占比评分。混合搜索还会考虑语义匹配和模糊名称匹配,并按每条结果的最佳信号进行排序。
最近的记忆(过去 7 天)
User: "What new people have I met in the last week?"
Assistant: I'll search for people added to your memory in the last 7 days.
[LLM calculates the date 7 days ago and uses:
search_memories({
"query": "",
"label": "person",
"since_date": "2024-01-20T00:00:00Z",
"order_by": "created_at DESC"
})]
Here are the new people you've met in the last week:
- Sarah Chen - Met at tech conference on Monday
- Dr. Michael Roberts - New physician, first appointment Tuesday
- Emma Wilson - Joined your project team on Wednesday
- James Park - Coffee meeting about potential collaboration Thursday
消歧
User: "What does John do?"
Assistant: I found multiple people named John. Let me show you what I know:
[LLM uses: search_memories({"query": "John", "type": "Person", "depth": 1})]
1. John Doe - Software Engineer at Google
2. John Smith - Sales Manager in Sales Department
3. John Brown - Project Manager on Project Atlas
Which John were you asking about?
时间查询
User: "What events did I attend last month?"
Assistant: I'll search for event memories and check their dates.
[LLM uses: search_memories({"query": "", "label": "event", "sort_by": "created_at", "sort_order": "desc"})]
[Filters results to last month based on created_at or date properties]
Here are the events you attended last month:
- Tech Innovation Summit (March 5-6) - Keynote speaker
- Team Building Workshop (March 12) - With engineering team
- Client Dinner Meeting (March 18) - Project kickoff with ABC Corp
- WebDev Conference (March 25-27) - Attended 5 sessions on React
灵活的记忆类型
系统不会强制使用严格的类型——你可以创建任何合理的记忆类型:
常见类型(首字母大写的单数形式为规范形式;dream 接受小写形式并会将其规范化):person、place、organization、project、event、topic、object、animal、plant、food、activity、media、skill、document、meeting、task、habit、health、vehicle、tool、idea、goal
但你也可以使用任何类型(任何普通标识符):recipe、dream、memory、quote、book、movie、emotion、relationship、appointment、medication、exercise、symptom、payment、contract 等。
在适当情况下,大模型会智能地复用现有类型,以保持一致性。
连接的力量
这个记忆系统的真正价值不只在于存储单条记忆,还在于在记忆之间建立连接。随着你不断建立关系,知识图谱会变得愈发有用:
为什么连接很重要
- 发现上下文:相互连接的记忆能提供孤立事实无法提供的丰富上下文
- 关系模式:通过关系分析揭示隐藏的模式和见解
- 理解时间变化:跟踪关系随时间的演变
- 网络效应:每个新连接都会提升现有记忆的价值
建立连接的最佳实践
-
存储新信息时,始终留意关系:
Bad: Just store "John is a developer" Good: Store John AND connect him to his company, projects, skills, and colleagues -
使用能表达含义的语义关系类型:
WORKS_AT, MANAGES, KNOWS, LIVES_IN, CREATED, USES, LEARNED_FROM -
添加关系属性,提供更丰富的上下文:
create_connection({ "fromMemoryId": 123, "toMemoryId": 456, "type": "WORKS_ON", "properties": {"role": "Lead", "since": "2023-01", "hours_per_week": 20} }) -
用图的方式思考:回忆信息时,将 depth 设为大于 1,以探索网络:
search_memories({"query": "John", "depth": 3}) // Explores connections up to 3 hops away
请记住:没有连接的记忆,就像图书馆里一本没有编目的书——它确实存在,但用途有限。记忆之间的连接越多,知识图谱就越智能、越有用。
测试
npm run build # TypeScript → build/
npm run test:unit # pure-module unit tests + server startup checks, no database needed
npm run test:integration # drives the built server over stdio against a live Neo4j
npm run test:coverage # everything under c8 with a coverage gate (70% lines and functions)
集成测试需要一个启用了 APOC 的 Neo4j 5,并且会清空其指向的数据库,因此请为测试提供一个可随时丢弃的数据库:
docker run -d --rm --name reverie-test-neo4j -p 17687:7687 \
-e NEO4J_AUTH=neo4j/test-password -e NEO4J_PLUGINS='["apoc"]' neo4j:5-community
NEO4J_URI=bolt://127.0.0.1:17687 NEO4J_USERNAME=neo4j NEO4J_PASSWORD=test-password \
REVERIE_TEST_DESTRUCTIVE=1 npm run test:coverage
REVERIE_TEST_DESTRUCTIVE=1 是明确的主动启用选项:未设置时,测试套件会拒绝运行。设置后,测试套件会清空 NEO4J_URI 指向的数据库,因此只有在使用可随时丢弃的数据库时才能设置它。测试套件最多等待一分钟,直到经过身份验证的 Bolt 可用后才会启动;远程 NEO4J_URI 必须使用 bolt+s:// 或 neo4j+s://,并通过证书验证(不允许使用 +ssc)。
CI 会在每个拉取请求中使用 Neo4j 服务容器运行相同的测试套件;如果覆盖率低于门槛,构建就会失败。首次进行语义搜索时会下载本地嵌入模型(约 23 MB);CI 会缓存该模型。
使用 MCP Inspector 进行交互式测试
如需交互式测试和调试,请使用 MCP Inspector:
# Quick start with environment variables from .env
./run-inspector.sh
# Or manually with specific environment variables
NEO4J_URI=bolt://localhost:7687 \
NEO4J_USERNAME=neo4j \
NEO4J_PASSWORD=your-password \
npx @modelcontextprotocol/inspector build/index.js
Inspector 提供了一个 Web UI,可用于:
- 交互式测试所有可用工具
- 查看实时请求/响应数据
- 验证 Neo4j 连接
- 调试工具参数和响应
HTTP 模式(reverie serve)
单独运行 reverie 会启动 stdio MCP 服务。reverie serve 则通过
Streamable HTTP
运行同一服务,并添加一个只读的 Brain API,供 KnowAll Agents Portal
的 Brain 选项卡实时绘制图谱。两者共用一个 bearer token 进行保护;只有健康检查接口无需认证。
REVERIE_SERVE_TOKEN=$(openssl rand -hex 24) NEO4J_PASSWORD=… reverie serve
# Reverie HTTP server listening on http://127.0.0.1:8643
| 变量 | 默认值 | 用途 |
|---|---|---|
REVERIE_SERVE_TOKEN | (必需) | 客户端必须通过 Authorization: Bearer … 发送的 bearer token |
REVERIE_HTTP_HOST / REVERIE_HTTP_PORT | 127.0.0.1 / 8643 | 绑定地址;通过反向代理访问时,请将其保留在环回地址上 |
REVERIE_ALLOWED_ORIGINS | 无 | 允许调用 API 的浏览器来源列表,以逗号分隔(这些来源会获得 CORS 标头和预检响应);携带其他任何 Origin 标头的请求会收到 403。服务器到服务器的客户端不会发送 Origin,因此无需在此配置 |
REVERIE_EVENTS_PATH | ~/.reverie/events.jsonl | 激活日志(见下文);设为空字符串可禁用 |
REVERIE_DREAMS_DIR | 未设置 | 可选的梦境日记文件夹(*.md);最新文件记录最近一次梦境 |
REVERIE_USAGE_STATS_PATH / REVERIE_BOOST_STATE_PATH | ~/call-transcripts/usage-stats.json / boost-state.json | 透传到 state 的 Presence HUD 文件(仅包含最近 15 分钟内写入的用量信息) |
REVERIE_GRAPH_POLL_SECONDS / REVERIE_STATE_SECONDS / REVERIE_EVENT_POLL_SECONDS | 5 / 5 / 1 | 事件流重新读取图谱、主机状态和激活日志的频率 |
NEO4J_* 和 REVERIE_EMBEDDINGS 的工作方式与 stdio 模式完全相同。
| 端点 | 身份验证 | 返回内容 |
|---|---|---|
GET /health(别名 /brain/health) | 无 | { ok, neo4j, ts } |
POST /mcp | bearer | MCP Streamable HTTP(无状态;JSON 响应)。任何支持 Streamable HTTP 的 MCP 客户端都可以使用 |
GET /brain/graph?limit=400 | bearer | 连接最多或最近的节点(limit ≤ 1500)、这些节点之间的关系、按标签和关系类型统计的总数,以及 state |
GET /brain/state | bearer | dreaming、lastActivityAt、lastDreamAt、近期读写次数、主机 CPU / 负载 / 内存、Presence usage 和 boost |
GET /brain/events?limit=400 | bearer | 服务器发送事件:最近 30 条 activation 事件,然后是 state;此后,每当发生新的 activation 时都会推送,每当图谱发生变化时都会推送 graph 差异(nodesAdded、nodesUpdated、nodesRemoved、relsAdded、relsRemoved、stats),每隔几秒推送一次 state,轮询失败时推送 error |
Brain API 中的节点 ID 与工具返回的数字 ID 相同,但以字符串形式表示,因此激活事件和快照节点可以对应起来。归档记忆不会显示。嵌入向量绝不会离开服务。
激活日志。 每次运行 search_memories(recall)、create_memory / update_memory(remember)、create_connection / update_connection(connect)、delete_*(forget)以及实际的 dream(dream.start / dream.end)都会向 REVERIE_EVENTS_PATH 追加一行 JSON,无论请求由哪种传输方式提供服务。日志只包含 ID、名称和搜索词,仅用户可访问(权限模式为 0600),上限为 5 MB / 5,000 行,Brain 视图的动态效果由此实现。图谱本身绝不会记录查看过哪些内容。
在 Agent 的 VM 上通过 Caddy 部署:
agent.example.com {
# … the agent's other routes …
handle /reverie/* {
uri strip_prefix /reverie
reverse_proxy 127.0.0.1:8643
}
}
并作为服务运行:
[Unit]
Description=Reverie graph memory (HTTP mode)
After=network-online.target
[Service]
User=agent
EnvironmentFile=/home/agent/.config/reverie.env # NEO4J_*, REVERIE_SERVE_TOKEN, REVERIE_EMBEDDINGS…
ExecStart=/usr/bin/reverie serve
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
将 https://<agent host>/reverie 作为 Agent 的 brainUrl 提供给 portal,并将同一个 token 作为 REVERIE_TOKEN。
许可证
MIT
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。