@respira/wordpress-mcp-server 7.2.18 → 7.4.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/dist/acf-tools.d.ts +0 -10
- package/dist/acf-tools.d.ts.map +1 -1
- package/dist/acf-tools.js +0 -15
- package/dist/acf-tools.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +31 -36
- package/dist/config.js.map +1 -1
- package/dist/server.d.ts +0 -47
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +1155 -605
- package/dist/server.js.map +1 -1
- package/dist/wordpress-client.d.ts +61 -29
- package/dist/wordpress-client.d.ts.map +1 -1
- package/dist/wordpress-client.js +271 -148
- package/dist/wordpress-client.js.map +1 -1
- package/package.json +2 -2
- package/skills/activity-report-composer/README.md +38 -0
- package/skills/activity-report-composer/SKILL.md +167 -0
- package/skills/activity-report-composer/metadata.json +42 -0
- package/skills/brand-voice-synthesizer/README.md +43 -0
- package/skills/brand-voice-synthesizer/SKILL.md +259 -0
- package/skills/brand-voice-synthesizer/metadata.json +46 -0
- package/skills/build-oxygen6-page/SKILL.md +59 -0
- package/skills/conversion-audit/README.md +37 -0
- package/skills/conversion-audit/SKILL.md +185 -0
- package/skills/conversion-audit/metadata.json +46 -0
- package/skills/custom-post-type-architect/README.md +34 -0
- package/skills/custom-post-type-architect/SKILL.md +158 -0
- package/skills/custom-post-type-architect/metadata.json +39 -0
- package/skills/design-system-synthesizer/README.md +46 -0
- package/skills/design-system-synthesizer/SKILL.md +395 -0
- package/skills/design-system-synthesizer/metadata.json +57 -0
- package/skills/figma-to-elementor/SKILL.md +204 -0
- package/skills/html-to-bricks/README.md +43 -0
- package/skills/html-to-bricks/SKILL.md +135 -0
- package/skills/html-to-bricks/metadata.json +41 -0
- package/skills/internal-link-builder/SKILL.md +258 -0
- package/skills/internal-link-builder/metadata.json +46 -0
- package/skills/migrate-beaver-builder-to-bricks/SKILL.md +251 -0
- package/skills/migrate-beaver-builder-to-gutenberg/SKILL.md +248 -0
- package/skills/migrate-brizy-to-gutenberg/SKILL.md +248 -0
- package/skills/migrate-divi-to-breakdance/SKILL.md +312 -0
- package/skills/migrate-divi-to-bricks/SKILL.md +321 -0
- package/skills/migrate-divi-to-gutenberg/SKILL.md +328 -0
- package/skills/migrate-elementor-to-breakdance/SKILL.md +287 -0
- package/skills/migrate-elementor-to-bricks/SKILL.md +289 -0
- package/skills/migrate-elementor-to-gutenberg/SKILL.md +327 -0
- package/skills/migrate-elementor-to-oxygen/SKILL.md +300 -0
- package/skills/migrate-oxygen-to-breakdance/SKILL.md +235 -0
- package/skills/migrate-oxygen-to-bricks/SKILL.md +237 -0
- package/skills/migrate-thrive-architect-to-gutenberg/SKILL.md +257 -0
- package/skills/migrate-visual-composer-to-gutenberg/SKILL.md +261 -0
- package/skills/migrate-wpbakery-to-bricks/SKILL.md +336 -0
- package/skills/migrate-wpbakery-to-gutenberg/SKILL.md +345 -0
- package/skills/mobile-experience-report/SKILL.md +719 -0
- package/skills/mobile-experience-report/telemetry.ts +137 -0
- package/skills/page-template-library/README.md +41 -0
- package/skills/page-template-library/SKILL.md +175 -0
- package/skills/page-template-library/metadata.json +44 -0
- package/skills/prime-the-agent/README.md +49 -0
- package/skills/prime-the-agent/SKILL.md +225 -0
- package/skills/prime-the-agent/metadata.json +46 -0
- package/skills/respira-setup-assistant/SKILL.md +386 -0
- package/skills/respira-setup-assistant/metadata.json +36 -0
- package/skills/seo-aeo-amplifier/README.md +61 -0
- package/skills/seo-aeo-amplifier/SKILL.md +277 -0
- package/skills/seo-aeo-amplifier/metadata.json +62 -0
- package/skills/stale-content-detector/README.md +41 -0
- package/skills/stale-content-detector/SKILL.md +156 -0
- package/skills/stale-content-detector/metadata.json +43 -0
- package/skills/technical-debt-audit/SKILL.md +691 -0
- package/skills/technical-debt-audit/telemetry.ts +142 -0
- package/skills/woocommerce-health-check/SKILL.md +719 -0
- package/skills/woocommerce-health-check/telemetry.ts +137 -0
- package/skills/wordpress-ai-image-optimizer/README.md +49 -0
- package/skills/wordpress-ai-image-optimizer/SKILL.md +232 -0
- package/skills/wordpress-ai-image-optimizer/metadata.json +63 -0
- package/skills/wordpress-site-dna/README.md +81 -0
- package/skills/wordpress-site-dna/SKILL.md +669 -0
- package/skills/wordpress-site-dna/telemetry.ts +137 -0
- package/dist/__tests__/acf-tool-routing.test.d.ts +0 -2
- package/dist/__tests__/acf-tool-routing.test.d.ts.map +0 -1
- package/dist/__tests__/acf-tool-routing.test.js +0 -37
- package/dist/__tests__/acf-tool-routing.test.js.map +0 -1
- package/dist/__tests__/cowork-bootstrap.test.d.ts +0 -2
- package/dist/__tests__/cowork-bootstrap.test.d.ts.map +0 -1
- package/dist/__tests__/cowork-bootstrap.test.js +0 -61
- package/dist/__tests__/cowork-bootstrap.test.js.map +0 -1
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
# SEO & AEO Amplifier
|
|
2
|
+
|
|
3
|
+
**Version:** 1.3.0
|
|
4
|
+
**Updated:** 2026-06-30
|
|
5
|
+
**Freshly updated:** v1.3.0 takes a snapshot with respira_get_snapshot before any edit so every change is one-click reversible, switches from full extract/inject to surgical respira_find_element + respira_update_element edits for meta titles, descriptions and H1s, applies schema and meta across many pages in a single safe pass with respira_batch_update, and wires respira_generate_activity_report into the "SEO work done -> client report" handoff. Also leans on the real SEO analysis tools (respira_analyze_seo, respira_analyze_aeo, respira_analyze_rankmath, respira_check_seo_issues, respira_check_structured_data) instead of hand-rolled scoring.
|
|
6
|
+
|
|
7
|
+
Comprehensive on-page SEO and Answer Engine Optimization (AEO) audit and auto-fix system for WordPress sites. Scans all content, detects issues, generates intelligent schema markup, and creates optimized duplicates for review.
|
|
8
|
+
|
|
9
|
+
## What This Skill Does
|
|
10
|
+
|
|
11
|
+
**Finds:**
|
|
12
|
+
- Missing or weak title tags and meta descriptions
|
|
13
|
+
- Poor heading structure (multiple H1s, skipped heading levels, non-descriptive headings)
|
|
14
|
+
- Missing image alt text across all media
|
|
15
|
+
- Thin content (pages under 300 words)
|
|
16
|
+
- Broken internal links
|
|
17
|
+
- Orphaned pages (no internal links pointing to them)
|
|
18
|
+
- Non-descriptive URL slugs
|
|
19
|
+
- Content that could answer questions but lacks FAQ schema
|
|
20
|
+
- Missing structured data (Article, HowTo, Product, Event, Video, Review)
|
|
21
|
+
- Content not optimized for featured snippets
|
|
22
|
+
- Missing table of contents on long-form content
|
|
23
|
+
- No clear Q&A structure for "People Also Ask" boxes
|
|
24
|
+
|
|
25
|
+
**Provides:**
|
|
26
|
+
- Comprehensive SEO health score (0-100)
|
|
27
|
+
- Page-by-page opportunity analysis
|
|
28
|
+
- Automated duplicate creation with all fixes applied
|
|
29
|
+
- Intelligent schema markup generation based on content type
|
|
30
|
+
- Before/after comparison for every fix
|
|
31
|
+
- Plugin-specific guidance (Yoast SEO, Rank Math, or plugin-agnostic)
|
|
32
|
+
|
|
33
|
+
**Generates Schema Markup:**
|
|
34
|
+
- Article schema (blog posts, news)
|
|
35
|
+
- FAQ schema (Q&A content detected)
|
|
36
|
+
- HowTo schema (tutorial/guide content)
|
|
37
|
+
- Product schema (WooCommerce products - requires WooCommerce add-on)
|
|
38
|
+
- Event schema (event content detected)
|
|
39
|
+
- Video schema (embedded videos detected)
|
|
40
|
+
- Review schema (review content detected)
|
|
41
|
+
- Breadcrumb schema (site navigation)
|
|
42
|
+
- Organization/Website schema (site-wide)
|
|
43
|
+
|
|
44
|
+
## Requirements
|
|
45
|
+
|
|
46
|
+
- Respira for WordPress plugin installed and connected
|
|
47
|
+
- MCP connection active (desktop or WebMCP)
|
|
48
|
+
- WooCommerce add-on (optional - for product schema)
|
|
49
|
+
- Read access to scan site, write access to create duplicates
|
|
50
|
+
|
|
51
|
+
## Trigger Phrase
|
|
52
|
+
|
|
53
|
+
- "amplify my seo and aeo"
|
|
54
|
+
|
|
55
|
+
## Alternative Triggers
|
|
56
|
+
|
|
57
|
+
- "optimize my site for search engines"
|
|
58
|
+
- "run seo aeo audit"
|
|
59
|
+
- "improve my search visibility"
|
|
60
|
+
- "scan for seo opportunities"
|
|
61
|
+
|
|
62
|
+
## Execution Workflow
|
|
63
|
+
|
|
64
|
+
### Phase 1: Comprehensive Audit
|
|
65
|
+
|
|
66
|
+
1. Verify Respira + MCP connection via `respira_get_site_context`. If unavailable, stop and show setup guidance.
|
|
67
|
+
2. Detect SEO plugin setup using `respira_list_plugins`:
|
|
68
|
+
- Yoast SEO
|
|
69
|
+
- Rank Math
|
|
70
|
+
- No SEO plugin
|
|
71
|
+
3. Scan all published pages and posts:
|
|
72
|
+
- `respira_list_pages`
|
|
73
|
+
- `respira_list_posts`
|
|
74
|
+
4. For each content item, load content and metadata:
|
|
75
|
+
- `respira_read_page` or `respira_read_post`
|
|
76
|
+
- `respira_get_builder_info` when needed
|
|
77
|
+
5. Analyze on-page SEO. Prefer the real analysis tools over hand-rolled checks:
|
|
78
|
+
- `respira_analyze_seo` for the on-page SEO pass (title, meta, headings, content depth, links)
|
|
79
|
+
- `respira_check_seo_issues` for the prioritized issue list per page
|
|
80
|
+
- `respira_analyze_rankmath` when Rank Math is detected (reads its score and recommendations)
|
|
81
|
+
- `respira_check_structured_data` to see which schema types already exist vs are missing
|
|
82
|
+
- Supplement with `respira_list_media` + in-content image checks for alt text coverage
|
|
83
|
+
- Cross-checks the tools cover: title quality, meta description quality, heading hierarchy (single H1, no level skips), content depth, internal links / orphaned pages, URL slug descriptiveness
|
|
84
|
+
6. Analyze AEO opportunities with `respira_analyze_aeo` (answer-engine readiness), plus `respira_check_structured_data`:
|
|
85
|
+
- FAQ potential (question patterns)
|
|
86
|
+
- HowTo potential (step-by-step patterns)
|
|
87
|
+
- Featured snippet opportunities
|
|
88
|
+
- Missing table of contents on long-form pages
|
|
89
|
+
- Missing structured data per content type
|
|
90
|
+
7. Build opportunity scoring:
|
|
91
|
+
- Critical / High / Medium / Low
|
|
92
|
+
- Per-page opportunity score (0-100)
|
|
93
|
+
8. Produce full report with:
|
|
94
|
+
- Overall health score
|
|
95
|
+
- Priority matrix
|
|
96
|
+
- Top opportunity pages
|
|
97
|
+
- Plugin-specific integration notes
|
|
98
|
+
|
|
99
|
+
### Phase 2: Ask for Confirmation
|
|
100
|
+
|
|
101
|
+
After report, ask:
|
|
102
|
+
|
|
103
|
+
> I found [X] pages with SEO/AEO opportunities. Would you like me to create optimized duplicates for all of them? You will review before publishing.
|
|
104
|
+
|
|
105
|
+
If user declines, stop after delivering recommendations.
|
|
106
|
+
|
|
107
|
+
### Phase 3: Auto-Fix on Duplicates (Only If Approved)
|
|
108
|
+
|
|
109
|
+
1. **Snapshot first.** Before touching anything, take a snapshot with `respira_get_snapshot` so the whole pass is one-click reversible via `respira_restore_snapshot` if a fix looks wrong.
|
|
110
|
+
2. For each selected page/post:
|
|
111
|
+
- Create the review copy with `respira_create_page_duplicate` (pages) or `respira_create_post_duplicate` (posts)
|
|
112
|
+
3. Apply fixes on the duplicate only. Use surgical edits, not full extract/inject:
|
|
113
|
+
- **Locate the exact node first** with `respira_find_element` (find the meta title, meta description, and the H1 / heading elements), then change only that node with `respira_update_element`. This avoids re-writing the whole page and keeps the builder's structure intact.
|
|
114
|
+
- Optimize title tags (target < 60 chars)
|
|
115
|
+
- Generate/rewrite meta descriptions (target 150-160 chars)
|
|
116
|
+
- Fix heading structure (single H1, logical hierarchy)
|
|
117
|
+
- Add/repair image alt text
|
|
118
|
+
- Add table of contents for long-form pages
|
|
119
|
+
- Restructure Q&A blocks for FAQ readiness
|
|
120
|
+
- Generate and inject JSON-LD schema markup
|
|
121
|
+
- Improve URL slug when safe and requested
|
|
122
|
+
4. **Apply the same fix across many pages in one safe pass** with `respira_batch_update` (for example, the same Organization/WebSite schema or a meta pattern across a set of duplicates) instead of looping one slow update at a time.
|
|
123
|
+
5. Save remaining page-level changes with `respira_update_page` / `respira_update_post`.
|
|
124
|
+
6. Verify with `respira_check_seo_issues` / `respira_check_structured_data` on a sample of the fixed duplicates to confirm the issues actually cleared.
|
|
125
|
+
7. Produce before/after comparison snapshots for representative pages.
|
|
126
|
+
8. Summarize totals:
|
|
127
|
+
- Duplicates created
|
|
128
|
+
- Titles/meta/schema/alt/headings fixed
|
|
129
|
+
- Snapshot id (so the user knows the rollback point)
|
|
130
|
+
|
|
131
|
+
## Plugin Integration Behavior
|
|
132
|
+
|
|
133
|
+
### Yoast SEO detected
|
|
134
|
+
|
|
135
|
+
- Read Yoast metadata
|
|
136
|
+
- Populate Yoast-compatible meta fields on duplicates
|
|
137
|
+
- Add JSON-LD schema only where Yoast does not already cover the content type
|
|
138
|
+
- Suggest focus keywords and readability improvements
|
|
139
|
+
|
|
140
|
+
### Rank Math detected
|
|
141
|
+
|
|
142
|
+
- Read Rank Math metadata
|
|
143
|
+
- Populate Rank Math-compatible meta fields on duplicates
|
|
144
|
+
- Add JSON-LD schema where missing
|
|
145
|
+
|
|
146
|
+
### No SEO plugin detected
|
|
147
|
+
|
|
148
|
+
- Insert meta tags and JSON-LD directly in duplicate content
|
|
149
|
+
- Recommend optional Yoast or Rank Math adoption
|
|
150
|
+
|
|
151
|
+
## Schema Generation Rules
|
|
152
|
+
|
|
153
|
+
Generate schema based on detected content intent:
|
|
154
|
+
|
|
155
|
+
- **Article:** blog/news/editorial content
|
|
156
|
+
- **FAQPage:** clear Q&A content patterns
|
|
157
|
+
- **HowTo:** procedural/step-by-step content
|
|
158
|
+
- **Product:** WooCommerce products (if add-on/tools available)
|
|
159
|
+
- **Event:** event date/location content
|
|
160
|
+
- **VideoObject:** embedded YouTube/Vimeo/video blocks
|
|
161
|
+
- **Review:** clear review/rating content
|
|
162
|
+
- **BreadcrumbList:** URL hierarchy
|
|
163
|
+
- **Organization / WebSite:** site-level identity signals
|
|
164
|
+
|
|
165
|
+
All schema must be JSON-LD and valid structure-first (no fabricated claims).
|
|
166
|
+
|
|
167
|
+
## Output Format
|
|
168
|
+
|
|
169
|
+
Always include:
|
|
170
|
+
|
|
171
|
+
1. **Executive summary**
|
|
172
|
+
2. **Overall score + severity counts**
|
|
173
|
+
3. **Top opportunities with impact rationale**
|
|
174
|
+
4. **Plugin integration notes**
|
|
175
|
+
5. **Clear confirmation prompt for duplicate creation**
|
|
176
|
+
|
|
177
|
+
If auto-fix is run, also include:
|
|
178
|
+
|
|
179
|
+
6. **Fix summary totals**
|
|
180
|
+
7. **Before/after samples**
|
|
181
|
+
8. **Review instructions in WordPress admin**
|
|
182
|
+
|
|
183
|
+
## Safety Model
|
|
184
|
+
|
|
185
|
+
- Read-only audit first
|
|
186
|
+
- Snapshot via `respira_get_snapshot` before any write, restore with `respira_restore_snapshot`
|
|
187
|
+
- Explicit user confirmation before changes
|
|
188
|
+
- Duplicate-first changes only
|
|
189
|
+
- Never auto-publish
|
|
190
|
+
- Provide rollback guidance
|
|
191
|
+
- Preserve live content unless user explicitly approves publishing workflow
|
|
192
|
+
|
|
193
|
+
## Client Report Handoff
|
|
194
|
+
|
|
195
|
+
When the audit and (optional) fixes are done, turn the SEO work into a deliverable the customer can hand to a client or keep for their own records:
|
|
196
|
+
|
|
197
|
+
- Call `respira_generate_activity_report` to pull the actual edits made in this session (titles, meta, schema, alt text, headings) into a structured "SEO work done" report.
|
|
198
|
+
- Pair it with the before/after samples and the snapshot id from Phase 3 so the report shows what changed and how to roll it back.
|
|
199
|
+
- Good fit for monthly retainers: run the audit, apply approved fixes on duplicates, then export the activity report as the month's SEO summary.
|
|
200
|
+
|
|
201
|
+
## Honest Disclaimer
|
|
202
|
+
|
|
203
|
+
This skill identifies SEO/AEO opportunities and creates optimized duplicates for review.
|
|
204
|
+
|
|
205
|
+
It cannot:
|
|
206
|
+
- Guarantee rankings
|
|
207
|
+
- Fix off-page SEO or backlinks
|
|
208
|
+
- Fix server-level technical SEO by itself
|
|
209
|
+
- Publish without review
|
|
210
|
+
|
|
211
|
+
It can:
|
|
212
|
+
- Find broad on-page SEO and AEO gaps
|
|
213
|
+
- Generate structured schema recommendations and implementation
|
|
214
|
+
- Create transparent before/after duplicate drafts quickly
|
|
215
|
+
|
|
216
|
+
## Tooling
|
|
217
|
+
|
|
218
|
+
**Core WordPress tools**
|
|
219
|
+
- `respira_get_site_context`
|
|
220
|
+
- `respira_list_pages`
|
|
221
|
+
- `respira_list_posts`
|
|
222
|
+
- `respira_read_page`
|
|
223
|
+
- `respira_read_post`
|
|
224
|
+
- `respira_get_builder_info`
|
|
225
|
+
- `respira_list_media`
|
|
226
|
+
- `respira_list_plugins`
|
|
227
|
+
- `respira_create_page_duplicate`
|
|
228
|
+
- `respira_create_post_duplicate`
|
|
229
|
+
- `respira_update_page`
|
|
230
|
+
- `respira_update_post`
|
|
231
|
+
|
|
232
|
+
**SEO / AEO analysis tools**
|
|
233
|
+
- `respira_analyze_seo`
|
|
234
|
+
- `respira_analyze_aeo`
|
|
235
|
+
- `respira_analyze_rankmath`
|
|
236
|
+
- `respira_check_seo_issues`
|
|
237
|
+
- `respira_check_structured_data`
|
|
238
|
+
|
|
239
|
+
**Precision edit + safety tools**
|
|
240
|
+
- `respira_find_element` (locate meta title / description / H1 nodes)
|
|
241
|
+
- `respira_update_element` (change only that node)
|
|
242
|
+
- `respira_batch_update` (apply schema/meta across many pages in one pass)
|
|
243
|
+
- `respira_get_snapshot` (snapshot before edits)
|
|
244
|
+
- `respira_restore_snapshot` (one-click rollback)
|
|
245
|
+
|
|
246
|
+
**Reporting**
|
|
247
|
+
- `respira_generate_activity_report` (SEO work done -> client report)
|
|
248
|
+
|
|
249
|
+
**WooCommerce tools (optional)**
|
|
250
|
+
- `woocommerce_list_products`
|
|
251
|
+
- `woocommerce_get_product`
|
|
252
|
+
|
|
253
|
+
## Telemetry
|
|
254
|
+
|
|
255
|
+
After run completion, send fire-and-forget usage tracking to:
|
|
256
|
+
|
|
257
|
+
- `POST https://www.respira.press/api/skills/track-usage`
|
|
258
|
+
|
|
259
|
+
Include:
|
|
260
|
+
- `skill_slug = seo-aeo-amplifier`
|
|
261
|
+
- site/version context
|
|
262
|
+
- duration and success
|
|
263
|
+
- issues found and fixes applied counts
|
|
264
|
+
- tools used
|
|
265
|
+
|
|
266
|
+
Never block user flow on telemetry failure.
|
|
267
|
+
|
|
268
|
+
## Related Skills
|
|
269
|
+
|
|
270
|
+
- WordPress Site DNA
|
|
271
|
+
- Technical Debt Audit
|
|
272
|
+
- Mobile Experience Report
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
Built by Respira Team
|
|
277
|
+
https://respira.press/skills/seo-aeo-amplifier
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "SEO & AEO Amplifier",
|
|
3
|
+
"slug": "seo-aeo-amplifier",
|
|
4
|
+
"icon": "🚀",
|
|
5
|
+
"category": "performance",
|
|
6
|
+
"description": "Comprehensive on-page SEO and AEO audit with automated optimization. Scans all content, detects issues, generates intelligent schema markup, and creates optimized duplicates for review.",
|
|
7
|
+
"author": "Respira Team",
|
|
8
|
+
"author_url": "https://respira.press",
|
|
9
|
+
"trigger": "amplify my seo and aeo",
|
|
10
|
+
"requires_respira": true,
|
|
11
|
+
"requires_woocommerce_addon": false,
|
|
12
|
+
"requires_accessibility_addon": false,
|
|
13
|
+
"is_read_only": false,
|
|
14
|
+
"is_duplicate_first": true,
|
|
15
|
+
"version": "1.2.0",
|
|
16
|
+
"last_updated": "2026-05-24",
|
|
17
|
+
"tools_used": [
|
|
18
|
+
"respira_get_site_context",
|
|
19
|
+
"respira_list_pages",
|
|
20
|
+
"respira_list_posts",
|
|
21
|
+
"respira_get_page",
|
|
22
|
+
"respira_get_post",
|
|
23
|
+
"respira_detect_page_builder",
|
|
24
|
+
"respira_list_media",
|
|
25
|
+
"respira_list_plugins",
|
|
26
|
+
"respira_create_duplicate",
|
|
27
|
+
"respira_update_page",
|
|
28
|
+
"respira_update_post",
|
|
29
|
+
"woocommerce_list_products",
|
|
30
|
+
"woocommerce_get_product"
|
|
31
|
+
],
|
|
32
|
+
"detects": [
|
|
33
|
+
"missing_title_tags",
|
|
34
|
+
"weak_meta_descriptions",
|
|
35
|
+
"poor_heading_structure",
|
|
36
|
+
"missing_alt_text",
|
|
37
|
+
"thin_content",
|
|
38
|
+
"broken_internal_links",
|
|
39
|
+
"orphaned_pages",
|
|
40
|
+
"non_descriptive_urls",
|
|
41
|
+
"missing_faq_schema",
|
|
42
|
+
"missing_article_schema",
|
|
43
|
+
"missing_howto_schema",
|
|
44
|
+
"missing_toc",
|
|
45
|
+
"no_qa_structure"
|
|
46
|
+
],
|
|
47
|
+
"generates": [
|
|
48
|
+
"article_schema",
|
|
49
|
+
"faq_schema",
|
|
50
|
+
"howto_schema",
|
|
51
|
+
"product_schema",
|
|
52
|
+
"event_schema",
|
|
53
|
+
"video_schema",
|
|
54
|
+
"review_schema",
|
|
55
|
+
"breadcrumb_schema",
|
|
56
|
+
"organization_schema",
|
|
57
|
+
"optimized_titles",
|
|
58
|
+
"optimized_meta_descriptions",
|
|
59
|
+
"image_alt_text",
|
|
60
|
+
"table_of_contents"
|
|
61
|
+
]
|
|
62
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Stale Content Detector
|
|
2
|
+
|
|
3
|
+
> Find the content drag on your site in 30 seconds.
|
|
4
|
+
|
|
5
|
+
Categorizes every page and post on your site by how long it's been since last update. Tells you what to refresh, what to redirect, and what to archive — based on age, traffic signal, and internal link count.
|
|
6
|
+
|
|
7
|
+
## What you get
|
|
8
|
+
|
|
9
|
+
| Bucket | Age | Suggested action |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| Fresh | < 6 months | leave alone |
|
|
12
|
+
| Aging | 6–12 months | review headline + opener, refresh if outdated |
|
|
13
|
+
| Stale | 12–24 months | refresh content meaningfully |
|
|
14
|
+
| Archive-candidate | 24+ months (low traffic / orphan) | archive, redirect, or 410 |
|
|
15
|
+
|
|
16
|
+
Plus a "what I'd refresh first" top-5 list ranked by traffic + internal link equity, so you know where to start.
|
|
17
|
+
|
|
18
|
+
## Why it matters
|
|
19
|
+
|
|
20
|
+
Stale content is an SEO drag and a credibility tax. If your "2023 trends" article still ranks but nobody's touched it since 2023, you're losing trust the day a reader notices the date. The skill finds these items fast so you can decide: refresh, redirect, or archive.
|
|
21
|
+
|
|
22
|
+
## Triggers
|
|
23
|
+
|
|
24
|
+
- *"find old content"*
|
|
25
|
+
- *"what's stale"*
|
|
26
|
+
- *"what needs refreshing"*
|
|
27
|
+
- *"audit my content age"*
|
|
28
|
+
- *"what should I archive"*
|
|
29
|
+
|
|
30
|
+
## Hard rule
|
|
31
|
+
|
|
32
|
+
Never deletes a page directly. Even archive-candidates get a recommendation, not a deletion. You decide.
|
|
33
|
+
|
|
34
|
+
## Pairs with
|
|
35
|
+
|
|
36
|
+
[SEO & AEO Amplifier](https://respira.press/skills/seo-aeo-amplifier) — once you've identified what to refresh, the Amplifier handles the actual content updates.
|
|
37
|
+
|
|
38
|
+
## Requires
|
|
39
|
+
|
|
40
|
+
- Respira for WordPress plugin
|
|
41
|
+
- MCP server connected
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# Stale Content Detector
|
|
2
|
+
|
|
3
|
+
**Version:** 1.0.0
|
|
4
|
+
**Updated:** 2026-05-24
|
|
5
|
+
**Category:** audit
|
|
6
|
+
**Status:** stable
|
|
7
|
+
**Requires:** Respira for WordPress plugin 7.1+ + MCP server
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Description
|
|
12
|
+
|
|
13
|
+
Find pages and posts that haven't been updated in a long time, categorize them as fresh / aging / stale / archive-candidate, and suggest action per item: refresh, redirect, archive, or leave alone. Stale content is an SEO drag and a credibility tax — if your "2023 trends" article still ranks but nobody's touched it since 2023, you're losing trust the day a reader notices the date.
|
|
14
|
+
|
|
15
|
+
This skill is intentionally focused. It's not a content audit (use [SEO & AEO Amplifier](https://respira.press/skills/seo-aeo-amplifier) for that). It's the "what's old" question, answered fast.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## What it categorizes
|
|
20
|
+
|
|
21
|
+
| Bucket | Age since last update | Suggested action |
|
|
22
|
+
|---|---|---|
|
|
23
|
+
| Fresh | < 6 months | leave alone |
|
|
24
|
+
| Aging | 6–12 months | review the headline + opening paragraph; if still accurate, leave; if outdated, refresh the date |
|
|
25
|
+
| Stale | 12–24 months | refresh the content meaningfully (new data, new examples), update the modified date |
|
|
26
|
+
| Archive-candidate | 24+ months **and** low traffic / orphan | archive, redirect, or 410 — depends on if anything links to it |
|
|
27
|
+
|
|
28
|
+
Plus an "evergreen" override: pages tagged as evergreen (`/about/`, `/contact/`, `/pricing/`, `/privacy/`) skip the staleness check entirely.
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## When to Use
|
|
33
|
+
|
|
34
|
+
- Quarterly content review
|
|
35
|
+
- Migrating a site and trying to decide what to bring vs leave behind
|
|
36
|
+
- After a content team change — find the inherited backlog of old work
|
|
37
|
+
- Before publishing the next batch of new content (so the old stuff doesn't drag the rankings of the new stuff)
|
|
38
|
+
- After a Google update that emphasizes "freshness" signals
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Trigger Phrases
|
|
43
|
+
|
|
44
|
+
- "find old content"
|
|
45
|
+
- "what's stale"
|
|
46
|
+
- "what needs refreshing"
|
|
47
|
+
- "audit my content age"
|
|
48
|
+
- "find content to update"
|
|
49
|
+
- "stale content scan"
|
|
50
|
+
- "what should i archive"
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## Execution Workflow
|
|
55
|
+
|
|
56
|
+
### Step 1 — Confirm site
|
|
57
|
+
|
|
58
|
+
Call `respira_get_active_site` + `respira_get_site_context`.
|
|
59
|
+
|
|
60
|
+
### Step 2 — Pull pages and posts
|
|
61
|
+
|
|
62
|
+
Call:
|
|
63
|
+
|
|
64
|
+
- `respira_list_pages(per_page=100)` for pages
|
|
65
|
+
- `respira_list_posts(per_page=100, status=publish)` for posts
|
|
66
|
+
- `respira_list_custom_posts(post_type=<each non-default CPT>, per_page=100)` for any CPT detected via `respira_list_post_types`
|
|
67
|
+
|
|
68
|
+
Each result includes `modified` and `date`. Sort by `modified` ascending — oldest first.
|
|
69
|
+
|
|
70
|
+
### Step 3 — Identify evergreen pages
|
|
71
|
+
|
|
72
|
+
Pull the list of pages and check each against the evergreen list (`/about`, `/contact`, `/pricing`, `/privacy`, `/terms`, `/legal`, `/imprint`, `/faq`, `/support`). If the URL or slug matches, flag as evergreen and skip the staleness check.
|
|
73
|
+
|
|
74
|
+
Also check if the post type has `has_archive=false` and a single URL pattern matching contact/legal/utility — those are usually evergreen.
|
|
75
|
+
|
|
76
|
+
### Step 4 — Compute staleness
|
|
77
|
+
|
|
78
|
+
For each non-evergreen page or post, compute days-since-modified. Bucket:
|
|
79
|
+
|
|
80
|
+
- 0–180 days → **fresh**
|
|
81
|
+
- 181–365 days → **aging**
|
|
82
|
+
- 366–730 days → **stale**
|
|
83
|
+
- 731+ days → **archive-candidate** (further filtering in Step 5)
|
|
84
|
+
|
|
85
|
+
### Step 5 — Add traffic + orphan signals (archive-candidate filter)
|
|
86
|
+
|
|
87
|
+
For items in the archive-candidate bucket, we need to know if anyone is reading them or linking to them. Two signals:
|
|
88
|
+
|
|
89
|
+
1. **Internal link count.** Call `respira_find_element` with the page's URL as a search term. Count incoming internal links. If zero, the page is an orphan.
|
|
90
|
+
2. **External traffic** (if available — depends on whether the site has Plausible / GA4 / similar wired to Respira). If not available, skip.
|
|
91
|
+
|
|
92
|
+
Recompute:
|
|
93
|
+
|
|
94
|
+
- Archive-candidate + orphan + no traffic → **archive (or 410)**
|
|
95
|
+
- Archive-candidate + has internal links + no traffic → **archive + redirect** (preserve link equity)
|
|
96
|
+
- Archive-candidate + has traffic → **refresh** (downgrade from archive-candidate to stale)
|
|
97
|
+
|
|
98
|
+
### Step 6 — Output the report
|
|
99
|
+
|
|
100
|
+
```markdown
|
|
101
|
+
## Content age audit for {site_url}
|
|
102
|
+
|
|
103
|
+
Scanned {n_pages} pages + {n_posts} posts + {n_custom} custom posts ({n_total} total). Evergreen pages skipped: {n_evergreen}.
|
|
104
|
+
|
|
105
|
+
### Summary
|
|
106
|
+
|
|
107
|
+
| Bucket | Count | % |
|
|
108
|
+
|---|---|---|
|
|
109
|
+
| Fresh (<6mo) | {n_fresh} | {pct_fresh}% |
|
|
110
|
+
| Aging (6–12mo) | {n_aging} | {pct_aging}% |
|
|
111
|
+
| Stale (12–24mo) | {n_stale} | {pct_stale}% |
|
|
112
|
+
| Archive-candidate (24+mo) | {n_archive} | {pct_archive}% |
|
|
113
|
+
|
|
114
|
+
### Stale (12–24 months)
|
|
115
|
+
|
|
116
|
+
| Title | Last modified | Action |
|
|
117
|
+
|---|---|---|
|
|
118
|
+
| {title} | {modified} ({days_ago}d) | refresh |
|
|
119
|
+
| ... | | |
|
|
120
|
+
|
|
121
|
+
### Archive-candidate (24+ months)
|
|
122
|
+
|
|
123
|
+
| Title | Last modified | Internal links | Suggested action |
|
|
124
|
+
|---|---|---|---|
|
|
125
|
+
| {title} | {modified} ({days_ago}d) | {link_count} | {action} |
|
|
126
|
+
| ... | | | |
|
|
127
|
+
|
|
128
|
+
### What I'd refresh first (top 5 by traffic or link equity)
|
|
129
|
+
|
|
130
|
+
1. **{title}** ({days_ago}d old) — {one-line reason: high incoming link count / high traffic / topical relevance to current focus}
|
|
131
|
+
2. ...
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Step 7 — Offer to act on a chosen item
|
|
135
|
+
|
|
136
|
+
Ask: *"Want me to refresh one of these now? I can pull the existing content, suggest updates, create a duplicate with the refresh applied, and you review."*
|
|
137
|
+
|
|
138
|
+
If yes, route to the SEO & AEO Amplifier skill or directly compose `respira_create_page_duplicate` + targeted updates.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Hard rules
|
|
143
|
+
|
|
144
|
+
- **Never delete a page directly.** Even archive-candidates get a recommendation, not a deletion. The user decides. Use `respira_delete_page` only if the user explicitly asks for deletion of a specific named page.
|
|
145
|
+
- **The evergreen list is opinionated but overridable.** Output the list at the top of the report so the user can see what got skipped and add/remove items.
|
|
146
|
+
- **Don't conflate stale with bad.** A 2-year-old page that still has 1,000 monthly views is not a problem. The "refresh" recommendation is based on age, not quality.
|
|
147
|
+
- **Modified date is canonical.** Don't read `date` (published) as a staleness signal. A 2018 post updated last month is fresh.
|
|
148
|
+
- **Custom post types matter.** Case studies, podcast episodes, properties — these often need different staleness windows. If the user runs a podcast and the latest episode is 6 months old, that's stale for podcast content even though "fresh" for blog posts. Offer to set per-CPT windows on a v1.1 of this skill.
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Telemetry
|
|
153
|
+
|
|
154
|
+
Records: site URL hash, n_pages / n_posts / n_custom counted, bucket distribution, success/failure, total duration. No page titles, no URLs, no decisions sent.
|
|
155
|
+
|
|
156
|
+
Endpoint: `POST https://www.respira.press/api/skills/track-usage`
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Stale Content Detector",
|
|
3
|
+
"slug": "stale-content-detector",
|
|
4
|
+
"icon": "🕰️",
|
|
5
|
+
"category": "audit",
|
|
6
|
+
"description": "Find pages and posts that haven't been updated in a long time. Categorize as fresh / aging / stale / archive-candidate. Suggest refresh, redirect, or archive per item — based on age, traffic signal, and internal link count.",
|
|
7
|
+
"author": "Respira Team",
|
|
8
|
+
"author_url": "https://respira.press",
|
|
9
|
+
"trigger": "find old content",
|
|
10
|
+
"requires_respira": true,
|
|
11
|
+
"requires_woocommerce_addon": false,
|
|
12
|
+
"requires_accessibility_addon": false,
|
|
13
|
+
"is_read_only": true,
|
|
14
|
+
"is_duplicate_first": false,
|
|
15
|
+
"version": "1.0.0",
|
|
16
|
+
"last_updated": "2026-05-24",
|
|
17
|
+
"tools_used": [
|
|
18
|
+
"respira_get_active_site",
|
|
19
|
+
"respira_get_site_context",
|
|
20
|
+
"respira_list_pages",
|
|
21
|
+
"respira_list_posts",
|
|
22
|
+
"respira_list_post_types",
|
|
23
|
+
"respira_list_custom_posts",
|
|
24
|
+
"respira_find_element"
|
|
25
|
+
],
|
|
26
|
+
"detects": [
|
|
27
|
+
"modified_date",
|
|
28
|
+
"evergreen_pages",
|
|
29
|
+
"fresh_content",
|
|
30
|
+
"aging_content",
|
|
31
|
+
"stale_content",
|
|
32
|
+
"archive_candidate_content",
|
|
33
|
+
"orphan_pages",
|
|
34
|
+
"internal_link_count"
|
|
35
|
+
],
|
|
36
|
+
"generates": [
|
|
37
|
+
"staleness_bucket_distribution",
|
|
38
|
+
"stale_items_table",
|
|
39
|
+
"archive_candidates_table",
|
|
40
|
+
"refresh_priority_list",
|
|
41
|
+
"per_item_action_recommendation"
|
|
42
|
+
]
|
|
43
|
+
}
|