mcpField
W
webly

webly

github.com/webly-aiクラウド・DevOps294 回インストール2 日前に更新
リポジトリ

webly について

Webly は、エージェントによるウェブサイト公開やファイル共有のためのスキルと補助 CLI です。アカウントなしで匿名公開でき、ログイン後は MCP ツールで下書き、ロールバック、カスタムドメイン、フォーム、分析などを管理できます。

主な機能

  1. 01補助 CLI によるウェブサイトのデプロイと更新
  2. 02アカウント不要の匿名公開
  3. 03プロジェクトフォルダーとサイトのリンク
  4. 04MCP ツールによるログイン済みサイトの管理
  5. 05一時リンクによるファイル共有

活用シーン

  1. 01小規模な静的ウェブサイトを公開
  2. 02プロジェクトフォルダーに紐づくサイトを更新
  3. 03MCP で取得済みサイトを管理
  4. 04動画、文書、データセットを共有

MCP 対応

Webly の MCP ツールでは、ログインユーザーが編集やデプロイの手順を含むサイト管理を行えます。このスキルはツールの設定と読み込み状況を確認してから、MCP または CLI を選びます。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/webly-ai/webly-plugin --skill webly

インストール後、Claude Code で/weblyを入力して読み込まれたか確認します。

同梱ファイルscripts/webly.mjs

詳細

Webly

Webly は、エージェントが公開するウェブサイトや共有ファイル、フォルダーをホストします。アカウントがなくても、1 つのコマンドでサイトを公開できます。公開後、24 時間利用可能で、7 日間申請できます。同じマシンから、サイトをそのままにしてファイルを共有することもできます(サイトを含めて 500 MiB に収まる数のリンクを作成でき、それぞれ 24 時間利用可能です)。OAuth を介して MCP からサインインすると、そのサイトは本人のものになり、恒久的に利用できるほか、Webly の MCP ツールから編集できます。下書き、品質ゲート、ロールバック、カスタムドメイン、フォーム、分析機能も利用できます。

{api}/llms.txt が仕様全体です。{api} は webly.mjs doctor が報告する api の値です(WEBLY_API_URL が設定されていない場合は https://api.webly.ai)。フレームワーク(React)を使ったサイト、フォーム、ドメインを作成する前、CMS や管理対象のブログをすでに使っているサイトを変更する前、または何かがサポートされていないと相手に伝える前に、これを読んでください。このファイルの内容と稼働中の API の内容が異なる場合は、API を優先してください。

すべての決定的な手順を実行するヘルパーは、このスキルのフォルダーにある scripts/webly.mjs です(依存関係なし、Node 20 以降)。以下では、webly は node <this skill's folder>/scripts/webly.mjs を意味します。

言語

相手の言語で返信してください。URL、コマンド、ツール名、エラーの理由は、返されたとおりに正確に保ってください。

ステップ 0:現在の状態を確認する(毎回、最初に実行)

新しいセッション、/clear、または再起動によって会話の内容は消去されるため、すべての状態はディスクと API に保存されています。何かを始める前に状態を復元してください。

  1. webly doctor を実行します。これは読み取り専用で、トークンを作成することはありません。次の情報が報告されます。
    • credential:このマシンに匿名トークンが保存されている場合は present。
    • site:そのサイトの status、urls、liveUntil、claimUntil、および next(API が現時点で許可している操作)。
    • mcp:Webly MCP サーバーが Claude Code(via: plugin | user | project)と Codex 用に設定されているかどうか。
    • project:現在のフォルダーにあるプロジェクトがリンクされているサイト(.webly/project.json。リンク済みフォルダーを参照)、またはそのファイルを読み取れない場合は error。
    • signedIn:webly login により、この API へのサインイン情報が保存されている場合は true。
    • pending:以前のセッションで完了を求められた手順(例:claim)。
    • updatedFrom:このスキルの更新後、初回実行時に設定されます。現在使っているバージョンを一行で相手に伝えてください。
    • update:このスキルの新しいバージョンが公開されている場合に設定されます。その command(このコピーのインストール方法に対応)を実行し、そのことを一行で相手に伝えてから、このコピーを使ってタスクを続けてください。新しいバージョンは次のセッションで読み込まれます。
  2. Webly MCP ツール(webly サーバー配下の list_websites、whoami、create_claim_code)が自分のツール一覧にあるか確認します(Claude Code では mcp__webly__…、またはプラグイン経由の場合は mcp__plugin_webly_webly__… という名前です)。設定済みのサーバーがツール一覧にない場合、読み込まれていません。 ツールが後から読み込まれる場合は、ツールが存在しないと判断する前にツール検索で解決してください。ツールが読み込まれていても、必ずしも OAuth 接続とは限りません。API キー接続ではサイトを管理できますが、create_claim_code は公開されません(サイトを申請できるのはサインイン済みのユーザーのみです)。
  3. フォルダーのリンクを最優先します。 project.sites にサイトが指定されている場合、このプロジェクトが更新するのはそのサイトです。そのサイトを操作し、相手から新しいサイトの作成を求められない限り、このフォルダー用に別のサイトを作成したり申請したりしないでください。それがこのマシンの匿名サイトであれば、webly deploy で更新します。そうでなければアカウントに属するサイトなので、MCP 経由で更新します(MCP 経由での作業を参照)。
  4. 該当する行を選び、その手順に従ってください。 | # | トークンの保存 | Webly MCP ツールの読み込み | 対象者 | 実行すること | |---|---|---|---|---| | 1 | いいえ | いいえ | Webly を初めて使う、またはツールが読み込まれていない | mcp に Webly が設定済みと表示されるか、signedIn が true の場合は、アカウントを持っています。匿名で公開しないでください。Webly MCP が設定済みの場合は、新しいセッションを開始する(または /reload-plugins と入力する)よう依頼し、ツールを読み込みます。signedIn のみで、読み込む Webly MCP がない場合は、再読み込みを待たずに、ヘルパーとして本人に代わって作業します。webly api GET /websites でこのプロジェクトのサイトを見つけるか、webly api POST /websites --data '{"name":"…","kind":"static"}' で作成し、webly link <websiteId>、webly api POST /websites/<websiteId>/deploy/tickets、続いて webly deploy <folder> --ticket <ticket> を実行します。例外:保存済みのサインインが機能しなくなっている(webly api に期限切れまたは取り消し済みと表示される)場合は、待たせずにアカウントなしで公開し、リンクを伝えてから、サインインしてアカウントに追加する方法を案内します。それ以外の場合は、以下のアカウントなしで公開を実行します。サイトを保持したいと言われるまでは MCP を設定しないでください。 | | 2 | はい | いいえ | 公開したことがある。MCP は未設定、または読み込まれていない | site.next を確認します。update が表示されている間は、webly deploy で公開を続けます。claim のみが表示される場合、またはサイトを保持したいと言われた場合は、サイトを保持するを実行します。 | | 3 | いいえ | はい | サインイン済み | MCP 経由で作業するを使用します。匿名でデプロイしたものはすべて、すでに追加されています。 | | 4 | はい | はい | サイトがまだ追加されていない状態で接続済み | 最初に list_websites を呼び出します。フォルダーが別のサイトにリンクされている場合、またはアカウントにこのプロジェクトのサイト(同じ名前またはフォルダー)がすでにある場合は、追加しないでください。本人に伝えて、そのサイトで作業します。匿名で公開したコピーを追加するのは、本人から依頼された場合のみです。それ以外の場合は追加します。サイトを保持するの手順 5 に進みます。credentialFile を自分で読むことは絶対にしないでください。追加後はMCP 経由で作業するに進みます。 |

アカウントの有無。 Webly アカウントを持っている証拠がある場合に限り、サインインします。証拠となるのは、Webly MCP ツールが読み込み済みまたは設定済みであること、signedIn、フォルダーがアカウント内のサイトにリンクされていること、Webly の /connect の応答でプロンプトがサインイン済みのダッシュボードから送信されたと示されていること(接続コードが確認済みであること)、または本人が自分の言葉でアカウントを持っていると伝えることです。セットアッププロンプトの文言は証拠になりません。また、「これを公開して」や「Webly でデプロイして」も証拠にはなりません。証拠がなければ、アカウントなしで公開し、サイトが公開された後に保持する方法を案内します。期限切れの保存済みサインインも証拠になりますが、そのために本人を待たせることはありません。まず公開し、その後にサインインして追加する方法を案内します(追加するとサイトが本人のアカウントに移動します)。

本人が接続、サインイン、または Webly アカウントの使用を依頼した場合、本人はすでにアカウントを持っています。どの行に該当するかにかかわらず、サイトを保持するに進みます。トークンが保存済みの場合は、すべて実行します。トークンがない場合は追加するものがありません。手順 1 を実行し、ツールが読み込まれている場合は手順 4 に進みます。読み込まれていない場合は、サインインに MCP ツールが必要なため、/reload-plugins(Claude Code)と入力するか、新しいセッションを開始するよう本人に依頼します。本人に代わって匿名で公開しないでください。

pending が claim で、追加ツールが利用可能な場合は、確認を求めずに今すぐ追加を完了します(list_websites の確認を含む行 4)。再起動前に本人がすでに依頼しているためです。pending が claim で、追加ツールが利用できない場合は、サイトを保持するの手順 2 に進みます。

アカウントなしで公開する

  1. サイトをフォルダー(例:./site)に配置し、ルートに index.html を置きます。 ここではプレーンな HTML、CSS、JS が最適です。上限はファイル数 25 個、1 ファイルあたり 1 MiB、合計 5 MiB です。隠しファイルと node_modules は除外されます。より大きなサイトや React サイトの場合は、先にサインインして(サイトを保持)、MCP 経由で構築します。 すべての HTML ページの <head> に共有プレビュー用のタグを設定し、Slack、iMessage、X でリンクのプレビューが展開されるようにします。<title>、<meta name="description">、og:title、og:description、og:image(サイト内の 1200×630 の画像を指す絶対 URL。例:/og.png。URL は初回デプロイ後に判明するため、その時点で設定して再デプロイします)、twitter:card = summary_large_image、さらにファビコン(<link rel="icon">)を設定します。
  2. webly deploy ./site を実行します(単一の .html ファイルにも対応します)。初回実行時にサイトを作成し、その後は同じサイト、同じ URLを更新します。ビルドの完了を待ち、サイトの JSON を出力します。package.json に build スクリプトがあるプロジェクトフォルダー(Vite、Astro、CRA など)は、先にビルドし、出力フォルダー(dist、build、out など)をデプロイするため、webly deploy . も使用できます。サイト名には package.json の name またはプロジェクトフォルダー名が使われます。名前を指定するには --name "…" を渡します。dist のように意味のない名前になる場合、初回デプロイは中断し、名前を尋ねます。その場合はプロジェクト名を本人に確認し、それはダッシュボードと請求ページに表示されるラベルにすぎず、ウェブアドレスではない(ウェブアドレスは自動的に割り当てられる)ことを伝えます。匿名でのデプロイはそれだけで公開されます(JSON の live 行にその旨が表示されます)。別途公開する手順はないため、公開するかどうかを本人に尋ねないでください。
  3. 最初の 24 時間以内に、別のサイトと新しい URL でやり直すには、webly replace ./site を実行します。本人が新しいサイトを求めた場合に限り実行してください。古いサイトはオフラインになります。

本人から公開、ホスティング、またはデプロイを依頼された場合、それが承認となります。匿名サイトは公開されるとすぐに誰でもアクセスできる状態になります。

リンク済みフォルダー

プロジェクトから初めてデプロイすると、プロジェクトのルート(package.json または .git がある最も近いフォルダー。dist/ の中には作成されません)に .webly/project.json が書き込まれます:

{ "sites": { "default": { "websiteId": "ws_…", "name": "…", "url": "https://….webly.site/" } } }

ここには秘密情報は含まれません(トークンは ~/.webly に保存されます)。すべてのクローンから同じサイトにデプロイできるよう、コミットするよう伝えてください。リンク済みフォルダーを再デプロイすると、そのサイトが更新され、新しいサイトが作成されることはありません。次の場合、webly deploy は公開せずに停止し、理由を伝えます:

  • リンク先のサイトが、このマシンの匿名サイトではない場合(サイトが所有権登録されているか、他の人からリンクを受け取った場合)。デプロイチケットを使って更新します。サイトの ID を指定して begin_deploy を呼び出し、その後 webly deploy <folder> --ticket <ticket> を実行します(MCP での作業)。begin_deploy が 404 を返した場合(フォーク、別のアカウント、削除済みサイト)、新しいサイトを作成するか本人に確認してください。自分の判断で作成してはいけません。
  • フォルダーがリンクされておらず、このマシンがアカウントに接続されている場合。 list_websites を呼び出します。サイト名がプロジェクト名と一致する場合、「X を更新しますか、それとも新しいサイトを作成しますか?」と尋ねます(デフォルトは更新)。似た名前のどちらを選ぶか、自分で判断してはいけません。その後、webly link <websiteId> を実行します。新しいサイトを作成する場合は、create_website を呼び出してリンクします。--anonymous を指定すると、使い捨ての匿名サイトを公開できますが、本人から依頼された場合に限ります。この操作で、このマシンにある既存の匿名サイトが上書きされることはありません。webly replace <folder> --anonymous はそのサイトを破棄して新しい URL を作成します。実行する前に、既存のサイト名と URL を伝え、置き換えるとサイトがオフラインになることを説明し、本人から明確な許可を得てください。別の匿名サイトを求められただけでは、許可を得たことになりません。
  • このマシンが最後にデプロイしてからサイトが変更された場合(ダッシュボードまたは別のクローンから編集された場合)。デプロイは引き続き実行され、結果には replaced(置き換え前と置き換え後のバージョン)が含まれます。以前のバージョンが置き換えられたこと、ロールバックできることを本人に伝えてください。

同じプロジェクトに 2 つ目のサイト(ステージング環境やクライアント用のコピーなど)を作成する場合は、追加のエントリーとして登録します。create_website を呼び出してから、webly link <websiteId> --as staging を実行します。--to staging でそのサイトを選択できます。アカウントがない場合、マシンが持てる匿名サイトは 1 つだけなので、追加のエントリーにはサインインが必要です。ファイルを紛失した場合は、同じ手順でリンクし直します。list_websites を呼び出し、本人に確認してから webly link を実行してください。ヘルパーが読み取れないファイルが上書きされることはありません。修復するか、削除してください。

ファイルを共有する(ウェブサイトではない場合)

ウェブサイトを公開するのではなく、ファイル(動画、PDF、データセット、写真)を送信または共有したい場合:

  1. ファイルが複数ある場合は、ファイルごとにリンクを1つにするか、フォルダーリンクを1つにするかを尋ねてください(すべてのファイルを一覧表示するページで、すべてダウンロードから.zip形式でダウンロードできます)。どちらを選んでも、どちらのリンクも取得できます。表示するものだけを選びます。
  2. アカウントがない場合:webly upload <file|folder>… [--folder name]。各ファイルのリンク、folderUrl、zipUrlが出力されます。--folderの名前にはランダムな接尾辞(demobowling-3f9a2c1b5e7d90a1c2b4)が付くため、リンクを推測できません。出力されたリンクを共有し、名前から作成したリンクは絶対に共有しないでください。フォルダーのサブフォルダーと隠しファイル(src/main.cpp、.gitignore)は保持されます。.DS_Storeのみ除外されます。ファイル数が500を超える場合は、1つのzipアーカイブとしてアップロードされ、フォルダーとして提供されます。実行するたびに固有のリンクを持つ新しいフォルダーが作成されるため、リンク数に制限はありません。制限は、1台のマシンあたり合計500 MiB(ウェブサイトも含む。statusにはlimitBytesのうちstorage.usedBytesが表示されます)、1ファイルあたり100 MiBです。このマシンにすでにウェブサイトがあるかどうかにかかわらず、ファイルを共有でき、ウェブサイトに影響することもありません。リンクは24時間有効で、その24時間以内に取得する必要があります(ウェブサイトとファイルを一緒に保持するサイトを保持)。取得されなければファイルは削除されます。その後に再共有すると、新たに24時間の有効期間が始まります。
  3. MCPにサインインしている場合:まずcreate_websiteをkind: "storage"で1回呼び出し、次に各ファイルの名前と正確なバイト数を指定してbegin_object_uploadを呼び出します。FILE=./path;を設定してから、返された各commandを実行し、その後finalize_object_uploadを呼び出してください(インラインのFILE=… commandは機能しません。シェルが先に$FILEを展開するためです)。フォルダー構造を保持するには、各ファイルにフォルダー内のパス(src/main.cpp)を名前として指定し、隠しファイル(.gitignore、.idea/…)も含めてください。フォルダーを平坦化したり、隠しファイルを除外したりしないでください。ファイル数が1000を超える場合は、最初の呼び出しで返されたfolderを指定して、begin_object_uploadをもう一度呼び出してください。Freeではファイルを最大7日間保持できます(1 GB、1ファイルあたり100 MB)。HobbyとProでは無期限に保持できます(50 / 200 GB、1ファイルあたり2 GB)。ツール呼び出しにファイルのバイトデータを含めないでください。

画像、動画、音声、PDF、プレーンテキストのみブラウザーで開き、それ以外はダウンロードされます。リンクの有効期限が切れる日時(expiresAt)を相手に伝えてください。

MCPで共有ファイルを管理する(ダッシュボードの「ファイル」ページでも同じ操作ができます):

  • list_objects は、ファイルとその folder、folderLabel を一覧表示します。
  • rename_object / label_folder は表示名のみを変更します。リンクは変わらないため、常に安全です。
  • move_object はファイルを別のフォルダーに移動します(フォルダーを指定しない場合は、ファイル単独のリンクが設定されます)。リンクが変わり、古いリンクは機能しなくなります。そのことを先に伝えてから、新しい url を共有してください。
  • delete_object / delete_folder は完全に削除します。必ず先に確認してください。
  • パスワード(Hobby および Pro)は、相手から希望があった場合のみ設定します。 set_folder_password(または begin_object_upload の password)は、フォルダーのリンク、そのファイル、サブフォルダー、ZIP ファイルを保護します。set_website_password は、下書きを含むサイト全体をすべてのアドレスで保護します。Webly にはハッシュのみが保存されるため、リンクと一緒に相手にパスワードを伝えてください。null を指定すると解除されます。402 plan_required が返された場合は、details.upgradeUrl を伝えてください。
  • email_link は、フォルダーまたはファイルのリンク(あるいはサイトの公開リンクまたは下書きリンク)を、任意のプレーンテキストメッセージとともに最大 10 人にメールで送信します(Hobby および Pro)。リンクは Webly が作成します。必ず先に宛先を相手に確認してください。保護されたリンクの場合、相手がメールにパスワードを含めることを希望した場合にのみ password を渡してください。
  • 大きなフォルダー(ファイル数が 500 を超える場合)は、1 つの ZIP ファイルをアーカイブとしてアップロードします。 フォルダーを ZIP に圧縮し(ZIP 内のパスがフォルダーのパスになります)、そのファイル 1 つだけを指定して begin_object_upload を archive: true で実行し、返された command を実行してから finalize_object_upload を呼び出してください。フォルダーリンク、サブフォルダーページ、すべてのファイルのリンク、すべてダウンロード は、通常のフォルダーと同様に機能します。展開せずに ZIP 内から提供されます(すべてダウンロード は ZIP ファイルそのものです)。list_objects では archive: { files } を持つ 1 項目として表示されます。list_archive_entries はファイルとそのリンクを一覧表示します。アーカイブフォルダーは読み取り専用です。ファイルを追加したり、ファイルを 1 つずつ名前変更、移動、削除したりすることはできません(削除する場合はフォルダーごと削除してください)。ZIP は暗号化せず、ストアまたは Deflate 方式で圧縮してください。
  • アップロードが中断された場合(接続が切れた、パーツのアップロードが繰り返し失敗するなど)、resume_object_upload は、すでにアップロードされた内容と、不足しているパーツのみの URL を返します。その URL を実行してから finalize_object_upload を呼び出してください。未完了のアップロードは、1 時間操作がないと消去されるため、1 時間以内に完了させてください。
  • list_uploads_in_progress は、未完了のアップロードとその進捗を表示します。clear_uploads_in_progress は未完了のアップロードをキャンセルし、進行中のアップロード容量枠(Free は 1 GB、Hobby は 5 GB、Pro は 10 GB)を解放します。必ず先に確認してください。
  • 同じファイルのアップロードを何度も開始することには制限があります(短時間に 5 回、その後は 1 時間に 5 回までです。429 upload_retries)。再度開始するのではなく、アップロードを再開してください。
  • get_billing は storage.used(サイトのアセットを含む、アップロード済みファイル)と storage.uploading を、それぞれの上限とともに表示します。ダッシュボードのバーと同様です。

サイトアセット(ウェブサイトで使用する写真やファイルで、ストレージ上のファイルではありません):url はサイト経由の /_webly/img/{assetId} で提供されます。ページではこのパスを使用してください。delete_asset はアーカイブします(リンクは引き続き機能し、ストレージ容量にも計上されます)。delete_asset に permanent: true を指定すると完全に削除され、容量が解放されます。まだそのアセットを使用しているページは動作しなくなるため、必ず先に確認してください。

相手に伝える内容

URL はそれだけを 1 行に記載し、後ろに何も付けないでください。クリックできる状態を保てます。 続けて、JSON に記載された期限を伝えてください。相手のタイムゾーンがわかる場合は、そのタイムゾーンで伝えてください。

サイトが公開されました:

https://anon-….webly.site/

24 時間オンラインのままです({liveUntil} まで)。それまでなら、引き続き変更できます。サイトをずっと残すには、{claimUntil} までに Webly にサインインしてサイトを取得してください。それ以降は削除されます。今、設定しておきましょうか?

サイトを取得するよう勧めるのは、サイトごとに 1 回だけにしてください。編集のたびに勧めてはいけません。トークンや ~/.webly/ の内容は絶対に表示しないでください。

エラー(details.reason)
理由意味対処
site_already_createdこのトークンにはすでにサイトがありますwebly deploy で更新します。新しい URL を使う場合にのみ replace を使用してください
edit_window_closed (410)24 時間が経過しました。オフラインですが、引き続き取得できますサイトを保持
build_failed (400)差し替え後の新しいサイトをビルドできませんでした。古いサイトには影響していませんファイルを修正して、再試行してください
network_limit (409)このネットワーク上に匿名の公開中サイトが 50 個ありますdetails.retryAfterSeconds の時間だけ待つか、サインインしてください
credential_consumed / credential_expiredトークンは無効です(取得済み、または 7 日を過ぎています)ヘルパーによってすでに削除されています。次のデプロイは新規に開始されます
invite_only (503)匿名での公開は無効になっています代わりにサインインしてください
HTTP 429レート制限に達していますRetry-After の時間だけ待ってください
anonymous_storage_limit (413)500 MiB(ウェブサイトとファイルの合計)を使い切りましたサイトを取得(サイトを保持)して、無料アカウントの 1 GB を利用してください
HTTP 413サイズ制限を超えていますファイルを減らすか、サインインしてください

サイトを保持:サインインして取得する

サイトを保持したい場合、アカウントを作成するかサインインする場合、または next.actions が ["claim"] のみの場合に実行します。ブラウザーのページが開き、 Google でサインインしてアクセスを承認すると、サイトが自身のワークスペースに 移動することを伝えてください。

  1. このホストにMCPサーバーを登録します。新しいセッションやほかのフォルダーでも使えるよう、ユーザースコープで登録します。
    • Claude Code:webly connect claude(Webly プラグインをインストールします。できない場合は claude mcp add --scope user にフォールバックします)。
    • Codex:webly connect codex。
    • ほかのホスト:https://webly.ai/agent.md の Phase 2 に従います。
    • ここにブラウザーがない場合(スマートフォンや Muse などのホスト型アシスタント):アプリに独自のコネクター画面があれば、そこで https://api.webly.ai/v1/mcp を追加してサインインするよう、ユーザーに案内します。API キーしか受け付けない場合は、ユーザーにダッシュボードで Connect agent を開き、そのプロンプトを貼り付けてもらいます。あなたはユーザーに /connect/<code> リンクを開いてもらい、回答に含まれるキーを一度だけ受け取ります。そのキーを安全な認証情報に保存し、チャットには決して残さないでください(agent.md、Phase 3b)。期限切れの場合は、ユーザーに返された更新リンクを渡します。ブラウザーなしで申請するには、ユーザーがスマートフォンで開けるように webly claim-link(--open は付けません)を表示します。キーでは申請できません。 connect は pending: claim も記録するため、最初にツールを読み込んだセッションで申請が完了します。次に行うことは next フィールドに記載されています。
  2. MCP がすでに呼び出せる場合はMCPを使い、それ以外の場合は今すぐブラウザーで申請します。 このセッションで Webly の create_claim_code ツールを呼び出せるか確認します(遅延ツールを検索してください)。呼び出せる場合は、手順 4 に進みます。呼び出せない場合(初回の connect 直後は通常こちらです)、ユーザーに再読み込みや再起動を求めてはいけません。すぐに webly claim-link --open を実行します。トークンを URL フラグメントに含めた状態で app.webly.ai/claim を開きます(サーバーに送信されず、表示もされません)。ユーザーにサインインして Claim website をクリックしてもらいます。ページに誤った Google アカウントが表示された場合は、Not you? Use a different account で切り替えられます。 ページを開いたりサインインしたりするだけでは、サイトは申請されません。API キーでは申請できません。ツールが見つからないからといって再試行したり、ユーザーのMCP設定を置き換えたりしないでください。
  3. ブラウザーでの申請を確認します。 ユーザーが完了したと伝えたら、webly doctor を実行します。申請が完了したことを確認できるのは siteError.reason: credential_consumed の場合だけです(doctor は使用済みトークンを削除し、pending をクリアします)。未申請のままの場合、ブラウザーが閉じられた場合、またはステータスを確認できない場合は、再試行できるようトークンと pending の手順を保持します。ブラウザーを開いたというだけで forget を実行してはいけません。次のセッションではMCPが自動的に読み込まれます(Codex の場合は最初に codex mcp login webly を実行します)。ここで終了します。手順 4〜5 はMCP経由の手順です。
  4. ツールが読み込まれたら:
    • Claude Code:サーバーの authenticate ツールを呼び出します(mcp__plugin_webly_webly__authenticate または mcp__webly__authenticate。遅延ツールの場合はツール検索で読み込みます)。認証 URL が返されます。ユーザーのためにその URL を開き(macOS では open "<url>"、Linux では xdg-open、Windows では start)、フォールバックとして URL も表示します。コールバックは自動的に完了します。
    • ほかのホスト:whoami を呼び出します。401 により、そのホスト独自のサインインが開始されます。
    • まず、ユーザーに作業可能な範囲を選んでもらいます。All my workspaces(デフォルト。1つのワークスペースだけに制限したい場合を除き、そのままにするよう伝えてください)または単一のワークスペースです。どちらを選んでも、各ワークスペースではユーザーのロールで許可された範囲にのみアクセスできます。
    • 同意画面では webly:content、webly:edit、webly:admin が提示され、デフォルトでは webly:admin が選択されています。サイトの作成に必要です。既存サイトの編集だけを希望する場合(webly:edit)を除き、そのままにするよう伝えてください。
  5. 申請: create_claim_code を呼び出してから、webly claim <code> を実行します。ヘルパーがコードと保存済みトークンを Webly 自体に送信するため、あなたがトークンを読むことはなく、成功するとトークンと pending の手順が削除されます。移動したサイトをユーザーに伝え、表示された dashboardUrl を渡します。同じユーザーによる再試行は安全です(alreadyClaimed: true)。コードの有効期間は10分です。期限切れの場合は新しいコードを取得します(claim_code_invalid)。 クレーム後:課金がオフの場合、または有料プランで空き枠がある場合、サイトは永続します。課金がオンの Free プランでは、サイトは保留状態になります。元の24時間の期限までは編集できますが、その後はアップグレードするまでオフラインになります(402 claim_held)。レスポンスに表示される状態(website.claimHeld)を伝え、永続すると約束しないでください。

MCP 経由での作業(サインイン済み)

まず whoami と list_websites を呼び出し、2つ目のサイトを作成するのではなく、既存のサイト(doctor にリンクが表示される場合は、そのフォルダーにリンクされているサイト)を引き続き使用してください。ディスク上のプロジェクトに対して create_website を実行した後、後続のセッションでそのサイトが見つかるように、プロジェクトフォルダーで webly link <websiteId> を実行してください。

ワークスペース。 whoami → workspaces: "all" は、この接続から、所属するすべてのワークスペースで作業できることを意味します。list_workspaces には、それぞれのワークスペースとそこでのロールが表示されます。サイト ID はどのワークスペースでも使えるため、サイト用ツールには追加の指定は不要です。ワークスペース全体に作用するツール(create_website、list_websites、get_billing など)には、workspace としてそのスラッグを指定します。複数ある場合は、サイトを作成する前にどれを使うか尋ねてください。400 workspace_required が返された場合も確認してください。推測してはいけません。workspaces: "one" は、接続できるワークスペースが1つに限られることを意味します。別のワークスペースが必要な場合(list_workspaces に canUse: false と表示される場合)は、再接続してください。Claude Code では /mcp → webly → 再認証の順に操作し、「すべてのワークスペース」を選択します。オーナーがチームワークスペースの写真を求めた場合、set_workspace_photo には公開画像の url またはファイルの base64 を指定できます(PNG、JPEG、WebP、GIF、2 MB)。remove_workspace_photo で削除できます。個人用ワークスペースには本人のプロフィール写真が表示されます。これはダッシュボードで変更できます。

MCP を使わない REST(スクリプト、MCP 非対応のホスト):webly login を実行するとブラウザーが開き、同じサインインとワークスペースの選択を行えます。その後、webly api GET /websites --workspace <slug>(または任意の /v1 パス。JSON ボディには --data を指定)を実行すると、本人として API を呼び出せます。トークンはヘルパー内に保持されます。トークンを尋ねたり、表示したりしないでください。webly logout でトークンを無効化できます。

  1. フレームワークサイト(デフォルトの型付き React):put_source_file / str_replace(リースは不要)。静的サイト:小規模なテキスト編集には search_source と { path, edits } を指定した str_replace を使用します。少数の小さなファイル全体に限り、 expectedHeadVersion に read_source_files が返したバージョンを設定して deploy_files を使用します(設定しない場合は 400 base_required)。誰かがその後に書き込んでいた場合、 変更は相手の変更にマージされます(応答の merged)。409 merge_conflict は、双方が同じ行を 変更したことを意味します。変更した人(theirsBy)に伝え、読み直し、再適用して再送信します。 force は相手から依頼された場合に限り使用します。ディスク上のフォルダー(ビルドの dist/、 バンドルや画像を含むもの)をデプロイする場合は、サイトの ID を指定して begin_deploy を呼び出し、 すぐに webly deploy <folder> --ticket <ticket> --message "<what changed>" を実行します (チケットの有効期間は 5 分で、デプロイ 1 回に限り有効です。相手にチケットを決して伝えないでください)。 メッセージは変更内容を示す 1 行にします(「ボタンの表示を『ここから開始』に変更」など)。サイトの 履歴に表示されるため、サイトを共有する人があなたのバージョンを他の人のものと区別できます。 ヘルパーは必要に応じてプロジェクトをビルドし、アップロードします(ファイル数は最大 2000 件。 1 MiB を超える画像と動画は直接ストレージに送られ、1 ファイルあたりの上限はプランによって異なります)。 フォルダーをリンクし、ドラフト URL を出力します。バンドルのバイトデータをツール呼び出しに含めたり、 API キーをシェルコマンドに含めたりしないでください。would_revert で停止した場合、 デプロイによって、このフォルダーが最後にデプロイされて以降にサイトへ加えられた変更が取り消されます (対象パスが一覧表示されます)。read_source_files でそれらを読み込み、ローカルプロジェクトにマージして 再ビルドし、新しいチケットで再デプロイします。または、取り消される内容を相手に伝え、相手の了承を得た場合に限り、 新しいチケットを使って --force 付きでデプロイします。would_remove で停止した場合、 フォルダーにないファイルがサイトに存在します(一覧表示されます)。それらをフォルダーに追加するか、 相手の了承を得た場合に限り --force 付きでデプロイします。サイトの Git ミラーのクローン (get_git_access)も同じ方法でデプロイできます。ヘルパーは .webly/media.json に記載された画像を保持し、 Git の履歴を基準にします。クローンが古いと表示された場合は、最初に git pull を実行します。 結果に replaced が含まれている場合は、別の場所でサイトが変更されていたことと、以前のバージョンが 保持されていることを相手に伝えます。書き込みのたびに新しいドラフトバージョンが作成されます。 公開中のサイトは変更されません。書き込みは Prettier でフォーマットされるため、 str_replace のテキストは read_source_file からコピーしてください。
  2. check_head は品質ゲート(lint、型チェック、バンドル、レンダリング)を実行します。すべての 診断を修正してください。
  3. 相手にドラフト URL(https://draft--{subdomain}.webly.site。公開されず、インデックスにも登録されません)を 示してください。
  4. publish_website は、相手がそのサイトとバージョンを明示して承認した後に限り実行してください。 実行中のビルドが完了するまで待機します。status: "building" を伴う 202 は、Webly がまだビルド中であることを 意味します(失敗ではありません)。約 15 秒後に同じバージョンを再度公開し、まだビルド中であることを 相手に伝えてください。公開中のサイトに問題がある場合は rollback_website / unpublish_website を 使用します。 新しいサイトには短い生成アドレス(zen-wreath-y76r.webly.site)が割り当てられます。ユーザーから特定のものを求められない限り、subdomain は指定しないでください(最大56文字。使用済みの場合は別の候補ではなく 409 が返されます)。Free では各サイトの webly.site アドレスを一度だけ変更できます(rename_subdomain。Hobby と Pro では回数無制限です)。そのため、まず check_subdomain を実行し、ユーザーが指定した名前と完全に一致するものにのみ変更してください。 Hobby と Pro では、ワークスペースにネームスペースもあり、公開済みの各サイトは urls.vanity で応答します(https://fall-out-boy.kev.webly.site。サイト名をもとにしたラベルで、ネームスペース内でのみ一意です)。urls.primary を共有してください。これはプライマリアドレスです(有効なカスタムドメインがある場合はそのドメイン、ない場合はバニティアドレス、それもない場合はフラットアドレスです。ただし、所有者が webly.site アドレスをプライマリに選んでいる場合を除きます)。urls.all には、サイトが応答するすべてのアドレスが表示されます。rename_vanity はサイトのラベルを変更します。ネームスペースの操作には get_namespace / check_namespace / rename_namespace を使用します。変更回数には上限があります(Hobby は生涯で5回、Pro は10回)。そのため、ユーザーが指定した名前と完全に一致するものにのみ変更し、以前のバニティアドレスは使えなくなることを伝えてください。新しいアドレスで HTTPS が使えるようになるまで約1分かかります。certificate が active になるまで get_namespace で確認してから、利用可能になったことを伝えてください。402 の場合は、details.upgradeUrl を案内してください。

チームのワークスペースには所有者が1人います(whoami → owner)。ワークスペース自体の所有権(ウェブサイトの移動ではありません)は、所有者がダッシュボードの「People」ページでのみ変更できます。こちらでは変更できないため、そこへ案内してください。カードとサブスクリプションはワークスペースに紐づいたままです。

ブログ投稿や繰り返し掲載するコンテンツ(商品、チーム、FAQ)を含む新しいコンテンツは、サイトのソースファイルに追加します。コレクションやブログ投稿は作成しないでください。CMS は非推奨です。すでにコレクションや管理対象ブログを読み込んでいるサイトでは、所有者から移行の依頼があるまで、そのコンテンツには引き続きそれらのツールを使用します。フォームは formAction('name') を使って送信し、mailto: は使用しないでください。また、カード番号、パスワード、ID 番号、健康に関する詳細情報は絶対に尋ねないでください(送信内容はプレーンテキストです)。所有者が送信ごとのメール通知を希望する場合は、set_form_notifications で有効にしてください(デフォルトでは無効です)。Hobby と Pro ではメールが送信されます。Free では選択内容が保存されるため、所有者に upgradeUrl を案内してください。通知への返信が訪問者に届くよう、メールフィールドの名前は email にしてください。各ワークスペースの月間送信上限は、Free で1,000件(Hobby は10,000件、Pro は100,000件)です。上限を超えた送信は保留されます。非表示になり、通知も送信されず、所有者がアップグレードしない限り月次リセット時に削除されます。list_forms に quota.held が表示された場合は、所有者に伝えて upgradeUrl を案内してください。 詳細は llms.txt をご覧ください。

403 の場合、権限が不足している機能は details.capability に示されます。付与されたアクセス権がタスクに必要な範囲より狭いため、どのアクセスレベルが必要かを伝えてください。401 / invalid_token の場合は、Webly ツールを再度呼び出してサインインを再実行してください。待機中の試行がある場合は、別の試行を開始しないでください。他のユーザーやエージェントが同じサイトを同時に編集することがあります。小規模な編集には str_replace を優先してください。put_source_file / delete_source_file には baseVersion(読み取り時に返された version)を指定してください。これにより、他の行に加えられた編集は変更内容とマージされます。409 merge_conflict は、双方が同じ行を変更したことを意味します。ファイルを再度読み込み、相手の変更を残したまま自分の変更を適用し、新しいバージョンで再送してください。wait_for_changes では、指定したバージョン以降に他の人が行った変更を確認できます。公開時には、ユーザーがプレビューした version を指定してください。履歴は直線状なので、最後の公開バージョンから指定したバージョンまでの変更はすべて公開されます(それより新しいバージョンは未公開のままです)。レスポンスの alsoPublishes には、他のユーザーやエージェントが作成した変更が一覧表示されます(誰が、どのアプリで、どのメッセージを残したか)。ユーザーには、その人が行った変更のうち何が公開されたかを伝えてください。古いバージョンを公開しても新しい変更は公開されず、alsoPublishes は空になります。 Git:get_git_access は、サインイン済みのサイトのソースと履歴(バージョンごとに1コミット)の読み取り専用クローンを提供します。トークンの有効期間は1分なので、WEBLY_GIT_TOKEN=<token> <clone> として、すぐに clone(またはクローン内で pull)を実行してください。URLにトークンを含めてはいけません。再度要求する前に、get_website で headVersion を確認してください。git push は絶対に行わず、書き込みにはツールを使用してください。

サイトの複製または移動

どちらのワークスペースでも、Hobby と Pro が対象です(それ以外は 402 plan_required となります。利用者に details.upgradeUrl を案内してください)。duplicate_website は、すべてのバージョン、メディア、CMS、フォーム送信内容、設定、パスワードを含め、サイトをそのまま複製します。元のサイトが公開済みなら複製先も公開され、複製先には独自のアドレスが割り当てられます。カスタムドメインは元のサイトに残ります。move_website は、利用者が管理者である別のワークスペースにサイトを即座に移動します。すべてが移動され、移動先では新しい webly.site アドレスが割り当てられ、古いアドレスは使えなくなります。そのため、事前に確認して、新しい urls.primary を共有してください。list_move_destinations は、利用者が管理者であるワークスペースと、サイトが移動可能かどうかを表示します(reason:site_limit、storage_limit、plan_required)。どのワークスペースにするか尋ねてください。別のワークスペースにアクセスするには、どちらの操作もサインイン済みの利用者(OAuth)が必要です。別の人のワークスペースに移動する場合は、start_website_transfer が返すコードを、その人の管理者が accept_website_transfer で引き換えます。

カスタムドメイン

Hobby(5ドメイン)または Pro(25ドメイン)で、サインイン済みのアカウント(MCP)が必要です。Free では add_domain が 402 domain_limit となるため、所有者に details.upgradeUrl を案内してください。「example.com を自分のサイトに接続して」:

  1. list_websites でサイトを選択します。ホスト名から推測しないでください。
  2. ルートドメインの場合は、まず確認してください。
    • www.example.com(推奨)。 すべての DNS プロバイダーで利用できます。 その後、利用者がレジストラで example.com をここに転送します。 この設定は無料で、1 分ほどで完了します。
    • example.com を直接使用。 DNS プロバイダーがルートでの CNAME フラットニングまたは ALIAS に対応している場合に限ります(Cloudflare、Namecheap、Porkbun など)。 shop.example.com のようなサブドメインなら、そのまま追加してください。
  3. add_domain を呼び出し、続けて connect_domain を呼び出します。url が返された場合は、まずそのリンクを利用者に伝えてください。リンクを開くと、DNS プロバイダー(すべてのホスト名では Cloudflare、対応後は www について GoDaddy など)にサインインして承認でき、レコードが自動で設定されます。利用者は Webly を使っているブラウザーでリンクを開きます。Cloudflare(method: "oauth")では、Cloudflare の画面でリダイレクトを許可し、まだその場所で何も配信されていない場合、www ドメインのルートドメインも Webly が転送します(確認後も apexForward が ok でなければ、利用者に伝えてください)。既存のレコードが妨げになっている場合、サインイン後に表示される具体的な変更内容を承認するまで、何も置き換えられません。承認するとホスト名がすぐに切り替わるため、現在稼働中のサイトでは、ダウンタイムなしで移行できるよう手動でのレコード設定(TXT を先に)を案内してください。remove_domain を呼び出し、応答に dnsCleanup が含まれている場合は、Webly が追加したレコードも削除するか確認してください。削除する場合は、dnsCleanup.url を伝えてください。 それ以外の場合、または代替手段として、必要な dns.records を返されたとおりに正確に、Type/Name/Value の表で伝えてください。www ドメインの場合は、apexForward の転送ルールも伝えてください。プロバイダーごとのヒント:
    • 表示された Name(www またはルートの @)だけを入力してください。GoDaddy と Namecheap はドメイン名を自動で追加します。
    • Cloudflare では、レコードを「DNS only」(灰色の雲)に設定してください。
    • 他の場所ですでに稼働しているドメインを移行しますか? 現在のレコードはそのまま残し、任意の TXT レコードだけを追加してください。その後:
      1. ドメインが active になるまで verify_domain をポーリングします。これは所有権が確認され、証明書がデプロイされたことを意味します。ステップ 2 だけでは不十分です。古いホストがまだ応答するため、domain-watch ではまだ確認できません。
      2. CNAME を切り替えるよう利用者に伝えます。
      3. webly domain-watch <hostname> を実行し、トラフィックが Webly に到達することを確認します。
  4. すぐにバックグラウンドで監視を開始します。利用者が完了したと言うまで待たないでください。 webly domain-watch <hostname> をバックグラウンドタスクとして実行します。DNS、HTTPS、ライブ状態がそれぞれ完了するたびに表示し、ドメインが稼働すると終了します。シェルが使えない場合は、next.checkAgainSeconds ごとに verify_domain を呼び出してください。すべてのドメイン応答には、ステップ(1 DNS レコード、2 HTTPS 証明書、3 稼働)と次に行うことを示す next が含まれています。各ステップが完了したら、利用者に伝えてください。
  5. 稼働したら、https://<hostname> が読み込まれることを確認します。サイトで最初に稼働したドメインは、それまでにプライマリアドレスが選択されていない限り(別のドメイン、または set_primary_address で選択した webly.site アドレス)、自動的にプライマリアドレス(isPrimary)になります。それ以外のアドレスはすべてプライマリアドレスにリダイレクトされます。すでに別のドメインがプライマリの場合は、切り替えに set_primary_domain を案内してください。webly.site アドレスをプライマリにしたい場合は set_primary_address を案内してください(カスタムドメインはそのアドレスにリダイレクトされることも伝えてください)。状態が failed の場合は、failureMessage を伝えてレコードを修正してもらい、その後 verify_domain を再度呼び出してください。ドメインが active なのに、削除して再追加した直後にブラウザーでサーバーが「見つかりません」と表示される場合、DNS に一時的な不整合がキャッシュされています。ゾーンのネガティブキャッシュ時間が経過すると解消します(Cloudflare のデフォルトは 30 分)。利用者の端末に古い応答がキャッシュされている場合は、DNS キャッシュをフラッシュすると、それより早く解消することがあります(ルーターや ISP にキャッシュされている場合は除きます)。

ドメインを追加しても何も公開されず、何も停止しません。*.webly.site アドレスは引き続き使用できます。

ルール

  • トークンは所有権を証明する秘密情報です。表示、ログへの記録、コミット、または webly claim-link を介さない URL への設定は絶対にしないでください。
  • コマンドまたはツールが実際に返した URL、サイト、件数のみを伝えてください。
  • 手軽なリンクだけを求めている人には MCP を設定しないでください。サイトを保持または拡大したい場合に提案してください。
  • 1 台のマシンにつき、匿名サイトは 1 つまでです。2 つ目のサイトを保持したい場合は、まず 1 つ目のサイトをクレームしてから、MCP 経由で 2 つ目を作成し、webly link で紐付けてください。
  • フォルダーは、その .webly/project.json に記載されたサイトに属します。本人から依頼がない限り、別のサイトにデプロイしたり、別のサイトのものとしてクレームしたりしないでください。

コメント