作るもの
この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の自動編集をさせてはいけません。
キャプション: 最初は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:
- Cursor vs Windsurf vs Gemini CLI:SEO/GEO自動化の選び方
- Cursor RulesでSEO/GEO作業環境を作る方法
- Cursor Plan ModeでSEOページを安全に更新する方法
- MCPでCursorをSEOデータに接続する方法
- Cursor Cloud AgentsでSEO/GEO PRレビューを行う方法
- Cursor、Windsurf、Gemini CLI、Codex、Claude CodeのSEO/GEO運用モデル
Sources and notes
- Cursor documentation hub: Cursor Docs 。Agent、Rules、MCP、Skills、CLI、background/agent capabilitiesのpublic documentationを含みます。
- Related Auspia guide: Cursor vs Windsurf vs Gemini CLI for SEO/GEO Automation 。
Author: Leo Harrington, Auspiaで500以上のexecutive reportsを扱うSEO Analytics Translator。Leoはsearch dataとAI visibility dataをteamが実行できるdecisionに変える方法について執筆しています。