毎日繰り返される単調な業務タスク。手作業で大量のデータ処理をしている。AIを活用して効率化したいけど、具体的な設定方法がわからない…そんなお悩みを持つエンジニアは多いのではないでしょうか。
実は、Claude MCP(Model Context Protocol)サーバーを使えば、複雑な処理をAIに自動実行させることができます。しかも設定は思ったより簡単です。本記事では、エンジニア向けに Claude MCP サーバーの設定から実装、自動化までを完全にお伝えします。
Claude MCP サーバーとは|なぜエンジニアが注目しているのか
Claude MCP(Model Context Protocol)は、Anthropic が提供するAI と外部ツール・データベースを連携させるためのプロトコルです。従来、Claude は単体では外部システムへの直接的なアクセスができませんでした。
MCP サーバーを使うと、以下のようなことが実現します。
- ファイルシステムへの読み書き
- データベースクエリの自動実行
- Web API の連携
- 複数ツール間のデータ連携
- カスタム関数の実行
これにより、Claude が「指示を受ける」だけでなく、「実際に行動を起こす」ようになります。
Claude MCP サーバー設定の前提条件
本チュートリアルを進める前に、以下の準備が必要です。
- Claude API キー(Anthropic から取得)
- Node.js 18 以上
- npm または yarn
- 基本的な JavaScript の知識
- コマンドラインツールの利用経験
これらが整っていれば、すぐに実装を始められます。
ステップ1:MCP サーバーの基本的な初期化
それでは、実際に MCP サーバーをセットアップしていきましょう。
まず、プロジェクトディレクトリを作成します。
mkdir claude-mcp-server
cd claude-mcp-server
npm init -y
次に、必要なパッケージをインストールします。
npm install @anthropic-ai/sdk
基本的な MCP サーバーの構造を作成するには、以下のファイルを作成します。
// server.js
const Anthropic = require('@anthropic-ai/sdk');
const client = new Anthropic({
apiKey: process.env.ANTHROPIC_API_KEY
});
async function runMCPServer() {
console.log('Claude MCP Server が起動しました');
}
runMCPServer();
このファイルを実行する前に、環境変数を設定しておきましょう。
export ANTHROPIC_API_KEY=your_api_key_here
ステップ2:カスタムツール(リソース)の定義
MCP の真の力は、カスタムツールを定義することで発揮されます。例として、ファイル操作とデータ処理を行うツールを作成します。
// tools.js
const fs = require('fs').promises;
const path = require('path');
const tools = [
{
name: 'read_file',
description: 'ファイルの内容を読み込む',
input_schema: {
type: 'object',
properties: {
file_path: {
type: 'string',
description: '読み込むファイルのパス'
}
},
required: ['file_path']
}
},
{
name: 'write_file',
description: 'ファイルに内容を書き込む',
input_schema: {
type: 'object',
properties: {
file_path: {
type: 'string',
description: '書き込むファイルのパス'
},
content: {
type: 'string',
description: 'ファイルに書き込む内容'
}
},
required: ['file_path', 'content']
}
},
{
name: 'list_files',
description: 'ディレクトリ内のファイル一覧を取得',
input_schema: {
type: 'object',
properties: {
directory: {
type: 'string',
description: 'リストアップするディレクトリのパス'
}
},
required: ['directory']
}
}
];
async function executeTool(toolName, toolInput) {
switch(toolName) {
case 'read_file':
return await fs.readFile(toolInput.file_path, 'utf-8');
case 'write_file':
await fs.writeFile(toolInput.file_path, toolInput.content);
return `ファイルが正常に書き込まれました: ${toolInput.file_path}`;
case 'list_files':
return await fs.readdir(toolInput.directory);
default:
throw new Error(`Unknown tool: ${toolName}`);
}
}
module.exports = { tools, executeTool };
このツール定義により、Claude は指定されたファイル操作を実行できるようになります。
ステップ3:Claude API との統合
次に、Claude API とツール実行ロジックを統合します。
// claude-integration.js
const Anthropic = require('@anthropic-ai/sdk');
const { tools, executeTool } = require('./tools');
const client = new Anthropic({
apiKey: process.env.ANTHROPIC_API_KEY
});
async function runConversation(userMessage) {
console.log(`\nユーザー: ${userMessage}\n`);
const messages = [
{ role: 'user', content: userMessage }
];
let response = await client.messages.create({
model: 'claude-3-5-sonnet-20241022',
max_tokens: 1024,
tools: tools,
messages: messages
});
while (response.stop_reason === 'tool_use') {
const toolUseBlock = response.content.find(
block => block.type === 'tool_use'
);
if (!toolUseBlock) break;
const toolName = toolUseBlock.name;
const toolInput = toolUseBlock.input;
console.log(`ツール実行: ${toolName}`);
console.log(`入力: ${JSON.stringify(toolInput)}\n`);
let toolResult;
try {
toolResult = await executeTool(toolName, toolInput);
} catch (error) {
toolResult = `エラー: ${error.message}`;
}
messages.push({ role: 'assistant', content: response.content });
messages.push({
role: 'user',
content: [
{
type: 'tool_result',
tool_use_id: toolUseBlock.id,
content: String(toolResult)
}
]
});
response = await client.messages.create({
model: 'claude-3-5-sonnet-20241022',
max_tokens: 1024,
tools: tools,
messages: messages
});
}
const finalResponse = response.content
.filter(block => block.type === 'text')
.map(block => block.text)
.join('');
console.log(`Claude: ${finalResponse}`);
return finalResponse;
}
module.exports = { runConversation };
ステップ4:実装とテスト
それでは、実装した MCP サーバーをテストしてみましょう。メインサーバーファイルを更新します。
// server.js
const { runConversation } = require('./claude-integration');
async function main() {
try {
// テスト1: ファイル書き込み
await runConversation(
'test.txt というファイルに「Claude MCP サーバーのテストです」と書き込んでください'
);
// テスト2: ファイル読み込み
await runConversation(
'test.txt ファイルの内容を読み込んで、その内容について簡潔に説明してください'
);
// テスト3: ディレクトリ一覧
await runConversation(
'現在のディレクトリ内にあるファイルを一覧表示して、それぞれのファイルについて説明してください'
);
} catch (error) {
console.error('エラーが発生しました:', error);
}
}
main();
実行してみましょう。
node server.js
正常に動作すれば、Claude がファイル操作を実行し、その結果をリアルタイムで返してくれます。
ステップ5:実務的な自動化シナリオの実装
基本ができたら、実務的なシナリオに対応させましょう。データ処理ツールを追加します。
// advanced-tools.js
const fs = require('fs').promises;
const advancedTools = [
{
name: 'process_csv',
description: 'CSV ファイルを読み込んで処理する',
input_schema: {
type: 'object',
properties: {
file_path: {
type: 'string',
description: '処理する CSV ファイルのパス'
},
operation: {
type: 'string',
enum: ['count_rows', 'extract_column', 'filter_data'],
description: '実行する操作'
}
},
required: ['file_path', 'operation']
}
},
{
name: 'generate_report',
description: 'データから分析レポートを生成',
input_schema: {
type: 'object',
properties: {
data_summary: {
type: 'string',
description: 'レポートに含めるデータサマリー'
},
report_type: {
type: 'string',
enum: ['summary', 'detailed', 'executive'],
description: 'レポートのタイプ'
}
},
required: ['data_summary', 'report_type']
}
}
];
async function executeAdvancedTool(toolName, toolInput) {
switch(toolName) {
case 'process_csv':
// CSV 処理ロジック
return `CSV 処理完了: ${toolInput.operation}`;
case 'generate_report':
// レポート生成ロジック
return `${toolInput.report_type} レポート生成完了`;
default:
throw new Error(`Unknown tool: ${toolName}`);
}
}
module.exports = { advancedTools, executeAdvancedTool };
このようにツールを追加拡張することで、より複雑な自動化タスク