MCP 経由で AI エージェントを接続する
Kozou は MCP サーバーを同梱しており、
PostgreSQL スキーマを AI エージェント向けの構造化されたコンテキストとして
公開します。接続すると、Claude Code や Claude Desktop のようなエージェントが、
テーブル・ビュー・ビジネス概念が何を意味するか — COMMENT に書いた説明、
@ai ノート、サンプルクエリ — を、7 つの読み取り専用ツールを通じて
読み取れるようになります。
このページでは両方のトランスポートを扱います。サーバー自体を起動する
ローカルエージェント向けの stdio と、Docker やリモート用途向けの
HTTP です。コマンドリファレンスは kozou mcp を
参照してください。各ツールが返す内容については
3 つの出力面 を参照してください。
到達可能な PostgreSQL データベースを持つ Kozou プロジェクトが必要です。
サーバーは DATABASE_URL 接続文字列を読み取ります — CLI の他の部分が使うのと
同じもので、${DATABASE_URL} プレースホルダを通じて kozou.config.yaml に
展開されます。一般的な接続文字列は次のようになります。
postgres://USER:PASSWORD@HOST:5432/DBNAMEアプリケーションコードを書く必要はありません。サーバーはスキーマと
COMMENT テキストを読み取り、そのまま提供します。
ホスティングされたデータベース(Supabase、Neon、RDS など)に接続しますか?
マネージドな PostgreSQL は TLS を必須とします。Kozou は DATABASE_URL を
ドライバにそのまま渡し、SSL を自動では付与しません。そのため sslmode
パラメータを付けないと、サーバーが接続を拒否します。
sslmode=require が通るかどうかは、プロバイダの証明書によります。
公的に信頼された証明書(例: Neon)は、現状 Node 組み込みの CA ストアで
検証され、require がそのまま通ります。
postgres://USER:PASSWORD@HOST:PORT/DBNAME?sslmode=requireプライベート CA を提示するプロバイダ(Supabase や AWS RDS など)は、
その CA ストアで検証できないため、require は証明書エラーで失敗します。
代わりに次のいずれかを使ってください。
# 安全 — プロバイダ自身の CA で検証する(CA はダッシュボードから取得):postgres://USER:PASSWORD@HOST:PORT/DBNAME?sslmode=verify-full&sslrootcert=/path/to/ca.crt# 最も簡単 — 証明書を検証せず接続だけ暗号化する(信頼できないネットワークでは避ける):postgres://USER:PASSWORD@HOST:PORT/DBNAME?sslmode=no-verifyまだデータベースが無いですか? 先にクイックスタートの
デモを動かしてください — docker compose up で seeded な PostgreSQL が
立ち上がり、このガイドで使える接続文字列
postgres://kozou:kozou@localhost:5432/kozou がそのまま手に入ります。
stdio の経路: Claude Code、Claude Desktop、Cursor
Section titled “stdio の経路: Claude Code、Claude Desktop、Cursor”ローカルエージェントの場合、kozou mcp --stdio をクライアントの設定に MCP
サーバーとして登録します。エージェントは必要に応じてプロセスを起動し、標準
入出力を通じてやり取りします — ポートを待ち受けるものは何もありません。
mcpServers の下にエントリを追加します。この形式は、標準的な設定形式に従う
任意の MCP クライアントで動作します — Claude Code、Claude Desktop、Cursor は
いずれも従っています — が、各クライアントで保存場所が異なります(下記の
どこに登録するか を参照)。
{ "mcpServers": { "kozou": { "command": "npx", "args": ["-y", "kozou", "mcp", "--stdio"], "env": { "DATABASE_URL": "postgres://USER:PASSWORD@HOST:5432/DBNAME" } } }}このエントリに関するいくつかの注意点です。
npx -y kozou mcp --stdioは、グローバルインストールせずに公開されたkozouパッケージを実行します。-yはインストールプロンプトをスキップ します。すでにkozouをグローバルにインストールしている場合は、"command": "kozou"と設定し、argsから"kozou"を取り除けます。DATABASE_URLは、kozou.config.yaml内の${DATABASE_URL}プレースホルダを通じて同梱の CLI に読み取られます。クライアントの周囲の 環境に頼るのではなく、示したとおりenvブロックに設定してください。stdioはデフォルトのトランスポートなので、--stdioは明示的ではあり ますがデフォルトと一致します。サーバーはキャッシュされたスキーマを更新するSIGHUPハンドラをインストールするため、長時間稼働するプロセスは再起動 なしで DDL やCOMMENTの変更を取り込めます。
どこに登録するか
Section titled “どこに登録するか”上記の JSON は形式であり、各クライアントはそれを異なる場所に保存します。
Claude Code(CLI) — 最も手早いのは claude mcp add で、エントリを
自動で書き込みます。
claude mcp add kozou \ --env DATABASE_URL="postgres://USER:PASSWORD@HOST:5432/DBNAME" \ -- npx -y kozou mcp --stdio-- の後はすべてサーバーコマンドとしてそのまま渡されます。--scope project
を付けると、個人設定ではなくプロジェクトルートの共有 .mcp.json(チームで
git に入れるもの)に書き込まれます。claude mcp list で接続を確認できます
(kozou … ✓ Connected と表示されるはずです)。
Claude Desktop — Settings → Developer → Edit Config(ファイルが無ければ
作成されます)を開き、mcpServers の下にエントリを追加します。ファイルの
場所は次のとおりです。
| OS | パス |
|---|---|
| macOS | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Windows | %APPDATA%\Claude\claude_desktop_config.json |
| Linux | ~/.config/Claude/claude_desktop_config.json |
保存後はアプリを完全に終了して開き直してください — 設定は起動時に読み込まれます。
開き直すと、メッセージ入力欄の 🔨 ツールアイコンに kozou サーバーとその
ツールが表示されるはずです。
Cursor — プロジェクトルートの .cursor/mcp.json(グローバルにする場合は
~/.cursor/mcp.json)にエントリを追加するか、Settings → Features → MCP →
Add New MCP Server を使います。編集後は Cursor を再起動してください。その後
Settings → Features → MCP に kozou が緑のドットとツール数とともに表示されます。
その後、7 つのツールが kozou というサーバー名でエージェントに表示されます。
表示されない場合は、下の「ツールが表示されないとき」を確認してください。
HTTP の経路: Docker とリモート
Section titled “HTTP の経路: Docker とリモート”コンテナ化された構成やリモート構成の場合は、代わりにサーバーを HTTP で 実行します。これは、標準的な MCP クライアントがプロセスを起動するのではなく URL に接続するときに話すトランスポートです。
DATABASE_URL=postgres://USER:PASSWORD@HOST:5432/DBNAME \ npx kozou mcp --http --port 3334HTTP サーバーはデフォルトでポート 3334 を待ち受け、MCP エンドポイントを
/mcp で提供します。また POST /admin/refresh も公開します。これは stdio の
SIGHUP ハンドラに対応する HTTP モードのもので、キャッシュされたスキーマを
無効化し、次のリクエストでデータベースを再読み込みさせます。
kozou dev は、この同じ HTTP サーバーを Admin UI と並べて立ち上げます —
UI はポート 3333、MCP HTTP サーバーは 3334 で、kozou.config.yaml から
配線されます。すでに kozou dev を実行している場合は、別途コマンドを
実行しなくても MCP エンドポイントが http://localhost:3334/mcp で有効に
なっています。kozou dev と
Admin UI を生成する を参照してください。
クライアントをその URL に向けるには、上記の stdio エントリと同じ要領で、 HTTP 形式で登録します。Claude Code の場合:
claude mcp add --transport http kozou http://localhost:3334/mcpまたは claude_desktop_config.json / .cursor/mcp.json を手で編集する場合は、
command / args の代わりに URL 形式を使います。
{ "mcpServers": { "kozou": { "type": "http", "url": "http://localhost:3334/mcp" } }}バインドと公開
Section titled “バインドと公開”デフォルトでは、HTTP サーバーは 127.0.0.1(ループバックのみ)にバインド
します。リスナーは --host と --port で変更できます。
| フラグ | デフォルト | 役割 |
|---|---|---|
--port <n> | 3334 | HTTP サーバーが待ち受ける TCP ポート。 |
--host <addr> | 127.0.0.1 | バインドするインターフェース。 |
MCP HTTP トランスポートはデフォルトでは無認証です。ループ
バック以外のホストにバインドすると、サーバーは大きな警告を表示します。その
アドレスに到達できる者は誰でもデータベースのスキーマメタデータを読み取れる
からです。ツールはスキーマメタデータのみを公開し — SQL の実行もデータ
アクセスもないため、影響範囲は限定されます — それでも、信頼されたネット
ワークと外部の認証/プロキシ層の背後に置く場合、または OAuth
resource-server モード (server.mcp.http.auth) を有効にする場合を除いて、
サーバーはループバックに留めておくべきです。後者は毎リクエストにあなた自身の
ID プロバイダの検証済み bearer トークンを要求します — リモート MCP と
OAuth を参照してください。
試してみる: 違いを見る
Section titled “試してみる: 違いを見る”kozou のツールが現れたら、答えが列の型ではなくビジネスルールに依存する問いを
エージェントに尋ねます。クイックスタートのデモに対して:
kozou のツールを使って、当社の総認識売上はいくらですか? どの行とカラムを 除外したか、その理由も説明してください。
Kozou を備えたエージェントは describe_table / get_concept_context を呼び、
vw_recognized_revenue ビューを見つけ、120.00 と答えます — 除外した社内
テスト注文と論理削除済みの行を名指しで挙げながら。同じ問いをツールなしで尋ねれば、
もっともらしい間違った数字が返ります(デモの当たり前のクエリは 4.8 倍 ずれ
ます)。その対比こそが Kozou の価値です。
接続後にエージェントができること
Section titled “接続後にエージェントができること”サーバーは 7 つのツール、すべて読み取り専用のコンテキストプロバイダを 公開します。
| ツール | 返すもの |
|---|---|
list_tables | テーブル名と、そのラベル・説明・プランナーによる行数推定。 |
describe_table | 1 つのテーブルの完全なスキーマと COMMENT: 列、型、NULL 許容性、主キー、外部キー関係、チェック制約。 |
list_views | ビュー名と、そのラベル・目的。 |
describe_view | ビューの列、目的、依存先のテーブル、その SQL 定義。 |
list_concepts | ドメイン概念。それぞれビューに裏付けられています。 |
get_concept_context | 概念に関連するテーブル、推奨されるクエリソース、結合の提案、サンプルクエリ。 |
describe_functions | RPC アクション として公開された関数 (@expose: rpc) のシグネチャと、その @ai・@policy の助言ノート。 |
これらによって、エージェントはスキーマの形だけでなく意味を — そして
それをクエリする推奨方法を — 読み取ります。describe_table、
describe_view、get_concept_context はそれぞれ、@ai タグで書いた AI 向け
ノートを携えるため、「売上の数値には、ビュー vw_orders_paid を優先する」と
いったガイダンスがエージェントに直接届きます。@example で書いたサンプル
クエリは、get_concept_context を通じて { description, sql } エントリの
リストとして表面化します — 概念に対する推奨クエリ経路です。(これらのタグが
どのように解析されるかについては、
COMMENT の規約 を参照してください。)
たとえば、orders テーブルについて尋ねられたエージェントは、describe_table
を呼び出してその列と外部キーを把握し、次に paid-orders 概念に対して
get_concept_context を呼び出して、推奨される FROM ソースとサンプルの売上
クエリを見つけます — すべて、プロンプトにスキーマを一切貼り付けることなく。
何に触れてよいかをエージェントに伝える
Section titled “何に触れてよいかをエージェントに伝える”describe ツールは既定ではスキーマ全体を対象とし、誰が尋ねているかに関係なく
すべてのテーブル・列を見せます。Kozou をあるロールに向けてオプトイン
(introspection.respectPrivileges: true と
role) すると、describe_table / describe_view は各リレーションにそのロールの
実効権限 — テーブルレベルの SELECT / INSERT / UPDATE / DELETE、および
テーブルの列ごとの insertable / updatable — も注記します。これにより
エージェントは、試す前に「orders は読めるが書けない」と分かります。施行はするが
説明しない query 層には、エージェントへ渡せない差別化です。
Admin UI の権限モード と違い、MCP ツールは隠さずに
注記します。ロールが SELECT すらできないテーブルも "select": false と
マークされて残るので、エージェントは失敗して気づくのではなく、限界を伝えられ
ます。Kozou が既に読み取っている権限を再利用するため追加クエリはなく、内容は
advisory のみ — 施行は常に PostgreSQL (ロールの GRANT とあなたの RLS ポリシー) に
残ります。kozou docs は同じ情報をテーブルごとの Security セクションとして
出力します。オプトインの call 実行ツールを有効にすると、注記されるロールは
call が実行されるロールと連動するので、エージェントが伝えられる内容と実際に
できることが食い違いません。
テーブルが行フィルタされることをエージェントに伝える
Section titled “テーブルが行フィルタされることをエージェントに伝える”テーブルレベルの権限は「そもそもこのテーブルに触れてよいか」に答えます。行レベル
セキュリティ (RLS) はより細かい問い — 「どの行か」「この書き込みは受理される
か」 — に答えるもので、Kozou はこれも surface します。describe_table は
RLS で保護された
テーブルに rowSecurity シグナルを出します。enabled か、forced か (テーブル
所有者にも適用)、ポリシーが 1 つでも存在するか、です。RLS が有効なとき、ツールは
プレーンテキストの note を添え、見えている行はフィルタされ得る・書き込みは拒否
され得るとエージェントに告げます。これにより、結果を全体だと思い込まなくなります。
このシグナルは既定で ON です。ロール固有の権限ではなくテーブルの構造的事実
なので、オプトインは要りません。出力されるのはテーブルのみです — ビュー自身は
RLS フラグを持たず、基礎テーブルをマスクするかは security_invoker 次第なので、
Kozou はビューが「フィルタされない」と主張しません。知っておく価値のあるケース:
RLS が有効でもポリシーが無いテーブルは default-deny で、所有者以外のロールは
何も見えず何も書けません。note はそれも伝えます。
重要な点として、Kozou が読むのは真偽値だけで、ポリシーの式
(USING / WITH CHECK) は決して読みません。これらの述語はあなたの認可モデル
そのものを符号化するため、データベース内に留め、エージェントのコンテキストには
出しません。テーブルが行フィルタされると知っても、エージェントがフィルタを回避
できるわけではありません — 施行は、エージェントが知っているか否かに関わらず
PostgreSQL が行います。kozou docs も同じ行をテーブルごとに出力します。
読み取り専用の安全境界
Section titled “読み取り専用の安全境界”7 つのツールのいずれも、SQL を生成したり、SQL を実行したり、データを書き込んだり
しません。スキーマメタデータと COMMENT テキストを返すだけで、それ以外は何も
しません — describe_functions は公開された RPC アクションのシグネチャを列挙
しますが、アクションの実行は MCP ではなく REST サーフェスに属します。MCP 経由で
Kozou に接続したエージェントは、スキーマが何を意味するかを
読み取れますが、この面を通じてデータを変更することはできません — どちらの
トランスポートでも、ツールセットに書き込み経路は存在しません。
これはまた、HTTP サーバーがループバックにバインドでき、それ以外では大きく警告
する理由でもあります。公開された MCP エンドポイントの最悪のケースは、スキーマ
メタデータの開示であって、データの損失ではありません。エージェントが行の読み
書きを必要とする場合、それは別の面に属します — REST API(v1.0 以降は
内製の @kozou/api がデフォルト、または kozou dev --adapter postgrest で
オプトアウトする外部の PostgREST)であって、MCP ではありません。
本番にエージェントを安全に向ける
Section titled “本番にエージェントを安全に向ける”爆発半径を小さく保つ 2 つのデプロイ選択があり、上記のシグナルと噛み合います:
- introspection をスコープする。 Kozou は向けたスキーマしか見ません。最も 機密性の高いテーブルをスコープ外に置けば、エージェントはそれらについて一切 推論しません。
- 広く読み取り中心の可視性を持つロールで接続する。
rowSecurityシグナルは ロール非依存なので、接続ロール自身のポリシーが滅多にフィルタしない場合でも、 どのテーブルが行フィルタされるかはエージェントに伝わります — 特権的な書き込み 経路を渡すことなく、正直なコンテキストを与えられます。
ツールが表示されないとき
Section titled “ツールが表示されないとき”接続後にエージェントが kozou のツールを表示しない場合は、次の順に確認して
ください。
- サーバーを手動で起動する。 最も手早い確認は、自分で起動してエラーを
読むことです。
起動して標準入力を待つはずです。サーバーはデータベースに 遅延接続 するため、
Terminal window DATABASE_URL=postgres://USER:PASSWORD@HOST:5432/DBNAME npx -y kozou mcp --stdioDATABASE_URLの指す先が誤っていても(ホスト・ポート・認証情報の誤り)、 データベースに到達できなくても、起動してツールを列挙します — その問題はここ ではなく、最初のツール呼び出し時に表面化します(下の「ツールは表示されるが 呼び出しが全て失敗する」を参照)。逆にプロセスが即座に終了する場合は、原因は データベースではなくコマンド・環境・設定です —npxが見つからない、パッケージ名が 違う、インストールが壊れている、あるいは設定ファイルの不備(kozou.config.yamlのパースエラー、必須項目の欠落、DATABASE_URLが空/未設定)など。クライアントは サーバーが「失敗した」とだけ報告し理由を示さないので、ここで実際のエラーを 読みます。 - 状態を確認する(Claude Code)。
claude mcp listは各サーバーを接続済み か失敗かで報告し、claude mcp get kozouは解決されたコマンドと環境変数を 表示します。 npxには絶対パスを使う。 クライアントがnpxを見つけられない場合 (spawn ENOENTエラー)、commandにフルパスを書きます —which npxで 調べられます(例:/usr/local/bin/npx)。- JSON を検証する。 末尾のカンマや引用符の無いキーがあると、設定全体が
黙って失敗します。
python3 -m json.tool < <設定ファイル>で確認してください。 - 編集後は再起動する。 Claude Desktop と Cursor は起動時に設定を読み込み
ます — アプリを完全に終了して開き直してください。Claude Code はセッション
開始時に
.mcp.jsonを再読み込みします。 - 初回実行は遅いことがある。
npx -yは初回実行時にパッケージをダウン ロードします。クライアントがタイムアウトする場合はMCP_TIMEOUT=60000(Claude Code)を設定するか、ダウンロード完了後に開き直してください。
Claude Desktop は各サーバーのログを ~/Library/Logs/Claude/(macOS)または
%APPDATA%\Claude\logs\(Windows)に書き込みます — mcp-*.log ファイルに
サーバー自身の出力が記録されます。
ツールは表示されるが呼び出しが全て失敗する
Section titled “ツールは表示されるが呼び出しが全て失敗する”kozou のツールは一覧に出るのに、呼び出すと毎回 「Schema is currently
unavailable」 が返る場合、サーバーの起動とクライアントとの接続は成功していて、
データベースに到達できていないだけです。これは MCP ではなく DATABASE_URL の
問題です。ホスト・ポート・認証情報を確認し、ホスト型データベースなら sslmode
パラメータ(最も多い原因)も確認してください(上の「始める前に」を参照)。
手順 1 のようにサーバーを手動で起動すると、背後の PostgreSQL エラーが標準
エラーに出力されます。
次に読むもの
Section titled “次に読むもの”kozou mcp— コマンドリファレンス: フラグ、トランス ポート、リフレッシュエンドポイント。- COMMENT の規約 —
@ai、@example、 その他のタグが、エージェントが見る内容をどう形作るか。 - 3 つの出力面 — MCP コンテキストが Admin UI や REST API とどう並ぶか。