mcpField
I
integration-eventing-cdc-configure

integration-eventing-cdc-configure

github.com/forcedotcomデータ・データベース1.1k5.2k 回インストール1 日前に更新
リポジトリ

integration-eventing-cdc-configure について

Salesforce の Change Data Capture メタデータを生成し、標準オブジェクトやカスタムオブジェクトの購読を設定するスキルです。カスタムチャネル、補完フィールド、フィルターを含め、Metadata API の命名規則と値形式に対応します。

主な機能

  1. 01チャネルメンバーのメタデータ生成
  2. 02カスタム CDC チャネルの定義
  3. 03補完フィールドの設定
  4. 04イベントフィルター式の追加
  5. 05Metadata API の命名規則への対応

活用シーン

  1. 01Salesforce オブジェクトの変更データキャプチャ購読
  2. 02各イベントへの参照先などのフィールド追加
  3. 03配信される変更イベントの絞り込み
  4. 04購読用カスタムチャネルの作成

インストール

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

$npx skills add https://github.com/forcedotcom/sf-skills --skill integration-eventing-cdc-configure

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

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

assets/
PlatformEventChannel-template.xml
PlatformEventChannelMember-template.xml
references/
deploy-troubleshooting.md
filter-expressions.md

詳細

Change Data Capture の有効化の管理

Salesforce オブジェクトを Change Data Capture に登録するメタデータを生成します。デフォルトの ChangeEvents チャネルまたはカスタムチャネル用の PlatformEventChannelMember ファイルと、新しいカスタムチャネル用の PlatformEventChannel ファイルが対象です。エンリッチメントフィールド、フィルター式、ならびに Metadata API が実際に受け付ける正規の名前と値の形式について説明します。これらは、多くの内部テスト用フィクスチャやコード検索結果に見られる値とは異なります。

対象範囲

  • 対象範囲内:CDC 用の PlatformEventChannelMember および PlatformEventChannel メタデータの生成。標準オブジェクト、カスタムオブジェクト、またはその両方の登録。エンリッチメントフィールドの設定。フィルター式の設定。カスタムデータチャネルの定義。
  • 対象範囲外:カスタムプラットフォームイベント(PE)の公開。これは別のメタデータ型(PlatformEvent)です。Pub/Sub API または外部 Kafka/Bayeux の設定。料金や上限に関する案内 — ユーザーにはCDC Developer Guideを参照するよう案内してください。Apex でのプログラムによるイベントバスのサブスクライバー。

確認事項

生成を始める前に、まだ明確でない場合はユーザーに確認してください。

  • CDC を有効にするエンティティはどれですか(複数可)?標準、カスタム、またはその両方ですか?
  • デフォルトチャネル(ChangeEvents)とカスタムチャネルのどちらですか?カスタムの場合、チャネルの表示ラベルは何ですか?
  • エンリッチメントフィールドは必要ですか?(値が変更されていない場合でも、コンシューマーが必要とする参照 ID です。)
  • フィルター式は必要ですか?(どの変更イベントを出力するかを制御する SOQL WHERE 句の本体です。)

必要な入力

作業を進める前に、以下を収集するか推定してください。

  • ソースエンティティの API 名 — 例:Account、Lead、Order__c。スキル内部でこれをChangeEvent エンティティ名に変換します(ワークフローの手順 2 を参照)。
  • チャネル — ChangeEvents(デフォルト)または、末尾が __chn のカスタムチャネルの開発者名。
  • エンリッチメントフィールド(任意) — すべての変更イベントに値を含めるソースオブジェクトのフィールド API 名のリスト。
  • フィルター式(任意) — 変更イベントのペイロード内のフィールドに対する述語(例:Status__c != null)。

特に指定がない場合のデフォルト:

  • チャネル:ChangeEvents(デフォルトの CDC チャネル — パスプレフィックスはありません)。
  • エンリッチメントフィールド:なし。
  • フィルター式:なし。

ユーザーの依頼が明確かつ完全であれば、不必要なやり取りをせず、ただちに生成してください。


ワークフロー

すべての手順を順番に実行してください。省略したり、順序を入れ替えたりしないでください。

何かを生成する前に、CDC で有効なメタデータ型が限られていることを把握してください。 CDC は、PlatformEventChannelMember(登録するエンティティごとに 1 つ)と PlatformEventChannel(カスタムチャネルの場合のみ)だけで表現されます。<ChangeDataCapture>、.changeDataCapture-meta.xml、changeDataCapture/ ディレクトリ、EnableChangeDataCapture、ManagedEventSubscription は使用しないでください。これらは CDC の対象範囲外です。これらのいずれかを書こうとしている場合は、そこで中止し、代わりに PlatformEventChannelMember ファイルを使用してください。

  1. チャネルを特定する — ユーザーがカスタムチャネルを指定した場合は、PlatformEventChannel ファイルを生成します(手順 4 を参照)。それ以外の場合は、デフォルトチャネルにリテラル値 ChangeEvents を使用します。

  2. ソースエンティティを ChangeEvent エンティティ名に変換する — <selectedEntity> はソースオブジェクトではなく、ChangeEvent 型です。

    ソースオブジェクト<selectedEntity> の値
    AccountAccountChangeEvent
    LeadLeadChangeEvent
    ContactContactChangeEvent
    Order__c(カスタム)Order__ChangeEvent
    MyThing__c(カスタム)MyThing__ChangeEvent

    標準オブジェクトの場合は、ChangeEvent を末尾に追加します。カスタムオブジェクトの場合は、末尾の __c を __ChangeEvent に置き換えます(ダブルアンダースコアはそのまま残します)。

  3. チャネルメンバーのファイルを生成します — (entity, channel) のペアごとに1つのファイルを作成します。ファイル名と fullName では、エンティティのステムと ChangeEvent の間にアンダースコアを1つだけ使用します — これは、XML 本文内での selectedEntity の形式とは無関係です。カスタムオブジェクトの場合、ファイル名を作成する際はソース名から __c を取り除きます。

    ソースオブジェクトファイル名(および fullName)<selectedEntity>(XML 内)
    AccountAccount_ChangeEvent.platformEventChannelMember-meta.xmlAccountChangeEvent
    LeadLead_ChangeEvent.platformEventChannelMember-meta.xmlLeadChangeEvent
    Order__cOrder_ChangeEvent.platformEventChannelMember-meta.xml(Order__ChangeEvent ではありません)Order__ChangeEvent
    MyThing__cMyThing_ChangeEvent.platformEventChannelMember-meta.xml(MyThing__ChangeEvent ではありません)MyThing__ChangeEvent

    カスタムオブジェクトの場合は間違いやすいので注意してください。ファイル名ではアンダースコアを1つ使い、selectedEntity ではアンダースコアを2つ維持します。構造のテンプレートとして assets/PlatformEventChannelMember-template.xml を読み込んでください。

  4. カスタムチャネルの場合は、PlatformEventChannel ファイルを生成します — メンバーがデフォルト以外のチャネルを参照する場合に必要です。ユーザーが指定したラベルから DeveloperName を作成します。スペースと英数字以外の文字を取り除き、キャメルケースに変換してから、必ずリテラルのサフィックス __chn を追加します。デプロイ時の Invalid channel name エラーを防ぐため、ファイル名とチャネルの <eventChannel> 参照には、この形式を正確に使用する必要があります。

    ユーザーの指定DeveloperNameファイル名
    Partner SyncPartnerSync__chnPartnerSync__chn.platformEventChannel-meta.xml(Partner_Sync... または PartnerSync... ではありません)
    Order UpdatesOrderUpdates__chnOrderUpdates__chn.platformEventChannel-meta.xml
    data syncDataSync__chnDataSync__chn.platformEventChannel-meta.xml

    このチャネルのメンバーは、同じ DeveloperName で参照します:<eventChannel>PartnerSync__chn</eventChannel>。assets/PlatformEventChannel-template.xml を読み込んでください。

  5. 要求された場合は、エンリッチメントフィールドを追加します — フィールドごとに <enrichedFields><name>FIELD_API_NAME</name></enrichedFields> ブロックを繰り返します。フィールド名は、ソースエンティティ上の1階層の API 名である必要があります。動作確認済みのフィールドは、標準の参照 ID(OwnerId、ParentId)、カスタム参照フィールド(MyLookup__c)、カスタムの非リレーションシップフィールド(Region__c、Status__c)です。Owner.Name や Parent.Account.Industry のようなリレーションシップのたどり方は、デプロイ時に「The selected field, X.Y, isn't valid」というエラーで拒否されます。

  6. 要求された場合は、フィルター式を追加します — 述語を <filterExpression>...</filterExpression> で囲みます。本体には WHERE キーワードを含めず、WHERE 句の条件部分を記述します(例:Status__c != null。WHERE Status__c != null ではありません)。サポートされている演算子、フィールド型、注意点については、references/filter-expressions.md を参照してください。


ルール/制約

制約理由
<selectedEntity> は ChangeEvent の型名であり、ソースオブジェクト名ではありませんMetadata API はメンバーを ChangeEvent エンティティに関連付けます。Account を直接渡すと、「invalid event in selectedEntity」というエラーで失敗します。
メンバーの fullName ではアンダースコアを1つ使います:Account_ChangeEventアンダースコアを2つ使う形式(Account__ChangeEvent)は <namespace>__<name> として解析され、「Cannot create a new component with the namespace: Account」というエラーで拒否されます。
デフォルトチャネルの値は ChangeEvents そのものです。パスのプレフィックスは付けません古いフィクスチャや一部のドキュメントには data/ChangeEvents と記載されていますが、その値ではデプロイ時に「Unable to find the specified channel」が返されます。
エンリッチメントフィールド名には、ソースエンティティ上の単一階層の API 名を使います標準フィールド(OwnerId)、カスタム参照フィールド(MyLookup__c)、カスタム非リレーションシップフィールド(Region__c)はいずれも検証に通ります。Owner.Name のようなトラバーサルは「The selected field, X.Y, isn't valid」というエラーで拒否されます。
<filterExpression> の本文に WHERE キーワードは含めませんデプロイ時に「filter expression has syntax errors: unexpected token: 'WHERE'」が返されます。
フィルターでは IsDeleted を参照できず、リレーションシップのトラバーサル(Owner.Username)もできませんデプロイ時に「field is invalid」というエラーで拒否されます。
DateTime フィールドのフィルターでサポートされるのは等価比較(=、!=)のみです。</> は使えませんデプロイ時に「Only equality operators are supported for this field type or value」が返されます。名前付き日付リテラルを使用してください:LastModifiedDate = TODAY。
フィルターの右辺にはリテラルを指定します。フィールド同士の比較はできませんBillingCity = ShippingCity は「unexpected token: 'ShippingCity'」を返します。
複合フィールド(例:BillingAddress)をフィルターで使うには、ドット付きのコンポーネントアクセスが必要ですBillingAddress.City = 'X' はデプロイされます。フラットな BillingCity は「field is invalid」として拒否され、BillingAddress をそのまま使うと「has to be used with a component field」として拒否されます。これは、フラットな名前を使う <enrichedFields> とは逆であることに注意してください。
カスタムチャネルのファイル名は、メタ XML のサフィックスの前に __chn を付けますSalesforce の MDAPI 命名規則です。一致しない場合、デプロイ時に曖昧さが生じます。
カスタムチャネル XML には <channelType>data</channelType> を含める必要がありますdata を指定しないと、CDC 用チャネルとして拒否されます(ストリーミング/イベントチャネル用には他のタイプもあります)。
ソースカスタムオブジェクトは、すでに存在しているか、同じトランザクションでデプロイされている必要がありますFoo__c の ChangeEvent エンティティは、Foo__c が存在するまで作成されません。そうでない場合、メンバーのデプロイは失敗します。
デフォルトの ChangeEvents チャネルに対して、PlatformEventChannel ファイルを生成してはいけませんデフォルトチャネルはシステムから提供されます。メンバーでは <eventChannel>ChangeEvents</eventChannel> で参照しますが、チャネルメタファイルが必要なのはカスタム(__chn)チャネルのみです。
PlatformEventChannelMember が受け付ける要素は4つのみです:<enrichedFields>、<eventChannel>、<filterExpression>、<selectedEntity><description>、<isActive>、<masterLabel>、その他の要素を追加すると、XML スキーマ検証で「Element {...} invalid at this location」というエラーが発生します。ドキュメントに記載されている4つの要素のみを使用してください。
PlatformEventChannel が受け付ける要素は2つのみです:<channelType> と <label><masterLabel>、<description> などを追加すると、「Element {...}masterLabel invalid at this location in type PlatformEventChannel」が発生します。<masterLabel> ではなく <label> を使用してください。
生成するのはメタデータファイルのみです。このスキルから sf project deploy start を実行してはいけませんこのスキルは成果物を生成します。デプロイは別のライフサイクルで行います。

よくある問題

問題解決方法
Unable to find the specified channel<eventChannel>ChangeEvents</eventChannel> を設定します(data/ のプレフィックスは付けません)。
The PlatformEventChannelMember can't be created because it references an invalid event in the "selectedEntity" fieldソースオブジェクトではなく、ChangeEvent 名を使います。Account ではなく AccountChangeEvent を指定します。
Cannot create a new component with the namespace: <Object>ファイル名のアンダースコアを1つにします。Account__ChangeEvent... ではなく Account_ChangeEvent... とします。
<enrichedFields> 内の The selected field, X.Y, isn't validOwner.Name を OwnerId に置き換えます。CDC が参照項目を自動的に拡充します。有効なのは、1段階の項目 API 名のみです。
filter expression has syntax errors: unexpected token: 'WHERE'WHERE キーワードを削除します。本文には述語のみを記述します。
The BillingCity field in the filter expression is invalid(またはフラット形式の Address 項目のエラー)複合項目のドット形式を使います。BillingCity ではなく BillingAddress.City を指定します。複合項目の全一覧については references/filter-expressions.md を参照してください。
カスタムオブジェクトのメンバーで「ChangeEvent doesn't exist」というエラーが発生するソースオブジェクトがまだデプロイされていません。Foo__c オブジェクトのメタデータが同じデプロイに含まれているか、組織内にすでに存在することを確認してください。
2回目のデプロイで DUPLICATE_VALUE が発生するメンバーはすでに登録されています。先に削除するか、処理をスキップしてください。CDC はメンバーの直接のアップサートをサポートしていません。
.changeDataCapture-meta.xml ファイルに対して sf infra error (TypeInferenceError, DeployMetadata): Could not infer a metadata type が発生するこのファイル拡張子とメタデータ型は存在しません。changeDataCapture/<Entity>.changeDataCapture-meta.xml ファイルを、platformEventChannelMembers/<Entity>_ChangeEvent.platformEventChannelMember-meta.xml ファイルに置き換えてください。
ユーザーが「subscribe Order__c」と言っているが、標準の Order を指している確認してください。標準の OrderChangeEvent とカスタムの Order__ChangeEvent は別のエンティティです。

出力の要件

成果物:

  • 登録するエンティティごとに1つの force-app/.../platformEventChannelMembers/<Entity>_ChangeEvent.platformEventChannelMember-meta.xml。
  • カスタムチャネルごとに1つの force-app/.../platformEventChannels/<DevName>__chn.platformEventChannel-meta.xml(該当する場合)。

ファイル構成は assets/ のテンプレートに従います。

生成されたファイルを受け取ったら、デプロイ前に sf project deploy start --dry-run -d <path> --target-org <alias> を実行して検証できます。ドライランで見慣れないエラーが発生した場合は、references/deploy-troubleshooting.md で一般的なデプロイエラーとメタデータ側の修正方法を確認できます。


スキル間の連携

必要な作業委任先
ソースとなるカスタムオブジェクトの生成platform-custom-object-generate スキル
拡充またはフィルターで参照するカスタム項目の生成platform-custom-field-generate スキル
変更イベントを利用するユーザー向けの権限セットの作成platform-permission-set-generate スキル

参照ファイル一覧

ファイル参照するタイミング
assets/PlatformEventChannelMember-template.xml手順3 — チャネルメンバーの開始構造
assets/PlatformEventChannel-template.xml手順4 — カスタムチャネルの開始構造
references/filter-expressions.md手順6 — フィルター式の記述時に、サポートされる演算子と項目型の一覧を確認する場合
references/deploy-troubleshooting.mdユーザーからドライランのデプロイエラーについて報告があり、原因の診断を求められた場合

コメント