【MCPサーバー完全構築】Model Context ProtocolでCursorやAntigravityに独自DB・ツールを接続する手順 アイキャッチ

Icons: Lobe Icons(MIT)

マニュアル
公開: 2026.09.02読了目安 8分

【MCPサーバー完全構築】Model Context ProtocolでCursorやAntigravityに独自DB・ツールを接続する手順

Anthropicが提唱し急速に標準化が進むMCP(Model Context Protocol)のアーキテクチャ、TypeScript/PythonによるカスタムMCPサーバーの実装、設定方法を解説します。

はじめに:AIエージェントの共通インターフェース規格「MCP」

Model Context Protocol(MCP)は、Anthropicが2024年末にオープンソース公開した、AIモデルと外部リソース(データベース、ファイルシステム、社内APIなど)をセキュアに接続するためのプロトコル規格です。

これまで、Cursor、Antigravity、Claude Desktopなどのツールごとに個別開発が必要だったカスタム連携が、MCPサーバーを1つ作成するだけですべてのエージェントから同一インターフェースで利用可能になりました。

本記事では、社内データベース(SQLite / Cloudflare D1)を検索・更新する実用的なMCPサーバーの構築手順を解説します。


1. MCPの3大プリミティブ(Tools / Resources / Prompts)

プリミティブ 説明 具体的な実装例
Tools(ツール) エージェントが実行できる関数(引数を受け取り処理を実行) 商品価格検索、DBレコード追加、外部API実行
Resources(リソース) エージェントが読み取れる静的・動的データ ログファイル、DBスキーマ定義、設定ファイル
Prompts(プロンプト) 事前定義されたワークフローや指示文テンプレート バグ調査プロンプト、リリースノート作成雛形

2. TypeScriptによるカスタムMCPサーバーの実装

以下は、JANコードや商品名から社内データベースを高速検索するMCPサーバーの実装コードです。

import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
  CallToolRequestSchema,
  ListToolsRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
import Database from "better-sqlite3";

// データベース接続
const db = new Database("./data/cdnt.db", { readonly: true });

// 1. MCPサーバーインスタンスの生成
const server = new Server(
  { name: "cdnt-search-mcp", version: "1.0.0" },
  { capabilities: { tools: {} } }
);

// 2. 提供するツール一覧の定義
server.setRequestHandler(ListToolsRequestSchema, async () => {
  return {
    tools: [
      {
        name: "search_product_master",
        description: "JANコードまたは商品キーワードから最新価格・スペックを取得します",
        inputSchema: {
          type: "object",
          properties: {
            query: { type: "string", description: "JANコード(13桁)または検索キーワード" },
            limit: { type: "number", description: "最大取得件数 (1〜50)", default: 10 },
          },
          required: ["query"],
        },
      },
    ],
  };
});

// 3. ツール実行ロジックの実装
server.setRequestHandler(CallToolRequestSchema, async (request) => {
  if (request.params.name === "search_product_master") {
    const { query, limit = 10 } = request.params.arguments as { query: string; limit?: number };
    
    // JAN完全一致または商品名あいまい検索
    const stmt = db.prepare(`
      SELECT jan_code, name, brand, category, min_store_price, used_median_price
      FROM products
      WHERE jan_code = ? OR name LIKE ?
      LIMIT ?
    `);
    const rows = stmt.all(query, `%${query}%`, limit);

    return {
      content: [
        {
          type: "text",
          text: JSON.stringify(rows, null, 2),
        },
      ],
    };
  }
  throw new Error(`未定義のツールです: ${request.params.name}`);
});

// 4. Stdioトランスポートで起動
async function main() {
  const transport = new StdioServerTransport();
  await server.connect(transport);
  console.error("CDNT MCP Server is running on stdio");
}

main().catch((err) => console.error("Server error:", err));

3. クライアント側の設定方法

Cursorでの設定(~/.cursor/mcp.json または プロジェクトルート)

{
  "mcpServers": {
    "cdnt-search": {
      "command": "node",
      "args": ["/absolute/path/to/cdnt_mcp_server.mjs"]
    }
  }
}

Antigravityでの設定(~/.gemini/config/mcp_config.json

{
  "mcpServers": {
    "cdnt-search": {
      "command": "node",
      "args": ["/path/to/project/scripts/mcp/your_mcp_server.mjs"],
      "env": {
        "NODE_ENV": "production"
      }
    }
  }
}

4. 実際の活用シナリオ

設定完了後、エディタのチャットやComposerで以下のように指示を出すだけで、AIが自律的にMCPツールを呼び出します。

プロンプト例: 「JANコード 4969363045300 の商品仕様と最新相場を search_product_master で調べて、スペック比較カードのAstroコンポーネントを作成して」

AIは即座にDBから実データを取得し、正確な価格・型番情報に基づいたコードを記述します。これにより、ハルシネーション(嘘のデータ)を完全にゼロに抑えることができます。