What you will build
This tutorial shows how to connect Cursor to SEO/GEO data without turning your editor into an unsafe publishing robot. The beginner-safe pattern is: exports first, normalized files second, read-only MCP third, page edits only after an approved opportunity report.
You will create:
.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
Use the data to inform decisions. Do not let data connectors publish pages, submit URLs, change analytics settings, or edit production files automatically.
Step 1: create a Cursor rule for data safety
Create the 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
Create a 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
If your Cursor version uses a different rule UI, paste the same policy into the project rule interface.
Step 2: add sample exports
Start with CSV/JSON files. You can replace them with API/MCP later.
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: normalize the data before asking Cursor for strategy
Create a 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: ask Cursor for an opportunity report, not edits
In Cursor Agent, paste:
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.
Good output cites files. Weak output gives generic “improve SEO” advice. If it is weak, ask Cursor to redo it and cite each source row.
Step 5: add a placeholder MCP server only after the file workflow works
Create a placeholder that makes your intended permissions explicit:
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
Then ask 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.
Use Cursor's current MCP settings UI or config format for the final setup, because Cursor's MCP configuration surface may vary by version and workspace.
Step 6: approve one page edit after the report
After the opportunity report is created, approve one page:
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.
This keeps data analysis separate from publishing.
Troubleshooting
| Problem | Likely cause | Fix |
|---|---|---|
| Cursor invents missing metrics | Rule is not loaded | Mention the rule and require source files |
| Opportunity report is vague | No normalized snapshot | Run the normalizer first |
| MCP setup asks for broad tools | Tool boundary is unclear | Require read-only tools only |
| Public copy exposes analytics | Data used as public proof | Add “private decision context” to prompt |
| Cursor edits too many files | Approval was too broad | Approve one URL and exact files |
FAQ
Do I need MCP to start?
No. CSV exports are enough. MCP matters when the workflow repeats and data freshness becomes important.
Should Cursor submit URLs to Bing or update CMS content?
Not in the first version. Keep actions read-only until the team trusts the workflow.
Can Cursor analyze AI visibility snapshots?
Yes. Store prompt, surface, answer summary, brand mention, citation URL, competitors, and date in JSON or CSV.
AI coding agents for SEO/GEO learning path
Cursor track:
- Cursor vs Windsurf vs Gemini CLI for SEO/GEO Automation
- How to Set Up Cursor Rules for SEO/GEO Work
- How to Use Cursor Plan Mode to Refresh SEO Pages Safely
- How to Connect Cursor to SEO Data with MCP
- How to Use Cursor Cloud Agents for SEO/GEO PR Reviews
- The SEO/GEO Operating Model for Cursor, Windsurf, Gemini CLI, Codex, and Claude Code
Sources and notes
- Cursor documentation hub: Cursor Docs , including public documentation for Agent, Rules, MCP, Skills, CLI, and background/agent capabilities.
- Related Auspia guide: Cursor vs Windsurf vs Gemini CLI for SEO/GEO Automation .
Author: Leo Harrington, SEO Analytics Translator for 500+ Executive Reports at Auspia. Leo writes about turning search and AI visibility data into decisions teams can act on.