mcpField
C
canai-yolo

canai-yolo

github.com/usewp開発046 回インストール1 週間前に更新
リポジトリ

canai-yolo について

canai-yoloは、CanAI MCPツールを使ってFluentSnippets内のPHP、CSS、JSコードスニペットを管理するオプトイン型スキルです。スニペット操作とデプロイ時の保護策を扱い、明示的に依頼された作業に限って使用します。

主な機能

  1. 01スニペットの一覧表示と読み取り
  2. 02スニペットの作成と更新
  3. 03保護策を備えたスニペット公開
  4. 04ハッシュ確認付きのコード置換
  5. 05保存コードのハッシュとキャッシュ状態の確認
  6. 06CanAIの言語処理方法を説明

活用シーン

  1. 01サイト固有のスニペットを確認
  2. 02FluentSnippetsコードを作成または更新
  3. 03依頼されたPHPスニペットを公開
  4. 04スニペットの書き込みとキャッシュ状態を検証

MCP 対応

`{site}/wp-json/mcp/wpcanai`のCanAI MCPサーバーをAPIキーで利用します。FluentSnippetsを管理するツールを説明しており、プラグインが有効な場合にのみ登録されます。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/usewp/canai --skill canai-yolo

インストール後、Claude Code で/canai-yoloを入力して読み込まれたか確認します。

詳細

翻訳後に原文が更新されています。最新の内容は原文をご確認ください。

CanAI YOLO — FluentSnippets MCP ツール

高リスクです。オプトインが必要です。 このスキルでは、WordPress サイトに PHP を永続的に公開できる MCP ツールについて説明します。インストールして呼び出すのは、ユーザーがスニペットの作業を明示的に希望している場合のみにしてください。

テンプレート、ページ、i18n、メディア、設定、Tailwind には、代わりに canai-mcp を使用してください。ユーザーがこのスキルを求めていない限り、通常の /canai-mcp コンテンツセッションに YOLO ワークフローを混在させないでください。

トランスポートは canai-mcp と同じ CanAI MCP サーバー({site}/wp-json/mcp/wpcanai)と API キーを使用します。機能 ID にはスラッシュを使用し、MCP ツール名にはハイフンを使用します。


重要 — このスキルを使う場合

canai-yolo は、次の場合にのみ使用してください。

  1. FluentSnippets(easy-code-manager)— 専用の MCP ツールを使って、サイトの PHP、CSS、または JS スニペットを一覧表示、読み取り、作成、更新、公開します。

eval による回避策はありません。 wpcanai/eval 機能はプラグイン v1.59.0 で削除されました — WP.org は eval() を全面的に禁止しています — そして WPCANAI_ENABLE_EVAL は読み取られなくなりました。すべての機能は実際の機能として提供されており、代替手段はありません。ワークフローで eval が必要に思える場合は、その場で即興の対応をするのではなく、不足している機能をリクエストしてください。オプトインのアドオンプラグインが計画されています(specs/2026-08-20-canai-eval-addon-design.md)。


FluentSnippets(PHP/CSS/JS スニペット)

サイト固有の PHP、CSS、JS は、プラグインコードではなく FluentSnippets に保存されていることがよくあります。ツール:wpcanai-list-snippets、wpcanai-get-snippet、wpcanai-create-snippet、wpcanai-update-snippet、wpcanai-replace-in-snippet、wpcanai-set-snippet-status。説明は [fluent-snippets] / [fluent-snippets, filesystem] で始まります(書き込み後にサイトがページキャッシュを消去する場合は cache も付きます)。canai-mcp の ツールラベル を参照してください。

スキーマだけでは分かりにくい重要なルール:

  1. ツールが表示されるのは FluentSnippets が有効な場合のみです。 easy-code-manager が無効な場合、6 つのスニペットツールは登録されません。ツール一覧にも表示されません。

  2. 正規形式(プラグイン v1.80.0)。 PHP は <?php を付けずに本文として送信してください。先頭の <?php と空行は、書き込み時(拒否されるのではなく)および読み取り時に削除されます。末尾の改行は保持され、末尾の ?> は削除されます。sha256 / bytes / lines は、コードを get-snippet が返すとおりの状態で計算するため、比較するときはローカルファイルではなく、その文字列のハッシュを計算してください。css/js は独自の <style> / <script> タグで囲まないでください。PHP は保存前に構文チェックされ、1 回テスト実行されます。すでに存在する関数やクラスを再宣言してはならず(function_exists / class_exists で保護してください)、出力を表示したり、トップレベルで return したり、後から読み込まれるものを呼び出したりしてはなりません(フックを使用してください)。

  3. 作成時のステータスはデフォルトで下書きです。 wpcanai-create-snippet は、status: "published"(v1.80.0)を渡さない限り、下書きを作成します。この値を渡すと、まず PHP の構文チェックが行われ、構文エラーがある場合は何も書き込まれません。応答の status は読み戻された値です。Fluent Snippets 独自の auto_publish によって、下書きが公開状態に変更されることはあります。

  4. 書き込みが成功するのは、許可リストに登録されたグループのみです。 管理者は CanAI → AI Client → Guardrails → FluentSnippets group allowlist で、エージェントが書き込めるスニペットグループを指定します。許可リストが空(デフォルト)の場合、すべてのスニペット書き込みが拒否されます(snippet_writes_disabled)。許可リストにないグループへの書き込みは snippet_group_not_allowed を返します。ユーザーから別の指定がない限り、グループ AI を優先してください。読み取り(list / get)は、許可リストに関係なく常に許可されます。

  5. 更新は差分のみを指定します。 wpcanai-update-snippet には変更したいフィールドだけを送信してください。サーバーは現在のスニペットを読み込み、すべてのメタデータに変更をマージしてから書き戻します。フィールドを省略すると現在の値が保持されます。code のみを送信して group / priority / run_at / created_at を消去することはできません。

  6. run_at は種類によって異なります。 PHP → all|backend|frontend;php_content → shortcode|wp_head|wp_body_open|wp_footer|before_content|after_content;css → wp_head|admin_head|everywhere;js → wp_head|wp_footer|admin_head|admin_footer。無効な組み合わせは FluentSnippets の呼び出し前に拒否されます(invalid_snippet_type / invalid_run_at)。

  7. 上流の既知の問題(ここでは修正されていません)。 CSS の everywhere は管理画面では実際には読み込まれません(プラグインのタイプミスで everywehere)。また、PHP の frontend は適用されず、どこでも実行されます。どちらの値も FluentSnippets の UI で選択できるため、引き続き受け付けられます。判断に迷う場合は all / backend / wp_head を優先してください。

  8. 再有効化。 スニペットで致命的なエラーが発生すると、FluentSnippets によって自動的に無効化され、has_error が true になります。"reactivate": true を渡さない限り、そのスニペットの更新は拒否されます(snippet_has_error)。この値を渡すと、エラーが解除されて更新が適用されます。そのため、通常の編集によって、既知の問題があるコードが意図せず再び有効になることはありません。

  9. エラーには原因が示されます(v1.80.0)。 Fluent Snippets が拒否した保存は、"{title} on line {line}: {reason} Fix: {fix}" という形式でエラーメッセージに返されます。再試行する前に原因と修正方法を確認してください。同じコードを再送信しないでください。

wpcanai-update-snippet の group を使ってスニペットを別のグループに移動するには、現在のグループと移動先のグループの両方が許可リストに登録されている必要があります。

デプロイループ(プラグイン v1.80.0)

スニペットを再送信せずにライブ編集し、ブラウザーを使わずに確認します。

  1. 置換 — wpcanai-replace-in-snippet { "file_name", "replacements": [...], "require_all": true, "expected_sha256"?: "<sha256 from your last read>" }。require_all を指定すると、一致する箇所が見つからなかった場合は何も書き込まず、最も近い一致箇所を示します。expected_sha256 を指定すると、最後に読み取ってから誰かがスニペットを変更していた場合、hash_mismatch(409)で書き込みを拒否します。アンカーに確信がない場合は、まず dry_run: true を使用します。本文全体を書き換える場合は、引き続き wpcanai-update-snippet(同じ expected_sha256)を使用します。
  2. 確認 — レスポンスには、書き込み後に読み戻した、保存済みコードの sha256、bytes、lines が含まれます。sha256 を、想定するコードのハッシュ(上記の正規形式を使用)と比較します。後から、または別のセッションから wpcanai-get-snippet { "file_name", "fields": ["hash"] } を呼び出すと、コードを取得せずに同じフィールドを返します。
  3. キャッシュ — レスポンスの purged は、ページキャッシュのパージが保留中かどうかを示します。{ "scope": "all", "plugin": "…" } は、リクエストの終了時にサイト全体がパージされることを意味します(スニペットはすべてのページで実行されます)。null は、何もキューに追加されていないことを意味します。purged が null で、キャッシュプラグインが有効な場合(書き込み後のパージがオフの場合)、または書き込み対象外の URL をパージする場合に限り、wpcanai-purge-cache(canai-mcp 内)を呼び出します。
スニペットでのカスタム REST ルートの作成

エージェントは、FluentSnippets の PHP ルートと _canai_js の fetch を使って、ブラウザーから WordPress へのリレーを実装することがよくあります。スキーマだけでは分かりにくい点が 2 つあります。

  1. カスタム nonce を X-WP-Nonce(またはリクエストパラメーター _wpnonce)で送信しないでください。 WordPress コアの rest_cookie_check_errors() は、サイト全体のすべての REST リクエストで、この特定のヘッダー/パラメーターをインターセプトし、ルートの permission_callback が実行される前に、組み込みの 'wp_rest' アクションに対して検証します。この名前で送信されたカスタムアクション用 nonce は必ず rest_cookie_invalid_nonce で拒否され、独自の権限チェックの内容が分からなくなります。カスタム nonce アクションには、別のヘッダー名(例:X-<Your-App>-Nonce)を使用してください。

  2. ユーザー向けの文言を一般的なものにする場合でも、HTTP ステータス/エラーコードをクライアントに伝えてください(コンソールログ、またはページ上で区別できる状態として表示)。レート制限の 429、nonce の 403、実際の 500 はそれぞれ異なる障害です。これらを 1 つのメッセージにまとめると、本番環境のインシデントをトリアージできなくなります。

wpcanai-list-snippets
  • 引数: { "status"?: string, "type"?: string, "group"?: string, "include_hash"?: bool } — すべて省略可能なフィルターです(status:published|draft、type:PHP|php_content|css|js、group:グループ名)。(v1.80.0) include_hash: true を指定すると、スニペットごとに sha256、bytes、lines が追加されます(すべてのファイルを読み取るため、明示的に指定してください)。FluentSnippets が有効な場合にのみ表示されます。
  • 戻り値: { "snippets": [{ "file_name", "name", "type", "status", "run_at", "priority", "group", "tags", "description", "created_at", "updated_at", "has_error", "error_message", "writable" }], "groups": string[], "writable_groups": string[] } — writable はスニペットごとに示されます(そのグループが許可リストに含まれている場合)。writable_groups は現在の許可リストで、書き込みを試みる前に変更可能な対象を確認できます。読み取りに制限はありません。
wpcanai-get-snippet
  • 引数: { "file_name": string, "fields"?: ["meta"|"code"|"hash"] } — スニペットのファイル名(識別子。例:3-my-snippet.php)です。fields のデフォルトは 3 つすべてです。
  • 戻り値: メタデータ全体、code 本文、エラー状態、writable(code と condition を加えた list-snippets の行と同じフィールド)、および (v1.80.0) sha256、bytes、lines。fields: ["hash"] を指定すると、file_name、status、group、updated_at、sha256、bytes、lines のみを返します。コードを取得せずに書き込みを確認する場合に使用します。不明なファイルの場合は snippet_not_found エラーが返されます。
wpcanai-create-snippet
  • Args: { "name": string, "type": string, "run_at": string, "group": string, "code": string, "description"?: string, "tags"?: string, "priority"?: int, "status"?: "draft"|"published" } — name/type/run_at/group/code はすべて必須です。PHP の code に <?php は含めません(先頭にある場合は削除されます)。type/run_at はタイプテーブルに照らして検証されます。group は書き込み可能な許可リストに含まれている必要があります。status のデフォルトは draft です。published の場合は、まず PHP の lint が実行されます。
  • Returns: { "success": true, "file_name": string, "status": string, "group": string, "note": string, "sha256", "bytes", "lines", "purged" } — ファイル名は自動生成され(指定できません)、以降のすべての呼び出しでキーとして使われます。status は読み戻されます。ドラフトは後から wpcanai-set-snippet-status で公開できます。
wpcanai-update-snippet
  • Args: { "file_name": string, "code"?: string, "name"?: string, "description"?: string, "tags"?: string, "group"?: string, "run_at"?: string, "priority"?: int, "reactivate"?: bool, "expected_sha256"?: string } — file_name は必須です。変更するフィールドのみを送信してください(スパース — サーバーが現在のメタデータにマージします)。現在の group と、移動する場合は移動先の group も許可リストに含まれている必要があります。エラー状態のスニペットには reactivate: true が必要です。(v1.80.0) expected_sha256 を指定すると、古い内容への書き込みを hash_mismatch で拒否します(409。メッセージには両方のハッシュが含まれ、何も書き込まれません)。
  • Returns: { "success": true, "file_name": string, "changed_fields": string[], "sha256", "bytes", "lines", "purged" } — ハッシュフィールドは書き込み後に読み戻されます。
  • 公開済み PHP コードの更新: 以前は、公開済み PHP スニペットの code を更新すると、Cannot redeclare function で致命的なエラーが発生していました(FluentSnippets は、公開中のスニペットがすでに読み込まれている同じリクエスト内で検証を行います)。CanAI はこれを透過的に処理します。古いプラグインビルドでまだこのエラーが返る場合は、wpcanai-set-snippet-status で非公開にしてから更新し、再公開してください。
wpcanai-replace-in-snippet(plugin v1.80.0)
  • Args: { "file_name": string, "replacements": [{ "from": string, "to": string }], "require_all"?: bool, "ignore_whitespace"?: bool, "regex"?: bool, "scope"?: { "text": string, "occurrence"?: int }, "dry_run"?: bool, "expected_sha256"?: string } — canai-mcp の wpcanai-replace-in-meta の仕様をスニペットのコードに適用します。replace_no_match メッセージには同じ require_all の未一致診断が含まれ、ignore_whitespace/regex/scope/dry_run も同様に動作します。書き込みは update-snippet を通じて行われ(公開済み PHP は先に lint されます)、同じグループ許可リストが適用されます。
  • Returns: { "success", "file_name", "total", "dry_run", "replacements": [{ "from", "to", "count", "suggestion"? }], "sha256", "bytes", "lines", "purged"? } — dry_run の場合、ハッシュは現在のコードのもので、purged はありません。
wpcanai-set-snippet-status
  • Args: { "file_name": string, "status": "published"|"draft" } — スニペットの group は許可リストに含まれている必要があります。
  • Returns: { "success": true, "file_name": string, "status": string, "sha256", "bytes", "lines", "purged" }。FluentSnippets の両方のライフサイクルアクションを実行し、インデックスキャッシュを再構築して、公開済みスニペットを実際に実行します。

アクションルーター(簡易版)

目的ツール
FluentSnippets のスニペットを一覧表示/読み取るwpcanai-list-snippets / wpcanai-get-snippet
スニペットを作成/更新するwpcanai-create-snippet(status は任意) / wpcanai-update-snippet
スニペットの一部を編集する(デプロイループ)wpcanai-replace-in-snippet → sha256 を確認 → purged
コードなしで保存内容を確認するwpcanai-get-snippet { "fields": ["hash"] } / wpcanai-list-snippets { "include_hash": true }
スニペットを公開/非公開にするwpcanai-set-snippet-status

インストール

npx skills add usewp/canai --skill canai-yolo

同じ MCP エンドポイントでコンテンツを扱う場合は、canai-mcp と組み合わせてください。

コメント