MCPでCursorをSEOデータに接続する方法

CursorをGSC、Bing、GA4、AI visibility dataに安全に接続するためのexports、正規化、read-only MCP、承認済み編集までの実践チュートリアルです。

作るもの

このtutorialでは、CursorをSEO/GEO dataに接続しながら、エディタを危険な自動公開ロボットにしない方法を説明します。初心者に安全なpatternは、まずexports、次にnormalized files、3番目にread-only MCP、page editは承認済みopportunity reportの後だけ、という順番です。

作る構成は次のとおりです。

.cursor/
rules/
seo-geo-data-policy.mdc
seo-geo/
exports/
gsc/
bing/
ga4/
ai-visibility/
snapshots/
reports/
scripts/
normalize-seo-geo-data.mjs
mcp-seo-data-server.mjs

dataは判断材料として使います。data connectorにpage公開、URL送信、analytics設定変更、本番fileの自動編集をさせてはいけません。

CursorをGSC、Bing、GA4、AI visibility exportsに安全に接続するread-only data workflow

キャプション: 最初はexportとsnapshotで始め、MCPは読み取り専用の境界が固まってから追加します。

Step 1: data safety用のCursor ruleを作る

foldersを作ります。

mkdir -p .cursor/rules seo-geo/exports/gsc seo-geo/exports/bing seo-geo/exports/ga4 seo-geo/exports/ai-visibility seo-geo/snapshots seo-geo/reports scripts

project ruleを作ります。

cat > .cursor/rules/seo-geo-data-policy.mdc <<'EOF2'
---
description: SEO/GEO data access and edit safety
globs:
- "seo-geo/**"
- "scripts/**"
- "src/**"
- "app/**"
- "pages/**"
alwaysApply: false
---

For SEO/GEO data tasks:
- read exports from `seo-geo/exports/`
- write normalized snapshots to `seo-geo/snapshots/`
- write reports to `seo-geo/reports/`
- do not invent missing metrics
- do not paste secrets into prompts or files
- do not submit URLs, publish content, deploy, or change production files during data analysis
- separate GSC, Bing, GA4, SERP, and AI visibility signals
- cite source files for every recommendation
- ask before editing website pages
EOF2

Cursorのversionが別のrules UIを使う場合は、同じpolicyをproject rule画面に貼り付けます。

Step 2: sample exportsを追加する

まずはCSV/JSON filesから始めます。後でAPI/MCPに置き換えられます。

TODAY=$(date +%F)
cat > seo-geo/exports/gsc/$TODAY-pages.csv <<'EOF2'
url,query,clicks,impressions,ctr,position
/blog/reporting-automation,reporting automation software,34,4200,0.008,8.2
/features/reporting,reporting tool for startups,18,1900,0.009,11.4
EOF2

cat > seo-geo/exports/bing/$TODAY-queries.csv <<'EOF2'
query,clicks,impressions,ctr,position
reporting automation software,4,230,0.017,6.8
automate weekly reports,2,180,0.011,9.3
EOF2

cat > seo-geo/exports/ai-visibility/$TODAY-prompts.json <<'EOF2'
[
{
"prompt": "What is the best reporting automation software for startups?",
"surface": "manual-check",
"brand_mentioned": false,
"citation_url": null,
"competitors": ["Competitor A", "Competitor B"]
}
]
EOF2

Step 3: Cursorに戦略を聞く前にdataをnormalizeする

normalizerを作ります。

cat > scripts/normalize-seo-geo-data.mjs <<'EOF2'
#!/usr/bin/env node
import { readFileSync, writeFileSync, mkdirSync, readdirSync, existsSync } from 'node:fs';
import { join } from 'node:path';

const date = process.argv[2] || new Date().toISOString().slice(0, 10);
mkdirSync('seo-geo/snapshots', { recursive: true });
const rows = ['source,date,query_or_prompt,target_url,metric,value,evidence_url,confidence,raw_file'];

function latestFile(dir, suffix) {
if (!existsSync(dir)) return null;
return readdirSync(dir).filter(f => f.includes(date) && f.endsWith(suffix))[0] || null;
}

function addCsv(source, dir, suffix, metricField) {
const file = latestFile(dir, suffix);
if (!file) return;
const raw = readFileSync(join(dir, file), 'utf8').trim().split(/
?
/);
const headers = raw.shift().split(',');
for (const line of raw) {
const values = line.split(',');
const item = Object.fromEntries(headers.map((h, i) => [h, values[i] || '']));
rows.push([source, date, item.query || '', item.url || '', metricField, item[metricField] || '', item.url || '', 'medium', file].map(JSON.stringify).join(','));
}
}

addCsv('gsc', 'seo-geo/exports/gsc', '.csv', 'clicks');
addCsv('bing', 'seo-geo/exports/bing', '.csv', 'clicks');

const aiFile = latestFile('seo-geo/exports/ai-visibility', '.json');
if (aiFile) {
const items = JSON.parse(readFileSync(join('seo-geo/exports/ai-visibility', aiFile), 'utf8'));
for (const item of items) {
rows.push(['ai-visibility', date, item.prompt || '', '', 'brand_mentioned', String(Boolean(item.brand_mentioned)), item.citation_url || '', 'low', aiFile].map(JSON.stringify).join(','));
}
}

const out = `seo-geo/snapshots/${date}-normalized.csv`;
writeFileSync(out, rows.join('
'));
console.log(`Wrote ${out}`);
EOF2
chmod +x scripts/normalize-seo-geo-data.mjs
node scripts/normalize-seo-geo-data.mjs $(date +%F)

Step 4: Cursorには編集ではなくopportunity reportを依頼する

Cursor Agentに貼り付けます。

Use the Cursor rule `seo-geo-data-policy`.
Read the latest normalized CSV in `seo-geo/snapshots/`.
Create `seo-geo/reports/YYYY-MM-DD-opportunity-report.md`.

For each recommendation include:
- source file
- URL or prompt
- signal
- interpretation
- confidence
- action type: refresh, create, internal link, technical ticket, monitor, ignore
- files likely involved
- approval needed

Do not edit website pages yet. Do not publish. Do not submit URLs.

良い出力はsource fileを引用します。弱い出力はgenericな「SEOを改善する」助言になります。弱い場合は、各source rowを引用してやり直すようCursorに依頼します。

Step 5: file workflowが動いてからplaceholder MCP serverを追加する

意図した権限を明示するplaceholderを作ります。

cat > scripts/mcp-seo-data-server.mjs <<'EOF2'
#!/usr/bin/env node
// Placeholder for a read-only SEO/GEO MCP server.
// Future tools: get_gsc_pages, get_bing_queries, get_ga4_landing_pages,
// get_ai_visibility_snapshot. No write, submit, publish, or delete tools.
console.error('SEO/GEO MCP placeholder: read-only tools only.');
setInterval(() => {}, 1000);
EOF2
chmod +x scripts/mcp-seo-data-server.mjs

次にCursorへ依頼します。

Design a read-only MCP configuration for this project using `scripts/mcp-seo-data-server.mjs`.

Before editing settings, explain:
- where Cursor expects MCP configuration in this environment
- tool names
- input and output schemas
- credential handling
- how to disable write actions
- how to test with one read-only query

Do not add API credentials. Do not create write tools.

最終設定には、現在のCursor MCP settings UIまたはconfig formatを使ってください。CursorのMCP設定画面はversionやworkspaceで変わる可能性があります。

Step 6: report後に1ページだけ編集を承認する

opportunity reportができたら、1ページだけ承認します。

From `seo-geo/reports/YYYY-MM-DD-opportunity-report.md`, approve only the recommendation for `/features/reporting`.

Allowed action: metadata and opening answer block refresh.
Allowed files: [list files]
Not approved: schema, canonical, robots, sitemap, redirects, analytics, shared template edits.

Use data as private decision context. Do not cite analytics numbers in public copy unless explicitly approved.
Run validation and summarize changed files.

これでdata analysisとpublishingを分離できます。

Troubleshooting

Problem

Likely cause

Fix

Cursorがmissing metricsを作る

ruleが読み込まれていない

rule名を明示し、source filesを必須にする

opportunity reportが曖昧

normalized snapshotがない

先にnormalizerを実行する

MCP setupが広すぎるtoolsを要求する

tool boundaryが曖昧

read-only toolsだけを要求する

public copyにanalyticsが出る

dataをpublic proofとして使っている

promptに「private decision context」を追加する

Cursorが多すぎるfilesを編集する

approvalが広すぎる

1つのURLと正確なfilesだけを承認する

FAQ

始めるためにMCPは必要ですか?

いいえ。CSV exportsで十分です。MCPが重要になるのは、workflowが繰り返され、data freshnessが重要になってからです。

CursorにBingへURL送信やCMS更新をさせるべきですか?

最初のversionでは避けます。teamがworkflowを信頼できるまで、actionsはread-onlyに保ちます。

CursorはAI visibility snapshotsを分析できますか?

はい。prompt、surface、answer summary、brand mention、citation URL、competitors、dateをJSONまたはCSVに保存します。

AI coding agents for SEO/GEO 学習パス

Cursor track:

  1. Cursor vs Windsurf vs Gemini CLI:SEO/GEO自動化の選び方
  2. Cursor RulesでSEO/GEO作業環境を作る方法
  3. Cursor Plan ModeでSEOページを安全に更新する方法
  4. MCPでCursorをSEOデータに接続する方法
  5. Cursor Cloud AgentsでSEO/GEO PRレビューを行う方法
  6. Cursor、Windsurf、Gemini CLI、Codex、Claude CodeのSEO/GEO運用モデル

Sources and notes

Author: Leo Harrington, Auspiaで500以上のexecutive reportsを扱うSEO Analytics Translator。Leoはsearch dataとAI visibility dataをteamが実行できるdecisionに変える方法について執筆しています。

このトピックを読む

同じテーマの記事を続けて読む