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.
- package/.claude-plugin/plugin.json +15 -3
- package/CHANGELOG.md +62 -0
- package/agents/wp-content-strategist.md +104 -0
- package/agents/wp-distribution-manager.md +98 -0
- package/docs/GUIDE.md +183 -23
- package/docs/plans/2026-03-01-tier3-wcop-design.md +373 -0
- package/docs/plans/2026-03-01-tier3-wcop-implementation.md +915 -0
- package/hooks/hooks.json +18 -0
- package/package.json +18 -3
- package/servers/wp-rest-bridge/build/tools/buffer.d.ts +3 -0
- package/servers/wp-rest-bridge/build/tools/buffer.js +205 -0
- package/servers/wp-rest-bridge/build/tools/comments.d.ts +6 -6
- package/servers/wp-rest-bridge/build/tools/gsc.d.ts +3 -0
- package/servers/wp-rest-bridge/build/tools/gsc.js +354 -0
- package/servers/wp-rest-bridge/build/tools/index.d.ts +38 -38
- package/servers/wp-rest-bridge/build/tools/index.js +12 -0
- package/servers/wp-rest-bridge/build/tools/mailchimp.d.ts +3 -0
- package/servers/wp-rest-bridge/build/tools/mailchimp.js +265 -0
- package/servers/wp-rest-bridge/build/tools/media.d.ts +2 -2
- package/servers/wp-rest-bridge/build/tools/multisite-sites.d.ts +2 -2
- package/servers/wp-rest-bridge/build/tools/plugin-repository.d.ts +1 -1
- package/servers/wp-rest-bridge/build/tools/search.d.ts +2 -2
- package/servers/wp-rest-bridge/build/tools/sendgrid.d.ts +3 -0
- package/servers/wp-rest-bridge/build/tools/sendgrid.js +255 -0
- package/servers/wp-rest-bridge/build/tools/unified-content.d.ts +8 -8
- package/servers/wp-rest-bridge/build/tools/unified-taxonomies.d.ts +4 -4
- package/servers/wp-rest-bridge/build/tools/users.d.ts +6 -6
- package/servers/wp-rest-bridge/build/tools/wc-coupons.d.ts +1 -1
- package/servers/wp-rest-bridge/build/tools/wc-customers.d.ts +3 -3
- package/servers/wp-rest-bridge/build/tools/wc-orders.d.ts +4 -4
- package/servers/wp-rest-bridge/build/tools/wc-products.d.ts +8 -8
- package/servers/wp-rest-bridge/build/tools/wc-webhooks.d.ts +4 -4
- package/servers/wp-rest-bridge/build/types.d.ts +122 -0
- package/servers/wp-rest-bridge/build/wordpress.d.ts +14 -0
- package/servers/wp-rest-bridge/build/wordpress.js +151 -0
- package/servers/wp-rest-bridge/package.json +1 -0
- package/skills/wordpress-router/references/decision-tree.md +8 -2
- package/skills/wp-content/SKILL.md +2 -0
- package/skills/wp-content-attribution/SKILL.md +2 -0
- package/skills/wp-content-optimization/SKILL.md +172 -0
- package/skills/wp-content-optimization/references/content-freshness.md +234 -0
- package/skills/wp-content-optimization/references/headline-optimization.md +171 -0
- package/skills/wp-content-optimization/references/meta-optimization.md +243 -0
- package/skills/wp-content-optimization/references/readability-analysis.md +201 -0
- package/skills/wp-content-optimization/references/seo-content-scoring.md +245 -0
- package/skills/wp-content-optimization/scripts/content_optimization_inspect.mjs +237 -0
- package/skills/wp-content-repurposing/SKILL.md +1 -0
- package/skills/wp-monitoring/SKILL.md +1 -0
- package/skills/wp-programmatic-seo/SKILL.md +2 -0
- package/skills/wp-search-console/SKILL.md +121 -0
- package/skills/wp-search-console/references/competitor-gap-analysis.md +226 -0
- package/skills/wp-search-console/references/content-seo-feedback.md +181 -0
- package/skills/wp-search-console/references/gsc-setup.md +110 -0
- package/skills/wp-search-console/references/indexing-management.md +182 -0
- package/skills/wp-search-console/references/keyword-tracking.md +181 -0
- package/skills/wp-search-console/scripts/search_console_inspect.mjs +178 -0
- package/skills/wp-social-email/SKILL.md +152 -0
- package/skills/wp-social-email/references/audience-segmentation.md +173 -0
- package/skills/wp-social-email/references/buffer-social-publishing.md +124 -0
- package/skills/wp-social-email/references/content-to-distribution.md +156 -0
- package/skills/wp-social-email/references/distribution-analytics.md +208 -0
- package/skills/wp-social-email/references/mailchimp-integration.md +145 -0
- package/skills/wp-social-email/references/sendgrid-transactional.md +165 -0
- package/skills/wp-social-email/scripts/distribution_inspect.mjs +165 -0
- 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
|