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,182 @@
1
+ # Indexing Management
2
+
3
+ ## Overview
4
+
5
+ Indexing management ensures that Google discovers, crawls, and indexes your WordPress pages correctly. The GSC MCP tools provide URL inspection for individual pages and sitemap management for bulk discovery. Together, these tools help you monitor crawl coverage, diagnose indexing issues, and control which pages appear in search results.
6
+
7
+ ## URL Inspection
8
+
9
+ ### Inspect a single URL
10
+
11
+ ```
12
+ Tool: gsc_inspect_url
13
+ Params:
14
+ site_url: "https://example.com/"
15
+ inspection_url: "https://example.com/blog/wordpress-seo-guide/"
16
+ Returns:
17
+ indexStatusResult:
18
+ verdict: "PASS" # PASS | NEUTRAL | FAIL
19
+ coverageState: "Submitted and indexed"
20
+ robotsTxtState: "ALLOWED"
21
+ indexingState: "INDEXING_ALLOWED"
22
+ lastCrawlTime: "2026-02-25T10:30:00Z"
23
+ pageFetchState: "SUCCESSFUL"
24
+ crawledAs: "MOBILE"
25
+ mobileUsabilityResult:
26
+ verdict: "PASS"
27
+ richResultsResult:
28
+ detectedItems: [...]
29
+ ```
30
+
31
+ ### Understanding inspection results
32
+
33
+ Key fields in the response:
34
+
35
+ | Field | Values | Meaning |
36
+ |-------|--------|---------|
37
+ | `verdict` | PASS / NEUTRAL / FAIL | Overall indexing status |
38
+ | `coverageState` | Various | Detailed coverage status |
39
+ | `robotsTxtState` | ALLOWED / DISALLOWED | Whether robots.txt blocks the URL |
40
+ | `indexingState` | INDEXING_ALLOWED / INDEXING_NOT_ALLOWED | Whether meta robots/noindex blocks indexing |
41
+ | `pageFetchState` | SUCCESSFUL / SOFT_404 / NOT_FOUND / REDIRECT | Crawl outcome |
42
+ | `crawledAs` | MOBILE / DESKTOP | Which crawler accessed the page |
43
+
44
+ ### Common coverage states
45
+
46
+ - **Submitted and indexed** — page is in the index and appearing in search results
47
+ - **Crawled - currently not indexed** — Google crawled it but chose not to index (quality or duplicate concern)
48
+ - **Discovered - currently not indexed** — Google knows about it but has not crawled it yet
49
+ - **Excluded by 'noindex' tag** — the page has a noindex directive
50
+ - **Blocked by robots.txt** — robots.txt prevents crawling
51
+ - **Page with redirect** — the URL redirects to another page
52
+ - **Soft 404** — the page returns 200 but Google treats it as a 404
53
+
54
+ ## Sitemap Management
55
+
56
+ ### List sitemaps
57
+
58
+ ```
59
+ Tool: gsc_list_sitemaps
60
+ Params:
61
+ site_url: "https://example.com/"
62
+ Returns: Array of sitemaps with:
63
+ path: "https://example.com/sitemap_index.xml"
64
+ lastSubmitted: "2026-02-20T08:00:00Z"
65
+ isPending: false
66
+ isSitemapsIndex: true
67
+ lastDownloaded: "2026-02-25T06:00:00Z"
68
+ warnings: 0
69
+ errors: 0
70
+ contents:
71
+ - type: "web"
72
+ submitted: 150
73
+ indexed: 142
74
+ ```
75
+
76
+ ### Submit a sitemap
77
+
78
+ ```
79
+ Tool: gsc_submit_sitemap
80
+ Params:
81
+ site_url: "https://example.com/"
82
+ sitemap_url: "https://example.com/sitemap_index.xml"
83
+ ```
84
+
85
+ Submit after:
86
+ - Initial site setup
87
+ - Adding a new sitemap (e.g., a video sitemap or news sitemap)
88
+ - Changing sitemap URL structure
89
+ - Major content additions (100+ new pages)
90
+
91
+ ### Delete a sitemap
92
+
93
+ ```
94
+ Tool: gsc_delete_sitemap
95
+ Params:
96
+ site_url: "https://example.com/"
97
+ sitemap_url: "https://example.com/old-sitemap.xml"
98
+ ```
99
+
100
+ Delete when:
101
+ - A sitemap URL has changed (submit the new one, delete the old)
102
+ - A sitemap contains only 404/removed pages
103
+ - Consolidating multiple sitemaps into one
104
+
105
+ ## Monitoring Crawl Coverage
106
+
107
+ ### Bulk URL inspection workflow
108
+
109
+ For auditing multiple pages, iterate through URLs from your WordPress site:
110
+
111
+ 1. **Get WordPress pages** using `wp_list_posts` with `status: "publish"`
112
+ 2. **Inspect each URL** using `gsc_inspect_url` for each published page
113
+ 3. **Categorize results** by `coverageState`:
114
+ - Indexed: `verdict === "PASS"`
115
+ - Not indexed: `verdict === "FAIL"` or `verdict === "NEUTRAL"`
116
+ 4. **Report findings** with counts per coverage state
117
+
118
+ ```
119
+ # Example workflow
120
+ Step 1: wp_list_posts status="publish" per_page=100 → Array of posts with links
121
+ Step 2: For each post.link → gsc_inspect_url inspection_url=post.link
122
+ Step 3: Group by coverageState → { indexed: 85, not_indexed: 12, errors: 3 }
123
+ ```
124
+
125
+ ### Sitemap vs index comparison
126
+
127
+ Compare sitemap-submitted URLs against indexed URLs to find coverage gaps:
128
+
129
+ 1. **List sitemaps** with `gsc_list_sitemaps` to get submitted/indexed counts
130
+ 2. **Calculate coverage rate**: `indexed / submitted * 100`
131
+ 3. **Investigate gaps**: If coverage is below 90%, inspect non-indexed URLs individually
132
+
133
+ ## Handling Indexing Issues
134
+
135
+ ### Crawled but not indexed
136
+
137
+ This means Google fetched the page but deemed it unworthy of indexing. Common causes:
138
+ - **Thin content**: Page has very little unique content
139
+ - **Duplicate content**: Substantially similar to another indexed page
140
+ - **Low quality**: Content does not meet quality thresholds
141
+
142
+ **Actions:**
143
+ 1. Inspect the URL with `gsc_inspect_url` to confirm the status
144
+ 2. Review the page content — add depth, unique value, or original research
145
+ 3. Check for duplicate content — use canonical tags to consolidate
146
+ 4. After improving, request re-indexing (not available via API; use Search Console UI)
147
+
148
+ ### Discovered but not indexed
149
+
150
+ Google knows the URL exists but has not crawled it. This often indicates:
151
+ - **Crawl budget**: The site has too many pages relative to its authority
152
+ - **Internal linking**: The page is poorly linked from other pages
153
+ - **Priority**: Google does not consider the page important enough to crawl
154
+
155
+ **Actions:**
156
+ 1. Improve internal linking to the page from high-authority pages
157
+ 2. Add the URL to the sitemap if it is not already included
158
+ 3. Reduce crawl waste by blocking thin/utility pages with `noindex`
159
+
160
+ ### Blocked by robots.txt
161
+
162
+ ```
163
+ # Check if the URL is blocked
164
+ Tool: gsc_inspect_url
165
+ Params:
166
+ inspection_url: "https://example.com/admin-page/"
167
+
168
+ # If robotsTxtState is "DISALLOWED", review the robots.txt file
169
+ ```
170
+
171
+ Ensure your `robots.txt` is not accidentally blocking important content pages.
172
+
173
+ ## Best Practices
174
+
175
+ - **Sitemap freshness**: WordPress SEO plugins (Yoast, Rank Math) auto-generate sitemaps; submit the index sitemap once and let the plugin manage updates
176
+ - **Inspection frequency**: Do not over-inspect; GSC has API quotas. Batch inspections for weekly or monthly audits
177
+ - **New content**: After publishing a significant post, inspect it after 48-72 hours to verify crawling
178
+ - **Redirect chains**: Avoid chains of 3+ redirects; they slow crawling and may cause indexing issues
179
+ - **Status codes**: Regularly check for soft 404s — pages that return 200 but appear empty or error-like to Googlebot
180
+ - **Canonical tags**: Ensure every page has a self-referencing canonical or points to the preferred version
181
+ - **Crawl budget**: For large sites (10,000+ pages), prioritize indexing of high-value pages by improving internal linking and reducing index bloat
182
+ - **Mobile-first**: Google uses mobile crawling by default; ensure `crawledAs: "MOBILE"` succeeds for all important pages
@@ -0,0 +1,181 @@
1
+ # Keyword Tracking
2
+
3
+ ## Overview
4
+
5
+ Keyword tracking uses GSC search analytics data to monitor how your WordPress site ranks for specific queries in Google Search. The `gsc_search_analytics` and `gsc_top_queries` tools provide clicks, impressions, CTR, and average position data that can be filtered by date range, query, page, country, and device.
6
+
7
+ ## Core Tools
8
+
9
+ ### Get top queries
10
+
11
+ ```
12
+ Tool: gsc_top_queries
13
+ Params:
14
+ site_url: "https://example.com/"
15
+ start_date: "2026-02-01"
16
+ end_date: "2026-02-28"
17
+ row_limit: 50
18
+ Returns: Array of queries with clicks, impressions, ctr, position
19
+ ```
20
+
21
+ This returns the top-performing queries ranked by clicks. Use `row_limit` to control how many queries are returned (default: 25, max: 25000).
22
+
23
+ ### Query search analytics with dimensions
24
+
25
+ ```
26
+ Tool: gsc_search_analytics
27
+ Params:
28
+ site_url: "https://example.com/"
29
+ start_date: "2026-02-01"
30
+ end_date: "2026-02-28"
31
+ dimensions: ["query", "page"]
32
+ row_limit: 100
33
+ Returns: Array of rows with keys (query, page), clicks, impressions, ctr, position
34
+ ```
35
+
36
+ Available dimensions:
37
+ - `query` — the search query text
38
+ - `page` — the URL that appeared in search results
39
+ - `country` — ISO 3166-1 alpha-3 country code
40
+ - `device` — DESKTOP, MOBILE, or TABLET
41
+ - `date` — individual date breakdown
42
+
43
+ ### Filter by specific query
44
+
45
+ ```
46
+ Tool: gsc_search_analytics
47
+ Params:
48
+ site_url: "https://example.com/"
49
+ start_date: "2026-02-01"
50
+ end_date: "2026-02-28"
51
+ dimensions: ["query", "date"]
52
+ dimension_filter_groups:
53
+ - filters:
54
+ - dimension: "query"
55
+ operator: "contains"
56
+ expression: "wordpress seo"
57
+ row_limit: 100
58
+ ```
59
+
60
+ Filter operators:
61
+ - `contains` — query contains the expression
62
+ - `equals` — exact match
63
+ - `notContains` — excludes queries containing the expression
64
+ - `notEquals` — excludes exact matches
65
+
66
+ ## Tracking Position Changes Over Time
67
+
68
+ ### Daily position tracking
69
+
70
+ To track how a keyword's position changes day by day:
71
+
72
+ ```
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", "date"]
79
+ dimension_filter_groups:
80
+ - filters:
81
+ - dimension: "query"
82
+ operator: "equals"
83
+ expression: "best wordpress plugins"
84
+ row_limit: 28
85
+ ```
86
+
87
+ This returns one row per day for the specific query, showing position movement across the date range.
88
+
89
+ ### Compare periods
90
+
91
+ To compare performance between two periods, make two `gsc_search_analytics` calls with different date ranges and compare the results:
92
+
93
+ ```
94
+ # Period 1: Previous month
95
+ Tool: gsc_search_analytics
96
+ Params:
97
+ site_url: "https://example.com/"
98
+ start_date: "2026-01-01"
99
+ end_date: "2026-01-31"
100
+ dimensions: ["query"]
101
+ row_limit: 100
102
+
103
+ # Period 2: Current month
104
+ Tool: gsc_search_analytics
105
+ Params:
106
+ site_url: "https://example.com/"
107
+ start_date: "2026-02-01"
108
+ end_date: "2026-02-28"
109
+ dimensions: ["query"]
110
+ row_limit: 100
111
+ ```
112
+
113
+ Compare `position`, `clicks`, and `impressions` between periods to identify improving and declining keywords.
114
+
115
+ ## Query-Level Analysis
116
+
117
+ ### High-impression, low-CTR queries
118
+
119
+ These are queries where your page appears frequently but users rarely click — indicating a title or meta description optimization opportunity:
120
+
121
+ ```
122
+ Tool: gsc_search_analytics
123
+ Params:
124
+ site_url: "https://example.com/"
125
+ start_date: "2026-02-01"
126
+ end_date: "2026-02-28"
127
+ dimensions: ["query", "page"]
128
+ row_limit: 200
129
+ ```
130
+
131
+ Filter results where `impressions > 100` and `ctr < 0.02` (2%). These queries should be prioritized for title tag and meta description improvements.
132
+
133
+ ### Position 4-20 keywords (striking distance)
134
+
135
+ Keywords ranking on positions 4-20 are in "striking distance" — small improvements can move them to page 1 or top 3:
136
+
137
+ ```
138
+ Tool: gsc_search_analytics
139
+ Params:
140
+ site_url: "https://example.com/"
141
+ start_date: "2026-02-01"
142
+ end_date: "2026-02-28"
143
+ dimensions: ["query", "page"]
144
+ row_limit: 500
145
+ ```
146
+
147
+ Filter results where `position >= 4` and `position <= 20` and `impressions > 50`. These are the highest-ROI optimization targets.
148
+
149
+ ### Device-specific rankings
150
+
151
+ ```
152
+ Tool: gsc_search_analytics
153
+ Params:
154
+ site_url: "https://example.com/"
155
+ start_date: "2026-02-01"
156
+ end_date: "2026-02-28"
157
+ dimensions: ["query", "device"]
158
+ row_limit: 100
159
+ ```
160
+
161
+ Compare mobile vs desktop rankings. Significant position differences may indicate mobile usability issues.
162
+
163
+ ## Creating Keyword Dashboards
164
+
165
+ Build a comprehensive keyword report by combining multiple queries:
166
+
167
+ 1. **Top 50 queries by clicks** — `gsc_top_queries` with `row_limit: 50`
168
+ 2. **Position trends for target keywords** — `gsc_search_analytics` with `dimensions: ["query", "date"]` filtered by target queries
169
+ 3. **Page-level performance** — `gsc_page_performance` to see which pages drive the most search traffic
170
+ 4. **Country breakdown** — `gsc_search_analytics` with `dimensions: ["query", "country"]` for geo-specific insights
171
+
172
+ ## Best Practices
173
+
174
+ - **Date range selection**: Use at least 28 days of data for reliable averages; short ranges (< 7 days) produce noisy data
175
+ - **Regular monitoring**: Track core keywords weekly to catch position drops early; monthly for trend analysis
176
+ - **Segment by intent**: Group queries by intent (informational, transactional, navigational) to align with content strategy
177
+ - **Position averages**: GSC reports average position weighted by impressions; a page ranking #1 for one query and #50 for another may show position 25
178
+ - **Data freshness**: GSC data has a 2-3 day delay; do not expect same-day data
179
+ - **Row limits**: Default row limit is 1000; for comprehensive audits, increase to 25000
180
+ - **Branded vs non-branded**: Separate branded queries (containing your brand name) from non-branded to get a clearer picture of organic discovery
181
+ - **Click vs impression trends**: Rising impressions with flat clicks indicates a CTR problem; rising clicks with flat impressions indicates improved CTR or rankings
@@ -0,0 +1,178 @@
1
+ /**
2
+ * search_console_inspect.mjs — Detect Google Search Console configuration readiness.
3
+ *
4
+ * Checks WP_SITES_CONFIG for GSC credentials, sitemaps, robots.txt,
5
+ * and SEO plugin presence.
6
+ *
7
+ * Usage:
8
+ * node search_console_inspect.mjs [--cwd=/path/to/project]
9
+ *
10
+ * Exit codes:
11
+ * 0 — GSC or SEO configuration found
12
+ * 1 — no GSC or SEO configuration found
13
+ */
14
+
15
+ import { readFileSync, existsSync, readdirSync } from 'node:fs';
16
+ import { join, resolve } from 'node:path';
17
+ import { argv, stdout, exit } from 'node:process';
18
+
19
+ // ---------------------------------------------------------------------------
20
+ // Helpers
21
+ // ---------------------------------------------------------------------------
22
+
23
+ function readFileSafe(filePath) {
24
+ try { return readFileSync(filePath, 'utf-8'); } catch { return null; }
25
+ }
26
+
27
+ function existsSafe(filePath) {
28
+ try { return existsSync(filePath); } catch { return false; }
29
+ }
30
+
31
+ function globDir(dirPath) {
32
+ try { return readdirSync(dirPath); } catch { return []; }
33
+ }
34
+
35
+ // ---------------------------------------------------------------------------
36
+ // Detectors
37
+ // ---------------------------------------------------------------------------
38
+
39
+ function detectGSCConfig() {
40
+ const gsc = { configured: false, indicators: [] };
41
+
42
+ const raw = process.env.WP_SITES_CONFIG;
43
+ if (!raw) return gsc;
44
+
45
+ let sites;
46
+ try { sites = JSON.parse(raw); } catch { return gsc; }
47
+ if (!Array.isArray(sites)) return gsc;
48
+
49
+ for (const site of sites) {
50
+ const label = site.name || site.url || 'unknown';
51
+
52
+ if (site.gsc_service_account_key) {
53
+ gsc.configured = true;
54
+ gsc.indicators.push(`gsc_service_account_key configured for ${label}`);
55
+ }
56
+ if (site.gsc_site_url) {
57
+ gsc.configured = true;
58
+ gsc.indicators.push(`gsc_site_url configured for ${label}`);
59
+ }
60
+ }
61
+
62
+ return gsc;
63
+ }
64
+
65
+ function detectSitemaps(cwd) {
66
+ const indicators = [];
67
+ const sitemapPaths = [
68
+ 'sitemap.xml',
69
+ 'sitemap_index.xml',
70
+ 'wp-sitemap.xml',
71
+ ];
72
+
73
+ for (const sitemapFile of sitemapPaths) {
74
+ if (existsSafe(join(cwd, sitemapFile))) {
75
+ indicators.push(`sitemap: ${sitemapFile}`);
76
+ }
77
+ }
78
+
79
+ return { found: indicators.length > 0, indicators };
80
+ }
81
+
82
+ function detectRobotsTxt(cwd) {
83
+ const indicators = [];
84
+ const robotsPath = join(cwd, 'robots.txt');
85
+
86
+ if (!existsSafe(robotsPath)) {
87
+ return { found: false, indicators };
88
+ }
89
+
90
+ indicators.push('robots.txt exists');
91
+
92
+ const content = readFileSafe(robotsPath);
93
+ if (content) {
94
+ const lower = content.toLowerCase();
95
+ if (lower.includes('sitemap:') || lower.includes('sitemap_index')) {
96
+ indicators.push('robots.txt references sitemap');
97
+ }
98
+ }
99
+
100
+ return { found: true, indicators };
101
+ }
102
+
103
+ function detectSEOPlugins(cwd) {
104
+ const indicators = [];
105
+ const plugins = globDir(join(cwd, 'wp-content', 'plugins'));
106
+
107
+ const seoPlugins = [
108
+ { dir: 'wordpress-seo', name: 'Yoast SEO' },
109
+ { dir: 'seo-by-rank-math', name: 'RankMath' },
110
+ { dir: 'all-in-one-seo-pack', name: 'AIOSEO' },
111
+ ];
112
+
113
+ for (const plugin of plugins) {
114
+ const pluginLower = plugin.toLowerCase();
115
+ for (const seo of seoPlugins) {
116
+ if (pluginLower.includes(seo.dir)) {
117
+ indicators.push(`seo_plugin: ${seo.name} (${plugin})`);
118
+ }
119
+ }
120
+ }
121
+
122
+ return { found: indicators.length > 0, indicators };
123
+ }
124
+
125
+ // ---------------------------------------------------------------------------
126
+ // Main
127
+ // ---------------------------------------------------------------------------
128
+
129
+ function main() {
130
+ const cwdArg = argv.find(a => a.startsWith('--cwd='));
131
+ const cwd = cwdArg ? resolve(cwdArg.split('=')[1]) : process.cwd();
132
+
133
+ const gsc = detectGSCConfig();
134
+ const sitemaps = detectSitemaps(cwd);
135
+ const robots_txt = detectRobotsTxt(cwd);
136
+ const seo_plugins = detectSEOPlugins(cwd);
137
+
138
+ const found = gsc.configured || sitemaps.found || robots_txt.found || seo_plugins.found;
139
+
140
+ const recommendations = [];
141
+
142
+ if (gsc.configured) {
143
+ recommendations.push('GSC configured — use wp-search-console skill to track keyword rankings and indexing');
144
+ }
145
+ if (sitemaps.found) {
146
+ recommendations.push('Sitemap detected — GSC can be configured to monitor indexing coverage');
147
+ }
148
+ if (seo_plugins.found) {
149
+ recommendations.push('SEO plugin detected — integrate with GSC for keyword-to-content feedback loop');
150
+ }
151
+ if (robots_txt.found && robots_txt.indicators.some(i => i.includes('references sitemap'))) {
152
+ recommendations.push('Sitemap reference found in robots.txt — good for GSC crawling');
153
+ }
154
+ if (!found) {
155
+ recommendations.push('No GSC or SEO configuration detected — use wp-search-console skill to set up Google Search Console');
156
+ }
157
+ if (gsc.configured && sitemaps.found && seo_plugins.found) {
158
+ recommendations.push('Full SEO stack ready — use wp-search-console for keyword tracking and content optimization');
159
+ }
160
+
161
+ const report = {
162
+ tool: 'search_console_inspect',
163
+ version: '1.0.0',
164
+ timestamp: new Date().toISOString(),
165
+ cwd,
166
+ found,
167
+ gsc,
168
+ sitemaps,
169
+ robots_txt,
170
+ seo_plugins,
171
+ recommendations,
172
+ };
173
+
174
+ stdout.write(JSON.stringify(report, null, 2) + '\n');
175
+ exit(found ? 0 : 1);
176
+ }
177
+
178
+ main();
@@ -0,0 +1,152 @@
1
+ ---
2
+ name: wp-social-email
3
+ description: This skill should be used when the user asks to "publish to social media",
4
+ "schedule social posts", "send email campaign", "Mailchimp integration",
5
+ "Buffer scheduling", "SendGrid email", "content distribution",
6
+ "newsletter campaign", "email marketing", "social media management",
7
+ "distribute content", or mentions publishing WordPress content to social
8
+ and email channels.
9
+ version: 1.0.0
10
+ ---
11
+
12
+ # WordPress Social & Email Distribution Skill
13
+
14
+ ## Overview
15
+
16
+ Social and email distribution connects WordPress content to external marketing channels via three services: Mailchimp (email campaigns and audience management), Buffer (social media scheduling and publishing), and SendGrid (transactional email delivery). The WP REST Bridge provides 18 MCP tools across these services, enabling content distribution workflows directly from the WordPress authoring environment.
17
+
18
+ ## When to Use
19
+
20
+ - User wants to send a newsletter or email campaign from WordPress content
21
+ - User needs to schedule social media posts when a blog post is published
22
+ - User asks about Mailchimp audience management or subscriber lists
23
+ - User wants to connect Buffer for social media scheduling
24
+ - User needs transactional email delivery via SendGrid (welcome emails, confirmations)
25
+ - User asks about content distribution pipelines (blog → social → email)
26
+ - User wants to segment audiences for targeted campaigns
27
+ - User needs analytics on email open rates, click rates, or social engagement
28
+
29
+ ## Decision Tree
30
+
31
+ 1. **What channel or service?**
32
+ - "Mailchimp" / "audience" / "email campaign" / "newsletter" → Mailchimp integration (Section 1)
33
+ - "Buffer" / "social post" / "schedule tweet" / "social media" → Buffer social publishing (Section 2)
34
+ - "SendGrid" / "transactional email" / "email delivery" → SendGrid transactional (Section 3)
35
+ - "distribute content" / "blog to social" / "content pipeline" → Content-to-distribution workflow (Section 4)
36
+ - "audience segment" / "targeting" / "list management" → Audience segmentation (Section 5)
37
+ - "email analytics" / "open rate" / "click rate" / "campaign report" → Distribution analytics (Section 6)
38
+
39
+ 2. **Run detection first:**
40
+ ```bash
41
+ node skills/wp-social-email/scripts/distribution_inspect.mjs [--cwd=/path/to/project]
42
+ ```
43
+ This identifies configured distribution services and API credentials.
44
+
45
+ ## Service Overview
46
+
47
+ | Service | Tools | Auth Type | Use Case |
48
+ |---------|-------|-----------|----------|
49
+ | Mailchimp | 7 tools (`mc_*`) | API key | Email campaigns, audience management, subscriber lists |
50
+ | Buffer | 5 tools (`buf_*`) | Access token | Social media scheduling, queue management, analytics |
51
+ | SendGrid | 6 tools (`sg_*`) | API key | Transactional email, templates, contact management |
52
+
53
+ ## Distribution Sections
54
+
55
+ ### Section 1: Mailchimp Integration
56
+ See `references/mailchimp-integration.md`
57
+ - API key setup and WP_SITES_CONFIG configuration
58
+ - Audience management (list, get members, add subscribers)
59
+ - Campaign workflow: create → set content → send → report
60
+ - A/B testing and send time optimization
61
+
62
+ ### Section 2: Buffer Social Publishing
63
+ See `references/buffer-social-publishing.md`
64
+ - Access token setup and WP_SITES_CONFIG configuration
65
+ - Profile management and channel connections
66
+ - Post creation with media attachments and scheduling
67
+ - Queue management and posting analytics
68
+
69
+ ### Section 3: SendGrid Transactional Email
70
+ See `references/sendgrid-transactional.md`
71
+ - API key setup and WP_SITES_CONFIG configuration
72
+ - Transactional email for welcome, password reset, order confirmation
73
+ - Dynamic template management
74
+ - Contact management and email deliverability
75
+
76
+ ### Section 4: Content-to-Distribution Workflow
77
+ See `references/content-to-distribution.md`
78
+ - WordPress-to-channel pipeline (fetch post → format → distribute)
79
+ - Content adaptation per channel (blog → social, blog → newsletter)
80
+ - Scheduling strategies (immediate, drip, evergreen rotation)
81
+ - Multi-channel orchestration
82
+
83
+ ### Section 5: Audience Segmentation
84
+ See `references/audience-segmentation.md`
85
+ - Mailchimp list segmentation strategies
86
+ - SendGrid contact lists and custom fields
87
+ - Buffer profile-based targeting
88
+ - Building audience personas from WordPress user data
89
+
90
+ ### Section 6: Distribution Analytics
91
+ See `references/distribution-analytics.md`
92
+ - Mailchimp campaign reports (open rate, click rate, bounces)
93
+ - Buffer analytics (reach, engagement, clicks)
94
+ - SendGrid stats (deliverability, opens, clicks)
95
+ - Cross-channel performance comparison and KPIs
96
+
97
+ ## Reference Files
98
+
99
+ | File | Content |
100
+ |------|---------|
101
+ | `references/mailchimp-integration.md` | API setup, audiences, campaigns, A/B testing |
102
+ | `references/buffer-social-publishing.md` | Access token, profiles, posts, queue management |
103
+ | `references/sendgrid-transactional.md` | API setup, transactional email, templates, contacts |
104
+ | `references/content-to-distribution.md` | Content pipeline, adaptation, scheduling, multi-channel |
105
+ | `references/audience-segmentation.md` | List segmentation, custom fields, personas |
106
+ | `references/distribution-analytics.md` | Campaign reports, social stats, KPIs, benchmarks |
107
+
108
+ ## MCP Tools
109
+
110
+ ### Mailchimp Tools (7)
111
+
112
+ | Tool | Description |
113
+ |------|-------------|
114
+ | `mc_list_audiences` | List all Mailchimp audiences (lists) with member counts |
115
+ | `mc_get_audience_members` | Get subscribers for a specific audience with pagination |
116
+ | `mc_add_subscriber` | Add or update a subscriber in an audience |
117
+ | `mc_create_campaign` | Create a new email campaign (regular, plaintext, A/B test) |
118
+ | `mc_set_campaign_content` | Set the HTML or template content for a campaign |
119
+ | `mc_send_campaign` | Send or schedule a campaign for delivery |
120
+ | `mc_get_campaign_report` | Get campaign performance metrics (opens, clicks, bounces) |
121
+
122
+ ### Buffer Tools (5)
123
+
124
+ | Tool | Description |
125
+ |------|-------------|
126
+ | `buf_list_profiles` | List connected social media profiles (Twitter, Facebook, LinkedIn, etc.) |
127
+ | `buf_create_update` | Create a social media post with text, media, and optional schedule time |
128
+ | `buf_list_pending` | List posts in the Buffer queue awaiting publication |
129
+ | `buf_list_sent` | List previously published posts with engagement data |
130
+ | `buf_get_analytics` | Get analytics for a profile (reach, engagement, clicks) |
131
+
132
+ ### SendGrid Tools (6)
133
+
134
+ | Tool | Description |
135
+ |------|-------------|
136
+ | `sg_send_email` | Send a transactional email (plain, HTML, or template-based) |
137
+ | `sg_list_templates` | List available dynamic email templates |
138
+ | `sg_get_template` | Get template details including version and HTML content |
139
+ | `sg_list_contacts` | List contacts with optional search and filtering |
140
+ | `sg_add_contacts` | Add or update contacts with custom fields |
141
+ | `sg_get_stats` | Get email statistics (deliveries, opens, clicks, bounces) |
142
+
143
+ ## Recommended Agent
144
+
145
+ Use the **`wp-distribution-manager`** agent for complex multi-channel distribution workflows that span multiple services or require coordinated content adaptation.
146
+
147
+ ## Related Skills
148
+
149
+ - **`wp-content-repurposing`** — transform content formats before distribution
150
+ - **`wp-webhooks`** — trigger distribution on WordPress events (publish, update)
151
+ - **`wp-content`** — create and manage WordPress content for distribution
152
+ - **`wp-content-attribution`** — track content sources and attribution across channels