上下文持久化MCP服务器
一种模型上下文协议(MCP)服务器,支持VS代码中的跨窗口上下文共享。这解决了在跨具有不同存储库的多个VS代码窗口工作时丢失对话上下文的问题。
问题陈述
在单独的VS Code窗口中使用多个存储库时:
- 窗口A中与副驾驶的对话在窗口B中不可用
- 分析跨存储库的代码依赖关系需要重复上下文
- 切换窗口时没有共享以前讨论的内存
例子: 你分析 SparkJobX.java 在Repo B中使用,然后切换到Repo A以修改实现,但Copilot不知道您在Window B中的分析。
解决方案
此MCP服务器提供:
- 永久存储:所有对话都保存到SQLite
- 跨窗口访问:所有VS代码窗口都有上下文
- 智能匹配:按代码实体(类、文件、方法)自动链接相关讨论
- 混合方法:用于查询上下文的自动资源和显式工具
特性
工具(显式查询)
save_conversation-存储对话消息get_related_context-查找提及相同类/文件的讨论search_conversations-在所有工作区进行全文搜索get_workspace_summary-所有跟踪的存储库概述
资源(自动上下文)
context://recent-所有工作区中的最后50条消息context://workspace/{path}-特定存储库的历史记录
安装
- 安装依赖项:
npm install- 构建服务器:
npm run build- 在VS代码中配置:
添加到您的副驾驶设置(~/Library/Application Support/Code/User/globalStorage/github.copilot-chat/mcpServers.json 在macOS上):
{
"mcpServers": {
"context-persistence": {
"command": "node",
"args": [
"/Users/j0k0h1v/Documents/AI/McpServerPoc/dist/index.js"
]
}
}
}- 重新启动VS代码
用法
自动上下文共享
当您打开任何VS Code窗口时,Copilot可以访问:
- 来自所有窗口的最近对话
context://recent资源 - 特定于工作区的历史记录
context://workspace/{path}资源
手动上下文查询
请Copilot使用以下工具:
"Check if we discussed SparkJobX in other repositories"
→ Copilot will call get_related_context with entities: ["SparkJobX"]
"Search our previous conversations about performance optimization"
→ Copilot will call search_conversations with query: "performance optimization"
"What repositories have we analyzed?"
→ Copilot will call get_workspace_summary工作流示例
窗口A(ETL核心仓库):
You: "Analyze SparkJobX.java performance"
Copilot: [analyzes code] "The job processes 1M records..."
[Context automatically saved]窗口B(消费者回购):
You: "Why is SparkJobX slow when imported here?"
Copilot: [checks context://recent resource]
"Based on our previous analysis in ETL-core, SparkJobX processes 1M records..."建筑
┌─────────────────────────────────┐
│ VS Code Window A (Repo A) │
│ ├─ Copilot Chat │
│ └─ MCP Client │
└─────────────┬───────────────────┘
│
├─── Tools ──────┐
│ │
├─── Resources ──┤
│ │
┌─────▼─────────────────▼───┐
│ MCP Server │
│ ├─ Save conversations │
│ ├─ Extract entities │
│ └─ Match context │
└─────┬──────────────────────┘
│
┌─────▼──────────────────────┐
│ SQLite Database │
│ ~/.context-persistence-mcp│
│ ├─ messages │
│ ├─ code_entities │
│ └─ workspace_metadata │
└─────┬──────────────────────┘
│
┌─────────────┴───────────────────┐
│ VS Code Window B (Repo B) │
│ ├─ Copilot Chat │
│ └─ MCP Client │
└─────────────────────────────────┘数据库模式
消息表:
id:主键workspace_path:存储库路径role:“用户”或“助理”content:消息文本timestamp:保存时
code_entities表:
message_id:消息链接entity_type:“类”、“文件”或“方法”entity_name:实体名称
workspace_metadata表:
workspace_path:主键message_count:邮件总数last_active:上次更新时间戳
运作原理
- 实体抽取:自动检测对话中的Java类、文件和方法
- 智能存储:保存带有提取实体的消息,以便以后进行匹配
- 上下文匹配:查询时,查找提及相同实体的消息
- 跨窗口同步:所有VS Code窗口访问相同的SQLite数据库
发展
# Watch mode for development
npm run dev
# Build for production
npm run build
# Run directly
npm start数据库位置
SQLite数据库存储在:
~/.context-persistence-mcp/context.db您可以使用任何SQLite浏览器或CLI进行检查:
sqlite3 ~/.context-persistence-mcp/context.db限制和未来的增强
当前(MVP):
- 实体的简单关键字匹配
- 单用户本地存储
- Copilot手动调用工具
计划:
- 基于嵌入的语义相似度
- 从pom.xml/build.gradle自动检测依赖关系
- 存储库关系映射
- 支持多用户身份验证
- 基于相关性的自动上下文注入
- 基于时间的上下文修剪
故障排除
服务器未启动?
- 检查路径
mcpServers.json是正确的 - 验证
dist/index.js建筑后存在 - 检查VS代码输出面板上的MCP日志
没有出现上下文?
- 确保对话已保存(请Copilot先明确保存)
- 检查数据库:
sqlite3 ~/.context-persistence-mcp/context.db "SELECT COUNT(*) FROM messages;" - 配置更改后重新启动VS代码
未找到相关上下文?
- 实体提取是基于模式的-使用清晰的类/文件名
- 尝试显式搜索:“在我们的对话中搜索\[关键字\]”
贡献
这是一个POC。欢迎反馈和改进!
许可证
麻省理工学院
