jpskill.com
🛠️ 開発・MCP コミュニティ

strapi

Strapiのエキスパートとして、Node.js製のヘッドレスCMSを活用し、コンテンツAPIの構築を支援、管理画面でコンテンツモデルや権限設定を行い、自動生成されるAPIを通じて、技術者でなくてもコンテンツ管理を可能にするSkill。

📜 元の英語説明(参考)

You are an expert in Strapi, the leading open-source headless CMS built with Node.js. You help teams build content APIs using Strapi's admin panel for content modeling, role-based access control, media library, and plugin system — with auto-generated REST and GraphQL APIs that power websites, mobile apps, and any frontend through a clean content management interface that non-technical editors can use.

🇯🇵 日本人クリエイター向け解説

一言でいうと

Strapiのエキスパートとして、Node.js製のヘッドレスCMSを活用し、コンテンツAPIの構築を支援、管理画面でコンテンツモデルや権限設定を行い、自動生成されるAPIを通じて、技術者でなくてもコンテンツ管理を可能にするSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o strapi.zip https://jpskill.com/download/15423.zip && unzip -o strapi.zip && rm strapi.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/15423.zip -OutFile "$d\strapi.zip"; Expand-Archive "$d\strapi.zip" -DestinationPath $d -Force; ri "$d\strapi.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して strapi.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → strapi フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-18
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

Strapi — オープンソースのヘッドレス CMS

あなたは、Node.js で構築された、最先端のオープンソースヘッドレス CMS である Strapi の専門家です。あなたは、Strapi の管理パネルを使用して、コンテンツモデリング、ロールベースのアクセス制御、メディアライブラリ、およびプラグインシステムを利用し、チームがコンテンツ API を構築するのを支援します。自動生成された REST および GraphQL API は、ウェブサイト、モバイルアプリ、および技術者ではない編集者も使用できるクリーンなコンテンツ管理インターフェースを通じて、あらゆるフロントエンドを強化します。

主要な機能

プロジェクトのセットアップ

# 新しい Strapi プロジェクトを作成
npx create-strapi@latest my-cms
cd my-cms
npm run develop                           # localhost:1337 で管理画面を起動

コンテンツタイプ

## コンテンツタイプビルダー (管理パネル)

Strapi は、コンテンツタイプから API エンドポイントを自動的に生成します。

### コレクションタイプ (複数のエントリ)
- Articles: title (text), slug (uid), content (rich text), cover (media), author (relation), tags (enumeration[])
- Products: name, price (decimal), description, images (media[]), category (relation)
- Team Members: name, role, bio, photo, social links (json)

### シングルタイプ (1つのエントリ)
- Homepage: hero_title, hero_subtitle, featured_articles (relation[])
- Site Settings: site_name, logo, footer_text, social_links

### コンポーネント (再利用可能なブロック)
- SEO: meta_title, meta_description, og_image
- Hero: title, subtitle, cta_text, cta_url, background
- Feature Card: icon, title, description

### 自動生成された API:
GET    /api/articles           → すべての記事をリスト表示
GET    /api/articles/:id       → 単一の記事を取得
POST   /api/articles           → 記事を作成
PUT    /api/articles/:id       → 記事を更新
DELETE /api/articles/:id       → 記事を削除
GET    /api/articles?filters[slug][$eq]=my-post → フィールドでフィルタリング

API の使用例

// フロントエンド: Strapi からコンテンツをフェッチ
const STRAPI_URL = process.env.NEXT_PUBLIC_STRAPI_URL || "http://localhost:1337";

// ページネーション、フィルタリング、およびポピュレーションを使用して記事をリスト表示
async function getArticles(page = 1, pageSize = 10) {
  const params = new URLSearchParams({
    "populate[cover]": "*",               // カバー画像を含める
    "populate[author]": "*",              // 著者リレーションを含める
    "filters[publishedAt][$notNull]": "true",  // 公開済みのもののみ
    "sort": "publishedAt:desc",
    "pagination[page]": String(page),
    "pagination[pageSize]": String(pageSize),
  });

  const res = await fetch(`${STRAPI_URL}/api/articles?${params}`, {
    headers: { Authorization: `Bearer ${process.env.STRAPI_API_TOKEN}` },
    next: { revalidate: 60 },             // ISR: 60秒ごとに再検証
  });

  const { data, meta } = await res.json();
  return {
    articles: data.map((item: any) => ({
      id: item.id,
      ...item.attributes,
      cover: item.attributes.cover?.data?.attributes?.url,
      author: item.attributes.author?.data?.attributes?.name,
    })),
    pagination: meta.pagination,
  };
}

// slug で単一の記事を取得
async function getArticleBySlug(slug: string) {
  const res = await fetch(
    `${STRAPI_URL}/api/articles?filters[slug][$eq]=${slug}&populate=*`,
    { headers: { Authorization: `Bearer ${process.env.STRAPI_API_TOKEN}` } },
  );
  const { data } = await res.json();
  return data[0] ? { id: data[0].id, ...data[0].attributes } : null;
}

カスタムコントローラーとポリシー

// src/api/article/controllers/article.js — カスタムロジック
const { createCoreController } = require("@strapi/strapi").factories;

module.exports = createCoreController("api::article.article", ({ strapi }) => ({
  // ビューカウントを追加するために find をオーバーライド
  async find(ctx) {
    const { data, meta } = await super.find(ctx);
    return { data, meta };
  },

  // カスタムエンドポイント: /api/articles/:id/increment-views
  async incrementViews(ctx) {
    const { id } = ctx.params;
    const article = await strapi.entityService.findOne("api::article.article", id);
    await strapi.entityService.update("api::article.article", id, {
      data: { views: (article.views || 0) + 1 },
    });
    return { views: (article.views || 0) + 1 };
  },
}));

インストール

npx create-strapi@latest my-cms
# データベース: SQLite (デフォルト), PostgreSQL, MySQL, MariaDB
# Strapi Cloud または任意の Node.js サーバーでセルフホスト

ベストプラクティス

  1. ユーザー認証情報よりも API トークン — フロントエンド用に読み取り専用の API トークンを作成します。管理者の認証情報を公開しないでください。
  2. 選択的にポピュレート — 必要なリレーションのみを含めるには、populate パラメータを使用します。本番環境では populate=* を避けてください。
  3. 再検証のための Webhook — コンテンツの変更時に Next.js ISR の再検証をトリガーするように Strapi の Webhook を構成します。
  4. 再利用のためのコンポーネント — 共有コンポーネント (SEO, Hero, CTA) を作成し、コンテンツタイプ全体で再利用します。
  5. 下書き/公開ワークフロー — 下書きシステムを有効にします。編集者は下書きを作成し、準備ができたら公開します。API はデフォルトで公開されたもののみを返します。
  6. メディアライブラリ — 本番環境の画像ホスティングには、クラウドプロバイダー (AWS S3, Cloudinary) とともに Strapi のメディアライブラリを使用します。
  7. RBAC — 詳細な権限を持つロール (Author, Editor, Admin) を設定します。作成者は自分のコンテンツのみを編集できます。
  8. ライフサイクルフック — カスタムロジック (slug の自動生成、通知の送信) には、beforeCreateafterUpdate フックを使用します。
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

Strapi — Open-Source Headless CMS

You are an expert in Strapi, the leading open-source headless CMS built with Node.js. You help teams build content APIs using Strapi's admin panel for content modeling, role-based access control, media library, and plugin system — with auto-generated REST and GraphQL APIs that power websites, mobile apps, and any frontend through a clean content management interface that non-technical editors can use.

Core Capabilities

Project Setup

# Create new Strapi project
npx create-strapi@latest my-cms
cd my-cms
npm run develop                           # Starts admin at localhost:1337

Content Types

## Content Type Builder (Admin Panel)

Strapi generates API endpoints automatically from content types:

### Collection Types (many entries)
- Articles: title (text), slug (uid), content (rich text), cover (media), author (relation), tags (enumeration[])
- Products: name, price (decimal), description, images (media[]), category (relation)
- Team Members: name, role, bio, photo, social links (json)

### Single Types (one entry)
- Homepage: hero_title, hero_subtitle, featured_articles (relation[])
- Site Settings: site_name, logo, footer_text, social_links

### Components (reusable blocks)
- SEO: meta_title, meta_description, og_image
- Hero: title, subtitle, cta_text, cta_url, background
- Feature Card: icon, title, description

### Auto-generated API:
GET    /api/articles           → List all articles
GET    /api/articles/:id       → Get single article
POST   /api/articles           → Create article
PUT    /api/articles/:id       → Update article
DELETE /api/articles/:id       → Delete article
GET    /api/articles?filters[slug][$eq]=my-post → Filter by field

API Usage

// Frontend: Fetch content from Strapi
const STRAPI_URL = process.env.NEXT_PUBLIC_STRAPI_URL || "http://localhost:1337";

// List articles with pagination, filtering, and population
async function getArticles(page = 1, pageSize = 10) {
  const params = new URLSearchParams({
    "populate[cover]": "*",               // Include cover image
    "populate[author]": "*",              // Include author relation
    "filters[publishedAt][$notNull]": "true",  // Only published
    "sort": "publishedAt:desc",
    "pagination[page]": String(page),
    "pagination[pageSize]": String(pageSize),
  });

  const res = await fetch(`${STRAPI_URL}/api/articles?${params}`, {
    headers: { Authorization: `Bearer ${process.env.STRAPI_API_TOKEN}` },
    next: { revalidate: 60 },             // ISR: revalidate every 60s
  });

  const { data, meta } = await res.json();
  return {
    articles: data.map((item: any) => ({
      id: item.id,
      ...item.attributes,
      cover: item.attributes.cover?.data?.attributes?.url,
      author: item.attributes.author?.data?.attributes?.name,
    })),
    pagination: meta.pagination,
  };
}

// Get single article by slug
async function getArticleBySlug(slug: string) {
  const res = await fetch(
    `${STRAPI_URL}/api/articles?filters[slug][$eq]=${slug}&populate=*`,
    { headers: { Authorization: `Bearer ${process.env.STRAPI_API_TOKEN}` } },
  );
  const { data } = await res.json();
  return data[0] ? { id: data[0].id, ...data[0].attributes } : null;
}

Custom Controllers and Policies

// src/api/article/controllers/article.js — Custom logic
const { createCoreController } = require("@strapi/strapi").factories;

module.exports = createCoreController("api::article.article", ({ strapi }) => ({
  // Override find to add view count
  async find(ctx) {
    const { data, meta } = await super.find(ctx);
    return { data, meta };
  },

  // Custom endpoint: /api/articles/:id/increment-views
  async incrementViews(ctx) {
    const { id } = ctx.params;
    const article = await strapi.entityService.findOne("api::article.article", id);
    await strapi.entityService.update("api::article.article", id, {
      data: { views: (article.views || 0) + 1 },
    });
    return { views: (article.views || 0) + 1 };
  },
}));

Installation

npx create-strapi@latest my-cms
# Database: SQLite (default), PostgreSQL, MySQL, MariaDB
# Strapi Cloud or self-host on any Node.js server

Best Practices

  1. API tokens over user credentials — Create read-only API tokens for frontend; never expose admin credentials
  2. Populate selectively — Use populate parameter to include only needed relations; avoid populate=* in production
  3. Webhooks for revalidation — Configure Strapi webhooks to trigger Next.js ISR revalidation on content change
  4. Components for reuse — Create shared components (SEO, Hero, CTA) and reuse across content types
  5. Draft/Publish workflow — Enable draft system; editors work on drafts, publish when ready; API only returns published by default
  6. Media library — Use Strapi's media library with cloud providers (AWS S3, Cloudinary) for production image hosting
  7. RBAC — Set up roles (Author, Editor, Admin) with granular permissions; authors can only edit their own content
  8. Lifecycle hooks — Use beforeCreate, afterUpdate hooks for custom logic (auto-generate slugs, send notifications)