Download brain/.raw/sources/claude-blog-skill/skills/blog-taxonomy/SKILL.md from the publisher, or copy the path and open the repository. PlugMCP lists the skill and does not host the file.
Where does blog-taxonomy live?
The publisher keeps it at https://github.com/AgriciDaniel/claude-blog.
Which agents can use blog-taxonomy?
Claude, Cursor, and Codex can read a SKILL.md you add from the publisher's repository.
>
name: blog-taxonomy
description: >
Extract, suggest, and sync tags and categories for blog posts across all major
CMS platforms. Supports WordPress REST API, Shopify GraphQL, Ghost Content API,
Strapi REST/GraphQL, and Sanity GROQ. Generates tag suggestions from content
analysis (keyword frequency, heading extraction, semantic grouping), enforces
minimum post-count thresholds to prevent thin tag archives, and syncs taxonomy
via authenticated API calls. Use when user says "tags", "categories", "taxonomy",
"tag suggestions", "sync tags", "WordPress tags", "Shopify tags".
user-invokable: true
argument-hint: "[suggest|sync|audit] [file-or-cms]"
license: MIT
Blog Taxonomy
Manage tags, categories, and topic clusters across CMS platforms.
Commands
Command
Purpose
/blog taxonomy suggest <file>
Extract candidate tags and categories from content
Pagination: loop while pageInfo.hasNextPage is true, passing endCursor as
the next $cursor.
Note: REST API marked legacy Oct 2024. GraphQL required for new apps since Apr 2025.
Ghost Adapter
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/.
Strapi Adapter
Endpoint auto-generated from content types. Typical setup:
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}
Pagination: increment pagination[page] until all pages are exhausted.
Strapi v4 responses use the data wrapper with attributes; Strapi v5 uses
a flatter response shape. Detect the version or normalize both shapes before
deduplication. Check your content type schema for field names.
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,
$CMS_USERNAME, $CMS_API_KEY, and optional platform-specific variables at runtime.
Security rule for CMS calls: require HTTPS, allow only http and https
parsing paths but send authenticated requests over HTTPS only, resolve DNS and
block loopback/private/link-local/reserved IPs, validate redirects with the same
checks or disable redirects, cap timeouts at 10 seconds, and enforce
CMS_ALLOWED_HOSTS when set.
Error Handling
Missing environment variables: If CMS_TYPE, CMS_URL, or CMS_API_KEY is unset, or if WordPress lacks CMS_USERNAME, report which variable is missing and provide the expected format
Invalid credentials: If the CMS API returns 401/403, report "Authentication failed - check CMS_USERNAME/CMS_API_KEY" and do not retry
Connection timeouts: If the CMS endpoint is unreachable after 10 seconds, report the timeout and suggest checking CMS_URL
Duplicate tag slugs: If a tag already exists on the CMS, skip creation and note "Tag already exists: [name]"
Rate limits: If the CMS API returns 429, honor Retry-After when present; otherwise use exponential backoff and retry once. Report if the limit persists
Unsupported CMS: If CMS_TYPE is not one of the 5 supported platforms, list the valid options and exit
How do I install blog-taxonomy?
Download brain/.raw/sources/claude-blog-skill/skills/blog-taxonomy/SKILL.md from the publisher, or copy the path and open the repository. PlugMCP lists the skill and does not host the file.
Where does blog-taxonomy live?
The publisher keeps it at https://github.com/AgriciDaniel/claude-blog.
Which agents can use blog-taxonomy?
Claude, Cursor, and Codex can read a SKILL.md you add from the publisher's repository.