claude-plugin-wordpress-manager 2.3.1 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/.claude-plugin/plugin.json +15 -3
  2. package/CHANGELOG.md +62 -0
  3. package/agents/wp-content-strategist.md +104 -0
  4. package/agents/wp-distribution-manager.md +98 -0
  5. package/docs/GUIDE.md +183 -23
  6. package/docs/plans/2026-03-01-tier3-wcop-design.md +373 -0
  7. package/docs/plans/2026-03-01-tier3-wcop-implementation.md +915 -0
  8. package/hooks/hooks.json +18 -0
  9. package/package.json +18 -3
  10. package/servers/wp-rest-bridge/build/tools/buffer.d.ts +3 -0
  11. package/servers/wp-rest-bridge/build/tools/buffer.js +205 -0
  12. package/servers/wp-rest-bridge/build/tools/comments.d.ts +6 -6
  13. package/servers/wp-rest-bridge/build/tools/gsc.d.ts +3 -0
  14. package/servers/wp-rest-bridge/build/tools/gsc.js +354 -0
  15. package/servers/wp-rest-bridge/build/tools/index.d.ts +38 -38
  16. package/servers/wp-rest-bridge/build/tools/index.js +12 -0
  17. package/servers/wp-rest-bridge/build/tools/mailchimp.d.ts +3 -0
  18. package/servers/wp-rest-bridge/build/tools/mailchimp.js +265 -0
  19. package/servers/wp-rest-bridge/build/tools/media.d.ts +2 -2
  20. package/servers/wp-rest-bridge/build/tools/multisite-sites.d.ts +2 -2
  21. package/servers/wp-rest-bridge/build/tools/plugin-repository.d.ts +1 -1
  22. package/servers/wp-rest-bridge/build/tools/search.d.ts +2 -2
  23. package/servers/wp-rest-bridge/build/tools/sendgrid.d.ts +3 -0
  24. package/servers/wp-rest-bridge/build/tools/sendgrid.js +255 -0
  25. package/servers/wp-rest-bridge/build/tools/unified-content.d.ts +8 -8
  26. package/servers/wp-rest-bridge/build/tools/unified-taxonomies.d.ts +4 -4
  27. package/servers/wp-rest-bridge/build/tools/users.d.ts +6 -6
  28. package/servers/wp-rest-bridge/build/tools/wc-coupons.d.ts +1 -1
  29. package/servers/wp-rest-bridge/build/tools/wc-customers.d.ts +3 -3
  30. package/servers/wp-rest-bridge/build/tools/wc-orders.d.ts +4 -4
  31. package/servers/wp-rest-bridge/build/tools/wc-products.d.ts +8 -8
  32. package/servers/wp-rest-bridge/build/tools/wc-webhooks.d.ts +4 -4
  33. package/servers/wp-rest-bridge/build/types.d.ts +122 -0
  34. package/servers/wp-rest-bridge/build/wordpress.d.ts +14 -0
  35. package/servers/wp-rest-bridge/build/wordpress.js +151 -0
  36. package/servers/wp-rest-bridge/package.json +1 -0
  37. package/skills/wordpress-router/references/decision-tree.md +8 -2
  38. package/skills/wp-content/SKILL.md +2 -0
  39. package/skills/wp-content-attribution/SKILL.md +2 -0
  40. package/skills/wp-content-optimization/SKILL.md +172 -0
  41. package/skills/wp-content-optimization/references/content-freshness.md +234 -0
  42. package/skills/wp-content-optimization/references/headline-optimization.md +171 -0
  43. package/skills/wp-content-optimization/references/meta-optimization.md +243 -0
  44. package/skills/wp-content-optimization/references/readability-analysis.md +201 -0
  45. package/skills/wp-content-optimization/references/seo-content-scoring.md +245 -0
  46. package/skills/wp-content-optimization/scripts/content_optimization_inspect.mjs +237 -0
  47. package/skills/wp-content-repurposing/SKILL.md +1 -0
  48. package/skills/wp-monitoring/SKILL.md +1 -0
  49. package/skills/wp-programmatic-seo/SKILL.md +2 -0
  50. package/skills/wp-search-console/SKILL.md +121 -0
  51. package/skills/wp-search-console/references/competitor-gap-analysis.md +226 -0
  52. package/skills/wp-search-console/references/content-seo-feedback.md +181 -0
  53. package/skills/wp-search-console/references/gsc-setup.md +110 -0
  54. package/skills/wp-search-console/references/indexing-management.md +182 -0
  55. package/skills/wp-search-console/references/keyword-tracking.md +181 -0
  56. package/skills/wp-search-console/scripts/search_console_inspect.mjs +178 -0
  57. package/skills/wp-social-email/SKILL.md +152 -0
  58. package/skills/wp-social-email/references/audience-segmentation.md +173 -0
  59. package/skills/wp-social-email/references/buffer-social-publishing.md +124 -0
  60. package/skills/wp-social-email/references/content-to-distribution.md +156 -0
  61. package/skills/wp-social-email/references/distribution-analytics.md +208 -0
  62. package/skills/wp-social-email/references/mailchimp-integration.md +145 -0
  63. package/skills/wp-social-email/references/sendgrid-transactional.md +165 -0
  64. package/skills/wp-social-email/scripts/distribution_inspect.mjs +165 -0
  65. package/skills/wp-webhooks/SKILL.md +1 -0
@@ -0,0 +1,121 @@
1
+ ---
2
+ name: wp-search-console
3
+ description: This skill should be used when the user asks about "Google Search Console",
4
+ "GSC", "keyword tracking", "keyword rankings", "search analytics",
5
+ "indexing status", "URL inspection", "sitemap management",
6
+ "search performance", "SEO feedback", "content SEO",
7
+ "competitor gap analysis", "keyword gap", or mentions monitoring
8
+ WordPress site search performance.
9
+ version: 1.0.0
10
+ ---
11
+
12
+ # WordPress Search Console Skill
13
+
14
+ ## Overview
15
+
16
+ Google Search Console connects WordPress content to Google Search data via 8 MCP tools. These tools enable keyword tracking, indexing management, sitemap operations, and search performance analysis directly from the WordPress authoring environment. By bridging GSC data with WordPress content, you can identify optimization opportunities, monitor indexing health, and build data-driven content strategies.
17
+
18
+ ## When to Use
19
+
20
+ - User wants to check how their WordPress pages perform in Google Search
21
+ - User needs to track keyword rankings and position changes over time
22
+ - User asks about indexing status or why a page is not appearing in Google
23
+ - User wants to submit or manage XML sitemaps
24
+ - User needs search analytics data (clicks, impressions, CTR, average position)
25
+ - User asks about content SEO improvements based on search data
26
+ - User wants to identify keyword gaps or content opportunities
27
+ - User needs to inspect a specific URL for crawl and indexing details
28
+
29
+ ## Decision Tree
30
+
31
+ 1. **What aspect of Search Console?**
32
+ - "setup" / "connect GSC" / "service account" / "verify site" → GSC setup (Section 1)
33
+ - "keyword tracking" / "rankings" / "position" / "top queries" → Keyword tracking (Section 2)
34
+ - "indexing" / "URL inspection" / "sitemap" / "crawl" / "not indexed" → Indexing management (Section 3)
35
+ - "content SEO" / "underperforming pages" / "content refresh" / "optimize title" → Content SEO feedback (Section 4)
36
+ - "competitor gap" / "keyword gap" / "content opportunities" / "missing keywords" → Competitor gap analysis (Section 5)
37
+
38
+ 2. **Run detection first:**
39
+ ```bash
40
+ node skills/wp-search-console/scripts/search_console_inspect.mjs [--cwd=/path/to/project]
41
+ ```
42
+ This identifies configured GSC credentials and verified sites.
43
+
44
+ ## Service Overview
45
+
46
+ | Service | Tools | Auth Type | Use Case |
47
+ |---------|-------|-----------|----------|
48
+ | Google Search Console | 8 tools (`gsc_*`) | Service Account JSON | Search analytics, indexing, sitemaps |
49
+
50
+ ## Sections
51
+
52
+ ### Section 1: GSC Setup
53
+ See `references/gsc-setup.md`
54
+ - Service account creation in Google Cloud Console
55
+ - JSON key file configuration
56
+ - WP_SITES_CONFIG setup with gsc_service_account_key and gsc_site_url
57
+ - Site verification and permissions
58
+
59
+ ### Section 2: Keyword Tracking
60
+ See `references/keyword-tracking.md`
61
+ - Using gsc_search_analytics and gsc_top_queries for keyword monitoring
62
+ - Date range and dimension filters
63
+ - Tracking position changes over time
64
+ - Query-level analysis (clicks, impressions, CTR, average position)
65
+
66
+ ### Section 3: Indexing Management
67
+ See `references/indexing-management.md`
68
+ - Using gsc_inspect_url for indexing status checks
69
+ - Sitemap operations (list, submit, delete)
70
+ - Monitoring crawl coverage
71
+ - Handling indexing issues and bulk URL inspection
72
+
73
+ ### Section 4: Content SEO Feedback
74
+ See `references/content-seo-feedback.md`
75
+ - Connecting search data to WordPress content strategy
76
+ - Identifying underperforming pages with gsc_page_performance
77
+ - Content refresh strategies based on declining metrics
78
+ - Title and meta description optimization from search data
79
+
80
+ ### Section 5: Competitor Gap Analysis
81
+ See `references/competitor-gap-analysis.md`
82
+ - Identifying keyword gaps using search analytics data
83
+ - Analyzing query coverage vs potential queries
84
+ - Finding content opportunities from query data
85
+ - Cross-referencing with WordPress content inventory
86
+
87
+ ## Reference Files
88
+
89
+ | File | Content |
90
+ |------|---------|
91
+ | `references/gsc-setup.md` | Service account creation, JSON key config, site verification |
92
+ | `references/keyword-tracking.md` | Search analytics queries, position monitoring, dashboards |
93
+ | `references/indexing-management.md` | URL inspection, sitemap management, crawl coverage |
94
+ | `references/content-seo-feedback.md` | Page performance, content refresh, title optimization |
95
+ | `references/competitor-gap-analysis.md` | Keyword gaps, content opportunities, position strategies |
96
+
97
+ ## MCP Tools
98
+
99
+ | Tool | Description |
100
+ |------|-------------|
101
+ | `gsc_list_sites` | List all verified sites in Google Search Console |
102
+ | `gsc_search_analytics` | Query search analytics data with dimensions and filters |
103
+ | `gsc_inspect_url` | Inspect a URL for indexing status and crawl details |
104
+ | `gsc_list_sitemaps` | List submitted sitemaps and their status |
105
+ | `gsc_submit_sitemap` | Submit a new sitemap URL to GSC |
106
+ | `gsc_delete_sitemap` | Remove a sitemap from GSC |
107
+ | `gsc_top_queries` | Get top search queries with clicks, impressions, CTR, position |
108
+ | `gsc_page_performance` | Get page-level performance data with search metrics |
109
+
110
+ ## Recommended Agent
111
+
112
+ Use the **`wp-content-strategist`** agent for SEO feedback loops and content optimization workflows that combine Search Console data with WordPress content management.
113
+
114
+ ## Related Skills
115
+
116
+ - **`wp-programmatic-seo`** — generate SEO-optimized content at scale using search data
117
+ - **`wp-content-attribution`** — track content sources and attribute search traffic
118
+ - **`wp-monitoring`** — monitor site health metrics alongside search performance
119
+ - **`wp-social-email`** — distribute optimized content across social and email channels
120
+ - **`wp-content`** — create and manage WordPress content informed by search analytics
121
+ - **`wp-content-optimization`** — use GSC data as input for AI-driven content optimization and triage
@@ -0,0 +1,226 @@
1
+ # Competitor Gap Analysis
2
+
3
+ ## Overview
4
+
5
+ Competitor gap analysis uses Google Search Console data to identify keyword opportunities your WordPress site is missing. By analyzing your query coverage, position distribution, and content inventory, you can find topics where you have search visibility but no dedicated content, or where competitors likely rank for queries you do not yet target.
6
+
7
+ ## Identifying Keyword Gaps
8
+
9
+ ### Step 1: Export your full query coverage
10
+
11
+ ```
12
+ Tool: gsc_search_analytics
13
+ Params:
14
+ site_url: "https://example.com/"
15
+ start_date: "2026-02-01"
16
+ end_date: "2026-02-28"
17
+ dimensions: ["query"]
18
+ row_limit: 5000
19
+ Returns: Array of all queries with clicks, impressions, ctr, position
20
+ ```
21
+
22
+ This gives you every query Google associates with your site. Sort by impressions to see which topics generate the most search visibility.
23
+
24
+ ### Step 2: Map queries to content
25
+
26
+ ```
27
+ Tool: gsc_search_analytics
28
+ Params:
29
+ site_url: "https://example.com/"
30
+ start_date: "2026-02-01"
31
+ end_date: "2026-02-28"
32
+ dimensions: ["query", "page"]
33
+ row_limit: 5000
34
+ ```
35
+
36
+ This maps each query to the page that ranks for it. Look for:
37
+ - **Queries without a dedicated page** — a query matches a generic page rather than a focused article
38
+ - **Multiple queries pointing to one page** — the page may be covering too many topics and could be split
39
+ - **Queries with position > 20** — you appear in results but have no strong content to compete
40
+
41
+ ### Step 3: Identify content gaps
42
+
43
+ Cross-reference your queries with your WordPress content inventory:
44
+
45
+ ```
46
+ # Get all published content
47
+ Step 1: wp_list_posts status="publish" per_page=100 → Array of posts with titles and URLs
48
+
49
+ # Get all queries with page mapping
50
+ Step 2: gsc_search_analytics dimensions=["query", "page"] row_limit=5000
51
+
52
+ # Compare: queries that map to pages not optimized for them = content gaps
53
+ ```
54
+
55
+ ## Analyzing Query Coverage
56
+
57
+ ### Position distribution analysis
58
+
59
+ Categorize your queries by position to understand coverage quality:
60
+
61
+ ```
62
+ Tool: gsc_search_analytics
63
+ Params:
64
+ site_url: "https://example.com/"
65
+ start_date: "2026-02-01"
66
+ end_date: "2026-02-28"
67
+ dimensions: ["query"]
68
+ row_limit: 5000
69
+ ```
70
+
71
+ Group results by position ranges:
72
+
73
+ | Position Range | Category | Strategy |
74
+ |----------------|----------|----------|
75
+ | 1-3 | Dominant | Protect — monitor and update regularly |
76
+ | 4-10 | Competitive | Optimize — content refresh, internal links, backlinks |
77
+ | 11-20 | Striking distance | Target — create supporting content, build topic clusters |
78
+ | 21-50 | Weak presence | Evaluate — is the content worth investing in? |
79
+ | 50+ | Minimal visibility | Decide — create new dedicated content or abandon |
80
+
81
+ ### Topic cluster gaps
82
+
83
+ Group related queries into topic clusters to find areas where your coverage is incomplete:
84
+
85
+ 1. Export all queries with `gsc_search_analytics`
86
+ 2. Group queries by root topic (e.g., "wordpress seo", "wordpress performance", "wordpress security")
87
+ 3. Count unique queries per topic and average position per topic
88
+ 4. Topics with few queries or high average position are underserved
89
+
90
+ ## Finding Content Opportunities
91
+
92
+ ### High-impression, no-click queries
93
+
94
+ ```
95
+ Tool: gsc_search_analytics
96
+ Params:
97
+ site_url: "https://example.com/"
98
+ start_date: "2026-02-01"
99
+ end_date: "2026-02-28"
100
+ dimensions: ["query", "page"]
101
+ row_limit: 1000
102
+ ```
103
+
104
+ Filter for queries where `impressions > 100` and `clicks == 0`. These are searches where Google shows your site but users never click — likely because:
105
+ - Your page does not match the query intent
106
+ - Your title and description are not compelling for that query
107
+ - You rank too low (position > 20) for the query to generate clicks
108
+
109
+ For each opportunity, decide whether to:
110
+ - **Optimize the existing page** for that query (if the topic is related)
111
+ - **Create a new dedicated page** targeting that query (if the topic is distinct)
112
+
113
+ ### Question-based queries
114
+
115
+ Filter queries that start with question words (what, how, why, when, where, which, can, does, is):
116
+
117
+ ```
118
+ Tool: gsc_search_analytics
119
+ Params:
120
+ site_url: "https://example.com/"
121
+ start_date: "2026-02-01"
122
+ end_date: "2026-02-28"
123
+ dimensions: ["query"]
124
+ dimension_filter_groups:
125
+ - filters:
126
+ - dimension: "query"
127
+ operator: "contains"
128
+ expression: "how to"
129
+ row_limit: 200
130
+ ```
131
+
132
+ Question queries map directly to FAQ content, how-to guides, and tutorial posts. If you appear for these queries but don't have dedicated content, create:
133
+ - FAQ sections on existing pages
134
+ - Standalone how-to articles
135
+ - Comprehensive guides that answer multiple related questions
136
+
137
+ ### Long-tail opportunities
138
+
139
+ Queries with 4+ words are typically long-tail keywords with lower competition:
140
+
141
+ ```
142
+ Tool: gsc_search_analytics
143
+ Params:
144
+ site_url: "https://example.com/"
145
+ start_date: "2026-02-01"
146
+ end_date: "2026-02-28"
147
+ dimensions: ["query"]
148
+ row_limit: 2000
149
+ ```
150
+
151
+ Filter for queries containing 4+ words with `impressions > 20`. Long-tail keywords often have:
152
+ - Higher conversion intent
153
+ - Lower competition
154
+ - More specific content requirements
155
+
156
+ Create focused content addressing the exact long-tail query.
157
+
158
+ ## Position Improvement Strategies
159
+
160
+ ### Strategy 1: Topic clusters
161
+
162
+ For queries where you rank 11-20, build topic clusters:
163
+
164
+ 1. Identify the core topic from your query data
165
+ 2. Create a **pillar page** — comprehensive guide covering the broad topic
166
+ 3. Create **cluster pages** — focused articles on subtopics
167
+ 4. **Interlink** all cluster pages to the pillar and vice versa
168
+ 5. Monitor position changes with `gsc_search_analytics` over 4-8 weeks
169
+
170
+ ### Strategy 2: Content depth expansion
171
+
172
+ For queries where you rank 4-10 but cannot break into top 3:
173
+
174
+ 1. Analyze the query with `gsc_search_analytics` filtered by the specific query
175
+ 2. Fetch the ranking page with `wp_get_post`
176
+ 3. Expand the content:
177
+ - Add 500-1000 words of additional depth
178
+ - Include data, statistics, or original research
179
+ - Add images, tables, or diagrams
180
+ - Add expert quotes or citations
181
+ 4. Update via `wp_update_post`
182
+
183
+ ### Strategy 3: Internal link building
184
+
185
+ Boost underperforming pages with strategic internal links:
186
+
187
+ 1. Identify pages ranking 11-30 for valuable queries
188
+ 2. Find high-authority pages on your site (top performers from `gsc_page_performance`)
189
+ 3. Add contextual internal links from high-authority pages to underperforming pages
190
+ 4. Use the target query as anchor text (naturally, not forced)
191
+
192
+ ## Cross-Referencing with WordPress Content
193
+
194
+ ### Audit workflow
195
+
196
+ Complete gap analysis workflow combining GSC and WordPress data:
197
+
198
+ 1. **Export all queries**: `gsc_search_analytics` with `dimensions: ["query"]`, `row_limit: 5000`
199
+ 2. **Export all pages**: `gsc_page_performance` with `row_limit: 500`
200
+ 3. **List WordPress content**: `wp_list_posts` with `status: "publish"`
201
+ 4. **Map coverage**: For each WordPress post, check if it has GSC data
202
+ 5. **Find orphans**: WordPress posts with no GSC impressions may have indexing or quality issues
203
+ 6. **Find gaps**: Queries without a dedicated WordPress post are content opportunities
204
+
205
+ ### Priority scoring
206
+
207
+ Score content opportunities by potential impact:
208
+
209
+ | Factor | Weight | Measurement |
210
+ |--------|--------|-------------|
211
+ | Impressions | High | More impressions = more potential traffic |
212
+ | Current position | Medium | Closer to page 1 = easier to improve |
213
+ | CTR gap | Medium | Low CTR vs expected = quick win with title optimization |
214
+ | Competition | Low | Long-tail queries typically have less competition |
215
+ | Business relevance | High | Queries related to products/services have higher value |
216
+
217
+ ## Best Practices
218
+
219
+ - **Regular cadence**: Run gap analysis monthly to catch new opportunities as query landscape evolves
220
+ - **Focus on intent**: Not all queries are worth targeting; prioritize queries that align with your content goals and business objectives
221
+ - **Quality over quantity**: One comprehensive article targeting a cluster of related queries outperforms five thin articles each targeting a single query
222
+ - **Track outcomes**: After creating content for identified gaps, monitor its performance in GSC after 4-8 weeks
223
+ - **Avoid keyword cannibalization**: Before creating new content, check if an existing page already targets the same query cluster
224
+ - **Use search data directionally**: GSC data shows what Google associates with your site, not what your competitors rank for; use it as a map of your current footprint and expand from there
225
+ - **Combine with external tools**: For true competitive analysis (what competitors rank for that you do not), supplement GSC data with third-party tools like Ahrefs, SEMrush, or Moz
226
+ - **Content calendar integration**: Feed identified opportunities into your WordPress editorial calendar for systematic execution
@@ -0,0 +1,181 @@
1
+ # Content SEO Feedback
2
+
3
+ ## Overview
4
+
5
+ Content SEO feedback connects Google Search Console performance data to WordPress content strategy. By analyzing page-level metrics (clicks, impressions, CTR, position), you can identify underperforming content, discover optimization opportunities, and make data-driven decisions about content refreshes, title rewrites, and new content creation.
6
+
7
+ ## Identifying Underperforming Pages
8
+
9
+ ### Get page-level performance data
10
+
11
+ ```
12
+ Tool: gsc_page_performance
13
+ Params:
14
+ site_url: "https://example.com/"
15
+ start_date: "2026-02-01"
16
+ end_date: "2026-02-28"
17
+ row_limit: 200
18
+ Returns: Array of pages with clicks, impressions, ctr, position
19
+ ```
20
+
21
+ ### Detect declining pages
22
+
23
+ Compare two periods to find pages with declining performance:
24
+
25
+ ```
26
+ # Previous period
27
+ Tool: gsc_page_performance
28
+ Params:
29
+ site_url: "https://example.com/"
30
+ start_date: "2026-01-01"
31
+ end_date: "2026-01-31"
32
+ row_limit: 200
33
+
34
+ # Current period
35
+ Tool: gsc_page_performance
36
+ Params:
37
+ site_url: "https://example.com/"
38
+ start_date: "2026-02-01"
39
+ end_date: "2026-02-28"
40
+ row_limit: 200
41
+ ```
42
+
43
+ Compare results to identify:
44
+ - **Click decline > 20%** — high priority for content refresh
45
+ - **Impression decline > 30%** — content may be losing relevance or competitors have overtaken
46
+ - **Position increase > 3 positions** (lower is better) — content is dropping in rankings
47
+
48
+ ### Categorize pages by performance
49
+
50
+ | Category | Criteria | Action |
51
+ |----------|----------|--------|
52
+ | High performers | Top 10% by clicks | Protect and expand — add internal links, update regularly |
53
+ | Declining stars | Previously top, now dropping | Content refresh — update data, add sections, improve media |
54
+ | Hidden gems | High impressions, low CTR | Title/meta optimization — rewrite to improve click-through |
55
+ | Dead weight | Low impressions, low clicks | Evaluate for removal, consolidation, or major rewrite |
56
+ | Rising pages | Increasing impressions and clicks | Accelerate — build more internal links, add supporting content |
57
+
58
+ ## Content Refresh Strategies
59
+
60
+ ### Strategy 1: Refresh based on declining clicks
61
+
62
+ 1. **Identify declining pages** using period comparison (see above)
63
+ 2. **Fetch the WordPress content** using `wp_get_post` with the page URL
64
+ 3. **Analyze queries** driving traffic to the page using `gsc_search_analytics` with `dimensions: ["query"]` filtered by the page URL
65
+ 4. **Update the content** to better address the top queries:
66
+ - Add missing subtopics that queries suggest users are looking for
67
+ - Update outdated statistics, dates, and references
68
+ - Expand thin sections with more depth
69
+ - Add FAQ sections based on question-type queries
70
+
71
+ ```
72
+ # Find queries for a specific declining page
73
+ Tool: gsc_search_analytics
74
+ Params:
75
+ site_url: "https://example.com/"
76
+ start_date: "2026-02-01"
77
+ end_date: "2026-02-28"
78
+ dimensions: ["query"]
79
+ dimension_filter_groups:
80
+ - filters:
81
+ - dimension: "page"
82
+ operator: "equals"
83
+ expression: "https://example.com/blog/wordpress-performance/"
84
+ row_limit: 50
85
+ ```
86
+
87
+ ### Strategy 2: New content from high-impression queries
88
+
89
+ Queries with high impressions but low or zero clicks on your pages represent untapped opportunities:
90
+
91
+ ```
92
+ Tool: gsc_search_analytics
93
+ Params:
94
+ site_url: "https://example.com/"
95
+ start_date: "2026-02-01"
96
+ end_date: "2026-02-28"
97
+ dimensions: ["query", "page"]
98
+ row_limit: 500
99
+ ```
100
+
101
+ Filter for queries where:
102
+ - `impressions > 200` and `clicks < 5` — your page appears but users do not click
103
+ - `position > 10` — you rank on page 2+ and need a dedicated, optimized page
104
+
105
+ These queries can inform new blog post topics or dedicated landing pages.
106
+
107
+ ### Strategy 3: Content consolidation
108
+
109
+ Multiple pages ranking for the same query cannibalize each other:
110
+
111
+ ```
112
+ Tool: gsc_search_analytics
113
+ Params:
114
+ site_url: "https://example.com/"
115
+ start_date: "2026-02-01"
116
+ end_date: "2026-02-28"
117
+ dimensions: ["query", "page"]
118
+ row_limit: 1000
119
+ ```
120
+
121
+ Look for queries that appear with 2+ different pages. When multiple pages compete:
122
+ 1. Choose the strongest page (most clicks/best position)
123
+ 2. Merge content from the weaker page into the stronger one
124
+ 3. Redirect the weaker URL to the stronger page
125
+ 4. Update internal links to point to the consolidated page
126
+
127
+ ## Title and Meta Description Optimization
128
+
129
+ ### Find CTR optimization opportunities
130
+
131
+ ```
132
+ Tool: gsc_search_analytics
133
+ Params:
134
+ site_url: "https://example.com/"
135
+ start_date: "2026-02-01"
136
+ end_date: "2026-02-28"
137
+ dimensions: ["query", "page"]
138
+ row_limit: 200
139
+ ```
140
+
141
+ Target pages where:
142
+ - `position < 5` and `ctr < 0.05` — ranking well but not getting clicks (expected CTR for top 5 is 5-15%)
143
+ - `position < 3` and `ctr < 0.10` — top 3 positions should have 10%+ CTR
144
+
145
+ ### Title tag optimization guidelines
146
+
147
+ Based on search data patterns:
148
+ - **Include the primary query** in the title — queries that appear verbatim in titles get higher CTR
149
+ - **Front-load keywords** — the first 60 characters are visible in SERPs
150
+ - **Add power words** — "Guide", "2026", "Complete", "Best" boost CTR by 5-15%
151
+ - **Use numbers** — "10 Tips", "5 Steps" increase CTR by 10-20% vs generic titles
152
+ - **Match intent** — if queries are questions, use question format in title
153
+
154
+ ### Meta description optimization
155
+
156
+ - **Include target query** — Google bolds matching terms in descriptions
157
+ - **Add a CTA** — "Learn more", "Get started", "Read the full guide"
158
+ - **Stay under 155 characters** — longer descriptions get truncated
159
+ - **Differentiate from competitors** — include unique value propositions
160
+
161
+ ## WordPress Integration Workflow
162
+
163
+ Complete content optimization loop using GSC data and WordPress tools:
164
+
165
+ 1. **Pull page performance**: `gsc_page_performance` for all pages
166
+ 2. **Identify targets**: Filter for declining or underperforming pages
167
+ 3. **Get query context**: `gsc_search_analytics` filtered by target page URL
168
+ 4. **Fetch WordPress content**: `wp_get_post` to get current content
169
+ 5. **Update content**: `wp_update_post` with improved title, content, and meta
170
+ 6. **Monitor results**: Re-check `gsc_page_performance` after 2-4 weeks
171
+
172
+ ## Best Practices
173
+
174
+ - **Refresh cadence**: Review page performance monthly; refresh declining content quarterly
175
+ - **Data threshold**: Only act on pages with 100+ impressions — below that, data is statistically unreliable
176
+ - **Patience after changes**: Wait 2-4 weeks after content changes before measuring impact; Google needs time to re-crawl and re-evaluate
177
+ - **Track changes**: Note the date and nature of each content update so you can correlate with performance changes
178
+ - **Prioritize by impact**: Focus on pages with the highest impression volume first — small CTR improvements on high-impression pages yield more clicks than large improvements on low-impression pages
179
+ - **Seasonal awareness**: Some traffic drops are seasonal, not quality-related; compare year-over-year when possible
180
+ - **Avoid over-optimization**: Do not stuff keywords into titles or content; natural language performs better in modern search
181
+ - **Internal linking**: After refreshing content, add internal links from other relevant pages to boost crawl priority
@@ -0,0 +1,110 @@
1
+ # GSC Setup
2
+
3
+ ## Overview
4
+
5
+ Google Search Console integration requires a Google Cloud service account with Search Console API access. The service account's JSON key file is configured in `WP_SITES_CONFIG`, enabling all 8 GSC MCP tools to authenticate and query search data for your WordPress site.
6
+
7
+ ## Setup
8
+
9
+ ### Step 1: Create a Google Cloud Project
10
+
11
+ 1. Go to [Google Cloud Console](https://console.cloud.google.com/)
12
+ 2. Create a new project or select an existing one
13
+ 3. Enable the **Google Search Console API** (also called "Search Console API" or "Webmasters API") under APIs & Services → Library
14
+
15
+ ### Step 2: Create a Service Account
16
+
17
+ 1. Navigate to IAM & Admin → Service Accounts
18
+ 2. Click **Create Service Account**
19
+ 3. Name it (e.g., `wp-search-console`) and add a description
20
+ 4. No additional roles are needed at the project level
21
+ 5. Click **Done**
22
+
23
+ ### Step 3: Generate JSON Key File
24
+
25
+ 1. Click on the newly created service account
26
+ 2. Go to the **Keys** tab
27
+ 3. Click **Add Key** → **Create new key** → **JSON**
28
+ 4. Download the JSON key file and store it securely
29
+
30
+ The JSON key file contains:
31
+
32
+ ```json
33
+ {
34
+ "type": "service_account",
35
+ "project_id": "your-project-id",
36
+ "private_key_id": "key-id",
37
+ "private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n",
38
+ "client_email": "wp-search-console@your-project.iam.gserviceaccount.com",
39
+ "client_id": "123456789",
40
+ "auth_uri": "https://accounts.google.com/o/oauth2/auth",
41
+ "token_uri": "https://oauth2.googleapis.com/token"
42
+ }
43
+ ```
44
+
45
+ ### Step 4: Grant Search Console Access
46
+
47
+ 1. Go to [Google Search Console](https://search.google.com/search-console)
48
+ 2. Select your property (site)
49
+ 3. Navigate to **Settings** → **Users and permissions**
50
+ 4. Click **Add user**
51
+ 5. Enter the service account email (e.g., `wp-search-console@your-project.iam.gserviceaccount.com`)
52
+ 6. Set permission to **Full** (for read access and sitemap management) or **Restricted** (read-only)
53
+
54
+ ### Step 5: Configure WP_SITES_CONFIG
55
+
56
+ Add GSC credentials to your site configuration:
57
+
58
+ ```json
59
+ {
60
+ "sites": [{
61
+ "name": "my-site",
62
+ "url": "https://example.com",
63
+ "gsc": {
64
+ "gsc_service_account_key": "/path/to/service-account-key.json",
65
+ "gsc_site_url": "https://example.com/"
66
+ }
67
+ }]
68
+ }
69
+ ```
70
+
71
+ **Important notes on `gsc_site_url`:**
72
+ - Use the exact property URL as it appears in Search Console
73
+ - For domain properties, use `sc-domain:example.com`
74
+ - For URL-prefix properties, use the full URL with trailing slash: `https://example.com/`
75
+ - The value must match exactly — a mismatch will result in 403 errors
76
+
77
+ ## Verification
78
+
79
+ After configuration, verify the setup works:
80
+
81
+ ```
82
+ Tool: gsc_list_sites
83
+ Returns: Array of verified sites with siteUrl, permissionLevel
84
+ ```
85
+
86
+ You should see your site listed with `permissionLevel` of `siteOwner` or `siteFullUser`.
87
+
88
+ ## Permissions and Scopes
89
+
90
+ The service account requires the following OAuth scope:
91
+
92
+ - `https://www.googleapis.com/auth/webmasters.readonly` — for read-only access (search analytics, URL inspection, sitemap listing)
93
+ - `https://www.googleapis.com/auth/webmasters` — for full access (includes sitemap submission and deletion)
94
+
95
+ The MCP tools automatically request the appropriate scope based on the operation.
96
+
97
+ ## Troubleshooting
98
+
99
+ - **403 Forbidden**: The service account email has not been added to Search Console, or `gsc_site_url` does not match the property URL
100
+ - **404 Not Found**: The site URL format is incorrect (missing trailing slash or wrong protocol)
101
+ - **Authentication errors**: The JSON key file path is invalid or the file is malformed
102
+ - **No data returned**: The site may be newly verified; Search Console data takes 24-48 hours to populate
103
+
104
+ ## Best Practices
105
+
106
+ - **Key file security**: Store the JSON key file outside the project directory; never commit it to version control
107
+ - **Least privilege**: Use **Restricted** permission if you only need read access (search analytics, URL inspection)
108
+ - **Separate accounts**: Use a dedicated service account per project to isolate access
109
+ - **Key rotation**: Rotate service account keys periodically (every 90 days recommended)
110
+ - **Domain property**: Prefer domain-level properties (`sc-domain:example.com`) over URL-prefix properties for complete data coverage