MCP纪念
Remembrances MCP是一个基于Go的MCP服务器,为AI代理提供长期内存功能。它使用SurrealDB支持多个存储层(键值、向量/RAG、图形数据库),并可以通过Markdown文件管理知识库。
特性
- 用于AI代理内存的MCP服务器
- SurrealDB支持(嵌入式或外部)
- 使用Markdown文件进行知识库管理
- 通过以下方式嵌入生成:
- GGUF模型(本地、隐私优先、GPU加速) ⭐ 新 - Ollama(本地服务器) - OpenAI API(远程)
- 多种传输选项:stdio(默认)、MCP Streamable HTTP和HTTP JSON API
🚀 GGUF嵌入物(新)
Remembrances MCP现在支持直接加载本地GGUF嵌入模型!这提供了:
- 🔒 隐私:所有嵌入都在本地生成,没有数据发送到外部
- ⚡ 演出:无网络延迟的直接模型推理
- 💰 成本:嵌入生成无API成本
- 🎯 灵活性:支持量化模型(Q4_K_M、Q8_0等)
- 🖥️ GPU加速:金属(macOS)、CUDA(NVIDIA)、ROCm(AMD)
GGUF快速入门
# 1. Build the project (compiles llama.cpp automatically)
make build
# 2. Download a GGUF model
# Example: nomic-embed-text-v1.5 (768 dimensions)
wget https://huggingface.co/nomic-ai/nomic-embed-text-v1.5-GGUF/resolve/main/nomic-embed-text-v1.5.Q4_K_M.gguf
# 3. Run with GGUF model (using wrapper script)
./run-remembrances.sh \
--gguf-model-path ./nomic-embed-text-v1.5.Q4_K_M.gguf \
--gguf-threads 8 \
--gguf-gpu-layers 32
# Alternative: Set LD_LIBRARY_PATH manually
export LD_LIBRARY_PATH=~/www/MCP/Remembrances/go-llama.cpp/build/bin:$LD_LIBRARY_PATH
./build/remembrances-mcp \
--gguf-model-path ./nomic-embed-text-v1.5.Q4_K_M.gguf \
--gguf-threads 8 \
--gguf-gpu-layers 32📖 全部文件:参见 docs/GGUF_EMBEDDINGS.md 有关详细说明、性能提示和故障排除。
🔍 代码索引系统(新)
记忆MCP包括一个强大的 代码索引系统 它使用Tree sitter进行具有语义嵌入的多语言AST解析。这使得AI代理能够:
- 索引代码库 跨14种语言(Go、TypeScript、JavaScript、Python、Rust、Java、C/C++、PHP、Ruby、Swift、Kotlin等)
- 语义搜索 用于使用自然语言查询的代码符号
- 导航代码 通过查找定义、引用和调用层次结构
- 操纵代码 通过在整个代码库中重命名符号
快速开始
# 1. Index a project
# Use the MCP tool: code_index_project
{
"project_name": "my-project",
"root_path": "/path/to/project",
"languages": ["go", "typescript"]
}
# 2. Search for code
# Use: code_semantic_search
{
"project_name": "my-project",
"query": "function that handles user authentication"
}
# 3. Find symbol definitions
# Use: code_find_symbol
{
"project_name": "my-project",
"name": "UserService"
}可用工具
| 类别 | 工具 |
|---|---|
| 索引 | code_index_project, code_index_status, code_list_projects, code_delete_project, code_reindex_file, code_get_project_stats, code_get_file_symbols |
| 搜索 | code_semantic_search, code_find_symbol, code_find_references, code_find_implementations, code_get_call_hierarchy, code_hybrid_search |
| 操纵 | code_rename_symbol, code_get_symbol_body, code_replace_symbol_body, code_insert_symbol |
支持的语言
Go、TypeScript、JavaScript、TSX、Python、Rust、Java、Kotlin、Swift、C、C++、Objective-C、PHP、Ruby、C#、Scala、Bash、YAML
📖 全部文件:
💡 工具帮助系统(how_to_use)
Remembrances MCP包括一个智能帮助系统,该系统提供按需文档,同时最大限度地减少初始上下文令牌的消耗。
用法
# Get complete overview of all tools
how_to_use()
# Get documentation for a tool group
how_to_use("memory") # Memory tools (facts, vectors, graph)
how_to_use("kb") # Knowledge base tools
how_to_use("code") # Code indexing tools
# Get documentation for a specific tool
how_to_use("remembrance_save_fact")
how_to_use("kb_add_document")
how_to_use("search_code")好处
- 减少约85% 在初始上下文中,令牌消费
- 按需文档 -只装载你需要的东西
- 全面帮助 -完整的论据、示例和相关工具
📖 全部文件:参见 docs/TOOL_HELP_SYSTEM.md
用法
使用CLI标志或环境变量运行服务器:
go run ./cmd/remembrances-mcp/main.go [flags]配置文件
服务器可以使用YAML配置文件进行配置。如果 --config 如果未指定,服务器将自动在以下标准位置查找配置文件:
- Linux:
~/.config/remembrances/config.yaml - macOS:
~/Library/Application Support/remembrances/config.yaml
如果找不到配置文件,服务器将使用环境变量和默认值。
CLI标志
--config:YAML配置文件的路径(可选,自动定位见上文)
--sse(默认值:false):启用SSE传输
--sse-addr(默认值:3000):绑定SSE传输的地址(主机:端口)。也可以通过以下方式设置GOMEM_SSE_ADDR.
--http(默认值:false):启用HTTP JSON API传输
--http-addr(默认值:8080):绑定HTTP传输的地址(主机:端口)。也可以通过以下方式设置GOMEM_HTTP_ADDR.
--rest-api-serve:启用REST API服务器
--knowledge-base:知识库目录路径
--db-path:嵌入式SurealDB数据库的路径(默认值:./rememories.db)
--surrealdb-url:远程SurrealDB实例的URL
--surrealdb-user:SurrealDB用户名(默认:root)
--surrealdb-pass:SurrealDB密码(默认:root)
--surrealdb-namespace:SurrealDB命名空间(默认:test)
--surrealdb-database:SurrealDB数据库(默认:测试)
--gguf-model-path:本地嵌入的GGUF模型文件路径(新)
--gguf-threads:GGUF模型的线程数(0=自动检测)(新)
--gguf-gpu-layers:GGUF模型的GPU层数(0=仅CPU)(新)
--ollama-url:ollama服务器URL(默认值:http://localhost:11434)
--ollama-model:Olama嵌入模型
--openai-key:OpenAI API密钥
--openai-url:OpenAI基本URL(默认值:https://api.openai.com/v1)
--openai-model:用于嵌入的OpenAI模型(默认:text-embedding-3-large)
--surrealdb-start-cmd:当无法建立初始连接时,启动外部SurrealDB实例的可选命令。也可以通过以下方式设置GOMEM_SURREALDB_START_CMD.
环境变量
所有标志都可以通过前缀为的环境变量进行设置 GOMEM_ 破折号被下划线取代。例如:
GOMEM_SSEGOMEM_SSE_ADDR(例如。:3000或0.0.0.0:3000)GOMEM_HTTPGOMEM_HTTP_ADDR(例如。:8080或0.0.0.0:8080)GOMEM_REST_API_SERVEGOMEM_KNOWLEDGE_BASEGOMEM_DB_PATHGOMEM_SURREALDB_URLGOMEM_SURREALDB_USERGOMEM_SURREALDB_PASSGOMEM_SURREALDB_NAMESPACEGOMEM_SURREALDB_DATABASEGOMEM_GGUF_MODEL_PATHGOMEM_GGUF_THREADSGOMEM_GGUF_GPU_LAYERSGOMEM_OLLAMA_URLGOMEM_OLLAMA_MODELGOMEM_OPENAI_KEYGOMEM_OPENAI_URLGOMEM_OPENAI_MODELGOMEM_CODE_GGUF_MODEL_PATH-代码嵌入的GGUF模型GOMEM_CODE_OLLAMA_MODEL-代码嵌入的Ollama模型GOMEM_CODE_OPENAI_MODEL-代码嵌入的OpenAI模型
此外,还有一个可选的环境变量/标志,用于在服务器启动时无法连接时帮助自动启动本地SurrealDB:
GOMEM_SURREALDB_START_CMD/--surrealdb-start-cmd
代码特定嵌入模型(可选)
对于代码索引,您可以使用针对源代码语义进行优化的专用代码嵌入模型。如果未配置,默认嵌入器也用于代码索引。
推荐的代码嵌入模型:
| 提供者 | 型号 | 备注 |
|---|---|---|
GGUF。 coderankembed.Q4_K_M.gguf | CodeRankEmbed-针对代码进行了优化 | |
| 奥拉马 | jina/jina-embeddings-v2-base-code | Jina代码嵌入 |
| OpenAI | text-embedding-3-large | 也适用于代码 |
配置:
# Use CodeRankEmbed for code, nomic-embed-text for general text
export GOMEM_GGUF_MODEL_PATH="/path/to/nomic-embed-text-v1.5.Q4_K_M.gguf"
export GOMEM_CODE_GGUF_MODEL_PATH="/path/to/coderankembed.Q4_K_M.gguf"
# Or via CLI flags
remembrances-mcp --gguf-model-path /path/to/nomic.gguf --code-gguf-model-path /path/to/coderank.ggufYAML配置
您还可以使用YAML文件配置服务器。使用 --config 标志指定YAML配置文件的路径。
YAML文件应包含使用与CLI标志相同的键的配置选项(必要时用下划线替换破折号,但与 mapstructure 标签)。CLI标志和环境变量会覆盖YAML设置。
YAML配置文件示例(config.yaml):
# Enable SSE transport
sse: true
sse-addr: ":4000"
# Database configuration
db-path: "./mydata.db"
# Embedder configuration
ollama-model: "llama2"
# Logging
log: "./server.log"示例用法:
go run ./cmd/remembrances-mcp/main.go --config config.yaml中提供了一个包含所有选项和默认值的示例配置文件 config.sample.yaml.
示例用法(通过env提供的start命令):
export GOMEM_SURREALDB_START_CMD="surreal start --user root --pass root surrealkv:///path/to/surreal_data"
go run ./cmd/remembrances-mcp/main.go --knowledge-base ./kb
# Start SSE transport on a custom address via CLI flag
go run ./cmd/remembrances-mcp/main.go --sse --sse-addr=":3000"
# Or via environment variable
GOMEM_SSE=true GOMEM_SSE_ADDR=":3000" go run ./cmd/remembrances-mcp/main.go --sse
# Start HTTP JSON API transport
go run ./cmd/remembrances-mcp/main.go --http --http-addr=":8080"
# Or via environment variable
GOMEM_HTTP=true GOMEM_HTTP_ADDR=":8080" go run ./cmd/remembrances-mcp/main.go运输选项
服务器支持三种传输模式:
- stdio(默认):MCP协议通信的标准输入/输出
- 上海证券交易所:基于web的客户端的服务器发送事件
- 超文本传输协议:简单的HTTP JSON API,用于直接的REST式访问
HTTP传输端点
使用时 --http,服务器公开这些端点:
GET /health-健康检查端点GET /mcp/tools-列出可用的MCP工具POST /mcp/tools/call-调用MCP工具
HTTP使用示例:
# List available tools
curl http://localhost:8080/mcp/tools
# Call a tool
curl -X POST http://localhost:8080/mcp/tools/call \
-H "Content-Type: application/json" \
-d '{"name": "remembrance_save_fact", "arguments": {"key": "test", "value": "example"}}'行为:当程序启动时,它将尝试连接到SurrealDB。如果连接失败并且提供了启动命令,程序将生成提供的命令(使用 /bin/sh -c ""),将其stdout/stderr流式传输到正在运行的进程,并以指数回退方式轮询数据库连接长达30秒。如果数据库可用,服务器将继续启动。如果启动命令失败或数据库在超时后仍然无法访问,程序将记录一个描述性错误并退出。
需求
- 转到1.20+
- SurrealDB(嵌入式或外部)
- Ollama(可选,用于本地嵌入)
- OpenAI API密钥(可选,用于云嵌入)
构建
go mod tidy
go build -o remembrances-mcp ./cmd/remembrances-mcp示例
GOMEM_OPENAI_KEY=sk-xxx \
GOMEM_DB_PATH=./data.db \
go run ./cmd/remembrances-mcp/main.go --knowledge-base ./kb --rest-api-serve许可证
看 LICENSE.txt.
任务
构建
构建项目
go mod tidy
go build -o dist/remembrances-mcp ./cmd/remembrances-mcp
#try to copy to project root if error, remove the binary in the project root first
cp dist/remembrances-mcp ./remembrances-mcp || (rm -f ./remembrances-mcp && cp dist/remembrances-mcp ./remembrances-mcp)构建和复制
构建项目并将二进制文件复制到路径
交互式:true
make BUILD_TYPE=cuda build
cp ./build/libs/cuda/*.so ./build/
rm -f ~/bin/remembrances-mcp
cp ./build/libs/cuda/*.so ~/bin/
cp ./build/remembrances-mcp ~/bin/
rm -f *.log启动surraldb
启动SurrealDB实例
交互式:true
surreal start --user root --pass root surrealkv://~/www/MCP/remembrances-mcp/surreal_data运行测试
运行测试套件
交互式:true
./tests/run_all.sh运行全部测试
运行完整的Go单元测试以及上面执行的MCP集成测试。
交互式:true
go test ./...
python3 tests/test_user_stats.py
python3 tests/test_kb_simple.py
python3 tests/test_kb_comprehensive.py标签
为仓库部署一个新标签。
使用版本指定主要/次要/补丁
环境:预发布=0,版本=次要,强制版本=0 输入:版本、预发布、FORCE_VERSION
# https://github.com/unegma/bash-functions/blob/main/update.sh
CURRENT_VERSION=`git describe --abbrev=0 --tags 2>/dev/null`
CURRENT_VERSION_PARTS=(${CURRENT_VERSION//./ })
VNUM1=${CURRENT_VERSION_PARTS[0]}
# remove v
VNUM1=${VNUM1:1}
VNUM2=${CURRENT_VERSION_PARTS[1]}
VNUM3=${CURRENT_VERSION_PARTS[2]}
if [[ $VERSION == 'major' ]]
then
VNUM1=$((VNUM1+1))
VNUM2=0
VNUM3=0
elif [[ $VERSION == 'minor' ]]
then
VNUM2=$((VNUM2+1))
VNUM3=0
elif [[ $VERSION == 'patch' ]]
then
VNUM3=$((VNUM3+1))
else
echo "Invalid version"
exit 1
fi
NEW_TAG="v$VNUM1.$VNUM2.$VNUM3"
# if command convco is available, use it to check the version
if command -v convco &> /dev/null
then
# if the version is a prerelease, add the prerelease tag
if [[ $PRERELEASE == '1' ]]
then
NEW_TAG=v$(convco version -b --prerelease)
else
NEW_TAG=v$(convco version -b)
fi
fi
# if $FORCE_VERSION is different to 0 then use it as the version
if [[ $FORCE_VERSION != '0' ]]
then
NEW_TAG=v$FORCE_VERSION
fi
echo Adding git tag with version ${NEW_TAG}
git tag ${NEW_TAG}
git push origin ${NEW_TAG}更新日志
为仓库生成变更日志。
convco changelog > CHANGELOG.md
git add CHANGELOG.md
git commit -m "Update changelog"
git push发布
将新版本发布到仓库中。
goreleaser release --clean --skip sign发布快照
将新的快照版本发布到仓库中。
goreleaser release --snapshot --skip sign --clean构建便携式骆驼cpp
在便携模式下构建llama.cpp(兼容Intel/AMD)
交互式:true
GO_LLAMA_DIR=/www/MCP/Remembrances/go-llama.cpp PORTABLE=1 ./scripts/build-cuda-libs.sh构建骆驼cpp
使用当前CPU的优化构建llama.cpp
交互式:true
GO_LLAMA_DIR=/www/MCP/Remembrances/go-llama.cpp PORTABLE=0 ./scripts/build-cuda-libs.sh距离
创建分发包
rm -rf dist-variants/*
echo "Creating distribution package linux amd64 cuda portable (AMD Ryzen compatible)..."
xc build-llama-cpp-portable
mkdir -p dist-variants/linux-amd64-cuda-amd-ryzen
cp ./build/*.so ./dist-variants/linux-amd64-cuda-amd-ryzen/
make BUILD_TYPE=cuda build
cp ./build/remembrances-mcp ./dist-variants/linux-amd64-cuda-amd-ryzen/
cp config.*.yaml ./dist-variants/linux-amd64-cuda-amd-ryzen/
cd ./dist-variants/linux-amd64-cuda-amd-ryzen/
zip -9 ../remembrances-mcp-linux-amd64-nvidia-portable.zip *
cd ../../
echo "Creating distribution package linux amd64 cuda (optimized for current CPU)..."
xc build-llama-cpp
mkdir -p dist-variants/linux-amd64-cuda
cp ./build/*.so ./dist-variants/linux-amd64-cuda/
make BUILD_TYPE=cuda build
cp ./build/remembrances-mcp ./dist-variants/linux-amd64-cuda/
cp config.*.yaml ./dist-variants/linux-amd64-cuda/
cd ./dist-variants/linux-amd64-cuda/
zip -9 ../remembrances-mcp-linux-amd64-nvidia.zip *
cd ../../
echo "Creating distribution package linux amd64 cpu (optimized for current CPU)..."
xc build-llama-cpp
mkdir -p dist-variants/linux-amd64-cpu
cp ./build/*.so ./dist-variants/linux-amd64-cpu/
make BUILD_TYPE=cpu build
cp ./build/remembrances-mcp ./dist-variants/linux-amd64-cpu/
cp config.*.yaml ./dist-variants/linux-amd64-cpu/
cd ./dist-variants/linux-amd64-cpu/
zip -9 ../remembrances-mcp-linux-amd64-cpu-only.zip *
cd ../../
echo "Creating distribution package OSX arm64 metal (M1/M2 optimized)..."
ssh mac-mini-de-digio "cd www/MCP/remembrances-mcp;pwd;/usr/local/bin/xc build-libs-osx"
mkdir -p dist-variants/darwin-arm64-metal
scp mac-mini-de-digio:~/www/MCP/remembrances-mcp/build/*.dylib ./dist-variants/darwin-arm64-metal/
ssh mac-mini-de-digio "cd www/MCP/remembrances-mcp;pwd;/usr/local/bin/xc build-osx"
scp mac-mini-de-digio:~/www/MCP/remembrances-mcp/build/remembrances-mcp ./dist-variants/darwin-arm64-metal/
cp config.*.yaml ./dist-variants/darwin-arm64-metal/
zip -9 ./dist-variants/remembrances-mcp-darwin-aarch64.zip ./dist-variants/darwin-arm64-metal/*
echo "Creating docker images..."
make docker-prepare-cpu
make docker-build-cpu
make docker-push-cpu构建osx
为macOS构建(arm64金属)
交互式:true
export PATH=$HOME/bin:$HOME/.local/bin:/usr/local/bin:/opt/homebrew/bin:$PATH
make BUILD_TYPE=metal build构建libs-osx
为macOS构建库(arm64-metal)
交互式:true
export PATH=$HOME/bin:$HOME/.local/bin:/usr/local/bin:/opt/homebrew/bin:$PATH
make dist-darwin-arm64