サイトがマークアップを変更したり、アクセスをブロックし始めると、ウェブスクレイパーは動作しなくなります。brightdata-scrape Kiro Powerは、平易な言語のプロンプトからスクレイパーを作成し、アンブロッキングとパースを処理するBright DataのWeb MCPに対して実行します。このガイドでは、1つの再現可能なPowerパターンを4つのユースケースに適用し、そのうち2つはライブAPIの実行まで完結します。これには、ChatGPTがあなたのブランドに言及しているかを確認するユースケースも含まれます。
TL;DR
最終的には、4つのユースケースに適用できる1つのPowerパターンを習得できます。各ユースケースは1つの平易な言語プロンプトで動作し、そのうち2つはライブAPIの実行まで完結します:
- 小売価格トラッカー:AmazonとWalmartで1つの商品を追跡します。
- ブランド可視性モニター:AIアシスタントがあなたのブランドに言及しているかを確認します。
- LinkedInリードジェンパイプライン:見込み客リストの転職情報を監視します。
- Crunchbaseインテルダッシュボード:企業ごとに数十のライブフィールドを取得します。

Kiroエージェントは2つのライブツール呼び出しを行います(search_engine、次にscrape_as_markdown)。そして実際のAmazon価格$248を返します。
Kiro Powerとは?
KiroはAWSが構築したAI IDEです。Powerはマニフェスト、MCPサーバー設定、ステアリングファイル、コードテンプレートを含むフォルダ形式のKiro独自の拡張フォーマットです。Kiroはプロンプトによって起動されたときのみPowerをコンテキストに読み込みます。kiro.dev/powersの公式カタログを参照してください。Bright DataはGitHubでbrightdata-scrapeを別途公開しているため、直接インポートできます。
PowerはClaude Skillsと1つの重要な点で異なります:各PowerにはMCP(Model Context Protocol)サーバー設定がすでに含まれています。そのためエージェントは指示だけでなく、呼び出せる新しいツールを取得します。brightdata-scrapeの場合、そのサーバーはBright DataのWeb MCPです。
このエンドポイントはWeb Unlocker、SERP API、Browser API、およびBright Dataの事前構築済みデータセットカタログを提供します。Bright DataのMCPを使用すると、エージェントは1回のツール呼び出しでそれらを使用できます。これらのツール(search_engine、scrape_as_markdown、50のweb_data_* Proツール、scraping_browser_*、discover)は、かつて3つの別々の統合(プロキシ、SERP API、ブラウザファーム)が必要だったものを、1セットの認証情報と1つのリトライパターンに置き換えます。
brightdata-scrape Kiro Powerのインストール
プロジェクトのセットアップと接続確認には5つのステップがあります:
- Bright Data APIトークンを取得します。ユーザーとAPIキー → APIキーで、ユーザー権限を持つキーを追加し、有効期限を設定して値をコピーします。無料ティアにクレジットカードは不要です。
- Kiroをインストールし、プロジェクトを作成して開きます。Kiroをダウンロードしてインストールします。Powerが機能するにはプロジェクトが必要で、このガイドではNext.jsを使用します。プロジェクトを作成してKiroで
price-trackerフォルダを開きます:
npx create-next-app@latest price-tracker \
–typescript, app, tailwind, src-dir, use-npm
cd price-tracker
今は他に何もインストールする必要はありません。Kiroは後でフェーズ3で生成されたスクレイパーが必要とするパッケージを追加します。
- Powerをインストールします。Kiroのパネル(左のアクティビティバーのアイコン)を開きます。カスタムPowerを追加をクリックし、GitHubからPowerをインポートを選択して、このURLを貼り付けます:
https://github.com/brightdata/kiro-powers/tree/main/brightdata-scrape

- Kiroにトークンを渡します。Powerをインストールすると、プロジェクトの
.kiro/settings/mcp.jsonにURLhttps://mcp.brightdata.com/mcp?token=${BRIGHTDATA_API_KEY}を持つbrightdataサーバーが追加されます。そのファイルを開き、${BRIGHTDATA_API_KEY}をステップ1でコピーしたリテラルトークンに置き換えて保存します。次に.kiro/settings/mcp.jsonを.gitignoreに追加して、トークンがコミットされないようにします。
> なぜリテラルトークンで、${…}プレースホルダーではないのか?Kiroは現在mcp.json内の${VAR}を展開しません(既知の未解決の問題)。そのためプレースホルダーでは接続の代わりにConnection Failed / HTTP 404が返されます。
- 接続を確認します。MCPサーバーパネルを再度開きます。数秒後、
brightdataがそのツールの中にsearch_engineとscrape_as_markdownを含む接続済み状態として表示されます。これが必要なシグナルです。

次にプロジェクトルートに.env.localを作成し、同じトークンを入力します。トークンを2回貼り付けるのは意図的です:.kiro/settings/mcp.jsonのコピー(ステップ4)はビルド中にKiroをBright Dataに接続し、このコピーは実行時に生成されたアプリによって読み取られます。
BRIGHTDATA_API_KEY=... # 上記で生成したトークン
BRIGHTDATA_UNLOCKER_ZONE=... # 小売ビルドではプレースホルダーで問題なし;Web Unlockerユースケースの前に設定
新規アカウントの場合、またはWeb Unlockerユースケースを実行する前に、まずゾーン名を設定します。以下の4つのユースケースを本番環境にスケールするのWeb Unlockerゾーンの設定を参照してください。
4つのユースケースすべてで、プロンプトのみが変わります。4フェーズのワークフローは同じです。
Kiroの4フェーズワークフロー(4つすべてに共通のパターン)
Powerはすべてのプロンプトに対して同じ4つのフェーズを実行します。各フェーズは続行前にあなたの承認を待ちます:
- 検出と計画。Powerはワークスペースのマニフェスト(
package.json、pyproject.toml、Cargo.toml、go.modなど)とその中の依存関係を確認します。次に統合方法を選択します:ウェブフレームワークが見つかった場合はAPIルートを生成し、エージェントSDKが見つかった場合はエージェントツールを生成し、プロジェクトがライブラリの場合はモジュールを生成します。何をスクレイピングするか、アイテム数はいくつかを尋ねます。
- スクレイピングプレイブック。PowerはBright Dataのツールラダーを確認し、各ターゲットサイトに対して、あなたのティアで許可される最適なパスを選択します:Web Data Proツール(30以上のプラットフォームにわたる50の
web_data_*ツール、型付きフィールド、&pro=1が必要)→データセットトリガー(同じデータ、ポーリング、&pro=1不要)→Web Unlocker(ロングテールサイト向けのプロキシ+パース)→Browser API(ログイン/クリックフロー)→SERP API(検索結果)。

- 統合。Powerがファイルを生成します。以下の小売実行では4つのファイルが生成されました:スクレイパーモジュール、APIルート、ダッシュボードページ、そして
README.mdの新しい## ウェブスクレイピングセクションです。(.env.localにすでにAPIトークンがあったため、フェーズ3はそれをスキップしました。これはファイル安全ルールです:既存のファイルは上書きしません。)

- MCPと検証。PowerはBright DataのMCPサーバーを
.kiro/settings/mcp.jsonにマージし、ターゲットURLに対してスモークテストを実行します。このフェーズでは2つの本番セーフガードが実行されます:上書き前の差分確認と、FAIL → ITERATEリカバリーです。ユースケース1のフェーズ4でリカバリーの全容を示します。
ライブで実行したものと表示内容
ここに記載されているものはすべてライブAPIに対して検証済みであり、モックアップではありません。正確な価格、ツール、タイミングは特定のキャプチャされた実行から取得されています。スクレイパーはライブデータを読み取るため、あなた自身の結果はキャプチャされたものではなく、現在の価格、ページ、モデルの回答を反映します。
- ユースケース1と4はライブAPIに対して完全に実行されました:小売(Proスペンドゼロ)とCrunchbase(Proティア)。以下のすべての小売スクリーンショットはその実行から取得されており、ユースケース4の完全なコードはそのセクションに記載されています。
- ユースケース2と3は表示のみで再構築されていません:プロンプト、フェーズ2が選択するツール、各ツールに対してライブで検証したフィールド形状が示されています。ユースケース4の
callMcpToolクライアントを再利用するため、ほぼ同一のコードを再貼り付けする必要はありません。 - ユースケース2、3、4はProモード(
&pro=1)で実行されます。これは以下の本番へのスケールでカバーされています。
ユースケース1:マルチリテーラー価格トラッキング
Kiroへのプロンプトはこちらです:
Kiroへのプロンプト:「AmazonとWalmartのSony WH-1000XM5の価格をスクレイピングする価格比較エージェントを追加してください。」
フェーズ2の選択:キャプチャされたProゼロの実行では、Powerはデータセットトリガーパス(同じデータ、ポーリング)を選択しました。&pro=1の場合は、代わりにProツールweb_data_amazon_productとweb_data_walmart_productを選択します。
より多くの小売業者への拡張:同じパターンで、より広い小売業者リストでKiroを再プロンプトすることにより、web_data_ebay_product、web_data_homedepot_products、web_data_bestbuy_productsを追加できます。一部の小売業者(Best Buy、Target)では通常、ゾーンでプレミアムドメインを有効にする必要があります。キャプチャされた実行ではAmazonとWalmartは不要でした。
Kiroが生成したアーキテクチャ
ダッシュボードはマウント時にAPIを取得します。APIはBright Dataのデータセットトリガーを並列で呼び出し、構造化されたレコードを返します。
ブラウザが/を開く
│
▼ (マウント時に自動取得)
GET /api/scrape-prices
│
▼
src/scrapers/price-tracker.ts
fetchAllPrices()
│
▼ (Promise.allSettled, 並列)
┌────────────────────────────────────┐
│ Bright Data Datasets API │
│ gd_l7q7dkf244hwjntr0 → Amazon │
│ gd_l95fol7l1ru6rlo116 → Walmart │
└────────────────────────────────────┘
1つの読み取りパス:ダッシュボード → APIルート → スクレイパーモジュール → 2つのBright Dataデータセットトリガー。&pro=1の場合、スクレイパーモジュールは直接web_data_ MCP呼び出しになり、クライアント側のポーリングループがMCPサーバーに移動します。*
スクレイパーモジュール
src/scrapers/price-tracker.tsにはデータセットID、triggerAndPollヘルパー、そしてBright Dataのレスポンスを一貫したPriceResult形状にフラット化するnormaliseステップが含まれています。以下はファイルのコアで、完全なファイルは約85行です:
// src/scrapers/price-tracker.ts (抜粋)
const BASE = "https://api.brightdata.com/datasets/v3";
const DATASETS = { Amazon: "gd_l7q7dkf244hwjntr0", Walmart: "gd_l95fol7l1ru6rlo116" } as const;
async function triggerAndPoll(datasetId: string, url: string) {
// 1. ターゲットURLでPOSTトリガー
const trigger = await fetch(`${BASE}/trigger?dataset_id=${datasetId}&include_errors=true`, {
method: "POST",
headers: { Authorization: `Bearer ${process.env.BRIGHTDATA_API_KEY}`,
"Content-Type": "application/json" },
body: JSON.stringify([{ url }]),
});
const { snapshot_id } = await trigger.json();
if (!snapshot_id) throw new Error("no snapshot_id returned from trigger");
// 2. スナップショットエンドポイントをポーリング (進行中 = HTTP 202; ~120秒上限)
for (let i = 0; i < 24; i++) {
await new Promise((r) => setTimeout(r, 5000));
const res = await fetch(`${BASE}/snapshot/${snapshot_id}?format=json`,
{ headers: { Authorization: `Bearer ${process.env.BRIGHTDATA_API_KEY}` } });
if (res.status === 202) continue;
return await res.json();
}
throw new Error("snapshot timed out after 120s");
}
// 両方の小売業者を並列でトリガー;Promise.allSettledは小売業者ごとにエラーを分離し、
// 1つの不良スナップショットが他方を失敗させないようにします。完全なファイルは各settled結果を
// PriceResult(rejectされたものはerrorフィールドを持つ)にマップします。
export async function fetchAllPrices() {
return Promise.allSettled(
Object.entries(DATASETS).map(([retailer, id]) =>
triggerAndPoll(id, PRODUCT_URLS[retailer]).then((r) => normalise(r[0], retailer, PRODUCT_URLS[retailer]))),
);
}
KiroのチャットはライブMCPクライアントであり、メモリルックアップではない
ビルド中、Kiroのチャットパネルはコードが呼び出すのと同じbrightdataサーバーと通信します。Sonyの価格を尋ねられたとき、チャットはモデルのメモリから回答しませんでした。ライブのsearch_engineとscrape_as_markdown呼び出しを行い、テーブルを返しました(リファービッシュ品$195.55から新品$248、XM6比較$398):

チャットはビルド中に探索するための手段です。以下のダッシュボードはエンドユーザーが見るものです。
ダッシュボード
Kiroが生成したホームルート(/)は、APIが返すJSONを2つのカラーカード(Amazonオレンジ、Walmartブルー)と、2つのうち安い方を選ぶ緑の「最安値」バナーとしてレンダリングします:

ホームルート(/)ビュー。Sony WH-1000XM5がAmazonとWalmartの両方で$248と表示され、製品タイトル、在庫状態、各ソースから直接読み取られた小売業者ごとのタイムスタンプが表示されています。Walmartの生のin_stockとAmazonのIn Stockはそのまま渡されるため、各ソースが返す内容をそのまま確認できます。アラートを構築する際は、独自のスキーマに正規化してください。
生のページを自分で検査すると、Amazonの明白な価格セレクター(span.a-price-whole)は通常空を返し、実際のものは.a-price .a-offscreenです。WalmartはレンダリングされたHTMLに価格をまったく含めず、<script id="NEXT_DATA">内のJSONブロブに格納されています。上記のデータセットトリガーはBright Dataがサーバー側でページをパースし、型付きフィールドを返すため、両方の問題を回避します。
フェーズ4:URLが変わったときの自己修復
フェーズ4は、スモークテストが失敗したときにPowerが自動的に実行するリカバリールーティンです。キャプチャされた実行では、Amazonはクリーンなデータ($248, In Stock)を返しましたが、Walmartはすべてのフィールドがnullを返しました。Kiroは成功を宣言しませんでした。代わりに、生のレコードのerrorキー("dead page (404)")を読み取り、search_engineを呼び出して現在のWalmartのURLを見つけ、データセットを再トリガーし、ポーリングが停滞したときにscrape_as_markdownに切り替えました(Amazonと一致する$248を返しました)。そして生成されたスクレイパーにパッチを当てました:

フェーズ4は死んだWalmartのURLを検出し、ライブのURLを見つけ、スクレイパーを自動的にパッチします。18分54秒には再ポーリングされたデータセットジョブが含まれており、4.5クレジットはランタイムコストではなく一回限りのビルドフェーズコストです。
リカバリーループはエラーをスローするか、nullフィールドを返す失敗(死んだ404、再設計されたページ、スナップショットエラー)をキャッチします。しかし、まだ解決するが間違った製品を指しているURLはキャッチしません。例えば、Sony製ヘッドフォンからPS5リストに静かに変わったwalmart.com/ip/...のIDは、間違った製品に対して有効なデータを返します。このケースをキャッチするには、ハードコードされたIDの代わりに検索駆動のURLが必要です(以下の本番へのスケールセクションでカバーされています)。
フェーズ2、4のキャプチャされたコスト(各スクリーンショットに表示):0.38 → 1.38 → 4.5クレジット(累計)。これらはKiro IDEのビルド時クレジットで、コードを書く際のエージェントの使用量であり、Bright Dataの請求とは別です。このキャプチャされた実行の合計コストは4.5クレジットでしたが、その大部分は一回限りのフェーズ4の自己修復によるものです。リカバリーなしのクリーンなビルドは約2クレジットです(自己修復なしの実行をキャプチャしていないため推定)。
本番セーフガード:自己修復、サイレント上書きなし、CI検証済みテンプレート
ユースケース1では、フェーズ4が死んだWalmartのURLをキャッチし、成功を宣言することを拒否しました。その動作は各実行で即興されるものではありません。Powerのステアリングファイルに組み込まれた本番ルールから来ています。以下はそれらのルールの完全なセットです:
- ファイル安全(フェーズ3)。Powerは既存のスクレイパーを上書きせず(
_2.tsを提案)、置き換える代わりにREADME.md/.env.exampleに追記し、書き込み前にCREATE/MODIFYリストを表示します。 - MCP設定マージ(フェーズ4)。Powerは
.kiro/settings/mcp.json内の既存のbrightdataエントリを検出し、URLが異なる場合は差分を表示し、置き換える前に確認を求めます。サイレント上書きはありません。 - スモークテストFAIL → ITERATE。MCPを接続した後、Powerはターゲットに対してスクレイパーを実行します。空、null、またはエラーの場合、ステアリングは文字通り「フェーズ2に戻る…成功を宣言しないこと。」と指示します。
- CI検証済みテンプレート(49テスト合格)。
validate_power.pyとtest_validate_power.pyはフロントマター、MCP設定、ステアリング、テンプレートの存在を確認します。ライブサイトに対して生成されたコードをテストするわけではありません。それはプロジェクトごとのフェーズ4スモークテストの役割です。 - 自動ゾーンプロビジョニング。MCPサーバーは
/zone/get_active_zonesを呼び出し、最初の実行時に不足しているゾーンを作成します。そのため新規アカウントでもWeb Unlockerゾーンを手動で作成する必要はありません。
ユースケース2:GEOブランド可視性モニター
可視性の問題。購入者はセールスと話す前にLLMの回答ページ(ChatGPT、Grok、Perplexity)でショートリストを形成することが増えているため、上位3位以外では多くの購入者に見てもらえない可能性があります。問題は、従来のブランドモニタリングツール(PR、ソーシャルリスニング、SEO)がLLMの回答を監視するために構築されていないため、自分のランクを確実に把握できないことです。
Kiroへのプロンプト:「ChatGPT、Grok、Perplexityが私の5つの優先購買クエリにどう回答しているかをスクレイピングし、私のブランドが言及されなくなったときにアラートを出すブランド可視性モニターを追加してください。」
GEOツールとその返値
このユースケースのProツール:フェーズ2はgeoグループを選択します:web_data_chatgpt_ai_insights、web_data_grok_ai_insights、web_data_perplexity_ai_insights。各ツールはそれ自体がエンジンであり(エンジンセレクターはありません)、単一のprompt引数を受け取り、レンダリングされたLLMの回答をマークダウンとして返します。エンジンごとに1つのツールで、今日の購入者が使用する3つの主要な回答ページをカバーします。ChatGPTだけではありません。
フェーズ3が生成するもの:各web_data_*ツールを単一の{ prompt }で呼び出し、そのanswer_text_markdownを収集するsrc/scrapers/brand_visibility.tsモジュールです。ChatGPTとPerplexityはインラインで返し、Promise.allで一緒に実行されます。GrokはMCPポーリングウィンドウを超えて実行され、非同期に返されることが多いため、別の非ブロッキングパスに置かれます。ブロッキング呼び出しではなく、結果整合性として扱ってください。
ライブレスポンス形状はこちらです。web_data_chatgpt_ai_insightsとweb_data_perplexity_ai_insightsの両方から直接キャプチャされ、プロンプト「ミッドマーケットSaaS向けの最良のCDPは何ですか?」を使用しました。両方とも同じ単一フィールド形状を返しました(Grokの非同期呼び出しは9分のポーリングを超えて実行されました):
{
"answer_text_markdown": "For most **mid-market SaaS companies (roughly 50,1,000 employees)**, the answer depends less on \"which CDP is best\" than on your data-stack maturity. My ranking: 1) [Hightouch](https://hightouch.com?utm_source=chatgpt.com) , warehouse-native; 2) [Twilio Segment](https://segment.com?utm_source=chatgpt.com) , all-in-one; 3) [RudderStack](https://www.rudderstack.com?utm_source=chatgpt.com) , engineering-led..."
}
ツールはモデルの回答を単一のanswer_text_markdown文字列として返します。事前にパースされたブランドランキングとして返すわけではありません。ブランド抽出ステップはあなたの担当です。単純な最初のアプローチはマークダウンに対する単純なincludes()チェックですが、大文字小文字、名前のバリアント、別の単語の中にブランドが現れるケースを見逃します。実際の使用には、マークダウンを安価なLLM呼び出しに渡し、ランク付きリストを要求してください。

アラートループと導入対象
アラートループの仕組み:エンジンごとに1日1行のanswer_text_markdownを保存し、ブランドが現れているかどうか(およびどこに)を抽出し、以前に含まれていた回答からブランドが消えたときにアラートを送り、最後にブランド存在フラグ付きの今日の回答の3エンジングリッドをレンダリングします。
アラートを設定する前に注意点があります:LLMの回答は非決定論的であるため、同じプロンプトでも実行ごとにブランドのランク付けが異なる場合があります。1日1回のフェッチは1つのサンプルであり、安定したシグナルではないため、1日ブランドが消えるのはノイズであることが多く、本当の変化ではありません。ドロップを本物として扱う前に、各プロンプトを数回サンプリングするか、数日間にわたって平滑化してください。
導入対象:B2B SaaSのマーケティングおよびDevRelチーム、LLMカバレッジを追加するブランドモニタリングエージェンシー、モデル出力ドリフトを追跡するAI/ML研究者向けです。使用量は5つのプロンプトを3つのエンジンで毎日ポーリングする計算で、月約450回の呼び出し、つまり従量課金制で月約$0.68となります。
ユースケース3:LinkedInリードジェンパイプライン
B2Bの問題は、50人の営業見込み客(または候補者、パートナープログラムの連絡先)の転職、会社の移動、昇進を追跡しなければならないことです。通常の解決策はLinkedIn Sales Navigatorと手動レビューワークフローです。構造化データオプションは、見込み客ごとに1回のMCP呼び出しを毎日ポーリングすることです。
Kiroへのプロンプト:「これら50人のLinkedIn見込み客の転職、会社の移動、昇進を監視してください。何か変化があったときにCRMに通知してください。」
LinkedInツールとその返値
このユースケースのProツール。フェーズ2はsocialグループ内のLinkedInクラスターを選択します:web_data_linkedin_person_profile、web_data_linkedin_company_profile、web_data_linkedin_job_listings、web_data_linkedin_people_search。
フェーズ3が生成するもの(フィールド名はツールに対してライブで検証済み):
// src/scrapers/linkedin_prospects.ts (抜粋)
import { callMcpTool } from "@/lib/mcp-client"; // KiroはフェーズPhase 3でこのMCPクライアント呼び出しを生成します。インストール可能なパッケージではありません
interface ProspectSnapshot {
url: string;
current_company_name: string; // current_companyはネストされたオブジェクト;*_nameが文字列
position: string; // 役職フィールド。「current_title」はありません
location: string;
followers: number;
}
type Change = { field: string; from: string; to: string };
export const snapshotProspect = (url: string) =>
callMcpTool("web_data_linkedin_person_profile", { url }) as Promise<ProspectSnapshot>;
// 今日と昨日を差分比較;移動したフィールドのChangeを出力。
export function diffProspect(prev: ProspectSnapshot, now: ProspectSnapshot): Change[] {
return (["current_company_name", "position"] as const)
.filter((f) => prev[f] !== now[f])
.map((f) => ({ field: f, from: prev[f], to: now[f] }));
}
完全なレコードは30以上の型付きフィールドを返します。current_company(オブジェクト)、experience[]、education[]、about、followers、connections、city、country_codeなどが含まれます。
CRM通知ループと導入対象
CRM通知ループの仕組み:見込み客ごとに昨日のスナップショットを保存し、バックグラウンドワーカーから1日1回今日のフェッチと差分を実行し、CRMのウェブフック(Salesforce、HubSpot、Attio、Bright DataのMCPではない)に変更をPOSTします。
導入対象:B2B営業、採用、RevOps、パートナープログラムマネージャー向けです。使用量は50人の見込み客を毎日ポーリングする計算で、月約1,500回の呼び出し、PAYGで月約$2.25となります。
ユースケース4:競合情報ダッシュボード
コーポレート開発と戦略の問題はこうです:チームは競合他社と買収ターゲットのウォッチリストで、資金調達ラウンド、人員変化、モメンタムシフトを追跡しなければなりません。一般的なベースラインは手動のCrunchbase更新とスプレッドシートワークフローです。構造化データオプションは、企業ごとに1回のMCP呼び出しを毎週ポーリングすることです。
Kiroへのプロンプト:「Crunchbaseでこれら30の競合他社を追跡してください。いずれかがラウンドを調達したり、従業員数バンドを超えたり、成長ランキングが急上昇したときにアラートを送ってください。」
Crunchbaseツールとその返値
フェーズ2で選択されるProツール:Powerはweb_data_crunchbase_company(businessグループ)を選択します。ライブで検証済みで、企業ごとに93の型付きフィールドを返します。funds_raised、num_funding_rounds、acquisitions、exits、num_employees、cb_rank、growth_score、heat_score、founders、built_with_tech、ipo_status、regionなどが含まれます。
フェーズ3が生成するもの:
// src/scrapers/competitor_intel.ts
import { callMcpTool } from "@/lib/mcp-client"; // KiroはフェーズPhase 3でこのMCPクライアント呼び出しを生成します。インストール可能なパッケージではありません
interface CompanySnapshot {
name: string;
num_employees: string; // バンド、例:"5001-10000"
cb_rank: number; // Crunchbaseランク(低いほど著名)
growth_score: number; // 0-100
heat_score: number; // 0-100 モメンタムシグナル
funds_raised: unknown[]; // 資金調達/投資イベントの配列
ipo_status: string; // "private" | "public" | ...
region: string;
url: string;
}
type Alert =
| { kind: "headcount_band"; from: string; to: string }
| { kind: "new_funding_event"; count: number }
| { kind: "growth_surge"; from: number; to: number };
// MCPの行は型なしで届くため、追跡するフィールドだけを型付きCompanySnapshotにマップ
export async function snapshotCompany(url: string): Promise<CompanySnapshot> {
const row = await callMcpTool<Record<string, unknown>>("web_data_crunchbase_company", { url });
return {
name: String(row.name ?? ""),
num_employees: String(row.num_employees ?? ""),
cb_rank: Number(row.cb_rank ?? 0),
growth_score: Number(row.growth_score ?? 0),
heat_score: Number(row.heat_score ?? 0),
funds_raised: Array.isArray(row.funds_raised) ? row.funds_raised : [],
ipo_status: String(row.ipo_status ?? ""),
region: String(row.region ?? ""),
url,
};
}
export function detectMoves(
prev: CompanySnapshot, now: CompanySnapshot,
): Alert[] {
const alerts: Alert[] = [];
if (now.num_employees !== prev.num_employees) {
alerts.push({ kind: "headcount_band", from: prev.num_employees, to: now.num_employees });
}
if (now.funds_raised.length !== prev.funds_raised.length) {
alerts.push({ kind: "new_funding_event", count: now.funds_raised.length - prev.funds_raised.length });
}
if (now.growth_score - prev.growth_score >= 5) {
alerts.push({ kind: "growth_surge", from: prev.growth_score, to: now.growth_score });
}
return alerts;
}
ライブサンプル。Stripeに対するweb_data_crunchbase_companyへの実際の呼び出しは、num_employees: "5001-10000"、cb_rank: 300、growth_score: 98、heat_score: 60、ipo_status: "private"、region: "California"、および投資イベントが入力されたfunds_raised配列を返しました。

Powerは4つのファイル(上記のスクレイパー、以下のクライアント、APIルート、ダッシュボードページ)を生成し、生成されたコードはTypeScriptエラーゼロでコンパイルされました。BRIGHTDATA_API_KEYを設定してライブMCPに対して実行すると(ライブスクレイプで約58秒)、上記のStripeレコードが返され、これがレンダリングされました:

ホームルート(/)、上記のStripeレコードを返した同じweb_data_crunchbase_company呼び出しからライブでレンダリングされています。
自分で実行するには、サンプルリポジトリをクローンしてください:git clone https://github.com/triposat/crunchbase-intel-demo && cd crunchbase-intel-demo && npm install && cp .env.example .env.local、Proが有効なトークンを貼り付けて、npm run devを実行します。(&pro=1はすでにリポジトリのmcp-client.tsに含まれています。Proモードが有効なアカウントが必要です。)
共有MCPクライアント
スクレイパーがインポートするcallMcpToolは、Powerがフェーズ3で生成する薄いMCPクライアントです。GEOとLinkedInモジュールが再利用するために書かれているのと同じものです。完全なコードはこちらです:
// src/lib/mcp-client.ts , callMcpToolが解決するクライアント
const MCP_URL = `https://mcp.brightdata.com/mcp?token=${process.env.BRIGHTDATA_API_KEY}&pro=1`;
async function post(body: unknown, sessionId?: string) {
const headers: Record<string, string> = {
"Content-Type": "application/json",
Accept: "application/json, text/event-stream",
};
if (sessionId) headers["mcp-session-id"] = sessionId;
return fetch(MCP_URL, { method: "POST", headers, body: JSON.stringify(body) });
}
// サーバーはSSEとして返信:各`data:`行に1つのJSONオブジェクト
function parseSse(text: string) {
if (!text.includes("data:")) {
try { return [JSON.parse(text)]; }
catch { throw new Error(`MCP returned a non-JSON response: ${text.slice(0, 120)}`); }
}
return text.split("\n").filter((l) => l.startsWith("data:"))
.map((l) => { try { return JSON.parse(l.slice(5).trim()); } catch { return null; } })
.filter(Boolean);
}
export async function callMcpTool<T = unknown>(name: string, args: Record<string, unknown>): Promise<T> {
// 1. 初期化 , セッションIDがレスポンスヘッダーとして返される
const init = await post({ jsonrpc: "2.0", id: 1, method: "initialize",
params: { protocolVersion: "2024-11-05", capabilities: {}, clientInfo: { name: "intel", version: "1.0" } } });
if (!init.ok) throw new Error(`MCP connection failed: HTTP ${init.status} ${init.statusText}. Check BRIGHTDATA_API_KEY.`);
const sessionId = init.headers.get("mcp-session-id") ?? undefined;
await init.text();
// 2. 初期化を確認、次に 3. ツールを呼び出す
await post({ jsonrpc: "2.0", method: "notifications/initialized", params: {} }, sessionId);
const res = await post({ jsonrpc: "2.0", id: 2, method: "tools/call", params: { name, arguments: args } }, sessionId);
if (!res.ok) throw new Error(`MCP tool call failed: HTTP ${res.status} ${res.statusText}.`);
const reply = parseSse(await res.text()).find((m: { id?: number }) => m?.id === 2);
if (reply?.error) throw new Error(`MCP error: ${reply.error.message}`);
const text = reply?.result?.content?.find((c: { type: string }) => c.type === "text")?.text;
const payload = text ? JSON.parse(text) : reply?.result;
return (Array.isArray(payload) ? payload[0] : payload) as T;
}
そのファイルをsrc/lib/に置けば、上記のCrunchbaseスクレイパーは実行準備完了です。
ウォッチループと導入対象
ウォッチループの仕組み:企業ごとに先週のスナップショットを保存し、今週のスナップショットと先週のものを差分比較し、資金調達イベント、人員バンドの超過、成長スコアの急上昇を戦略Slackチャンネルに投稿します。使用量は30社を毎週ポーリングする計算で、月約120回の呼び出し、PAYGで月約$0.18となります。
導入対象:コーポレート開発、競合情報、戦略、VC/PEディールチーム、アカウントインテルを構築する営業担当者向けです。これらのチームは小売ボリュームよりもデータの深さを必要としています。手動で収集していた企業ごとの93の構造化フィールドが必要だからです。
4つのユースケースを本番環境にスケールする
生成されたスクレイパーはTypeScriptエラーゼロでコンパイルし、ライブAPIに対して実行されます(上記の小売とCrunchbaseの実行)。これらの変更で本番スケールに対応し、実際のワークロードに必要なバックグラウンドジョブ、スナップショットテーブル、ボリューム設定を追加します:
- Proツールに切り替えます。
.kiro/settings/mcp.jsonのMCP URLに&pro=1を追加してhttps://mcp.brightdata.com/mcp?token=<your-token>&pro=1となるようにし、サーバーを再起動します。(token=がすでにクエリ文字列を開いているため、先頭の&に注意してください。)フェーズ2はデータセットトリガーの代わりにweb_data_*ツールを選択します。ポーリングは通常数秒に短縮され、パースは型付きフィールドの読み取りになります。フラグは2箇所に入ります:Kiroのエージェントがproツールを見られるように.kiro/settings/mcp.json、そして実行中のアプリがそれらを呼び出せるように生成されたアプリのsrc/lib/mcp-client.ts。 - Web Unlockerゾーンを設定します。Web UnlockerパスはBRIGHTDATA_UNLOCKER_ZONEを読み取り、ゾーンにはアカウント固有の名前(
web_unlocker、mcp_unlocker、web_unlocker1など)があります。Webアクセスダッシュボードで正確な名前を見つけ、.env.localに設定します。名前が一致しないとzone not foundでHTTP 400が返されます。新規アカウントでは、MCPサーバーが最初の呼び出し時にゾーンを自動プロビジョニングするまでテーブルが空の場合があります。2つのゾーンが表示された場合は、無料ティアとマークされているものを選択します。 - ポーリングをリクエストパスから外します。実行では、単一レコードの
web_data_*トリガーは約10〜90秒で返り、複数レコードは数分かかりました。レイテンシは変動し、GrokのようなLLM回答ツールはポーリングウィンドウをはるかに超えて実行される場合があります。MCPサーバーはタイムアウト前に数分間ポーリングを続けます(POLLING_TIMEOUT環境変数で上限を設定)。本番環境では、バックグラウンドワーカー(Vercel Cron、Inngest、Trigger.dev)からトリガーを実行し、スナップショットテーブルに書き込みます。ダッシュボードはライブスクレイプではなくテーブルから読み取ります。(MCP外部の直接データセットAPIはプッシュが必要な場合にウェブフック配信をサポートします。notifyとendpointパラメーターで設定します。Bright Dataのトリガーコレクションドキュメントを参照してください。) - バッチ+スコープ。
scrape_batchとsearch_engine_batchは1回の呼び出しで複数のURLを実行し、URLごとのトークンオーバーヘッドを削減します。MCP URLに&groups=ecommerce,social,geo,businessを追加すると、ユースケースに必要なツールグループのみが読み込まれ、エージェントが読み取るツールリストのハンドシェイクが縮小されます。11のグループはecommerce、social、finance、business、research、app_stores、travel、geo、code、browser、advanced_scrapingです。 - クロススタックテンプレート。Powerには22の本番テンプレートが含まれています:TSのウェブフレームワークルート(Next、Express、Fastify、Hono、Koa)とPython(FastAPI、Flask、Django)、エージェントSDKツール(Anthropic、OpenAI、LangChain、Vercel AI SDK、Mastra)、汎用モジュール(TSフェッチ + Cheerio、Python stdlib + BeautifulSoup、ユニバーサル
curl.sh)。Kiroはマニフェストで7つの言語を検出して一致するものを選択しますが、ファーストクラスのコード生成はTSとPythonのみです。Go、Rust、Ruby、Java、PHPは検出されてcurl.shフォールバックにルーティングされます。 - ハードコードではなく検索駆動のURL。ハードコードされたURLはリスティングIDのローテーションで壊れる場合があります。古いIDがまだ解決するが間違った製品を指している場合(ユースケース1のリカバリーループがキャッチできないPS5対ヘッドフォンの失敗)。組み込みの修正は、URLではなくディスカバリーモードでデータセットをトリガーすることです。データセットトリガーボディを
[{ url }]からディスカバリークエリ(discover_by=keyword、category_url、またはbest_sellers_url)に交換し、Bright Dataが現在の製品を見つけるようにします。ディスカバリーリクエスト形状についてはBright Dataのトリガーコレクションドキュメントを参照してください。 - ログインフロー+ステアリング。Browser APIはARIAスナップショットインターフェース(Playwright-MCPスタイルのrefs)を使用して認証壁のあるサイトを処理し、エージェントの使用に設計されています。フォークせずにPowerの組み込みステアリングをオーバーライドするには、ワークスペースに
.kiro/steering/<your-domain>.mdを追加します。ソースが公式APIを公開している場合はそれを使用してください。

&pro=1を設定してMCPパネルを再度開くと、完全なツールカタログが表示されます:

次のステップ
1つのPowerが単一のMCPエンドポイントから4つのユースケースすべてを駆動するため、スクレイパーの配管ではなく統合とアラートロジックに時間を費やせます。
自分で小売トラッカーを構築してください。KiroのカスタムPowerを追加 → GitHubからPowerをインポートにhttps://github.com/brightdata/kiro-powers/tree/main/brightdata-scrapeを貼り付けて、ユースケース1のプロンプトを実行します。実行では20〜30分かかり、Proスペンドゼロで、インストールと4フェーズのワークフローの両方を確認しました。急いでいる場合は、代わりに完成したアプリをクローンしてください:git clone https://github.com/triposat/retail-price-tracker && cd retail-price-tracker && npm install && cp .env.example .env.local、無料のBright Dataトークンを追加して、npm run devを実行します。
次に書き直しではなく再プロンプトでスケールします。.kiro/settings/mcp.jsonに&pro=1を追加し、従量課金制で上記の3つのProティアプロンプト(GEO、LinkedIn、またはCrunchbaseインテル)のいずれかを実行します。新しいコードは不要で、同じPowerに対する新しいプロンプトだけです。
さらに詳しく:完全なツールリストのWeb MCPページ、および同じツールをインタラクティブに使用するBright DataのKiroチャットワークフロー記事。
よくある質問
無料のものと有料のものは?
無料:Web MCPの5つの基本ツール(search_engine、search_engine_batch、scrape_as_markdown、scrape_batch、discover)が無料で利用でき、月5,000リクエストがコストなしで提供されます(Bright DataのMCP READMEより)。有料:Proのweb_data*ツールは有料で、小売ビルドが使用するデータセットトリガーパスも有料です。これはBright DataのデータセットAPIを直接呼び出し、最初の約1,000レコードの無料トライアルの後、約$1.50/1,000レコードで請求されます。そのため、1回の実行で数製品をスクレイピングするコストは通常数セントの端数となります。
Proツールのコストは?
Proのweb_data_*ツールはプランによって1,000結果あたり$1.00〜$1.50のコストがかかります(Bright Dataの価格ページ):
| プラン | 1,000結果あたりの価格 |
|---|---|
| 従量課金制 | $1.50 |
| スターター | $1.30 |
| プロフェッショナル | $1.10 |
| ビジネス | $1.00 |
単一エンティティのPro呼び出し(1回のLLM回答フェッチ、1つのLinkedInプロフィール、または1つのCrunchbase企業)の場合、月次推定は1回の呼び出し = 1つの請求結果を前提としており、これは単一レコードのweb_data_*ツールに対するBright Dataの使用量ベース請求と一致します。web_data_amazon_product_searchのような一括検索ツールの場合、結果ごとのカウントは返されるアイテムに応じてスケールします。プロトタイプ作成中はlimitパラメーターを使用し、予算を立てる前にアカウントの現在のレートを確認してください。
Browser APIは帯域幅$5〜8/GBで別途請求されます。AIエージェントレイヤーを追加する場合、LLM呼び出しごとにAnthropic、OpenAI、またはGoogleの価格も適用されます。
GPTまたはGeminiで動作しますか?
はい、brightdata-scrape PowerはAnthropicだけでなく、OpenAI(GPT)とGoogle(Gemini)でも動作します。エージェントレイヤーのためにKiroにプロンプトを出す(「これらのスクレイパーをツールとして使用する/api/agentルートを追加してください」)と、プロジェクトの依存関係に基づいて一致するツールテンプレート(Anthropic SDK、OpenAI SDK、LangChain、Mastra、またはVercel AI SDK)を選択します。生成されたルートのanthropic(...)をopenai(...)またはgoogle(...)に置き換え、プロバイダーのクライアント設定とモデルIDを一致するように調整します。
ログインが必要なサイトをスクレイピングできますか?
brightdata-scrape Powerはログインが必要なサイトをスクレイピングできますが、データセットトリガーのデフォルトからではありません。ステートフルセッションにはBrowser APIに切り替え、独自の認証情報ストレージを追加します。PowerのフェーズPhase 2ラダーはログインとクリックフローのためにBrowser APIにエスカレートします。
4つのユースケースすべてを1つのプロジェクトで実行できますか?
はい。各ユースケースは独立したモジュール(独自のsrc/scrapers/ファイル、APIルート、ビュー)であり、同じMCPサーバーを再利用するため、4つすべてが1つのNext.jsプロジェクトに共存できます。このガイドでは4つを1つのアプリに統合していません(2つのライブビルド、小売とCrunchbase、は別々のデモリポジトリで、GEOとLinkedInはプロンプトとして示されています)が、そうすることを妨げるものは何もありません。
Claude CodeまたはCursorから使用できますか?
Claude CodeまたはCursorの場合は、brightdata-scrape Kiro Powerの代わりにBright DataのClaude Skillsを使用してください。Bright Dataはgithub.com/brightdata/skillsでスクレイピングSkills(scraper-builderやscrapeなど)を公開しており、Claude Code、Cursor、またはSkillsをサポートする任意のエージェントホストで実行されます。同じBright Dataインフラで同様のスクレイピングジョブをカバーしますが、このPowerのMCPとNext.jsのコード生成ではなく、Skillsとbdata CLIとしてパッケージ化されているため、インストールと生成されたコードが異なります。