关于 Artifacts — self-hosted artifact publishing (HTML/JSX/Markdown/zip → unguessable URL)
Artifacts 是可自托管的发布服务,可将 HTML、React 组件、Markdown、PDF 和压缩站点发布到自有域名,并生成难以猜测的链接。它为用户和 Agent 提供管理面板、命令行及内置 MCP 服务。
主要功能
- 01发布 HTML、JSX/TSX、Markdown、PDF 和压缩站点
- 02支持私有、公开或密码保护
- 03面板整理、搜索和生命周期管理
- 04命令行与可撤销的分级 API 密钥
- 05可选查看器框架和 PDF 模式
适用场景
- 01分享 Agent 生成的报告或原型
- 02从压缩包托管静态站点
- 03发布 Markdown 文档或 PDF
- 04按项目整理和管理制品
MCP 相关
内置 MCP 服务允许 MCP 客户端通过工具调用发布制品。MCP 访问使用分级 API 密钥。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
docker run -i --rm -e ARTIFACTS_API_KEY -e BASE_URL ghcr.io/kuyazee/artifacts:latestARTIFACTS_API_KEY密钥Bearer token required for all writes and the MCP endpointBASE_URLPublic origin used in returned artifact URLs (e.g. https://artifacts.example.com)本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
ghcr.io/kuyazee/artifacts:latestStreamable HTTP工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
artifacts
可自托管、类似 Claude 的制品发布服务
POST HTML、React 组件、Markdown、PDF 或 ZIP 格式的静态网站。即可在你自己的域名下获得一个难以猜测的 URL。
快速开始 · 部署 · API · CLI · MCP · 安全

控制面板:发布、按项目分组并进行管理

带有查看器顶部栏的已发布制品
关于
AI 助手会生成大量可分享的内容:控制面板、原型、报告和小型应用。Claude 托管的制品功能很好用,但 URL 位于他人的基础设施上。这是一个可自托管的版本,代码约 1,100 行。你 POST 内容后,它会在你掌控的域名下,通过一个难以猜测的 URL 提供渲染后的结果。
它以单个容器运行,只有一个管理员账号,默认不使用数据库。每个制品都是 /data 下的一个普通文件目录,因此备份该目录就能备份所有内容。如果主机重启时会清除本地磁盘,请改用持久化的外部存储(兼容 S3 的存储桶、git 远程仓库或 Postgres),方法是设置 STORAGE_BACKEND。请参阅部署。
功能
- 内容类型。 HTML、JSX/TSX(单个 React 组件,无需构建步骤)、Markdown、PDF 和打包为 ZIP 的静态网站。
- 原生支持 Agent,方便人类使用。 内置的 MCP 服务让 Claude Code、Codex 或任何 MCP 客户端只需调用一次工具即可发布内容。人类用户可通过
/访问支持拖放的网页 UI(需管理员登录),也可使用 CLI。 - 双层身份验证。 管理员使用密码登录控制面板;CLI 和 MCP 使用权限范围明确、可撤销的 API 密钥(
read/publish/full),并可设置过期时间,因此无需共享同一个主密钥。 - 默认私有,支持按内容设置可见性。 新内容默认为
private,可通过签名的授权链接(?k=…)分享,也可轮换链接以撤销访问权限。可将任何内容设为public(任何人都可通过普通链接访问)或设为密码保护。默认情况下,内容不会被发现:使用难以猜测的 slug,所有页面均设置noindex。请参阅可见性。 - 可选查看器框架。 提供类似 Claude、Gemini 和 ChatGPT 内容的精简顶部工具栏(标题、复制链接、隐藏)。可在设置中全局启用或按内容单独启用;使用
?raw=1可直接提供原始内容。重定向永远不会嵌入框架。 - Markdown 渲染设置。 可在设置中为所有 Markdown 内容选择阅读字体、内容宽度、基础字号和初始主题。Markdown 会在每次查看时根据源文件渲染,因此更改也会应用于已有内容。带框架的 Markdown 页面会在导航栏中显示按钮,供读者循环切换“自动”“浅色”和“深色”主题。请参阅 docs/formats.md。
- PDF 托管。 发布 PDF 后,系统会提供查看器页面和直接下载链接。每项内容都可单独设置查看器模式(标准、演示、精简),也可通过下载开关移除查看器按钮。该开关只是便利用途,并非保护措施:文件 URL 仍会返回文件内容。请参阅 docs/formats.md。
- 重定向。
type: "redirect"会将一个 slug 变为短链接,由服务端返回 HTTP 301;在其他主机上则会回退到 JavaScript 跳转。目标必须是绝对 http(s) URL,且不能包含凭据;响应不可缓存,因此更改 slug 的指向会在下次访问时生效。可在控制面板的行菜单中修改指向,也可使用PUT。请先了解在自己的域名上运行开放式重定向器的风险:docs/formats.md。 - 支持嵌入。 公共内容可通过一个
<iframe>嵌入任何页面。行菜单会自动生成标签,并指向?raw=1,确保框架中只显示内容,而不包含第二个工具栏。私有和密码保护的内容有意禁止嵌入,解锁提示也完全拒绝被框架嵌入。请参阅 docs/embedding.md。 - 每项内容均有 QR 码。 每项内容都有永久 URL 对应的 QR 码,可通过控制面板的行菜单、
GET /api/artifacts/:slug/qr或artifacts qr <slug>获取。支持 SVG 或 PNG,直接在进程内生成:无需 QR 码库、第三方图片服务,任何内容都不会离开本机。请参阅 API 参考。 - 按项目整理。 将同一项目的内容归入可折叠分区,并可按项目、标题、slug、标签和重定向目标搜索。标签仍可用于跨项目分类。
- 生命周期控制。 自定义 slug、重命名、添加标签、停用但不删除、自动过期、删除。
- 防滥用。 登录和解锁端点会按客户端 IP 进行速率限制(仅统计失败请求);密码哈希运算在事件循环之外执行,因此大量猜测请求会拖慢这两个路由,而不会让服务停滞。在 Cloudflare 或反向代理后方运行时,请设置
TRUST_PROXY以获取真实的客户端 IP。请参阅部署指南。
快速开始
克隆、配置并启动:
git clone https://github.com/anvilnine/artifacts && cd artifacts
cp .env.example .env # set ARTIFACTS_API_KEY (openssl rand -hex 32) and BASE_URL
docker compose up -d
也可以跳过克隆,直接运行镜像:
docker run -d -p 3000:3000 -v artifacts-data:/data \
-e ARTIFACTS_API_KEY=$(openssl rand -hex 32) \
-e BASE_URL=https://artifacts.example.com \
ghcr.io/anvilnine/artifacts:latest
发布内容:
curl -s -X POST https://artifacts.example.com/api/artifacts \
-H "Authorization: Bearer $ARTIFACTS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"content": "<h1>hello</h1>", "type": "html", "slug": "hello", "tags": ["demo"]}'
# {"slug":"hello","url":"https://artifacts.example.com/a/hello"}
让 Claude Code 为你发布:
claude mcp add --transport http artifacts https://artifacts.example.com/mcp \
--header "Authorization: Bearer ${ARTIFACTS_API_KEY}" --scope user
文档
| 我想…… | 阅读 |
|---|---|
| 部署它(Docker、compose、Coolify、裸 Node、环境变量) | docs/deploy.md |
| 使用 REST API(包括 zip 站点和标签) | docs/api.md |
| 在终端中发布 | docs/cli.md |
| 接入 Claude Code / Codex / 任意 Agent | docs/mcp.md |
| 设置登录和范围受限的 API 密钥 | docs/auth.md |
| 了解 JSX/TSX 渲染和 zip 验证 | docs/formats.md |
| 将制品放入另一个页面 | docs/embedding.md |
开发
无需构建步骤。Node ≥ 22。
npm install
cp .env.example .env # any ARTIFACTS_API_KEY works locally, e.g. "test"
npm run dev
# UI at http://localhost:3000
端到端测试套件是一个 shell 脚本:
bash .github/workflows/smoke.sh http://localhost:3000 <your-key>
有些情况无法通过 HTTP 测试,例如手动编辑的 auth.json。这些情况会使用 Node 内置的测试运行器作为单元测试运行,无需服务器:
npm test
这也涵盖了仪表板。dashboard-check.mjs 会获取 /,解析 public/index.html 中的内联脚本,并检查脚本通过 id 获取的每个元素是否仍在标记中。它不会运行浏览器,因此可以捕获语法错误或被删除的元素,但无法捕获运行时错误。
欢迎提交 PR。请参阅 CONTRIBUTING.md。
托管版本
自托管是本产品的核心,开源版本也保持完整。如果你不想运行服务器,Anvil Nine 正在打造一个托管版本:发布流程相同,并提供自定义域名和备份服务。首次发布云端公告时会开放候补名单页面;在此之前,请关注此仓库的 releases。
安全
上传的 HTML 会在浏览器中运行。这正是整个产品的目的,因此我们设计了相应机制来隔离它:
- 从独立来源提供制品。 将制品 URL 指向一个不托管其他内容的域名,这样发布的页面就无法访问仪表板的会话 Cookie。
- 写入需要范围受限的 API 密钥。 发布操作使用 bearer 密钥;管理仪表板则使用单独的 HttpOnly、SameSite=Strict 会话 Cookie。
- 读取依赖难以猜测的 slug。 任何拥有链接的人都能访问公开制品,且制品带有
noindex,但没有可供浏览的列表。不要发布机密信息。 - 凭据路由设有速率限制。 登录和解锁会按客户端 IP 限流,并在事件循环之外对密码进行哈希处理。
publish范围以下的调用方会使用 256 kB 请求体解析器,而非 10 MB 解析器;每个客户端 IP 每分钟最多处理 20 个大请求体。这两项检查都会在解析请求体之前进行。请在前方配置 CDN 或边缘限流器,以抵御流量攻击。
完整威胁模型见 SECURITY.md。
致谢
本项目建立在他人的开源成果之上。以下项目均采用 MIT 许可证。
运行时
- express 用于 HTTP 服务
- marked 用于 Markdown 渲染
- nanoid 用于生成难以猜测的 slug
- adm-zip 用于提取 zip 站点
- zod 用于请求验证
- @modelcontextprotocol/sdk 用于内置的 MCP 服务
可选存储后端(仅在选用时加载)
- aws4fetch 用于兼容 S3 的签名
- isomorphic-git 用于 git 后端
- pg 用于 Postgres 后端
SQLite 后端使用 Node 内置的 node:sqlite(无需依赖)。
Web UI
- Tabler Icons 用于应用栏图标(搜索、新建、设置、锁),并以内联 SVG 形式嵌入
许可证
MIT © 2026 Zonily Jame
一个容器。默认使用纯文件;可插拔的 S3 / git / Postgres / SQLite 存储。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。