CLI リファレンス
SwallowKit CLI の全コマンドとオプションの詳細リファレンスです。
目次
- swallowkit init
- swallowkit machine
- swallowkit-mcp
- swallowkit create-model
- swallowkit add-connector
- swallowkit add-auth
- swallowkit dev
- swallowkit scaffold
- swallowkit create-dev-seeds
- swallowkit provision
swallowkit machine
AI / MCP 統合向けの machine-readable command group です。
使用法
npx swallowkit machine <command> <subcommand> [options]利用可能なコマンド
| コマンド | 用途 |
|---|---|
inspect project | framework-owned project metadata を返す |
inspect entities | entity / schema metadata を返す |
inspect routes | BFF / Functions route metadata を返す |
validate project | 構造化された validation violation を返す |
generate model | create-model を非対話 JSON モードで実行する |
generate scaffold | scaffold を非対話 JSON モードで実行する |
例
npx swallowkit machine inspect project
npx swallowkit machine validate project
npx swallowkit machine generate model todo --overwrite never
npx swallowkit machine generate scaffold todo --api-only出力契約
- stdout は常に 1 つの JSON
- 非対話
- 成功 / 失敗ともに構造化出力
generate modelは overwrite policy(alwaysまたはnever)を明示する
アーキテクチャやレスポンス例の詳細は AI / MCP ガイド を参照してください。
swallowkit-mcp
AI コーディングエージェント向けの同梱 MCP stdio server です。
使用法
npx swallowkit-mcp公開される MCP Tools
swallowkit_inspect_projectswallowkit_inspect_entitiesswallowkit_inspect_routesswallowkit_validate_projectswallowkit_generate_modelswallowkit_scaffold_model
MCP server は swallowkit machine ... の thin adapter であり、独自の framework ロジックは持ちません。
swallowkit init
新しい SwallowKit プロジェクトを初期化します。
使用法
npx swallowkit init [project-name] [options]
# or
pnpm dlx swallowkit init [project-name] [options]引数
project-name(オプション): プロジェクト名。省略時はカレントディレクトリに初期化
オプション
| オプション | 説明 | 値 | デフォルト |
|---|---|---|---|
--template <template> | 使用テンプレート | default | default |
--next-version <version> | Next.js バージョン | 例: 16.0.7, latest | latest |
--cicd <provider> | CI/CD プロバイダー | github, azure, skip | (プロンプト) |
--backend-language <language> | Azure Functions のバックエンド言語 | typescript, csharp, python | (プロンプト) |
--cosmos-db-mode <mode> | Cosmos DB モード | freetier, serverless | (プロンプト) |
--vnet <option> | ネットワークセキュリティ | outbound, none | (プロンプト) |
対話モードと非対話モード
デフォルトでは、init は CI/CD、Azure Functions のバックエンド言語、Cosmos DB モード、ネットワーク設定を対話プロンプトで質問します。
フラグで直接指定するとプロンプトをスキップできます:
# 完全非対話モード
npx swallowkit init my-app --cicd github --backend-language csharp --cosmos-db-mode serverless --vnet outbound
# 部分指定(--cicd のみ指定、残りはプロンプト表示)
npx swallowkit init my-app --cicd skipVS Code 拡張機能やスクリプトなど、stdin が TTY でない環境から CLI を呼び出す場合に特に便利です。
不正な値を指定するとエラーになります:
❌ Invalid --cicd value: "invalid". Must be: github, azure, skip対話プロンプト
フラグが未指定の場合、以下のプロンプトが表示されます:
- CI/CD プロバイダー: GitHub Actions、Azure Pipelines、またはスキップ
- バックエンド言語: TypeScript、C#、または Python
- Cosmos DB モード: Free Tier または Serverless
- ネットワークセキュリティ: VNet Integration または None
バックエンド言語ごとの補足
typescript: Functions は共有された Zod パッケージをそのまま利用します。csharp/python:swallowkit scaffoldがfunctions/openapi/に OpenAPI を出力し、functions/generated/にネイティブ生成されたバックエンド用スキーマ資産を生成します。
生成されるファイル
my-app/
├── app/ # Next.js App Router
│ ├── api/greet/ # BFF サンプル
│ ├── layout.tsx
│ └── page.tsx
├── components/ # React コンポーネント
├── lib/
│ ├── api/backend.ts # BFF クライアント (api.get/post/put/delete)
│ ├── database/ # Cosmos DB クライアント (オプション)
│ │ ├── client.ts # CosmosClient
│ │ └── repository.ts # リポジトリパターン
│ ├── models/ # データモデル
│ └── schemas/ # Zod スキーマ
├── functions/ # Azure Functions
│ ├── src/ # TypeScript ハンドラー
│ ├── Crud/ # C# ハンドラー
│ ├── blueprints/ # Python ハンドラー
│ ├── generated/ # C#/Python 向けネイティブ生成スキーマ資産
│ ├── openapi/ # C#/Python 向けに出力された OpenAPI
│ ├── host.json
│ └── local.settings.json
├── infra/ # Bicep IaC
│ ├── main.bicep
│ ├── main.parameters.json
│ └── modules/
│ ├── staticwebapp.bicep
│ ├── functions.bicep
│ └── cosmosdb.bicep
├── .github/workflows/ # CI/CD (GitHub Actions の場合)
│ ├── static-web-app.yml
│ └── azure-functions.yml
├── .github/
│ ├── copilot-instructions.md # GitHub Copilot 向け指示
│ └── instructions/ # Copilot レイヤー別ルール
│ ├── shared-models.instructions.md
│ ├── bff-routes.instructions.md
│ └── azure-functions.instructions.md
├── .env.local # 環境変数
├── .env.example
├── next.config.js
├── swallowkit.config.js
├── staticwebapp.config.json
├── .mcp.json # ローカル install 済み SwallowKit を使う project-scoped MCP bootstrap
├── AGENTS.md # コーディングエージェント向け指示書 (Codex)
├── CLAUDE.md # Claude Code 向け指示書
└── package.jsonAI エージェント bootstrap / 指示ファイル
init コマンドは、複数の AI コーディングエージェント向けの指示ファイルに加え、repository MCP 自動検出に対応した runtime 向けの project-scoped MCP bootstrap も自動生成します。これらにより、AI エージェント(GitHub Copilot、Claude Code、OpenAI Codex など)がコードを生成・修正する際に、プロジェクトのアーキテクチャと規約に従います。
生成されるファイル一覧
| ファイル | 対象エージェント | 説明 |
|---|---|---|
AGENTS.md | OpenAI Codex / 汎用エージェント | アーキテクチャ全体仕様、規約、命名規則、CLI スキル |
CLAUDE.md | Claude Code | クイックリファレンス + CLI コマンド(詳細は AGENTS.md を参照) |
.mcp.json | Claude Code / project MCP runtime | ローカル install 済み swallowkit-mcp entrypoint の project-scoped launcher |
.github/copilot-instructions.md | GitHub Copilot | 主要ルールのサマリー(Copilot が自動読み込み) |
.github/instructions/shared-models.instructions.md | GitHub Copilot | shared/models/** 向けレイヤー別ルール |
.github/instructions/bff-routes.instructions.md | GitHub Copilot | app/api/** 向けレイヤー別ルール |
.github/instructions/azure-functions.instructions.md | GitHub Copilot | functions/** 向けレイヤー別ルール |
生成される AGENTS.md の全文を以下に示します(日本語訳併記):
# AGENTS.md
This project was generated by **SwallowKit**.
All coding agents **must** follow the architecture and conventions described below.
<!-- このプロジェクトは SwallowKit で生成されました。すべてのコーディングエージェントは、以下に記載されたアーキテクチャと規約に従う必要があります。 -->
## Architecture Overview
<!-- アーキテクチャ概要 -->
This is a full-stack TypeScript application deployed on Azure with the following layers:
<!-- Azure 上にデプロイされるフルスタック TypeScript アプリケーションで、以下のレイヤーで構成されます: -->
```
Frontend (React / Next.js App Router)
↓ fetch('/api/{model}', ...)
BFF Layer (Next.js API Routes)
↓ HTTP → Azure Functions
Backend (Azure Functions with Cosmos DB bindings)
↓
Azure Cosmos DB (Document Database)
```
### Project Structure
<!-- プロジェクト構造 -->
```
my-app/
├── app/ # Next.js App Router
│ ├── api/ # BFF API routes (proxy to Azure Functions)
│ └── {model}/ # UI pages per model (list, detail, create, edit)
├── functions/ # Azure Functions (backend)
│ └── src/ # HTTP trigger handlers with Cosmos DB bindings
├── shared/ # Shared workspace package
│ ├── models/ # Zod schema definitions (single source of truth)
│ └── index.ts # Re-exports all models
├── lib/
│ └── api/ # API client utilities (backend.ts, call-function.ts)
├── components/ # Shared React components
├── infra/ # Bicep infrastructure-as-code files
│ ├── main.bicep
│ └── modules/
├── .mcp.json # project-scoped MCP bootstrap using local installed SwallowKit
└── .github/workflows/ # CI/CD workflows (if configured)
```
## SwallowKit MCP / Machine Workflow
- This repository includes a project-scoped `.mcp.json` file that starts the locally installed SwallowKit MCP server on runtimes that auto-load project MCP configurations.
- Prefer the `swallowkit_*` MCP tools for framework-owned inspection, validation, and generation when they are available.
- If MCP is unavailable in your runtime, fall back to the machine CLI:
- `npx swallowkit machine inspect project`
- `npx swallowkit machine validate project`
- `npx swallowkit machine generate scaffold <name> --api-only`
- Do not hand-edit framework-owned artifacts when the MCP or machine interface can generate or validate them for you.
- The local MCP bootstrap expects project dependencies to already be installed.
## Critical Design Principles
<!-- 重要な設計原則 -->
### 1. Next.js API Routes Are Strictly a BFF (Backend for Frontend)
<!-- Next.js API Routes は厳密に BFF(Backend for Frontend)である -->
- `app/api/` routes exist **only** to proxy requests to Azure Functions.
- **Never** place business logic, database access, or direct Cosmos DB calls in Next.js API routes.
- The BFF layer may validate input/output with Zod schemas before forwarding to Functions.
- Use the `callFunction` helper (`lib/api/call-function.ts`) or the `api` client (`lib/api/backend.ts`) to call Azure Functions.
<!--
- `app/api/` ルートは Azure Functions へのリクエストプロキシのためだけに存在します。
- ビジネスロジック、データベースアクセス、直接の Cosmos DB 呼び出しを Next.js API Routes に配置してはいけません。
- BFF レイヤーは、Functions に転送する前に Zod スキーマで入出力を検証できます。
- Azure Functions を呼び出すには `callFunction` ヘルパーまたは `api` クライアントを使用します。
-->
Example BFF route pattern:
<!-- BFF ルートのパターン例: -->
```typescript
// app/api/{model}/route.ts
import { callFunction } from '@/lib/api/call-function';
import { ModelSchema } from '@my-app/shared';
import { z } from 'zod/v4';
export async function GET() {
return callFunction({
method: 'GET',
path: '/api/{model}',
responseSchema: z.array(ModelSchema),
});
}
export async function POST(request: NextRequest) {
const body = await request.json();
return callFunction({
method: 'POST',
path: '/api/{model}',
body,
inputSchema: ModelSchema.omit({ id: true, createdAt: true, updatedAt: true }),
responseSchema: ModelSchema,
successStatus: 201,
});
}
```
### 2. Zod Schemas Are the Single Source of Truth
<!-- Zod スキーマが唯一の信頼できる情報源(Single Source of Truth) -->
- All data models are defined **once** as Zod schemas in `shared/models/`.
- TypeScript types are derived with `z.infer<typeof Schema>` — never define types separately.
- The same schema is used in **all three layers**: frontend (validation), BFF (input/output validation), and Azure Functions (request/response validation + Cosmos DB documents).
- The shared package (`@my-app/shared`) is consumed by both Next.js and Azure Functions as a workspace dependency.
<!--
- すべてのデータモデルは `shared/models/` に Zod スキーマとして一度だけ定義します。
- TypeScript の型は `z.infer<typeof Schema>` で導出します。型を別途定義してはいけません。
- 同じスキーマがフロントエンド、BFF、Azure Functions の 3 つのレイヤーすべてで使用されます。
- 共有パッケージ(`@my-app/shared`)は Next.js と Azure Functions の両方からワークスペース依存として使用されます。
-->
Model definition pattern:
<!-- モデル定義のパターン: -->
```typescript
// shared/models/{model}.ts
import { z } from 'zod/v4';
export const Todo = z.object({
id: z.string(),
name: z.string().min(1),
// ... your fields
createdAt: z.string().optional(),
updatedAt: z.string().optional(),
});
export type Todo = z.infer<typeof Todo>;
export const displayName = 'Todo';
```
Key rules:
- Use the **Zod official pattern**: the schema constant and the TypeScript type share the same name.
- `id`, `createdAt`, and `updatedAt` are auto-managed by the backend. Mark them as `optional()` in the schema.
- Always re-export models from `shared/index.ts`.
<!--
重要なルール:
- Zod 公式パターンに従い、スキーマ定数と TypeScript 型は同じ名前にします。
- `id`、`createdAt`、`updatedAt` はバックエンドで自動管理されます。スキーマでは `optional()` として定義します。
- モデルは必ず `shared/index.ts` から再エクスポートします。
-->
### 3. Azure Functions Own All Business Logic and Data Access
<!-- Azure Functions がすべてのビジネスロジックとデータアクセスを担当 -->
- All CRUD operations and business logic live in `functions/src/`.
- Use Azure Functions Cosmos DB **input/output bindings** (`extraInputs`/`extraOutputs`) for reads and writes.
- Use the Cosmos DB SDK client directly **only** for delete operations (bindings do not support delete).
- Validate all data against Zod schemas before writing to Cosmos DB.
- The backend auto-generates `id` (UUID), `createdAt`, and `updatedAt` — never trust client-sent values for these fields.
<!--
- すべての CRUD 操作とビジネスロジックは `functions/src/` に配置します。
- 読み取り・書き込みには Cosmos DB の input/output bindings(`extraInputs`/`extraOutputs`)を使用します。
- Cosmos DB SDK クライアントを直接使用するのは削除操作のみです(bindings は delete をサポートしていません)。
- Cosmos DB への書き込み前に、すべてのデータを Zod スキーマで検証します。
- `id`(UUID)、`createdAt`、`updatedAt` はバックエンドで自動生成されます。クライアントからの値を信頼してはいけません。
-->
Azure Functions handler pattern:
<!-- Azure Functions ハンドラーのパターン: -->
```typescript
// functions/src/{model}.ts
import { app } from '@azure/functions';
import { ModelSchema } from '@my-app/shared';
const containerName = 'Models'; // PascalCase + 's'
app.http('{model}-get-all', {
methods: ['GET'],
route: '{model}',
authLevel: 'anonymous',
extraInputs: [{ type: 'cosmosDB', name: 'cosmosInput', containerName, ... }],
handler: async (request, context) => {
const documents = context.extraInputs.get('cosmosInput');
const validated = z.array(ModelSchema).parse(documents);
return { status: 200, jsonBody: validated };
},
});
```
## Naming Conventions
<!-- 命名規則 -->
| Item | Convention | Example |
|------|-----------|--------|
| Model schema file | `shared/models/{kebab-case}.ts` | `shared/models/todo.ts` |
| Schema/type name | PascalCase (same name for both) | `export const Todo = z.object({...}); export type Todo = z.infer<typeof Todo>;` |
| Functions handler file | `functions/src/{kebab-case}.ts` | `functions/src/todo.ts` |
| Functions handler name | `{camelCase}-{operation}` | `todo-get-all`, `todo-create` |
| API route path | `/api/{camelCase}` | `/api/todo`, `/api/todo/{id}` |
| BFF route file | `app/api/{kebab-case}/route.ts` | `app/api/todo/route.ts` |
| BFF detail route | `app/api/{kebab-case}/[id]/route.ts` | `app/api/todo/[id]/route.ts` |
| UI page directory | `app/{kebab-case}/` | `app/todo/page.tsx` |
| React component | PascalCase | `TodoForm.tsx` |
| Cosmos DB container | PascalCase + 's' | `Todos` |
| Cosmos DB partition key | `/id` (default) | Customizable via `export const partitionKey` in model file |
| Bicep container file | `infra/containers/{kebab-case}-container.bicep` | `infra/containers/todo-container.bicep` |
<!--
| 項目 | 規則 | 例 |
|------|------|----|
| モデルスキーマファイル | `shared/models/{kebab-case}.ts` | `shared/models/todo.ts` |
| スキーマ/型名 | PascalCase(両方同じ名前) | `export const Todo = z.object({...}); export type Todo = z.infer<typeof Todo>;` |
| Functions ハンドラーファイル | `functions/src/{kebab-case}.ts` | `functions/src/todo.ts` |
| Functions ハンドラー名 | `{camelCase}-{operation}` | `todo-get-all`, `todo-create` |
| API ルートパス | `/api/{camelCase}` | `/api/todo`, `/api/todo/{id}` |
| BFF ルートファイル | `app/api/{kebab-case}/route.ts` | `app/api/todo/route.ts` |
| BFF 詳細ルート | `app/api/{kebab-case}/[id]/route.ts` | `app/api/todo/[id]/route.ts` |
| UI ページディレクトリ | `app/{kebab-case}/` | `app/todo/page.tsx` |
| React コンポーネント | PascalCase | `TodoForm.tsx` |
| Cosmos DB コンテナ | PascalCase + 's' | `Todos` |
| Cosmos DB パーティションキー | `/id`(デフォルト) | モデルファイルの `export const partitionKey` でカスタマイズ可能 |
| Bicep コンテナファイル | `infra/containers/{kebab-case}-container.bicep` | `infra/containers/todo-container.bicep` |
-->
## Adding New Models (SwallowKit CLI Skills)
<!-- 新しいモデルの追加(SwallowKit CLI スキル) -->
Use the SwallowKit CLI — do **not** manually create model files or CRUD boilerplate.
<!-- SwallowKit CLI を使用してください。モデルファイルや CRUD ボイラープレートを手動で作成してはいけません。 -->
### Skill: Create a new data model
<!-- スキル: 新しいデータモデルを作成 -->
```bash
npx swallowkit create-model <name>
# Multiple models at once:
# 複数のモデルを一度に作成:
npx swallowkit create-model user post comment
```
Creates `shared/models/<name>.ts` with a Zod schema template including `id`, `createdAt`, `updatedAt`.
Edit the generated file to add your domain-specific fields, then run scaffold.
<!-- `id`、`createdAt`、`updatedAt` を含む Zod スキーマテンプレート付きの `shared/models/<name>.ts` を作成します。生成されたファイルを編集してドメイン固有のフィールドを追加し、scaffold を実行します。 -->
### Skill: Generate full CRUD from a model
<!-- スキル: モデルから完全な CRUD を生成 -->
```bash
npx swallowkit scaffold shared/models/<name>.ts
```
Generates:
- Azure Functions handlers (`functions/src/<name>.ts`)
- BFF API routes (`app/api/<name>/route.ts`, `app/api/<name>/[id]/route.ts`)
- UI pages (`app/<name>/page.tsx`, detail, create, edit pages)
- Cosmos DB Bicep container config (`infra/containers/<name>-container.bicep`)
<!--
生成されるもの:
- Azure Functions ハンドラー(`functions/src/<name>.ts`)
- BFF API ルート(`app/api/<name>/route.ts`、`app/api/<name>/[id]/route.ts`)
- UI ページ(`app/<name>/page.tsx`、詳細、作成、編集ページ)
- Cosmos DB Bicep コンテナ設定(`infra/containers/<name>-container.bicep`)
-->
### Skill: Start development servers
<!-- スキル: 開発サーバーを起動 -->
```bash
npx swallowkit dev
```
Runs Next.js (http://localhost:3000) and Azure Functions (http://localhost:7071) concurrently.
Checks for Cosmos DB Emulator availability.
<!-- Next.js (http://localhost:3000) と Azure Functions (http://localhost:7071) を同時に起動します。Cosmos DB Emulator の可用性を確認します。 -->
### Skill: Provision Azure resources
<!-- スキル: Azure リソースをプロビジョニング -->
```bash
npx swallowkit provision --resource-group <name>
```
Deploys Bicep infrastructure: Static Web Apps, Functions, Cosmos DB, Storage, Managed Identity.
<!-- 実行時にプライマリリージョンと Static Web App リージョンを対話式に選択します。 -->
<!-- Bicep インフラをデプロイ: Static Web Apps、Functions、Cosmos DB、Storage、Managed Identity。 -->
### Typical workflow for "add a new feature/model"
<!-- 「新しい機能/モデルを追加する」典型的なワークフロー -->
1. `npx swallowkit create-model <name>`
2. Edit `shared/models/<name>.ts` — add fields <!-- フィールドを追加 -->
3. `npx swallowkit scaffold shared/models/<name>.ts`
4. `npx swallowkit dev` — verify at http://localhost:3000/<name> <!-- http://localhost:3000/<name> で確認 -->
## Do NOT
<!-- 禁止事項 -->
- **Do not** put business logic or database calls in `app/api/` routes. They are BFF only.
- **Do not** define TypeScript interfaces/types separately from Zod schemas. Always derive types with `z.infer<>`.
- **Do not** manually duplicate model definitions across layers. Use the shared package.
- **Do not** manually create CRUD boilerplate. Use `swallowkit scaffold`.
- **Do not** hardcode Cosmos DB connection strings. Use Managed Identity (`CosmosDBConnection__accountEndpoint`) in production and emulator settings locally.
- **Do not** change the partition key after a container is already created (it requires data migration). Configure it via `export const partitionKey` in model files before the first `swallowkit scaffold`.
<!--
- `app/api/` ルートにビジネスロジックやデータベース呼び出しを置かないでください。BFF 専用です。
- TypeScript の interface/type を Zod スキーマと別に定義しないでください。常に `z.infer<>` で導出します。
- モデル定義をレイヤー間で手動複製しないでください。共有パッケージを使用します。
- CRUD ボイラープレートを手動で作成しないでください。`swallowkit scaffold` を使用します。
- Cosmos DB 接続文字列をハードコードしないでください。本番では Managed Identity、ローカルではエミュレーター設定を使用します。
- コンテナ作成後にパーティションキーを変更しないでください(データ移行が必要です)。最初の `swallowkit scaffold` 実行前にモデルファイルの `export const partitionKey` で設定してください。
-->
## Technology Stack
<!-- 技術スタック -->
- **Frontend**: Next.js (App Router), React, TypeScript, Tailwind CSS
- **BFF**: Next.js API Routes (proxy only)
- **Backend**: Azure Functions (TypeScript, Node.js)
- **Database**: Azure Cosmos DB (NoSQL)
- **Schema**: Zod (shared across all layers via workspace package)
- **Infrastructure**: Bicep (IaC)
- **Hosting**: Azure Static Web Apps (frontend) + Azure Functions Flex Consumption (backend)
- **Auth**: Azure Managed Identity (no connection strings in production)
- **Monitoring**: Application Insights
<!--
- **フロントエンド**: Next.js (App Router), React, TypeScript, Tailwind CSS
- **BFF**: Next.js API Routes(プロキシ専用)
- **バックエンド**: Azure Functions (TypeScript, Node.js)
- **データベース**: Azure Cosmos DB (NoSQL)
- **スキーマ**: Zod(ワークスペースパッケージ経由で全レイヤーで共有)
- **インフラ**: Bicep (IaC)
- **ホスティング**: Azure Static Web Apps(フロントエンド)+ Azure Functions Flex Consumption(バックエンド)
- **認証**: Azure Managed Identity(本番で接続文字列不要)
- **監視**: Application Insights
-->CLAUDE.md(Claude Code 向け)
CLAUDE.md は Claude Code 向けの簡潔なクイックリファレンスファイルです。詳細仕様は AGENTS.md を参照し、CLI コマンド表とワークフローの要約を含みます。
# CLAUDE.md
This file is for Claude Code. Read AGENTS.md in the project root for the full
architecture, conventions, and rules.
## Quick Reference
<!-- クイックリファレンス -->
- **Architecture**: Next.js (frontend) → BFF (API routes, proxy only)
→ Azure Functions (backend) → Cosmos DB
- **Schema**: Zod schemas in `shared/models/` are the single source of truth.
Never define types separately.
- **BFF rule**: `app/api/` routes must ONLY proxy to Azure Functions via
`callFunction()`. No business logic.
- **Backend rule**: All business logic and Cosmos DB access lives in
`functions/src/`.
<!--
- **アーキテクチャ**: Next.js(フロントエンド)→ BFF(API ルート、プロキシのみ)→ Azure Functions(バックエンド)→ Cosmos DB
- **スキーマ**: `shared/models/` の Zod スキーマが唯一の信頼できる情報源。型を別途定義しない。
- **BFF ルール**: `app/api/` ルートは `callFunction()` 経由で Azure Functions にプロキシするだけ。ビジネスロジック禁止。
- **バックエンドルール**: すべてのビジネスロジックと Cosmos DB アクセスは `functions/src/` に配置。
-->
## SwallowKit MCP
- This repository includes a project-scoped `.mcp.json` that registers the locally installed SwallowKit MCP server for runtimes that support project MCP files.
- When the `swallowkit_*` tools are available, prefer them for inspect / validate / generate tasks.
- If MCP is unavailable, use `npx swallowkit machine ...` instead.
## SwallowKit CLI Commands
<!-- SwallowKit CLI コマンド -->
| Task | Command |
|------|---------|
| Create model | `npx swallowkit create-model <name>` |
| Generate CRUD | `npx swallowkit scaffold shared/models/<name>.ts` |
| Dev servers | `npx swallowkit dev` |
| Provision Azure | `npx swallowkit provision -g <rg>` |
## Workflow: Add a new model
<!-- ワークフロー: 新しいモデルを追加 -->
1. `npx swallowkit create-model <name>`
2. Edit `shared/models/<name>.ts` — add your fields
3. `npx swallowkit scaffold shared/models/<name>.ts`
4. `npx swallowkit dev` — verify at http://localhost:3000/<name>.github/copilot-instructions.md(GitHub Copilot 向け)
このファイルは VS Code で GitHub Copilot が自動的に読み込みます。アーキテクチャの概要、主要ルール、命名規則、管理フィールドのサマリーに加え、framework 管理操作で使う MCP / machine-interface fallback も含みます。
.github/instructions/*.instructions.md(GitHub Copilot — レイヤー別)
これらのファイルは、applyTo glob パターンに一致するファイルを編集する際に GitHub Copilot が適用するコンテキスト固有のルールを提供します:
| ファイル | 適用対象 | 主要ルール |
|---|---|---|
shared-models.instructions.md | shared/models/** | Zod スキーマ規約、id/createdAt/updatedAt 管理、shared/index.ts からの再エクスポート |
bff-routes.instructions.md | app/api/** | プロキシ専用ルール、callFunction() 使用、ビジネスロジック禁止 |
azure-functions.instructions.md | functions/** | Cosmos DB bindings、Zod バリデーション、UUID 自動生成 |
パッケージマネージャーの自動検出
SwallowKit はパッケージマネージャーを自動的に選択します:
- pnpm がインストール済みの場合 → 常に pnpm を優先
- それ以外の場合 → npm を使用
生成されるプロジェクト(ロックファイル、ワークスペース設定、CI/CD スクリプト)は検出されたパッケージマネージャーに合わせて生成されます。
例
# 新しいディレクトリに初期化(対話モード)
npx swallowkit init my-awesome-app
# 新しいディレクトリに初期化(非対話モード)
npx swallowkit init my-awesome-app --cicd github --cosmos-db-mode serverless --vnet outbound
# pnpm で実行
pnpm dlx swallowkit init my-awesome-app
# 初期化後
cd my-awesome-appswallowkit create-model
shared/models/ 配下に 1 つ以上の Zod モデル雛形ファイルを生成します。
使用法
npx swallowkit create-model <names...> [options]
# or
pnpm dlx swallowkit create-model <names...> [options]引数
names...: 1 つ以上のモデル名
オプション
| オプション | 説明 | デフォルト |
|---|---|---|
--models-dir <dir> | 生成先のモデルディレクトリ | shared/models |
--connector <name> | 指定した connector に紐づく connector 対応モデルを生成 | (なし) |
このコマンドが行うこと
各モデル名について、次を行います:
shared/models/<name>.tsを生成- ファイル名は kebab-case、スキーマ名と型名は PascalCase に正規化
shared/index.tsが存在する場合は再エクスポートを追加- 初期スキーマに
id、name、createdAt、updatedAtを含める
例:
npx swallowkit create-model todo category生成される雛形:
import { z } from 'zod/v4';
export const Todo = z.object({
id: z.string(),
name: z.string().min(1),
createdAt: z.string().optional(),
updatedAt: z.string().optional(),
});
export type Todo = z.infer<typeof Todo>;
export const displayName = 'Todo';Connector モデル
--connector を指定すると、生成される雛形に connector 固有のメタデータを含む connectorConfig エクスポートが追加されます:
- RDB connector:
tableとidColumnフィールドを含む - API connector:
endpointsマッピングを含む - いずれも
operations配列を含む(API はすべての操作、RDB は読み取り専用がデフォルト) - Zod スキーマの雛形が変更される(バックエンドによる
createdAt/updatedAtの自動管理なし)
例:
npx swallowkit create-model user --connector mysql
npx swallowkit create-model backlog-issue --connector backlog既存ファイルがある場合
対象ファイルがすでに存在する場合は、上書きするかどうかを確認します。no を選ぶとそのモデルだけスキップされ、他のモデルの処理は続行されます。
典型的な流れ
npx swallowkit create-model todo
# shared/models/todo.ts を編集
npx swallowkit scaffold shared/models/todo.tsまず create-model でスキーマのひな形を作り、その後で業務要件に合わせて Zod モデルを編集してから scaffold を実行します。
swallowkit add-connector
外部データソースの connector を swallowkit.config.js に登録します。
使用法
npx swallowkit add-connector <name> --type=<type> [options]
# or
pnpm dlx swallowkit add-connector <name> --type=<type> [options]引数
name(必須): connector 名(config のキーとして使用)
オプション
| オプション | 説明 | 必須 |
|---|---|---|
--type <type> | connector タイプ: rdb または api | はい |
--provider <provider> | RDB プロバイダー: mysql, postgres, sqlserver | --type rdb の場合のみ |
--connection-env <var> | 接続文字列の環境変数名 | --type rdb の場合のみ |
--base-url-env <var> | API ベース URL の環境変数名 | --type api の場合のみ |
--auth-type <type> | 認証タイプ: apiKey, bearer, oauth2 | --type api の場合のみ |
--auth-env <var> | 認証情報の環境変数名 | --type api の場合のみ |
--auth-placement <placement> | 認証の配置先: query または header | --type api で apiKey の場合のみ |
--auth-param <name> | API キーのパラメーター名 | --type api で apiKey の場合のみ |
このコマンドが行うこと
- 既存の
swallowkit.config.jsを読み込む connectorsセクションに connector 定義を追加connectorsセクションが存在しない場合は新規作成
例
# MySQL RDB connector を追加
npx swallowkit add-connector mysql --type rdb --provider mysql --connection-env MYSQL_CONNECTION_STRING
# API キー認証の REST API connector を追加
npx swallowkit add-connector backlog --type api --base-url-env BACKLOG_API_BASE_URL --auth-type apiKey --auth-env BACKLOG_API_KEY --auth-placement query --auth-param apiKey
# Bearer トークン認証の REST API connector を追加
npx swallowkit add-connector github --type api --base-url-env GITHUB_API_BASE_URL --auth-type bearer --auth-env GITHUB_TOKENswallowkit add-auth
SwallowKit プロジェクトに認証・認可の基盤を構築します。
使用法
npx swallowkit add-auth [options]
# or
pnpm dlx swallowkit add-auth [options]オプション
| オプション | 説明 | 値 | デフォルト |
|---|---|---|---|
--provider <provider> | 認証プロバイダー | custom-jwt | custom-jwt |
注:
swaとswa-customは将来向けに予約された値で、現行の認証生成フローでは未実装です。
このコマンドが行うこと
- 共有認証モデルを生成(
shared/models/auth.ts— LoginRequest, AuthUser, LoginResponse) - 認証用 Functions を生成(login, me, logout)— 設定されたバックエンド言語に対応(TS/C#/Python)
- JWT ヘルパーユーティリティを生成(トークン検証・ロールチェック用)
- BFF ルートを生成(
app/api/auth/login|logout|me/route.ts)— httpOnly Cookie 管理 - Next.js ミドルウェアを生成(
middleware.ts)— Cookie ベースの認証チェックとリダイレクト - ログインページを生成(
app/login/page.tsx) - 認証用 React コンテキストを生成(
lib/auth/auth-context.tsx)—useAuthフック付き lib/api/call-function.tsを更新 —Authorizationヘッダーの転送を追加swallowkit.config.jsにauthセクションを追加(未設定の場合)- バックエンドの依存パッケージをインストール(JWT ライブラリ + コネクタプロバイダーに対応する RDB ドライバー)
前提条件
- ユーザーデータベース用のコネクタが
swallowkit.config.jsに登録されていること(例: PostgreSQL・MySQL・SQL Server を指す RDB コネクタ) auth.customJwt.userConnectorがそのコネクタ名を参照していること
例
# カスタム JWT 認証をセットアップ(デフォルト)
npx swallowkit add-auth
# プロバイダーを明示的に指定
npx swallowkit add-auth --provider custom-jwt典型的なワークフロー
# 1. ユーザーデータベース用の RDB コネクタを追加
npx swallowkit add-connector userdb --type rdb --provider postgres --connection-env USERDB_CONNECTION_STRING
# 2. swallowkit.config.js に auth セクションを設定
# 3. add-auth を実行して認証基盤を一括生成
npx swallowkit add-auth
# 4. functions/local.settings.json に JWT_SECRET を設定
# 5. モデルに authPolicy を追加してロールベースアクセス制御を有効化
# 6. scaffold を再実行して Functions に認証ガードを注入
npx swallowkit scaffold shared/models/estimate.ts
# 7. モックコネクタで開発を開始(ユーザーデータもモック化される)
npx swallowkit dev --mock-connectors💡 設定の詳細とアーキテクチャの概要については 認証ガイド をご参照ください。
swallowkit dev
開発サーバーを起動します(Next.js + Azure Functions)。
使用法
npx swallowkit dev [options]
# or
pnpm dlx swallowkit dev [options]オプション
| オプション | 短縮 | 説明 | デフォルト |
|---|---|---|---|
--port <port> | -p | Next.js ポート | 3000 |
--functions-port <port> | Azure Functions ポート | 7071 | |
--host <host> | ホスト名 | localhost | |
--open | -o | ブラウザを自動的に開く | false |
--no-functions | Functions をスキップ | false | |
--seed-env <environment> | 起動前に dev-seeds/<environment> から対応する Cosmos Emulator コンテナを置換 | (無効) | |
--mock-connectors | connector モデル用のモックプロキシサーバーを起動 | false | |
--verbose | -v | 詳細ログを表示 | false |
動作
- Cosmos DB Emulator チェック: ローカルエミュレーターの起動を確認
- Cosmos DB 初期化:
- 必要ならデータベースを作成
- 必要ならモデル用コンテナを作成
--seed-env <environment>が指定され、dev-seeds/<environment>/が存在する場合は、対応する JSON で各コンテナを置換
- Connector Mock Server(
--mock-connectors有効時):- Functions ポート + 1(例: 7072)でプロキシサーバーを起動
- connector モデルに一致するルート → Zod 生成のモックデータによるインメモリ CRUD
- その他のルート → 実際の Azure Functions にプロキシ
- dev-seeds JSON が利用可能な場合は初期データとして読み込み
- BFF は設定変更なしで自動的にモックプロキシを経由
- Azure Functions 起動:
- Azure Functions Core Tools の確認
- 依存関係の自動インストール
functions/ディレクトリで Functions を起動- Python バックエンド: ローカル実行環境の管理に uv を使い、
.uv/配下にプロジェクトローカルな状態を保持しつつ、アプリ用のfunctions/.venvと Python スキーマ生成用のfunctions/.codegen-venvを作成 - C# バックエンド: isolated worker のビルドが完了するまでコールドスタートが長めになるため、Functions URL は HTTP 応答できる状態になってから ready として表示
- Next.js 起動: 開発サーバーを起動
Dev Seed ワークフロー
Cosmos DB Emulator の状態をデバッグ用に再現したい場合は、環境ごとの seed データを使います:
npx swallowkit create-dev-seeds local
# dev-seeds/local/*.json を編集
npx swallowkit dev --seed-env localルール:
- ファイル名はスキーマファイルに対応します。例:
shared/models/todo.ts->dev-seeds/local/todo.json - 一致した seed ファイルは、対応する Cosmos コンテナの内容を丸ごと置き換えます
- 一致する seed ファイルがないコンテナは変更されません
--seed-envを省略した場合、または環境ディレクトリが存在しない場合は、既存の Emulator データを保持します- 各ドキュメントには空でない文字列の
idが必要です
例:
[
{
"id": "seed-todo-001",
"name": "Seed todo one",
"createdAt": "2026-03-21T00:00:00.000Z",
"updatedAt": "2026-03-21T00:00:00.000Z"
}
]例
# デフォルト設定で起動
npx swallowkit dev
# カスタムポートで起動
npx swallowkit dev --port 3001 --functions-port 7072
# ブラウザを自動的に開く
npx swallowkit dev --open
# Functions なしで Next.js のみ起動
npx swallowkit dev --no-functions
# seed 環境を指定して起動
npx swallowkit dev --seed-env local
# 詳細ログ付き
npx swallowkit dev --verbose
# connector モックサーバー付きで起動
npx swallowkit dev --mock-connectors
# モック connector と seed データを併用
npx swallowkit dev --mock-connectors --seed-env localトラブルシューティング
Cosmos DB Emulator が見つからない:
Error: Cosmos DB Emulator is not running解決策:
- Windows: 公式サイトからインストール
- Docker:
docker run -p 8081:8081 mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator
Azure Functions Core Tools がない:
Error: Azure Functions Core Tools not found解決策:
npm install -g azure-functions-core-tools@4
# or
pnpm add -g azure-functions-core-tools@4ポートが使用中:
Error: Port 3000 is already in use解決策:
npx swallowkit dev --port 3001swallowkit scaffold
Zod スキーマから CRUD 操作を自動生成します。
使用法
npx swallowkit scaffold <model-file> [options]
# or
pnpm dlx swallowkit scaffold <model-file> [options]引数
model-file(必須): Zodスキーマを含むモデルファイルのパス
オプション
現在、オプションはありません。
Connector モデルの動作
モデルファイルに connectorConfig エクスポートが含まれている場合、scaffold は connector モデルとして検出します:
- RDB connector モデル:
functions/Connectors/(C#)または同等のディレクトリに SQL ベースの CRUD ハンドラーを生成 - API connector モデル: HTTP クライアントハンドラーを生成
- BFF ルートと React UI は通常のモデルと同一に生成
- connector モデルでは Cosmos DB Bicep 生成をスキップ
- 読み取り専用モデル(operations が
getAll/getByIdのみ)は GET エンドポイントのみ生成
生成されるコード
1. Azure Functions (CRUD エンドポイント)
// functions/src/functions/{resource}.ts
- GET /api/{resource} - 全件取得
- GET /api/{resource}/{id} - ID で取得
- POST /api/{resource} - 作成
- PUT /api/{resource}/{id} - 更新
- DELETE /api/{resource}/{id} - 削除各エンドポイントは:
- ✅ Cosmos DB input/output bindings を使用
- ✅ Zod スキーマで自動検証
- ✅ エラーハンドリング付き
- ✅ TypeScript 型安全
- ✅ ファクトリーパターン対応(共有
crud-factory.ts)
2. Next.js BFF API Routes
// app/api/{resource}/route.ts
// app/api/{resource}/[id]/route.ts各ルートは:
- ✅ Azure Functions バックエンドを呼び出し
- ✅ 自動スキーマ検証
- ✅ エラーハンドリング
3. React コンポーネント(オプション)
// components/{Resource}List.tsx
// components/{Resource}Form.tsx前提条件
モデルファイルの要件:
// lib/models/todo.ts
import { z } from 'zod';
import { BaseModel } from '@/lib/database/base-model';
// 1. Zod スキーマを定義
export const todoSchema = z.object({
id: z.string(),
text: z.string().min(1),
completed: z.boolean().default(false),
createdAt: z.string().default(() => new Date().toISOString()),
});
// 2. 型を推論
export type TodoType = z.infer<typeof todoSchema>;
// 3. BaseModel を継承
export class Todo extends BaseModel<TodoType> {
constructor() {
super(
'AppDatabase', // データベース名
'Todos', // コンテナ名
todoSchema // スキーマ
);
}
}例
# Todo モデルから CRUD を生成
npx swallowkit scaffold lib/models/todo.ts
# Product モデルから CRUD を生成
npx swallowkit scaffold lib/models/product.ts生成後の使用
フロントエンドから使用:
import { api } from '@/lib/api/backend';
import type { TodoType } from '@/lib/models/todo';
// 全件取得
const todos = await api.get<TodoType[]>('/api/todos');
// 作成(バックエンドで検証)
const created = await api.post<TodoType>('/api/todos', {
text: '牛乳を買う',
completed: false
});
// 更新(バックエンドで検証)
const updated = await api.put<TodoType>('/api/todos/123', {
completed: true
});
// 削除
await api.delete('/api/todos/123');詳細
詳しくは Scaffold ガイド を参照してください。
swallowkit create-dev-seeds
shared/models/ の現在のスキーマから、指定したローカル環境向けの JSON seed テンプレートを生成します。
使用法
npx swallowkit create-dev-seeds <environment> [options]
# or
pnpm dlx swallowkit create-dev-seeds <environment> [options]引数
environment(必須):dev-seeds/配下に作成する seed 環境ディレクトリ名
オプション
| オプション | 説明 | デフォルト |
|---|---|---|
--models-dir <dir> | スキーマを読むモデルディレクトリ | shared/models |
--seeds-dir <dir> | seed 環境を生成するベースディレクトリ | dev-seeds |
--force | 既存の JSON seed ファイルを上書き | false |
生成内容
shared/models/ 配下の各スキーマについて、dev-seeds/<environment>/ に JSON ファイルを生成します:
dev-seeds/
local/
todo.json
category.jsonテンプレート値はスキーマの型から推測されます:
- string -> サンプル文字列
- number ->
0 - boolean ->
false - enum -> 最初の enum 値
...At/ date フィールド -> ISO 形式の時刻サンプル- ネストスキーマ -> ネストした JSON オブジェクト
典型的な流れ
npx swallowkit create-model todo
npx swallowkit scaffold shared/models/todo.ts
npx swallowkit create-dev-seeds local
# dev-seeds/local/todo.json を編集
npx swallowkit dev --seed-env localswallowkit provision
Azure リソースを Bicep でプロビジョニングします。
使用法
npx swallowkit provision [options]
# or
pnpm dlx swallowkit provision [options]オプション
| オプション | 短縮 | 説明 | 必須 |
|---|---|---|---|
--resource-group <name> | -g | リソースグループ名 | ✅ |
--subscription <id> | サブスクリプション ID |
リージョン選択
このコマンドは実行時に以下を対話式に選択します:
- Functions / Cosmos DB 用のプライマリリージョン
- Static Web App のリージョン
推奨の組み合わせ:
japaneast+eastasiajapanwest+eastasiaeastus2+eastus2westeurope+westeurope
プライマリリージョンの選択肢:
japaneast- 東日本japanwest- 西日本eastasia- 東アジアsoutheastasia- 東南アジアeastus- 米国東部eastus2- 米国東部2westus2- 米国西部2centralus- 米国中部westeurope- 西ヨーロッパ
Static Web App リージョンの選択肢:
eastasia- 日本向け推奨westus2- 米国西部2centralus- 米国中部eastus2- 米国東部2westeurope- 西ヨーロッパ
全リージョン一覧:
az account list-locations --output table生成されるリソース
Azure Static Web Apps
- SKU: Free
- ビルド構成: standalone Next.js
Azure Functions
- プラン: Flex Consumption
- ランタイム: Node.js 22
- OS: Linux
Azure Cosmos DB
- モード: 初期化時に選択した Free Tier または Serverless
- API: NoSQL
- 一貫性: Session
Azure Storage Account
- Functions 用ストレージ
- SKU: Standard_LRS
Managed Identity
- 種類: System-assigned
- ロール: Cosmos DB Data Contributor
例
# 基本的な使用
npx swallowkit provision --resource-group my-app-rg
# サブスクリプション指定
npx swallowkit provision \
--resource-group my-app-rg \
--subscription "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"プロビジョニング後の確認
# リソース一覧を表示
az resource list --resource-group my-app-rg --output table
# Static Web Apps の URL を取得
az staticwebapp show \
--name <swa-name> \
--resource-group my-app-rg \
--query "defaultHostname" -o tsv
# Functions の URL を取得
az functionapp show \
--name <function-name> \
--resource-group my-app-rg \
--query "defaultHostName" -o tsvBicep ファイルのカスタマイズ
プロビジョニング前に infra/ の Bicep ファイルを編集できます:
// infra/modules/functions-flex.bicep
// インスタンスメモリサイズをカスタマイズ
resource flexFunctionsServer 'Microsoft.Web/sites@2023-12-01' = {
// Flex Consumption プロパティ
}編集後、swallowkit provision を再実行して変更を適用します。
トラブルシューティング
リソースグループが存在しない:
# 作成
az group create --name my-app-rg --location japaneastリージョンでリソースが利用できない:
# 利用可能なリージョンを確認
az provider show --namespace Microsoft.Web \
--query "resourceTypes[?resourceType=='staticSites'].locations" -o tableクォータ超過:
# クォータを確認
az vm list-usage --location japaneast --output tableグローバルオプション
全コマンドで使用可能:
| オプション | 説明 |
|---|---|
--help | ヘルプを表示 |
--version | バージョンを表示 |
環境変数
CLI の動作を環境変数で制御:
| 変数 | 説明 | デフォルト |
|---|---|---|
SWALLOWKIT_LOG_LEVEL | ログレベル (debug/info/warn/error) | info |
COSMOS_DB_ENDPOINT | Cosmos DB エンドポイント | https://localhost:8081/ |
BACKEND_API_URL | Functions URL | http://localhost:7071 |
次のステップ
- デプロイガイド - Azure へのデプロイ
- Scaffold ガイド - CRUD コード生成の詳細
