会话记忆工具

Eywa MCP是一款为Claude Code设计的跨会话记忆工具,通过提取和检索会话间的结构化上下文,提升开发效率。

  • by buildoak
  • Python
  • 本地部署
  • 7 星标
  • 更新于
在 GitHub 查看 buildoak/eywa-mcp

使用说明

Eywa MCP

Claude Code的跨会话内存(MCP服务器+CLI)。

问题

Claude Code会话是短暂的。会话之间失去了上下文,所以每次都要重新开始,重新解释你正在做什么。

对于拥有数百个会话的重度Claude Code用户来说,上下文重置成为了主要的生产力消耗。

解决方案

Eywa在每个会话结束时提取结构化切换,并在下一个会话开始时检索相关的过去上下文。

这个名字来源于《阿凡达》中的神经网络:艾娃连接会话的方式就像艾娃连接活记忆一样。

运作原理

Eywa围绕您的Claude Code成绩单运行一个确定性管道:

  1. 会话检测:4策略回退(显式会话ID、PID跟踪、CWD mtime、全局mtime)。
  2. 会话转换:JSONL转录->标准化markdown对话。
  3. 提取:LLM支持的结构化切换提取。
  4. 索引:带元数据的倒排索引+TF-IDF友好的关键字/项目图。
  5. 检索:查询关键字评分+近因衰减,返回相关切换。
Claude Code JSONL Session
          |
          v
 [Session Detection]
          |
          v
 [JSONL -> Markdown]
          |
          v
 [Structured Extraction]
          |
          v
 [Handoff Markdown + Index]
          |
          v
      eywa_get()

两阶段设置

第一阶段:批量索引(一次性设置)

使用 eywa-batch 通过以下方式批量处理现有的历史会话 开放路由.

  • 您可以选择任何OpenRouter型号(Gemini Flash、Claude、GPT、Llama等)

  • 默认批处理模型: google/gemini-3-flash-preview

  • 专为之前的数百场会议而设计

  • 快速+低成本提取通道

  • 构建您的初始切换语料库和索引

第二阶段:运行时

跑 eywa-mcp 与Claude Code一起用于正在进行的会话。

  • 在会话结束时使用Claude(十四行诗)提取(eywa_extract())
  • 在会话开始时检索相关上下文(eywa_get())
  • 安装配套CLI(eywa)用于脚本和手动使用

安装

先决条件

  • Python 3.10+
  • Node.js 18+
  • 克劳德代码

选项A:Bootstrap(推荐)

运行repo引导脚本以检查先决条件并安装Python和Node依赖项:

./setup.sh

这将安装三个命令:

  • eywa-mcp (MCP stdio服务器)
  • eywa (CLI:获取/提取/重建索引)
  • eywa-batch (OpenRouter支持的批索引)

选项B:手动安装

1) 安装Python包(可编辑)

pip install -e .

2) 安装节点提取器依赖项

cd eywa/extractors
npm install
cd ../..

3) 配置环境

cp .env.example .env

4) 注册MCP服务器

增添 claude_desktop_config.json 或 ~/.claude.json:

{
  "mcpServers": {
    "eywa": {
      "command": "eywa-mcp"
    }
  }
}

5) 手动运行(可选)

eywa-mcp

配置

变量 默认值 描述
EYWA_DATA_DIR ~/.eywa 用于切换和索引的运行时存储根
EYWA_SESSIONS_DIR ~/.claude/projects Claude代码会话JSONL根
EYWA_TASKS_DIR <EYWA_SESSIONS_DIR parent>/tasks 用于基于PID的会话检测的任务目录
EYWA_CLAUDE_MODEL sonnet 运行时提取使用的模型(eywa_extract)
EYWA_OPENROUTER_MODEL google/gemini-3-flash-preview 批索引使用的OpenRouter模型(eywa-batch)
OPENROUTER_API_KEY (未设置) 用于批量提取的OpenRouter API密钥
EYWA_BATCH_DELAY 0.5 批处理API调用之间的延迟(秒)
EYWA_BATCH_CONCURRENCY 5 并发会话由处理 eywa-batch
EYWA_TIMEZONE UTC 渲染会话时间戳的时区
EYWA_LOG_LEVEL INFO 记录冗长

用法

Eywa公开了两个MCP工具(用于Claude Code)和一个CLI(用于人员/脚本)。

eywa_get()

从之前的交接中检索相关上下文。

无查询(最近会话):

{"max_handoffs": 3}

通过查询:

{"query": "mcp tool routing and index scoring", "days_back": 30, "max_handoffs": 4}

有了更严格的选择:

{"query": "release pipeline", "days_back": 7, "max_handoffs": 2}

样本输出:

## Eywa: 2 past sessions

# Implemented MCP routing fallback logic

## What Happened
- Added explicit tool dispatch guard for unknown tool names.
- Introduced parse-time validation for input payload constraints.

## Open Threads
- Add integration tests for malformed tool inputs.

eywa_extract()

从活动会话中提取并保持切换。

自动检测活动会话:

{}

显式会话ID:

{"session_id": "12345678-1234-1234-1234-123456789abc"}

CLI(eywa)

MCP工具的手动等效工具:

eywa get                          # 3 most recent sessions
eywa get "mcp tool routing" --days-back 30 --max 5
eywa extract                      # auto-detect current session
eywa extract 1b2f6f6b             # 8-char short ID
eywa extract 1b2f6f6b-65a6-...    # full UUID
eywa rebuild-index                # rebuild index from stored handoffs

速度与批量索引

运行历史会话的一次性批量导入:

eywa-batch

首先设置OpenRouter API密钥:

export OPENROUTER_API_KEY=...

选择型号(可选):

export EYWA_OPENROUTER_MODEL=anthropic/claude-3.5-sonnet

干运行(无API调用):

eywa-batch --dry-run

呼叫之间的自定义延迟:

eywa-batch --delay 1.0

设置并发性(1-20):

eywa-batch --concurrency 10

限制跑步:

eywa-batch --max 50

强制重新索引所有会话:

eywa-batch --reindex

期待什么:

  • 扫描 EYWA_SESSIONS_DIR 为了 *.jsonl
  • 跳过已索引的会话(除非 --reindex)
  • 跳过非常短/琐碎的会话
  • 将OpenRouter聊天完成功能用于您选择的模型
  • 将移交内容写入 YYYY/MM/DD/<session_id>.md
  • 更新 handoff-index.json 逐步地
  • 打印进度和运行结束摘要

许可证

MIT。看 许可证.