AI エージェントのセルフサインアップ:1回の呼び出しで Shager のサンドボックスを開き、それでも公開ボタンは人が握る理由

エージェントは POST 1回で Shager のサンドボックスを開けます。呼び出し方、できること、人による引き継ぎ、公開権限の付与方法を解説します。

AI エージェントは、リクエスト1回で自ら Shager に登録できます。少なくとも agent_name を含む JSON ボディを付けて POST https://app.shager.ai/api/v1/agent/signup を送るだけです。返ってくるのは API キー、MCP の URL、引き継ぎ用のリンクで、エージェントはすぐにワークスペースの作成、メディアの取り込み、投稿の下書きを始められます。ただし、人が引き継ぎリンクを開いてログインし、そのキーに公開を許可するかどうかを決めるまで、予約や公開は一切行われません。

この分担こそが設計のすべてです。エージェントは人を待たずに作業を進められ、実際のオーディエンスに届く判断は人の手に残ります。

そもそも、なぜエージェント自身に登録させるのか

そうしないと、エージェントの作業の流れが途切れてしまうからです。「クライアントの SNS 配信をセットアップしておいて」と頼まれたエージェントも、入口が「人が登録フォームに入力し、メールを確認し、ダッシュボードでキーを作る」しかなければ、最初の一歩でつまずきます。誰かがそれを済ませる頃には、エージェントのコンテキストは失われています。

セルフサインアップなら、エージェントは下準備を自分で進められます。クライアントごとにワークスペースを作り、メディアを取り込み、投稿の下書きを書いて、確認の準備がすべて整った状態で人にリンクを1つ渡します。登録の手順はエージェント向けに /auth.md で公開しており、エージェント向けページには、作業を始める前にエージェントが読める発見用ファイルの一覧があります。

図:エージェントは1回の呼び出しで登録し、下書きだけが許可されたサンドボックスを受け取ります。人が引き継ぎリンクを開いて所有権を取得し、そのあと公開権限が別途付与されます。投稿ごとの承認はクライアント単位で任意です。
エージェントは下書きから始めます。人が所有権を取得し、キーへの公開権限を別途付与します。

登録の呼び出しはどうなるか

必須なのは agent_name(2〜80文字)だけです。ほかのフィールドは、引き継ぐ側の人が何を引き継ぐのかを見分けるのに役立ちます。

curl -s https://app.shager.ai/api/v1/agent/signup \
  -H "Content-Type: application/json" \
  -d '{
    "agent_name": "Northwind content agent",
    "contact_email": "ops@northwind-agency.example",
    "organization_name": "Northwind Agency",
    "purpose": "Draft weekly posts for 12 restaurant clients"
  }'

レスポンスは、すべて data に包まれて返ってきます。

{
  "data": {
    "api_key": "shgr_live_...",
    "organization_id": "...",
    "sandbox": true,
    "claim_url": "https://app.shager.ai/...",
    "expires_at": "2026-09-19T10:04:11.000Z",
    "mcp_url": "https://app.shager.ai/api/mcp",
    "api_base": "https://app.shager.ai/api/v1",
    "openapi_url": "https://app.shager.ai/api/v1/openapi.json",
    "limits": { "workspaces": 5, "requests_per_minute": 120, "publishing": "after a human claims the sandbox" },
    "next_steps": ["..."]
  }
}

すぐに処理すべきフィールドが2つあります。

  1. api_key は一度しか表示されません。何よりも先に、シークレットストアか環境変数に保存してください。ログには絶対に出さないでください。
  2. claim_url は人に渡します。contact_email を指定していれば Shager からもそのアドレスに引き継ぎリンクがメールで届きますが、エージェント自身も返答の中で必ずリンクを示すべきです。

登録はアドレスごとに1時間あたり5回までに制限されています。ループに陥ったエージェントが、持ち主のいないサンドボックスを何十個も作ってしまうのを防ぐためです。

引き継ぎ前のサンドボックスで何ができるか

引き継ぎ前にできること 人が引き継ぐまでできないこと
ワークスペースを5つまで作成 予約や公開
URL からメディアをアップロード クライアント向け接続リンクの作成
投稿の下書きを作成 クライアントへの承認依頼の送信
自分が作成したものの一覧表示と読み取り

ブロックされた呼び出しは、何も言わずに無視されるのではなく、明確なエラーで失敗します。予約しようとすると HTTP 403 と "code": "sandbox_unclaimed" が返り、create_connect_link と request_approval も同様です。6つ目のワークスペースを作ろうとすると 403 sandbox_limit が返ります。よくできたエージェントは、リトライせずに code を読み、何が必要かを人に伝えます。

接続リンクと承認依頼がブロックされているのは、どちらもエージェンシーの外にいる実在の人に届くからです。Facebook ページを接続するためにリンクをクリックするクライアントや、承認依頼のメールを受け取るレビュアーがそうです。誰も確認していないオーガニゼーションの名義で、そうしたことが起きるべきではありません。

サンドボックスでの最初のセッションの進め方

行儀のよいエージェントが最初の数分で行うことを、requests を使った Python で示します。

import os, requests

API = "https://app.shager.ai/api/v1"
H = {"Authorization": f"Bearer {os.environ['SHAGER_API_KEY']}"}

def call(method, path, **body):
    r = requests.request(method, f"{API}{path}", headers=H, json=body or None, timeout=60)
    payload = r.json()
    if not r.ok:
        err = payload["error"]
        raise RuntimeError(f"{r.status_code} {err['code']}: {err['message']}")
    return payload["data"]

me = call("GET", "/me")
print(me)  # organization, scopes, sandbox status

ws = call("POST", "/workspaces", name="Harbor Tacos", timezone="America/Chicago")

media = call("POST", f"/workspaces/{ws['id']}/media",
             url="https://harbortacos.example/press/fall-menu.jpg",
             file_name="fall-menu.jpg")

print("Workspace", ws["id"], "media", media["id"], media["kind"])

ワークスペースを作るときは、timezone を明示的に指定してください。値は IANA のタイムゾーン名で、のちの予約はそのタイムゾーンで解釈されます。シカゴのレストランが、ほかの誰かのデフォルト設定を引き継いでしまうのは避けるべきです。

この時点では、接続済みの SNS アカウントはまだありません。アカウントの接続には接続リンクが必要で、接続リンクには引き継ぎが必要だからです。エージェントはコンテンツと構成を準備し、その先への扉は人が開きます。

図:エージェントのキーには read、write、publish の3段階の権限があり、すべての操作が監査ログに記録されます。
エージェントには必要な権限だけを与え、すべての操作を確認できます。

人が引き継ぐと何が起きるか

人は claim_url を開いて Shager にログイン(またはアカウントを作成)し、エージェントが準備したワークスペース、メディア、下書きごとサンドボックスを引き継ぎます。引き継ぎの際には、エージェントのキーに予約と公開も許可するかどうかを選びます。許可すると publish スコープが追加されます。

この選択は少し考える価値があります。publish を付けないままでも、長期的に十分よい構成です。エージェントが下書きを作り、人やクライアントが承認して予約する、という形です。多くのエージェンシーはここから始め、あとから https://app.shager.ai/dashboard/agents で公開用のキーを別に追加します。この画面ではどのキーも取り消せ、エージェントの呼び出しはすべて監査ログに記録されます。それぞれの構成のトレードオフは、週次配信ルーティンで解説しています。

引き継ぎ後に API 自身が提案する次のステップは、シンプルです。まず create_connect_link を呼び、アカウントの持ち主が Shager にログインせずに SNS アカウント(Facebook、Instagram、YouTube、X、LinkedIn、TikTok)を接続できるようにします。そのあと create_post を呼び、キーに publish があれば schedule_post を呼びます。

誰も引き継がなかったら

引き継がれなかったサンドボックスは、7日後の expires_at に示された時刻に期限切れになります。下書きとワークスペースも一緒に消えます。長めのプロジェクトに取り組むエージェントは、その日付の前に人へ知らせるべきです。期限切れへの対処として、何度も登録し直すべきではありません。新しいサンドボックスに古い下書きは引き継がれません。

エージェントは引き継ぎをどう伝えるべきか

リンクと、それが意味することを率直に伝えます。たとえば次のような形です。

I set up a Shager sandbox for Northwind with 3 client workspaces and
9 draft posts. To connect the clients' accounts and publish, open this
link and sign in: <claim_url>
When you claim it you can choose whether I'm allowed to schedule posts
myself. If you don't claim it by Sep 19, the sandbox and drafts are deleted.

このメッセージは、何を済ませたのか、何が待っているのか、人が何を決められるのかを正直に伝えています。そして、いちばんクリックされやすいメッセージでもあります。

よくある質問

セルフサインアップに費用はかかりますか?

かかりません。サンドボックスは無料で、ローンチ期間中は引き継ぎ後も Shager を無料で使え、カードも不要です。課金を始める前には、事前にお知らせします。API と MCP のアクセスは、すべてのプランに含まれています。プランごとの上限は料金ページをご覧ください。

登録後、エージェントは REST の代わりに MCP を使えますか?

使えます。レスポンスには mcp_url が含まれており、同じキーを Authorization: Bearer shgr_live_... として MCP サーバーで使えます。ツールは、OpenAPI ドキュメントに記載された REST のオペレーションと1対1で対応しています。

引き継ぎ後のキーが、人の目を通さずに投稿を公開することはありますか?

あるのは、人が引き継ぎの際に publish を許可し、かつそのワークスペースでクライアント承認が必須になっていない場合だけです。どちらも人が選ぶことで、あとから変更もできます。キーはダッシュボードで取り消せ、承認はワークスペースごとに必須にできます。

次のステップ

サンドボックスが引き継がれ、アカウントが接続できたら、お試しから本番の実行へ進みましょう。エンドツーエンドのエージェント・コンテンツパイプラインが、ちょうどこの続きから、ブリーフから公開済みの投稿、アカウント別のクリック計測までを扱っています。

ご自身のアカウントでお試しください。

ローンチ期間中は無料、カード登録不要。接続して一度書くだけで、Shagerが公開して計測します。