クイックスタート
このウォークスルーでは、ゼロから、あなたが理解できる稼働中の
Kozou スタックまでを案内します。あなたは PostgreSQL スキーマを書き、
Kozou はそれを一度読み込んで、同じ DDL と COMMENT から Admin UI、
REST レイヤー、MCP コンテキストを提供します — 定義の重複はありません。
所要時間は約 10 分を見込んでください。終わるころには、ローカルで 稼働するスタックと、MCP 経由であなたのスキーマを読む AI エージェントが 手元にあります。
最終的に手に入るもの
Section titled “最終的に手に入るもの”- PostgreSQL — スキーマの単一の信頼できる情報源。
- REST レイヤー — v0.1 では PostgREST が提供し、並列の コンテナとして起動されます。
- Admin UI — あなたのテーブルとビューから生成される、ブラウザ 上の CRUD インターフェース。ポート 3333 で動作します。
- MCP エンドポイント — AI エージェント向けの読み取り専用スキーマ コンテキスト。ポート 3334 の HTTP 経由、またはエージェントを直接 接続する stdio 経由で利用できます。
- PostgreSQL 16 以降 — 正準的な信頼できる情報源。scaffold された スタックは独自の PostgreSQL コンテナを起動するため、このウォーク スルーではローカルへのインストールは不要です。
- Docker 24 以降 —
docker compose upスタックのために推奨します。 - Node.js 20 以降 — 公開パッケージを
npxで直接実行するために 必要です。
npx を使う代わりに CLI をグローバルにインストールしたい、あるいは
ランタイムイメージを pull したい場合は、インストール
を参照してください。
1. create-kozou で scaffold する
Section titled “1. create-kozou で scaffold する”create-kozou は単体の npm パッケージではなく、kozou パッケージの
セカンダリ bin として配布されています。そのため、クリーンなマシンで
npx がそれを見つけるには -p kozou が必要です:
npx -p kozou create-kozou my-projectcd my-projectこれにより、バンドルされたテンプレートからプロジェクトディレクトリが 書き出されます。生成された内容を見てみましょう:
my-project/├── docker-compose.yml # PostgreSQL + PostgREST + a `kozou` service├── kozou.config.yaml # database URL, adapter, and UI-hints path├── ui-hints.yaml # optional per-column label / widget overrides├── .env.example # template for the env vars the stack reads└── migrations/ # your schema; starts with a placeholder 0001_init.sql一行ずつ説明します:
docker-compose.yml— PostgreSQL、PostgREST(REST レイヤー)、 そしてkozou devを実行して Admin UI と MCP HTTP サーバーをホスト するkozouサービスを起動します。kozou.config.yaml— Kozou をあなたのデータベース (${DATABASE_URL})に向け、REST アダプターを選択し、UI ヒントを 参照します。${VAR}と${VAR:-default}は読み込み時に環境変数 から展開されます。ui-hints.yaml— データベースに触れずに、カラムのラベル、入力 ウィジェット、表示フィールドを上書きするためのオプションファイル です。ヒューリスティクスとCOMMENTタグでほとんどのケースをカバー できるため、これは最初はほぼ空です。.env.example—DATABASE_URLを含む、スタックが読み込む環境 変数のテンプレートです。次のステップで.envにコピーします。
スターターの migrations/0001_init.sql は空のプレースホルダーです。
そこにあなた自身の CREATE TABLE / CREATE VIEW / COMMENT ON …
ステートメントを追加してください — 例えば products テーブル、
orders テーブル、authors/books のリレーションなどです。Kozou は
そのスキーマを、以下で見ていく Admin UI と MCP コンテキストに変換
します。
2. スタックを起動する
Section titled “2. スタックを起動する”env テンプレートをコピーし、すべてを起動します:
cp .env.example .envdocker compose upkozou サービスは kozou dev(バンドルされた SvelteKit Admin UI と
MCP HTTP サーバー)を実行するため、docker compose up は一つの
コマンドでフルスタックをオンラインにします。デフォルトのポートは
次のとおりです:
- Admin UI —
http://localhost:3333 - MCP HTTP —
http://localhost:3334
これらを変更するには、kozou.config.yaml で server.ui /
server.mcp.http を設定します。バックグラウンドで実行するには -d
を追加します。
3. Admin UI を見て回る
Section titled “3. Admin UI を見て回る”http://localhost:3333 を開きます。Admin UI は完全にあなたのスキーマ
から生成されます — 書くべき UI コードはありません。
- ダッシュボード — すべてのテーブルを一覧し、別のセクションで すべてのビューを一覧します。それぞれにラベルと説明の抜粋が付き ます。エントリをクリックすると開きます。
- リストビュー — テーブルについて、表示フィールドを先頭に、 主要なカラムを並べて行を表示します。検索(カラムをまたいだ 大文字小文字を区別しないマッチ)、ソート(カラムヘッダーを クリックして昇順/降順を切り替え)、ページネーション(1 始まり、 デフォルトで 1 ページあたり 50 行)に対応しています。
- 作成・編集フォーム — テーブルのカラムから生成され、ウィジェット
を意識した入力を備えます: enum カラムはドロップダウンとして、
boolean はチェックボックスとして、日付は日付ピッカーとして描画され、
以下同様です。データベースのデフォルト(
created_atなど)のみで 埋められるカラムは、編集フォームでは読み取り専用になります。 - 外部キーのリレーションピッカー — 外部キーのカラムは、参照先の 行のラベルを解決する検索可能なコンボボックスとして描画されるため、 関連するレコードを id ではなく名前で選べます。
- 読み取り専用ビュー — ビューは、同じ検索、ソート、ページネーション を備えたリストとして開きますが、作成、編集、削除のコントロールは ありません。
4. MCP 経由で AI エージェントを接続する
Section titled “4. MCP 経由で AI エージェントを接続する”Kozou は Model Context Protocol 経由で、あなたのスキーマを AI エージェント
に公開します。Claude Code や Claude Desktop からの直接接続には、
kozou mcp --stdio を MCP サーバーとして登録します。
エージェントの MCP 設定にエントリを追加します。バンドルされた
kozou.config.yaml 内の ${DATABASE_URL} プレースホルダーは
DATABASE_URL 環境変数を消費するため、ここで渡します:
{ "mcpServers": { "kozou": { "command": "npx", "args": ["-y", "kozou", "mcp", "--stdio"], "env": { "DATABASE_URL": "postgres://kozou:kozou@localhost:5432/kozou" } } }}登録すると、エージェントは 6 つの読み取り専用ツールを呼び出せます。 これらはコンテキストプロバイダーにすぎません — SQL を生成したり、 SQL を実行したり、データを書き込んだりは決してしません:
list_tables— テーブル名と、そのラベルおよび説明。describe_table— 一つのテーブルの完全なスキーマとCOMMENT。list_views— ビュー名と、その目的。describe_view— ビューのカラム、目的、基となるテーブル。list_concepts— ビュー 1 つにつき 1 つのビジネス概念。get_concept_context— 概念に関連するテーブルと、推奨される クエリパス。
ステップ 2 で起動したスタックも、ポート 3334 の HTTP 経由でこれらと 同じツールを提供します。これは、エージェントが自前のプロセスを 起動するのではなく、稼働中のコンテナに接続するときに使うトランス ポートです。
5. COMMENT で注釈を付ける
Section titled “5. COMMENT で注釈を付ける”Kozou は通常の PostgreSQL の COMMENT テキストを読み込みます。いくつ
かの接頭辞タグは構造化されたヒントとして抽出されます — @ai、
@widget、@policy、@example です。カラムにコメントを追加します:
COMMENT ON COLUMN products.status IS 'Lifecycle state of the product. draft: not yet visible published: visible in public listings archived: retired from sale
@ai: prefer the published view for public listings @widget: enum-select';このひとつのコメントから、2 つのことが起こります:
@widget: enum-selectは Admin UI の入力を変えます。プレーンな テキストフィールドの代わりに、products.statusはドロップダウンと して描画されるようになります。@widgetはカラムコメントでのみ 尊重されます。(これがなくても、Kozou はCHECK制約がstatus IN ('draft','published','archived')のような値リストである カラムに対してenum-selectを推論します — このタグはそれを明示的に 上書きするものです。)@ai: …は MCP コンテキストに届きます。このメモはdescribe_tableやget_concept_contextといったツールを通じて surface されるため、クエリを書くエージェントはあなたのガイダンスを 目にします。@ai行は人間が読める本文にも残るので、コメントは 依然として自然に読めます。
規約の全体については、 COMMENT 規約を参照してください。
トラブルシューティング
Section titled “トラブルシューティング”- ポートが既に使用中 — 別のプロセスが 3333 または 3334 にバインド
されています。それを停止するか、
kozou.config.yamlのserver.ui/server.mcp.http(およびdocker-compose.ymlの対応するマッピング) でポートを再マッピングしてください。 - データベースに到達できない —
.envのDATABASE_URLがdocker-compose.ymlの PostgreSQL サービスと一致していること、 そしてデータベースコンテナが healthy であること(docker compose ps) を確認してください。初回起動が遅い場合、PostgreSQL が接続を受け付ける 準備が整う前に他のサービスが起動することがあります。 - Admin UI のフォーム POST が拒否される — Admin UI はプレーンな
HTTP で提供されるため、SvelteKit は
ORIGINを必要とします。scaffold はORIGIN=${KOZOU_ORIGIN:-http://localhost:3333}を設定します。 Admin UI のポートを再マッピングした場合は、それと同期を保ってください。 create-kozouが見つからない —npx -p kozou create-kozou …として実行したことを確認してください。これはkozouパッケージの セカンダリ bin であり、単体のものではありません。
- COMMENT 規約 — すべてのタグ
(
@ai、@widget、@policy、@example)と、それぞれがどう解析 されるか。 - 出力されるサーフェス — Admin UI、 REST レイヤー、MCP がそれぞれ何を公開するか、そしてなぜか。
- インストール — グローバルインストール、ランタイム
イメージ、そしてワークスペースパッケージ(
@kozou/core、@kozou/introspect、@kozou/mcp、@kozou/svelte-ui)をライブラリと して使う方法。
v0.1 の REST レイヤーは PostgREST が提供します。v0.2 系では、実験的な
自社製 REST レイヤー @kozou/api が追加され、kozou dev --adapter api
で有効化できます。これは実験的なものであり、デフォルトではありません。