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本体の挙動とは独立した参考情報です。
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
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
$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. 下の青いボタンを押して
strapi.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
strapiフォルダができる - 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 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
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 サーバーでセルフホスト
ベストプラクティス
- ユーザー認証情報よりも API トークン — フロントエンド用に読み取り専用の API トークンを作成します。管理者の認証情報を公開しないでください。
- 選択的にポピュレート — 必要なリレーションのみを含めるには、
populateパラメータを使用します。本番環境ではpopulate=*を避けてください。 - 再検証のための Webhook — コンテンツの変更時に Next.js ISR の再検証をトリガーするように Strapi の Webhook を構成します。
- 再利用のためのコンポーネント — 共有コンポーネント (SEO, Hero, CTA) を作成し、コンテンツタイプ全体で再利用します。
- 下書き/公開ワークフロー — 下書きシステムを有効にします。編集者は下書きを作成し、準備ができたら公開します。API はデフォルトで公開されたもののみを返します。
- メディアライブラリ — 本番環境の画像ホスティングには、クラウドプロバイダー (AWS S3, Cloudinary) とともに Strapi のメディアライブラリを使用します。
- RBAC — 詳細な権限を持つロール (Author, Editor, Admin) を設定します。作成者は自分のコンテンツのみを編集できます。
- ライフサイクルフック — カスタムロジック (slug の自動生成、通知の送信) には、
beforeCreate、afterUpdateフックを使用します。
📜 原文 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
- API tokens over user credentials — Create read-only API tokens for frontend; never expose admin credentials
- Populate selectively — Use
populateparameter to include only needed relations; avoidpopulate=*in production - Webhooks for revalidation — Configure Strapi webhooks to trigger Next.js ISR revalidation on content change
- Components for reuse — Create shared components (SEO, Hero, CTA) and reuse across content types
- Draft/Publish workflow — Enable draft system; editors work on drafts, publish when ready; API only returns published by default
- Media library — Use Strapi's media library with cloud providers (AWS S3, Cloudinary) for production image hosting
- RBAC — Set up roles (Author, Editor, Admin) with granular permissions; authors can only edit their own content
- Lifecycle hooks — Use
beforeCreate,afterUpdatehooks for custom logic (auto-generate slugs, send notifications)