Artifacts — self-hosted artifact publishing (HTML/JSX/Markdown/zip → unguessable URL) について
Artifacts は、HTML、React コンポーネント、Markdown、PDF、ZIP サイトを独自ドメインで公開するセルフホスト型サービスです。推測困難な URL を発行し、ダッシュボード、CLI、MCP サーバーを備えています。
主な機能
- 01HTML、JSX/TSX、Markdown、PDF、ZIP サイトの公開
- 02非公開、公開、パスワード保護の設定
- 03ダッシュボードでの整理、検索、ライフサイクル管理
- 04CLI と失効可能な権限別 API キー
- 05任意のビューアーフレームと PDF 表示モード
活用シーン
- 01Agent が生成したレポートやプロトタイプの共有
- 02ZIP からの静的サイトのホスティング
- 03Markdown 文書や 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 風のアーティファクト公開ツール
HTML、React コンポーネント、Markdown、PDF、または ZIP 圧縮した静的サイトを POST できます。ご自身のドメイン上で、推測できない URL が返されます。
クイックスタート · デプロイ · API · CLI · MCP · セキュリティ

ダッシュボード:公開、プロジェクトごとのグループ化、管理

ビューアーのトップバー付きで配信される公開済みアーティファクト
概要
AI アシスタントは、ダッシュボード、プロトタイプ、レポート、小規模なアプリなど、共有可能な出力を数多く生成します。Claude のホスト型アーティファクトは便利ですが、URL は他者のインフラストラクチャ上にあります。これは約 1,100 行のセルフホスト可能なバージョンです。コンテンツを POST すると、管理下のドメイン上にある推測できない URL でレンダリング結果が配信されます。
単一の管理者アカウントで 1 つのコンテナとして動作し、デフォルトではデータベースを使用しません。各アーティファクトは /data 配下のプレーンファイルのディレクトリなので、そのディレクトリをバックアップすればすべてをバックアップできます。再起動時にローカルディスクが消去されるホストでは、STORAGE_BACKEND を設定して、耐久性のある外部ストレージ(S3 互換バケット、git リモート、または Postgres)を指定してください。デプロイをご覧ください。
機能
- コンテンツ形式。 HTML、JSX/TSX(単一の React コンポーネントで、ビルド手順は不要)、Markdown、PDF、ZIP 圧縮された静的サイトに対応します。
- エージェント向けで、人にも使いやすい設計。 組み込みの MCP サーバーにより、Claude Code、Codex、その他の MCP クライアントからツール呼び出し 1 回で公開できます。人間向けには、ドラッグ&ドロップ対応の Web UI(
/、管理者ログインの背後)とCLIを用意しています。 - 2 段階の認証。 管理者はパスワードでダッシュボードにログインします。CLI と MCP では、範囲を指定でき、失効可能なAPI キー(
read/publish/full)を使用し、必要に応じて有効期限も設定できます。そのため、マスターシークレットを共有する必要はありません。 - デフォルトは非公開、アーティファクトごとに公開範囲を設定可能。 新しいアーティファクトは
privateで、署名付きの権限リンク(?k=…)で共有できます。リンクはローテーションして失効できます。任意のアーティファクトをpublic(リンクを知っている人なら誰でも閲覧可能)またはパスワード保護に切り替えられます。デフォルトでは検索や発見ができないよう、推測困難なスラッグを使い、すべてにnoindexを設定しています。公開範囲をご覧ください。 - ビューアーフレームは任意です。 Claude、Gemini、ChatGPT のアーティファクトのような、細いトップツールバー(タイトル、リンクのコピー、非表示)を表示できます。設定で全体に適用するか、アーティファクトごとに設定できます。
?raw=1を指定すると、コンテンツのみを配信します。リダイレクトはフレーム内に表示されません。 - Markdown の表示設定。 設定から、すべての Markdown アーティファクトに適用する本文フォント、コンテンツ幅、基本フォントサイズ、初期テーマを選べます。Markdown は表示のたびにソースからレンダリングされるため、既存のアーティファクトにも変更が反映されます。フレーム付きの Markdown には、閲覧者が Auto、Light、Dark を切り替えるナビゲーションバーボタンが表示されます。docs/formats.mdをご覧ください。
- PDF ホスティング。 PDF を公開すると、ビューアーページと直接ダウンロードリンクが用意されます。アーティファクトごとに 3 種類のビューアーモード(standard、presentation、minimal)を選べるほか、ビューアーのボタンを非表示にするダウンロード切り替えもあります。この切り替えは利便性のためのものであり、保護機能ではありません。ファイルの URL には引き続きバイト列が返されます。docs/formats.mdをご覧ください。
- リダイレクト。
type: "redirect"を指定すると、スラッグはサーバーで HTTP 301 を返す短縮リンクになります。他のホストでは JavaScript によるリダイレクトにフォールバックします。転送先には絶対 http(s) URL を指定する必要があり、認証情報は含められません。また、レスポンスはキャッシュされないため、スラッグの転送先を変更すると次回のアクセスから反映されます。ダッシュボードの行メニューまたはPUTで転送先を変更できます。ご自身のドメインでオープンリダイレクターを運用するリスクを、事前にご確認ください:docs/formats.md。 - 埋め込み可能。 公開アーティファクトは、1 つの
<iframe>で任意のページに埋め込めます。行メニューからタグを生成できます。?raw=1を指定するため、フレームにはアーティファクトのみが表示され、2 つ目のツールバーは表示されません。非公開およびパスワード保護されたアーティファクトは意図的に埋め込み不可としており、ロック解除プロンプトもフレーム内への表示を拒否します。docs/embedding.mdをご覧ください。 - アーティファクトごとの QR コード。 すべてのアーティファクトに、固定 URL の QR コードが用意されています。ダッシュボードの行メニュー、
GET /api/artifacts/:slug/qr、またはartifacts qr <slug>から取得できます。SVG または PNG をプロセス内で生成するため、QR ライブラリもサードパーティの画像サービスも不要で、アーティファクトに関する情報が外部に送信されることはありません。API リファレンスをご覧ください。 - プロジェクトごとに整理。 同じプロジェクト向けに作成したアーティファクトを、折りたたみ可能なセクションにまとめられます。プロジェクト、タイトル、スラッグ、タグ、リダイレクト先を横断して検索できます。タグは、複数のプロジェクトにまたがる分類に使えます。
- ライフサイクル管理。 カスタムスラッグ、名前変更、タグ付け、削除せずに無効化、自動期限切れ、削除に対応します。
- 不正利用への対策。 ログインおよびロック解除のエンドポイントでは、クライアント IP ごとにレート制限を設けています(失敗時のみ)。また、パスワードハッシュ処理はイベントループ外で実行されるため、推測が急増してもサーバー全体を停止させず、これら 2 つのルートへの応答を遅らせます。Cloudflare またはリバースプロキシの背後で実際のクライアント IP を取得するには、
TRUST_PROXYを設定してください。デプロイをご覧ください。
クイックスタート
クローンし、設定して、起動します:
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 / 任意のエージェントを接続する | 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
エンドツーエンドテストは、1 つのシェルスクリプトで実行します。
bash .github/workflows/smoke.sh http://localhost:3000 <your-key>
auth.json を手動で編集した場合など、HTTP 経由ではテストできないケースもあります。そうしたケースは、サーバーを起動せず、Node 組み込みのランナーでユニットテストとして実行します。
npm test
これでダッシュボードもテストできます。dashboard-check.mjs は / を取得し、public/index.html 内のインラインスクリプトを解析して、スクリプトが ID で取得するすべての要素がマークアップ内に残っていることを確認します。ブラウザーは起動しないため、構文エラーや要素の削除は検出できますが、実行時エラーは検出できません。
PR を歓迎します。CONTRIBUTING.md をご覧ください。
ホステッド版
セルフホストがこの製品の基本であり、オープンソース版もすべての機能を備えています。サーバーを運用したくない場合は、Anvil Nine がマネージド版を開発中です。公開の流れは同じで、カスタムドメインに対応し、バックアップもこちらで管理します。最初のクラウド版の発表とともにウェイトリストページを公開する予定です。それまでは、このリポジトリのリリースをご確認ください。
セキュリティ
アップロードされた HTML はブラウザー内で実行されます。それが本来の目的であるため、実行を隔離できるよう設計されています。
- アーティファクトは専用のオリジンから配信します。 アーティファクトの URL には、ほかのコンテンツをホストしていないドメインを指定してください。そうすれば、公開ページがダッシュボードのセッションクッキーにアクセスすることはありません。
- 書き込みにはスコープ付き API キーが必要です。 公開時にはベアラーキーを使用し、管理ダッシュボードでは別の HttpOnly、SameSite=Strict のセッションクッキーを使用します。
- 読み取りは推測困難なスラッグに依存します。 公開アーティファクトにはリンクを知っている人なら誰でもアクセスでき、
noindexが付与されますが、閲覧用の一覧はありません。秘密情報を公開しないでください。 - 認証情報を扱うルートにはレート制限があります。 ログインとロック解除はクライアント IP ごとにレート制限され、パスワードのハッシュ化はイベントループ外で行われます。
publishスコープ未満の呼び出し元には、10 MB のパーサーではなく 256 kB のボディーパーサーが適用されます。また、クライアント IP ごとに 1 分あたり 20 件まで大きなボディーを受け付けます。どちらもボディーの解析前に確認されます。大量の攻撃に備えて、前段に CDN またはエッジレートリミッターを配置してください。
脅威モデルの全文は SECURITY.md をご覧ください。
謝辞
このプロジェクトは、ほかの方々によるオープンソースの成果に支えられています。以下はすべて MIT ライセンスです。
ランタイム
- HTTP サーバーには express
- Markdown のレンダリングには marked
- 推測困難なスラッグの生成には nanoid
- zip サイトの展開には adm-zip
- リクエストの検証には zod
- 組み込み MCP サーバーには @modelcontextprotocol/sdk
オプションのストレージバックエンド(選択した場合のみ読み込まれます)
- S3 互換の署名には aws4fetch
- git バックエンドには isomorphic-git
- Postgres バックエンドには pg
SQLite バックエンドでは、Node 組み込みの node:sqlite を使用します(依存関係なし)。
ウェブ UI
- アプリバーのアイコン(検索、新規、設定、ロック)には Tabler Icons を使用し、SVG としてインライン化しています。
ライセンス
MIT © 2026 Zonily Jame
コンテナー 1 つ。デフォルトではプレーンファイルを使用し、S3 / git / Postgres / SQLite ストレージに切り替え可能です。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。