validate-profile について
マーケティングブランド設定の準備状況を確認する、読み取り専用の検証スキルです。コンテンツやキャンペーンの開始前に、プロフィール、コンプライアンス、コネクター設定、出力先を確認し、認証情報の値は表示しません。
主な機能
- 01ブランドの基本情報とトーンを検証
- 02オーディエンス、規制、ガードレールを確認
- 03コネクター設定と MCP の稼働状況を確認
- 04認証情報の保存先と出力先を検証
- 05構造化レポートと JSON 要約を生成
活用シーン
- 01ブランド設定後の準備状況確認
- 02API キー更新後の接続状態の再確認
- 03キャンペーンや顧客業務の前に問題を特定
MCP 対応
.mcp.json に記載された MCP サーバーへ tools/list を送り、秘密情報を表示せずにコネクター設定を確認できます。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ indranilbanerjee/ digital-marketing-pro --skill validate-profileインストール後、Claude Code で/validate-profileを入力して読み込まれたか確認します。
詳細
/digital-marketing-pro:validate-profile — ブランドプロフィールと認証情報の健全性チェック
スクリプトの場所。 ホストで
${CLAUDE_PLUGIN_ROOT}が設定されていない場合、スクリプトはこのプラグインのskills/と同じ階層にあるscripts/フォルダー内にあります。Python 3.10 以降で実行してください。pythonが見つからない場合は、python3を使用してください(macOS、多くの Linux システム)。
このスキルは、「このブランドは業務に着手できる状態か」を判断するための標準チェックゲートです。ブランドプロフィールが本番利用に十分な状態かを検証し、プロフィールで参照されているすべての認証情報/コネクターに実際に接続できるかを確認します。認証情報の値を出力することは一切ありません。
このスキルは、次の場合に使用します。
/digital-marketing-pro:brand-setup(または/digital-marketing-pro:client-onboarding)の後に、新しいプロフィールが本番利用可能な状態か確認する。- API キーのローテーション後(Slack、HubSpot、Stripe、Ahrefs、GA4 サービスアカウントなど)に、新しい値をログに残さず接続を再確認する。
- ブランドガイドラインのインポート後(
/digital-marketing-pro:import-guidelines)に、マージが正常に完了したか確認する。 /digital-marketing-pro:engagement、/digital-marketing-pro:campaign-plan、または/digital-marketing-pro:launch-campaignの前提条件チェックとして使用する。
このスキルが存在する理由
50〜200 のクライアントブランドを運用する代理店では、ブランドプロフィールや認証情報が絶えず変化します。ジュニアスタッフが Slack チャンネルを変更したり、API キーがローテーションされたり、ブランドのトーンが編集されたりします。壊れたプロフィールで 60 分のエンゲージメントを実施すると、何時間ものやり直しが発生します。このスキルは、そうした変化による問題を 60 秒以内に検出します。
このスキルは読み取り専用です。状態を調査しますが、変更することはありません。また、認証情報の値を出力することも一切ありません。コネクターのチェック結果は、シークレットを表示せずに、合格/不合格/エラー分類のみを出力します。
検証項目
| 項目 | チェック内容 | 重大度 |
|---|---|---|
| 必須の識別情報 | brand_name、industry、および空でない市場/法域リスト。target_markets(brand-setup が実際に書き込む項目)または target_jurisdictions(レガシー)のいずれかを受け入れます。レガシー名だけをチェックすると、新規作成されたすべてのブランドが、自身のバリデーターで BLOCKER に該当していました | BLOCKER |
| ボイスプロファイル | brand_voice(brand-setup が書き込み、content-engine と brand-voice-scorer.py の両方が読み取る項目)または voice(レガシー)に、トーン、フォーマル度、エネルギーが設定されていること。ここではジェネレーターが信頼できる情報源です。すでに2つの利用側がジェネレーターに従っているため、このバリデーターだけが例外でした | コンテンツ作業では BLOCKER |
| オーディエンスプロファイル | target_audience.primary_persona に role と reading_level が設定されていること | WARNING |
| ガードレール | guardrails.prohibited_terms と guardrails.prohibited_claims が空でないこと。brand-setup はこのブロックを作成しないため、規制対象外のブランドでは追加に必要な正確なコマンドとともに WARNING として報告し、規制対象業界では BLOCKER とします。規制対象業界では、ガードレールの欠落はセットアップ上の不足ではなく、実際のリスクとなるためです | 規制対象業界(製薬、BFSI、医療、法律)では BLOCKER、それ以外では WARNING |
| コンプライアンス対象法域 | 宣言された各法域に対応するルールのエントリーが skills/context-engine/compliance-rules.md にあること | BLOCKER |
| コネクター設定の有無 | tracking.backend、integrations.*、analytics.* で指定されたすべてのコネクターについて、環境変数/.mcp.json のエントリーが存在すること(ローカルチェック。実際の接続確認は後述の MCP/curl プローブで行います) | 未設定のコネクターごとに BLOCKER |
| MCP サーバーの正常性 | .mcp.json の各エントリー(存在する場合)が tools/list ping に応答すること | WARNING |
| 認証情報の保存 | 参照されるすべてのバックエンドについて、~/.claude-marketing/brands/{brand}/credentials.json(または環境変数)が存在すること | BLOCKER |
| 出力パスへの書き込み可否 | ~/.claude-marketing/brands/{brand}/ と、ユーザーに表示される公開先ディレクトリ($DIGITAL_MARKETING_PRO_PUBLISH_DIR または ~/Documents/DigitalMarketingPro/)に書き込み可能であること | BLOCKER |
| モデルキュレーターの情報の鮮度 | scripts/resolve_model.py --registry-age の戻り値が 90 日未満であること | WARNING |
BLOCKER は、「修正されるまで、ユーザーに engagement/campaign-plan/launch-campaign を実行させてはいけない」ことを意味します。WARNING は表示されますが、実行を制限しません。
プロセス
ステップ 0 — 検証するブランドを特定する
--brand <slug> が渡された場合は、それを使用します。渡されていない場合は、~/.claude-marketing/brands/_active-brand.json からアクティブなブランドを読み取ります(/digital-marketing-pro:switch-brand が設定します)。どちらも利用できない場合は、次のエラーを表示します:"--brand <slug> required, or run /digital-marketing-pro:switch-brand first."。「すべて」を検証してはいけません。検証はブランドごとに行う設計です。
ステップ 1 — ブランドプロファイルを読み込む
BRAND_DIR="$HOME/.claude-marketing/brands/{brand}"
test -d "$BRAND_DIR" || { echo "Brand directory not found at $BRAND_DIR — run /digital-marketing-pro:brand-setup first."; exit 1; }
PROFILE="$BRAND_DIR/profile.json"
test -f "$PROFILE" || { echo "profile.json missing under $BRAND_DIR — run /digital-marketing-pro:brand-setup."; exit 1; }
プロファイル JSON を解析し、brand_name、industry、target_jurisdictions、voice.*、target_audience.*、guardrails.*、tracking.backend、integrations.*、analytics.* を取得します。
ステップ 2 — 必須フィールドをチェックする
上記の検証項目表にあるチェックリストを確認します。各フィールドについて、OK/WARN: <reason>/BLOCK: <reason> のいずれかを記録します。途中で処理を打ち切ってはいけません。ユーザーが一度に全体像を把握できるよう、すべての問題を収集します。
規制対象業界(industry が pharma、pharmaceuticals、bfsi、banking、insurance、healthcare、legal、medical-devices のいずれかに一致する場合)では、ガードレールに関する問題を WARNING から BLOCKER に引き上げます。
ステップ 3 — コンプライアンス対象法域を照合する
target_jurisdictions の各エントリーについて、skills/context-engine/compliance-rules.md に対応するセクション見出し(例:### 1.11 India — DPDPA)があることを確認します。法域が宣言されているにもかかわらず、ルールが網羅していない場合は、次のメッセージとともに BLOCK とします:"Jurisdiction {X} declared in profile but no compliance rules for it — engagement will produce non-compliant deliverables."
ステップ 4 — コネクターの到達可能性(認証情報を安全に扱う)
tracking.backend、integrations.crm、integrations.email、integrations.cms、integrations.analytics、integrations.social で参照されている各バックエンドについて、scripts/connector-status.py を使って対応するヘルスプローブを実行します。
python "${CLAUDE_PLUGIN_ROOT}/scripts/connector-status.py" \
--action status \
--brand "{brand}" \
--connectors "{comma-separated list inferred from profile}" \
--probe-only --no-secrets
connector-status.py --probe-only はローカルの準備状況チェックを実行します。各コネクターに必要な環境変数/.mcp.json エントリーが存在し、空でないことを確認します。ライブのネットワーク接続を開いたり、whoami を呼び出したりはしないため、ライブの HTTP ステータスではなく、設定レベルの状態(CONFIGURED / MISSING_ENV / NOT_IN_MCP)を報告します。--no-secrets を指定すると、認証情報の値がエコー、ログ出力、書き込みされることはありません。実際の稼働状況を確認するには、コネクターの MCP tools/list エンドポイントか、以下の HTTP curl プローブを使います。
.mcp.json に MCP サーバーがある場合(ブランドまたはプロジェクトレベル)、コネクターが読み込まれていれば、各サーバーに対して mcp__connector__* 経由で tools/list ping を実行します。HTTP MCP の場合は、設定された url に対して 5 秒の curl HEAD を実行します。
for url in $(jq -r '.mcpServers[] | select(.type=="http") | .url' .mcp.json); do
code=$(curl -sS -o /dev/null -w "%{http_code}" -m 5 "$url" || echo "000")
echo "$url -> HTTP $code"
done
HTTP 200、204、401(GET には認証が必要ですが、POST は機能します)、405(GET ではメソッドが許可されていませんが、POST は機能します)は、すべて「到達可能」とみなします。404、000(DNS/タイムアウト)、5xx は BLOCK とみなします。
ステップ 5 — 出力パスの書き込み可能性
test -w "$HOME/.claude-marketing/brands/{brand}/" || echo "BLOCK: brand directory is not writeable"
# User-visible publish dir (dual-copy pattern)
if [ -n "$DIGITAL_MARKETING_PRO_PUBLISH_DIR" ]; then
test -w "$DIGITAL_MARKETING_PRO_PUBLISH_DIR" || echo "WARN: DIGITAL_MARKETING_PRO_PUBLISH_DIR ($DIGITAL_MARKETING_PRO_PUBLISH_DIR) is not writeable"
elif [ -d "$HOME/Documents" ]; then
test -w "$HOME/Documents" || echo "WARN: ~/Documents is not writeable — the user-visible publish copy will fail"
fi
ステップ 6 — モデルキュレーターの鮮度
python "${CLAUDE_PLUGIN_ROOT}/scripts/resolve_model.py" --registry-age
レジストリが90 日を超えて古い場合は、WARN を表示します:「model_registry.json is {N} days old — frontier models change every ~6 weeks. Run scripts/refresh_models.py to check drift.」(ブロックはしません。キュレーターは非推奨 ID を自動的に最新のものへ切り替えるため、古いレジストリは機能停止ではなく、性能が低下した状態です。)
ステップ 7 — レポート
構造化レポートを出力します。必ずすべてのチェックを表示してください(失敗した項目だけを出力しないでください。エージェンシーは、残りの項目が問題ないことも確認する必要があります)。
🔎 Brand profile validation — {brand_name}
Slug: {brand} · Industry: {industry} · Jurisdictions: {list}
✅ Required identity brand_name, industry, target_jurisdictions all set
✅ Voice profile tone={tone} · formality={formality} · energy={energy}
⚠️ Audience profile primary_persona.role set, reading_level MISSING
✅ Guardrails {N} prohibited_terms, {M} prohibited_claims (industry={industry})
✅ Compliance jurisdictions EU-GDPR ✓ · IN-DPDPA ✓ · US-CCPA ✓
🛑 Connector — Slack MISSING_ENV (SLACK_* env not set — add via /digital-marketing-pro:add-integration slack)
✅ Connector — HubSpot OK (workspace acme-corp, 1247 contacts)
✅ Connector — Stripe OK
✅ MCP — gmailmcp.googleapis.com HTTP 405 (alive)
✅ Output paths ~/.claude-marketing/brands/{brand}/ writeable; ~/Documents/DigitalMarketingPro/ writeable
⚠️ Model curator registry is 102 days old — consider scripts/refresh_models.py
Decision: 🛑 BLOCKED — Slack connector not configured. Fix before running:
• /digital-marketing-pro:engagement
• /digital-marketing-pro:campaign-plan
• /digital-marketing-pro:launch-campaign
Re-run /digital-marketing-pro:validate-profile after fixing.
さらに、/digital-marketing-pro:check、/digital-marketing-pro:status、または後続の自動化処理で利用できるよう、機械可読な JSON サマリーも出力します。
{
"brand": "{slug}",
"decision": "blocked | passed | passed_with_warnings",
"blockers": [{"check": "connector_slack", "reason": "..."}],
"warnings": [{"check": "audience_persona", "reason": "reading_level missing"}],
"passed": ["required_identity", "voice_profile", ...]
}
動作ルール
- 認証情報の値を絶対に出力しないでください。 コネクタープローブでは
--no-secretsを使用します。プローブがエラー文字列に認証情報を誤って返した場合は、出力前にマスキングしてください。スキルの出力はログやクリップボードに残るため、漏えいするものとして扱ってください。 - 読み取り専用です。 ブランドプロファイル、認証情報、MCP 設定、永続状態は変更しないでください。これはチェッカーであり、修正ツールではありません。代わりに、実行可能な次のコマンドを提示してください。
- 途中で打ち切らないでください。 最初の BLOCKER が見つかった後も、すべてのチェックを実行してください。エージェンシーは、一度の実行ですべての対応項目を把握する必要があります。
- ブランドをまたいで検証しないでください。 設計上、対象はブランドごとです。すべてのブランドを巡回する処理は別のワークフローです(
/digital-marketing-pro:agency-dashboard --health)。 - 冪等にしてください。 このスキルを連続して 2 回実行しても、(タイムスタンプを除き)同じ出力になります。スキル内では再試行しません。再試行するかどうかはユーザーが判断します。
引数
/digital-marketing-pro:validate-profile [--brand <slug>] [--json] [--connectors <list>] [--quick]
--brand <slug>— 検証するブランド(指定がない場合はアクティブなブランドを使用)--json— 人間向けレポートを出力せず、JSON サマリーのみを出力します(コマンドの連結に便利です)--connectors <list>— プロファイル内のすべてのコネクターではなく、プローブする対象をカンマ区切りで指定します(Slack だけをローテーションした場合などに便利です)--quick— コネクターの到達可能性プローブを省略します(フィールドレベルのチェックのみ実行)
関連スキルとコマンド
brand-setup— 対話形式でブランドを作成しますimport-guidelines— 既存のブランドガイドラインをプロファイルに一括読み込みしますstatus— アクティブなブランドの統合された読み取り専用スナップショットcheck— 公開前のコンテンツ品質ゲートswitch-brand— アクティブなブランドを設定しますscripts/connector-status.py— 基盤となるコネクターのヘルスプローブscripts/resolve_model.py— モデルキュレーター(鮮度チェックで使用)