blog-taxonomy
主要CMSプラットフォームの記事に対し、キーワード頻度や意味解析に基づいたタグやカテゴリの抽出・提案・同期をAPI連携で行い、質の低いタグの生成を防ぎつつ、効率的なブログ記事の分類を支援するSkill。
📜 元の英語説明(参考)
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".
🇯🇵 日本人クリエイター向け解説
主要CMSプラットフォームの記事に対し、キーワード頻度や意味解析に基づいたタグやカテゴリの抽出・提案・同期をAPI連携で行い、質の低いタグの生成を防ぎつつ、効率的なブログ記事の分類を支援するSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o blog-taxonomy.zip https://jpskill.com/download/10534.zip && unzip -o blog-taxonomy.zip && rm blog-taxonomy.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/10534.zip -OutFile "$d\blog-taxonomy.zip"; Expand-Archive "$d\blog-taxonomy.zip" -DestinationPath $d -Force; ri "$d\blog-taxonomy.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
blog-taxonomy.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
blog-taxonomyフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
ブログのタクソノミー
CMSプラットフォーム全体で、タグ、カテゴリー、トピッククラスターを管理します。
コマンド
| コマンド | 目的 |
|---|---|
/blog taxonomy suggest <file> |
コンテンツからタグとカテゴリーの候補を抽出します |
/blog taxonomy sync <cms> |
認証されたAPI経由でタクソノミーをCMSにプッシュします |
/blog taxonomy audit [directory] |
希薄なタグ、孤立したタグ、タクソノミーの肥大化をチェックします |
タグの提案ワークフロー
ステップ1:コンテンツ構造の解析
ターゲットファイルを読み込み、以下を抽出します。
- すべてのH2およびH3見出し(主要なトピックシグナル)
- 太字およびイタリック体のフレーズ(強調シグナル)
- 既存のfrontmatterタグ/カテゴリー(存在する場合)
ステップ2:頻度分析
本文テキストをスキャンして、高頻度のフレーズを検出します。
- 1語の用語:最低4回出現(ストップワードを除く)
- 2語のフレーズ:最低3回出現
- 3語のフレーズ:最低2回出現
一般的な非タグ語(冠詞、前置詞、接続詞、代名詞)を除外します。
ステップ3:セマンティックグルーピング
関連する候補をクラスターにグループ化します。
- 単数形/複数形のバリアントをマージします(より一般的な形式を保持します)
- ハイフン付きとハイフンなしの形式をマージします
- 同義語を最も頻度の高い用語の下にグループ化します
ステップ4:重複排除とランキング
- スラッグ化された名前に対するファジーマッチング(Levenshtein距離 <= 2)
- 各候補をスコアリングします:
(frequency * 2) + (heading_presence * 5) + (emphasis * 1) - 上位5〜10個のランク付けされた提案を返します
出力形式
## タグの提案:[Post Title]
| ランク | タグ | スコア | ソース |
|------|-----|-------|--------|
| 1 | content-marketing | 18 | H2 + 6 mentions |
| 2 | seo-strategy | 14 | H3 + 4 mentions |
| 3 | keyword-research | 11 | 5 mentions + bold |
### 提案されたカテゴリー
- プライマリー:[best-fit category]
- セカンダリー:[optional second category]
CMSアダプター
アダプターの概要
| CMS | APIタイプ | 認証方法 | タグモデル |
|---|---|---|---|
| WordPress | REST | アプリケーションパスワード (base64) | IDを持つファーストクラスエンティティ |
| Shopify | GraphQL (Admin API) | Admin APIアクセストークン | Article上の文字列配列 |
| Ghost | REST (Admin API) | JWT署名付きAPIキー | ファーストクラスエンティティ |
| Strapi | RESTまたはGraphQL | APIトークン (Bearer) | ユーザー定義のコンテンツタイプ |
| Sanity | GROQ / Mutations | プロジェクトトークン (Bearer) | ドキュメントタイプ |
WordPressアダプター
タグのリスト:
GET {CMS_URL}/wp-json/wp/v2/tags?per_page=100&search={keyword}
Authorization: Basic {base64(username:app_password)}
タグの作成:
POST {CMS_URL}/wp-json/wp/v2/tags
Body: {"name": "Tag Name", "slug": "tag-name", "description": "Optional"}
カテゴリーのリスト(階層構造、親フィールドをサポート):
GET {CMS_URL}/wp-json/wp/v2/categories?per_page=100
カテゴリーの作成:
POST {CMS_URL}/wp-json/wp/v2/categories
Body: {"name": "Category", "slug": "category", "parent": 0}
投稿へのタグの割り当て:
POST {CMS_URL}/wp-json/wp/v2/posts/{id}
Body: {"tags": [1, 2, 3], "categories": [4]}
ページネーション:完全なリストについては、X-WP-TotalPagesヘッダーに従ってください。
Shopifyアダプター
Shopifyのタグは、Articleオブジェクト上の文字列配列であり、ファーストクラスエンティティではありません。
記事タグの更新 (GraphQL Admin API):
mutation {
articleUpdate(id: "gid://shopify/Article/123", article: {
tags: ["tag-one", "tag-two", "tag-three"]
}) {
article { id tags }
userErrors { field message }
}
}
使用中のすべてのタグのリスト (GraphQL):
{
articles(first: 250) {
edges {
node { id title tags }
}
}
}
認証ヘッダー:X-Shopify-Access-Token: {token}
注:REST APIは2024年10月にレガシーとマークされました。2025年4月以降、新しいアプリにはGraphQLが必要です。
Ghostアダプター
タグのリスト:
GET {CMS_URL}/ghost/api/admin/tags/?limit=all
Authorization: Ghost {jwt_token}
タグの作成:
POST {CMS_URL}/ghost/api/admin/tags/
Body: {"tags": [{"name": "Tag Name", "slug": "tag-name"}]}
JWTの生成:admin APIキー(id:secret形式)で署名、iat = 現在時刻、exp = 5分、audience = /admin/。
Strapiアダプター
エンドポイントはコンテンツタイプから自動生成されます。一般的な設定:
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}
Strapi v4+はdataラッパーを使用します。フィールド名については、コンテンツタイプのスキーマを確認してください。
Sanityアダプター
タグのクエリ (GROQ):
*[_type == "tag"] { _id, name, slug }
タグの作成 (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}
タクソノミー監査ワークフロー
ステップ1:インベントリ
ターゲットディレクトリ内のすべての投稿をスキャンします(またはCMSからフェッチします)。マップを作成します。
- tag_name -> [このタグを使用している投稿ファイル/IDのリスト]
- category_name -> [投稿ファイル/IDのリスト]
ステップ2:ヘルスチェック
| チェック | 閾値 | アクション |
|---|---|---|
| 希薄なタグアーカイブ | タグあたり< 5件の投稿 | noindexまたはマージを推奨 |
| 孤立したタグ | 0件の投稿 | 削除を推奨 |
| タグの肥大化 | > 50個の合計タグ | 統合を推奨 |
| カテゴリーの深さ | > 3レベル | フラット化を推奨 |
| 未分類の投稿 | カテゴリーが割り当てられていない | 適切なカテゴリーに割り当て |
| 重複するスラッグ | 同じスラッグ、異なる名前 | 正規バージョンにマージ |
ステップ3:推奨事項
調査結果を優先度別にグループ化します。
- クリティカル:空のアーカイブページを作成する孤立したタグ(クロール浪費)
- 高:< 3件の投稿しかない希薄なタグ(貧弱なユーザーエクスペリエンス、弱いSEOシグナル)
- 中:50を超えるタグの肥大化(希薄化されたタクソノミー、ナビゲートが困難)
- 低:命名の不整合(大文字小文字の混在、ハイフン対スペース)
出力形式
## タクソノミー監査:[Site/Directory]
**合計タグ数**: [n] | **合計カテゴリー数**: [n]
**健全**: [n] | **希薄**: [n] | **孤立**: [n]
### クリティカルな問題
- [孤立したタグのリスト]
### 推奨事項
1. [tag-a]と[tag-b]をマージします(同じトピック、[n]件の投稿を組み合わせます)
2. 孤立したタグを削除します:[l 📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
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 |
/blog taxonomy sync <cms> |
Push taxonomy to CMS via authenticated API |
/blog taxonomy audit [directory] |
Check for thin tags, orphan tags, taxonomy bloat |
Tag Suggestion Workflow
Step 1: Parse Content Structure
Read the target file and extract:
- All H2 and H3 headings (primary topic signals)
- Bold and italic phrases (emphasis signals)
- Existing frontmatter tags/categories if present
Step 2: Frequency Analysis
Scan the body text for high-frequency phrases:
- 1-word terms: minimum 4 occurrences (excluding stop words)
- 2-word phrases: minimum 3 occurrences
- 3-word phrases: minimum 2 occurrences
Exclude common non-tag words: articles, prepositions, conjunctions, pronouns.
Step 3: Semantic Grouping
Group related candidates into clusters:
- Merge singular/plural variants (keep the more common form)
- Merge hyphenated and non-hyphenated forms
- Group synonyms under the highest-frequency term
Step 4: Deduplicate and Rank
- Fuzzy match on slugified names (Levenshtein distance <= 2)
- Score each candidate:
(frequency * 2) + (heading_presence * 5) + (emphasis * 1) - Return top 5-10 ranked suggestions
Output Format
## 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 Adapters
Adapter Overview
| 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 |
WordPress Adapter
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"}
List categories (hierarchical, supports parent field):
GET {CMS_URL}/wp-json/wp/v2/categories?per_page=100
Create category:
POST {CMS_URL}/wp-json/wp/v2/categories
Body: {"name": "Category", "slug": "category", "parent": 0}
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.
Shopify Adapter
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 }
}
}
List all tags in use (GraphQL):
{
articles(first: 250) {
edges {
node { id title tags }
}
}
}
Auth header: X-Shopify-Access-Token: {token}
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}
Strapi v4+ uses the data wrapper. Check your content type schema for field names.
Sanity Adapter
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}
Taxonomy Audit Workflow
Step 1: Inventory
Scan all posts in the target directory (or fetch from CMS). Build a map:
- tag_name -> [list of post files/IDs using this tag]
- category_name -> [list of post files/IDs]
Step 2: Health Checks
| 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 |
Step 3: Recommendations
Group findings by priority:
- Critical: orphan tags creating empty archive pages (crawl waste)
- High: thin tags with < 3 posts (poor user experience, weak SEO signal)
- Medium: tag bloat over 50 (diluted taxonomy, harder to navigate)
- Low: naming inconsistencies (mixed case, hyphen vs space)
Output Format
## 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
Site-Wide Guidelines
- Aim for 5-10 main categories per site (broad topics)
- Tags should have at least 5 posts before creating an archive page
- Use consistent slug format: lowercase, hyphen-separated
- Every post needs exactly 1 primary category
- Tags per post: 3-8 recommended, never exceed 15
Environment Variables
| 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.
Error Handling
- Missing environment variables: If CMS_TYPE, CMS_URL, or CMS_API_KEY is unset, report which variable is missing and provide the expected format
- Invalid credentials: If the CMS API returns 401/403, report "Authentication failed - check 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, wait 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