はじめに

MCP サーバーを使うと、カスタムのデータソースに接続して、Cursor の中で使えるようにできる。これは、ブラウザやデータベース、エラー/システムログといった場所からコンテキストが必要なときに特に便利。MCP サーバーのセットアップは簡単で、Cursor ならすぐに終わる。 このガイドでは、Postgres 向けの MCP サーバーを作る手順を解説する。目的は、Cursor が Postgres データベースに対して直接 SQL クエリを実行できるようにし、テーブルスキーマを構造化して公開できるようにすること。
このチュートリアルは、MCP サーバー構築の基礎を学ぶためのものだよ。

MCP サーバーとは?

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

MCPサーバーの構築方法

サーバーを作る最初のステップは、新しいプロジェクトのセットアップ。まずは新しいフォルダーを作って、Bunプロジェクトを初期化しよう
> mkdir postgres-mcp-server
> Bun init
ここでは Blank プロジェクトを選ぶ。ボイラープレートのセットアップが終わったら、必要な依存関係をインストールする。zod は MCP SDK で I/O のスキーマを定義するのに必要だよ
bun add postgres @modelcontextprotocol/sdk zod
次に、各ライブラリのリポジトリから、それぞれの README の生ファイル(raw)へのリンクを取得する。これらをサーバー実装時のコンテキストとして使う 次に、サーバーの挙動をどうするかを決めよう。そのために 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
見てのとおり、かなり軽量な仕様。必要に応じて自由に詳細を足してOK。README のリンクと合わせて、最終的なプロンプトを組み立てよう
Read the following and follow @spec.md to understand what we want. All necesary dependeies 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 は、サーバーが公開している内容を確認し、ツールやリソースが期待どおりに動作するか検証する手段を提供する。クエリを実行できること、スキーマ情報が正しく返ってくることを確認してね。 MCP Inspector interface 問題なさそうなら、サーバーを Cursor に接続して実環境で試そう。この時点で、Cursor は Postgres MCP サーバーを組み込み機能のように扱えるようになり、データベースに直接クエリしたり、状態を確認したりできる。

次のステップ

stdio 経由でローカルに MCP サーバーを動かすのはいい出発点だけど、チームでは MCP サーバーを通して同じデータベースへ共有アクセスしたいことが多い。そんなときは、MCP サーバーを中央集約型の HTTP サービスとしてデプロイする必要がある。 デプロイ済みの MCP サーバーには、個々の stdio インスタンスに対して次のメリットがある:
  • 共有データベースアクセス: 複数メンバーが Cursor 経由で同じ DB インスタンスにクエリできる
  • 集中管理された設定: スキーマ更新や権限変更を一元管理できる
  • 強化されたセキュリティ: 適切な認証、レート制限、アクセス制御を実装できる
  • 可観測性: チーム全体の利用状況やパフォーマンス指標を監視できる
これを実現するには、トランスポートを 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