AI エージェントからの操作
supacms CLI はサブコマンド形式・JSON 出力に特化しており、AI エージェント(Claude など)からの操作に向いています。
このページでは、AI にスキーマ定義を任せるための推奨プロンプトと典型的なワークフローを紹介します。
なぜ CLI が AI に向いているか
| 観点 | CLI(supacms) | Web UI |
|---|---|---|
| 操作方法 | コマンド一発 | ブラウザ操作 |
| 出力 | JSON(parse 可能) | HTML |
| エラー | 終了コード + JSON | ダイアログ |
| 自動化 | スクリプト化可能 | 不可 |
システムプロンプト(推奨テンプレート)
AI にスキーマ管理を任せるときは、以下のスニペットをシステムプロンプトまたは会話の冒頭に含めてください。
あなたは SupaCMS のコンテンツ管理アシスタントです。以下の CLI ツールを使ってコンテンツタイプ・フィールド・メディア・エントリを操作してください。
## 設定- SUPACMS_API_KEY: ${SUPACMS_API_KEY}- 対象スペース: <SPACE_SLUG>
各コマンドに --api-key $SUPACMS_API_KEY を付けるか、環境変数 SUPACMS_API_KEY を設定してください。
## CLI の基本コマンド
# ContentType の作成supacms content-type create --space <slug> --name <名前> --api-id <apiId> --api-key <key>
# ContentType の一覧supacms content-type list --space <slug> --api-key <key>
# フィールドの追加supacms field add \ --space <slug> \ --content-type <contentTypeApiId> \ --name <名前> --api-id <apiId> \ --type <タイプ> [--required] [--config '<JSON>'] \ --api-key <key>
# フィールドの一覧supacms field list --space <slug> --content-type <contentTypeApiId> --api-key <key>
# メディアのアップロードsupacms media upload --space <slug> --file <パス> [--alt <代替テキスト>] --api-key <key>
# メディアの一覧supacms media list --space <slug> --api-key <key>
# エントリの作成(常に draft)supacms entry create --space <slug> --content-type <contentTypeApiId> --data '<JSON>'
# エントリの一覧supacms entry list --space <slug> --content-type <contentTypeApiId> [--status draft|published]
# エントリの更新supacms entry update --space <slug> --content-type <contentTypeApiId> --id <entryId> --data '<JSON>'
# エントリの公開 / 非公開supacms entry publish --space <slug> --content-type <contentTypeApiId> --id <entryId>supacms entry unpublish --space <slug> --content-type <contentTypeApiId> --id <entryId>
# エントリの削除supacms entry delete --space <slug> --content-type <contentTypeApiId> --id <entryId>
## フィールドタイプshort_text / long_text / rich_text / integer / decimal / boolean / datetime / json / url / media
## ルール- 操作前に必ず現在の状態を確認してください(list コマンドで取得)- apiId は英字始まり・英数字とアンダースコアのみ(例: blogPost, publishedAt)- 同じ apiId が既に存在する場合はエラーになります(重複チェックを行うこと)- エントリは作成後 publish コマンドで公開するまで draft 状態です- 出力は JSON なので jq などでパースして確認できます- media フィールドに画像を紐づける場合は先に media upload でアップロードしてくださいタスク別プロンプト例
新しいコンテンツタイプを設計・作成させる
「myblog」スペースにブログ記事のコンテンツタイプを作成してください。必要なフィールドを考えて全て追加してください。AI はまず content-type list で現状を確認し、ContentType を作成してフィールドを追加します。
既存のスキーマにフィールドを追加させる
「myblog」スペースの「blogPost」コンテンツタイプにSEO 用のメタディスクリプション(最大 160 文字)フィールドを追加してください。スキーマをまるごと移行させる
以下の定義に従ってスペース「ecommerce」にコンテンツタイプとフィールドを作成してください。
## 商品(product)- 商品名(name): short_text, 必須, 最大 100 文字- 説明(description): long_text- 価格(price): decimal, 必須- 在庫あり(inStock): boolean, デフォルト true- 公開日(publishedAt): datetime
## カテゴリ(category)- カテゴリ名(name): short_text, 必須- スラッグ(slug): short_text, 必須
まず現在のスペースの状態を確認してから実行してください。エントリを作成して公開させる
「myblog」スペースの「blogPost」コンテンツタイプに以下の内容でエントリを作成し、公開してください。
タイトル: はじめての記事本文: SupaCMS を使ってみました。とても使いやすいです。AI はエントリを作成(draft)→ 内容を確認 → publish の順で操作します。
複数のエントリをまとめてインポートさせる
以下のデータを「myblog」スペースの「blogPost」コンテンツタイプにエントリとして一括作成してください。作成後はすべて公開状態にしてください。
[ {"title": "記事1", "body": "本文1"}, {"title": "記事2", "body": "本文2"}, {"title": "記事3", "body": "本文3"}]ワークフロースクリプト例
AI に渡すのではなく、定義済みスキーマをスクリプトでべき等に適用する場合の参考例です。
#!/usr/bin/env bash# スキーマ定義をべき等に適用するスクリプト例
set -euo pipefail
SPACE="${SUPACMS_SPACE:-myblog}"CLI="bun run apps/cli/src/index.ts"
# ContentType が存在しなければ作成(エラーを無視して list で確認する方式)create_ct_if_missing() { local name="$1" api_id="$2" description="${3:-}" local existing existing=$($CLI content-type list --space "$SPACE" | \ jq -r ".[] | select(.apiId == \"$api_id\") | .apiId")
if [ -z "$existing" ]; then echo "ContentType 作成: $api_id" $CLI content-type create \ --space "$SPACE" \ --name "$name" \ --api-id "$api_id" \ ${description:+--description "$description"} else echo "ContentType スキップ(既存): $api_id" fi}
# Field が存在しなければ追加add_field_if_missing() { local ct_api_id="$1" name="$2" api_id="$3" type="$4" shift 4 local existing existing=$($CLI field list --space "$SPACE" --content-type "$ct_api_id" | \ jq -r ".[] | select(.apiId == \"$api_id\") | .apiId")
if [ -z "$existing" ]; then echo " Field 追加: $api_id ($type)" $CLI field add \ --space "$SPACE" \ --content-type "$ct_api_id" \ --name "$name" \ --api-id "$api_id" \ --type "$type" \ "$@" else echo " Field スキップ(既存): $api_id" fi}
# ---- スキーマ定義 ----
create_ct_if_missing "ブログ記事" "blogPost" "ブログの記事コンテンツ"
add_field_if_missing blogPost "タイトル" title short_text --required --config '{"maxLength":200}'add_field_if_missing blogPost "本文" body rich_text --requiredadd_field_if_missing blogPost "公開日" publishedAt datetime --config '{"includeTime":false}'add_field_if_missing blogPost "スラッグ" slug short_text --required --config '{"maxLength":100}'
echo "完了"実行方法:
# 環境変数を事前にエクスポートしている場合SUPACMS_SPACE=myblog bash scripts/apply-schema.sh
# または直接渡す場合SUPACMS_URL=https://your-supacms.com \SUPACMS_API_KEY=sk-... \SUPACMS_SPACE=myblog \ bash scripts/apply-schema.shClaude に渡す MCP / ツール設定のヒント
Claude Code から直接操作させる場合は、シェルコマンドを実行させるだけで機能します。
# 環境変数が設定済みであれば Claude Code 上でそのまま実行できます! bun run apps/cli/src/index.ts content-type list --space myblog --prettyよくあるエラーと対処
| エラー | 原因 | 対処 |
|---|---|---|
Unauthorized | APIキーが無効または対象スペースと一致しない | キーとスペース slug を確認 |
apiId already exists | 同じ apiId が既に存在する | field list / content-type list で確認してからスキップ |
Invalid request body | --config の JSON が不正、または必須パラメータ不足 | --type とそれに対応した config を確認 |
Not Found | スペース slug や content-type apiId が間違っている | content-type list で正しい値を確認 |
Invalid file type | 対応していない MIME タイプのファイル | JPEG / PNG / GIF / WebP / SVG のいずれかを使用 |
File too large | ファイルサイズが 10MB を超えている | ファイルを圧縮・リサイズしてから再試行 |
必須フィールド "xxx" が存在しません | エントリの必須フィールドが --data に含まれていない | field list でフィールド定義を確認し required フィールドをすべて含める |
エントリのステータス遷移が不正です | すでに published なエントリを再度 publish しようとした | entry list でステータスを確認してから操作する |