Eywa MCP
Claude Code的跨会话内存(MCP服务器+CLI)。
  
问题
Claude Code会话是短暂的。会话之间失去了上下文,所以每次都要重新开始,重新解释你正在做什么。
对于拥有数百个会话的重度Claude Code用户来说,上下文重置成为了主要的生产力消耗。
解决方案
Eywa在每个会话结束时提取结构化切换,并在下一个会话开始时检索相关的过去上下文。
这个名字来源于《阿凡达》中的神经网络:艾娃连接会话的方式就像艾娃连接活记忆一样。
运作原理
Eywa围绕您的Claude Code成绩单运行一个确定性管道:
- 会话检测:4策略回退(显式会话ID、PID跟踪、CWD mtime、全局mtime)。
- 会话转换:JSONL转录->标准化markdown对话。
- 提取:LLM支持的结构化切换提取。
- 索引:带元数据的倒排索引+TF-IDF友好的关键字/项目图。
- 检索:查询关键字评分+近因衰减,返回相关切换。
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 .env4) 注册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 | /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/.md - 更新
handoff-index.json逐步地 - 打印进度和运行结束摘要
许可证
MIT。看 许可证.
