SEO Console について
SEO と製品発見データの分析向け MCP サーバーで、Search Console、PageSpeed、アプリストア、Google Ads、WordPress.org、Core Web Vitals のツールを提供します。一部の監査やキーワード機能は Google サービスアカウント不要で、コマンドライン実行やスナップショット比較にも対応します。
主な機能
- 01Search Console と PageSpeed データの取得
- 02ページ内 SEO 監査とキーワード提案
- 03App Store と WordPress.org 情報の取得
- 04Google Ads と Core Web Vitals データの利用
- 05複数ソースのスナップショット保存と比較
活用シーン
- 01サイトの SEO 課題を確認して改善を計画
- 02アプリストア掲載情報の経時比較
- 03検索実績と実ユーザーの Web 指標を分析
MCP 対応
SEO と製品発見に関するツールを stdio MCP サーバーとして提供し、コマンドラインからも実行できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
43掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| type | enum | いいえ | 結果タイプ。discover は Discover フィード、googleNews は Google News アプリと news.google.com を指し、Search の「ニュース」タブではありません。どちらもウェブ検索より対応ディメンションが少なく、クエリディメンションは報告されませんweb | image | video | news | discover | googleNews |
| endDate | string | いいえ | 終了日(YYYY-MM-DD 形式)。デフォルトは今日です |
| siteUrl | string | はい | Search Console のプロパティ。例:https://example.com/ または sc-domain:example.com |
| rowLimit | integer | いいえ | 返す最大行数 |
| startRow | integer | いいえ | 大きな結果をページ分割する際の開始行。行番号は 0 から始まります |
| dataState | enum | いいえ | full は確定済みデータ(デフォルト、約 2~3 日遅延)、all は直近の部分データを含めますfull | all |
| startDate | string | いいえ | 開始日(YYYY-MM-DD 形式)。デフォルトは 28 日前です |
| dimensions | array | いいえ | 結果のグループ化に使用するディメンション |
| maxTableRows | integer | いいえ | テキストテーブルに表示する行数の上限。構造化データの行は常にすべて返されます。0 = 要約のみ。 |
| aggregationType | enum | いいえ | Search Console が行を集計する方法auto | byProperty | byPage |
| dimensionFilterGroups | array | いいえ | Search Console のディメンションフィルター |
詳細
seo-mcp
seo-mcp は、Google Search Console、PageSpeed Insights、ページ内 SEO 監査に対応する stdio Model Context Protocol サーバーです。検証済みの Search Console プロパティに加え、製品が見つかるその他の場所である App Store、Google Play、WordPress.org、Google Ads、実ユーザーの Core Web Vitals を対象とする43個のツールを MCP クライアントに提供します。また、HTML 監査、PageSpeed、IndexNow、キーワード候補、WordPress.org のツールは、Google サービスアカウントの認証情報がなくても利用できます。すべてのツールはコマンドラインからも実行できるため、結果をモデルのコンテキストではなくファイルに書き出せます。また、snapshot を使うと、Search Console、App Store、Google Play、WordPress.org のある時点の状態を記録し、後から実行した際に差分を比較できます。
https://github.com/user-attachments/assets/66bbd628-d267-421f-9400-633b696bbd53
必要条件
- Node.js 20.18.1 以降
- セットアップウィザードを使う場合のみ
gcloud
必要なものは、使用するツールによって異なります。セットアップウィザードでは Search Console と PageSpeed を設定できます。App Store、Google Play、Chrome UX Report の各ツールには、それぞれ自分で作成した認証情報が必要です。
| ツール | 必要なもの | 入手先 |
|---|---|---|
seo_audit、audit_site、keyword_ideas(siteUrl を指定しない場合)、wporg_plugin | なし | 公開エンドポイント |
pagespeed | 任意の SEO_MCP_PAGESPEED_KEY | セットアップウィザードの --pagespeed-key、または Google Cloud API キー |
crux_field_data、crux_history | SEO_MCP_CRUX_KEY(または CrUX API を呼び出す可能性がある場合は PageSpeed キー) | Google Cloud API キー |
indexnow_submit | SEO_MCP_INDEXNOW_KEY | /<key>.txt に配置する任意のキー |
Search Console ツール、snapshot のプロパティ | サービスアカウントキー | セットアップウィザードを実行し、その後、プロパティにアカウントを追加 |
snapshot、list_snapshots、compare_snapshots | 任意の SEO_MCP_SNAPSHOT_DIR | スナップショットファイルの保存先。デフォルトは ~/.config/seo-mcp/snapshots |
verify | CLOUDFLARE_API_TOKEN | Cloudflare、Zone.DNS:Edit |
app_store_listing、app_store_discovery、app_store_reviews | SEO_MCP_ASC_KEY_PATH、SEO_MCP_ASC_KEY_ID、SEO_MCP_ASC_ISSUER_ID | App Store Connect のチームキー。アプリの閲覧権限がある任意のロール |
app_store_sales | 上記に加えて SEO_MCP_ASC_VENDOR_NUMBER | Admin、Finance、または Sales and Reports で作成したチームキー |
play_store_stats | SEO_MCP_PLAY_BUCKET、SEO_MCP_PLAY_CREDENTIALS | レポート用バケットへの読み取りアクセス権を持つサービスアカウント |
play_vitals | SEO_MCP_PLAY_CREDENTIALS | Play Console でアプリの品質情報へのアクセス権を付与されたサービスアカウント |
ads_ ツール | GOOGLE_ADS_DEVELOPER_TOKEN、GOOGLE_ADS_CLIENT_ID、GOOGLE_ADS_CLIENT_SECRET、GOOGLE_ADS_REFRESH_TOKEN、GOOGLE_ADS_CUSTOMER_ID | Google Ads の開発者トークンと、リフレッシュトークンを持つ OAuth クライアント |
インストールとビルド
npm install
npm run build
ローカルサーバーは次のコマンドで実行します。
node /absolute/path/to/seo-mcp/dist/index.js
このパッケージは npm で seo-console-mcp として公開されており、seo-mcp というコマンドをインストールします。MCP クライアントからは、次のように起動できます。
npx -y seo-console-mcp
実行中のサーバーは、MCP ワイヤープロトコルに stdout を専用で使用します。診断情報は stderr に出力されます。
セットアップウィザード
ローカルのチェックアウトから実行する場合:
npm run setup
または、npx を使用する場合:
npx -y seo-console-mcp setup
プロジェクトを自動的に選択する場合、またはキーの場所をカスタマイズする場合:
seo-mcp setup --project my-seo-project --key /absolute/path/seo-mcp.key.json
ウィザードでは、割り当て上限を増やすための PageSpeed Insights API キーも任意で設定できます。これはオプトインです。プロンプトなしで作成するには --pagespeed-key を、プロンプトを明示的にスキップするには --no-pagespeed-key を使用します。非対話型の実行では、--pagespeed-key が指定されていない限りスキップされます。
ウィザードは安全に再実行できます。次の処理を行います。
gcloudがあるか確認します。ない場合は手動での手順を表示し、何も変更せずに正常終了します。- 認証済みのアクティブなアカウントを使用するか、
gcloud auth loginを実行します。 - 現在のプロジェクト、指定された
--project、または入力されたプロジェクト ID を使用します。プロジェクトが存在しない場合は作成し、選択します。 searchconsole.googleapis.com、pagespeedonline.googleapis.com、siteverification.googleapis.comを有効にします。seo-mcpサービスアカウントを再利用するか、作成します。- 既存のキーを再利用するか、
seo-mcp.key.jsonを作成します。 - 必要に応じて、PageSpeed Insights のみに制限したプロジェクトスコープの API キーを作成します。
- 必要な Search Console の権限付与手順と、すぐにコピーできるクライアント設定を表示します。
ウィザードがサービスアカウントのキーの内容を表示することはありません。PageSpeed キーの作成が要求され、成功した場合は、そのキーを最終的なクライアント設定内に一度だけ表示します。生成された *.key.json ファイル名は Git の無視対象です。
サービスアカウントへの Search Console アクセス権の付与
Search Console API にはプロパティにユーザーを追加するエンドポイントがないため、サービスアカウント自体をドメインの確認済み所有者にする必要があります。その方法は 2 つあります。
自動(Cloudflare DNS)
ドメインの DNS が Cloudflare にある場合、verify がすべての処理を行います。Google に確認トークンを要求し、Cloudflare API 経由で TXT レコードを書き込み、確認を待ってからプロパティを登録します。
export CLOUDFLARE_API_TOKEN=... # a token scoped to Zone.DNS:Edit for the zone
seo-mcp verify getpsst.app another-domain.com
トークンは --cf-token で、キーのパスは --credentials で渡すこともできます(どちらも指定しない場合は GOOGLE_APPLICATION_CREDENTIALS / SEO_MCP_CREDENTIALS が使用されます)。このコマンドは冪等です。TXT レコードはそのまま残され(Google が再確認します)、ドメインに対して再実行しても安全です。所有権を失わないよう、レコードは DNS に残しておいてください。
verify は CLOUDFLARE_API_TOKEN、CF_API_TOKEN、または --cf-token からトークンを読み取り、保存もログへの記録もしません。そのため、環境変数をエクスポートできるシークレットストアであれば使用できます。トークンには Zone -> DNS -> Edit と Zone -> Zone -> Read(「Edit zone DNS」テンプレート)の権限が必要で、確認するゾーンにスコープを限定してください。シェルの履歴に残さないようにするには、次のようにします。
macOS(Keychain):
security add-generic-password -a "$USER" -s cloudflare-dns-edit -l "Cloudflare DNS Edit" -U -w # store once, hidden prompt
CLOUDFLARE_API_TOKEN=$(security find-generic-password -s cloudflare-dns-edit -w) seo-mcp verify example.com
Linux(libsecret または pass):
secret-tool store --label="Cloudflare DNS Edit" service cloudflare-dns-edit # store once, hidden prompt
CLOUDFLARE_API_TOKEN=$(secret-tool lookup service cloudflare-dns-edit) seo-mcp verify example.com
Windows(PowerShell SecretManagement):
Set-Secret -Name cloudflare-dns-edit -Secret (Read-Host -AsSecureString) # store once, hidden prompt
$env:CLOUDFLARE_API_TOKEN = Get-Secret -Name cloudflare-dns-edit -AsPlainText; seo-mcp verify example.com
手動
Search Console の UI で、サービスアカウントを所有者として追加します。
Search Console -> your property -> Settings -> Users and permissions -> Add user
seo-mcp@PROJECT_ID.iam.gserviceaccount.com -> Owner
ウィザードに表示された正確なサービスアカウントのメールアドレスを使用してください。submit_sitemap は書き込み操作のため、所有者アクセス権が必要です。
Google Cloud の手動代替手順
gcloud が利用できない場合は、認証情報を手動で作成するか、インストール後に次のコマンドを実行してください。
gcloud auth login
gcloud projects create YOUR_PROJECT_ID
gcloud config set project YOUR_PROJECT_ID
gcloud services enable searchconsole.googleapis.com pagespeedonline.googleapis.com siteverification.googleapis.com
gcloud iam service-accounts create seo-mcp --display-name="SEO MCP"
gcloud iam service-accounts keys create ./seo-mcp.key.json \
--iam-account=seo-mcp@YOUR_PROJECT_ID.iam.gserviceaccount.com
プロジェクトがすでに存在する場合は、gcloud projects create をスキップしてください。その後、サービスアカウントに Search Console へのアクセス権を付与し(上記参照)、MCP クライアントでキーの絶対パスを設定してください。
認証
Search Console ツールは、次の両方のスコープを使って google.auth.GoogleAuth を使用します。
https://www.googleapis.com/auth/webmastershttps://www.googleapis.com/auth/webmasters.readonly
認証情報は次の順序で検索されます。
--credentials /absolute/path/key.jsonSEO_MCP_CREDENTIALSGOOGLE_APPLICATION_CREDENTIALS- 存在する場合は
~/.config/seo-mcp/seo-mcp.key.json(または$XDG_CONFIG_HOME/seo-mcp/...)。これはセットアップウィザードが書き込むデフォルトの場所なので、標準的なインストールでは設定は不要です。
例:
node dist/index.js --credentials /absolute/path/seo-mcp.key.json
pagespeed は公開されており、サービスアカウントを使用しません。より高い PageSpeed Insights の割り当てを利用するには、SEO_MCP_PAGESPEED_KEY を設定するか、そのツールに apiKey を渡してください。seo_audit、audit_site、indexnow_submit も Google の認証情報は不要です。indexnow_submit には代わりに、key または SEO_MCP_INDEXNOW_KEY で IndexNow キーを渡します。keyword_ideas で Search Console との照合に siteUrl を渡す場合にのみ、Google の認証情報が必要です。App Store Sales and Trends は SEO_MCP_ASC_VENDOR_NUMBER を読み取ります。Chrome UX Report ツールは SEO_MCP_CRUX_KEY を読み取り、同じキーで chromeuxreport.googleapis.com を呼び出せる場合は、設定されていなければ SEO_MCP_PAGESPEED_KEY を使用します。snapshot、list_snapshots、compare_snapshots は SEO_MCP_SNAPSHOT_DIR にドキュメントを保存します。デフォルトは ~/.config/seo-mcp/snapshots で、このディレクトリの外部から読み書きすることはできません。「Requirements」セクションの表に、各ツールに必要なものがまとめられています。
セキュリティモデル
- ドメインを確認すると、サービスアカウントは確認済みオーナーになります。オーナーは Search Console の設定を変更したり、削除(インデックス解除)リクエストを送信したりできるため、ここにあるツールのほとんどが読み取り専用であっても、このキーは機密性の高い認証情報として扱ってください。
- キーはローカルに保管してください。 キーは
GOOGLE_APPLICATION_CREDENTIALSのパスに保存します(chmod 600を推奨)。公開パッケージ、コンテナイメージ、CI シークレットストアには絶対に含めないでください。漏えいすると、キーを持つ人は確認済みのすべてのプロパティをオーナーとして操作できます。 - DNS の
google-site-verificationTXT レコードは削除しないでください。 Google はこのレコードを再確認します。削除するとオーナー権限が取り消されます。 - シークレットがログに記録されることはありません。 ウィザードと
verifyが表示するのは認証情報のパスのみで、キーやトークンの内容は表示しません。 - 権限の取り消しは簡単です。 Search Console の UI(または
siteVerification.webResource.delete)から所有権を放棄し、gcloud iam service-accounts keys deleteでキーをローテーションしてください。 seo_auditは公開ホストのみを取得します。 対象 URL とすべてのリダイレクト先を解決し、ループバック、プライベート、リンクローカル、その他の非公開アドレスに到達する場合は拒否します。そのため、モデルが内部サービスやクラウドメタデータを取得するよう誘導することはできません。接続時にもアドレスを再検証し、ソケットを検証済みアドレスに固定するため、DNS リバインディングを行うホストが検証時には公開アドレスを提示し、接続時にはプライベートアドレスを提示することもできません。信頼できる内部ホストやステージングホストを監査するには、SEO_MCP_ALLOW_PRIVATE_HOSTS=1を設定してください。これはネットワークレベルの分離に代わるものではありません。内部サービスに到達可能なホストで信頼できない URL を監査する場合は、エグレス制御の背後でサーバーを実行してください。
Claude Code プラグイン
このリポジトリは Claude Code プラグインでもあり、MCP サーバーをバンドルし、そのサーバーを使う3つのスラッシュコマンドを追加します。Claude Code から次のように実行します。
/plugin marketplace add ibrahimhajjaj/seo-console-mcp
/plugin install seo-console@verdelic
MCP サーバー(npx -y seo-console-mcp 経由)を登録し、次のコマンドを追加します。
/seo-console:triage <siteUrl>:優先順位を付けたアクションプラン付きの、プロパティ全体のトリアージ/seo-console:content <siteUrl>:Search Console のデータに基づき、作成または改善するコンテンツを提案/seo-console:launch <siteUrl>:ローンチ前/ローンチ時の SEO 準備状況を確認
サーバーは、サービスアカウントキーをデフォルトの場所(セットアップウィザードが書き込む~/.config/seo-mcp/seo-mcp.key.json)から自動的に検出するため、標準的なインストールでは設定は不要です。別の場所にあるキーを使う場合は、Claude Code の実行環境でGOOGLE_APPLICATION_CREDENTIALS(および PageSpeed の割り当てを増やす場合はSEO_MCP_PAGESPEED_KEY)を設定してください。seo_auditおよびpagespeedツールは、認証情報なしで動作します。
マーケットプレイスを使わず、ローカルのチェックアウトから試すには、claude --plugin-dir .を実行します。
Claude Code(MCP サーバーのみ)
現在のユーザー向けにローカルビルドを登録します。
claude mcp add --scope user seo-mcp --env GOOGLE_APPLICATION_CREDENTIALS=/abs/path/seo-mcp.key.json -- node /abs/path/seo-mcp/dist/index.js
--セパレーターは必須です。Claude Code のオプションと MCP サーバーのコマンドを区切ります。
または、npxを使います(ローカルビルドは不要です)。
claude mcp add --scope user seo-mcp --env GOOGLE_APPLICATION_CREDENTIALS=/abs/path/seo-mcp.key.json -- npx -y seo-console-mcp
ユーザースコープを指定すると、サーバーをすべてのプロジェクトで利用できます。登録内容を現在のプロジェクトの.mcp.jsonを通じて共有する場合は、--scope projectを使用してください。
プロジェクトの.mcp.json:
{
"mcpServers": {
"seo-mcp": {
"type": "stdio",
"command": "node",
"args": ["/abs/path/seo-mcp/dist/index.js"],
"env": {
"GOOGLE_APPLICATION_CREDENTIALS": "/abs/path/seo-mcp.key.json"
}
}
}
}
Claude Desktop
Claude Desktop の設定ファイルで、同じサーバーエントリーをmcpServersの下に追加し、Claude Desktop を再起動します。
{
"mcpServers": {
"seo-mcp": {
"command": "node",
"args": ["/abs/path/seo-mcp/dist/index.js"],
"env": {
"GOOGLE_APPLICATION_CREDENTIALS": "/abs/path/seo-mcp.key.json"
}
}
}
}
ローカルビルドなしで実行するには、"command": "npx"および"args": ["-y", "seo-console-mcp"]を使用します。
リソース
seo://propertiesは、サービスアカウントが利用できる Google Search Console のプロパティを JSON として返します。読み取るたびに Search Console を呼び出すため、結果は常に最新です。
プロンプト
MCP クライアントでは、一般的な SEO ワークフローでユーザーが選択できる開始点として、次のプロンプトが表示されます。
seo_triageはプロパティを確認し、最近のパフォーマンスと機会を分析し、サイトを監査して、影響と労力に基づくアクションプランを作成します。content_opportunitiesは、根拠に基づく提案を、作成するコンテンツと改善する既存のコンテンツに分類します。launch_seo_checkは、ローンチ前の技術面およびインデックス登録の準備状況について、実施可否を判断するチェックリストを作成します。
ツール
すべてのツールは Zod で入力を検証します。ツールの実行に失敗した場合、サーバーを終了するのではなく、MCP エラー結果を返します。利用可能な場合は、Google API のステータス、メッセージ、理由が含まれます。Search Console の403エラーでは、サービスアカウントにプロパティへのアクセス権を付与する方法も説明されます。
list_properties
サービスアカウントがアクセスできるすべての Google Search Console プロパティを一覧表示し、各プロパティの正確なsiteUrlとpermissionLevelを返します。入力は不要です。pagespeed、seo_audit、audit_site、indexnow_submitとは異なり、サービスアカウントの認証情報が必要です。
このツールはパラメーターを受け取りません。
search_analytics
searchanalytics.query を実行し、コンパクトなランキング表と構造化された行を返します。
{
"siteUrl": "sc-domain:example.com",
"startDate": "2026-06-01",
"endDate": "2026-06-28",
"dimensions": ["query", "page"],
"rowLimit": 100,
"maxTableRows": 25,
"dimensionFilterGroups": [
{
"groupType": "and",
"filters": [
{ "dimension": "query", "operator": "contains", "expression": "seo" }
]
}
],
"type": "web"
}
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
siteUrl | string | はい | https://example.com/ や sc-domain:example.com などの Search Console プロパティ | |
startDate | string | いいえ | YYYY-MM-DD 形式の開始日。デフォルトは28日前です | |
endDate | string | いいえ | YYYY-MM-DD 形式の終了日。デフォルトは今日です | |
dimensions | query、page、country、device、date、searchAppearance のいずれかのリスト | いいえ | ["query"] | 結果のグループ化に使用するディメンション |
rowLimit | number | いいえ | 25 | 返す行の最大数 |
startRow | number | いいえ | 0 | 大きな結果をページ分割する際の開始行(0から始まります) |
maxTableRows | number | いいえ | 25 | テキスト表に表示する行数の上限。構造化された行は常にすべて含まれます。0 = サマリーのみ。 |
dimensionFilterGroups | JSON list | いいえ | Search Console のディメンションフィルター | |
type | web、image、video、news、discover、googleNews のいずれか | いいえ | 結果の種類。discover は Discover フィード、googleNews は Google ニュースアプリおよび news.google.com を指し、検索の「ニュース」タブではありません。どちらも web よりサポートするディメンションが少なく、query ディメンションはレポートされません | |
dataState | full、all のいずれか | いいえ | full = 確定済みデータ(デフォルト。約2~3日の遅延あり)。all = 直近の未確定データを含めます | |
aggregationType | auto、byProperty、byPage のいずれか | いいえ | Search Console における行の集計方法 |
maxTableRows が上限を適用するのはテキスト表のみです。構造化された行はすべて含まれるため、0 を指定すると、結果が空になるのではなく、表を表示せず合計値を返します。discover と googleNews は web よりサポートするディメンションが少なく、どちらも query ディメンションはレポートされません。
keyword_ideas
Google オートコンプリートを使ってシードキーワードを拡張し、正規化・重複排除したキーワード候補を、発見元のファミリーごとにまとめて返します。公開されているオートコンプリートエンドポイントを使用するため、追加の API キーは不要です。siteUrl を指定しない限り、Google の認証情報なしで動作します。Search Console プロパティを指定すると、すでにランキングされている候補に、選択した遡及期間における平均掲載順位、クリック数、表示回数を表示します。
{
"seed": "technical seo",
"siteUrl": "sc-domain:example.com",
"language": "en",
"country": "us",
"expansions": ["alphabet", "questions", "prepositions", "comparisons"],
"days": 90,
"limit": 100
}
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
seed | string | はい | 拡張するシードキーワード | |
siteUrl | string | いいえ | すでにランキングされているクエリを特定するための任意の Search Console プロパティ | |
language | string | いいえ | "en" | hl として渡すオートコンプリートのインターフェース言語 |
country | string | いいえ | gl として渡すオートコンプリートの国 | |
expansions | alphabet、questions、prepositions、comparisons のいずれかのリスト | いいえ | ["alphabet","questions","prepositions","comparisons"] | シードのみの場合に加えて実行する候補拡張ファミリー |
days | number | いいえ | 90 | Search Console の遡及期間(日数) |
limit | number | いいえ | 100 | 返すキーワード候補の最大数 |
デフォルトでは、4つすべての拡張ファミリーが実行されます。days のデフォルトは90で、上限は480です。limit のデフォルトは100で、上限は500です。個別のオートコンプリートでエラーが発生した場合も、成功した候補は破棄せず、エラー数として記録します。
search_opportunities
掲載順位の向上が見込める、高インプレッションのクエリを見つけます。クエリとページごとにグループ化し、デフォルトでは掲載順位が5〜20のものを対象として、インプレッションで重み付けした掲載順位に基づいて機会をランク付けします。
{
"siteUrl": "sc-domain:example.com",
"startDate": "2026-06-01",
"endDate": "2026-06-28",
"minPosition": 5,
"maxPosition": 20,
"minImpressions": 100,
"limit": 25
}
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
siteUrl | string | はい | 分析する Search Console プロパティ | |
startDate | string | いいえ | YYYY-MM-DD 形式の開始日。デフォルトは直近28日間です | |
endDate | string | いいえ | YYYY-MM-DD 形式の終了日。デフォルトは今日です | |
minPosition | number | いいえ | 対象に含める平均掲載順位の下限。デフォルトは5です | |
maxPosition | number | いいえ | 対象に含める平均掲載順位の上限。デフォルトは20です | |
minImpressions | number | いいえ | 必要な最小インプレッション数。デフォルトは10です | |
limit | number | いいえ | 返す機会の最大数。デフォルトは50です |
compare_search_periods
選択した期間と、その直前の同じ長さの期間を比較します。クエリまたはページごとに、クリック数の増加と減少が大きいものを返します。
{
"siteUrl": "sc-domain:example.com",
"startDate": "2026-06-01",
"endDate": "2026-06-28",
"by": "query",
"limit": 25
}
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
siteUrl | string | はい | 分析する Search Console プロパティ | |
startDate | string | いいえ | YYYY-MM-DD 形式の開始日。デフォルトは直近28日間です | |
endDate | string | いいえ | YYYY-MM-DD 形式の終了日。デフォルトは今日です | |
by | query、page のいずれか | いいえ | "query" | パフォーマンスの比較に使用するディメンション |
limit | number | いいえ | 返す増加項目と減少項目の最大数。デフォルトはそれぞれ50です |
ctr_gaps
同じ四捨五入後の掲載順位にある行の平均を下回るCTRの、高インプレッションのクエリまたはページを見つけます。クリック数の損失推定値を参考に、タイトルと説明文の書き換えの優先順位を付けられます。
{
"siteUrl": "sc-domain:example.com",
"by": "page",
"minImpressions": 250,
"limit": 25
}
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
siteUrl | string | はい | 分析する Search Console プロパティ | |
startDate | string | いいえ | YYYY-MM-DD 形式の開始日。デフォルトは直近28日間です | |
endDate | string | いいえ | YYYY-MM-DD 形式の終了日。デフォルトは今日です | |
by | query、page のいずれか | いいえ | "query" | CTRのギャップを特定するために使用するディメンション |
minImpressions | number | いいえ | 必要な最小インプレッション数。デフォルトは100です | |
limit | number | いいえ | 返すギャップの最大数。デフォルトは50です |
query_cannibalization
複数のページで Search Console のインプレッションが発生しているクエリを見つけます。結果は競合するページをグループ化し、合計インプレッション数の多い順にグループをランク付けします。
{
"siteUrl": "sc-domain:example.com",
"startDate": "2026-06-01",
"endDate": "2026-06-28",
"minImpressions": 25
}
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
siteUrl | string | はい | 分析する Search Console プロパティ | |
startDate | string | いいえ | YYYY-MM-DD 形式の開始日。デフォルトは直近28日間です | |
endDate | string | いいえ | YYYY-MM-DD 形式の終了日。デフォルトは今日です | |
minImpressions | number | いいえ | クエリとページの組み合わせごとに必要な最小インプレッション数。デフォルトは10です |
list_sitemaps
サイトマップのパス、送信/ダウンロード時刻、保留中/インデックス登録済みのフラグ、警告/エラー数、コンテンツ数を一覧表示します。
{
"siteUrl": "https://www.example.com/"
}
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
siteUrl | string | はい | Search Console プロパティ |
submit_sitemap
サイトマップを送信し、現在の状態を更新します。これは書き込み操作です。送信に成功しても状態の更新に失敗した場合、結果では Google が書き込みを受け付けたことを確認し、更新に関する警告を報告します。
{
"siteUrl": "sc-domain:example.com",
"feedpath": "https://www.example.com/sitemap.xml"
}
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
siteUrl | string | はい | Search Console プロパティ | |
feedpath | string | はい | 送信するサイトマップの絶対 URL | |
dryRun | boolean | いいえ | false | true の場合、Search Console に書き込まず、送信される内容を報告します |
delete_sitemap
Search Console プロパティから送信済みのサイトマップを削除します。これは書き込み操作です。Search Console を変更せずに削除内容をプレビューするには、dryRun を true に設定します。
{
"siteUrl": "sc-domain:example.com",
"feedpath": "https://www.example.com/sitemap.xml",
"dryRun": true
}
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
siteUrl | string | はい | Search Console プロパティ | |
feedpath | string | はい | 削除するサイトマップの絶対 URL | |
dryRun | boolean | いいえ | false | true の場合、Search Console に書き込まず、削除される内容を報告します |
inspect_url
インデックス登録のカバレッジ、判定結果、robots の状態、インデックス登録の状態、クロール日時、取得状態、Google とユーザーの正規 URL、モバイル ユーザビリティ、リッチリザルトのステータスを返します。
{
"siteUrl": "sc-domain:example.com",
"inspectionUrl": "https://www.example.com/products/widget"
}
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
siteUrl | string | はい | 検査対象の URL を含む Search Console プロパティ | |
inspectionUrl | string | はい | 検査する完全修飾 URL |
index_coverage
サイトマップを取得し、その中の上限付きの直接ページ URL を Google の URL Inspection API で確認します。インデックス登録済み、未登録、失敗の件数、未登録の URL とカバレッジ状態、URL ごとの完全な結果、および結果が切り詰められたかどうかを返します。サイトマップインデックスから子サイトマップをたどることはありません。
{
"siteUrl": "sc-domain:example.com",
"sitemapUrl": "https://www.example.com/sitemap.xml",
"maxUrls": 20,
"concurrency": 3
}
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
siteUrl | string | はい | サイトマップ URL を含む Search Console プロパティ | |
sitemapUrl | string | はい | 検査する完全修飾サイトマップ URL | |
maxUrls | number | いいえ | 20 | 検査する URL の最大数 |
concurrency | number | いいえ | 3 | 同時に実行する URL Inspection リクエスト数 |
maxUrls のデフォルトは 20 で、上限は 50 です。concurrency のデフォルトは 3 で、上限は 5 です。これらの制限は、URL Inspection API の割り当て量を保護するためのものです。割り当て量はプロパティごとに 1 日あたり約 2,000 クエリ、1 分あたり 600 クエリです。
request_recrawl
URL Inspection API で URL を確認し、未登録の URL がある場合は、それらを含むサイトマップを再送信します。この再送信は、Google がサポートする唯一の一括再クロール通知です。インデックス登録をリクエストする API はなく、Search Console の UI にある「インデックス登録をリクエスト」ボタンに相当するプログラム機能もありません。URL は urls から取得するか、sitemapUrl から読み取ります。再送信するサイトマップは feedpath で指定し、デフォルトは sitemapUrl です。これは書き込み操作です。再送信せずに確認して結果を報告するには、dryRun を true に設定します。
{
"siteUrl": "sc-domain:example.com",
"sitemapUrl": "https://www.example.com/sitemap.xml",
"maxUrls": 20,
"dryRun": true
}
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
siteUrl | string | はい | URL を含む Search Console プロパティ | |
urls | list of string | いいえ | 確認する明示的な URL。省略すると sitemapUrl から読み取ります | |
sitemapUrl | string | いいえ | URL の読み取り元サイトマップ。再送信するサイトマップのデフォルトにもなります | |
feedpath | string | いいえ | 未登録の URL が見つかったときに再送信するサイトマップ。デフォルトは sitemapUrl です | |
maxUrls | number | いいえ | 20 | 検査するサイトマップ URL の最大数 |
concurrency | number | いいえ | 3 | 同時に実行する URL Inspection リクエスト数 |
dryRun | boolean | いいえ | false | true の場合、サイトマップを再送信せずに確認して結果を報告します |
index_coverage と同じ上限(maxUrls は最大 50、concurrency は最大 5)を適用します。どちらも同じ URL Inspection の割り当て量を使用するためです。再送信によって再クロールが促されるのは、サイトマップの lastmod が新しいページのみです。そのため、変更した URL の lastmod は正確に保ってください。
indexnow_submit
1 回の呼び出しで、変更された URL を最大 10,000 件、IndexNow エンドポイントに送信します。参加する検索エンジン(Bing、Yandex、Naver、Seznam、Yep)は、送信内容を相互に共有します。Google は IndexNow を使用しないため、Google には request_recrawl を使用してください。これは書き込み操作であり、dryRun に対応しています。Google の認証情報は不要です。
{
"urls": ["https://www.example.com/new-page", "https://www.example.com/updated-page"],
"key": "your-indexnow-key"
}
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
urls | 文字列のリスト | はい | 変更されたページの URL。1 回の送信で対象にできるホストは 1 つです | |
key | 文字列 | いいえ | IndexNow キー。デフォルトでは SEO_MCP_INDEXNOW_KEY を使用します。同じキーを、キーのみを含むテキストファイルとしてサイト上の https:///.txt(または keyLocation)に設置する必要があります | |
keyLocation | 文字列 | いいえ | キーファイルが https:///.txt にない場合、その設置場所の URL | |
endpoint | api.indexnow.org、www.bing.com、yandex.com、searchadvisor.naver.com、search.seznam.cz、indexnow.yep.com のいずれか | いいえ | "api.indexnow.org" | 通知する IndexNow エンドポイント。参加する検索エンジン間で送信内容が共有されます |
dryRun | 真偽値 | いいえ | false | true の場合、エンドポイントに通知せず、送信される内容を報告します |
1 回の送信に含めるすべての URL は、同じホストを共有する必要があります。キーには、key または SEO_MCP_INDEXNOW_KEY として渡す、英字、数字、ハイフンからなる 8~128 文字の値を指定できます。また、https://<host>/<key>.txt(または同じホスト上の keyLocation)に、キーだけを含むテキストファイルとして設置する必要があります。キーファイルの URL には慣例上キーが含まれるため、キーも keyLocation もツールの出力には表示されません。endpoint のデフォルトは api.indexnow.org です。参加するいずれかのエンドポイントに送信すると、すべてのエンドポイントに届きます。
pagespeed
利用可能な場合、LCP、CLS、INP または FID、FCP、TTFB などの CrUX フィールドデータを返します。また、Lighthouse のカテゴリ別スコアと、削減効果が最も高い最大 10 件の改善機会も返します。
{
"url": "https://www.example.com/",
"strategy": "mobile",
"category": ["performance", "seo", "accessibility", "best-practices"]
}
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
url | 文字列 | はい | 分析する公開ページの URL | |
strategy | mobile、desktop のいずれか | いいえ | "mobile" | Lighthouse のデバイス戦略 |
category | performance、seo、accessibility、best-practices のいずれかのリスト | いいえ | ["performance","seo","accessibility","best-practices"] | 実行する Lighthouse カテゴリ |
apiKey | 文字列 | いいえ | PageSpeed Insights API キー(任意)。デフォルトでは SEO_MCP_PAGESPEED_KEY を使用します |
strategy のデフォルトは mobile です。デフォルトでは 4 つすべてのカテゴリがリクエストされます。apiKey は任意で、指定した呼び出しでは SEO_MCP_PAGESPEED_KEY を上書きします。
seo_audit
リダイレクトを有効にし、タイムアウトを 15 秒に設定して、識別可能なユーザーエージェントを使用しながら、最大 10 MB の HTML を取得します。タイトルと説明文の長さ、canonical、robots、H1 と見出し構成、Open Graph と Twitter のタグ、JSON-LD の型、画像の alt 属性の網羅率、内部リンクと外部リンク、単語数、言語、viewport を抽出します。タイトルの欠落や重複、説明文の欠落、H1 の欠落や複数存在、canonical の欠落、JSON-LD の欠落や無効を警告します。
{
"url": "https://www.example.com/landing-page"
}
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
url | 文字列 | はい | 監査する公開ページの URL |
audit_site
サイトマップを取得し、ページ URL を最大 50 件まで、同時実行数を制限して監査します。サイトマップインデックスに対応しており、子サイトマップの取得数は最大 5 件に制限されています。結果には、ページごとの簡潔な検出事項、個別のページ取得エラー、共通する各問題の件数、明示的な打ち切り数とスキップ数が含まれます。Google の認証情報は不要です。
{
"sitemapUrl": "https://www.example.com/sitemap.xml",
"maxPages": 20,
"concurrency": 5
}
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
sitemapUrl | 文字列 | はい | 監査する公開サイトマップの URL | |
maxPages | 数値 | いいえ | 20 | 監査するページの最大数 |
concurrency | 数値 | いいえ | 5 | 同時に実行するページ取得の最大数 |
maxPages のデフォルトは 20、concurrency のデフォルトは 5 です。それぞれの最大値は 50 と 10 です。
server_version
応答しているサーバーのビルド、その実行場所、npx キャッシュから取得されたものかどうかを確認します。認証情報は不要です。
このツールにパラメーターはありません。
似ているようで異なる値が4つあります:npm が latest と呼ぶもの、バージョン範囲が解決するもの、プラグインのマニフェストに宣言されているもの、そして実際に実行中のものです。最初の3つはすべて確認できますが、どれも質問への答えにはなりません。コマンドラインツールを確認しても代わりにはなりません。別のプロセスとして別々に解決されるため、同じマシン上でも異なるビルドの場合があるからです。
見分ける手がかりはインストールパスです。npx は範囲を再解決せず、エラーも出さずにキャッシュ済みのビルドを再利用するため、ほかのすべての情報が最新を示していても、サーバーが公開済みのリリースより古いままの場合があります。_npx 以下のパスがそれを示します。
更新後、何かを報告する前に呼び出してください。 npm view <pkg> version はローカルのレジストリキャッシュを読み取るため、公開が成功してから数分間、以前のバージョンを返すことがあります。その一方で、dist-tags とバージョン配列にはすでに新しいバージョンが反映されています。ここでは別々のリリースで、2つのセッションが公開に失敗したと独立に判断しましたが、実際には失敗していませんでした。レジストリの読み取りでは公開の遅延と失敗を区別できませんが、実行中のプロセスに尋ねれば確認できます。
wporg_plugin
スラッグで WordPress.org プラグインを検索し、有効インストール数、ダウンロード数、評価、サポートスレッド、バージョンの日付を返します。公開されている wp.org API を使用し、認証情報や API キーは不要です。公開から数日以内のプラグインについて、フィールドが空に見える場合は possiblyLagging: true を返します。wp.org API では新しいプラグインの情報が実際より少なく報告されるためです。すでにページ上にはフィールドが表示されている場合があります。
{ "slug": "akismet" }
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
slug | string | はい | WordPress.org プラグインのスラッグ。例:akismet | |
downloadDays | number | いいえ | 30 | 取得する日別ダウンロード履歴の日数。0 の場合は省略します |
includeVersionDistribution | boolean | いいえ | true | 各プラグインバージョンを使用している有効インストールの割合も取得します |
play_store_stats
アプリの Google Play 一括レポートを読み取り、アクティブなデバイスへのインストール数と、トラフィックソースおよび検索語句別にグループ化したストア掲載情報の訪問者数と獲得数を返します。hasPlaySearchRows は、Play 検索トラフィックが存在するかどうかを明示します。これは、トラフィックがないこと自体がエラーではなく調査結果となるためです。レポートには数日遅れがあるため、lastDatePresent は今日ではなく、ファイル内に実際に存在する最後の日付を示します。
{ "packageName": "com.example.app", "month": "202608" }
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
packageName | 文字列 | はい | Android のパッケージ名(例:app.getpsst) | |
month | 文字列 | いいえ | レポートの月(YYYYMM)。デフォルトは現在の UTC 月です。startDate と endDate が指定されている場合は無視されます | |
installsDimension | overview、country、language、device、os_version、carrier、app_version のいずれか | いいえ | "overview" | 読み取るインストールレポートです。overview は Google による文書化がありませんが、実際のバケットに存在します。それ以外は文書化されている内訳です |
include | ratings、crashes、reviews のいずれかのリスト | いいえ | [] | 読み取る追加レポートの種類です。ファイルが存在しないのは通常のことです。Google は報告する内容がある場合にのみレポートを生成します |
storePerformanceDimension | traffic_source、country のいずれか | いいえ | "traffic_source" | 読み取るストア パフォーマンスの内訳です |
storePerformanceTotals | ブール値 | いいえ | false | 代わりに total_ バリアントを読み取ります。これは同じレポートの集計ではなく、別のレポートです。獲得数のみを含み、訪問者数やコンバージョン率は含みません。また、一部のアプリでは対象日数が大幅に少なく、すべての獲得がプレースホルダーのソースに割り当てられます |
ratingsDimension | country、language、device、os_version、carrier、app_version のいずれか | いいえ | "country" | 評価レポートのディメンションです |
crashesDimension | device、os_version、app_version のいずれか | いいえ | "app_version" | クラッシュレポートのディメンションです |
startDate | 文字列 | いいえ | 期間の開始日(YYYY-MM-DD)。endDate と併せて指定すると、期間がかかるすべての月を読み取り、行を指定期間内に絞り込みます | |
endDate | 文字列 | いいえ | 期間の終了日(YYYY-MM-DD) |
SEO_MCP_PLAY_BUCKET にレポートバケットを設定します(gs://pubsite_prod_... とバケット名のみのどちらも使用できます)。また、バケットへの読み取りアクセス権を持つサービスアカウントキーを SEO_MCP_PLAY_CREDENTIALS に設定してください。設定がない場合は GOOGLE_APPLICATION_CREDENTIALS が使用されます。バケットへの読み取りアクセス権は、play_vitals に必要な Play Console の招待権限とは別の付与です。month のデフォルトは現在の UTC 月です。
app_store_listing
App Store Connect を通じて App Store の掲載情報を読み取り、各ロケールのフィールドを Apple の上限(名前:30、サブタイトル:30、キーワード:100、プロモーションテキスト:170)と照合します。Apple がインデックスするのは名前、サブタイトル、キーワードの各フィールドのみなので、説明文は報告されますがスコアの対象にはなりません。また、上限を1文字でも超えたフィールドは拒否されずに黙って除外されます。そのため、すべてのフィールドを上限と照合して報告します。プロモーションテキストは、審査なしで公開中のバージョンでも変更できる唯一の項目なので、個別に取り上げます。
アプリには公開中のレコードと編集可能なレコードを同時に保持できるため、state で読み取るレコードを選択し、結果には使用したレコードとバージョンが記載されます。指定したレコードが存在しない場合は、もう一方のレコードを報告し、指定されたレコードとして扱うのではなく、その旨を注記します。
報告される状態は appVersionState に基づき、値がない場合は非推奨の appStoreState にフォールバックします。この2つは同じ状態を異なる表記で示します。公開中の掲載情報は READY_FOR_DISTRIBUTION と表示され、非推奨属性では READY_FOR_SALE と表示されていました。この変更の前後で取得した出力は、掲載情報に何も変更がなくても、文字列だけが異なります。
{ "bundleId": "com.example.app", "state": "live", "platform": "IOS", "storefronts": ["us", "gb"] }
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
appId | string | いいえ | App Store Connect の数値アプリ ID。これを指定するか、bundleId を指定してください | |
bundleId | string | いいえ | bundle ID。appId が指定されていない場合はアプリ ID に解決されます。これを指定するか、appId を指定してください | |
platform | one of IOS, MAC_OS, TV_OS, VISION_OS | いいえ | "IOS" | バージョンを読み取る App Store のプラットフォーム |
state | one of live, editable | いいえ | "live" | 公開中の掲載情報を読み取るか、リリースに向けて準備中の編集可能な掲載情報を読み取ります |
storefronts | list of string | いいえ | ["us"] | 公開評価を取得するストアフロントの国コード |
appId または bundleId を指定してください。.p8 秘密鍵のパスを SEO_MCP_ASC_KEY_PATH に、鍵 ID を SEO_MCP_ASC_KEY_ID に設定し、チームキーの場合は SEO_MCP_ASC_ISSUER_ID も設定してください(個人キーには issuer ID がありません)。鍵と、それを使って署名されるトークンは出力に表示されません。
チームキーはチーム内のすべてのアプリにアクセスできるため、1つの鍵ですべてのアプリに対応できます。アクセス範囲を制限するのは鍵に付与されたロールで、Apple では鍵のロールを後から変更できません。選択できる操作は「Revoke」だけです。App Manager キーでは掲載情報を読み取れますが、「Sales and Trends」や分析レポートにはアクセスできません。これらには、既存の鍵をアップグレードするのではなく、Admin、Finance、または Sales and Reports で作成した別の鍵が必要です。
ratings は、ストアフロントをキーとするオブジェクトではなく、リクエストされたストアフロントごとに1件のエントリーを持つリストです。
{ "ratings": [{ "storefront": "us", "source": "itunes-lookup", "averageUserRating": 4.5, "userRatingCount": 12 }] }
星評価は App Store Connect から取得されません。App Store Connect の API には評価の集計リソースがなく、年齢制限の評価しかありません。そのため、評価は公開 App Store ストアフロントのルックアップから取得し、このツールの他のすべてのフィールドは App Store Connect から取得します。どちらの情報源も同じように見える1つの数値を報告しますが、各エントリーには source が付いています。ストアページの評価と非公開 API の評価は互換性がなく、同じ測定値として比較すべきではありません。
list_snapshots
スナップショットディレクトリにすでにあるスナップショットドキュメントを、新しい順に一覧表示します。それぞれの取得日時、対象期間、含まれるプロパティ、アプリ、パッケージ、プラグインの数を確認できます。
{ "limit": 50 }
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
limit | number | いいえ | 50 | 返すスナップショットの最大数。新しい順に表示します |
どのファイルが存在するかを確認できなければ、スナップショットの組み合わせは役に立ちません。また、サーバーが管理するディレクトリの独自インデックスを、呼び出し元がそれぞれ保持する必要がありました。ディレクトリ内にスナップショットドキュメントではないファイルがある場合は、隠さずにエラーとともに一覧表示されるため、見つかるはずの名前が何も言わずに存在しないものとして扱われることはありません。ディレクトリがない場合は失敗ではなく空のリストが返されます。まだ何も取得されていないためです。total と truncated がリストとともに表示されるのは、コマンドラインでは構造化データ部分のみが出力され、limit で切られたページが履歴全体のように見えてしまうためです。
snapshot
4つの領域のデータを、タイムスタンプ付きの1つのドキュメントに取得します。各プロパティの Search Console の合計値と上位行、App Store のリスティング、Google Play のインストール数とトラフィック、WordPress.org の統計情報です。Core Web Vitals のフィールドデータ、Android vitals、App Store の売上、App Store のレビューは含まれません。これらは crux_field_data、play_vitals、app_store_sales、app_store_reviews で読み取ります。各コンソールでは後から差分を確認できる履歴が保持されないため、時系列の記録を残すにはこのツールを使います。
Search Console の合計値は、クエリディメンションの合計ではなく、必ず日付ディメンションから取得します。Google は検索数の少ないクエリを除外するため、クエリ単位で合計すると数値が過少になり、後から実際には起きていない減少として見えてしまいます。
読み取りできない領域は省略せず、その位置にエラーを記録し、surfacesWithErrors にも名前を記載します。領域が何も言わずに消えると、後からゼロへの減少として見えてしまうためです。1つの領域で処理が遅くなっても、ドキュメント全体がタイムアウトすることはありません。
{
"properties": ["sc-domain:example.com"],
"apps": ["1234567890"],
"packages": ["com.example.app"],
"slugs": ["akismet"],
"windowDays": 28,
"outPath": "2026-09-03.json"
}
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
properties | list of string | いいえ | [] | 取得する Search Console プロパティ |
apps | list of string | いいえ | [] | App Store アプリ。数値のアプリ ID またはバンドル ID を指定します |
packages | list of string | いいえ | [] | Google Play のパッケージ名 |
slugs | list of string | いいえ | [] | WordPress.org のプラグインスラッグ |
windowDays | number | いいえ | 28 | Search Console の対象期間(日数)。今日を終了日とします |
platform | one of IOS, MAC_OS, TV_OS, VISION_OS | いいえ | "IOS" | アプリ関連データに使用する App Store のプラットフォーム |
storefronts | list of string | いいえ | ["us"] | App Store の評価に使用するストアフロントの国コード |
outPath | string | いいえ | スナップショットディレクトリ内のファイル名またはパス(SEO_MCP_SNAPSHOT_DIR。デフォルトは ~/.config/seo-mcp/snapshots)。.json で終わる必要があります。または auto を指定すると、取得時刻をファイル名にします。overwrite が true でない限り、既存のファイルは上書きされません | |
overwrite | boolean | いいえ | false | outPath にある既存ファイルを置き換えます。指定しない場合、既存ファイルはそのまま残され、その旨が報告されます |
後で compare_snapshots から読み取れる場所にドキュメントを書き込むには outPath を指定します。または outPath: "auto" を指定すると、取得時刻(2026-09-04T00-15Z.json など)がファイル名になり、無人実行で1つのファイルを上書きし続けるのではなく、時系列のデータを残せます。これはスナップショットディレクトリ内のファイル名です。デフォルトでは SEO_MCP_SNAPSHOT_DIR または ~/.config/seo-mcp/snapshots が使われます。このディレクトリの外を指すパスや、.json で終わらないパスは拒否されます。また、overwrite: true を指定しない限り、既存のファイルはそのまま残され、その旨が報告されます。モデルがこの文字列を選択するため、ディレクトリが境界となり、ツール呼び出しによってマシン上のほかのファイルが切り詰められるのを防ぎます。対象期間に表示回数がない場合、掲載順位と CTR は 0 ではなく null になります。そのため、空の期間が実データの急落と比較されることはありません。
compare_snapshots
2 つのスナップショットドキュメントを読み込み、プロパティごとのクリック数、インプレッション数、掲載順位の変化、インプレッション数の下限を超えるページレベルおよびクエリレベルの変動、インストール数と評価の差分、App Store のバージョンとロケール数の変化、ロケールごとの名前、サブタイトル、キーワード、プロモーションテキスト、説明文の文字数と文字数制限を超えた項目、訪問者数と獲得数別の Google Play のトラフィックソース、WordPress.org の星 5 つの評価数のヒストグラムを報告します。
{ "from": "2026-08-06.json", "to": "2026-09-03.json", "minImpressions": 100 }
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
from | string | はい | スナップショットディレクトリ内のスナップショットファイル名またはパスです。latest はディスク上の最新のスナップショット、previous はその1つ前のスナップショットを指定します | |
to | string | はい | スナップショットディレクトリ内のスナップショットファイル名またはパスです。latest はディスク上の最新のスナップショット、previous はその1つ前のスナップショットを指定します | |
minImpressions | number | いいえ | 100 | 両方の時点でこのインプレッション数に満たないページ掲載順位の変動は無視します |
from と to は、snapshot の outPath と同じスナップショットディレクトリ内で解決されるため、このツールが読み込むのはスナップショットのみです。どちらにもファイル名の代わりに latest または previous を指定できます。ほとんどの呼び出し元が実際に必要とする比較はこれであり、事前にディレクトリを一覧表示せずに指定できる唯一の方法です。どちらも解析できないファイルはスキップします。また、ディスク上のスナップショットが1つしかないときに previous を指定すると、ドキュメントを自身と比較するのではなく、その旨を通知します。
このツールは計算のみを行い、判断はしません。差分からその主張を裏付けることはできないため、変化が良いものだったか、何が原因だったかは示しません。いずれかの側で取得に失敗したデータや欠落しているデータは、比較対象外として示され、その名前が明記されます。そのため、データ収集の失敗が変化として扱われることはありません。また、スナップショットドキュメントではないファイルは、途中まで解析するのではなく拒否されます。
フィールドの取得が始まる前に作成されたスナップショットも比較できます。片側にフィールドがない場合、そのフィールドの差分は変化としてではなく null で返されます。また、両側ともアプリのロケール別文字数がない場合は、文字数がゼロのリストを返す代わりに localesComparable: false を報告します。
app_store_reviews
Apple 独自のページングカーソルに従って、星評価またはストアフロントで絞り込んだ App Store のカスタマーレビューと返信を読み込みます。
{ "bundleId": "com.example.app", "rating": [1, 2], "territory": "USA", "limit": 100 }
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
appId | string | いいえ | App Store Connect の数値アプリ ID です。これまたは bundleId を指定してください | |
bundleId | string | いいえ | バンドル ID です。これまたは appId を指定してください | |
rating | list of number | いいえ | 指定した星評価のみを対象にします | |
territory | string | いいえ | 指定したストアフロントのレビューのみを対象にします | |
sort | one of -createdDate, createdDate, rating, -rating | いいえ | "-createdDate" | 並べ替え順です。デフォルトでは新しい順です |
limit | number | いいえ | 100 | 複数ページにわたって返すレビューの最大数です |
maxPages | number | いいえ | 5 | 取得するページの最大数です |
meanOfFetched と histogramOfFetched を報告します。「評価」そのものを報告することはありません。これらはこの呼び出しで返されたレビューのみを対象とする値です。絞り込みや途中で切り詰められたページでは、同じ名前で異なる数値を示すことになるためです。App Store Connect には評価の集計リソースがありません。このことは Apple 独自の OpenAPI 仕様で確認できます。「rating」に一致するパスはすべて、年齢レーティングです。
app_store_discovery
リスティングのテキスト以外の App Store の項目を読み取ります。検索キーワード(Apple が実際にインデックス登録しているキーワード一覧。ロケールごとに保持)、アプリタグ、プロダクトページ最適化の実験、カスタムプロダクトページ、アプリ内イベント、配信地域、レビューの要約が対象です。
{ "bundleId": "com.example.app", "locales": ["en-US", "ar-SA"], "platform": "IOS" }
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
appId | string | いいえ | App Store Connect の数値のアプリ ID。これを指定するか、bundleId を指定してください | |
bundleId | string | いいえ | バンドル ID。これを指定するか、appId を指定してください | |
include | searchKeywords、appTags、experiments、customProductPages、appEvents、availability、reviewSummarizations のいずれかのリスト | いいえ | [] | 読み取る項目。空の場合はすべてを読み取ります |
limit | number | いいえ | 50 | リソースごとの行数 |
locales | string のリスト | いいえ | ["en-US"] | searchKeywords など、ロケールごとのリソースに使用するロケール |
platform | IOS、MAC_OS、TV_OS、VISION_OS のいずれか | いいえ | "IOS" | プラットフォームが必要なリソースで使用するプラットフォーム |
includeRows | boolean | いいえ | false | 件数に加えて、生の行をすべて含めます。要約の呼び出しが大きくならないよう、デフォルトでは無効です |
各リソースには、それぞれ必須パラメーターがあります。searchKeywords にはプラットフォームとロケールの両方によるフィルターが必要です。appAvailabilityV2 は単一の関連リソースであり、limit を指定するとエラーになります。このキーまたはアプリで取得できないリソースは、空のリストではなく available: false として報告されます。「実験がない」ことと「実験を読み取れない」ことは、異なる回答だからです。
crux_field_data
Chrome UX Report による、オリジンまたは単一 URL の実ユーザー環境での Core Web Vitals です。現在の 28 日間のフィールドデータが、p75 と完全なヒストグラムのビンとともに返されます。
{ "origin": "https://example.com", "formFactor": "PHONE" }
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
origin | string | いいえ | https://example.com のようなオリジン。配下のすべてのページを集計します。origin または url のいずれかを指定してください。両方は指定できません | |
url | string | いいえ | 単一のページ URL。origin または url のいずれかを指定してください。両方は指定できません | |
formFactor | PHONE、TABLET、DESKTOP のいずれか | いいえ | デバイスの種類。すべての種類をまとめる場合は省略します | |
metrics | string のリスト | いいえ | 取得する指標名。利用可能なすべての指標を取得する場合は省略します |
これはフィールドデータであり、ラボテストではありません。Lighthouse の監査には pagespeed を引き続き使用してください。Google は PageSpeed 独自の実環境データを廃止するため、今後はここでフィールド測定値を取得します。匿名化されたサンプルが少なすぎるオリジンでは、エラーやゼロ値ではなく、注記とともに hasData: false が返されます。LCP がゼロだと、壊滅的なリグレッションと誤解されるためです。
crux_history
同じフィールド指標を週ごとの系列として返します。履歴は約 6 か月分です。
{ "origin": "https://example.com", "formFactor": "PHONE", "collectionPeriodCount": 25 }
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
origin | string | いいえ | https://example.com のようなオリジン。配下のすべてのページを集計します。origin または url のいずれかを指定してください。両方は指定できません | |
url | string | いいえ | 単一のページ URL。origin または url のいずれかを指定してください。両方は指定できません | |
formFactor | PHONE、TABLET、DESKTOP のいずれか | いいえ | デバイスの種類。すべての種類をまとめる場合は省略します | |
metrics | string のリスト | いいえ | 取得する指標名。利用可能なすべての指標を取得する場合は省略します | |
collectionPeriodCount | number | いいえ | 返す週次期間の数。1〜40 を指定します。ドキュメントに記載されている履歴は約 6 か月分ですが、実際に取得できる期間は API によって決まります |
各期間は 28 日間のローリングウィンドウで、週ごとにずらして集計されます。そのため、連続するデータポイントは 3 週間分重なり、週ごとの変化は独立した変化ではありません。サンプル数が少なすぎる期間も削除されず、系列内の位置を保つために null になります。これにより、値と collectionPeriods の対応が維持されます。
app_store_sales
App Store Sales and Trends を読み込みます。SKU 別に集計された、日ごと、地域ごと、アプリごとのダウンロード数です。
{ "reportDate": "2026-08-30", "frequency": "DAILY", "reportType": "SALES", "reportSubType": "SUMMARY" }
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
reportDate | string | no | レポートの日付です。DAILY と WEEKLY では YYYY-MM-DD(WEEKLY は週の終了日)、MONTHLY では YYYY-MM、YEARLY では YYYY を指定します。頻度に応じた直近の完了済み期間がデフォルトです | |
frequency | one of DAILY, WEEKLY, MONTHLY, YEARLY | no | "DAILY" | レポート期間 |
reportType | one of SALES, PRE_ORDER, SUBSCRIPTION, SUBSCRIPTION_EVENT, SUBSCRIBER, INSTALLS, FIRST_ANNUAL | no | "SALES" | Sales and Trends のレポートタイプ |
reportSubType | one of SUMMARY, DETAILED, SUMMARY_INSTALL_TYPE, SUMMARY_TERRITORY, SUMMARY_CHANNEL | no | "SUMMARY" | レポートのサブタイプ |
version | string | no | デフォルトが受け入れられない場合に指定するレポートのバージョン(例:1_0、1_3) | |
includeRows | boolean | no | false | SKU ごとの概要に加えて、すべてのレポート行を含めます |
SEO_MCP_ASC_VENDOR_NUMBER を設定します。App Store Connect では、「Payments and Financial Reports」の法人名の横にベンダー番号が表示されます。Sales and Trends を利用するには、Admin、Finance、または Sales and Reports のロールを持つチームキーが必要です。日次レポートは翌日に生成されるため、デフォルトのレポート日付は今日ではなく2日前です。reportDate には、頻度に応じた形式を指定します。DAILY および、週の日曜日を終了日とする WEEKLY では YYYY-MM-DD、MONTHLY では YYYY-MM、YEARLY では YYYY です。省略すると、頻度に応じた直近の完了済み期間がデフォルトになります。
売上がない期間では、エラーではなく注記とともに hasData: false が返されます。売上のない日が連携の不具合のように見えないためです。ユニット数は Sales and Trends のパイプラインから取得されます。これは App Analytics とは別のものであり、数値が一致しない場合があります。
play_vitals
Play Developer Reporting API から Android vitals を読み込みます。クラッシュ率、ANR 率、エラー数、起動メトリクスを、日次または時間単位で取得し、versionCode や countryCode などによる任意の内訳を指定できます。
{ "packageName": "com.example.app", "metricSets": ["crashRate", "anrRate"], "days": 28 }
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
packageName | string | yes | Android のパッケージ名 | |
metricSets | list of one of crashRate, anrRate, errorCount, slowStartRate, excessiveWakeupRate | no | ["crashRate","anrRate"] | クエリする Android vitals のメトリクスセット |
aggregationPeriod | one of DAILY, HOURLY | no | "DAILY" | DAILY は America/Los_Angeles、HOURLY は UTC でレポートされます |
days | number | no | 28 | 何日前までクエリするか |
dimensions | list of string | no | [] | versionCode や countryCode などの内訳ディメンション |
pageSize | number | no | 1000 | メトリクスセットごとの行数 |
includeRows | boolean | no | false | 件数に加えてすべての行を含めます。概要の呼び出しが大きくならないよう、デフォルトでは無効です |
SEO_MCP_PLAY_CREDENTIALS にサービスアカウントキーを設定します。設定されていない場合は GOOGLE_APPLICATION_CREDENTIALS が使用されます。また、Play Console の「Users and permissions」で、そのアカウントにアプリ情報とアプリ品質の閲覧権限を付与する必要があります。トークンは playdeveloperreporting スコープ用に発行されます。この権限は、play_store_stats に必要な Cloud Storage 読み取り権限とは別のものです。1つのアカウントに両方の権限を付与できますが、バケット権限しか持たないキーでは、ここで 403 が返されます。
API が報告するデータの最新時点に合わせて期間の上限が調整されます。API は終了日がその時点を超えると拒否するため、今日までのデータを要求すると必ず失敗します。結果には実際のデータの最新時点が示されるため、既知の日付までの行数がゼロの場合と、その日のデータがまだ反映されていないために行数がゼロの場合を区別できます。この API は獲得やコンバージョンのデータを扱いません。これらのデータは play_store_stats で取得できます。
Google Ads
コンソールではなく API を通じてアカウントを読み取ります。コンソールのテーブルはページ分割されるため、最初の画面を見ただけで数を数えると、間違いに気づかないことがあります。キーワード数が実際には 5 件なのに 2 件と読み取られたことがありました。テーブルには 10 行表示され、実際には 14 件あったためです。これらのツールはすべての行を返します。
GOOGLE_ADS_DEVELOPER_TOKEN、GOOGLE_ADS_CLIENT_ID、GOOGLE_ADS_CLIENT_SECRET、GOOGLE_ADS_REFRESH_TOKEN、GOOGLE_ADS_CUSTOMER_ID を設定してください(ハイフンは省略できます)。便利な機能が 2 つあります。GOOGLE_ADS_CLIENT_SECRET_PATH を使うと、Google Cloud から提供される OAuth クライアント JSON からクライアント ID とシークレットを読み取ります。また、GOOGLE_ADS_ENV_FILE で既存の .env 形式のファイルを指定すると、これらの値を読み取ります。これにより、すでにどこかに保存されているリフレッシュトークンをコピーせず、そのまま読み込めます。プロセス環境の値はファイルの値より優先されます。GOOGLE_ADS_API_VERSION で API バージョンを上書きできます。
ads_campaigns
期間内のキャンペーン名、ステータス、1 日あたりの予算、インプレッション数、クリック数、費用、コンバージョン数を返します。
{ "days": 30 }
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
days | 数値 | いいえ | 30 | 今日までの過去何日分をレポートするか |
ads_keywords
すべてのキーワードについて、状態、実効 CPC 入札額、承認ステータス、配信ステータス、指標を返します。
ELIGIBLE は配信中という意味ではありません。 承認済みで配信可能という意味であり、一時停止中のキーワードにも表示されます。そのため、status も併せて返します。これがなければ、一時停止中のキーワードの行は配信中のキーワードと見分けがつかず、キーワードを 3 件一時停止したばかりの人は、一時停止が反映されていないと判断してしまいます。一時停止中のキーワードは除外せず、注記に記載します。行を黙って除外するのは、さらに下のレイヤーで同じ失敗を招くからです。アカウントにキーワードがあるか尋ねても、何も返ってこないことになります。意図的に絞り込むには status を渡してください。
{ "days": 30 }
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
days | 数値 | いいえ | 30 | 今日までの過去何日分をレポートするか |
status | ENABLED、PAUSED、REMOVED のいずれか | いいえ | 1 つのキーワード状態に絞り込みます。省略すると、行を黙って除外することで、このツールで数えた件数がコンソールでの集計と同じように間違うことがないよう、すべてのキーワードを状態とともに返します |
ads_ads
すべての広告について、広告の強度、ポリシー承認ステータス、配信ステータス、指標を返します。
{ "days": 30 }
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
days | 数値 | いいえ | 30 | 今日までの過去何日分をレポートするか |
ads_ad_copy
広告に実際に書かれている内容を読み取ります。ads_ads でわかるのは ID、強度、承認状況、ステータスです。このツールではテキストを読み取ります。これは、あらゆるクリエイティブに関する質問で必要になる情報であり、そうでなければブラウザーで調べることになる理由でもあります。
{ "adGroup": "brand-exact" }
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
adGroup | string | いいえ | 名前を指定して、1 つの広告グループに絞り込みます。省略すると、アカウント内のすべての広告を読み取ります。見出しが広告グループ間で重複しているかを確認する場合に使います | |
adId | string | いいえ | 数値 ID を指定して、1 つの広告に絞り込みます。配信されるはずだった広告コピーを読み返す場合に使います | |
includeRemoved | boolean | いいえ | false | 削除済みの広告も含めます。デフォルトでは無効です。削除済み広告のコピーは過去の記録であり、配信中の広告を探す妨げになるためです |
すべての見出しと説明文について、固定表示の設定と Google 独自のパフォーマンスラベルに加え、表示パス、最終 URL、制限付きまたは不承認のステータスの原因となったポリシーのトピックが返されます。承認状況の表示は問題があることを示し、トピックはその問題の内容を示します。 TRADEMARKS_IN_AD_TEXT とともに表示される APPROVED_LIMITED は修正の手掛かりになりますが、APPROVED_LIMITED だけでは、管理画面を開いて確認する必要があります。
また、広告ごとの表示では確認できない次の 2 つの質問にも答えます。
- 強度が「低い」理由。 Google が求める内容に対するアセット数(
3 of 15 headlines, 2 of 4 descriptions)と、固定表示されているアセットの数を確認できます。固定表示はたいてい意図的に設定されていますが、強度の表示には反映されないことが多く、コピーの質に見合わない低い強度の原因にもよくなります。1 つの広告内で重複しているテキストも示されます。重複したアセットは、バリエーションを増やさずに枠を消費するためです。 - 見出しが広告間で重複しているか。 複数の広告で使われている見出しテキストが、それを含む広告および広告グループとともに一覧表示されます。同じ広告グループ内の 2 つの広告で見出しが共通していても、互いにテストされる 2 つのバリエーションではありません。管理画面をざっと見ても、そのことはわかりません。
includeRemoved を設定しない限り、削除済みの広告は除外されます。また、これらのフィールドにテキストが含まれるのはレスポンシブ検索広告のみです。それ以外の広告タイプは、何も書かれていない広告としてではなく、広告タイプとコピーなしで一覧表示されます。広告、キャンペーン、アカウントに紐づくサイトリンク、プロモーション、価格などのアセットは、ここでは読み取られません。そのため、この出力では内容が少なく見える広告でも、アセットとともに配信されている場合があります。
ads_assets
広告に付加されているものを、サイトリンク、コールアウト、構造化スニペット、プロモーション、価格、通話、画像の各アセットについて、3 つすべての階層で確認できます。種類や ID だけでなく、それぞれに実際に何が書かれているかも分かります。
{ "campaign": "search-uk-us-2026-09" }
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
campaign | string | いいえ | キャンペーン名を指定して、キャンペーンと広告グループのアセットを 1 つのキャンペーンに絞ります。アカウントレベルのアセットは、このキャンペーンを含むすべてのキャンペーンに適用されるため、引き続き一覧表示されます | |
type | one of SITELINK, CALLOUT, STRUCTURED_SNIPPET, PROMOTION, PRICE, CALL, IMAGE | いいえ | アセットの種類を 1 つに絞ります。省略すると、このツールに整形された読み取り機能がない種類も含め、すべての種類が一覧表示されます | |
includeRemoved | boolean | いいえ | false | ステータスが削除済みのリンクを含めます。デフォルトでは無効です。削除済みのアセットは過去のものであり、配信可能なアセットを一覧から押し出してしまうためです |
プロモーションは PROMOTION #4417 ではなく、最大20%オフのProプラン、コードLAUNCH20、2026-01-01~2026-01-31 のように読み取れます。Googleでは、プロモーションの割引率が百万分率で示され、1,000,000 が 100% に相当するため、生のフィールド値は割引率として認識しにくい数値です。価格には商品内容と通貨が、サイトリンクには説明が含まれます。
結果を読む前に知っておくべきことが 3 つあります。
- アカウントレベルのアセットはすべてのキャンペーンに適用されるため、キャンペーンを 1 つ指定しても一覧に表示されます。これは
ads_ad_copyのもう一方の側面です。そこで広告が簡素に見えても、キャンペーンには紐付いていない 4 つのサイトリンクやプロモーションが、広告と一緒に配信されている場合があります。 - 付加されていることと、表示されることは別です。 Google はオークションごとに、アセットを表示するかどうか、どのアセットを表示するかを決定します。ここで分かるのは配信可能なアセットであり、実際に配信されたアセットではありません。
- 一致するキャンペーン名がない場合は、空の結果を返さず、エラーになります。 以前は、名前に誤りがあってもエラーなしで 0 行が返され、その横に「アカウントレベルのアセットも一覧表示されます」という注記が表示されていました。そのため、読んだ人はアカウントにアセットがないと判断していました。読み取りを始める前に名前を解決するため、存在しない名前の場合はその旨が示されます。キャンペーン名を間違えるのは、まさにその後で「このキャンペーンにはサイトリンクがない」と言って、それをもとに行動する呼び出し元です。
- 読み取れない階層は、その場でエラーとして報告されます。 3 つの階層はそれぞれ別のクエリで取得されるため、1 つが失敗しても、残り 2 つは
levelErrorsに失敗した階層を示して返されます。「クエリに失敗した」という意味をひそかに含む空のリストは、「何も付加されていない」と読まれてしまいます。これは、このツールに寄せられる唯一の質問に対する誤った回答です。
このツールに整形された読み取り機能がない種類は、アセットの種類とフィールドの種類を示すにとどめ、独自の要約は作成しません。たとえば、BUSINESS_NAME として登録された TEXT アセットは、主に後者の種類で説明されます。通常、アセットの種類とフィールドの種類は同じ語なので、異なる場合にのみフィールドの種類を表示します。重複を避けるためです。ここではアセットの指標は報告されません。
ads_query
整形された読み取り機能では対応できない質問に対して、任意の GAQL SELECT を実行します。GAQL には SELECT 以外のステートメントがないため、これによって何かが変更されることはありません。SELECT で始まらないクエリは拒否されます。
{ "query": "SELECT campaign.name, metrics.cost_micros FROM campaign WHERE segments.date DURING LAST_7_DAYS" }
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
query | string | はい | GAQL の SELECT ステートメントです。GAQL にはほかのステートメントがないため、これによって何かが変更されることはありません |
ads_search_terms
広告を実際に表示させた検索クエリと、それぞれが一致したキーワードです。有料検索における Search Console のクエリディメンションに相当し、同じ注意点があります。Google は検索数が少なすぎる語句を開示しないため、一覧にない語句は存在しないのではなく、不明です。
{ "days": 90, "minImpressions": 1 }
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
days | number | いいえ | 30 | 今日までの何日分をレポートするか |
minCost | number | いいえ | 0 | 期間中の費用がこの値に満たない検索語句を除外します |
minImpressions | number | いいえ | 0 | インプレッション数がこの値に満たない検索語句を除外します |
zeroConversionsOnly | boolean | いいえ | false | コンバージョンがなかった語句のみを保持します。これが除外キーワードに追加するリストです |
ads_changes
アカウントで何が、いつ、どのフィールドで、誰によって変更され、それがツールによるものかブラウザー上の操作によるものかを示します。後者と前者の client はそれぞれ GOOGLE_ADS_API と GOOGLE_ADS_WEB_CLIENT です。これは ads_update によるすべての書き込みと、コンソール上で手動で行われた編集の監査証跡です。Google が保持するのは30日分のため、それより長い期間は、黙って短縮されるのではなく拒否されます。
{ "days": 14, "limit": 100 }
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
days | number | いいえ | 14 | 現在までの変更履歴を何日分読み取るか。Google が保持するのは30日分で、それを超える期間は拒否されます |
limit | number | いいえ | 100 | 返す最新の変更件数 |
ads_negatives
キャンペーン、広告グループ、または共有セットのレベルですでに設定されている除外キーワードです。除外キーワードはブロックした記録を残さずにトラフィックを遮断するため、キーワードの配信が停止し、問題が見当たらないときや、すでに登録されている可能性がある語句を追加する前に確認するリストです。
{ "level": "all" }
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
level | one of campaign, adGroup, sharedSet, all | いいえ | "all" | 読み取る除外キーワードの範囲。キャンペーンレベルでブロックされた語句は、そのキャンペーン全体でブロックされます。共有セットは、紐付けられたすべてのキャンペーンに適用されます |
ads_negatives_update
ネガティブキーワードを一括で追加または削除します。各キーワードは一つずつ列挙します。パターン形式やすべてに一致する形式をあえて用意していません。「X に一致するすべての語句をブロックする」操作は、タイプミス一つでアカウント全体に影響するおそれがありますが、明示的なリストならその間違いを防げます。
{ "action": "add", "level": "campaign", "target": "search-uk-us", "keywords": ["free", "crack"], "matchType": "EXACT", "dryRun": false }
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
action | add または remove のいずれか | はい | ネガティブキーワードを追加するか、既存のものを削除します。削除も追加と同じくらい重要です。間違ったネガティブキーワードは、何も表示されなくなる形で現れます | |
level | campaign または adGroup のいずれか | いいえ | "campaign" | ネガティブキーワードを適用する場所です。キャンペーンレベルのネガティブキーワードは、そのキャンペーン全体で語句をブロックします |
target | string | はい | キャンペーン名または広告グループ名です。完全一致する対象が一つだけの場合に限り、変更が適用されます | |
keywords | string のリスト | はい | ネガティブキーワードです。一つずつ列挙します。パターン形式やすべてに一致する形式はありません。セレクターは、タイプミス一つでキャンペーン全体をブロックするおそれがあります | |
matchType | BROAD、PHRASE、EXACT のいずれか | いいえ | "EXACT" | 各語句をブロックする方法です。BROAD は、すべての単語を含む検索クエリをブロックします。キャンペーンを気づかないうちに停止させるおそれがある設定です |
dryRun | boolean | いいえ | true | 何も変更せずに、変更内容と、追加を提案したネガティブキーワードが配信中のキーワードをブロックするかどうかを報告します |
confirm | boolean | いいえ | false | ガードに抵触していても一括処理を実行します。ドライランで抵触した内容が一覧表示されるため、すでに確認した内容を承認することになります |
ネガティブキーワードは費用を減らすだけなので安全だと感じられますが、その直感こそが危険です。入札単価を間違えると費用として現れます。ネガティブキーワードを間違えると何も現れません。トラフィックが届かなくなり、その語句は検索語句レポートから消え、どこにも理由を示す行はありません。バックアッププラグインのキャンペーンに backup をブロード一致のネガティブキーワードとして追加すると、トラフィックが止まります。Google にとっては完全に有効なネガティブキーワードなので、エラーは報告されません。
そのため、追加する前に、提案されたすべてのネガティブキーワードをキャンペーン内の配信中のキーワードと照合します。confirm が設定されていない場合、一括処理は拒否されます。拒否メッセージには、どのような損失が発生するかが示されます。"backup" as a BROAD negative would block this campaign's own keyword "wordpress backup", which served 41 impressions。照合処理は Google のマッチングをできるだけ忠実に再現しますが、最終的な判断基準は Google です。誤警告は説明文一つで済みますが、見逃しはキャンペーンに損失をもたらすため、意図的に広めに判定します。
削除は衝突チェックの対象外です。ネガティブキーワードを削除すればトラフィックが通るようになるだけで、その変化は配信停止ではなく費用として現れます。
ads_update
キーワードの入札単価、キャンペーンの日予算、キャンペーンのステータス、広告のステータス、またはキーワードのステータスを変更します。ここで金銭を消費するのはこのツールだけなので、誤って実行しにくいように設計されています。
キーワードの一時停止は、入札単価を下げるのとは別の操作です。 入札単価を下げたキーワードは、引き続き有効で、配信対象となり、同じ日予算をめぐって競合します。予算が制約になっていることが操作の理由なら、入札単価を下げても予算はまったく解放されません。
{ "kind": "budget", "target": "search-uk-us-2026-09", "value": "5.00", "dryRun": false, "confirm": true }
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
kind | bid、budget、campaignStatus、adStatus、keywordStatus のいずれか | はい | 変更する内容です。キーワードの上限 CPC 入札単価、キャンペーンの日予算、キャンペーンのステータス、広告のステータス、またはキーワードのステータスを指定します。1 つのキーワードの配信を停止するには keywordStatus を使用します。入札単価を下げるのとは異なり、キーワードは配信対象のまま、同じ予算をめぐって競合し続けます | |
target | 文字列 | はい | キーワードのテキスト、キャンペーン名、または数値の広告 ID です。完全一致する対象が 1 つでなければ、呼び出しは拒否されます | |
value | 文字列 | はい | 入札単価または予算の新しい金額(ドル)、またはステータスの一時停止/有効化を指定します | |
dryRun | ブール値 | いいえ | true | 何も変更せず、変更内容と抵触するガードを報告します。デフォルトで有効です。このツールは金銭を消費するため、変更を実行するには明示的な依頼が必要です |
confirm | ブール値 | いいえ | false | ガードに抵触する変更を実行します。ドライランでは無視されます。ドライランでガードに抵触する理由が一覧表示されるため、これは未確認のものではなく、すでに確認した内容を承認する設定です |
4 つの安全策は、いずれも仮定ではなく実際の失敗をもとに設けられています。
- デフォルトではドライランです。
dryRunのデフォルトは true なので、省略すると変更内容を報告して停止します。必須パラメーターにするほうがコマンドラインフラグより確実です。フラグは付け忘れることがありますが、デフォルトは忘れられません。 - 一致する対象が 1 つでなければ拒否します。 対象が何にも一致しない場合はタイプミスです。2 つに一致する場合は、指定していないものを変更するリクエストです。どちらの場合も、書き込み前に停止します。
- 理由を明記したガードを設けています。 現在の金額の 3 倍を超える変更、1 件の入札単価または日予算で 25 ドルを超える変更、あるいは現在配信中のものを一時停止する変更が対象です。予算の変更では月額換算額も表示します。1 日 30 ドルは少額に見えても、月額では約 912 ドルになります。ドライランで理由が一覧表示され、
confirmによって、未確認のものではなく、すでに確認した内容を承認します。 - 書き込み後に値を読み戻します。 HTTP 200 はリクエストが受け付けられたことを意味するだけで、意図した値が保存されたことを示すものではありません。結果には
readBackとmatchesが含まれ、不一致があればエラーとして返されます。
変更が実質的に何も変えない場合は、意味のない変更リクエストを送信せず、その旨を通知します。
コマンドラインからこのツールを使うには、--allow-write に加えて --allow-spend が必要です。「サイトマップを再送信すること」と「日予算を 3 倍にすること」の両方を 1 つのフラグで許可するのは、安全策とはいえません。
ads_keyword_create
広告グループにキーワードを1つ追加します。ここで唯一、変更ではなく作成を行うツールであり、そのため異なる方法でガードされています。
{ "keyword": "wordpress backup plugin", "adGroup": "brand-exact", "bid": 1.2, "dryRun": false }
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
keyword | string | はい | 追加するキーワードのテキストです。このツールは記述されたとおりに作成し、バリエーションを推測しません | |
adGroup | string | はい | 追加先の広告グループです。完全に一致するものが1つ見つからなければ、何も追加されません | |
bid | number | はい | ドル単位の上限クリック単価です。作成時には比較する現在の入札額がないため、サイズのチェックは上限値に対してのみ行われます | |
matchType | one of EXACT, PHRASE, BROAD | いいえ | "EXACT" | キーワードのマッチ方法です。記述された内容どおりに購入する唯一の方法なので、デフォルトは EXACT です。PHRASE と BROAD はここに記述されたテキストより広く購入するため、どちらもガードに引っかかります |
dryRun | boolean | いいえ | true | 何も追加せずに、追加される内容と該当するガードを報告します |
confirm | boolean | いいえ | false | ガードに引っかかっても追加します。ドライランではすべての理由が表示されるため、すでに確認した内容を承認することになります |
このパッケージ内のほかの書き込み操作では、現在の値を読み取り、指定された値と比較して、すでに一致している場合は拒否します。**作成には現在の値がありません。**比較するものも、比較して拒否するものもないため、比較を省略するのではなく別の処理に置き換える必要があり、その処理が重複チェックです。
- **対象の広告グループにすでに存在するキーワードは、削除済みのものも含めて拒否されます。**削除済みの条件にもテキストは残っており、Google はインターフェースに表示されないリソースを示すエラーとともに重複を拒否します。事前に知らされていないと戸惑う原因になります。
- **アカウント内の別の場所に同じキーワードがある場合は、拒否ではなくガードに引っかかります。**同じテキストを2つの広告グループで使うのは意図的な場合があるため、拒否すると正当な構成が不可能になります。一方、何も通知しなければ、同じ予算をめぐって2つのキーワードが競合していることに気づけません。
- デフォルトは
EXACTです。PHRASEとBROADはどちらもここに記述されたテキストより広く購入するため、それぞれガードに引っかかります。BROAD は、購入するつもりのなかった検索にも費用を使うマッチタイプです。 - 書き込み後にキーワードを読み戻し、マッチタイプとステータスを送信内容と比較します。作成時の 200 は受け付けられたことを意味し、存在していて内容も正しいことを示すものではありません。
明記しておくべき非対称性が1つあります。作成したキーワードはすぐに配信を開始し、入札額の変更とは異なり、戻すための以前の状態はありません。取り消すには、作成したキーワードを一時停止するか削除する必要があります。
ads_update_batch
複数のキーワードの入札単価、または複数のキャンペーンの日予算を、1 回の呼び出しで変更します。1 回の呼び出しで指定できるのは 1 種類だけです。入札単価と予算の合計では、クリック単価の上限と 1 日あたりの金額を足すことになり、その合計を正直に説明できる文章はありません。
{ "kind": "bid", "changes": [{ "target": "wordpress backup", "value": 0.85 }, { "target": "backup plugin", "value": 0.6 }], "dryRun": false, "confirm": true }
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
kind | bid、budget のいずれか | はい | 1 回の呼び出しで指定できるのは 1 種類だけです。合計額のガードが正確に機能するのは 1 種類の中だけです。入札単価と予算はドル単位で合算できますが、ステータスは合算できず、混在させると合計の意味がわからなくなります | |
changes | JSON リスト | はい | それぞれ固有の値を持つ、名前付きのペアのリストです。セレクター形式はありません。明示的に列挙すれば、パターンのような間違いは起こりません | |
dryRun | boolean | いいえ | true | 各エントリーを解決して価格を計算し、合計を報告します。変更は行いません |
confirm | boolean | いいえ | false | ガードに抵触していてもバッチを実行します。ドライランにはすべての理由が一覧表示されるため、すでに確認した内容を承認できます |
これは、複数の対象に適用するルールではなく、名前付きのペアのリストです。「すべてを 20% 引き上げる」といった指定やセレクターはありません。このツールが防ごうとしているのは、まさにセレクターを使うと簡単に起こる間違いだからです。呼び出し元が想定したより多くの対象に一致するパターンを、適用前に結果の一覧を確認できないまま実行してしまいます。各エントリーには対象を 1 つ指定し、その値を最終的にいくらにするかを記入します。ドライランでは、その一覧がそのまま出力されます。
ads_update をループで呼び出す場合と比べて、このツールには次の 4 つの違いがあります。
- 書き込みを始める前に、すべての対象を解決します。 4 番目のエントリーが何にも一致しなかった場合、1〜3 番目のエントリーはまだ反映されていません。単一の呼び出しをループすると途中で失敗し、誰も選んでいない状態のままアカウントが残ります。そのことを示す行がどこにも記録されません。
- 各エントリーだけでなく、合計額にもガードを適用します。 それぞれがエントリー単位の上限内でも、5 件の引き上げをまとめると大きな支出変更になります。1 件ずつ実行すると、それに気づかないまま進んでしまいます。
- ほかと大きく異なる 1 件を特定します。 19 件の入札単価を数セントずつ動かし、1 件を 40 ドル動かしても、すべての上限内に収まることがあります。それでも、それが間違いかもしれません。バッチの中央値と比べて変更幅が大きいエントリーには名前を付けて警告します。誤入力は許容範囲内の合計額に紛れ込みます。これこそ、バッチが同じ変更を 1 件ずつ送る場合と異なる理由です。
- 同じ対象を 2 件のエントリーに指定することはできません。 同じ対象を 2 回指定すると拒否されます。また、予算を共有する、名前の異なる 2 つのキャンペーンも拒否されます。こうした指定では合計額が二重に計上され、2 回目の書き込みが何も通知されずに優先されてしまうためです。
エントリー単位の上限は、リストの長さに関係なく一定です。各エントリーについて確認すべきなのは、その 1 件が誤入力かどうかであり、バッチが大きくなっても誤入力が許容されるわけではないためです。バッチ合計の上限は、バッチの規模に応じて緩やかに増えます。20 件は 1 件の 20 倍のリスクではなく、1 度に行う 1 つの判断です。現実的なバッチのたびに作動するガードはガードではなく、ただのチェックボックスです。そして confirm が日常的に使われるようになると、その内容は読まれずに渡されるようになります。
ガードに抵触したかどうかにかかわらず、合計額は必ず文章で示されます。実際に読まれるのはその文章であり、ガードの役割は問題がある場合に処理を止めることだけだからです。予算の場合は、どちらの金額も月額に換算して示します。These daily budgets come to $13.00 a day, about $395 a month, up from $10.00 a day, about $304 a month.
書き込み後は、各エントリーの値を 1 件ずつ読み戻します。送信した値が保存されなかったエントリーを先に、続いて現在アカウントに保存されている値とともに、反映されたエントリーを結果に示します。一部だけ反映された場合に重要なのは、件数ではなく、どのエントリーかだからです。リクエストが 1 件受け付けられたことは、N 個の値が保存されたことを意味しません。一部だけ反映されたことが隠れやすいのが、まさにバッチです。バッチは部分的な失敗が発生しない形で 1 件のリクエストとして送信されるため、書き込みが拒否されても変更は何も残りません。エラーにはそのことが明記されるので、推測する必要はありません。
ads_update と同様に、コマンドラインから実行するには --allow-spend と --allow-write の両方が必要です。
コマンドラインからツールを実行する
上記のすべてのツールは MCP クライアントなしでも実行できます。後続の実行と差分を取れるよう、結果をファイルに保存する必要がある場合に使用してください。
seo-mcp query search_analytics --site-url sc-domain:example.com --start-date 2026-08-05 --out /tmp/sa.json
seo-mcp query --help # list the tools
seo-mcp query wporg_plugin --help # list one tool's parameters
実行ごとに、stderr に使用中のバージョンが表示されます(seo-console-mcp 0.15.1 running wporg_plugin)。そのため、stdout は解析可能なまま保たれ、--out ファイルには純粋な JSON が保存されます。結果には、どのバイナリが生成したかは示されません。これは机上の話ではありません。npx は古いビルドをキャッシュから再利用してもエラーを出さず、インストールに失敗すると、以前のバージョンがそのまま残って動作します。実際に実行されているバージョン、バージョン範囲から解決されるバージョン、npm が latest と呼ぶバージョンの3つは、通常は一致しますが、それぞれ独立しているため、必ず一致するとは限りません。
フラグにはツールのパラメーター名をケバブケースで指定します(siteUrl に対して --site-url)。キャメルケース表記も使えます。リスト値はカンマ区切りです。結果は --out に書き込まれます。省略した場合は stdout に出力され、失敗するとメッセージを stderr に出して、ゼロ以外の終了コードで終了します。MCP サーフェスが公開しているものと同じ実装を実行するため、両者の挙動が異なることはありません。
データを変更するツール(submit_sitemap、delete_sitemap、request_recrawl、indexnow_submit)は、一覧で (write) とマークされています。--allow-write を指定しない限り、コマンドラインからの実行を拒否します。
履歴を残すのに必要なのは cron の行を1つ追加するだけです。サーバーにあえてスケジューラーを持たせていないのは、再起動後も動作するスケジューラーがすでにマシンにあるためです。
# every Monday at 06:00, one snapshot named after the moment it was taken
0 6 * * 1 seo-mcp query snapshot --properties sc-domain:example.com --out-path auto
開発
npm run dev
npm run build
npm test
npm run lint
npm run format
npm run format:check
npx tsc --noEmit
テストでは、注入された Google クライアントの偽物を使用し、稼働中の Google サービスは一切呼び出しません。サービスアカウントキーをコミットしないでください。*.key.json に加えて、このリポジトリでは credentials*.json、.env*、PEM ファイル、P12 ファイルも無視します。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。