内存交换
A.NET工具,使markdown知识文件(如Cline风格的“内存库”)可由GitHub Copilot(或任何兼容MCP的客户端)通过以下方式搜索 模型上下文协议(MCP).
它将markdown文件预处理为语义分块、向量嵌入的文档,并通过MCP服务器提供这些文档,该服务器具有搜索、检索文件和诊断索引健康状况的工具。
特性
- 默认情况下完全本地 --SQLite+ONNX(
all-MiniLM-L6-v2)嵌入,无云依赖 - Azure提供商 可用——Azure AI搜索+Azure OpenAI用于云规模部署
- 混合搜索 --FTS5 BM25关键字搜索+余弦向量相似度,通过互序融合(RRF)合并
- 领域感知增强 --与用户当前文件域匹配的块被增强(1.3倍)
- 指令增强 —
.instructions.md文件获得额外优先级(1.2x) - 头部感知组块 --markdown由具有面包屑上下文的标题分隔;代码块保持原子性
- 零安装通过
dotnet dnx--直接运行dotnet dnx --yes MemoryExchange - 也可作为安装。NET全局工具 —
dotnet tool install -g MemoryExchange
快速开始
配置您的MCP客户端
将服务器添加到MCP客户端配置中(例如VS代码 mcp.json、克莱恩等):
选项A:通过 dotnet dnx (推荐--不需要安装,.NET 10+)
{
"servers": {
"memory-exchange": {
"type": "stdio",
"command": "dotnet",
"args": [
"dnx",
"--yes",
"MemoryExchange",
"--source-path", "/path/to/your/memory-exchange",
"--provider", "local",
"--build-index"
]
}
}
}选项B:a。NET全局工具
dotnet tool install -g MemoryExchange{
"servers": {
"memory-exchange": {
"type": "stdio",
"command": "memory-exchange",
"args": [
"--source-path", "/path/to/your/memory-exchange",
"--provider", "local",
"--build-index"
]
}
}
}选项C:环境变量
{
"servers": {
"memory-exchange": {
"type": "stdio",
"command": "dotnet",
"args": [
"dnx",
"--yes",
"MemoryExchange",
"--build-index"
],
"env": {
"MEMORYEXCHANGE_SOURCEPATH": "/path/to/your/memory-exchange",
"MEMORYEXCHANGE_PROVIDER": "local"
}
}
}
}选项D:来源
{
"servers": {
"memory-exchange": {
"type": "stdio",
"command": "dotnet",
"args": [
"run",
"--project", "/path/to/MemoryExchange/src/MemoryExchange.McpServer",
"--",
"--source-path", "/path/to/your/memory-exchange",
"--provider", "local",
"--build-index"
]
}
}
}随着--build-index,服务器在启动时对源目录进行索引(增量——只有更改的文件才会被重新处理),然后开始接受MCP连接。不需要单独的索引器步骤。 或者,使用--watch而不是--build-index在服务器运行时自动更新索引。监视器在启动时构建索引,然后监视文件更改(创建、编辑、删除、重命名),根据需要触发增量重新索引。
独立索引器
您还可以使用CLI索引器单独索引:
dotnet run --project src/MemoryExchange.Indexer -- \
--source /path/to/your/memory-exchange \
--provider local \
--database-path /path/to/memoryexchange.db| 标志 | 描述 |
|---|---|
--source, -s | (必填) 包含markdown文件的源目录的路径 |
--provider, -p | local (默认)或 azure |
--database-path | SQLite数据库文件路径(默认为 memory_exchange.db 在源目录中) |
--model-path | 自定义ONNX模型文件路径(本地提供程序) |
--index-name | 逻辑索引名称(默认值: memory-exchange) |
--force, -f | 强制完全重新索引,忽略缓存状态 |
--exclude | 要从索引中排除的全局模式(可以多次指定) |
--watch, -w | 索引后,注意文件更改并增量重新索引(运行到Ctrl+C) |
配置
配置加载了以下优先级(最高获胜):
appsettings.json- 环境变量(
MEMORYEXCHANGE_前缀) - CLI参数
环境变量
| 变量 | 映射到 |
|---|---|
MEMORYEXCHANGE_SOURCEPATH | 源目录路径 |
MEMORYEXCHANGE_PROVIDER | local 或 azure |
MEMORYEXCHANGE_INDEXNAME | 搜索索引名称 |
MEMORYEXCHANGE_DATABASEPATH | SQLite数据库路径(默认为 memory_exchange.db 在源目录中) |
MEMORYEXCHANGE_MODELPATH | ONNX模型文件路径 |
MEMORYEXCHANGE_BUILDINDEX | 设置为 true 建立创业指数 |
MEMORYEXCHANGE_WATCH | 设置为 true 启用文件监视模式 |
MEMORYEXCHANGE_DEBUG | 设置为 true 启用仅调试工具(例如。 get_index_status) |
MEMORYEXCHANGE_AZURE_SEARCH_ENDPOINT | Azure AI搜索端点 |
MEMORYEXCHANGE_AZURE_SEARCH_APIKEY | Azure AI搜索API密钥 |
MEMORYEXCHANGE_AZURE_OPENAI_ENDPOINT | Azure OpenAI端点 |
MEMORYEXCHANGE_AZURE_OPENAI_APIKEY | Azure OpenAI API密钥 |
MEMORYEXCHANGE_AZURE_OPENAI_DEPLOYMENT | Azure OpenAI嵌入部署名称 |
MCP服务器CLI参数
--source-path, --provider, --index-name, --database-path, --model-path, --build-index, --watch, --debug, --exclude, --azure-search-endpoint, --azure-search-key, --azure-openai-endpoint, --azure-openai-key, --azure-openai-deployment
--build-index--如果存在,MCP服务器在启动时会在接受连接之前运行增量索引。这消除了单独运行Indexer CLI的需要。需要--source-path待设定。--watch--监控源目录中markdown文件的更改,并自动触发增量重新索引。暗示--build-index启动时(如果索引不存在,则构建索引,然后监视更改)。当--watch处于活动状态,单独--build-index标志是多余的。需要--source-path待设定。--debug--启用仅调试MCP工具(例如。get_index_status).如果没有此标志,这些工具将不会注册,并且对AI代理不可见。--exclude--可选的glob模式,用于从索引中排除文件/目录。可以多次指定(例如。,--exclude "**/archive/**" --exclude "**/drafts/**").这personal/无论此设置如何,目录始终被排除在外。--database-path--如果省略,则默认为memory_exchange.db里面--source-path目录。
MCP工具
服务器公开了以下工具:
search_memory_bank
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
query | string | 是 | 要搜索什么(例如“缓存是如何工作的”、“部署架构”) |
currentFilePath | string | no | 用户正在编辑的文件--启用域感知增强 |
topK | int | no | 结果数,1-10(默认值:5) |
get_memory_file
从内存交换中检索特定markdown文件的完整内容。当搜索结果引用文件并且代理需要完整的上下文时很有用。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
filePath | string | yes | markdown文件的相对路径(例如“architecture/database.md”) |
get_index_status *(仅调试)*
返回有关内存交换索引的诊断信息。使用此功能在搜索之前验证索引是否已填充,或诊断原因 search_memory_bank 不返回任何结果。
没有参数。返回源路径、提供程序、索引名称、块计数、文件计数和上次索引时间。当索引为空时,它包括可操作的故障排除提示。
此工具仅在服务器使用启动时注册--debug旗帜(或MEMORYEXCHANGE_DEBUG=true).没有它,AI代理将看不到这个工具。
启动诊断
当MCP服务器启动时,它会将诊断信息打印到stderr,包括配置的提供程序、源路径、索引名称、监视/构建索引模式以及在源目录中找到的markdown文件的数量。此输出在MCP客户端的服务器日志中可见,可用于确认服务器配置正确。
建筑
src/
MemoryExchange.Core/ Core abstractions, chunking, search orchestrator
MemoryExchange.Azure/ Azure AI Search + Azure OpenAI provider
MemoryExchange.Local/ SQLite + ONNX provider (default)
MemoryExchange.Indexing/ Shared indexing pipeline (FileScanner + IndexingPipeline)
MemoryExchange.Indexer/ CLI indexer tool
MemoryExchange.McpServer/ MCP stdio server (supports --build-index)
tests/
MemoryExchange.Indexer.LocalRunner/ Development test harness提供者摘要
IEmbeddingService--从文本生成向量嵌入ISearchService--读取端:混合搜索(关键字+向量)ISearchIndex--写入端:追加/删除块
搜索管道
- 查询通过以下方式嵌入
IEmbeddingService ISearchService运行FTS5 BM25+向量余弦相似度,通过RRF合并(k=60)SearchOrchestrator应用域增强(1.3倍)和指令增强(1.2倍)- 结果以2倍的倍数被超额提取,重新排序并修剪为
topK
本地提供商详细信息
- 型号:
all-MiniLM-L6-v2(384昏暗,L2标准化) - 标记器: 自定义
WordPieceTokenizer内置30k vocab - 储存: 带WAL模式的SQLite,FTS5虚拟表,嵌入为BLOB
- 矢量搜索: 纯C#余弦相似度(归一化向量上的点积)
从源头构建
要求。NET 9.0 SDK。
1.下载ONNX型号
已发布的NuGet包捆绑了模型,但从源代码构建时需要手动下载。使用附带的脚本获取 all-MiniLM-L6-v2 来自HuggingFace的嵌入模型(约90 MB):
# Windows (PowerShell)
.\scripts\download-model.ps1# Linux / macOS
./scripts/download-model.sh这将模型放置在 src/MemoryExchange.Local/Models/all-MiniLM-L6-v2.onnx。如果需要,可以将自定义输出路径作为参数传递。
2.建造
dotnet build MemoryExchange.slnx许可证
麻省理工学院 -版权所有(c)2026 Moaid Hathot
