知识图谱存储服务

一个基于Supabase和pgvector的知识图谱存储服务,用于Model Context Protocol(MCP),支持语义搜索和知识图谱管理。

  • by kaspnilsson
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 kaspnilsson/mcp-memory-supabase

使用说明

MCP内存服务器-Supabase

用于 模型上下文协议(MCP) 由Supabase和pgvector支持进行语义搜索。

为什么?

  • 拥有你的AI记忆 --你的知识图谱存储在你自己的Supabase数据库中,而不是其他人的服务器上
  • 内置语义搜索 --pgvector支持基于相似性的检索,而不仅仅是关键字匹配
  • 适用于任何MCP客户端 --Claude桌面、打字思维、光标等
  • 免费层友好 --Supabase的免费版非常适合个人使用
  • 云原生 --带自动备份的托管Postgres,无需自托管
  • 可组合 --用作独立服务器或您自己的MCP服务器中的库

快速开始

1.创建一个Supabase项目

首选 网站 supabase.com 并创建一个新项目。

2.拿到钥匙

在项目控制面板中,转到 设置→ API:

  • 项目Url: https://<project-ref>.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://<project-ref>.supabase.co",
        "SUPABASE_KEY": "<service-role-key>",
        "EMBEDDING_API_KEY": "<your-embedding-api-key>"
      }
    }
  }
}

打字思维 --使用具有相同配置的MCP设置UI。

工具

工具 说明
create_entities 创建具有观察结果的实体
create_relations 在实体之间创建关系
add_observations 向现有实体添加观察结果
delete_entities 按名称删除实体
delete_observations 删除具体观察结果
delete_relations 删除特定关系
read_graph 阅读整个知识图谱
search_nodes 按查询(语义或文本)搜索实体
open_nodes 按名称获取特定实体(不区分大小写)

数据模型

┌─────────────┐     ┌───────────────┐
│   Entity    │────<│  Observation  │
│             │     │               │
│ name        │     │ content       │
│ entityType  │     │ entity_id     │
│ embedding   │     └───────────────┘
└─────────────┘
       │
       │    ┌───────────────┐
       └────<│   Relation    │
            │               │
            │ from_entity_id│
            │ to_entity_id  │
            │ relation_type │
            └───────────────┘
  • 实体 是知识图中的节点(人、项目、概念等)
  • 观察 实体是否附有事实/注释
  • 关系 使用类型化关系连接实体

用作图书馆

此程序包导出可组合的API,用于构建自定义MCP服务器:

import { createMemoryServer } from "@kaspnilsson/mcp-memory-supabase";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";

// Create server with custom options
const { server, manager } = createMemoryServer({
  supabaseUrl: process.env.SUPABASE_URL,
  supabaseKey: process.env.SUPABASE_KEY,
  embeddingApiKey: process.env.EMBEDDING_API_KEY,
  serverName: "my-custom-memory-server",
  serverVersion: "1.0.0",
  // Custom logger (any object with debug/info/warn/error methods)
  logger: {
    debug: (msg, data) => 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要求存在策略。

矢量搜索不起作用

  1. 确保 vector 扩展已在Supabase中启用
  2. 检查一下 EMBEDDING_API_KEY 设置正确
  3. 验证是否正在生成嵌入:
    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

许可证

麻省理工学院© 卡斯珀 尼尔森