From smart-blog-skills
Extracts, suggests, and syncs tags/categories for blog posts across WordPress, Shopify, Ghost, Strapi, and Sanity CMS platforms. Includes content analysis for tag suggestions and taxonomy auditing.
How this skill is triggered — by the user, by Claude, or both
Slash command
/smart-blog-skills:taxonomy [suggest|sync|audit] [file-or-cms][suggest|sync|audit] [file-or-cms]The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Manage tags, categories, and topic clusters across CMS platforms.
Manage tags, categories, and topic clusters across CMS platforms.
| Command | Purpose |
|---|---|
/smart-blog-skills:taxonomy suggest <file> | Extract candidate tags and categories from content |
/smart-blog-skills:taxonomy sync <cms> | Push taxonomy to CMS via authenticated API |
/smart-blog-skills:taxonomy audit [directory] | Check for thin tags, orphan tags, taxonomy bloat |
Read the target file and extract:
Scan the body text for high-frequency phrases:
Exclude common non-tag words: articles, prepositions, conjunctions, pronouns.
Group related candidates into clusters:
(frequency * 2) + (heading_presence * 5) + (emphasis * 1)## Tag Suggestions: [Post Title]
| Rank | Tag | Score | Source |
|------|-----|-------|--------|
| 1 | content-marketing | 18 | H2 + 6 mentions |
| 2 | seo-strategy | 14 | H3 + 4 mentions |
| 3 | keyword-research | 11 | 5 mentions + bold |
### Suggested Categories
- Primary: [best-fit category]
- Secondary: [optional second category]
| CMS | API Type | Auth Method | Tags Model |
|---|---|---|---|
| WordPress | REST | Application Passwords (base64) | First-class entities with IDs |
| Shopify | GraphQL (Admin API) | Admin API access token | String array on Article |
| Ghost | REST (Admin API) | API key with JWT signing | First-class entities |
| Strapi | REST or GraphQL | API token (Bearer) | User-defined content type |
| Sanity | GROQ / Mutations | Project token (Bearer) | Document type |
List tags:
GET {CMS_URL}/wp-json/wp/v2/tags?per_page=100&search={keyword}
Authorization: Basic {base64(username:app_password)}
Create tag:
POST {CMS_URL}/wp-json/wp/v2/tags
Body: {"name": "Tag Name", "slug": "tag-name", "description": "Optional"}
Assign tags to post:
POST {CMS_URL}/wp-json/wp/v2/posts/{id}
Body: {"tags": [1, 2, 3], "categories": [4]}
Pagination: follow X-WP-TotalPages header for full listing.
Tags on Shopify are string arrays on the Article object, not first-class entities.
Update article tags (GraphQL Admin API):
mutation {
articleUpdate(id: "gid://shopify/Article/123", article: {
tags: ["tag-one", "tag-two", "tag-three"]
}) {
article { id tags }
userErrors { field message }
}
}
Auth header: X-Shopify-Access-Token: {token}
Note: REST API marked legacy Oct 2024. GraphQL required for new apps since Apr 2025.
List tags:
GET {CMS_URL}/ghost/api/admin/tags/?limit=all
Authorization: Ghost {jwt_token}
Create tag:
POST {CMS_URL}/ghost/api/admin/tags/
Body: {"tags": [{"name": "Tag Name", "slug": "tag-name"}]}
JWT generation: sign with admin API key (id:secret format), iat = now, exp = 5 min,
audience = /admin/.
GET {CMS_URL}/api/tags?pagination[pageSize]=100
POST {CMS_URL}/api/tags
Body: {"data": {"name": "Tag Name", "slug": "tag-name"}}
Authorization: Bearer {api_token}
Query tags (GROQ):
*[_type == "tag"] { _id, name, slug }
Create tag (Mutations API):
POST https://{project_id}.api.sanity.io/v2024-01-01/data/mutate/{dataset}
Body: {"mutations": [{"create": {"_type": "tag", "name": "Tag", "slug": {"current": "tag"}}}]}
Authorization: Bearer {token}
Scan all posts in the target directory (or fetch from CMS). Build a map:
| Check | Threshold | Action |
|---|---|---|
| Thin tag archives | < 5 posts per tag | Recommend noindex or merge |
| Orphan tags | 0 posts | Recommend deletion |
| Tag bloat | > 50 total tags | Recommend consolidation |
| Category depth | > 3 levels | Recommend flattening |
| Uncategorized posts | No category assigned | Assign to appropriate category |
| Duplicate slugs | Same slug, different name | Merge into canonical version |
Group findings by priority:
## Taxonomy Audit: [Site/Directory]
**Total tags**: [n] | **Total categories**: [n]
**Healthy**: [n] | **Thin**: [n] | **Orphan**: [n]
### Critical Issues
- [orphan tags list]
### Recommendations
1. Merge [tag-a] and [tag-b] (same topic, [n] combined posts)
2. Delete orphan tags: [list]
3. Add noindex to tag archives with < 5 posts
| Variable | Purpose | Example |
|---|---|---|
| CMS_TYPE | Platform identifier | wordpress, shopify, ghost, strapi, sanity |
| CMS_URL | Base URL of the CMS | https://example.com |
| CMS_API_KEY | Authentication credential | Application password, API token, or key |
These must be set in the shell environment. Never store credentials in files or
commit them to version control. The skill reads them via $CMS_TYPE, $CMS_URL,
and $CMS_API_KEY at runtime.
npx claudepluginhub rainday/smart-blog-skills --plugin smart-blog-skillsExtracts, suggests, and syncs tags/categories across WordPress, Shopify, Ghost, Strapi, Sanity with content analysis.
Publishes blog posts to WordPress or Webflow with SEO metadata, categories, scheduling, and pre-publish quality checks.
This skill should be used when the user wants to interact with a Ghost blog via its Content and Admin APIs. Relevant when the user says things like 'list my blog posts', 'create a new draft', 'publish my draft', 'schedule a post for tomorrow', 'upload an image to my blog', 'manage blog tags', 'show my Ghost site info', 'filter posts by tag', 'delete a post', 'list members', 'send a newsletter', or any Ghost blog management task involving posts, pages, tags, members, newsletters, tiers, or images.