MCP内存服务器-Supabase
](https://www.npmjs.com/package/@kaspnilsson/mcp-memory-supabase) 
用于 模型上下文协议(MCP) 由Supabase和pgvector支持进行语义搜索。
为什么?
- 拥有你的AI记忆 --你的知识图谱存储在你自己的Supabase数据库中,而不是其他人的服务器上
- 内置语义搜索 --pgvector支持基于相似性的检索,而不仅仅是关键字匹配
- 适用于任何MCP客户端 --Claude桌面、打字思维、光标等
- 免费层友好 --Supabase的免费版非常适合个人使用
- 云原生 --带自动备份的托管Postgres,无需自托管
- 可组合 --用作独立服务器或您自己的MCP服务器中的库
快速开始
1.创建一个Supabase项目
首选 网站 supabase.com 并创建一个新项目。
2.拿到钥匙
在项目控制面板中,转到 设置→ API:
- 项目Url: `https://
.supabase.co`
- service_role密钥: ⚠️ 保守这个秘密!用于服务器端操作。
3.运行架构
首选 SQL编辑器 在您的Supabase仪表板中,运行以下内容 supabase/schema.sql.
这将创建:
entities,observations,以及relations表格- 行级安全(RLS)策略
- 矢量相似性搜索索引(HNSW)
- 全文搜索索引
- 语义搜索的辅助功能
4.安装并运行
# Run directly with npx
SUPABASE_URL=https://your-project.supabase.co \
SUPABASE_KEY=your-service-role-key \
npx @kaspnilsson/mcp-memory-supabase
# Or install globally
npm install -g @kaspnilsson/mcp-memory-supabase
SUPABASE_URL=https://your-project.supabase.co \
SUPABASE_KEY=your-service-role-key \
mcp-memory-supabase配置
环境变量
| 变量 | 必填 | 描述 |
|---|---|---|
SUPABASE_URL | 是 | 您的Supabase项目URL |
SUPABASE_KEY | 是 | 服务角色密钥(不是匿名密钥) |
EMBEDDING_API_KEY | 嵌入没有 | API键(启用语义搜索) |
EMBEDDING_API_URL | 否 | 自定义嵌入API端点(默认值:OpenRouter) |
EMBEDDING_MODEL | 否 | 型号名称(默认值: openai/text-embedding-3-small) |
LOG_LEVEL | 否 | 日志级别: debug, info, warn, error (默认值: info) |
语义搜索
随着 EMBEDDING_API_KEY 设置, search_nodes 使用向量相似性搜索进行语义匹配。没有它,搜索就会退回到不区分大小写的文本匹配。
默认设置使用 开放路由 对于嵌入,但您可以指向任何与OpenAI兼容的嵌入API。
MCP客户端配置
添加到MCP客户端配置中:
克劳德桌面版 (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"memory": {
"command": "npx",
"args": ["-y", "@kaspnilsson/mcp-memory-supabase"],
"env": {
"SUPABASE_URL": "https://
.supabase.co",
"SUPABASE_KEY": "",
"EMBEDDING_API_KEY": ""
}
}
}
}打字思维 --使用具有相同配置的MCP设置UI。
工具
| 工具 | 说明 |
|---|---|
create_entities | 创建具有观察结果的实体 |
create_relations | 在实体之间创建关系 |
add_observations | 向现有实体添加观察结果 |
delete_entities | 按名称删除实体 |
delete_observations | 删除具体观察结果 |
delete_relations | 删除特定关系 |
read_graph | 阅读整个知识图谱 |
search_nodes | 按查询(语义或文本)搜索实体 |
open_nodes | 按名称获取特定实体(不区分大小写) |
数据模型
┌─────────────┐ ┌───────────────┐
│ Entity │──── console.debug(msg, data),
info: (msg, data) => console.info(msg, data),
warn: (msg, data) => console.warn(msg, data),
error: (msg, data) => console.error(msg, data),
},
});
// Optionally add your own tools
server.tool("my_custom_tool", { /* schema */ }, async (args) => {
// Use manager to interact with the knowledge graph
const graph = await manager.searchNodes(args.query);
return { content: [{ type: "text", text: JSON.stringify(graph) }] };
});
// Connect
await server.connect(new StdioServerTransport());导入路径
| 进口 | 出口 |
|---|---|
@kaspnilsson/mcp-memory-supabase | createMemoryServer() |
@kaspnilsson/mcp-memory-supabase/manager | KnowledgeGraphManager 班级 |
@kaspnilsson/mcp-memory-supabase/types | Entity, Relation, KnowledgeGraph, Logger等等。 |
故障排除
启用RLS后结果为空
确保从以下位置运行RLS策略 schema.sql服务角色密钥绕过RLS,但Supabase要求存在策略。
矢量搜索不起作用
- 确保
vector扩展已在Supabase中启用 - 检查一下
EMBEDDING_API_KEY设置正确 - 验证是否正在生成嵌入:
SELECT name, embedding IS NOT NULL AS has_embedding FROM entities LIMIT 10;使用匿名密钥而不是service_role
如果使用anon密钥,则需要更严格的RLS策略。service_role密钥完全绕过RLS。
开发中
# Install dependencies
npm install
# Build
npm run build
# Run tests
npm test
# Lint
npm run lint许可证
麻省理工学院© 卡斯珀 尼尔森
