Skills: カスタムツール開発

最終更新:2026-08-31

組み込みツールだけでは足りない?自分で作ろう——MCP プロトコルがあれば、Skill の能力に境界はない。


1. MCP プロトコルの基礎

(1) MCP とは

Model Context Protocol は AI ツールの標準プロトコルです:

TEXT 📖 参照専用
MCP アーキテクチャ
┌──────────┐    MCP プロトコル    ┌──────────────┐
│ AI クライアント │ ←──────────────→ │ MCP サーバー   │
│ (Claude)  │                    │ (カスタムツール) │
└──────────┘                    └──────────────┘
                                      ↕
                               ┌──────────────┐
                               │ 外部サービス   │
                               │ (DB/API/File) │
                               └──────────────┘

(2) ツールタイプ

タイプ 説明
リソースツール データ読み取りを提供 データベースクエリ、ファイルシステム
アクションツール 操作を実行 メール送信、チケット作成
プロンプトツール テンプレートを提供 レポートテンプレート、レビューチェックリスト

2. カスタムツールの開発

(1) 要件分析

TEXT 📖 参照専用
カスタムツール開発フロー
1. 組み込みツールでは満たせないニーズを特定
2. ツールの入出力を定義
3. 実装言語を選択(Node.js / Python)
4. ツールロジックを実装
5. MCP サーバーを設定
6. Skill にバインドして使用

(2) 最小実装

TYPESCRIPT
// mcp-server-example/index.ts
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";

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

server.tool("query_database", { sql: { type: "string" } }, async ({ sql }) => {
  const result = await executeQuery(sql);
  return { content: [{ type: "text", text: JSON.stringify(result) }] };
});

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

(3) 設定と統合

JSON
{
  "mcpServers": {
    "db-query": {
      "command": "node",
      "args": ["./mcp-servers/db-query/index.js"],
      "env": {
        "DATABASE_URL": "postgresql://localhost/mydb"
      }
    }
  }
}

3. ツール設計原則

(1) 単一責任

各ツールは1つのことをする:

✅ 良い設計 ❌ 悪い設計
query_database do_database_stuff
send_email communicate
search_logs find_stuff

(2) 入力検証

TYPESCRIPT
server.tool("query_database", {
  sql: {
    type: "string",
    description: "SQL クエリ文(SELECT のみ)",
    validate: (sql: string) => {
      if (/^\s*(DROP|DELETE|UPDATE|INSERT|ALTER)/i.test(sql)) {
        throw new Error("SELECT クエリのみ許可されています");
      }
    }
  }
}, handler);

(3) エラーハンドリング

TYPESCRIPT
async ({ sql }) => {
  try {
    const result = await executeQuery(sql);
    return { content: [{ type: "text", text: JSON.stringify(result) }] };
  } catch (error) {
    return {
      content: [{ type: "text", text: `クエリ失敗:${error.message}` }],
      isError: true
    };
  }
};

4. ツールのデバッグと公開

(1) ローカルデバッグ

BASH
# MCP サーバーを直接実行してテスト
node ./mcp-servers/db-query/index.js

# テストリクエストを送信
echo '{"method":"tools/list"}' | node ./mcp-servers/db-query/index.js

(2) ロギング

TYPESCRIPT
// ロギングミドルウェアを追加
server.tool("query_database", { sql: { type: "string" } }, async ({ sql }) => {
  console.error(`[DB-QUERY] SQL: ${sql}`);
  const start = Date.now();
  const result = await executeQuery(sql);
  console.error(`[DB-QUERY] Duration: ${Date.now() - start}ms`);
  return { content: [{ type: "text", text: JSON.stringify(result) }] };
});

(3) 公開と配布

TEXT 📖 参照専用
公開方式
├── npm パッケージ:npm publish @your-org/mcp-server-xxx
├── Docker:docker build + docker push
├── Git リポジトリ:直接クローンして使用
└── 設定テンプレート:JSON 設定テンプレートを提供

5. カスタムツールの実践

▶ 例:ログ検索ツール

Alice はログ検索 MCP ツールを開発しました:

YAML
---
name: log-analyzer
description: "ログ分析:検索、フィルタリング、統計"
tools:
  - Read
  - search_logs  # カスタム MCP ツール
---

Bob は言います:「カスタムツールの価値は、AI と独自システムを繋ぐこと——汎用ツールでは届かないところをカスタムツールが埋める。」


❓ よくある質問

Q MCP ツール開発に TypeScript は必須ですか?
A いいえ。MCP プロトコルは JSON-RPC なので、任意の言語で実装できます。公式 SDK は TypeScript と Python バージョンを提供しています。
Q カスタムツールにセキュリティリスクはありますか?
A はい。ツール内部で必ず入力検証と権限制御を行ってください。セキュリティ責任を Skill プロンプトに丸投げしないでください。
Q 1つの MCP サーバーで複数のツールを提供できますか?
A はい。ただし、1サーバーあたり5ツール以内を推奨し、責務を集中させてください。

📖 まとめ


📝 練習問題

  1. 基礎問題(難易度⭐):MCP SDK を使ってシンプルな Hello World ツールを作成し、Skill に統合してください。
  2. 応用問題(難易度⭐⭐):入力検証とエラーハンドリングを備えたデータベースクエリ MCP ツールを開発してください。
  3. チャレンジ問題(難易度⭐⭐⭐):検索、フィルタリング、統計をサポートし、デバッグと公開ドキュメントを含む完全なログ分析 MCP ツールを開発してください。
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%