如何用 Cursor MCP 接入 GSC、Bing 和 GA4 SEO 数据

用 Cursor MCP 把 GSC、Bing、GA4 与 SEO data 接入 page refresh 和 GEO monitoring workflow。

你会建立什么

这篇教学会示范如何把 Cursor 接上 SEO/GEO data,但不把你的 editor 变成不安全的 publishing robot。初学者安全模式是:先用 exports,再建立 normalized files,第三步才是 read-only MCP;只有 approved opportunity report 出来后,才做 page edits。

你会建立:

.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

Cursor 用 read-only MCP 和 exports 读取 GSC、Bing、GA4、AI 能见度资料

图说:资料 connector 只提供决策 context,不应自动发布、提交 URL 或修改 production files。

用 data 来辅助 decision。不要让 data connectors 自动 publish pages、submit URLs、change analytics settings 或 edit production files。

步骤 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 interface。

步骤 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

步骤 3:先 normalize data,再请 Cursor 做 strategy

建立 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)

步骤 4:要求 Cursor 产生 opportunity report,不要直接 edits

在 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.

好的 output 会引用 files。弱 output 只会给 generic「improve SEO」建议。如果太弱,要求 Cursor 重做并引用每一列 source row。

步骤 5:file workflow 稳定后,再加 placeholder MCP server

建立一个 placeholder,先明确定义 permissions:

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.

最后 setup 请使用 Cursor 目前的 MCP settings UI 或 config format,因为 Cursor 的 MCP configuration surface 可能因版本与 workspace 而不同。

步骤 6:报告完成后,只核准一个 page edit

Opportunity report 建好后,只核准一页:

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 太 vague

没有 normalized snapshot

先跑 normalizer

MCP setup 要求 broad tools

Tool boundary 不清楚

只允许 read-only tools

Public copy 暴露 analytics

Data 被当成公开 proof

在 prompt 加上 private decision context

Cursor edit 太多 files

Approval 太宽

只核准一个 URL 和 exact files

FAQ

一开始需要 MCP 吗?

不需要。CSV exports 就够了。当 workflow 重复、data freshness 变重要时,MCP 才有价值。

Cursor 应该 submit URLs 到 Bing 或 update CMS content 吗?

第一版不要。保持 read-only actions,直到团队信任 workflow。

Cursor 可以分析 AI visibility snapshots 吗?

可以。用 JSON 或 CSV 保存 prompt、surface、answer summary、brand mention、citation URL、competitors 和 date。

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 Reviews
  6. Cursor、Windsurf、Gemini CLI、Codex、Claude Code 的 SEO/GEO 营运模型

Sources and notes

Author: Leo Harrington, Auspia SEO Analytics Translator for 500+ Executive Reports。Leo 撰写如何把 search 与 AI visibility data 转成团队可执行 decisions。

探索此主题

继续阅读同一增长脉络