Skip to main content
Glama

Exo

一个用于智能体生活系统的个人上下文层。

Exo——exocortex(外脑皮层)的简称,即你思考中存在于大脑之外的那一部分——是一份人生记录,形态由你掌控。你所消费的一切、你所写的一切,以及机器从这两者推断出的一切,都集中在一个地方,并有一个统一的 SQL 查询层贯穿其中。

该记录的一份经过过滤的副本会发布到一个只读 MCP 服务器上,这样你面前不管是什么助手,都可以把它用作上下文——而不会让该助手的厂商拥有这份记录。

loaders ─────────▶   the record   ─────────▶   the surface
what reaches it    what it holds          what it exposes
(one per source,   (tier zones, one       (a fixed set of named
 each writes one    SQL surface, one        questions, read-only
 zone)              wall)                   by construction)

为什么

你应该尽可能拥有自己的个人上下文、操作知识和记忆。这正是它们可移植的根源,也是实现细粒度隐私的唯一途径。

  • 你拥有例行程序,而不必拥有调度器。 自托管一切值得称赞,但并非没有痛苦;有时候,使用别人的基础设施才是正确答案。不应该转移的是记录本身。

  • 没有平台锁定,也没有模型锁定。 记录以 parquet 和 markdown 形式存放在你的磁盘上。对外接口是 MCP,这是每个助手都懂的语言。

  • 在你工作的地方与你相遇。 通过 MCP 可访问的集中式存储,意味着同一份上下文可以到达你的终端代理、编辑器和手机。

这个东西之所以存在,是因为另一种选择是十几个孤岛,每个孤岛只知道你的一小部分,而没有一个会把数据还给你。

Related MCP server: mcp-multi-db

它实际做什么

加载器把困在孤岛中的数据拉出来:Last.fm、Letterboxd、Goodreads、Untappd、Trakt、Raindrop、你的 Claude 和 ChatGPT 导出、你的 markdown 笔记、你公开发表的文章、你的 git 仓库。每个加载器只写入一个区域,不碰其他任何东西。

记录按谁可以写入来区分它们,而不是按数据是什么:

层级

内容

写入方

T0 消费

世界记录下的关于你的一切——scrobbles、评分、收藏

仅加载器

T1 创作

你的文字:笔记、帖子、评价、食谱、任务

你,手工

T2 派生

机器推断出的结果:原子、向量、亲和度

仅派生流程

派生流程读取 T0 和 T1,并且在物理上无法看到 T2——它读取时所用的配置文件完全没有 T2 视图。因此 T2 总是从基准真值重新生成,exo verify 通过两次派生并比较摘要来证明这一点。机器输出永远不会变成机器输入。

发布面发布一份物理上独立的副本,只包含你声明为可发布的行。被扣留的内容不会出现在发布的文件中,而不是在读取时过滤,因此下游的任何 bug 和注入的指令都无法触及它。该策略是失败即关闭(fail-closed):未声明的区域会导致构建失败,而不是默认放行或默认禁止。

引擎与你的实例

这个仓库是引擎。它不保存任何数据,也永远不会保存。

你的数据、配置和你自己的加载器位于实例中——一个独立、私有的目录(通常是一个独立的私有仓库),引擎通过 $EXO_HOME 找到它:

your-instance/
  exo.toml              who you are, where your inputs live
  serve-manifest.json    what may leave this machine
  raw/                   your exports and mirrors
  zones/                 the record itself
  plugins/               loaders only you could have
  items/                 your tasks, habits, slots
  procedures/            how you do a recurring thing, by hand

如果某个加载器的输入是一种格式——例如 Last.fm 导出、一个 markdown 文件夹、一个 git 仓库目录——那么它随引擎一起发布。任何人都能拥有这样的输入。如果某个加载器的输入是一个场所——你所在城市的场馆日历、你的兄弟仓库、你的博客——那么它属于你的实例。判断标准不是代码有多专门化,而是陌生人是否有可能拥有这种输入。

开始

uv sync
uv run exo init ~/my-exo        # scaffold an instance
export EXO_HOME=~/my-exo
# drop your exports into $EXO_HOME/raw/exports/, then:
uv run exo rebuild              # ingest -> index -> derive -> catalog
uv run exo query "SELECT artist, count(*) FROM t0_music GROUP BY 1 ORDER BY 2 DESC LIMIT 10"
uv run exo publish --dry-run    # what would leave, and what is held back

exo init 复制的模板位于 exo/templates/——在编辑副本之前,请先阅读它们。

从手机访问它

只读发布面的意义在于,当你远离持有记录的机器时,记录仍然可以应答。worker/ 是一个通过 HTTP 提供 MCP 服务的 Cloudflare Worker——永久只读,只提供发布包——worker/README.md 介绍了如何将其部署并连接到 Poke,这个 iMessage 助手:

cd worker
cp wrangler.example.toml wrangler.toml       # your database id, your buckets, your name
npx wrangler d1 create exo                   # + r2 bucket create exo-vectors
npx wrangler deploy
npx wrangler secret put AUTH_TOKEN           # openssl rand -hex 32

然后将一个发布包发布进去(exo publish --cf,然后 import.sh),并在 poke.com/integrations/new 添加 Worker 的 URL 和该令牌。任何 MCP 客户端都能以同样的方式工作——Poke 只是那个通过短信触达你的客户端。

然后阅读 CONTEXT.md——它是词汇表,仓库的其他部分都假定你已经读过。

坦诚的局限

  • 启动成本是真实存在的。 这个工具面向那些已经记笔记、已经导出数据、并且本来就想要这个东西的人。它不会替你建立起这个习惯。

  • 加载器会坏。 它们读取别人的导出格式,抓取别人的页面。每个加载器都会保留最后一次成功生成的文件,而不是用失败结果覆盖它;但加载器腐坏只是时间问题。

  • 底层是一个第二大脑。 一个个人 wiki、用于消费数据和档案的加载器,再加上一些蒸馏提炼。新颖之处不在于其中任何单一组件,而在于它们共享同一条记录和同一个发布边界。

  • 聊天导出加载器是一把口袋刀。 它将 Claude 和 ChatGPT 的导出标准化为一种格式,无论你是否需要本项目的其他部分,它都很有用。

决策

每一个不太显然的选择在 docs/adr 中都有一份 ADR。其中起支撑作用的有:

0001

层级原生文件之上的 DuckDB 目录,以及那堵墙

0005

拆分 ETL:笔记本摄取,云端重建

0006

远程只读发布面永久只读

0007

限制注入读取的爆炸半径

0014

代码公开,实例私有

0016

过程是资源,而非工具

贡献

请先阅读 CONTRIBUTING.md——尤其是关于绝不在本仓库中放入个人数据(包括你自己的数据)的部分,以及那些看似微小却会重新铸造运行中实例每个 id 的改动清单。

MIT.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Model Context Protocol (MCP) server that gives AI assistants a safe, correct data-analyst capability over business metrics - without raw SQL improvisation.
    -
  • A
    license
    A
    quality
    B
    maintenance
    Read-only MCP server for querying PostgreSQL, MySQL, and SQLite from AI agents — multi-database, safe by default.
    4
    9 npm
    1
    ISC
  • A
    license
    A
    quality
    A
    maintenance
    A read-only MCP server that exposes SQL database access to LLMs, supporting multiple database types, compact columnar results, pagination, and file export.
    7
    28 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Read-only MCP server that exposes Garmin Connect health data from a local SQLite database to AI assistants, enabling queries for recent days, sleep, weekly trends, and a guarded SQL query surface.
    MIT