mcpField
R
Reverie

Reverie

本地服务
github.com记忆与知识692 周前更新

关于 Reverie

Reverie 是基于 Neo4j 的图记忆 MCP 服务,面向需要跨对话保存实体及关系的 AI Agent。它结合多种检索方式,并提供图谱整理工具维护记忆。

主要功能

  1. 01以类型化实体和关系构建图谱
  2. 02关键词、语义及模糊混合搜索
  3. 03支持多种嵌入提供方
  4. 04追踪时间信息并遍历关系
  5. 05合并重复节点并整理图谱

适用场景

  1. 01跨对话保存 Agent 的人物与项目记忆
  2. 02通过姓名别名查找相关实体
  3. 03定期清理重复或膨胀的图节点

MCP 相关

它通过 MCP 向兼容客户端提供创建、查询、更新和删除图记忆的工具,也可用于多个 Agent 共享同一图谱。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"knowall-ai-reverie": {
"command": "npx",
"args": [
"-y",
"@knowall-ai/reverie"
],
"env": {
"NEO4J_URI": "<NEO4J_URI>",
"NEO4J_USERNAME": "<NEO4J_USERNAME>",
"NEO4J_PASSWORD": "<NEO4J_PASSWORD>",
"NEO4J_DATABASE": "<NEO4J_DATABASE>",
"REVERIE_EMBEDDINGS": "<REVERIE_EMBEDDINGS>"
}
}
}
}
启动命令npx -y @knowall-ai/reverie
需要配置的环境变量
NEO4J_URIBolt URI of the Neo4j 5 database, e.g. bolt://localhost:7687
NEO4J_USERNAMENeo4j user
NEO4J_PASSWORD密钥Neo4j password
NEO4J_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+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@knowall-ai/reverie0.5.1

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

Reverie — 会做梦的图谱记忆

CodeRabbit Pull Request Reviews

Reverie 是 KnowAll AI 为 AI Agent 构建的 Neo4j 知识图谱记忆,通过 MCP 提供服务。它以 npm 包 @knowall-ai/reverie 的形式发布(是旧版软件包 @knowall-ai/mcp-neo4j-agent-memory 的后继版本)。GitHub 仓库现名为 knowall-ai/mcp-reverie,旧 URL 会重定向。

Reverie — 会做梦的图谱记忆

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 会将标签规范化为小写
    • 以键值对的形式存储任意属性
    • 自动添加时间戳,用于追踪时间信息
  • 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:获取有关如何有效使用记忆工具的帮助

    • 主题:标签、关系、最佳实践、示例
    • 为大模型提供全面指导
    • 不确定如何命名标签或关系时使用

前提条件

  1. 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
  2. Node.js(v18 或更高版本)

  3. Claude Desktop(用于 MCP 集成)

安装

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
开发
  1. 克隆仓库:
git clone https://github.com/knowall-ai/mcp-reverie.git
cd mcp-reverie
  1. 安装依赖:
npm install
  1. 构建项目:
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
openaitext-embedding-3-smallOPENAI_API_KEY;可选 OPENAI_BASE_URL
azure由部署提供AZURE_OPENAI_ENDPOINT、AZURE_OPENAI_API_KEY、AZURE_OPENAI_EMBEDDING_DEPLOYMENT;可选 AZURE_OPENAI_API_VERSION
ollamanomic-embed-text可选 OLLAMA_HOST
voyagevoyage-3-liteVOYAGE_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 等。

在适当情况下,大模型会智能地复用现有类型,以保持一致性。

连接的力量

这个记忆系统的真正价值不只在于存储单条记忆,还在于在记忆之间建立连接。随着你不断建立关系,知识图谱会变得愈发有用:

为什么连接很重要
  • 发现上下文:相互连接的记忆能提供孤立事实无法提供的丰富上下文
  • 关系模式:通过关系分析揭示隐藏的模式和见解
  • 理解时间变化:跟踪关系随时间的演变
  • 网络效应:每个新连接都会提升现有记忆的价值
建立连接的最佳实践
  1. 存储新信息时,始终留意关系:

    Bad: Just store "John is a developer"
    Good: Store John AND connect him to his company, projects, skills, and colleagues
    
  2. 使用能表达含义的语义关系类型:

    WORKS_AT, MANAGES, KNOWS, LIVES_IN, CREATED, USES, LEARNED_FROM
    
  3. 添加关系属性,提供更丰富的上下文:

    create_connection({
      "fromMemoryId": 123,
      "toMemoryId": 456, 
      "type": "WORKS_ON",
      "properties": {"role": "Lead", "since": "2023-01", "hours_per_week": 20}
    })
    
  4. 用图的方式思考:回忆信息时,将 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_PORT127.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_SECONDS5 / 5 / 1事件流重新读取图谱、主机状态和激活日志的频率

NEO4J_* 和 REVERIE_EMBEDDINGS 的工作方式与 stdio 模式完全相同。

端点身份验证返回内容
GET /health(别名 /brain/health)无{ ok, neo4j, ts }
POST /mcpbearerMCP Streamable HTTP(无状态;JSON 响应)。任何支持 Streamable HTTP 的 MCP 客户端都可以使用
GET /brain/graph?limit=400bearer连接最多或最近的节点(limit ≤ 1500)、这些节点之间的关系、按标签和关系类型统计的总数,以及 state
GET /brain/statebearerdreaming、lastActivityAt、lastDreamAt、近期读写次数、主机 CPU / 负载 / 内存、Presence usage 和 boost
GET /brain/events?limit=400bearer服务器发送事件:最近 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

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。