導入

MCP サーバーを使うと、カスタムデータソースに接続して、Cursor の中で使えるようにできる。ブラウザやデータベース、エラー/システムログみたいな場所からコンテキストが必要なときに特に役立つよ。MCP サーバーのセットアップはシンプルで、Cursor ならすぐに始められる。 このガイドでは、Postgres 向けの MCP サーバーをどう作るかを順番に紹介する。目標は、Cursor が Postgres データベースに対して直接 SQL クエリを実行できるようにして、テーブルスキーマを構造化された形で公開すること。
このチュートリアルは、MCP サーバー構築の基本を学ぶためのものだよ。

MCP サーバーって何?

MCP サーバー は、Cursor と通信して外部のデータやアクションにアクセスできるようにするプロセス。実装方法はいくつかあるけど、ここではいちばんシンプルなやり方を使うよ:stdio(標準入出力ストリーム)経由でローカルマシン上で動かすサーバー。これなら複雑なセキュリティ設計を避けつつ、MCP のロジックに集中できる。 MCP の代表的なユースケースのひとつがデータベースアクセス。ダッシュボードの構築、分析の実行、マイグレーションの作成では、データベースにクエリして中身を確認する場面がよくある。今回の Postgres MCP サーバーは、任意クエリの実行とテーブルスキーマの一覧という 2 つのコア機能をサポートする。 これらのタスクはどちらも素の SQL でできるけど、MCP はそれらをより強力で汎用的にする機能を提供してくれる。Tools はクエリ実行みたいなアクションを公開する手段を提供し、Resources はスキーマ情報みたいな標準化されたコンテキストを共有できるようにする。このガイドの後半では、さらに高度なワークフローを可能にする Prompts も見ていくよ。 内部では、postgres の npm パッケージを使ってデータベースに対する SQL ステートメントを実行する。MCP SDK はこれらの呼び出しをラップして、Postgres の機能を Cursor にシームレスに統合できるようにしてくれる。 [プレースホルダー: ツールとリソースを備えた MCP サーバーのイラスト]

MCP サーバーの作り方

サーバーを構築する最初のステップは、新しいプロジェクトをセットアップすること。新しいフォルダを作成して Bun プロジェクトを初期化するところから始める
> mkdir postgres-mcp-server
> Bun init
ここでは Blank プロジェクトを選ぶ。ボイラープレートができたら、必要な依存関係をインストールする。zod は MCP SDK における入出力スキーマの定義に必要
bun add postgres @modelcontextprotocol/sdk zod
次に、各ライブラリのリポジトリに移動して、それぞれの README の生ファイルへのリンクを取得する。サーバー実装時のコンテキストとしてこれらを使う 次に、サーバーの挙動をどう定義するか決める。そのために spec.md を作成して、ハイレベルなゴールを書き出す
# Spec

- Allow defining DATABASE_URL through MCP env configuration
- Query postgres data through tool
  - By default, make it readonly
  - Allow write ops by setting ENV `DANGEROUSLY_ALLOW_WRITE_OPS=true|1`
- Access tables as `resources`
- Use Zod for schema definitions
見てのとおり、これはかなり軽量な spec。必要に応じて自由に詳細を追加していい。README のリンクと合わせて、最終的なプロンプトを組み立てる
Read the following and follow @spec.md to understand what we want. All necessary dependencies are installed
- @https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md
- @https://raw.githubusercontent.com/porsager/postgres/refs/heads/master/README.md
この3つのコンポーネント(仕様、MCP SDK ドキュメント、Postgres ライブラリのドキュメント)がそろえば、Cursor を使ってサーバー実装のスキャフォールドを作れる。Cursor はパーツをつなぎ合わせて、MCP SDK と Postgres を結びつけるコードを生成してくれる。 いくつかプロンプトのやり取りを重ねた結果、MCP サーバーの最初のバージョンができた。試してみるには、MCP Inspector を使う
npx @modelcontextprotocol/inspector bun run index.ts

MCP サーバーのテスト

初期実装が完了したら、MCP Inspector でテストしよう。Inspector は、サーバーがどんなエンドポイントを公開しているかを可視化し、tools と resources が想定どおりに動作するか検証するための手段を提供してくれる。クエリを実行できること、スキーマ情報が正しく返ることを確認してね。 MCP Inspector interface 問題なさそうなら、サーバーを Cursor 本体に接続して実環境で試そう。この時点で、Cursor は Postgres MCP サーバーを組み込み機能のように扱えるようになり、データベースに直接クエリしたり、調査・確認できる。

次のステップ

stdio 経由でローカルに MCP サーバーを走らせるのはいい出発点だけど、チームでは MCP サーバー経由で同じデータベースに共有アクセスしたいことが多い。そんな場合は、MCP サーバーを集中型の HTTP サービスとしてデプロイする必要がある。 デプロイした MCP サーバーは、個々の stdio インスタンスより次の点で優れている:
  • 共有データベースアクセス: 複数のメンバーが Cursor 経由で同一のデータベースインスタンスにクエリできる
  • 集中管理された設定: スキーマ更新や権限変更を一箇所で管理できる
  • 強化されたセキュリティ: 適切な認証、レート制限、アクセス制御を実装できる
  • 可観測性: チーム全体の利用パターンやパフォーマンス指標を横断的に監視できる
これを実現するには、トランスポートを stdio から HTTP に切り替えよう。 セットアップ全体は扱わないけど、Cursor に渡す出発点としてはこのプロンプトが使える:
Based on the existing MCP server, create a new file that implements the HTTP protocol.

Move shared logic to mcp-core, and name each transport implementation by name (mcp-server-stdio, mcp-server-http)

@https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md 
最終的な成果はここで見られる: pg-mcp-server