🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

记忆感知中枢 wjabanjj/aifp-mcp

MCPv1.5.11
wjabanjj76 天前有提交已提供中文文档扫描:高危兼容 / 相关生态

让所有 AI 工具共用一套本地持久记忆

29.9/100
综合分
4
GitHub 星标
248
npm 周下载
—/5
用户评分

数据截至 2026/9/19 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/wjabanjj/aifp-mcp.git

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
生态插件
可安装,未声明 dsh 能力
装得上吗
本站已在 dsh 0.2.1-rc.2 下真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 76 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过
展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✓npm 包aifp-mcp @ 1.5.11
✓Node 引擎要求 >=22.0.0 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/9/21 23:44:41

🔴 安全扫描发现高危能力自动 · 静态分析源码
v2.7.0
🔴 扫描:高危尚无人工评估

静态扫描发现安装期即执行代码,或命令参数由运行时变量拼接(参数来源无法静态判定,从严处理)。

安装时即执行脚本可执行外部命令读写/删除本地文件发起外部网络请求
查看扫描证据(共 88 处,展示前 77 条)
  • 读取本地文件
    dist/index.js:4
    if (!existsSync(config.dataDir)) {
  • 写入本地文件
    dist/index.js:5
    mkdirSync(config.dataDir, { recursive: true });
  • 读取本地文件
    scripts/postinstall.mjs:23
    if (existsSync(setupEntry)) {
  • 写入本地文件
    scripts/postinstall.mjs:45
    mkdirSync(hooksDir, { recursive: true })
  • 读取本地文件
    scripts/postinstall.mjs:54
    if (!existsSync(srcFile)) continue
  • 写入本地文件
    scripts/postinstall.mjs:56
    copyFileSync(srcFile, dstFile)
  • 写入本地文件
    scripts/postinstall.mjs:71
    writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n', 'utf-8')
  • 读取本地文件
    dist/db.js:10
    if (!existsSync(config.dataDir)) {
  • 写入本地文件
    dist/db.js:11
    mkdirSync(config.dataDir, { recursive: true });
  • 写入本地文件
    dist/export-md.js:20
    mkdirSync(opts.directory, { recursive: true });
  • 写入本地文件
    dist/export-md.js:50
    writeFileSync(join(opts.directory, fileName), md, 'utf-8');
  • 读取本地文件
    dist/import.js:13
    if (existsSync(sd.path) && statSync(sd.path).isDirectory()) {
  • 读取本地文件
    dist/import.js:13
    if (existsSync(sd.path) && statSync(sd.path).isDirectory()) {
  • 读取本地文件
    dist/import.js:22
    if (!existsSync(p))
  • 读取本地文件
    dist/import.js:24
    if (statSync(p).isDirectory()) {
  • 读取本地文件
    dist/import.js:48
    const raw = readFileSync(fp, 'utf-8').slice(0, 5000);
  • 读取本地文件
    dist/import.js:83
    const entries = readdirSync(dir, { withFileTypes: true });
  • 发起网络请求
    dist/llm-helper.js:109
    const res = await fetch(url, {
  • 读取本地文件
    dist/mcp.js:14
    const _pkg = JSON.parse(readFileSync(resolve(__dirname, '..', 'package.json'), 'utf-8'));
  • 读取本地文件
    dist/obs-log.js:6
    if (!existsSync(OBS_DIR)) {
  • 写入本地文件
    dist/obs-log.js:7
    mkdirSync(OBS_DIR, { recursive: true });
  • 写入本地文件
    dist/obs-log.js:22
    appendFileSync(todayFile(), JSON.stringify(record) + '\n');
  • 读取本地文件
    dist/obs-log.js:29
    if (!existsSync(OBS_DIR))
  • 读取本地文件
    dist/obs-log.js:33
    for (const f of readdirSync(OBS_DIR)) {
  • 删除本地文件
    dist/obs-log.js:39
    unlinkSync(join(OBS_DIR, f));
  • 读取本地文件
    dist/obs-log.js:51
    if (!existsSync(OBS_DIR))
  • 读取本地文件
    dist/obs-log.js:56
    for (const f of readdirSync(OBS_DIR)) {
  • 读取本地文件
    dist/obs-log.js:59
    const content = readFileSync(join(OBS_DIR, f), 'utf-8');
  • 发起网络请求
    dist/remote-client.js:18
    const res = await fetch(`${this.baseUrl}/`, {
  • 读取本地文件
    dist/self-check.js:20
    if (!existsSync(dir))
  • 读取本地文件
    dist/self-check.js:23
    accessSync(dir, constants.W_OK);
  • 读取本地文件
    dist/self-check.js:31
    if (existsSync(config.dbPath))
  • 读取本地文件
    dist/self-check.js:36
    if (existsSync(MODEL_CACHE))
  • 读取本地文件
    dist/self-check.js:65
    .filter(([, paths]) => paths.some(p => existsSync(p)))
  • 读取本地文件
    dist/server-config.js:8
    if (!existsSync(CONFIG_PATH))
  • 读取本地文件
    dist/server-config.js:10
    const raw = JSON.parse(readFileSync(CONFIG_PATH, 'utf-8'));
  • 读取本地文件
    dist/server-config.js:20
    if (!existsSync(DATA_DIR))
  • 写入本地文件
    dist/server-config.js:21
    mkdirSync(DATA_DIR, { recursive: true });
  • 写入本地文件
    dist/server-config.js:23
    writeFileSync(CONFIG_PATH, JSON.stringify(cfg, null, 2) + '\n', 'utf-8');
  • 读取本地文件
    dist/server-config.js:27
    if (!existsSync(CONFIG_PATH))
  • 删除本地文件
    dist/server-config.js:29
    rmSync(CONFIG_PATH);
  • 写入本地文件
    dist/session-miner.js:122
    mkdirSync(dirPath, { recursive: true });
  • 读取本地文件
    dist/session-miner.js:125
    content = readFileSync(filePath, 'utf-8');
  • 写入本地文件
    dist/session-miner.js:154
    writeFileSync(filePath, content, 'utf-8');
  • 读取本地文件
    dist/setup/index.js:12
    if (existsSync(distEntry)) {
  • 读取本地文件
    dist/setup/index.js:27
    const hasPi = existsSync(join(homedir(), '.pi', 'agent')) || hasCommand('pi');
  • 读取本地文件
    dist/setup/pi-extension.js:9
    if (!existsSync(PI_EXT_DIR))
  • 写入本地文件
    dist/setup/pi-extension.js:10
    mkdirSync(PI_EXT_DIR, { recursive: true });
  • 写入本地文件
    dist/setup/pi-extension.js:22
    writeFileSync(join(PI_EXT_DIR, 'index.ts'), renderIndexTs(serverEntry), 'utf-8');
  • 写入本地文件
    dist/setup/pi-extension.js:23
    writeFileSync(join(PI_EXT_DIR, 'package.json'), JSON.stringify(pkg, null, 2) + '\n', 'utf-8');
  • 读取本地文件
    dist/setup/pi-extension.js:24
    if (!existsSync(join(PI_EXT_DIR, 'node_modules'))) {
  • 执行外部命令固定命令
    dist/setup/pi-extension.js:25
    execSync('npm install --no-audit --no-fund', { cwd: PI_EXT_DIR, stdio: 'ignore', timeout: 300000 });
  • 读取本地文件
    dist/setup/platforms.js:8
    return JSON.parse(readFileSync(p, 'utf-8'));
  • 写入本地文件
    dist/setup/platforms.js:15
    mkdirSync(dirname(p), { recursive: true });
  • 写入本地文件
    dist/setup/platforms.js:16
    writeFileSync(p, JSON.stringify(obj, null, 2) + '\n', 'utf-8');
  • 执行外部命令来自配置/变量
    dist/setup/platforms.js:20
    execSync(process.platform === 'win32' ? `where ${cmd}` : `which ${cmd}`, { stdio: 'ignore', timeout: 3000 });
  • 读取本地文件
    dist/setup/platforms.js:47
    detected: () => hasCommand('claude') || existsSync(join(HOME, '.claude')),
  • 读取本地文件
    dist/setup/platforms.js:52
    detected: () => hasCommand('cursor') || existsSync(join(HOME, '.cursor')),
  • 读取本地文件
    dist/setup/platforms.js:57
    detected: () => hasCommand('windsurf') || existsSync(join(HOME, '.codeium', 'windsurf')),
  • 读取本地文件
    dist/setup/platforms.js:62
    detected: () => hasCommand('cline') || existsSync(join(HOME, '.config', 'cline')),
  • 读取本地文件
    dist/setup/platforms.js:67
    detected: () => hasCommand('gemini') || existsSync(join(HOME, '.gemini')),
  • 写入本地文件
    dist/setup/platforms.js:134
    mkdirSync(dirname(p), { recursive: true });
  • 写入本地文件
    dist/setup/platforms.js:144
    writeFileSync(p, toml, 'utf-8');
  • 写入本地文件
    dist/setup/platforms.js:158
    mkdirSync(dirname(p), { recursive: true });
  • 写入本地文件
    dist/setup/platforms.js:184
    writeFileSync(p, yaml.trimEnd() + '\n' + block, 'utf-8');
  • 读取本地文件
    hooks/check-status.mjs:19
    if (!existsSync(DB_PATH)) {
  • 写入本地文件
    hooks/recall-hook.mjs:42
    appendFileSync(LOG_PATH, JSON.stringify({ ts: new Date().toISOString(), status: 'timeout', latency_ms: TIMEOUT_MS }) + '\n')
  • 写入本地文件
    hooks/recall-hook.mjs:50
    appendFileSync(LOG_PATH, JSON.stringify({ ts: new Date().toISOString(), ...entry }) + '\n')
  • 读取本地文件
    hooks/recall-hook.mjs:142
    raw = readFileSync(0, 'utf-8').trim()
  • 读取本地文件
    scripts/count_imports.cjs:4
    const files = fs.readdirSync(dir).filter(f => f.endsWith('.ts'))
  • 读取本地文件
    scripts/count_imports.cjs:8
    const c = fs.readFileSync(path.join(dir, f), 'utf8')
  • 读取本地文件
    scripts/manage-keys.mjs:24
    if (!existsSync(file)) return { keys: {} }
  • 读取本地文件
    scripts/manage-keys.mjs:25
    try { return JSON.parse(readFileSync(file, 'utf-8')) } catch { return { keys: {} } }
  • 写入本地文件
    scripts/manage-keys.mjs:29
    writeFileSync(tmp, JSON.stringify(store, null, 2) + '\n', 'utf-8')
  • 写入本地文件
    scripts/manage-keys.mjs:30
    renameSync(tmp, file)
  • 执行外部命令来自配置/变量
    scripts/release-check.mjs:23
    const run = (cmd) => execSync(cmd, { cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }).trim()
  • 读取本地文件
    scripts/release-check.mjs:41
    const localVersion = JSON.parse(readFileSync(resolve(cwd, 'package.json'), 'utf-8')).version
扫描于 2026/11/2(1 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 本地持久记忆共享
  • 叙事链与语义纠错
  • 感知链图扩散
展开完整介绍(131 字)↓

AiFP 记忆感知系统|MCP 服务,一套记忆全 AI 共享。面向中文的 Agent 感知记忆,支持叙事链、语义纠错、感知链图扩散。兼容 DeepSeek‑Harness、Claude Code、Cursor、Codex等全部 MCP 客户端,数据完全本地存储。

README

由 DeepSeek 最新模型翻译生成
AiFP 记忆感知系统 — MCP Server 通过 Model Context Protocol 为 AI 编程助手提供持久记忆。 English · npm · GitHub 让 Obsidian、DeepSeek Harness、Claude Code、Cursor、Codex 等一切支持 MCP 的 AI 工具拥有跨会话的持续记忆。完全本地运行,数据不出本机(默认 ~/.ai-cognition/)。 为什么选 AiFP — 一套记忆,所有 AI 共享 你受够了 AI 的"健忘"吗? - 聊了一上午,它忘了项目名——存了,但用不上 - 你说"拍森",它只认 Python——说错一个字就搜不到 - 昨天说 Docker 连不上,今天说 MySQL 连不上,它不知道是同一件事——相关的记不住 - DeepSeek Harness 学会的,Claude Code 不知道——每个 AI 都是记忆孤岛 多数 AI 记忆系统只是存——存是存了,但用不上。AiFP 是让 AI 真正记住、想通、共享,把上面这些毛病一次解决。 先讲别人做不到的(共享): 一套记忆,所有 AI 共用。 今天 DeepSeek Harness 学会的,明天 Claude Code 还记得;Codex 攒的偏好,VS Code Copilot 不用重新问。
展开完整文档(README 剩余 1 节)
AiFP 记忆感知系统 — MCP Server

通过 Model Context Protocol 为 AI 编程助手提供持久记忆。

English · npm · GitHub

让 Obsidian、DeepSeek Harness、Claude Code、Cursor、Codex 等一切支持 MCP 的 AI 工具拥有跨会话的持续记忆。完全本地运行,数据不出本机(默认 ~/.ai-cognition/)。

为什么选 AiFP — 一套记忆,所有 AI 共享

你受够了 AI 的"健忘"吗?

- 聊了一上午,它忘了项目名——存了,但用不上
- 你说"拍森",它只认 Python——说错一个字就搜不到
- 昨天说 Docker 连不上,今天说 MySQL 连不上,它不知道是同一件事——相关的记不住
- DeepSeek Harness 学会的,Claude Code 不知道——每个 AI 都是记忆孤岛

多数 AI 记忆系统只是存——存是存了,但用不上。AiFP 是让 AI 真正记住、想通、共享,把上面这些毛病一次解决。

先讲别人做不到的(共享):

一套记忆,所有 AI 共用。 今天 DeepSeek Harness 学会的,明天 Claude Code 还记得;Codex 攒的偏好,VS Code Copilot 不用重新问。别的记忆系统做不到——因为它们每个各记各的,互不相通。AiFP 让同电脑上所有 AI 工具共用一个大脑,记一份,处处用。

再讲它为什么好用(能力):

- 会掂量着记——不是每句话都存。聊的东西先进"待定区",由识别器判断这条值不值得长期记住:值得才正式记下,不值得就跳过。不会一股脑全存,也不会错漏重要的。
- 能听懂人话——你说"拍森",它知道是 Python;你说"上个月",它知道是哪个月。说错字、口语、时间词都能理解。
- 能看出关联——昨天说"连不上数据库",今天说"改了配置还不行",它知道是同一件事的延续。还能顺着一条线索联想出相关的内容。
- 记得清,用得上——一条记忆只留核心意思,不堆垃圾。用的时候只挑最相关的几条给你,又快又不乱。
- 越用越懂你——你的偏好、习惯它会慢慢积累成"画像",但它分得清"事实"和"建议",不会把你的想法和它自己的混在一起。
- 该忘的就忘——太久没用的记忆会自然淡出,重要的记忆会越来越牢。记忆库永远干净,不会变成堆不动的垃圾场。

看这些名字,就知道它不简单——记忆被做成了大脑的结构:

| 概念 | 它到底在干嘛(大白话) |
| 🧠 海马体 · 记忆感知 | 会掂量着记——先进"待定区",识别器判断值不值得长期记住,值得才正式记下,不值得就跳过 |
| 🔗 神经元突触 · 感知链 | 自动发现信息之间的联系,还能顺着线索找到最直接的关系 |
| 👃 嗅觉皮层 · 语义检索 | 说错也能找到——你说"拍森",它知道你要找 Python |
| ⚡ 共燃神经元 · 关联 | 一起出现的东西自动绑在一起,问 A 顺带带出 B |
| 🗣 语言中枢 · 理解 | 懂口语、认错字、认得"上个月"是哪个月 |
| 🌊 神经扩散 · 联想回忆 | 一条线索能联想出好几层相关的记忆 |
| 🧬 突触固化 · 记忆巩固 | 用得越多记得越牢,从临时记忆慢慢变成长期记忆 |
| ⏳ 遗忘曲线 | 太久不用的自然淡出,记忆库永远干净不堆积 |
| 📊 神经信号 · 置信度 | 每条记忆带个"可信度"标尺,越靠谱的越优先给你 |
| 👤 主人认知模型 · 画像 | 懂你这个人——偏好习惯会积累成画像,但不跟它的想法混 |
| 💪 肌肉记忆 · 跨轮复用 | 做过的经验跨会话记得,不用每次从头学 |

天生为中文服务:认错字、懂口语、认时间词,全都是为中文设计的。英文为主的记忆系统,遇到"拍森找 Python"这种就抓瞎了。

默认完全私有:所有数据都存你本机,不上云、不注册、不偷偷上报。所谓"共享"只是多个工具读写同一份本地记忆——你的数据从没离开过这台电脑。

一条命令装好:npm install -g 自动帮你配好 12 个 AI 工具(Claude Code、Cursor、Windsurf、Cline、Gemini CLI、Qwen Code、Zed、VS Code Copilot、Codex CLI、Trae、DeepSeek Harness、pi-coding-agent)。

一个大脑,多个助手:今天 DeepSeek Harness 学到的,明天 Claude Code 还记得——像跟一个有记忆的同事说话,不用每次都重新自我介绍。

快速开始

npm install -g aifp-mcp
claude mcp add ai-cognition -s user -- npx aifp-mcp

重启 Claude Code 即可使用。数据存在 ~/.ai-cognition/data/cognition.db。

DeepSeek Harness (dsh) 自动接入

装完 aifp-mcp 后自动接入 dsh,无需手动执行任何 dsh 命令:

npm install -g aifp-mcp

安装时会自动检测 dsh 并写入配置(~/.dsh/cordis.patch.yml)。重启 dsh,记忆工具自动注册为 mcp__aifp__(如 mcp__aifp__search_memories、mcp__aifp__save_memory),无需手动改任何配置。

在任意 AI 对话中安装(推荐)

不需要手动配任何东西。在 Claude Code、Codex、Cursor、DeepSeek Harness 等任意工具里直接输入:

帮我安装记忆系统:npm install -g aifp-mcp postinstall 钩子会自动检测并配置所有已安装的 AI 工具(Claude Code、Cursor、Windsurf、Cline、Gemini CLI、Qwen Code、Zed、VS Code Copilot、Codex CLI、Trae、DeepSeek Harness、pi-coding-agent),并打印状态报告。重启工具即可使用记忆工具——AI 看到报告后会告诉你重启哪个,无需手动改任何 MCP 配置文件。

首次启动:需要下载 ~30MB 的 bge-small-zh 嵌入模型,最多阻塞 45 秒。后续启动有缓存,秒开。

本地模式 vs 服务器增强模式

AiFP 支持两种运行模式(环境变量 COGNITION_MODE,默认 remote):

本地模式完全私有(数据不出本机),但感知链工具需要连接服务器。服务器地址不随包分发,需通过官方接入渠道获取。

拿到 key 后,一条命令连上

接入地址和密钥通过官方渠道发放:联系作者(微信:zm8571806/QQ:8571806/邮箱:8571806@qq.com)订阅后发放,不随包公开。订阅到期可单独吊销,不影响其他用户。

1. 安装(如未安装)
npm install -g aifp-mcp

2. 一条命令连接服务器(地址和 key 由作者发放) aifp-mcp --connect https://

3. 重启你的 AI 工具(Claude Code / Cursor / dsh 等)感知链 / 深度追踪 / 图扩散自动可用

断开(恢复纯本地): aifp-mcp --disconnect

--connect 会把连接信息保存在本机 ~/.ai-cognition/server.json,之后启动自动生效,无需每次配置环境变量。

更简单:直接让你的 AI 配置

不需要手动敲命令。在 Claude Code / Cursor / Codex / dsh 等任何 AI 工具的输入框里说:

这是我的 aifp 服务器地址和 key,帮我配置:地址:https:// key:

AI 会自动执行 aifp-mcp --connect 并提示你重启工具。重启后感知链增强自动生效。

⚠️ key 会出现在对话记录中,介意的话配置完可在管理后台吊销重发(不影响使用)。

接入 Obsidian(笔记 ↔ 记忆双向)

Obsidian 笔记 → 记忆库(AI 可语义检索你的笔记):直接让你的 AI 导入,无需配置环境变量:

把 Obsidian 笔记导入记忆:directory = C:/Users/你/Obsidian/我的笔记库

AI 会调用 reimport_sources 同步导入(frontmatter 自动剥离、哈希去重)。以后新增笔记再说一次即可。

记忆库 → Obsidian 笔记(在 Obsidian 里看到全部记忆):让 AI 调用 export_memories_md:

把记忆导出到 Obsidian:directory = C:/Users/你/Obsidian/我的笔记库/AiFP记忆

导出的笔记带 frontmatter(type/tier/tags),Obsidian 可直接识别和检索;同名笔记自动覆盖更新,保持与记忆库同步。

MCP 工具(共 33 个)

核心工具(15 个):

| 工具 | 功能 | 链路 |
| save_memory | 保存记忆(自动去重 + 向量索引) | 基础 |
| search_memories | 双路检索:FTS5 关键词 + 向量语义 | 逻辑链 |
| recall_context | 一键回忆(直接命中 + 因果链 + 关联 + 扩散) | 综合链 |
| get_memory | 按 ID 获取记忆详情 | 基础 |
| list_memories | 分页列出 | 基础 |
| trace_perception_chain | BFS 感知链追踪(6 类因果) | 上下链 |
| find_perception_path | 双向 BFS 找两条记忆间最短路径 | 关系链 |
| get_perception_graph_stats | 感知图统计 | 关系链 |
| diffuse_memories | 图扩散搜索(关联多跳) | 关系链 |
| get_memory_tree | 层级树结构 | 基础 |
| get_related_memories | Hebbian 共现关联 | 关系链 |
| get_user_profile | 用户画像——聚合偏好/事实/习惯 | 画像 |
| observe_turn | 记录对话轮次到识别队列(跨平台自动记忆入口) | 自动 |
| reimport_sources | 重新扫描外部笔记目录 | 导入 |
| get_stats | 系统统计 | 基础 |

另有 18 个管理/进阶工具:consolidate_memories / share_memory / merge_memories / batch_delete / batch_update / export_memories / export_memories_md(Obsidian)/ explain_query / get_confidence_stats / scan_memory_patterns / validate_memory / get_top_experiences / deduplicate_memories / scan_observation_patterns / rotate_observation_logs / session_mine / derive_memories / flush_recognizer。

跨平台自动记忆识别

Claude Code 使用原生 hooks(100% 自动,零遗漏)。其他工具通过 observe_turn 工具 + 指令文件实现(详见 rules/ 目录):

| 平台 | 配置方式 | 自动程度 |
| Claude Code | hooks(原生) | 100% 自动,零遗漏 |
| Cursor | .cursor/rules/ 指令文件 | AI 遵守指令时自动触发 |
| Codex CLI | AGENTS.md 指令文件 | AI 遵守指令时自动触发 |
| Trae | 项目规则(手动配置) | AI 遵守指令时自动触发 |

指令文件告诉 AI:“每次回答完用户后调用 observe_turn 记录本轮消息”。系统会自动判断是否有值得记住的内容,不需手动决定。

核心技术

- SQLite + FTS5 全文索引(CJK 感知,unicode61 tokenizer)
- bge-small-zh-v1.5 向量嵌入(本地 512 维语义搜索,自动重试 + 多镜像回退)
- Hebbian 共现矩阵(“一起发射的神经元连在一起”)
- 有向因果链(6 种关系类型)
- BFS 图扩散(沿关联多跳发现间接知识)
- 纠错 + 消歧 + 中文时间词解析

各 AI 工具怎么接入(自动或手动)

npm install -g aifp-mcp 时自动完成(postinstall 检测所有已装 AI 工具并写入 MCP 配置)。以后新装了某个 AI 工具,跑一次即可接入:

aifp-mcp --setup # 重新检测并配置所有 AI 工具

自动检测并配置已安装的 AI 工具(检测到才写入,不重复覆盖):

| 平台 | 配置方式 |
| Claude Code | ~/.claude/settings.json → mcpServers + 启动 hook |
| Cursor | ~/.cursor/mcp.json |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
| Cline | ~/.config/cline/mcp_settings.json |
| Gemini CLI | ~/.gemini/settings.json → mcpServers |
| Qwen Code | ~/.qwen/settings.json → mcpServers |
| Zed | ~/.config/zed/settings.json → context_servers |
| VS Code Copilot | %APPDATA%/Code/User/mcp.json → servers |
| Codex CLI | ~/.codex/config.toml |
| pi-coding-agent | 生成扩展到 ~/.pi/agent/extensions/aifp-memory/(pi 无内置 MCP,用扩展机制) |

手动配置

Claude Code / Cursor

{
"mcpServers": {
"ai-cognition": {
"command": "node",
"args": ["path/to/aifp-mcp/dist/index.js"]
}
}
}

自定义数据目录

COGNITION_DATA_DIR=/path/to/data npx aifp-mcp

环境变量

| 变量 | 默认值 | 说明 |
| COGNITION_DATA_DIR | ~/.ai-cognition/ | 数据存储目录 |
| COGNITION_MODE | remote | local 本地保底 / remote 连接服务器增强 |
| COGNITION_SERVER_URL | (无默认,须显式配置)* | 远程算法服务器地址(自建) |
| COGNITION_API_KEY | - | 远程模式 API 密钥 |
| COGNITION_RECOGNIZER | 0 | 设为 1 启用自动识别 |
| COGNITION_LLM_API_KEY | - | 识别器 LLM 密钥(OpenAI 兼容) |
| COGNITION_LLM_BASE_URL | https://api.deepseek.com | 识别器 LLM 地址 |
| COGNITION_LLM_MODEL | deepseek-chat | 识别器 LLM 模型 |
| HF_MIRROR | https://hf-mirror.com | 嵌入模型下载镜像(失败自动回退 huggingface.co) |
| CORS_ORIGIN | * | HTTP 模式跨域白名单 |
| PORT | 5000 | HTTP 端口 |

识别器 LLM 配置(启用自动记忆识别)

观察队列需要 LLM 判断是否值得入记忆,二选一:

OpenAI 兼容(推荐:DeepSeek 等)
export COGNITION_RECOGNIZER=1
export COGNITION_LLM_API_KEY=你的DeepSeek密钥
export COGNITION_LLM_BASE_URL=https://api.deepseek.com # 可选,默认同左
export COGNITION_LLM_MODEL=deepseek-chat # 可选

或 Anthropic
export COGNITION_RECOGNIZER=1
export ANTHROPIC_API_KEY=sk-ant-...

不配置则只记录观察日志,自动识别不落地(AI 主动 save_memory 不受影响)。

技术栈
- Node.js 22+ (node:sqlite) + TypeScript
- SQLite (内置) + FTS5
- @xenova/transformers (bge-small-zh-v1.5)
- @modelcontextprotocol/sdk (MCP 协议)

License

专有软件 — 见 LICENSE。个人/非商业用途免费;商业用途需授权。第三方依赖遵循各自开源许可。
预览分享卡片长什么样 ↓wjabanjj/aifp-mcp
分享 · DeepSeek Harness Hub
wjabanjj/aifp-mcp

让所有 AI 工具共用一套本地持久记忆

这是你的仓库?认领条目

回到顶部