𝕏 f B! L
案件・求人数 12,345
案件を探す(準備中) エージェントを探す(準備中) お役立ち情報 ログイン
案件・求人数 12,345
OpenClaw MCPサーバー開発ガイド|外部ツール連携

OpenClaw MCPサーバー開発ガイド|外部ツール連携

OpenClawMCPサーバー開発ツール連携
目次
⚡ 3秒でわかる!この記事のポイント
  • MCPサーバーを作れば、OpenClawからDB・API・外部サービスに直接アクセス可能になる
  • Node.js / Python SDKで開発でき、OpenClawへの登録はJSON設定1行で完了
  • 読み取り専用と書き込み可能ツールの権限分離でセキュリティを確保

「OpenClawから自社のデータベースを直接クエリしたい」「外部APIをAIエージェントから呼び出せるようにしたい」「スキルとMCPサーバー、どちらを開発すべきかわからない」

MCP(Model Context Protocol)サーバーを開発することで、OpenClawのAIエージェントから外部のデータソースやサービスにリアルタイムでアクセスできるようになります。データベースクエリ、API呼び出し、社内ツール操作など、AIの活用範囲が大幅に広がります。

この記事では、OpenClaw完全攻略シリーズEp.30として、MCPサーバーの開発から本番デプロイまでを実践的に解説します。

この記事でわかること
  • MCPの基本概念とOpenClawでの役割
  • MCPサーバーの開発環境セットアップ
  • DB接続・API統合・社内ツール連携の実装例
  • セキュリティ設計とデプロイ方法

MCP(Model Context Protocol)とは?OpenClawでの役割

MCPアーキテクチャの全体像

MCPの基本概念とアーキテクチャ

MCP(Model Context Protocol)は、AIモデルと外部データソース・ツールを接続するための標準プロトコルです。Anthropicが2024年に提唱し、現在はオープンスタンダードとして多くのAIツールが採用しています。

MCPの基本アーキテクチャは以下のとおりです:

┌──────────────┐     MCP Protocol     ┌──────────────┐
│   MCP Client │ ←───────────────────→ │  MCP Server  │
│  (OpenClaw)  │   JSON-RPC over      │              │
│              │   stdio / HTTP       │  ┌─────────┐ │
│  AI Agent    │                      │  │ Tools   │ │
│  ↕           │                      │  │ Resources│ │
│  User        │                      │  │ Prompts │ │
└──────────────┘                      └──┴─────────┴─┘

                                      ┌──────────────┐
                                      │ External     │
                                      │ Services     │
                                      │ (DB/API/SaaS)│
                                      └──────────────┘

MCPサーバーが提供する3つの機能:

機能説明
ToolsAIが呼び出せる関数DBクエリ実行、API呼出、ファイル操作
ResourcesAIが参照できるデータテーブルスキーマ、APIドキュメント
Prompts定型のプロンプトテンプレートSQLクエリ生成用テンプレート

MCP仕様の詳細はModel Context Protocol公式サイトで確認できます。

OpenClawスキルとMCPサーバーの使い分け

OpenClawには「スキル」と「MCPサーバー」の2つの拡張方法があります:

項目スキルMCPサーバー
実装言語Markdown + スクリプトNode.js / Python
通信方式CLIツール呼び出しJSON-RPC(stdio / HTTP)
リアルタイム性バッチ処理向きリアルタイム通信可能
適用場面定型タスクの自動化外部サービスとの動的連携
セットアップファイル配置のみサーバープロセスの起動が必要

使い分けの基準: 外部サービスとのリアルタイム通信が必要ならMCPサーバー、定型的なCLIタスクの自動化ならスキルが適しています。

OpenClawスキル開発ガイドでスキルの開発方法を解説しています。

MCPサーバーの開発環境セットアップ

Node.js / Python SDKのインストール

MCPサーバーの開発には公式SDKを使用します:

# Node.js SDK
npm init -y
npm install @modelcontextprotocol/sdk

# Python SDK
pip install mcp

OpenClawへのMCPサーバー登録方法

開発したMCPサーバーは、OpenClawの設定ファイルに登録します:

// ~/.openclaw/openclaw.json
{
  "mcpServers": {
    "my-db-server": {
      "command": "node",
      "args": ["./mcp-servers/db-server/index.js"],
      "env": {
        "DATABASE_URL": "postgresql://user:pass@localhost/mydb"
      }
    }
  }
}

登録後、OpenClawを再起動すると自動的にMCPサーバーが起動し、AIエージェントからツールが利用可能になります。

ローカル開発とデバッグの手順

# MCP Inspector(デバッグツール)の起動
npx @modelcontextprotocol/inspector ./mcp-servers/db-server/index.js

# ブラウザで http://localhost:5173 にアクセスして動作確認

MCP Inspectorを使うと、ツールの呼び出しやレスポンスをGUIで確認できます。

実践①:データベース接続MCPサーバーの構築

PostgreSQL / MySQL への安全な接続

データベースに接続するMCPサーバーの基本実装:

// mcp-servers/db-server/index.js
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import pg from "pg";

const server = new McpServer({
  name: "database-server",
  version: "1.0.0",
});

const pool = new pg.Pool({
  connectionString: process.env.DATABASE_URL,
});

// クエリ実行ツール
server.tool(
  "query",
  "データベースにSQLクエリを実行する(SELECT文のみ)",
  { sql: { type: "string", description: "実行するSQL(SELECT文)" } },
  async ({ sql }) => {
    // SELECTのみ許可(安全対策)
    if (!sql.trim().toUpperCase().startsWith("SELECT")) {
      return { content: [{ type: "text", text: "エラー: SELECT文のみ実行可能です" }] };
    }
    const result = await pool.query(sql);
    return { content: [{ type: "text", text: JSON.stringify(result.rows, null, 2) }] };
  }
);

const transport = new StdioServerTransport();
await server.connect(transport);

クエリ実行とスキーマ情報の提供

スキーマ情報をResourceとして公開することで、AIが適切なSQLを生成できます:

// テーブルスキーマをResourceとして公開
server.resource(
  "schema://tables",
  "データベースのテーブル一覧とスキーマ情報",
  async () => {
    const result = await pool.query(`
      SELECT table_name, column_name, data_type
      FROM information_schema.columns
      WHERE table_schema = 'public'
      ORDER BY table_name, ordinal_position
    `);
    return { contents: [{ uri: "schema://tables", text: JSON.stringify(result.rows) }] };
  }
);

実践②:外部API統合MCPサーバーの構築

REST API / GraphQL のラッピング

外部APIをMCPサーバーでラッピングする例:

server.tool(
  "search_weather",
  "指定都市の天気予報を取得する",
  { city: { type: "string", description: "都市名(英語)" } },
  async ({ city }) => {
    const response = await fetch(
      `https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${process.env.WEATHER_API_KEY}&units=metric&lang=ja`
    );
    const data = await response.json();
    return {
      content: [{ type: "text", text: `${data.name}: ${data.weather[0].description}, ${data.main.temp}°C` }]
    };
  }
);

認証・レート制限の実装

外部APIとの連携では、認証とレート制限の実装が重要です:

// シンプルなレート制限の実装
const rateLimiter = new Map();

function checkRateLimit(toolName, maxPerMinute = 10) {
  const now = Date.now();
  const calls = rateLimiter.get(toolName) || [];
  const recentCalls = calls.filter(t => now - t < 60000);
  if (recentCalls.length >= maxPerMinute) {
    throw new Error(`Rate limit exceeded: ${toolName}`);
  }
  recentCalls.push(now);
  rateLimiter.set(toolName, recentCalls);
}

実践③:社内ツール連携MCPサーバー

Notion / Slack / Google Workspace連携

社内ツールとの連携例(Notion):

server.tool(
  "create_notion_page",
  "Notionにページを作成する",
  {
    title: { type: "string", description: "ページタイトル" },
    content: { type: "string", description: "ページ本文(Markdown)" },
    databaseId: { type: "string", description: "追加先のデータベースID" }
  },
  async ({ title, content, databaseId }) => {
    const response = await notion.pages.create({
      parent: { database_id: databaseId },
      properties: { Name: { title: [{ text: { content: title } }] } },
      children: markdownToBlocks(content),
    });
    return { content: [{ type: "text", text: `ページ作成完了: ${response.url}` }] };
  }
);

カスタムツールの公開

OpenClawカスタムツールで、カスタムツール開発のベストプラクティスも紹介しています。

セキュリティとパーミッション設計

読み取り専用 vs 書き込み可能ツール

MCPサーバーのセキュリティ設計で最も重要なのは権限の分離です:

レベル操作リスク
読み取りデータの参照のみSELECT文、API GETリクエスト
書き込みデータの変更・作成INSERT/UPDATE、API POSTリクエスト
削除データの削除DELETE文、リソース削除
管理設定変更・スキーマ変更DDL、権限変更非常に高

推奨: デフォルトでは読み取り専用ツールのみ公開し、書き込みツールは明示的な設定で有効化する設計にしましょう。

APIキーの安全な管理

// MCPサーバーにAPIキーを渡す安全な方法
{
  "mcpServers": {
    "my-api-server": {
      "command": "node",
      "args": ["./mcp-servers/api-server/index.js"],
      "env": {
        "API_KEY": "${secrets.MY_API_KEY}"
      }
    }
  }
}

OpenClaw Webhook/API連携でも、セキュアなAPI連携方法を解説しています。

本番デプロイとモニタリング

本番環境へのデプロイ方法:

# Docker化してデプロイ
docker build -t mcp-db-server .
docker run -d --name mcp-db-server \
  -e DATABASE_URL=$DATABASE_URL \
  mcp-db-server

# systemdサービスとして登録
sudo systemctl enable mcp-db-server
sudo systemctl start mcp-db-server

モニタリングのポイント:

  • ヘルスチェック — MCPサーバーの死活監視
  • レスポンスタイム — ツール実行の応答時間
  • エラー率 — ツール実行の失敗率
  • トークン使用量 — AIとの通信に消費されるトークン

OpenClaw入門ガイドでも、全体的なアーキテクチャを紹介しています。

まとめ|MCPサーバーでOpenClawの可能性を拡張しよう

MCPサーバー開発により、OpenClawのAIエージェントの能力を外部のデータソースやサービスにまで拡張できます。

この記事のポイントをおさらい:

  • MCPサーバーはAIと外部サービスをリアルタイムに接続する標準プロトコル
  • Node.js / Python SDKで簡単に開発でき、OpenClawへの登録はJSON設定1行
  • DB接続・API統合・社内ツール連携など、幅広い活用パターンがある
  • 読み取り/書き込みの権限分離で安全なツール公開が可能
  • 本番デプロイはDockerまたはsystemdで管理

MCPサーバーは一度作れば、OpenClawだけでなくClaude DesktopやCursorなど、MCP対応の他のAIツールからも利用可能です。投資対効果の高い開発になるでしょう。

🛠️ AIツール開発の案件を探すなら

SES BASEでAIエージェント・MCP開発関連の案件をチェック!

SES案件をお探しですか?

SES記事をもっと読む →
🏗️

SES BASE 編集長

SES業界歴10年以上のメンバーが在籍する編集チーム。SES企業での営業・エンジニア経験、フリーランス独立経験を持つメンバーが、業界のリアルな情報をお届けします。

📊 業界データに基づく記事制作 🔍 IPA・経済産業省データ参照 💼 SES実務経験者が執筆・監修