AIエージェント向け
エージェントをワンステップで接続。ソーシャルチャネルの運用を任せる。
Markaestro はソフトウェアに操作されることを前提に作られています。Claude Code のような MCP クライアントはブラウザでサインインし、一つのブランドに紐づいたキーを受け取ります。それ以外のエージェントは設定から同じキーを取得します。どちらの場合も、エージェントは投稿できるアカウントを発見し、メディアをアップロードし、投稿の下書きと予約を行い、公開し、実際に配信された内容を報告できます。対象は Facebook、Instagram、TikTok、LinkedIn、Threads、Pinterest です。
インストールする SDK も、管理すべきプラットフォーム認証情報もありません。チームがダッシュボードで一度アカウントを接続すれば、以降エージェントは単一の Bearer トークン API と対話するだけです。
自律性のために設計され、目的に応じて制限されています
なぜAPIキーが統合のすべてなのか
エージェントにソーシャルメディアを扱わせる上で難しいのはHTTPそのものではありません。混乱したモデルが間違ったブランドに投稿したり、リトライで二重投稿したり、誰も確認していないものを公開してしまったりしないようにすることです。これらの保証は、プロンプトではなくAPIサーフェス自体に組み込まれています。
MCP クライアント
クライアントからサインイン。貼り付けるものは何もありません。
Claude Code、Claude、Cursor、ChatGPT、Grok、Grok Bot、OpenClaw、Hermes など Model Context Protocol を話すあらゆるクライアントは、認証情報を設定せずに Markaestro のホスト型 MCP サーバーへ接続できます。最初のツール呼び出しでブラウザが開きます。サインインし、エージェントが操作できるワークスペースとブランドを選び、権限を確認して「許可」をクリックしてください。クライアントはそのブランドに紐づいたキーを受け取り、自動で更新します。
これは PKCE と動的クライアント登録を備えた標準の OAuth 2.1 で、他のホスト型 MCP サーバーと同じ仕組みのため、Markaestro 専用のプラグインなしで動作します。サーバーは https://markaestro.com/api/public/v1/mcp にあり、公開 API の上に 31 のツールを公開しています。ブランドと配信先の発見、メディアのアップロード、下書きと予約投稿、ジョブ実行のポーリング付き公開、一括操作、Webhook、チャネルごとのルールです。
エージェントを接続
エージェントを選んでください。3 ステップで投稿できるようになります。
以下のクライアントはすべて同じホスト型 MCP サーバーに接続します。多くはブラウザでサインインします。最初のツール呼び出しで同意ページが開き、エージェントが操作できるワークスペースとブランドを選ぶと、クライアントはそのブランドに限定されたキーを受け取ります。ブラウザを開けないクライアントは、代わりにワークスペースの API キーを使います。同じサーバー、同じ権限、同じ一覧が設定に表示されます。
Claude Code
プラグインがスキルとホスト型サーバーをまとめてインストールします。設定も貼り付けも不要です。
始める前に
- メール確認済みのワークスペース所有者または管理者で、そのワークスペースに有効なプランと 1 つ以上のブランドがあること。
- Claude Code がインストールされ、Anthropic アカウントにサインインしていること。
サインイン
確認
- エージェントに list_products を呼ばせてください。許可した 1 つのブランドと、その接続済みチャネルが返るはずです。
- 接続は「設定、API」に「接続済みエージェント」バッジ、最終使用日時、リクエスト数とともに表示されます。いつでもそこから取り消せます。
サーバーを追加
- 任意のターミナルでプラグインの 2 つのコマンドを実行するか、3 つ目のコマンドでサーバーだけを追加します。
# The plugin bundles the skill and the hosted server.
claude plugin marketplace add D3vBaba/Markaestro
claude plugin install markaestro@markaestro
# Or add just the server. No key, no header: the first call opens the browser.
claude mcp add --transport http markaestro https://markaestro.com/api/public/v1/mcpClaude
claude.ai と Claude Desktop はサーバー URL をカスタムコネクタとして受け取り、同じ同意ページでサインインします。
始める前に
- メール確認済みのワークスペース所有者または管理者で、そのワークスペースに有効なプランと 1 つ以上のブランドがあること。
- カスタムコネクタは Claude の有料プランで利用できます。Team と Enterprise では所有者による有効化が必要な場合があります。
サインイン
- Markaestro の横の「接続」をクリックします。同意ページが新しいタブで開きます。
- ワークスペースとブランドを選び、権限を確認して「許可」をクリックします。タブが閉じ、コネクタが接続済みになります。
- チャットでエージェントに使わせたいときは、ツールメニューから Markaestro を有効にします。
確認
- エージェントに list_products を呼ばせてください。許可した 1 つのブランドと、その接続済みチャネルが返るはずです。
- 接続は「設定、API」に「接続済みエージェント」バッジ、最終使用日時、リクエスト数とともに表示されます。いつでもそこから取り消せます。
サーバーを追加
- 設定、コネクタ、「カスタムコネクタを追加」を開きます。
- 下のサーバー URL を貼り付け、OAuth クライアントの欄は空のままにして「追加」をクリックします。
https://markaestro.com/api/public/v1/mcpCursor
ワンクリックで Cursor にサーバーが追加されます。最初のツール呼び出しでブラウザのサインインが開き、Cursor はトークンを OS のキーチェーンに保存します。
始める前に
- メール確認済みのワークスペース所有者または管理者で、そのワークスペースに有効なプランと 1 つ以上のブランドがあること。
- MCP が有効な Cursor。リモート MCP サーバーはすべての Cursor プランで使えます。
サインイン
確認
- エージェントに list_products を呼ばせてください。許可した 1 つのブランドと、その接続済みチャネルが返るはずです。
- 接続は「設定、API」に「接続済みエージェント」バッジ、最終使用日時、リクエスト数とともに表示されます。いつでもそこから取り消せます。
サーバーを追加
- 「Cursor に追加」をクリックし、Cursor 側のインストール確認を承認します。
- または、JSON をプロジェクトの .cursor/mcp.json(git でチームと共有)か ~/.cursor/mcp.json(自分だけ)に貼り付けます。
// .cursor/mcp.json (project) or ~/.cursor/mcp.json (global)
{
"mcpServers": {
"markaestro": {
"url": "https://markaestro.com/api/public/v1/mcp"
}
}
}共有ビルドマシンや CI では、ヘッダーにワークスペースの API キーを入れることでサインインを置き換えられます。
// Without a browser: pass a workspace API key instead.
{
"mcpServers": {
"markaestro": {
"url": "https://markaestro.com/api/public/v1/mcp",
"headers": { "Authorization": "Bearer mk_live_..." }
}
}
}ChatGPT
ChatGPT は開発者モードのカスタムアプリとして Markaestro に接続し、同意ページでサインインします。
始める前に
- メール確認済みのワークスペース所有者または管理者で、そのワークスペースに有効なプランと 1 つ以上のブランドがあること。
- 開発者モードには ChatGPT Pro、Business、Enterprise、Edu のいずれかが必要です。Pro は読み取りツールのみ、Business、Enterprise、Edu はすべてのツールを利用できます。
- Business、Enterprise、Edu では、管理者がワークスペースでカスタムアプリを許可する必要がある場合があります。
サインイン
- ChatGPT がツールをスキャンする間に同意ページが開きます。ワークスペースとブランドを選んで「許可」をクリックし、続けて「作成」をクリックします。
- チャットでプラスボタン、「その他」、Markaestro の順にクリックするとツールが使えるようになります。
- ChatGPT は接続ごとに一度 Markaestro に自身を登録します。再接続すると別途取り消せる新しい接続が作られます。
確認
- エージェントに list_products を呼ばせてください。許可した 1 つのブランドと、その接続済みチャネルが返るはずです。
- 接続は「設定、API」に「接続済みエージェント」バッジ、最終使用日時、リクエスト数とともに表示されます。いつでもそこから取り消せます。
サーバーを追加
- 設定、アプリとコネクタ、詳細設定を開き、開発者モードをオンにします。
- アプリとコネクタに戻って「作成」をクリックします。名前を Markaestro にし、サーバー URL を貼り付け、認証に OAuth を選んで「ツールをスキャン」をクリックします。
https://markaestro.com/api/public/v1/mcpGrok
Grok は 3 つの方法で Markaestro に接続します。grok.com のカスタムコネクタ、Grok Build ターミナル、そして xAI API のリモート MCP ツールです。
始める前に
- メール確認済みのワークスペース所有者または管理者で、そのワークスペースに有効なプランと 1 つ以上のブランドがあること。
- grok.com のコネクタは個人プランで使えます。Grok Business と Enterprise では、チーム管理者がコネクタをプロビジョニングする必要があります。
- xAI API の経路はサーバー側で動くため、常にワークスペースの API キーを使います。
サインイン
確認
- エージェントに list_products を呼ばせてください。許可した 1 つのブランドと、その接続済みチャネルが返るはずです。
- 接続は「設定、API」に「接続済みエージェント」バッジ、最終使用日時、リクエスト数とともに表示されます。いつでもそこから取り消せます。
サーバーを追加
- grok.com: grok.com/connectors を開き、New Connector、Custom の順に選び、サーバー URL を貼り付けます。ダイアログでクライアント ID を求められたら下の値を使います。
- Grok Build: ターミナルで 2 つのコマンドを実行します。Grok Build は Claude Code の .mcp.json や Cursor の mcp.json にある Markaestro の設定も読み込みます。
- xAI API: Responses API リクエストの tools 配列にツールブロックを追加します。
grok.com のカスタムコネクタ
Server URL: https://markaestro.com/api/public/v1/mcp
grok.com's Custom Connector asks only for a name and this URL. It registers
itself and opens the browser sign-in, no client id or secret to enter.
(If a future dialog does ask, use client id markaestro-grok-web with a blank secret.)Grok Build ターミナル
# Grok Build (terminal). The first tool call opens the browser.
grok mcp add --transport http markaestro https://markaestro.com/api/public/v1/mcp
grok mcp doctor markaestro
# Headless: pass a workspace API key instead.
grok mcp add --transport http markaestro https://markaestro.com/api/public/v1/mcp \
--header "Authorization: Bearer ${MARKAESTRO_API_KEY}"xAI Responses API のツールブロック
// xAI Responses API: one entry in the request's "tools" array.
// Server-side, so it always uses a workspace API key.
{
"type": "mcp",
"server_url": "https://markaestro.com/api/public/v1/mcp",
"server_label": "markaestro",
"authorization": "Bearer mk_live_...",
"allowed_tools": ["list_products", "list_destinations", "upload_media",
"create_post", "publish_post", "get_job_run"]
}Grok Bot
Grok Bot はクラウド上のコンピューターで動作し、静的なキーでカスタム MCP サーバーを受け付けます。ベータ版ではカスタムサーバー向けのブラウザサインインはまだありません。
始める前に
- メール確認済みのワークスペース所有者または管理者で、そのワークスペースに有効なプランと 1 つ以上のブランドがあること。
- Grok Bot は SuperGrok プランと Cursor Pro で早期ベータ提供中です。Enterprise は順番待ちです。
- エージェント用スコープを持つワークスペースの API キーがあること。下のボタンから作成できます。
API キーを使う
確認
- エージェントに list_products を呼ばせてください。許可した 1 つのブランドと、その接続済みチャネルが返るはずです。
- 接続は「設定、API」に「接続済みエージェント」バッジ、最終使用日時、リクエスト数とともに表示されます。いつでもそこから取り消せます。
サーバーを追加
- Bot のコネクタ設定を開き、カスタム MCP サーバーを追加します。
- サーバー URL を貼り付け、下の値を使ってキーをヘッダーとして追加します。
コネクタダイアログ用のヘッダー値
Server URL: https://markaestro.com/api/public/v1/mcp
Header name: Authorization (or x-api-key if that is the only field)
Header value: Bearer mk_live_... (with x-api-key: just mk_live_...)OpenClaw
OpenClaw は CLI からリモート MCP サーバーを追加し、ループバックポートでサインインを完了するため、ゲートウェイを動かしているマシンで動作します。
始める前に
- メール確認済みのワークスペース所有者または管理者で、そのワークスペースに有効なプランと 1 つ以上のブランドがあること。
- OpenClaw がインストールされ、ゲートウェイが起動していること。
- ブラウザのないサーバーでは --code フォールバックでサインインを完了できます。
サインイン
確認
- エージェントに list_products を呼ばせてください。許可した 1 つのブランドと、その接続済みチャネルが返るはずです。
- 接続は「設定、API」に「接続済みエージェント」バッジ、最終使用日時、リクエスト数とともに表示されます。いつでもそこから取り消せます。
サーバーを追加
- 3 つのコマンドを実行するか、~/.openclaw/openclaw.json にサーバーブロックを追加します。
- Markaestro スキルが ClawHub に公開されたら、openclaw skills install markaestro でエージェント向けの手順も追加できます。
openclaw mcp add markaestro \
--url https://markaestro.com/api/public/v1/mcp \
--transport streamable-http \
--auth oauth
openclaw mcp login markaestro # prints the sign-in URL; add --code <code> when headless
openclaw mcp reload同等の設定エントリ
// ~/.openclaw/openclaw.json
{
"mcp": {
"servers": {
"markaestro": {
"url": "https://markaestro.com/api/public/v1/mcp",
"transport": "streamable-http",
"auth": "oauth"
}
}
}
}ブラウザなしの場合
# Without a browser: a workspace API key from the environment.
openclaw mcp add markaestro \
--url https://markaestro.com/api/public/v1/mcp \
--transport streamable-http \
--header "Authorization: Bearer ${MARKAESTRO_API_KEY}"Hermes
Hermes Agent は config.yaml から HTTP MCP サーバーを登録し、自身でサインインを行ってトークンを ~/.hermes/mcp-tokens に保存します。
始める前に
- メール確認済みのワークスペース所有者または管理者で、そのワークスペースに有効なプランと 1 つ以上のブランドがあること。
- Hermes Agent がインストールされていること。シークレットは ~/.hermes/.env に置き、設定では ${VAR} として参照します。
サインイン
確認
- エージェントに list_products を呼ばせてください。許可した 1 つのブランドと、その接続済みチャネルが返るはずです。
- 接続は「設定、API」に「接続済みエージェント」バッジ、最終使用日時、リクエスト数とともに表示されます。いつでもそこから取り消せます。
サーバーを追加
- ~/.hermes/config.yaml に mcp_servers ブロックを追加します。
- 実行中のセッションで /reload-mcp を送ります。ツールは mcp_markaestro_<tool> として表示されます。
# ~/.hermes/config.yaml
mcp_servers:
markaestro:
url: "https://markaestro.com/api/public/v1/mcp"
auth: oauthブラウザなしの場合
# Without a browser: a workspace API key, kept in ~/.hermes/.env
mcp_servers:
markaestro:
url: "https://markaestro.com/api/public/v1/mcp"
headers:
Authorization: "Bearer ${MARKAESTRO_API_KEY}"その他の MCP クライアント
Streamable HTTP と、動的クライアント登録を含む OAuth 2.1 に対応したクライアントなら、サーバー URL だけで接続できます。
始める前に
- メール確認済みのワークスペース所有者または管理者で、そのワークスペースに有効なプランと 1 つ以上のブランドがあること。
- クライアントが Streamable HTTP のリモート MCP サーバーに対応し、OAuth のためにブラウザを開けること。開けない場合は「API キー」タブを使います。
サインイン
確認
- エージェントに list_products を呼ばせてください。許可した 1 つのブランドと、その接続済みチャネルが返るはずです。
- 接続は「設定、API」に「接続済みエージェント」バッジ、最終使用日時、リクエスト数とともに表示されます。いつでもそこから取り消せます。
サーバーを追加
- クライアントの MCP 設定にサーバー URL を追加します。下の JSON は一般的な mcpServers の形式です。
- クライアント ID やシークレットは設定しないでください。クライアントは初回利用時に自身を登録します。
{
"mcpServers": {
"markaestro": {
"type": "http",
"url": "https://markaestro.com/api/public/v1/mcp"
}
}
}API キー
CI ジョブ、cron ワーカー、ブラウザを開けないクライアント向け。Authorization ヘッダーのワークスペース API キーで、同じサーバーに同じ権限で到達します。
始める前に
- メール確認済みのワークスペース所有者または管理者で、そのワークスペースに有効なプランと 1 つ以上のブランドがあること。
- キーを作成できること。メール確認済みのワークスペース所有者または管理者。
API キーを使う
確認
- エージェントに list_products を呼ばせてください。許可した 1 つのブランドと、その接続済みチャネルが返るはずです。
- 接続は「設定、API」に「接続済みエージェント」バッジ、最終使用日時、リクエスト数とともに表示されます。いつでもそこから取り消せます。
サーバーを追加
- 1 つのブランドに限定し、エージェントに必要なスコープだけと有効期限を付けたキーを作成します。
- ホスト型サーバーには bearer ヘッダーとして、ローカルの stdio サーバーには MARKAESTRO_API_KEY として渡します。stdio サーバーはディスク上のファイルもアップロードできます。
# CI, cron, or any client without a browser: pass a key instead.
claude mcp add --transport http markaestro https://markaestro.com/api/public/v1/mcp \
--header "Authorization: Bearer mk_live_..."
# Local stdio server (can also upload files from disk)
claude mcp add markaestro -e MARKAESTRO_API_KEY=mk_live_... -- npx -y @markaestro/mcp{
"mcpServers": {
"markaestro": {
"type": "http",
"url": "https://markaestro.com/api/public/v1/mcp",
"headers": { "Authorization": "Bearer mk_live_..." }
}
}
}クライアント接続時に起こること
5 つのステップはすべてクライアントとブラウザが処理します。あなたが目にするのは同意ページだけです。
POST /api/public/v1/mcp → 401 + WWW-Authenticateクライアントは認証情報なしで MCP エンドポイントを呼び出します。Markaestro は保護リソースのメタデータ文書を示す WWW-Authenticate ヘッダー付きで 401 を返します。このヘッダーがサインイン可能であることをクライアントに伝えます。
GET /.well-known/oauth-protected-resource · /.well-known/oauth-authorization-serverクライアントは 2 つの公開文書を読みます。どの認可サーバーがエンドポイントを保護しているか、そしてそのサーバーの登録、認可、トークンの各エンドポイントがどこにあるかです。どちらも markaestro.com で配信され、キャッシュ可能です。
POST /api/public/v1/oauth/registerクライアントは名前とコールバックアドレスを使って自身を登録します。ループバックアドレス、https コールバック、ネイティブアプリのスキームは受け付けられ、実ホストへの平文 http は拒否されます。事前共有のクライアント ID は不要です。
GET /oauth/authorize (browser)ブラウザに同意ページが開きます。メール確認済みのワークスペースのオーナーまたは管理者がワークスペースとブランドを選び、権限を調整して「許可」をクリックします。Markaestro は一回限りのコードを付けてブラウザをクライアントへ戻します。
POST /api/public/v1/oauth/tokenクライアントはコードと PKCE verifier をアクセストークンとリフレッシュトークンに交換します。アクセストークンは選択したブランドに紐づいた通常のワークスペース API キーです。30 日で期限切れになり、リフレッシュでシークレットがローテーションされ、さらに 30 日延長されます。
トークンは本物の API キー
スコープ、ブランドの紐づけ、レート制限、サブスクリプション確認、冪等性、失効は、手動で作成したキーと同じコードパスを通ります。理解すべき第二の権限モデルはありません。
設定で一覧表示と失効が可能
接続済みエージェントは設定の API に「接続済みエージェント」バッジ、最終使用日時、リクエスト量とともに表示されます。そこで失効させれば次の呼び出しは失敗します。切断時にはクライアント自身がトークンを失効させることもできます。
一つの接続に一つのブランド
各接続は同意時に選んだ一つのブランドに厳密に紐づきます。エージェントに別のブランドを扱わせるには、再度接続してそのブランドを選びます。クライアントは許可されていないブランドには決して到達できません。
コードとリフレッシュトークンは使い捨て
認可コードの有効期間は 10 分で、原子的に消費されるため、再利用は失敗します。リフレッシュトークンは使用のたびにローテーションされ、ハッシュ化して保存されます。使われていないクライアント登録は 180 日で失効します。
エンドポイント
MCP クライアントを構築する方やフローを監査する方向けです。すべて 2 つの well-known 文書から発見できるため、手動で設定するものはありません。
# Discovery (public, cacheable)
GET /.well-known/oauth-protected-resource RFC 9728
GET /.well-known/oauth-authorization-server RFC 8414
# Authorization server
POST /api/public/v1/oauth/register RFC 7591, public clients (PKCE) or client_secret
GET /oauth/authorize?response_type=code&client_id=…&redirect_uri=…
&code_challenge=…&code_challenge_method=S256&state=…
POST /api/public/v1/oauth/token grant_type=authorization_code | refresh_token
POST /api/public/v1/oauth/revoke RFC 7009
# Token response
{ "access_token": "mk_live_<ws>.<client>.<secret>", "token_type": "Bearer",
"expires_in": 2592000, "refresh_token": "…", "scope": "products.read posts.write …" }エージェントのループ
最初から最後まで、5回の呼び出し
Markaestroのすべての自動化は、このループのバリエーションです。ステップ1〜3はConnect API、ほとんどのエージェントが対象とすべきフラットなサーフェスです。ステップ4と5は、明示的な公開と実行の追跡のために完全な/api/public/v1 APIにアクセスします。
GET /api/connect/v1/social-accountsキーのブランドに紐付いた、接続済みで公開可能なすべてのアカウントを返します。それぞれにプラットフォーム、ユーザー名、不透明なIDが含まれます。実行の開始時に呼び出してください、接続は変化します。
POST /api/connect/v1/media/create-upload-url → PUT短時間有効で1回限りの署名付きURLを発行し、そこへ生のバイトデータをPUTします。メディアIDが返されます。画像は最大10MB、完全版APIでは動画も最大250MBまで対応します。
POST /api/connect/v1/postsキャプション、メディアID、アカウントIDをそのまま渡してください。確認のために下書きのままにするか、is_draft falseとscheduled_atを送信してカレンダーに登録します。
POST /api/public/v1/posts/:id/publish非同期の実行をキューに追加します。LinkedIn、Threads、Pinterestは公式APIを通じて配信されます。Facebook、Instagram、TikTokは、人間がネイティブに投稿できるようワークスペースの「投稿待ち」キューに入ります。
GET /api/public/v1/job-runs/:id · webhooks実行IDをポーリングするか、Webhookエンドポイントを登録してMarkaestroからpost.published、post.action_required、post.failedをプッシュしてもらいます。公開が同期的に完了したと決して仮定しないでください。
クイックスタート
4コマンドで完結する統合
まずキーを発行しましょう:設定 → APIを開き、アクセスを許可するブランドを選択し、必要なスコープにチェックを入れ、必要に応じて有効期限を設定します。キーは一度しか表示されないので、そのままエージェントのシークレットストアに保存してください。キーの作成には、メール認証済みの管理者またはオーナーが必要です。
# The API is served from the marketing apex and the app subdomain alike.
export MARKAESTRO_URL="https://markaestro.com"
export MARKAESTRO_API_KEY="mk_live_<workspaceId>.<clientId>.<secret>"
# 1. What can this key post to?
curl -s "$MARKAESTRO_URL/api/connect/v1/social-accounts" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY"{
"data": [
{
"id": "prod_123#instagram:instagram:ig_123",
"product_id": "prod_123",
"product": "Northwind Coffee",
"platform": "instagram",
"username": "northwindcoffee"
}
]
}# 2. Mint a signed upload url, then PUT the bytes.
RESP=$(curl -s -X POST "$MARKAESTRO_URL/api/connect/v1/media/create-upload-url" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "mime_type": "image/png", "size_bytes": 184320, "name": "cold-brew.png" }')
# → { "media_id": "ast_777", "upload_url": "https://.../media/upload?token=..." }
curl -X PUT "<upload_url>" \
-H "Content-Type: image/png" \
--data-binary @cold-brew.pngis_draft: falseとscheduled_atタイムスタンプを送信すれば投稿をカレンダーに登録できます。# 3. Put it on the calendar. Pass the account id back verbatim.
curl -X POST "$MARKAESTRO_URL/api/connect/v1/posts" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"caption": "Cold brew season starts Friday.",
"media": ["ast_777"],
"social_accounts": ["prod_123#instagram:instagram:ig_123"],
"is_draft": false,
"scheduled_at": "2026-08-14T15:00:00.000Z"
}'
# 4. Check where everything stands.
curl -s "$MARKAESTRO_URL/api/connect/v1/posts?limit=20" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY"そのまま使える
ツール定義とエージェント向け概要
コピーすべきものは2つあります。1つ目は、投稿ループ全体をカバーするツールスキーマ一式です、JSON Schemaで書かれているため、Claudeのツール定義、OpenAIの関数、あるいはあなたがホストするMCPサーバーの入力形式としてそのまま使えます。2つ目は、モデルが予期しないことをしないようにする運用概要です。
[
{
"name": "markaestro_list_accounts",
"description": "List the social accounts this Markaestro key can publish to. Call this first in every run. Never hardcode account ids. Returns id, platform, and username.",
"input_schema": { "type": "object", "properties": {}, "required": [] }
},
{
"name": "markaestro_upload_media",
"description": "Upload one image or video to Markaestro and return a media asset id. Images: png, jpeg, webp, gif up to 10 MB. Video: mp4, mov, webm up to 250 MB.",
"input_schema": {
"type": "object",
"properties": {
"file_path": { "type": "string", "description": "Local path to the file to upload." },
"mime_type": { "type": "string", "description": "MIME type of the file." }
},
"required": ["file_path", "mime_type"]
}
},
{
"name": "markaestro_create_post",
"description": "Create a post for one channel. Facebook, Instagram, and TikTok are manual-first: a human posts them natively from the To Post queue. Omit delivery_mode unless the user explicitly asked for unattended publishing.",
"input_schema": {
"type": "object",
"properties": {
"channel": {
"type": "string",
"enum": ["facebook", "instagram", "tiktok", "linkedin", "threads", "pinterest", "x"]
},
"caption": { "type": "string", "description": "Caption text, max 4000 characters." },
"media_asset_ids": {
"type": "array",
"items": { "type": "string" },
"description": "Ids from markaestro_upload_media. Instagram and TikTok require at least one."
},
"destination_id": {
"type": "string",
"description": "From markaestro_list_accounts. Required only when the brand has more than one destination on that channel."
},
"delivery_mode": {
"type": "string",
"enum": ["manual_reminder", "direct_publish", "platform_inbox"],
"description": "Omit for the channel default."
}
},
"required": ["channel", "caption"]
}
},
{
"name": "markaestro_publish_post",
"description": "Queue an async publish run for an existing post. Returns a run id. Poll it, do not assume the post is live.",
"input_schema": {
"type": "object",
"properties": { "post_id": { "type": "string" } },
"required": ["post_id"]
}
},
{
"name": "markaestro_list_posts",
"description": "List posts for this brand, newest first. Filter by status: draft, scheduled, publishing, published, platform_action_required, failed, partial_failed.",
"input_schema": {
"type": "object",
"properties": {
"status": { "type": "string" },
"limit": { "type": "integer", "minimum": 1, "maximum": 100 }
},
"required": []
}
},
{
"name": "markaestro_delete_post",
"description": "Remove a post from Markaestro. Use it to cancel something scheduled. Deleting an already-published post does NOT retract the live copy on the platform.",
"input_schema": {
"type": "object",
"properties": { "post_id": { "type": "string" } },
"required": ["post_id"]
}
}
]You have a Markaestro API key for exactly one brand. Markaestro is the
publishing layer: you supply the caption and the media, it handles the
platform rules, the calendar, and delivery.
Base URL: https://markaestro.com
Auth: Authorization: Bearer $MARKAESTRO_API_KEY
Rules:
- Call GET /api/connect/v1/social-accounts before posting. Pass the returned
account ids back verbatim. Never invent or cache an id across runs.
- Upload media before creating a post; posts reference media ids, not files.
- Facebook, Instagram, and TikTok are manual-first. Creating and publishing
them queues a reminder for a human. That is the intended behavior. Only
send deliveryMode "direct_publish" if the operator explicitly asked for it.
- Send a unique Idempotency-Key on every POST. Reuse the SAME key when
retrying the SAME request; never reuse it for a different one.
- On 429, wait the number of seconds in Retry-After, then retry. On 4xx other
than 429, do not retry. Report the error code and requestId and stop.
- Publishing is async. POST /publish returns a run id; poll
GET /api/public/v1/job-runs/<id> until succeeded or failed.
- To cancel, list with ?status=scheduled and DELETE the post id. Deleting a
published post does not remove it from the platform.
- Never claim a post is live until a run reports succeeded or a post reports
published.エージェントはこれを自分で取得することもできます:curl https://markaestro.com/llms.txtは、エンドポイント、ルール、エラー処理を含むAPI全体のプレーンテキスト概要を返します、コンテキストに収まるほど小さなサイズです。
レシピ
エージェントが実際に実行する4つのワークフロー
# Full control: draft → publish → poll. No productId needed:
# the key is already bound to one brand.
POST_ID=$(curl -s -X POST "$MARKAESTRO_URL/api/public/v1/posts" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: post-2026-08-14-linkedin" \
-d '{
"channel": "linkedin",
"caption": "We shipped agent-driven publishing.",
"mediaAssetIds": ["ast_777"]
}' | jq -r .post.id)
RUN_ID=$(curl -s -X POST "$MARKAESTRO_URL/api/public/v1/posts/$POST_ID/publish" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Idempotency-Key: publish-$POST_ID" | jq -r .run.id)
# queued → running → succeeded | failed
curl -s "$MARKAESTRO_URL/api/public/v1/job-runs/$RUN_ID" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY"# Review the queue, then cancel what the operator rejected.
curl -s "$MARKAESTRO_URL/api/public/v1/posts?status=scheduled&limit=100" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY"
curl -X DELETE "$MARKAESTRO_URL/api/public/v1/posts/pst_123" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY"
# → { "deleted": true, "id": "pst_123" }# One call, up to 25 posts. Per-item results: one bad item
# does not fail the batch.
curl -X POST "$MARKAESTRO_URL/api/public/v1/posts" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: week-33-drop" \
-d '{
"posts": [
{ "channel": "instagram", "caption": "Monday", "mediaAssetIds": ["ast_1"] },
{ "channel": "facebook", "caption": "Tuesday", "mediaAssetIds": ["ast_2"] },
{ "channel": "linkedin", "caption": "Thursday" }
]
}'
# → { "results": [...], "created": 3, "total": 3 }# Let Markaestro call you instead of polling.
curl -X POST "$MARKAESTRO_URL/api/public/v1/webhook-endpoints" \
-H "Authorization: Bearer $MARKAESTRO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-agent.example.com/hooks/markaestro",
"events": ["post.published", "post.action_required", "post.failed"]
}'
# Each delivery carries:
# X-Markaestro-Event post.action_required
# X-Markaestro-Timestamp 2026-08-14T15:00:04.000Z
# X-Markaestro-Signature HMAC of the body with your webhook secret
# The secret is shown once at creation and stored hashed. Verify before acting.ガードレール
エージェントができること、できないこと
自律性は影響範囲が小さい場合にのみ有用です。Markaestroのデフォルト設定は、呼び出し元が間違っている可能性のあるソフトウェアであることを前提としています。
Facebook、Instagram、TikTokはマニュアルファースト
エージェントがこれらのチャネル向けに作成する投稿は、デフォルトでmanual_reminderになります:Markaestroはこれらに対してプラットフォームのAPIを呼び出すことはありません。公開処理により投稿はワークスペースの「投稿待ち」キューに移動し、そこで人間がメディアをダウンロードしてネイティブに投稿し、確認します、そのため投稿はまるで手作業で作られたかのように見え、公に存在する前に必ず人間が目を通します。エージェントはdeliveryMode: "direct_publish"で1件の投稿を公式API公開に選択でき、TikTokの場合はクリエイター受信箱への引き渡しを意味し、無人のパブリック投稿になることは決してありません。LinkedIn、Threads、Pinterestは、エージェントが明示的に要求した時点でプログラムによって公開されます。
キーのスコープを絞る
エージェントに必要なスコープのみを選択してください:products.read、media.write、posts.read、posts.write、posts.publish、job_runs.read、webhooks.manage。カレンダーを読むだけのリサーチエージェントには、posts.readのみを与えれば十分です。
有効期限を設定する
キーは有効期限付きで作成できます。期限切れのキーは失効したキーと全く同じように動作するため、エージェントの環境から漏洩したキーは自然と機能しなくなります。
ローテーションと失効
「設定 → API」からキーをその場でローテーションするか、完全に失効させることができます。すべてのキーは最終使用日時とリクエスト量を表示するため、静かになったエージェント、あるいは暴走したエージェント、 を可視化できます。
レート制限が適用されます
エンドポイントごとに毎分60リクエスト、キーごとに毎分240リクエストです。すべてのレスポンスにX-RateLimit-Limit、-Remaining、-Resetが含まれ、429にはRetry-Afterが含まれます。無理に押し通すのではなく、それに従ってください。
Markaestroはあなたの代わりに文章を書きません
生成のステップは存在しません。キャプションはエージェントから、メディアはあなたのライブラリまたはエージェントのパイプラインから来ます。Markaestroは手であり、声ではありません。
削除はMarkaestro側の処理です
予約済みの投稿を削除すると、公開前にキャンセルされます。公開済みの投稿を削除しても、Markaestro側の追跡が止まるだけです、公開済みの投稿は、誰かがプラットフォーム上で削除するまで公開されたままです。
エラー処理
リトライする価値のあるエラーを教える
すべてのエラーレスポンスは、安定したerrorコードとrequestIdを含むJSONです。エージェントには、失敗を報告する際にrequestIdを引用させてください、サポートが呼び出しを追跡するために必要な情報です。
| ステータス | コード | エージェントが取るべき対応 |
|---|---|---|
| 401 | UNAUTHENTICATED | キーが存在しない、失効している、または期限切れです。停止して人間に新しいキーを依頼してください、リトライしても解決しません。 |
| 403 | FORBIDDEN | キーにこの呼び出しに必要なスコープがありません。どの呼び出しが失敗したかを報告してください。スコープは「設定 → API」で変更できます。 |
| 403 | API_KEY_NOT_BOUND_TO_PRODUCT | ブランド紐付け以前に発行されたキーです。代替キーを依頼してください。 |
| 400 | VALIDATION_* | ペイロードがチャネルのルールに違反しています(メディア不足、不正な配信モード、誤ったscheduled_atなど)。リクエストを修正してください。変更せずにリトライしないでください。 |
| 400 | VALIDATION_IDEMPOTENCY_KEY_REUSED | 同じIdempotency-Keyが異なるボディで送信されました。区別されたリクエストごとに新しいキーを発行してください。 |
| 400 | VALIDATION_POST_IS_PUBLISHING | 公開実行が進行中に投稿を削除しようとしました。実行が落ち着くのを待ってから削除してください。 |
| 409 | VALIDATION_POST_ALREADY_PUBLISHING | この投稿の公開実行はすでにキューに入っています。再度公開せず、既存の実行をポーリングしてください。 |
| 402 | SUBSCRIPTION_REQUIRED | このワークスペースに有効なプランが関連付けられていません。ワークスペースのオーナーに設定で請求情報を確認するよう依頼してください。 |
| 402 | QUOTA_EXCEEDED_MEDIA_UPLOADS | ワークスペースが月間アップロードクォータに達しました。アップロードを停止して表示してください、既存のメディアは引き続き公開されます。 |
| 404 | NOT_FOUND | IDがこのキーのブランドの範囲外です。キーが所有していないIDを探索できないよう、403ではなく404として応答されます。 |
| 429 | RATE_LIMITED | Retry-Afterの秒数だけ待機し、同じIdempotency-Keyで同じリクエストをリトライしてください。 |
お好きなスタックで
HTTPSリクエストができれば、公開できます
採用すべきMarkaestro専用クライアントライブラリも、標準化すべきフレームワークもありません。ベアラートークン、JSONを送って、JSONを受け取るだけです。
ClaudeとClaude Agent SDK
上記のツール定義をそのままツールリストに追加してください。JSON Schemaの形式はすでにClaudeのツール使用フォーマットに準拠しています。
OpenAIのfunction calling
同じスキーマがそのまま関数定義にマッピングされます、input_schemaをparametersにリネームするだけです。
MCP クライアント
Claude Code、Claude、Cursor、ChatGPT、Grok、Grok Bot、OpenClaw、Hermes はホスト型サーバーの URL を追加してブラウザでサインインするだけです。stdio 専用のクライアントには npx -y @markaestro/mcp が同じ 31 のツールをローカルで提供します。
n8n、Make、Zapier
すべてのエンドポイントは、ベアラートークン付きの単純なHTTPリクエストです。SDKも署名の儀式も、エージェント向けのOAuthダンスも不要です。
LangChainとLlamaIndex
標準的なRESTツールです。2ステップのメディアアップロードだけが唯一の複数呼び出しフローで、わずか2行で済みます。
cronジョブとcurl
すべてのエージェントにフレームワークが必要なわけではありません。上記のクイックスタートは、4コマンドで完結する完全な統合です。