SEO Analytics MCP Server
by atmarcday
README.md
# SEO Analytics MCP Server
MCP server for Google Analytics 4 and Search Console. Deploys to Railway and connects to Claude as a custom connector.
## Tools
| Tool | Description |
|---|---|
| `ga4_run_report` | Traffic, engagement, conversions by page/channel/date |
| `gsc_query_performance` | Clicks, impressions, CTR, position from Search Console |
| `gsc_inspect_url` | Index status, crawl date, canonical, mobile usability |
| `gsc_list_sitemaps` | List submitted sitemaps and their status |
| `gsc_submit_sitemap` | Submit a new sitemap URL |
| `gsc_delete_sitemap` | Remove a sitemap from Search Console |
---
## Setup
### 1. Google Cloud project
1. Go to [console.cloud.google.com](https://console.cloud.google.com) and create a project (or use an existing one).
2. Enable these APIs:
- **Google Analytics Data API**
- **Google Search Console API**
- **Web Search Analytics API**
3. Go to **IAM & Admin → Service Accounts → Create Service Account**.
4. Name it (e.g. `seo-mcp`), skip optional fields, click **Done**.
5. Click the service account → **Keys → Add Key → JSON**. Download the file.
6. Keep the `client_email` from the JSON — you'll need it for steps below.
### 2. Grant the service account access
**Google Analytics 4:**
1. Open GA4 → Admin → Property → Property Access Management.
2. Click **+** → Add user → paste the `client_email`.
3. Set role to **Viewer**.
**Google Search Console:**
1. Open Search Console → Settings → Users and permissions.
2. Click **Add user** → paste the `client_email`.
3. Set permission to **Full** (required for sitemap submit/delete).
### 3. Find your IDs
- **GA4 Property ID**: GA4 Admin → Property Settings → Property ID (numeric only, e.g. `123456789`)
- **GSC Site URL**: Exactly as it appears in Search Console (e.g. `https://example.com/` with trailing slash, or `sc-domain:example.com` for domain properties)
### 4. Deploy to Railway
1. Push this repo to GitHub.
2. Go to [railway.app](https://railway.app) → New Project → Deploy from GitHub repo → select this repo.
3. Railway will detect Node.js and run `npm install && npm run build` automatically.
4. Go to **Variables** and add:
```
MCP_AUTH_TOKEN = <generate with: openssl rand -hex 32>
GOOGLE_CREDENTIALS_JSON = <paste the entire contents of your service account JSON key, minified to one line>
GA4_PROPERTY_ID = 123456789
GSC_SITE_URL = https://example.com/
```
To minify the credentials JSON to one line (Mac/Linux):
```bash
cat your-key-file.json | jq -c . | pbcopy
```
5. Deploy. Railway will give you a public domain like `https://seo-mcp-production.up.railway.app`.
6. Test the health check:
```bash
curl https://your-railway-domain.up.railway.app/health
```
### 5. Connect to Claude
**Claude Pro/Max (personal):**
1. Open Claude → Customize → Connectors → **+ Add custom connector**
2. Enter your Railway URL: `https://your-railway-domain.up.railway.app/mcp`
3. Add the Authorization header: `Bearer your-mcp-auth-token`
**Claude Team/Enterprise:**
- Owner adds it under **Organization Settings → Connectors**
### 6. Test in Claude
Enable the connector in a chat and try:
```
What are my top 10 landing pages by sessions for the last 28 days?
```
```
Show me my GSC performance for the past 30 days, grouped by query.
```
```
Inspect https://example.com/blog/my-post
```
```
List all my submitted sitemaps.
```
---
## Local development
```bash
cp .env.example .env
# Fill in .env with your real values
npm install
npm run dev
```
Test locally:
```bash
curl -X POST http://localhost:3000/mcp \
-H "Authorization: Bearer your-token" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
```
---
## Environment variables
| Variable | Description |
|---|---|
| `MCP_AUTH_TOKEN` | Secret token for bearer auth. Generate with `openssl rand -hex 32` |
| `GOOGLE_CREDENTIALS_JSON` | Full contents of the service account JSON key (single line) |
| `GA4_PROPERTY_ID` | GA4 numeric property ID (e.g. `123456789`) |
| `GSC_SITE_URL` | Exact site URL from Search Console (e.g. `https://example.com/`) |
| `PORT` | Port to listen on. Set automatically by Railway. Defaults to `3000` |
This server cannot be deployed
Maintenance
ActivityInactive
ResponsivenessNo issues