はじめに

前記事ではMCPの基本概念と主要サービスとの連携方法を解説しました。本記事では、より実践的なMCPの活用方法として、STDIOサーバーとリモートサーバーの使い分け、変数補間の活用、そしてデータベースやAPIとの連携について詳しく解説します。

本記事を読むことで、以下のことができるようになります。

  • STDIOサーバーとリモートサーバーの違いを理解し、適切に選択できる
  • 変数補間を使用して柔軟なMCP設定を構築できる
  • データベースMCPを設定し、CursorからSQL操作を実行できる
  • カスタムAPI連携用のMCPサーバーを設定できる

実行環境と前提条件

本記事の内容を実践するための環境要件は以下のとおりです。

項目 要件
オペレーティングシステム Windows 10以上、macOS 10.15以上、Ubuntu 20.04以上/Debian 10以上
Cursor バージョン 2.3以降
Node.js 18以上(npxコマンド実行に必要)
Python 3.10以上(uvx使用時)
インターネット接続 必須

前提条件

  • MCPの基本概念を理解していること(前記事参照)
  • mcp.jsonの基本的な設定方法を理解していること
  • データベースの基本操作(SQL)を理解していること

期待される結果

本記事の手順を完了すると、以下の状態になります。

  • プロジェクトに最適なMCPサーバータイプを選択できる
  • 環境変数やワークスペースパスを動的に参照するMCP設定を作成できる
  • PostgreSQL/SQLiteなどのデータベースをCursorから操作できる
  • REST APIをMCP経由でCursorに統合できる

STDIOサーバーとリモートサーバーの比較

MCPサーバーには大きく分けて2種類のアーキテクチャがあります。それぞれの特徴を理解し、ユースケースに応じて適切に選択することが重要です。

STDIOサーバー

STDIOサーバーは、ローカルマシン上でCursorが直接プロセスを起動・管理するタイプのMCPサーバーです。

flowchart LR
    A[Cursor] -->|標準入出力| B[MCPサーバー<br/>プロセス]
    B --> C[ローカルリソース<br/>ファイル/DB]

STDIOサーバーの特徴

項目 説明
実行場所 ローカルマシン
ライフサイクル Cursorが管理(起動・終了)
通信方式 標準入出力(stdin/stdout)
ユーザー数 単一ユーザー
ネットワーク 不要

STDIOサーバーの設定例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
{
  "mcpServers": {
    "local-db": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-sqlite", "database.db"],
      "env": {
        "NODE_ENV": "development"
      }
    }
  }
}

STDIOサーバーが適しているケース

  • ローカルファイルやデータベースへのアクセス
  • 開発環境でのテスト
  • 機密性の高いデータを扱う場合
  • ネットワーク遅延を避けたい場合

リモートサーバー(SSE/Streamable HTTP)

リモートサーバーは、別のプロセスまたはサーバー上で動作し、HTTP経由で通信するMCPサーバーです。

flowchart LR
    A[Cursor] -->|HTTP/SSE| B[MCPサーバー<br/>リモート]
    B --> C[外部サービス<br/>API/クラウドDB]

リモートサーバーの特徴

項目 説明
実行場所 ローカルまたはリモートサーバー
ライフサイクル 独立して管理
通信方式 HTTP POST + Server-Sent Events
ユーザー数 複数ユーザー対応可能
認証 OAuth/APIキー

リモートサーバーの設定例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{
  "mcpServers": {
    "remote-api": {
      "url": "https://api.example.com/mcp",
      "headers": {
        "Authorization": "Bearer ${env:API_TOKEN}"
      }
    }
  }
}

リモートサーバーが適しているケース

  • チームでのMCPサーバー共有
  • クラウドサービスとの連携
  • 常時稼働が必要なサービス
  • OAuth認証が必要なサービス

選択の判断基準

判断基準 STDIO推奨 リモート推奨
データの場所 ローカル クラウド/リモート
チーム利用 個人開発 チーム開発
セキュリティ 機密データ 一般データ
可用性 開発時のみ 常時稼働
セットアップ 簡単にしたい 柔軟に構成したい

変数補間の活用

mcp.jsonでは変数補間を使用して、環境に依存しない柔軟な設定を記述できます。これにより、チームメンバー間で設定ファイルを共有しやすくなります。

サポートされる変数構文

Cursorは以下の変数構文をサポートしています。

構文 説明
${env:NAME} 環境変数を参照 ${env:API_KEY}
${userHome} ユーザーのホームディレクトリ /Users/username
${workspaceFolder} プロジェクトルート /path/to/project
${workspaceFolderBasename} プロジェクトフォルダ名 project
${pathSeparator} OSのパス区切り文字 / または \
${/} パス区切り文字(短縮形) / または \

変数が展開されるフィールド

変数補間は以下のフィールドで使用できます。

  • command
  • args
  • env
  • url
  • headers
  • auth

実践的な変数補間の例

環境変数の参照

APIキーやトークンを環境変数から読み込む設定です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{
  "mcpServers": {
    "secure-server": {
      "command": "node",
      "args": ["server.js"],
      "env": {
        "DATABASE_URL": "${env:DATABASE_URL}",
        "API_KEY": "${env:MCP_API_KEY}",
        "SECRET_KEY": "${env:MCP_SECRET_KEY}"
      }
    }
  }
}

ワークスペースパスの活用

プロジェクト内のスクリプトやデータベースファイルを参照する設定です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
{
  "mcpServers": {
    "project-db": {
      "command": "python",
      "args": ["${workspaceFolder}/tools/db_server.py"],
      "env": {
        "DB_PATH": "${workspaceFolder}/data/development.db",
        "CONFIG_PATH": "${workspaceFolder}/config/mcp.yaml"
      }
    }
  }
}

ユーザーホームの活用

グローバルな設定ファイルや認証情報を参照する設定です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
{
  "mcpServers": {
    "global-tools": {
      "command": "npx",
      "args": ["-y", "mcp-server"],
      "env": {
        "CREDENTIALS_PATH": "${userHome}/.config/mcp/credentials.json",
        "CACHE_DIR": "${userHome}/.cache/mcp"
      }
    }
  }
}

環境ファイルの読み込み

.envファイルから追加の環境変数を読み込む設定です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
{
  "mcpServers": {
    "env-server": {
      "command": "node",
      "args": ["server.js"],
      "envFile": "${workspaceFolder}/.env",
      "env": {
        "OVERRIDE_VALUE": "specific-value"
      }
    }
  }
}

クロスプラットフォーム対応

Windows/macOS/Linuxで動作する設定を書く場合は、パス区切り文字の変数を活用します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
{
  "mcpServers": {
    "cross-platform": {
      "command": "python",
      "args": ["${workspaceFolder}${/}scripts${/}server.py"],
      "env": {
        "DATA_DIR": "${workspaceFolder}${/}data"
      }
    }
  }
}

データベースMCPの設定と活用

MCPを使用すると、CursorのAgentからデータベースを直接操作できます。スキーマの確認、クエリの実行、データの分析などをAIアシスタントに依頼できるようになります。

SQLite MCP Server

SQLiteは軽量なファイルベースのデータベースで、開発環境やプロトタイピングに適しています。

インストールと設定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
{
  "mcpServers": {
    "sqlite": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-sqlite",
        "${workspaceFolder}/database.db"
      ]
    }
  }
}

提供されるツール

ツール名 説明
read_query SELECTクエリの実行
write_query INSERT/UPDATE/DELETEクエリの実行
create_table テーブルの作成
list_tables テーブル一覧の取得
describe_table テーブル構造の確認

使用例

Agentに以下のように指示します。

usersテーブルから、created_atが今月のユーザー数を集計してください

Agentは適切なSQLクエリを生成し、実行結果を返します。

PostgreSQL MCP Server

PostgreSQLは本番環境でも広く使用されるリレーショナルデータベースです。

インストールと設定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
{
  "mcpServers": {
    "postgres": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-postgres"],
      "env": {
        "POSTGRES_HOST": "${env:POSTGRES_HOST}",
        "POSTGRES_PORT": "${env:POSTGRES_PORT}",
        "POSTGRES_USER": "${env:POSTGRES_USER}",
        "POSTGRES_PASSWORD": "${env:POSTGRES_PASSWORD}",
        "POSTGRES_DATABASE": "${env:POSTGRES_DATABASE}"
      }
    }
  }
}

接続文字列を使用する場合

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
{
  "mcpServers": {
    "postgres": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-postgres"],
      "env": {
        "DATABASE_URL": "postgresql://user:password@localhost:5432/dbname"
      }
    }
  }
}

提供されるツール

ツール名 説明
query SQLクエリの実行
list_schemas スキーマ一覧の取得
list_tables テーブル一覧の取得
describe_table テーブル構造とインデックスの確認

データベース操作の実践例

スキーマの確認

このデータベースのテーブル一覧を確認し、それぞれのテーブル構造を教えてください

データ分析クエリの生成

ordersテーブルとorder_itemsテーブルを結合して、
過去30日間の売上トップ10商品を集計するクエリを実行してください

マイグレーションの作成支援

usersテーブルに「email_verified_at」カラムを追加するマイグレーションを作成してください。
NULL許容のTIMESTAMP型で、インデックスも追加してください

データベースMCPのセキュリティ考慮事項

考慮事項 推奨対策
認証情報の管理 環境変数を使用し、設定ファイルにハードコードしない
権限の制限 読み取り専用ユーザーを使用(可能な場合)
本番環境への接続 開発環境のみで使用し、本番DBへの直接接続は避ける
クエリの監査 実行されたクエリをログに記録する

API連携MCPの設定

REST APIやGraphQL APIをMCP経由でCursorに統合する方法を解説します。

Fetch MCP Server

Web APIからデータを取得するための汎用的なMCPサーバーです。

設定例

1
2
3
4
5
6
7
8
{
  "mcpServers": {
    "fetch": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-fetch"]
    }
  }
}

提供されるツール

ツール名 説明
fetch URLからコンテンツを取得(HTML/JSON/テキスト)
fetch_markdown URLからコンテンツを取得しMarkdownに変換

使用例

https://api.example.com/users のエンドポイントからユーザーデータを取得してください

カスタムAPI MCPサーバーの作成

特定のAPIに特化したMCPサーバーを作成することで、より効率的な連携が可能になります。

TypeScriptでのMCPサーバー実装例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";

const server = new Server(
  {
    name: "custom-api-server",
    version: "1.0.0",
  },
  {
    capabilities: {
      tools: {},
    },
  }
);

// ツールの定義
server.setRequestHandler("tools/list", async () => {
  return {
    tools: [
      {
        name: "get_weather",
        description: "指定した都市の天気情報を取得します",
        inputSchema: {
          type: "object",
          properties: {
            city: {
              type: "string",
              description: "都市名(例: Tokyo)",
            },
          },
          required: ["city"],
        },
      },
    ],
  };
});

// ツールの実行
server.setRequestHandler("tools/call", async (request) => {
  if (request.params.name === "get_weather") {
    const city = request.params.arguments.city;
    // APIを呼び出して天気情報を取得
    const response = await fetch(
      `https://api.weather.example.com/v1/weather?city=${city}`
    );
    const data = await response.json();
    
    return {
      content: [
        {
          type: "text",
          text: JSON.stringify(data, null, 2),
        },
      ],
    };
  }
  throw new Error(`Unknown tool: ${request.params.name}`);
});

// サーバーの起動
const transport = new StdioServerTransport();
await server.connect(transport);

カスタムサーバーの設定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
{
  "mcpServers": {
    "custom-api": {
      "command": "node",
      "args": ["${workspaceFolder}/mcp-servers/custom-api-server.js"],
      "env": {
        "API_BASE_URL": "https://api.example.com",
        "API_KEY": "${env:CUSTOM_API_KEY}"
      }
    }
  }
}

リモートAPIサーバーとの連携

既存のAPIサーバーをMCPエンドポイントとして公開することも可能です。

SSEエンドポイントの設定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
{
  "mcpServers": {
    "company-api": {
      "url": "https://internal-api.company.com/mcp/sse",
      "headers": {
        "Authorization": "Bearer ${env:COMPANY_API_TOKEN}",
        "X-Team-ID": "${env:TEAM_ID}"
      }
    }
  }
}

Streamable HTTPエンドポイントの設定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
{
  "mcpServers": {
    "streaming-api": {
      "url": "https://api.example.com/mcp/stream",
      "headers": {
        "Content-Type": "application/json",
        "Authorization": "Bearer ${env:API_TOKEN}"
      }
    }
  }
}

複数MCPサーバーの統合管理

プロジェクトで複数のMCPサーバーを使用する場合の管理方法を解説します。

プロジェクト設定とグローバル設定の使い分け

~/.cursor/mcp.json          # グローバル設定(すべてのプロジェクトで使用)
├── github                  # 全プロジェクト共通
├── slack                   # 全プロジェクト共通
└── notion                  # 全プロジェクト共通

.cursor/mcp.json            # プロジェクト設定
├── project-db              # プロジェクト固有のDB
├── project-api             # プロジェクト固有のAPI
└── local-tools             # プロジェクト固有のツール

設定ファイルの分離例

グローバル設定(~/.cursor/mcp.json):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
{
  "mcpServers": {
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
        "GITHUB_PERSONAL_ACCESS_TOKEN": "${env:GITHUB_TOKEN}"
      }
    },
    "memory": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-memory"]
    }
  }
}

プロジェクト設定(.cursor/mcp.json):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
{
  "mcpServers": {
    "project-db": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-postgres"
      ],
      "envFile": "${workspaceFolder}/.env",
      "env": {
        "DATABASE_URL": "${env:DATABASE_URL}"
      }
    }
  }
}

MCPサーバーの有効化/無効化

特定のMCPサーバーを一時的に無効化するには、Cursor Settings → MCP から操作できます。コード上で無効化する場合は、設定をコメントアウトするか削除します。

トラブルシューティング

MCPサーバーで問題が発生した場合の対処方法を解説します。

よくある問題と解決策

問題 原因 解決策
サーバーが起動しない コマンドパスが正しくない フルパスを指定するか、PATHを確認
認証エラー APIキーが無効 環境変数の設定を確認
タイムアウト ネットワーク遅延 タイムアウト設定を調整
ツールが表示されない サーバーが未接続 Cursor Settingsで接続状態を確認

デバッグ手順

  1. Cursor Settingsでの確認

    • MCP セクションでサーバーの状態を確認
    • エラーメッセージがあれば内容を確認
  2. 手動でのサーバー起動テスト

    • ターミナルでMCPサーバーを直接起動
    • 出力されるエラーメッセージを確認
  3. 環境変数の確認

    • 必要な環境変数が設定されているか確認
    • echo $VARIABLE_NAME で値を確認
  4. ログの確認

    • Cursorの開発者ツールでログを確認
    • MCPサーバーのログ出力を確認

まとめ

本記事では、MCPサーバーの実践的な活用方法を解説しました。

  • STDIOサーバーはローカルリソースへのアクセスに適し、リモートサーバーはチーム共有やクラウド連携に適している
  • 変数補間(${env:}${workspaceFolder}等)を活用することで、柔軟で移植性の高い設定を構築できる
  • データベースMCPを使用すると、AIがスキーマを理解し、適切なSQLクエリを生成・実行できる
  • カスタムAPI MCPサーバーを作成することで、任意のAPIをCursorに統合できる

MCPを活用することで、CursorのAIが外部システムの情報を参照しながらより的確なコード生成や提案を行えるようになります。プロジェクトの要件に応じて適切なMCPサーバーを選択し、開発効率を向上させてください。

参考リンク