Token导航 LogoToken导航

MCP Server · 数据服务

Persistent MCP Server

一款为AI代理提供持久化、可搜索记忆的语义检索服务器,支持自优化检索和多代理授权。

stdio官方级别未说明来源级核验工具 9
向量数据库TypeScriptClaude

快速开始

作者 / 组织
enochclaw-creator
提供方
enochclaw-creator
运行时
Docker

工具数量

9

来源目录标注

资源数量

0

来源目录标注

提示词数量

0

来源目录标注

GitHub Star

0

仓库热度

收录来源

1 个

MCP World

选型结论

Persistent MCP Server 属于数据服务类 MCP Server,公开资料标注 9 个工具,通过stdio 本地进程接入,适配 Claude,有可以直接复制的安装命令;接入前要先准备 API Key。

分类

数据服务

传输方式

stdio

认证方式

API Key

部署方式

公开资料未说明

安装与配置

安装命令

docker run -p 8000:8000 \

公开命令不是通用的启动方式,拼不出可靠配置示例;请在客户端 MCP 配置里按官方文档填写 command 和 args。

上手步骤

  1. 1

    准备运行环境

    stdio 服务在本地起进程,需要先装好 Docker,再按安装命令拉取依赖。

  2. 2

    安装服务

    复制下面的安装命令执行;命令里带占位符的位置换成自己的密钥或路径。

  3. 3

    写入客户端配置

    在客户端的 MCP 配置里填启动命令和参数,保存后完全退出客户端再打开,让新配置生效。

  4. 4

    验证是否可用

    连接成功后客户端会列出 9 个工具,随便调一个只读工具确认能返回结果。

接入前确认

不要直接授予不必要的文件、网络或账号权限;先核对安装命令和配置内容。

详细介绍

持久MCP服务器

人工智能代理的语义记忆与自改进检索

A. 模型上下文协议(MCP) 服务器,为AI代理提供跨对话的持久、可搜索的内存。基于Supabase边缘函数和pgvector进行语义搜索。

为什么存在

人工智能助手在对话之间会忘记一切。此服务器修复了此问题。它将想法、决策和观察结果存储为向量嵌入,然后在相关时从语义上检索它们。内置的反馈循环随着时间的推移提高了检索质量。自我评估记分卡对你使用该系统的效率进行评分。

关键能力

  • 语义搜索 --通过pgvector嵌入按意义而不是关键字查找记忆
  • 自动提取元数据 --LLM在每次拍摄时都会提取主题、人物、行动项目和重要性
  • 多代理身份验证 --多个AI客户端使用范围权限(只读、仅捕获、完全访问)连接
  • 自我评估记分卡 --7维评分系统使用字母评分(S到F)
  • Spark智能引擎 --模式分析、差距检测、跨项目连接、研究简报
  • 检索反馈循环 --显式和隐式信号训练系统以获得更好的结果
  • 完整审计跟踪 --每个操作都记录了代理标识和时间戳
  • 电报通知 --Spark报告的可选推送警报

建筑

┌─────────────────────────────────────────────────┐
│  AI Clients (Claude, ChatGPT, custom agents)    │
│  Connect via MCP JSON-RPC over HTTPS            │
└──────────────────────┬──────────────────────────┘
                       │
         ┌─────────────▼─────────────┐
         │   Supabase Edge Function  │
         │   (Deno runtime)          │
         │                           │
         │  ┌─────────────────────┐  │
         │  │  Auth + Audit Layer │  │
         │  │  (SHA-256 key hash) │  │
         │  └────────┬────────────┘  │
         │           │               │
         │  ┌────────▼────────────┐  │
         │  │  9 MCP Tools        │  │
         │  │  capture, search,   │  │
         │  │  browse, stats,     │  │
         │  │  spark, update,     │  │
         │  │  delete, scorecard, │  │
         │  │  feedback           │  │
         │  └────────┬────────────┘  │
         │           │               │
         └───────────┼───────────────┘
                     │
    ┌────────────────┼────────────────┐
    │                │                │
    ▼                ▼                ▼
┌────────┐   ┌────────────┐   ┌───────────┐
│Supabase│   │ OpenRouter  │   │ Telegram  │
│Postgres│   │ (embeddings │   │ (optional │
│+pgvector│  │  + LLM)     │   │  alerts)  │
└────────┘   └────────────┘   └───────────┘

工具参考

工具说明
capture_thought存储具有自动嵌入和元数据提取功能的内存
search_thoughts通过意义在记忆中进行语义搜索
browse_thoughts使用项目/日期/类型筛选器列出最近的记忆
brain_stats系统概述——按项目、活动、代理使用情况统计
spark智能引擎——分析模式、研究简报、仪表板
update_thought编辑内存(如果内容发生变化,会自动重新嵌入)
delete_thought带有审计跟踪的软删除(不会永久删除任何内容)
scorecard7个评分维度和字母等级的自我评估
feedback对检索质量进行评级,以改善未来的搜索结果

______________________________________________________________________

部署指南

先决条件

你需要三件事:

  1. Supabase账户 — 网站 supabase.com (免费版作品)
  2. 一个OpenRouter API密钥 — openrouter.ai (用于嵌入和LLM调用)
  3. 已安装Supabase CLI — 安装指南

可选:

  • 电报机器人 --用于Spark报告的推送通知

第一步:创建一个Supabase项目

  1. 首选 suabase.com/dashboard
  2. 点击 新项目
  3. 选择一个名称并设置数据库密码
  4. 选择您附近的地区
  5. 等待项目完成配置(约2分钟)
  6. 注意你的 项目参考 (在URL中可见: supabase.com/dashboard/project/)

步骤2:设置数据库

  1. 在您的Supabase仪表板中,转到 SQL 编辑器 (左侧边栏)
  2. 点击 新建查询
  3. 粘贴以下内容的全部内容 schema.sql 来自此repo
  4. 点击 跑

这将创建所有必需的表(thoughts, agents, agent_audit_log, thought_feedback, spark_reports, workflow_scores, build_sessions),功能(match_thoughts, increment_retrieval, project_health, mcp_raw_metrics),以及包括用于语义搜索的pgvector IVFFlat索引在内的索引。

注: 该架构启用 vector 和 pgcrypto 自动扩展。如果你在以下方面遇到错误 vector 不存在,请转到 数据库→ 扩展 在您的仪表板中,手动启用它。

步骤3:创建代理API密钥

每个连接的客户端都需要一个API密钥。在SQL编辑器中运行以下命令:

INSERT INTO agents (name, key_hash, scopes, active)
VALUES (
  'my-first-agent',
  encode(digest('replace-with-your-secret-key', 'sha256'), 'hex'),
  '{"master"}',
  true
);

替换 replace-with-your-secret-key 用你想要的任何字符串作为你的密钥。 保存此字符串 --数据库只存储SHA-256哈希,因此您以后无法恢复它。

要创建具有受限访问权限的代理,请执行以下操作:

-- Read-only agent (search and browse only)
INSERT INTO agents (name, key_hash, scopes, active)
VALUES (
  'readonly-agent',
  encode(digest('your-readonly-key', 'sha256'), 'hex'),
  '{"read-only"}',
  true
);

-- Capture-only agent (store memories and give feedback, no delete)
INSERT INTO agents (name, key_hash, scopes, active)
VALUES (
  'capture-agent',
  encode(digest('your-capture-key', 'sha256'), 'hex'),
  '{"capture-only", "feedback"}',
  true
);

步骤4:设置环境变量

在您的Supabase仪表板中:

  1. 首选 边缘函数 (左侧边栏)
  2. 点击 管理秘密 (您可能需要先在步骤5中部署该功能,然后再回来)
  3. 添加:
秘密名称值
OPENROUTER_API_KEY您的OpenRouter API密钥

可选(用于电报通知):

秘密名称值
TELEGRAM_BOT_TOKENBot令牌来自 @植物学家
TELEGRAM_CHAT_ID您的聊天ID(从获取 @用户信息机器人)

SUPABASE_URL 和 SUPABASE_SERVICE_ROLE_KEY 在边缘函数中自动可用——您不需要设置它们。

步骤5:部署

git clone https://github.com/YOUR_USERNAME/persistent-mcp-server.git
cd persistent-mcp-server

# Link to your Supabase project
supabase link --project-ref YOUR_PROJECT_REF

# Deploy
supabase functions deploy persistent-mcp --no-verify-jwt

这 --no-verify-jwt 标志是必需的,因为身份验证是通过API密钥处理的,而不是通过Suabase JWT令牌处理的。

您的服务器现在位于:

https://YOUR_PROJECT_REF.supabase.co/functions/v1/persistent-mcp

步骤6:验证

# Health check
curl https://YOUR_PROJECT_REF.supabase.co/functions/v1/persistent-mcp
# Expected: {"status":"online","version":"1.0.0","protocol":"mcp-jsonrpc"}

# Test a capture
curl -X POST \
  "https://YOUR_PROJECT_REF.supabase.co/functions/v1/persistent-mcp?key=your-secret-key" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "tools/call",
    "params": {
      "name": "capture_thought",
      "arguments": { "content": "Test memory — server is working!" }
    }
  }'

# Test a search
curl -X POST \
  "https://YOUR_PROJECT_REF.supabase.co/functions/v1/persistent-mcp?key=your-secret-key" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": 2,
    "method": "tools/call",
    "params": {
      "name": "search_thoughts",
      "arguments": { "query": "test memory" }
    }
  }'

步骤7:连接到AI客户端

克劳德桌面

添加 ~/Library/Application Support/Claude/claude_desktop_config.json (macOS)或 %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "memory": {
      "url": "https://YOUR_PROJECT_REF.supabase.co/functions/v1/persistent-mcp?key=your-secret-key"
    }
  }
}
Claude.ai

首选 设置→ 已连接的应用程序 并添加MCP服务器URL。

任何MCP客户端

服务器通过HTTP POST使用标准的MCP JSON-RPC 2.0。任何兼容的客户端都可以使用带有API密钥的URL作为查询参数或通过 x-api-key 头球

______________________________________________________________________

定制指南

更改项目

编辑 PROJECTS 数组输入 index.ts:

const PROJECTS: string[] = [
  "default",
  "personal",
  "work",
  "research",
  "infrastructure",
  // Add your own:
  "side-project",
  "health",
  "finances",
];

更改后重新部署:

supabase functions deploy persistent-mcp --no-verify-jwt

交换LLM模型

所有LLM电话都会接通 开放路由。在中更改这些常数 index.ts:

const EMBEDDING_MODEL = "openai/text-embedding-3-small";   // Must output 1536-dim vectors
const EXTRACTION_MODEL = "openai/gpt-4o-mini";             // Cheap + fast for metadata
const ANALYSIS_MODEL = "anthropic/claude-haiku-4-5";        // Smarter = better Spark insights
const NARRATIVE_MODEL = "openai/gpt-4o-mini";               // Scorecard personality

如果更改嵌入模型 将数据库更新为不同维度(例如,768而不是1536):

ALTER TABLE thoughts ALTER COLUMN embedding TYPE VECTOR(768);
-- Also update the match_thoughts function parameter type

代理范围参考

范围授予的工具
master所有工具
capture-onlycapture_thought, feedback
capturecapture_thought, feedback
read-onlysearch_thoughts, browse_thoughts, brain_stats, scorecard
readsearch_thoughts, browse_thoughts, brain_stats
searchsearch_thoughts
browsebrowse_thoughts
statsbrain_stats, scorecard
writeupdate_thought, delete_thought, feedback
updateupdate_thought
deletedelete_thought
spark-onlyspark
sparkspark, scorecard
scorecardscorecard
feedbackfeedback

自由组合范围:

INSERT INTO agents (name, key_hash, scopes, active)
VALUES (
  'custom-agent',
  encode(digest('my-key', 'sha256'), 'hex'),
  '{"capture", "read", "spark"}',
  true
);

调整语义搜索

两个参数控制搜索行为:

  • match_threshold (默认值0.65)--最小余弦相似度。越低捕获越多结果。越高越精确。
  • match_count (默认值10)--返回的最大结果数。

对于大型数据集(10000+个内存),重建IVFFlat索引:

DROP INDEX IF EXISTS idx_thoughts_embedding;
CREATE INDEX idx_thoughts_embedding
  ON thoughts USING ivfflat (embedding vector_cosine_ops)
  WITH (lists = 300);  -- target: sqrt(total_rows)

自定义元数据提取

在中编辑提示 extractMetadata() 功能。提取的JSON存储在 metadata JSONB列,因此您可以添加任何字段而无需更改模式:

// Example: adding an "urgency" field
const prompt = `Extract metadata. Return ONLY valid JSON.
{
  "type": "observation|decision|action_item|idea",
  "topics": ["topic1"],
  "urgency": "low|medium|high|critical",
  "importance": 5,
  "summary": "one-line summary"
}`;

添加自定义工具

在 registerTools 功能:

addTool(
  "my_tool",
  "What this tool does",
  {
    param1: z.string().describe("Description"),
    param2: z.number().optional().describe("Optional param"),
  },
  async ({ param1, param2 }) => {
    // Your logic here
    return {
      content: [{ type: "text", text: `Result: ${param1}` }],
    };
  }
);

然后将其添加到 toolScopeMap 在 agentCanUseTool:

my_tool: ["write", "my-custom-scope"],

禁用Telegram

不要设置 TELEGRAM_BOT_TOKEN 和 TELEGRAM_CHAT_ID 秘密。当Telegram丢失时,该功能会自动跳过。

______________________________________________________________________

记分卡尺寸

尺寸重量测量内容
捕捉速度25%捕捉记忆的频率和一致性
检索精度20%搜索是否返回有用结果
项目覆盖率15%是否积极跟踪所有项目
行动完成15%行动项是否得到解决
Spark敬业度8%是否生成情报报告
内存新鲜度10%内容是最新的还是过时的
代理多样性7%是否有多个客户端为系统供电

分数: S (90+) → A. (75+) → B (60+) → C (45+) → D (30+) → F (\ { const res = await fetch("http://localhost:11434/api/embeddings", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ model: "nomic-embed-text", prompt: text, }), }); const data = await res.json(); return data.embedding; }


**重要提示:** `nomic-embed-text` 输出768个维度向量,而不是1536个。更新您的架构:

-- Change vector dimensions ALTER TABLE thoughts ALTER COLUMN embedding TYPE VECTOR(768);

-- Update the match_thoughts function signature -- Change VECTOR(1536) to VECTOR(768) in the function parameter


**用于元数据提取的本地LLM:**

修改 `llmCall()` 点击您当地的Ollama实例:

async function llmCall( prompt: string, model = "llama3.2", systemPrompt?: string ): Promise { const messages = []; if (systemPrompt) messages.push({ role: "system", content: systemPrompt }); messages.push({ role: "user", content: prompt });

const res = await fetch("http://localhost:11434/api/chat", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ model, messages, stream: false }), }); const data = await res.json(); return data.message.content; }


**替代托管提供商(而不是OpenRouter):**

|提供者|嵌入|LLM|注释|
|----------|-----------|-----|-------|
|OpenAI直接| `text-embedding-3-small` | `gpt-4o-mini` |需要OpenAI API密钥,将基本URL更改为 `api.openai.com` |
|直接人类学|--| `claude-haiku-4-5` |没有嵌入API-使用OpenAI或本地用于嵌入,使用Anthropic用于LLM|
|科恩| `embed-english-v3.0` | `command-r` |很好的嵌入免费层|
|Voyage AI| `voyage-3-lite` |--|仅嵌入,高质量|
|谷歌顶点| `text-embedding-004` | `gemini-2.0-flash` |免费套餐可用|

对于任何提供者交换,您只需更改 `generateEmbedding()` 和 `llmCall()` --服务器的其余部分并不关心向量和文本来自哪里。

______________________________________________________________________

### 选项D:完全离线(零云依赖)

对于没有外部API调用的完全自包含的设置:

1. **Postgres+pgvector** --本地安装(见选项A)
1. **奥拉玛** --本地嵌入+本地LLM(见选项C)
1. **德诺** --在本地运行服务器

总成本:0美元。需要具有体面RAM的机器(Ollama型号为8GB+)。离线工作,气隙工作,在飞机上工作。

代价是质量——与OpenAI/Anthropic模型相比,本地嵌入模型和小型LLM产生的元数据提取效果较差,语义搜索精度较低。对于个人使用,这通常是可以的。对于有很多用户的生产来说,托管模型是值得的。

______________________________________________________________________

## 故障排除

|问题|修复|
|---------|-----|
| `Embedding failed: 401` |OpenRouter API密钥丢失或无效-检查边缘功能机密|
| `Invalid or inactive API key` |您的密钥与任何代理都不匹配——请验证SHA-256哈希值|
| `No matches found` |更低 `threshold` 对于更广泛的结果,为0.4|
|记分卡显示零|先捕获一些记忆并运行搜索——需要数据|
|慢速首次请求|边缘功能冷启动(1-2s)——设置定时ping以保暖|
| `vector` 扩展错误|启用pgvector: `CREATE EXTENSION vector;` 或从源代码安装|
|Ollama连接被拒绝|请确保Ollama正在运行: `ollama serve` |
|向量维度错误|嵌入模型维度必须匹配 `VECTOR(N)` 在模式中|

______________________________________________________________________

## 许可证

麻省理工学院——见 [许可证](LICENSE).

工具与能力

工具数量

9

资源数量

0

提示词数量

0

能力标签

语义检索TypeScript本地部署AI记忆多代理系统自优化学习向量数据库

支持客户端

Claude

数量来自来源目录的标注,具体工具清单以官方文档为准。

典型使用场景

用自然语言查库

不用手写 SQL,直接问数据,让模型组织查询语句。

数据巡检

定期拉指标、做对比,把异常项整理成一段说明。

打通业务数据

把数据库、数仓和接口接进同一个上下文,减少导出再上传。

选择建议

值得选的地方

  • 只提供 9 个工具,职责集中,接入后不容易误操作。
  • 有现成的安装命令,不用自己找入口,照着跑就能起服务。
  • 公开说明写得比较完整,接入前能看清能力边界。

先想清楚的地方

  • stdio 方式要求本地装好 Docker,换机器要重新装一遍。
  • 需要自备API Key,没有凭据没法直接试。
  • 公开摘要偏短,具体能力和限制要回到仓库确认。

更适合

  • 需要在数据服务场景里让模型直接调用外部能力的人。
  • 已经在用 Claude 的用户,接入路径最短。
  • 想先快速试一下、能接受在本地跑服务的人。

不太适合

  • 完全不想在本地装环境的人。
  • 暂时拿不到API Key的人。
  • 需要厂商级 SLA 和技术支持的生产环境。

同类对比

5 个同类
MCP Server工具数传输方式安装命令收录来源最后核验
Persistent MCP Server

MCP World · 本页

9stdio有1 个2026-05-17
Memory 9d25f64e

MCP World

9未说明未标注1 个2026-05-17
Prisma MCP Server

MCP World

0stdio有3 个2026-05-17
Astr Bot

MCP World

0stdio有1 个2026-05-17
Getzep MCP

MCP World

9stdio有1 个2026-05-17

按同分类和工具数量挑出最接近的几条,字段以各自详情页为准。

常见问题

5 条

Persistent MCP Server 怎么安装?

公开资料给出的安装命令是 docker run -p 8000:8000 \,运行环境为 Docker。装完后按客户端要求写进 MCP 配置,重启客户端生效。

Persistent MCP Server 怎么在 Claude Desktop、Cursor 里配置?

它是stdio 本地进程,客户端配置里要写启动命令和参数,运行环境是 Docker;保存后完全退出客户端再打开,配置才会生效。

Persistent MCP Server 收费吗?

本站只整理公开资料,不代收费用,也没有标注具体价格。是否收费取决于服务本身和背后的接口额度,正式使用前按官方说明确认。

Persistent MCP Server 需要 API Key 吗?

公开资料标注的认证方式是API Key,也就是要先拿到凭据才能连上;凭据只填在自己本地的配置里,不要写进公开仓库。

Persistent MCP Server 支持哪些客户端?

公开资料标注支持 Claude;其他客户端只要能配置 MCP Server,也能用同样的命令或地址接入。

来源信息

继续浏览同类 MCP