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

_2026-09-12 · エージェントは 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](/auth.md) で公開しており、[エージェント向けページ](/en/agents)には、作業を始める前にエージェントが読める発見用ファイルの一覧があります。

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

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

```bash
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` に包まれて返ってきます。

```json
{
  "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 で示します。

```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 アカウントはまだありません。アカウントの接続には接続リンクが必要で、接続リンクには引き継ぎが必要だからです。エージェントはコンテンツと構成を準備し、その先への扉は人が開きます。

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

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

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

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

## 誰も引き継がなかったら

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

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

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

```text
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 のアクセスは、すべてのプランに含まれています。プランごとの上限は[料金ページ](/en/pricing)をご覧ください。

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

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

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

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

## 次のステップ

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

---
Source: https://shager.ai/ja/blog/agent-self-signup-and-claim
