Azure Database for PostgreSQL 向け Model Context Protocol (MCP) Server 

## 概要

Azure Database for PostgreSQL Flexible Server (PGFX) に対応する Model Context Protocol（MCP）サーバーのパブリックプレビューが発表されました。MCP は、AI モデルが外部のデータソースやツールと標準化された方法でやり取りするためのオープンプロトコルです。これにより、AI アプリケーションが PGFX にホストされたデータと安全かつスケーラブルに統合できるようになります。

https://techcommunity.microsoft.com/blog/adforpostgresql/introducing-model-context-protocol-mcp-server-for-azure-database-for-postgresql-/4404360

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958625/8e48b8eb-0866-4792-946b-cf7832883322.png)

## MCP の概要
急速に拡大が進んでいる MCP ですが、さまざまな領域で MCP サーバーの公開などが盛んになっています。MCP のメリットとしては、以下の点が挙げられます。 　

- 標準化された通信: MCP は、AI モデルが外部ツールとやり取りするための構造化された方法を提供
- 安全でスケーラブル: アプリケーションとの安全でスケーラブルな統合を実現

### MCP のアーキテクチャ
MCP には、以下のコンポーネントが含まれます。今回の発表では、PGFX の MCP サーバーが公開されたので、MCP クライアントから、PGFX をデータソースとして扱うことができるようになりました。

- MCP Host: Copilot Studio、GitHub Copilot、Claude Desktop のような MCP を通じてデータにアクセスしようとする AI アプリケーション、エージェント、プログラム、またはツール
- MCP Client: MCP Host に含まれ、1つ以上の MCP サーバーに接続し、アプリケーションの AI モデルとそれらのサーバー間で情報を中継する役割を担うクライアントコンポーネント
- MCP Server: データソース、サービス、または API とインターフェースを持ち、MCP クライアントに対して以下の標準化された機能やアクションを提供する軽量プログラム
    - Tools: AI モデルが情報を取得したり、メッセージを送信したり、データベースのレコードを更新したりするために呼び出すことができる関数
    - Resources: アプリケーションと MCP サーバーが相互作用するための豊富なインターフェースを提供する AI アプリケーションに公開するデータ、ファイル、またはドキュメント
    - Prompts: アプリケーションユーザーが特定のタスクを達成するために効果的な AI インタラクションを要求するための事前定義されたテンプレート


### データフロー
MCP を利用した際のデータフローは以下のようになります。

- AI モデルが要求を送信（例: 「ユーザープロファイルデータを取得」）
- MCP クライアントが要求を適切な MCP サーバーに転送
- MCP サーバーがデータベースや API から必要なデータを取得
- MCP クライアントを介して AI モデルに応答を返送

これにより、AI モデルは静的な知識に限定されず、PGFX をデータソースとしてアクセスできます。

## 構築手順
以下では PGFX の MCP サーバーの構築と Claude Desktop、GitHub Copilot をクライアントとした場合の設定手順に関してまとめます。

<ol><li> azure-postgresql-mcp リポジトリから クローン

https://github.com/Azure-Samples/azure-postgresql-mcp/

```python
git clone https://github.com/Azure-Samples/azure-postgresql-mcp.git 
cd azure-postgresql-mcp
```

<li> 仮想環境の作成

※ 以下は Windows OS のサンプルですが、その他の OS に関してはリポジトリに説明があります。

```Python
python -m venv azure-postgresql-mcp-venv 
.\azure-postgresql-mcp-venv\Scripts\activate
```

<li> 依存関係をインストール

```python
pip install mcp[cli] 
pip install psycopg[binary]
pip install azure-mgmt-postgresqlflexibleservers
pip install azure-identity
```
</ol>




### オプション 1 : Claude Desktop から実行
<ol><li>　Claude Desktopアプリで、[設定]ペインに移動し、[開発者]タブを選択して、[構成の編集]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958625/8fcfc3b0-5d57-41dc-b9da-442bb1a82372.png)


<li>　"claude_desktop_config.json" ファイルを開き、次の構成を "mcpServers" セクションに追加して、Azure Database for PostgreSQL MCP サーバーを構成します。

```json
{
    "mcpServers": {
        "azure-postgresql-mcp": {
            "command": "<path to the virtual environment>\\azure-postgresql-mcp-venv\\Scripts\\python",
            "args": [
                "<path to azure_postgresql_mcp.py file>\\azure_postgresql_mcp.py"
            ],
            "env": {
                "PGHOST": "<Fully qualified name of your Azure Database for PostgreSQL instance>",
                "PGUSER": "<Your Azure Database for PostgreSQL username>",
                "PGPASSWORD": "<Your password>",
                "PGDATABASE": "<Your database name>"
            }
        }        
    }
}
```

:::note warn
テスト目的のため、パスワードベースの認証を使用して MCP サーバーを Azure Database for PostgreSQL に接続していますが、実際は Microsoft Entra 認証を使用することをお勧めします。
https://github.com/Azure-Samples/azure-postgresql-mcp/?tab=readme-ov-file#using-microsoft-entra-authentication-method
:::

<li> Claude Desktop アプリを再起動します。

再起動すると、次のスクリーンショットに示すように、入力ボックスの下部にハンマーのアイコンが表示されます。このアイコンを選択すると、MCP サーバーによって公開されているツールが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958625/15a9859f-b022-4225-9581-dae3444ad4fd.png)


</ol>


### オプション 2 : GitHub Copilot から実行

<ol><li> Visual Studio Codeで、[Manage] に移動し、[Settings] を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958625/ef06bcc4-df76-40b7-b9f3-3b1500b2a235.png)

<li> 「MCP」を検索し、「settings.jsonで編集」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958625/9cd01c3b-0073-47d5-a528-0c85b7415dc9.png)

<li> 「settings.json」ファイルの「mcp」セクションに次の設定を追加します。

```json
{
    "mcp": {
        "inputs": [],
        "servers": {
            "azure-postgresql-mcp": {
                "command": "<path to the virtual environment>\\azure-postgresql-mcp-venv\\Scripts\\python",
                "args": [
                    "<path to azure_postgresql_mcp.py file>\\azure_postgresql_mcp.py"
                ],
                "env": {
                    "PGHOST": "<Fully qualified name of your Azure Database for PostgreSQL instance>",
                    "PGUSER": "<Your Azure Database for PostgreSQL username>",
                    "PGPASSWORD": "<Your password>",
                    "PGDATABASE": "<Your database name>"
                }
            }
        }
    }
}
```

:::note warn
テスト目的のため、パスワードベースの認証を使用して MCP サーバーを Azure Database for PostgreSQL に接続していますが、実際は Microsoft Entra 認証を使用することをお勧めします。
https://github.com/Azure-Samples/azure-postgresql-mcp/?tab=readme-ov-file#using-microsoft-entra-authentication-method
:::

<li>右上隅にある [Copilot] アイコンを選択して、GitHub Copilot チャット ウィンドウを開きます。

<li>次に、チャット入力ボックスの下部にあるドロップダウンから [エージェントモード] を選択します。
「Select Tools」をクリックして、MCP サーバーによって公開されているツールを表示できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958625/60dc30f8-2587-48a6-a3de-cbcc331b976c.png)


</ol>

GitHub Copilot での MCP の利用はこちらの記事に詳細があります。
https://ks6088ts.github.io/blog/mcp-get-started/

## 検証
MCP を利用して、自然言語でデータベースを操作できるようになったので試してみます。
PGFX に以下のようなデータベースを作成して、サンプルデータを挿入しておきます。

```SQL
-- 新しいデータベースを作成
CREATE DATABASE movie_ratings;

-- movie_ratings に接続

-- テーブルの作成
CREATE TABLE movies (id SERIAL,
    title VARCHAR(255) NOT NULL,
    genre VARCHAR(50),
    release_year INT,
    rating DECIMAL(3, 2)
);

-- データを挿入
INSERT INTO movies (title, genre, release_year, rating) VALUES
('The Shawshank Redemption', 'Drama', 1994, 9.3),
('The Godfather', 'Crime', 1972, 9.2),
('The Dark Knight', 'Action', 2008, 9.0),
('Pulp Fiction', 'Crime', 1994, 8.9);
```

必要に応じて、MCP でログイン可能なデータベースを movie_ratings にするため、「settings.json」ファイルの PGDATABASE を movie_ratings に変更します。
「postgreSQL データベースにはどんなデータがありますか」 と問いかけてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958625/14af5333-cf58-4095-a847-93ad6b928374.png)

一つの質問に対して、適宜 MCP で定義されている関数 (get_databases, get_schemas, query_data) が実行されています。その結果、データベース、テーブルの一覧から、movies テーブルの中身を探すまで実行できています。

例えば、「movies テーブルのデータを可視化できますか」と問いかけると、R と React を使用して、データの可視化まで実施します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958625/5168ef27-e606-4f86-82b6-ba6b895e77ad.png)

テーブルのデータを基に複数の観点でのグラフ化までを、自然言語だけで MCP クライアント内で完結できています。

また、「movies に追加できそうな 2025 年の映画情報を取得してください」として、movies テーブルに追加できそうな映画の情報を検索してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958625/8d781cb2-b072-4f2b-94af-f269f5b266e4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958625/089fe41b-70ef-4584-b1e2-89f29d3efb1d.png)

その結果、以下のような情報が得られていますが、Web 検索は MCP ツールとして追加していた playwright が利用されています。playwright の追加に関しては、以下に記載がありますが、追加は今回と同じような手順であるため、様々なツールを簡単に追加できるのは MCP の真価だと思います。

https://zenn.dev/space_k/articles/20250322-playwright

5 つの映画の情報をデータベースに保存しようと思うので、「この 5 つの映画の情報を movies テーブルに追加してください」と依頼すると保存してもらえます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958625/a9ea968e-cb79-46f8-943e-cca7c04404cd.png)

実際にデータベースにログインしてみると、テーブルが更新されていることが確認できます。データベース側に設定を行わずとも、このように自然言語でデータベースを操作できるようになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3958625/a8d3f725-4029-4377-a3b9-0eae2b565342.png)


なお、「settings.json」 にて PGUSER を指定しており、こちらのユーザーを用いてデータベースの操作を行っています。そのため、このユーザーへ対する権限をコントロールすることで、アクセス制御が可能であると思われます。

## まとめ
MCP を利用することで、データベースを LLM からデータソースとして手軽に参照することが可能になりました。それによって、自然言語でデータを操作することもできるので、様々な可能性が広がると考えられます。MCP で懸念されるセキュリティに対しては、ユーザーに対するロール割り当てや Entra 認証を利用することが期待できます。