mcpField
K
kuroco-frontend-integration

kuroco-frontend-integration

github.com/diverta开发073 次安装7 周前更新
代码仓库

关于 kuroco-frontend-integration

kuroco-frontend-integration 是将 Kuroco HeadlessCMS 与前端框架集成并选择部署方案的技能,适合构建 Kuroco 前端的开发者。它涵盖 Nuxt.js、Next.js 和 KurocoFront 的模式,并说明认证、托管限制及部署核验。

主要功能

  1. 01Nuxt.js 和 Next.js 集成指引
  2. 02部署方案选择指引
  3. 03KurocoFront 静态托管模式
  4. 04认证与 API 配置指引
  5. 05渲染和托管限制检查
  6. 06部署核验步骤

适用场景

  1. 01构建由 Kuroco 支持的前端
  2. 02选择静态生成或服务器渲染
  3. 03实现会员认证
  4. 04核验 KurocoFront 部署

MCP 相关

技能介绍通过 Admin MCP 部署的流程,包括创建临时上传 URL、部署和检查历史记录;文档未说明该技能本身是 MCP 服务。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/diverta/kuroco-skills --skill kuroco-frontend-integration

安装后在 Claude Code 中输入/kuroco-frontend-integration确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

agents/
openai.yaml
references/
design-defaults.md
kuroco-front.md
nextjs.md
nuxt.md
other-hosting.md

详细介绍

来自项目 README

Kuroco フロントエンド統合パターン

Kuroco HeadlessCMSとVite/Nuxt.js/Next.jsなどのフロントエンドフレームワークの統合パターン、および公開先の決定とデプロイ。

ドキュメント参照: /kuroco-docs スキルを使用してKuroco公式ドキュメントを検索・参照できます。

チュートリアル: フロントエンドのデプロイ手順やサンプルサイトの構築方法は Kurocoサンプルサイトチュートリアル を参照してください。

目次

画面設計とデザインの実装

画面を新規実装・変更するときは、実装前に デザインの既定ルール を読み、適用する。既存画面の修正では、対象に関係する判断だけを見直す。

Kurocoとフロントの管理分担

編集者が更新する本文・画像はKuroco、色・余白・配置はフロントで管理する。編集者が表示方法を選ぶ場合は、意味のある選択値をKurocoに持たせ、フロントの表示ルールに対応付ける。

実画面の確認

対象デバイスで表示・操作し、主要な情報と操作、長文・多件数・画像欠損、読み込み中・空・失敗の状態を確認する。崩れの原因に応じてレイアウト・共通部品・データの対応付けを修正し、同じ部品を使う画面も再確認する。画面を確認できなかった範囲は未検証として残す。

公開先の決定

既定はKurocoFront。 ユーザーからの指定がない限り、質問せずKurocoFrontで進める。

状況動作
SSR / ISR が必要KurocoFrontは静的コンテンツホスティング(CDN)でサーバー実行ができないため動かない。Vercel等を提案する。ただし提案の前に下の「SSR/ISRが本当に必要か」で切り分ける
新規構築(指定なし)KurocoFrontで進める。公開先を選ばせる質問はしない
ユーザーがVercel / Netlify / Codex Sites / v0 / Lovable などを指定その公開先で進める。実装前に references/other-hosting.md の確認軸を埋める。Codex Sitesの場合は下の実行環境の制約を先に伝える
Codexで実行中の新規構築KurocoFrontを既定としつつ、Codex Sitesという選択肢があることを一度だけ提示してよい。指定が返らなければKurocoFrontで進める
ChatGPTの通常チャットで実行中Codex Sitesは提示しない(下の実行環境の制約)。KurocoFrontで進める
既存サイトの変更現在の公開先を維持する。明示的な移行依頼があったときだけ選び直す
実行環境の制約(Codex Sites)

Codex Sites(chatgpt.site)は ChatGPT の通常チャットからは操作できない。 サイトの作成・更新は Work モード(ChatGPTのワークスペース)または Codex での実行が前提になる。

通常チャットで Kuroco の構築を進めていて Codex Sites を使いたい場合は、この制約を伝えたうえで Work モードか Codex で作業することを推奨する。切り替えないなら KurocoFront で進める。

SSR/ISRが本当に必要かの切り分け

「SSR/ISRが要る」という要望の動機はたいていSEOかOGPで、その多くはSSGで足りる。 安易にVercelへ出すと運用先が分散するため、動機で判定する。

動機結論
検索流入・各ページのOGPSSG(KurocoFront) で足りる。SPAは各ページ個別のOGPを持てないのでSSGにする
ページ数が多くSSGのビルドが現実的に回らない/更新頻度が高くビルド待ちが許容できないSSR / ISR → Vercel等。KurocoFrontでは実現できない
会員制・認証必須の画面SPA(KurocoFront)。SSR/ISRにしても利点が出ない(下記)
公開ページ(OGP要)と会員ページが混在公開側SSG+会員側SPAの混在構成。公開先はKurocoFrontのままでよい

会員制サイトをSSR/ISRにしない理由: サーバー側fetchにはブラウザのセッションCookieが乗らないため、 認証付きコンテンツはどのみちクライアント側fetchで取ることになる。SSRにしてもサーバーレンダリングの 利点(初期表示のHTMLに中身が入る・OGP)が認証領域では得られず、構成だけが複雑になる。 会員制はSPAに寄せて認証をクライアント側に閉じる方が分離が効く。

フレームワーク・認証・CORS・XSS対策の実装パターンは公開先によらず共通(以下のセクション)。 公開先ごとに違うのは設定と公開手順だけなので、選んだ側のreferenceだけを読む。

サポートフレームワーク

フレームワークバージョン推奨ユースケースKurocoFrontでの配信
Vite + Vue 3Vue 3系シンプルなSPA(SEO不要のアプリ・ツール類)。最小構成で認証が素直vite build → dist/ をそのまま
Nuxt.js 3.xVue 3系SEOが必要なコンテンツサイト(SSGで静的HTML生成、推奨)nuxt generate(SSG)。nuxt build のSSRは不可
Nuxt.js 2.xVue 2系既存プロジェクトnuxt generate(SSG)
Next.js 13+React (App Router)新規Reactプロジェクトoutput: 'export' の静的エクスポートのみ(下記の制約)
Next.js (Pages)React (Pages Router)既存Reactプロジェクトoutput: 'export' の静的エクスポートのみ

KurocoFrontは静的コンテンツホスティング(CDN)なので、サーバー実行を伴う構成は動かない。 SSR / ISR が必要な場合は公開先の決定へ戻る。

Next.js を KurocoFront で配信する場合の制約

next.config.js に output: 'export' を設定し、out/ を配信する。 Next.js 16 時点で静的エクスポートでは以下が使えない(公式ドキュメント)。

使えない機能Kuroco構成での対処
cookies()認証はクライアント側で行う。Cookie認証も動的アクセストークンもブラウザから直接Kuroco APIを呼ぶ
Server Actionsフォーム送信はクライアントからKuroco APIへ直接POSTする
next.config の Rewrites / Redirects / Headerskuroco_front.json の rewrites / redirects で設定する(references/kuroco-front.md)
ISR、Draft Mode、Intercepting Routes、Proxy代替なし。必要ならVercel等に公開先を変える
Request に依存する Route Handler静的化するなら export const dynamic = 'force-static'(GETのみ)。動的な読み取りが要るならKuroco API側で処理する
dynamicParams: true / generateStaticParams() なしの動的ルートビルド時に generateStaticParams() で全パスを列挙する。列挙できない量ならSPAに寄せる
next/image のデフォルトloaderカスタムloaderを指定するか、Kuroco Filesの画像URLを直接使う

環境設定

環境変数
# .env.local
NUXT_PUBLIC_API_BASE=https://example.g.kuroco.app
NEXT_PUBLIC_API_BASE=https://example.g.kuroco.app
API_ID=1
プロジェクト構成

Nuxt.js:

pages/
├── news/
│   ├── index.vue      # 一覧
│   └── [slug].vue     # 詳細 (Nuxt3)
├── login.vue
└── profile.vue
composables/
├── useAuth.ts
└── useApi.ts

Next.js (App Router):

app/
├── news/
│   ├── page.tsx       # 一覧
│   └── [slug]/page.tsx
├── login/page.tsx
└── profile/page.tsx
lib/
├── auth.ts
└── api.ts

API設定の前提条件

1. セキュリティ設定(Cookie認証)
  1. 管理画面 → API → セキュリティ → Cookieを選択
  2. フロントエンドとAPIドメインをサブドメイン違いに設定
    • 例: www.example.com と api.example.com
2. CORS設定

管理画面: [API] → [セキュリティ] → [CORS設定]

CORS_ALLOW_ORIGINS:
  - http://localhost:3000
  - https://your-frontend-domain.com

CORS_ALLOW_CREDENTIALS: true

CORS_ALLOW_METHODS:
  - GET
  - POST

認証実装

ログイン
interface LoginResponse {
  grant_token: string
  status: number
  member_id: number
}

async function login(email: string, password: string): Promise<LoginResponse> {
  const response = await fetch(
    'https://example.g.kuroco.app/rcms-api/1/login',
    {
      method: 'POST',
      credentials: 'include',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ email, password })
    }
  )

  if (!response.ok) {
    const error = await response.json()
    throw new Error(error.errors?.[0]?.message || 'ログインに失敗しました')
  }

  return response.json()
}
ログアウト
async function logout(): Promise<void> {
  await fetch('https://example.g.kuroco.app/rcms-api/1/logout', {
    method: 'POST',
    credentials: 'include'
  })
}
ログイン状態の確認
async function checkAuth(): Promise<ProfileResponse | null> {
  try {
    const response = await fetch(
      'https://example.g.kuroco.app/rcms-api/1/profile',
      { credentials: 'include' }
    )
    if (!response.ok) return null
    return response.json()
  } catch {
    return null
  }
}
会員登録
async function signup(memberData: SignupData): Promise<void> {
  const response = await fetch(
    'https://example.g.kuroco.app/rcms-api/1/member/insert',
    {
      method: 'POST',
      credentials: 'include',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(memberData)
    }
  )

  if (!response.ok) {
    const error = await response.json()
    throw new Error(error.errors?.[0]?.message || '登録に失敗しました')
  }
}

Nuxt.js統合

詳細な実装例: references/nuxt.md を参照

クイックスタート(Nuxt 3):

// composables/useKurocoApi.ts
export function useKurocoApi() {
  const config = useRuntimeConfig()

  async function get<T>(endpoint: string, params?: Record<string, any>): Promise<T> {
    const query = params ? `?${new URLSearchParams(params)}` : ''
    return await $fetch<T>(
      `${config.public.apiBase}/rcms-api/${config.public.apiId}/${endpoint}${query}`,
      { credentials: 'include' }
    )
  }

  return { get }
}

Next.js統合

詳細な実装例: references/nextjs.md を参照

クイックスタート(App Router):

// lib/api.ts
export async function apiGet<T>(endpoint: string): Promise<T> {
  const response = await fetch(
    `${process.env.NEXT_PUBLIC_API_BASE}/rcms-api/1/${endpoint}`,
    { credentials: 'include', cache: 'no-store' }
  )
  if (!response.ok) throw new Error(`API Error: ${response.status}`)
  return response.json()
}

KurocoFront統合

KurocoFrontはKurocoが提供するフロントエンドホスティングサービス(静的ホスティング + CDN)。

SPA(History APIでのクライアントルーティング)を配信するなら、kuroco_front.json の rewrites に {"source": ".*", "destination": "/index.html"} が必須(無いとリロード・URL直打ち・共有リンクが404になる)。 source は .* 固定で、/assets/ 等を除外する規則を自分で書かない。^/.*$ やアンカーなしの 除外パターンなど他の書き方では、JS・CSS まで index.html に置き換わり白画面になる。 壊れる理由と error_page との関係を含めた推奨設定は references/kuroco-front.md「SPA配信」にまとめてある。

kuroco_front.json の設定(rewrites / redirects / Basic認証 / IPアドレス制限)、 非公開デフォルト(ユーザーが公開を明示するまで robots.txt の Disallow: / + Basic認証/IP制限をかけてデプロイする既定)、GitHub連携デプロイ、 Admin MCPからの直接デプロイ(files-create_temp_upload_url → kuroco_front-deploy → kuroco_front-history)の 手順と制約は references/kuroco-front.md を参照。

Admin MCP から直接デプロイするときの確認4点

手順の全文は references/kuroco-front.md「デプロイ方法」。 ここに置くのは、間違えても accepted が返り、失敗がエラーにも履歴にも残らないことがある箇所だけ。

  • zipはビルド出力の中身をルートにする: cd dist && zip -r ../dist.zip .。アップロード前に unzip -l でルート直下に index.html と kuroco_front.json があることを確認する
  • kuroco_front-deploy の accepted はキュー投入の受領であり、成功ではない。反映には30秒〜数分かかる
  • 反映確認は kuroco_front-history の行と、公開URLのレスポンスヘッダー x-rcms-hash・x-rcms-deploy がその行の hash に対応することの両方
  • 10分経っても満たさなければ失敗。切り分けは references/kuroco-front.md「反映されないときの見分け方」

注意事項

サードパーティCookie問題(SPAのCookie認証)

フロントエンドとAPIが別ドメイン(例: www.example.com と {site_key}.g.kuroco.app)の場合、 SafariのITP等によりクロスサイトCookieがブロックされ、Cookie認証が動作しません。回避策は2つ:

回避策1: 同一親ドメインに揃える(Cookie認証を続ける場合)

APIに独自ドメイン(例: api.example.com)を設定し、フロント(www.example.com)と親ドメインを揃えるとCookieがファーストパーティ扱いになります。 設定: 管理画面 [独自ドメイン/TLS証明書] でAPIドメインを登録 → [アカウント設定] でAPIベースURLを更新。

Safariの7日間Cookie上限に注意: 親ドメインを揃えても、SafariはCNAMEクローキング対策により この構成のCookie有効期限を7日に制限します。毎日使うツールでは実質問題ありませんが、 ログイン頻度が低いサイトではSafariユーザーが7日で再ログインになります。

回避策2: 動的アクセストークン認証に切り替える(SPAで確実な方法)

アクセストークンはCookieではなく X-RCMS-API-ACCESS-TOKEN リクエストヘッダーで送るため、 ITP・サードパーティCookie制限の対象外です。長期ログイン保持が必要なSPA・クロスドメイン構成ではこちらを推奨。

  1. APIセキュリティを「動的アクセストークン」に設定し、token エンドポイント(Login::token)を作成
  2. ログイン: login → grant_token 取得 → token にPOSTして access_token(+ refresh_token)取得
  3. 以降のリクエストに X-RCMS-API-ACCESS-TOKEN: {access_token} ヘッダーを付与
  4. 期限切れ時は refresh_token を token エンドポイントに送って再発行(access_token_lifespan / refresh_token_lifespan で期間設定)

トークンをlocalStorageに保存する場合はXSS対策(後述のHTMLサニタイズ等)を徹底すること。

開発時(localhost): 開発サーバーのプロキシ(Viteの server.proxy 等)でAPIを同一オリジンに見せると、ブラウザのCookie制限を受けずに開発できます。

HTMLサニタイズ

v-html や dangerouslySetInnerHTML を使用する際はXSSに注意:

import DOMPurify from 'dompurify'
const sanitizedHtml = DOMPurify.sanitize(htmlContent)

関連スキル

  • /kuroco-api-content - API設計・認証パターン、コンテンツCRUD操作
  • /kuroco-admin-mcp - Admin MCP経由の管理操作

関連ドキュメント

  • ../kuroco-docs/docs/tutorials-frontend-1.md(integrate-kuroco-with-nuxt) - Nuxt.js統合
  • ../kuroco-docs/docs/tutorials-auth-member-2.md(integrate-login) - ログイン実装
  • ../kuroco-docs/docs/tutorials-auth-member-4.md(signup) - 会員登録
  • ../kuroco-docs/docs/tutorials-misc.md(beginners-guide) - ビギナーズガイド
  • ../kuroco-docs/docs/tutorials-frontend-1.md(corporate-sample-site-to-ssg) - SSG対応
  • Kurocoサンプルサイトチュートリアル - サンプルサイトの構築・デプロイ手順

评论

支持 Markdown