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ツール以内を推奨し、責務を集中させてください。
📖 まとめ
- MCP プロトコル:AI クライアントとカスタムツール間の標準通信プロトコル
- 開発フロー:要件分析→実装→設定→デバッグ→公開
- 設計原則:単一責任、入力検証、エラーハンドリング
- コア価値:AI と独自システムを繋ぎ、Skill の能力境界を拡張
📝 練習問題
- 基礎問題(難易度⭐):MCP SDK を使ってシンプルな Hello World ツールを作成し、Skill に統合してください。
- 応用問題(難易度⭐⭐):入力検証とエラーハンドリングを備えたデータベースクエリ MCP ツールを開発してください。
- チャレンジ問題(難易度⭐⭐⭐):検索、フィルタリング、統計をサポートし、デバッグと公開ドキュメントを含む完全なログ分析 MCP ツールを開発してください。