rtfx.pro について
rtfx.pro は、ダッシュボード、コマンドライン、エージェントセッションから HTML 成果物や小規模な静的サイトを公開するための非公開ホスティングサービスです。ユーザー単位のアクセス制御、取り消し可能な共有リンク、成果物のバージョン履歴を備えています。
主な機能
- 01単一 HTML ファイルや静的バンドルの公開
- 02成果物ごとのアクセス設定
- 03取り消し・期限設定可能な共有リンク
- 04バージョン保存とロールバック
- 05閲覧ログと開封通知
- 06ワークスペースとロールの管理
活用シーン
- 01Claude が生成した HTML 成果物を指定相手と共有
- 02複数ファイルの静的サイトを公開
- 03成果物を以前の版に戻す
- 04共有成果物を閲覧した人の確認
MCP 対応
ホスト型のリモート MCP サーバーは Streamable HTTP と OAuth 2.1 を使用し、読み取り、公開、管理のスコープを提供します。MCP クライアントから成果物の公開、共有、削除ができます。サーバーが受け取るのはツール呼び出しに含まれる内容のみで、ローカルのファイルパスは読み取れません。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://mcp.rtfx.pro/mcpclaude mcp add --transport http pro-rtfx-rtfx https://mcp.rtfx.pro/mcp{"mcpServers":{"pro-rtfx-rtfx":{"type":"http","url":"https://mcp.rtfx.pro/mcp"}}}Cursor で開く{"servers":{"pro-rtfx-rtfx":{"type":"http","url":"https://mcp.rtfx.pro/mcp"}}}VS Code で開く{"mcpServers":{"pro-rtfx-rtfx":{"type":"http","url":"https://mcp.rtfx.pro/mcp"}}}{"mcpServers":{"pro-rtfx-rtfx":{"serverUrl":"https://mcp.rtfx.pro/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
artifacts-server
Cloudflare Workers 上で完全に動作する、ランディングページと HTML/Claude アーティファクト向けの、非公開でアクセス制限付きのホスティングサービスです。公開プロダクトサイトの /(および /docs、/signup、/login)では、サービスを紹介し、Free プランを始められます。サインインはアプリが管理するパスワードレス方式です。rtfx.pro からワンタイムコードまたはマジックリンクをメールで送信し、ホスト限定の rtfx_session によってブラウザーのサインイン状態を維持します。/admin にある 1 つのダッシュボードで、公開、共有、共有されたすべてのコンテンツのギャラリーを管理できます。アーティファクト(単一の HTML ファイルまたは複数ファイルの静的バンドル)は、ウェブダッシュボード、CLI、またはエージェントセッション(Claude Code、Hermes)から公開できます。アーティファクトごとの権限設定とバージョン管理に対応しています。
- 🤖 エージェントネイティブな公開 — Claude Code、ネイティブ MCP サーバー、Hermes、CLI、HTTP API はすべて、人間と同じ経路を利用します。エージェント用の別経路や、機能を制限した経路はありません。
plugins/rtfxとdocs/MCP.mdをご覧ください。 - 👥 まずアイデンティティに基づくアクセス — 各アーティファクトは非公開、名前を指定した相手との共有、またはサインイン済みユーザー全員への公開に設定できます。権限のないリクエストと存在しないリクエストには、どちらも 404 を返します。
- 🔗 取り消し可能な共有リンク — アカウントを持たない相手向けに、特定のアーティファクト 1 つだけを対象とする URL を作成できます。有効期限は任意で 1~365 日に設定できます。保存されるのはハッシュのみです。
- 🕓 バージョン管理 — 再公開するたびに新しい不変のバージョンが作成されます。プランの保持期間内であればロールバックできます(Free プランでは直近 5 件を保持、有料プランではすべて保持します)。
- 📈 閲覧ログと開封確認 — 各アーティファクトを誰が、いつ、どのバージョンを、どこから閲覧したかを確認できます。名前を指定した受信者が初めて開いた際には、メールが届きます。
- 🏢 ワークスペースとロール — アーティファクトは
owner/admin/member/viewerのロールを持つアカウントに属します。インスタンス権限は設定から再導出され、テーブルから読み取られることはありません。 - 🔗 正規のワークスペースアドレス — 各ワークスペースにはアドレスがあり(
w-xxxxxxxxとして生成され、有料ワークスペースではカスタムアドレスを取得可能)、すべてのアーティファクトリンクはrtfx.pro/<workspace>/<artifact>です(例:rtfx.pro/yogev/q3-board-report)。プロダクトが表示または返す URL はこれだけです。ビューアーはアプリのホスト上で表示され、サンドボックス化されたコンテンツのオリジンをフレーム内に読み込みます。このオリジンがアドレスになることはありません。古いa.rtfx.pro/<slug>/リンクはブラウザーでこちらにリダイレクトされます。カスタムドメインではなく、アプリホスト上のパスです。 - 🌐 公開プロダクトサイト —
/、/docs、/signup、/login、/privacy、/termsは誰でもアクセスでき、SEO メタデータ、sitemap.xml、robots.txt、llms.txtにも対応しています。それ以外はすべてアイデンティティが必要です。 - 🔒 アクセス制限付きダッシュボード — アプリが管理するメール OTP/マジックリンク方式で、
/adminと API にサインインできます。アプリはパスワードを保存しません。 - 🖼️ 1 つのダッシュボード — Artifacts で公開と管理を行い、Gallery で共有されたすべてのコンテンツを確認できます。同じシェル、同じナビゲーション、同じブランドです。
- 🔑 API トークン — サーバー間の公開(Hermes Cloud、CI)に使える、スコープを設定可能で、所有者に紐付けられ、取り消し可能なハッシュ化ベアラートークンです。
- ☁️ すべて Cloudflare — Worker + R2(ファイル)+ D1(メタデータ)。サーバーも、運用が必要なデータベースもありません。
技術スタック: TypeScript · Hono · Cloudflare Workers / R2 / D1 / Email Sending · Lemon Squeezy
まだ実装されていない機能であり、説明文でも意図的に提供を示唆していないもの:リンクごとのパスワード、アーティファクト用のカスタムドメイン(ブランド付きワークスペースアドレスはアプリホスト上のパスであり、独自のホスト名ではありません)、コメント/承認、アーティファクトの公開ギャラリー、使用量ベースの課金、各プランに含まれる固定席数を超える席数単位の課金。アクセスはまずアイデンティティに基づきます。共有リンクは、有効期限を任意で設定でき、即時に取り消し可能な、独立した URL です。競合分析と、必須機能と差別化要因の完全な分類については、docs/POSITIONING.md をご覧ください。公開サイトは 1 ページです:rtfx.pro — MCP サーバーを接続してから、公開、共有、削除を行います。
仕組み
/, /docs, /signup, /login and legal pages (public)
│
Browser / CLI ─────────────────────────┼──────────────────────────▶ Worker (Hono)
┌──────── app-owned email OTP / magic link ───────┐ │
│ rtfx_session cookie + users/accounts tables │────┘
└─────────────────────────────────────────────────┘
files · /admin · /api │
┌───────────────────────┬────────────────────┐ │
▼ ▼ ▼ │
R2 (files at D1 (metadata: Email + │
<slug>/v<N>/…) artifacts, grants, billing │
versions, sessions) webhooks │
/、/signup、/login、/docs、/privacy、/terms、robots.txt、sitemap.xml、llms.txtは、公開されている製品ページ/クローラーページです。- rtfx.pro のセッションでは、メールコードまたはマジックリンクによる認証後に発行される署名付き
rtfx_sessionCookie を使って、ダッシュボード/API/アーティファクトへのリクエストを認証します。 - Worker はアーティファクトごとにアクセスを許可(閲覧できるユーザーを制御)し、各アーティファクトの最新バージョンを配信し、公開サイトとダッシュボードを表示し、JSON API を公開します。
- R2 は
<slug>/v<N>/…の下にファイルを保存し、D1 はメタデータを保存します。
詳しくは docs/ARCHITECTURE.md をご覧ください。
前提条件
- Node.js 18+
- **ドメイン(ゾーン)**をアカウントに登録した Cloudflare アカウント(管理するホスト名から配信します。rtfx.pro と同じ分離構成にする場合は、別のコンテンツ用ホスト名も使用します)。
- Cloudflare Workers、R2、D1、Email Sending が有効になっていること。
npx wrangler login(Workers/R2/D1/デプロイを承認します)
クイックデプロイ
git clone https://github.com/yogevgab/artifacts-server.git
cd artifacts-server
npm install
npx wrangler login
npm run setup
npm run setup は、単一ホスト名で簡単にセットアップする方法です。R2 バケットと D1 データベースを作成し、スキーマを適用して、基本的な Worker 設定を入力し、デプロイします。その後、別のコンテンツ用ホスト名、Email Sending、課金用シークレット、法的事項に関する値など、本番環境でのみ必要となる設定を追加できます。rtfx.pro のように複数のホスト名を使ってデプロイする場合は、セットアップスクリプトに頼らず、docs/SELF_HOSTING.md と以下の手動手順を使用してください。
処理が完了したら、Email Sending と SESSION_SECRET を設定し、https://<your-domain>/signup または /login を開いて最初のアカウントを作成します。プラットフォーム管理者権限を付与するユーザーは、wrangler.jsonc の ADMIN_EMAILS で指定します。
手動デプロイ
セットアップスクリプトを使わない手順
コンテンツ専用のホスト名を分けてデプロイしますか(複数の
routesエントリーを使い、アプリとコンテンツ用ホスト名を分離する場合など)?npm run setupは単一ホスト名にのみ対応しています。実際の手順例についてはdocs/DEPLOY_RTFX.mdをご覧ください。
npm install
npx wrangler login
# 1. Storage
npx wrangler r2 bucket create artifacts-files
npx wrangler d1 create artifacts-meta # copy the database_id into wrangler.jsonc
npx wrangler d1 execute artifacts-meta --remote --file schema.sql
# 2. Edit wrangler.jsonc: set route patterns to your app/content hostnames,
# ADMIN_EMAILS, PUBLIC_BASE_URL, CONTENT_HOSTNAMES and the database_id.
# 3. Required secrets / mail
npx wrangler secret put SESSION_SECRET
# Optional, only if selling paid plans:
# npx wrangler secret put LEMONSQUEEZY_WEBHOOK_SECRET
# 4. Deploy (creates the custom domains)
npx wrangler deploy
サインインには Email Sending が必要です。 ドメインで有効にし、SPF/DKIM/DMARC を検証して、MAIL_FROM が Worker の send_email.allowed_sender_addresses に含まれていることを確認してください。アプリはワンタイムコードまたはマジックリンクを送信し、その後、独自のホスト限定 rtfx_session Cookie を発行します。新規デプロイでは Cloudflare Access は不要です。
設定
設定はすべて wrangler.jsonc(vars)と 1 つのシークレットにあります。コメントもご覧ください。
| 設定 | 内容 |
|---|---|
routes[0].pattern | 配信元のホスト名(アカウントに登録されたゾーン)。 |
ADMIN_EMAILS | 管理者権限を持つメールアドレスをカンマ区切りで指定します。 |
SUPER_ADMIN_EMAILS (任意) | オペレーター/所有者のアカウント。スーパー管理者は他の管理者を管理でき、停止や削除はできません。これはロックアウト防止のための不変条件です。デフォルトでは最初の ADMIN_EMAILS エントリーが設定されるため、すべてのデプロイに 1 名が設定されます。 |
MAIL_FROM | OTP/マジックリンクのメールに使用する、検証済みの送信元アドレス。Email Sending のバインディングと一致する必要があります。 |
SESSION_SECRET (シークレット) | 32 バイト以上。アプリが管理する rtfx_session Cookie に署名します。 |
LEMONSQUEEZY_WEBHOOK_SECRET (シークレット、任意) | 有料プランを有効にした場合、課金 Webhook を検証します。 |
PUBLIC_BASE_URL (任意) | 正規の公開オリジン(例:https://rtfx.pro)。正規リンク、OpenGraph URL、sitemap.xml、llms.txt はこの値を基準とした絶対 URL になります。その他のホスト名では、すべてを拒否する robots.txt が配信されます。デフォルトは https://rtfx.pro(src/seo.ts の SITE.origin)です。 |
CONTENT_HOSTNAMES (任意) | アーティファクトファイルのみを配信するホスト名。ダッシュボード、API、製品ページは配信しません。 |
使い方
公開プロダクトサイト
https://<your-domain>/ — 公開されており、ログインは不要です。プロダクトの位置づけやユースケース、差別化要素を紹介し、/waitlist でアクセス申請を受け付けます。2つのCTAは意図的に区別されています。アクセスを申請(アカウントを持っていない人向け)と、サインイン(/login、アカウントを持っている人向け)です。
/docs は公開ドキュメントページです(公開方法、Claude Code/Hermes、アクセスモデル、#why-rtfx、FAQ)。SEO/クローラー向けの情報と文章作成のルールについてはdocs/PUBLIC_SITE.mdを、文章で主張できる内容についてはdocs/POSITIONING.mdを参照してください。
サインイン
https://<your-domain>/login — 公開されている、アプリが管理するサインインページです。ワンタイムコードまたはマジックリンクをメールで送信し、それを検証してから、ホスト限定のrtfx_session Cookieを設定します。サインアウト中、すでにサインイン済み、アカウント一時停止中の各状態が表示されます。新規デプロイでは、パスワード認証もCloudflare Accessへの依存もありません。
ダッシュボード
https://<your-domain>/admin — アーティファクトの公開、アーティファクトごとのアクセス管理、新しいバージョンのアップロード/ロールバック、(管理者のみ)ユーザー管理を行います。管理者を含むすべてのユーザーに表示されるのは、自分が所有するか所属するアーティファクトのみです。プラットフォーム管理者も、他のユーザーのアーティファクトのコンテンツ、バージョン、閲覧ログ、アクセスリスト、共有リンクにはアクセスできません。Platform セクション(スーパー管理者)には、すべてのアーティファクトがメタデータのみ(所有者、サイズ、件数、日付)で一覧表示され、監査ログに記録される不正利用への削除操作ができます。/admin/gallery のギャラリーセクションには、各閲覧者が開けるもの、つまり自分が所有するものと共有されたものだけが表示されます。/gallery は引き続きこのページへのリダイレクトとして機能し、サインアウト中にアクセスすると/loginに移動します。
ユーザー管理
ダッシュボードおよび/api/usersにある管理者専用機能です。アプリは署名付きセッションでユーザーの本人確認を行い、アカウント/ユーザーの状態をD1に保存します。
| レイヤー | 保持する情報 | 真実の情報源となる対象 |
|---|---|---|
rtfx_session Cookie | 署名付きメールアドレス/アカウントID | このブラウザーリクエストを行っているユーザー |
users / accounts tables | ステータス、表示名、ワークスペースの所属、ロール、監査状態 | このアプリがユーザーにサービスを提供するか、またユーザーが管理できる対象 |
ADMIN_EMAILS / SUPER_ADMIN_EMAILS | プラットフォーム権限 | インスタンス全体のオペレーター/管理者 |
Workerは、ユーザーが書き換え可能なテーブルからではなく、設定に基づいてプラットフォーム権限を再導出します。ライフサイクル操作では、アカウントの一時停止/再有効化/削除やAPIトークンの失効ができますが、ユーザー管理ルートではAPIトークンを一切受け付けません。
CLI
export ARTIFACTS_URL=https://<your-domain>
# One credential: the artifact commands go to /api/machine/…, which authenticates
# this bearer token and nothing else.
export RTFX_API_TOKEN=<rtfx_… token>
node cli/artifacts.mjs publish ./page.html --slug my-page --title "My Page"
node cli/artifacts.mjs publish ./site/ --slug demo --title "Demo" # a folder is zipped
node cli/artifacts.mjs list
node cli/artifacts.mjs publish ./page-v2.html --slug my-page --note "new hero" # new version
node cli/artifacts.mjs versions my-page
node cli/artifacts.mjs rollback my-page 1
node cli/artifacts.mjs grant my-page [email protected]
node cli/artifacts.mjs views my-page # total/unique + recent views log
node cli/artifacts.mjs users # directory with role + status
node cli/artifacts.mjs user-add [email protected] # invite
node cli/artifacts.mjs user-disable [email protected] # pause + revoke their tokens
node cli/artifacts.mjs user-enable [email protected]
node cli/artifacts.mjs token-create "hermes-cloud" --owner [email protected] --scopes read,publish
node cli/artifacts.mjs tokens
node cli/artifacts.mjs token-revoke <token-id>
token-*とuser-*には、適切なプラットフォーム/ワークスペースのロールを持つアプリセッションが必要です。APIトークンでトークンの発行や失効、またはサインイン可能なユーザーの変更を行うことはできません。
リモート MCP サーバー(ホスト型)
rtfx.pro はリモート MCP サーバーです。Claude(claude.ai、Claude Desktop、モバイルでは同じ手順を使用します:Customize → Connectors → + Add → Add custom connector)に追加し、公開、共有、削除を Claude に依頼します。スクリーンショット付きの手順:rtfx.pro/guide。
- エンドポイント:
https://mcp.rtfx.pro/mcp(Streamable HTTP) - 認証:discovery、動的クライアント登録、クライアント ID メタデータドキュメント(CIMD)を備えた OAuth 2.1。貼り付けるものはありません。スコープ:
rtfx:read、rtfx:publish、rtfx:manage。 - Claude Code:
claude mcp add --transport http rtfx https://mcp.rtfx.pro/mcp
ホスト型サーバーは、ツール呼び出し内で送信されたコンテンツを公開します。ディスク上のパスは読み取れません(その場合は、以下のローカルプラグインを使用してください)。ツール(src/mcp.ts の REMOTE_TOOLS):
| ツール | 機能 |
|---|---|
publish | リクエストに含まれるコンテンツからアーティファクト(HTML ページまたは PDF 1 つ、あるいは小規模な複数ファイルのサイト)を公開し、固定 URL を返します。同じスラッグを使うと、新しいバージョンが追加されます。 |
create_upload_link | 保存先を確保し、publish には大きすぎるサイトや、画像、動画、その他のバイナリファイルを含むサイト向けに、1 回限りのアップロード URL を返します。 |
list_artifacts | 認証情報で管理できるアーティファクトを、新しい順にページ分割して一覧表示します(スラッグ、タイトル、URL、種類、公開範囲、公開中のバージョン、サイズ、最終更新日時)。 |
artifact_details | 1 つのアーティファクトに関するすべての情報を表示します:URL、全バージョンの履歴、共有相手(閲覧者と編集者)、閲覧回数。 |
artifact_statistics | 1 つのアーティファクト、または認証情報でアクセスできるすべてのアーティファクトについて、バージョン数、ファイル数、バイト数、閲覧数を集計します。 |
share_artifact | アーティファクトを開けるユーザーを設定し直します。指定した閲覧者と編集者に限定するか、ワークスペース内の全員に公開できます。manage スコープが必要です。 |
rollback_artifact | アーティファクトの URL を以前のバージョンのいずれかに戻します。破壊的な操作ではありません。manage スコープが必要です。 |
delete_artifact | アーティファクトを完全に削除します。すべてのバージョン、ファイル、アクセス権、共有リンクが対象です。confirm_slug が必要です。manage スコープが必要です。 |
doctor | この接続の認証方式と、インスタンスが応答するかどうかを報告します。何も公開しません。 |
Claude Code プラグイン(ローカル、stdio の代替)
このリポジトリは Claude Code マーケットプレイスでもあります。プラグインをインストールすると、公開が会話の一部になり、別の手順を踏む必要がなくなります。
/plugin marketplace add yogevgab/artifacts-server
/plugin install rtfx@rtfx
続いて、セッションからサインインします。トークンをコピー、貼り付け、保存する必要はありません。
/rtfx:login
インスタンスに対して、ループバックリダイレクトを使った PKCE 対応の OAuth 認可コードフローを実行し、~/.config/rtfx/credentials.json に 0600 の認証情報を書き込みます(リフレッシュトークンはローテーションされます。/rtfx:logout は両方のトークンを無効化して、ファイルを削除します)。CI やスクリプトからの利用では、環境変数のトークンがフォールバックとして使われ、保存済みのサインイン情報より優先されます。
export RTFX_API_TOKEN=rtfx_… # dashboard → Integrations (scopes: read, publish)
export ARTIFACTS_URL=https://rtfx.pro # only when self-hosting
Skill publishing-to-rtfx | 「これを公開して」/「リリースして」と言うと、自動的に読み込まれます。 |
/rtfx:publish [path] [slug] | 公開または再公開して、URL を報告します。 |
/rtfx:list · /rtfx:versions · /rtfx:rollback | 一覧、履歴、ロールバックを行います。 |
/rtfx:login · /rtfx:logout | ブラウザーでサインインし、サインインを無効化します。 |
/rtfx:setup | 認証情報と接続を確認します(トークンそのものではなく、トークンの ID を出力します)。 |
パブリッシャー(plugins/rtfx/scripts/rtfx.mjs)は依存関係のない Node 18+ 製で、このリポジトリをチェックアウトしたことがないマシンでも、通常の CLI として動作します。.env、*.pem、*.key などのアップロードを拒否し、.git/node_modules をスキップして、除外したものをすべて表示します。
これは現在利用可能で、誰かの承認を必要としません。有効な .claude-plugin/marketplace.json があるリポジトリは、どれでも Claude Code マーケットプレイスになります。このプラグインは Anthropic のコミュニティまたは公式マーケットプレイスには掲載されていません。前者への申請に必要な内容は、docs/ANTHROPIC_PLUGIN_SUBMISSION.md に記載されています。
詳細、テスト、設計に関するメモについては、docs/CLAUDE_CODE.md をご覧ください。リリースノート:plugins/rtfx/CHANGELOG.md。
Claude Desktop 拡張機能
現在のリリースからダウンロードするか、ローカルでビルドします。
https://github.com/yogevgab/artifacts-server/releases/download/v1.2.0/rtfx.dxt
npm run dxt:pack
open dist/rtfx.dxt
これにより、claude_desktop_config.json を手作業で編集せずに、同じローカル MCP サーバーがインストールされます。ユーザーのマシン上で動作するため、ローカルのパス/フォルダーを公開できます。ブラウザー OAuth 認証情報ストアを使う場合は、任意の API トークンを空欄にしておきます。アクセス管理を公開するのは、明示的に必要な場合に限ってください。詳細については、docs/CLAUDE_DESKTOP.md をご覧ください。
ローカル MCP サーバー(stdio の代替)
上記のホスト型サーバーがデフォルトです。このプラグインにはネイティブのローカル MCP サーバー(plugins/rtfx/scripts/rtfx-mcp.mjs)も含まれているため、コマンドを実行するシェルがないクライアント(Claude Desktop など、MCP に対応するもの)も、ツール呼び出しを通じて公開できます。プラグインをインストールすると登録されます。Claude Desktop を手動で設定する場合は、claude_desktop_config.json でスクリプトを指定します。
{
"mcpServers": {
"rtfx": {
"command": "node",
"args": ["/absolute/path/to/plugins/rtfx/scripts/rtfx-mcp.mjs"],
"env": { "RTFX_API_TOKEN": "rtfx_…" }
}
}
}
ツール:publish(何もアップロードしない dry_run 付き)、list_artifacts、get_versions、rollback、doctor、およびオプトインの環境変数を介した update_access。トークン、スコープ、バンドルフィルターは同じです。CLI と同じライブラリのラッパーであり、別の実装ではありません。依存関係はゼロで、MCP SDK は不要です。Node 18+。
ツールスキーマ、クライアント設定、プラグインを代わりに使うべき状況については、docs/MCP.md をご覧ください。
API トークン(サーバー間)
Hermes Cloud、CI、スクリプトなどの自動公開ツールは、ブラウザにログインする代わりに、Authorization: Bearer <token> として送信するハッシュ化 API トークンで認証します。
curl -X POST "$ARTIFACTS_URL/api/machine/artifacts" \
-H "Authorization: Bearer $RTFX_API_TOKEN" \
-F "slug=my-page" -F "title=My Page" -F "file=@./page.html;type=text/html"
- 各トークンについて保存されるのは SHA-256 ハッシュのみです。平文は作成時に一度だけ表示されます。
- すべてのトークンには所有者が設定され、そのユーザーの所有権ルールを引き継ぎます。管理者のトークンはすべてを管理でき、ユーザーのトークンで管理できるのはそのユーザー自身のアーティファクトのみです。
- スコープ(
read、publish、manage)によって、トークンの権限を所有者の権限より狭めることができます。権限が広がることはありません。デフォルトはread,publishのため、公開連携では削除できません。 - トークンは失効させることができ(
token-revoke)、有効期限を設定できます。また、所有者が rtfx.pro から削除されると自動的に失効します。
意図的に2つのエンドポイントを用意しています。 /api/… はダッシュボードのブラウザー/セッション API です。アプリが管理する rtfx_session によってユーザーが識別され、通常のロールチェックで実行可能な操作が決まります。/api/machine/… は、マシン向けの同じアーティファクト機能(公開、一覧、バージョン、ロールバック、閲覧、共有、削除)を提供しますが、より厳格な認証が適用されます。ベアラートークンが必須で、ブラウザーセッションは明示的に拒否されます(src/auth.ts の requireApiToken)。ユーザー管理、トークン発行、ワークスペースのメンバーシップは、意図的にこのエンドポイントには含めていません。これらの操作には、適切なロールを持つユーザーのアプリセッションでのサインインが必要であり、パスにかかわらず API トークンは拒否されます。
リクエスト/レスポンスの仕様、エラーコード、ロールバックの手順については、以下を参照してください。
docs/HERMES_CLOUD.md。
権限
アプリは、メールで送信されたコードまたはマジックリンクを検証し、rtfx_session Cookie を設定することで、誰がサインインしているかを判断します。Worker は、各アーティファクトを誰が閲覧できるかを判断します。restricted(許可されたメールアドレスのみ)または everyone(アーティファクトのワークスペースにいる全員)のいずれかです。プラットフォーム管理者が閲覧できるのはメタデータのみで、コンテンツは閲覧できません。新しいアーティファクトはデフォルトで非公開です。閲覧者にアクセス権がない場合、直接 URL にアクセスすると 404 が返されます。
所有権。 すべてのアーティファクトは、公開したユーザー/ワークスペースに属します
(artifacts.owner_email / artifacts.account_id)。インスタンス管理者(ADMIN_EMAILS /
SUPER_ADMIN_EMAILS)はすべてを管理できます。通常のサインイン済みメンバーが管理できるのは、ワークスペースでの役割に応じて許可されたアーティファクトです。ダッシュボード、/api/artifacts の一覧、バージョンのプレビュー、分析情報は、自分が所有または管理するアーティファクトに限定されます。他人のアーティファクトを読み取ろうとしたり変更しようとしたりすると、404 が返されるため、自分が所有していないスラッグは存在しないスラッグと見分けがつきません。閲覧権限を付与されても、管理権限は得られません。また、他人が所有するスラッグへの公開は拒否され(409 slug_taken)、そのアーティファクトにバージョンが追加されることはありません。アカウント/ユーザーの管理は管理者のみが行え、API トークンはこれらのルートでは意図的に拒否されます。
所有者がいないアーティファクト(このモデルが導入される前に公開されたもの、またはメールアドレスのないレガシーサービスのトークンによって公開されたもの)は、管理者のみが管理できます。既存のデータベースでは migrations/0005_owner_email.sql を実行してください。created_by が実際のメールアドレスだった場合、その値を使って所有者をバックフィルします。API トークンは migrations/0006_api_tokens.sql にあり、ローカルのユーザー/アカウントテーブルは 0007 以降で追加されます。
アカウント/ワークスペース。 アーティファクトはアカウント、つまり所有するワークスペースにも属し、将来的にはプランの請求先にもなります(artifacts.account_id)。各ユーザーには個人用ワークスペースが自動的に作成されます。チームワークスペースには複数のメンバーを所属させることができ、それぞれに owner、admin、member、viewer のアカウントロールを割り当てられます。member 以上のロールはワークスペースのアーティファクトを管理できます。viewer は閲覧できますが、変更はできません。
4 つの概念は意図的に分けられています。該当する行は、よく読んでください。
| 答える問い | 由来 | |
|---|---|---|
| ID | あなたが誰か | rtfx_session + users |
| アカウント | これらのアーティファクトを誰が所有するか | accounts |
| メンバーシップ | 1 つのワークスペース内で何ができるか | account_members |
| インスタンスロール | このデプロイメントに対して何ができるか | ADMIN_EMAILS / SUPER_ADMIN_EMAILS |
ワークスペースの owner であっても、インスタンスの管理者であるとは限りません。また、データベースに書き込んで管理者になる方法もありません。インスタンスの権限はリクエストごとに設定から再導出され、テーブルから読み取られることはありません。これはテストスイートが特に厳しく保護している特性です。
これはすべて追加的な変更です。account_id はどこでも NULL を許容し、owner_email が引き続き最初に確認されます。また、バックフィルで移行されなかったアーティファクトは、以前とまったく同じように動作します。既存のデータベースでは migrations/0008_accounts.sql、0009_account_links.sql、0010_backfill_accounts.sql を実行してください。0008 と 0010 は安全に再実行できますが、0009 は 2 つの列を追加するため再実行できません(最初に PRAGMA table_info(artifacts) を確認してください)。いずれも必須ではありません。Worker は初回使用時に同じ行を作成します。モデル全体については、docs/ARCHITECTURE.md を参照してください。
バージョン管理
既存のスラッグに公開するたびに、新しい不変バージョンが作成され、公開中のバージョンになります。無料プランでは直近 5 バージョンが保持され、それより古いバージョンは期限切れになります。データ本体は削除されますが履歴エントリは残るため、バージョン一覧に欠落は生じません。有料プランではすべてのバージョンが保持されます。以前のバージョンも保持されます。管理者は /v/<slug>/<n>/ で任意のバージョンをプレビューできます。ダッシュボードまたは rollback <slug> <n> でロールバックしてください。
閲覧ログ
各アーティファクトでは、サインイン済みのユーザーが HTML ページを読み込むと閲覧が記録されます(アセット、マシン/サービストークンによる取得、管理者によるバージョンプレビューはカウントされません)。管理者ダッシュボードと views <slug> には、合計数/ユニーク数と最近のログ(時刻・閲覧者・バージョン・国)が表示されます。閲覧記録は無期限で保持されます。増えすぎた場合は、artifact_views テーブルを整理してください。
開発
npm install
npm run dev # wrangler dev on http://localhost:8787 (DEV_LOGIN: no sign-in, you are admin)
npm test # vitest (unit + integration via @cloudflare/vitest-pool-workers)
npm run typecheck
npm run validate:plugin # structural check of the Claude Code plugin files
npm run check # typecheck + tests + plugin validation
ローカルでは、実際のメール認証は行われません。特定の閲覧者をシミュレートするには、X-Dev-Email ヘッダーを送信します。サインアウト状態の訪問者(例:/gallery が /login にリダイレクトすることを確認する場合)をシミュレートするには、X-Dev-Anonymous: true を送信します。どちらも npm run dev が設定する DEV_LOGIN=true の場合にのみ有効で、本番環境では無効です。
# once, seed the local DB:
npx wrangler d1 execute artifacts-meta --local --file schema.sql
コントリビューション
Issue や PR を歓迎します。CONTRIBUTING.md をご覧ください。PR を作成する前に、npm run check を実行してください。セキュリティ報告については、SECURITY.md をご覧ください。GitHub Security Advisories を利用し、公開 Issue には投稿しないでください。
セルフホスト
独自のインスタンスの実行に必要なものはすべてこのリポジトリにあります。Cloudflare アカウント、R2/D1、メール送信経路、セッションシークレット、任意の Lemon Squeezy 請求設定、および独自の法的情報をご用意ください。/privacy と /terms のページは運営者向けテンプレートとして同梱されており、その旨がページに記載されています。docs/SELF_HOSTING.md をご覧ください。
オープンソースとその境界
ソースコードは MIT ライセンスで、意図的に公開しています。アクセス制御製品では、アクセスを強制するコードを読めるようにすべきだからです。Worker、プラグイン、ローカルおよびリモートの MCP サーバー、CLI、テスト、ドキュメントはすべてここにあり、ご自身のマシンで実行する部分を非公開にはしていません。
ホスト型サービス rtfx.pro は、このソースコードとは別に運営されています。顧客データ、稼働中のアカウント設定、サポートと請求のパイプライン、商用資料はこのリポジトリには含まれていません。また、名称、マーク、ドメインは MIT ライセンスの付与対象ではありません。MIT は著作権ライセンスであり、商標を使用許諾するものではないためです。フォークして実行するのは自由ですが、独自の名称を付けてください。
公開するもの、非公開にするもの、その理由を含む境界の詳細は OPEN_SOURCE.md に記載されています。脅威モデル、プラグインの認証情報の取り扱い、ローカル MCP とリモート MCP の境界については SECURITY.md をご覧ください。
ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。