内容
<div align="center">
# 仓库
**一个原生代理的个人链接存储。**
[](LICENSE)
[](package.json)
[](https://modelcontextprotocol.io)
输入网页素材 — 链接、Twitter/X帖子、HN帖子、视频 — 捕获丰富的元数据和全文,组织标签和一个备注字段,可搜索,并通过 **MCP** 提供服务,以便外部代理执行所有智能操作。
**没有AI生活在silo中。** silo是基础;思维在上面,通过MCP。
<img src="docs/design/app/shots/01-library-dark.png" alt="silo的库 — 按天分组,可搜索,在Oat设计中" width="820">
```sh
brew install amitray007/tap/silo
```
</div>
## 功能
- **捕获** URL → silo将其规范化和去重,然后后台工作线程获取它(SSRF安全),提取可读卡片(标题、描述、网站、图像、全文通过Readability),并归档。
- **搜索和浏览** — 全文搜索标题、描述、提取文本、备注和**标签**;打开一个链接的完整详情;按标签或捕获状态浏览最新优先;所有分页。
- **组织** — 编辑备注,添加/删除标签(不区分大小写),垃圾和恢复,并重试降级捕获。
- **丰富的源预览** — Hacker News、GitHub和YouTube链接通过小型插件注册表获取源特定数据(点数/评论、星星/分支/语言、频道/缩略图);每个源在设置中可切换。
- **自行运行** — 调度作业以循环清理旧垃圾,重新排队任何捕获中间滞留的内容,并在死信队列上提醒。
- **两个前门,一个核心** — 代理可以通过 **MCP** 执行的所有操作,人类可以通过HTTP在Web UI中执行;两者调用同一个核心,因此永远不会漂移。
它是单用户、自托管和私有的。故意**不是**文件存储,不是内容存档,不是多用户 — 它永远不会自己总结或分类。那是代理的任务。
## 截图
Web UI(`@silo/web`,React + Vite在“Oat”设计系统)有浅色和深色主题。
<table>
<tr>
<td width="50%"><img src="docs/design/app/shots/02-library-light.png" alt="库,浅色主题"><br><sub><b>库</b> — 按天分组,实时丰富,浅色。</sub></td>
<td width="50%"><img src="docs/design/app/shots/01-library-dark.png" alt="库,深色主题"><br><sub><b>库</b> — 相同列表,深色。</sub></td>
</tr>
<tr>
<td><img src="docs/design/app/shots/07-command-palette.png" alt="命令调色板"><br><sub><b>命令调色板</b>(⌘K)— 全文查找所有内容。</sub></td>
<td><img src="docs/design/app/shots/03-tag-mcp.png" alt="标签视图"><br><sub><b>标签视图</b> — 过滤到一个标签,按时间分组。</sub></td>
</tr>
<tr>
<td><img src="docs/design/app/shots/06-settings-mcp.png" alt="设置,API和MCP"><br><sub><b>API / MCP</b> — 生成令牌,切换代理访问。</sub></td>
<td><img src="docs/design/app/shots/05-settings-plugins.png" alt="设置,插件"><br><sub><b>插件</b> — 源丰富,可切换。</sub></td>
</tr>
</table>
## 工作原理
一个核心执行所有操作;薄适配器公开它。**代理可以通过MCP执行的所有操作,人类可以在Web UI中通过HTTP执行;它们调用同一个核心,因此永远不会漂移。**
```
代理 ──MCP──┐ ┌── stdio (本地子进程)
├──▶ 核心 ◀──────┤── HTTP + 令牌
人类 ──HTTP─┘ (大脑) └── HTTP + OAuth (Claude / ChatGPT连接器)
│
后台工作线程 ── 丰富 · 清理 · 扫描 · 重试
```
代理通过 **12个MCP工具** 操作silo:
`capture_link` · `get_link` · `search_links` · `list_links` · `edit_link` · `create_tag` ·
`add_link_tag` · `remove_link_tag` · `delete_tag` · `trash_link` · `restore_link` · `retry_capture`
后台工作线程与核心并行运行:它丰富新的捕获,按周期清理旧垃圾(7 / 30 / 90天),重新排队任何捕获中间滞留的内容,并监视死信队列。主题、清理周期和源插件切换存储在服务器端。
完整范围映射和反范围:[`docs/product/scope.html`](docs/product/scope.html)。
## 入门
您需要 **Node 24+**,**pnpm 10+**,以及带有`pgvector`扩展名的Postgres(Docker提供一键安装)。
```bash
pnpm install # 依赖 + git钩子
pnpm db:up # Postgres(pgvector)通过Docker,等待健康检查
cp .env.example .env # DATABASE_URL — 默认值已经与db:up匹配
pnpm db:migrate # 应用模式
```
现在运行 **一个** 以下两种方式,取决于谁在使用它:
```bash
pnpm dev # 对于人类:API + Web UI + 工作线程 → 打开 http://localhost:5173
pnpm start # 对于代理:MCP服务器(stdio)+ 工作线程,无Web UI
```
- **`pnpm dev`** 提供React Web UI(Vite代理`/api/*`到API,因此同源 — 无CORS)。API绑定到环回地址,无身份验证;这是单用户本地主机界面。渲染浅色或深色。
- **`pnpm start`** 通过stdio和进程内丰富MCP。指向MCP客户端(如下文)。
> 不使用Docker?任何Postgres都可以使用,如果`vector`扩展可用(第一个迁移运行`CREATE EXTENSION vector`)。设置`DATABASE_URL`到您的实例并跳过`pnpm db:up`。
## 连接代理(MCP)
silo通过三种传输方式公开MCP。选择适合代理运行位置的方式。
**1 · 本地子进程(stdio)** — Claude Desktop / Claude Code在同一台机器上。无网络,无身份验证:进程边界是信任边界。添加到您的MCP配置:
```json
{
"mcpServers": {
"silo": {
"command": "pnpm",
"args": ["--filter", "@silo/app", "start"],
"env": { "DATABASE_URL": "postgres://silo:silo@localhost:5432/silo" }
}
}
}
```
**2 · 远程,带有令牌(HTTP)** — 自托管silo代理通过网络访问。运行MCP端点(`SILO_MCP_HTTP_PORT` + `SILO_API_TOKEN`;参见[部署](#deploy))并指向代理到其`/mcp` URL,带有Bearer令牌 — 在**设置 → API / MCP**中生成令牌,其中**复制配置**按钮生成确切的配置:
```json
{
"mcpServers": {
"silo": {
"url": "https://<your-mcp-host>/mcp",
"headers": { "Authorization": "Bearer <YOUR_SILO_API_TOKEN>" }
}
}
}
```
或,对于Claude Code,一行:
```sh
claude mcp add --transport http silo https://<your-mcp-host>/mcp \
--header "Authorization: Bearer <YOUR_SILO_API_TOKEN>"
```
**3 · URL-only连接器(OAuth)** — **Claude** 和 **ChatGPT**托管连接器。无令牌复制:粘贴URL到“添加自定义连接器”并登录。silo实现OAuth 2.1 + PKCE,动态客户端注册和发现,因此整个流程仅需URL。
```text
https://<your-mcp-host>/mcp
```
> `<your-mcp-host>`是您指向MCP端点的任何主机 — 选择您喜欢的名称。唯一规则:使其成为**单级**子域(例如`mcp-links.example.com`),**不是**嵌套子域,如`mcp.links.example.com` — 许多通配符TLS证书不涵盖第二级,OAuth发现流程在代理处失败。详细信息:[`docs/methods/mcp-oauth.md`](docs/methods/mcp-oauth.md)。
## 部署
silo作为**一个Docker镜像**运行,分为两个角色 — `api`(Web UI + REST + 工作线程)和`mcp`(HTTP MCP端点)— 在pgvector Postgres上。本地运行整个堆栈:
```bash
docker compose -f docker-compose.prod.yml up --build
```
实际部署中重要的环境变量:
| 变量 | 角色 | 描述 |
|---|---|---|
| `DATABASE_URL` | 两者 | `postgres://silo:<pw>@postgres:5432/silo`(服务名称,非localhost) |
| `SILO_API_TOKEN` | 两者 | HTTP MCP所需的Bearer令牌 — `openssl rand -hex 32` |
| `SILO_APP_PASSWORD` | api | Web UI登录密码(≥16字符)— 设置它,否则UI是开放的 |
| `SILO_SESSION_SECRET` | api | cookie签名秘密(默认为`SILO_APP_PASSWORD`) |
| `SILO_PUBLIC_MCP_URL` | api | “复制配置”按钮提供的确切MCP URL |
| `SILO_MCP_ALLOWED_HOSTS` | mcp | 您的mcp主机名(逗号分隔)— **代理后面需要** |
在反向代理后面,`SILO_MCP_ALLOWED_HOSTS`是最重要的:MCP SDK的DNS重新绑定保护拒绝任何未经信任的`Host`。完整的演练(Dokploy + Traefik,TLS,MCP-URL解析顺序):**[`docs/deploy.md`](docs/deploy.md)**。
## 客户端
从应用程序外部访问silo — 每个客户端独立发布([`docs/releasing.md`](docs/releasing.md))。指向任何客户端到您的silo基本URL + API令牌(在**设置 → API / MCP**中生成令牌)。
- **CLI** — 从终端捕获/搜索/列出/打开:`brew install amitray007/tap/silo`
(或从最新的[`cli-v*`版本](https://github.com/amitray007/silo/releases)获取tarball)。
- **Chrome扩展** — `silo-capture-*.zip`来自最新的
[`chrome-v*`版本](https://github.com/amitray007/silo/releases),解压加载。
- **Raycast扩展** — 从Raycast商店(搜索“silo”)。
## 架构
TypeScript monorepo。每个操作都通过一个核心;适配器仅翻译核心调用,因此Web UI和代理永远不会漂移。
```
packages/
core/ 大脑 — 所有操作 + 数据访问
db/ Postgres模式,迁移,查询(Drizzle)
worker/ 后台丰富 + 调度作业(清理 / 扫描 / 死信队列) ─▶ 核心
queue/ pg-boss设置,由工作线程和API共享 ─▶ 核心
mcp/server/ MCP适配器 — 12种工具 ─▶ 核心
api/ HTTP适配器(Hono)— REST + OAuth服务器 ─▶ 核心
web/ React SPA(Vite,“Oat”设计)— 通过HTTP与API通信
app/ 组合根 — 以`silo`运行MCP服务器 + 工作线程
```
核心/适配器边界在机械上强制执行
([`docs/rules/architecture.md`](docs/rules/architecture.md))。
## 开发
```bash
pnpm turbo run check-types test
pnpm quality # Biome + 导入边界 + jscpd + knip
```
此门控在推送前和CI中运行;`main`始终通过。测试影响实际Postgres(通过一次性数据库),而非模拟。约定位于[`docs/rules/`](docs/rules/README.md)。
## 贡献和许可证
欢迎贡献 — 参见[`CONTRIBUTING.md`](CONTRIBUTING.md)。通过[`SECURITY.md`](SECURITY.md)报告漏洞。 [MIT](LICENSE) © 2026 Amit Ray许可。