はじめに: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から実データを取得し、正確な価格・型番情報に基づいたコードを記述します。これにより、ハルシネーション(嘘のデータ)を完全にゼロに抑えることができます。