先月からClaude Codeを使い始めました。コンソールでの対話形式に関わらずその利便さと技術の進化に驚嘆して、さらに最近のLaravel Boostの登場で、LaravelのエコシステムにおいてMCPサーバーの開発対応がすでになされていることにさらに驚嘆。MCPサーバーは、ClaudeのようなAIエージェントに道具(ツール)を提供するインターフェースです。と言っても、具体的な例がないとわかりづらいので、早速MCPサーバーを作成してみることにします。
通貨換算のMCPサーバー
Laravelのマニュアルでは天気や温度を尋ねることができるサンプルでMCPサーバーを説明していますが、無料の為替レートのapiを見つけたので、ここではそれをもとに、Claude Codeにおいて、
> 1ドルを円に換算してください ● 1ドルは148.44円です。
このようなことを可能とさせるMCPサーバーを開発します。
いつものようにブラウザで対話するアプリを作成するのではなく、MCPサーバーのLaravelアプリを開発して、そのアプリのもとでClaude Codeを立ち上げ上の対話ができるように設定します。
MCPサーバーの開発
開発を始める前にまず必要なのは、laravel/mcpのパッケージのインストール
$ composer require laravel/mcp
そして、artisan makeでサーバーのクラスを作成します。
$ php artisan make:mcp-server CurrencyConversionServer
そして、次はそこで使用されるツールのクラスを作成。
$ php artisan make:mcp-tool CurrencyConversionTool
まずツールのクラスから見ていきます。
namespace App\Mcp\Tools;
use Laravel\Mcp\Request;
use Laravel\Mcp\Response;
use Laravel\Mcp\Server\Tool;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Http;
use Illuminate\JsonSchema\JsonSchema;
class CurrencyConversionTool extends Tool
{
/**
* The tool's description.
*/
protected string $description = 'このツールは、異なる通貨間の換算を行います。';
/**
* Handle the tool request.
*/
public function handle(Request $request): Response
{
$validated = $request->validate([
'from' => 'required|string|in:USD,JPY',
'to' => 'required|string|in:USD,JPY',
'amount' => 'required|numeric|min:0',
], [
'from.in' => 'サポートされていない通貨です。USDまたはJPYを使用してください。',
'to.in' => 'サポートされていない通貨です。USDまたはJPYを使用してください。',
]);
// TODO: 後に外部のAPIを使用して為替レートを取得して通貨換算を行う
return Response::text('100'); // 今は固定
}
/**
* Get the tool's input schema.
*
* @return array<string, \Illuminate\JsonSchema\JsonSchema>
*/
public function schema(JsonSchema $schema): array
{
return [
'from' => $schema->string()->description('換算元の通貨, "USD".')->required(),
'to' => $schema->string()->description('換算先の通貨, "JPY".')->required(),
'amount' => $schema->number()->description('換算する通貨の金額.')->required()
];
}
}
上のクラスでは、handle()とschema()のメソッドがありますが、handle()は、コントローラのように入力を受け取るRequestのクラスがあり、入力バリデーションと同様なvalidate()も実行できます。schema()はAIがこのツールを利用してどのような値を渡す必要があるか理解するためのメソッドです。
AIエージェントから受け取る入力の値は、schema()で説明しているようにfrom, to, amountと3つあり、それぞれ換算元の通貨、換算先の通貨、換算する通貨の金額からなります。例えば、それぞれ、USD, JPY, 1とかの値を受け取ります。ドル、円とかになっていないことに注意、それは頭が良いAIがドルをUSDに円をJPYとしてツールに渡します。
後に外部のAPIを利用して為替のレートを取得して換算を行うコードをいれますが、今はいつも100の値を返すようにします。
上で作成したツールは以下のサーバーのクラスに登録します。
namespace App\Mcp\Servers;
use App\Mcp\Tools\CurrencyConversionTool;
use Laravel\Mcp\Server;
class CurrencyConversionServer extends Server
{
/**
* The MCP server's name.
*/
protected string $name = '通貨換算サーバー';
/**
* The MCP server's version.
*/
protected string $version = '0.0.1';
/**
* The MCP server's instructions for the LLM.
*/
protected string $instructions = 'Instructions describing how to use the server and its features.';
/**
* The tools registered with this MCP server.
*
* @var array<int, class-string<\Laravel\Mcp\Server\Tool>>
*/
protected array $tools = [
CurrencyConversionTool::class,
];
/**
* The resources registered with this MCP server.
*
* @var array<int, class-string<\Laravel\Mcp\Server\Resource>>
*/
protected array $resources = [
//
];
/**
* The prompts registered with this MCP server.
*
* @var array<int, class-string<\Laravel\Mcp\Server\Prompt>>
*/
protected array $prompts = [
//
];
}
そしてそれを、今度は上のサーバーとルートに登録します。
use App\Mcp\Servers\CurrencyConversionServer;
use Laravel\Mcp\Facades\Mcp;
Mcp::local('currency-conversion', CurrencyConversionServer::class);
上の設定ではMcp::localを使用して、php artisan mcp:startで立ち上げたサーバーでAIエージェントからのアクセスを可能とします。
他にもMcp::webとしてウェブつまりhttpsでもアクセスが可能です。
最後に、AIエージェントにおいてMCPサーバーを登録します。
$ claude mcp add -s project currency-conversion php artisan mcp:start currency-conversion
この実行は、以下のファイルを作成します。
{
"mcpServers": {
"currency-conversion": {
"type": "stdio",
"command": "php",
"args": [
"artisan",
"mcp:start",
"currency-conversion"
],
"env": {}
}
}
}
動作確認
さて、これでコンソールでClaude Codeを立ち上げて、動作確認します。
立ち上げると、
New MCP server found in .mcp.json: currency-conversion │ MCP servers may execute code or access system resources. All tool calls require approval. Learn more in the MCP │ documentation (https://docs.claude.com/s/claude-code-mcp). │ │ ❯ 1. Use this and all future MCP servers in this project │ 2. Use this MCP server │ 3. Continue without using this MCP server
と問われます。新規のMCPサーバーを発見したということで、使用するかどうか聞いています。
もちろんなので、そのままEnterで進みます。これで次回からは問われません。
その後、MCPサーバーが登録されているか確認します。
> /mcp Manage MCP servers ❯ 1. currency-conversion ✔ connected · Enter to view details
MCPサーバーに接続されていますね。
さて質問してみましょう。
> 1ドルを円に換算してください ● currency-conversion - currency-conversion-tool (MCP)(from: "USD", to: "JPY", amount: 1) ⎿ 100 ● 1ドルは100円です。
AIがドルをUSDに円をJPYに変えてツールを使用していることわかります。
こちらの質問はどうかな。バリデーションで米ドルと円のみの対応に限定しているのでエラーとなるはずです
> 1ドルをユーロに換算してください ● currency-conversion - currency-conversion-tool (MCP)(from: "USD", to: "EUR", amount: 1) ⎿ Error: サポートされていない通貨です。USDまたはJPYを使用してください。 ● このMCP通貨変換ツールは、現在USDとJPYの間の換算のみサポートしているようです。USD(ドル)からEUR(ユーロ)への変換はサポ ートされていません。
期待通りエラーとなりましたね。
為替レートを取得
動作確認したところで、実際に為替を取得して通貨換算を行うコードをいれます。
namespace App\Mcp\Tools;
use Laravel\Mcp\Request;
use Laravel\Mcp\Response;
use Laravel\Mcp\Server\Tool;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Http;
use Illuminate\JsonSchema\JsonSchema;
class CurrencyConversionTool extends Tool
{
/**
* The tool's description.
*/
protected string $description = 'このツールは、異なる通貨間の換算を行います。';
/**
* Handle the tool request.
*/
public function handle(Request $request): Response
{
$validated = $request->validate([
'from' => 'required|string|in:USD,JPY',
'to' => 'required|string|in:USD,JPY',
'amount' => 'required|numeric|min:0',
], [
'from.in' => 'サポートされていない通貨です。USDまたはJPYを使用してください。',
'to.in' => 'サポートされていない通貨です。USDまたはJPYを使用してください。',
]);
try {
$response = Http::get('https://api.frankfurter.dev/v1/latest', [
'amount' => $validated['amount'],
'base' => strtoupper($validated['from']),
'symbols' => strtoupper($validated['to'])
]);
if (!$response->successful()) {
return Response::error('現在、換算サービスが利用できません。');
}
$data = $response->json();
if (!isset($data['rates'][strtoupper($validated['to'])])) {
return Response::error('通貨が見つかりません');
}
$converted = $data['rates'][strtoupper($validated['to'])];
return Response::text((string) $converted);
} catch (\Exception $e) {
return Response::error('通貨変換に失敗しました');
}
}
...
AIエージェントから受けとった入力は、https://frankfurter.devのサイトのAPIを利用します。
上のコードは基本的に以下のような実行となり、
https://api.frankfurter.dev/v1/latest?amount=1&base=USD&symbols=JPY
レスと返ってくるjsonから必要な値を取り出します。
{
"amount":1.0,
"base":"USD",
"date":"2025-09-24",
"rates":{"JPY":148.44}
}
これでMCPサーバー作成のコーディングは完了です。テストしてみましょう。
> 1000円をドルに換算してください ● currency-conversion - currency-conversion-tool (MCP)(from: "JPY", to: "USD", amount: 1000) ⎿ 6.72 ● 1000円は約6.72ドルです。
ばっちりです。
最後に
今回のMCPサーバーの開発を始める前に、もしかしたらツールを開発するまでもなくAIの方で勝手に情報を取得してくるのでは、という疑問があり尋ねてみたら、
> 1ドルを円に換算してください
● 為替レートは常に変動しているため、現在の正確な換算レートを確認する必要があります。
● Web Search("USD JPY exchange rate today 2025")
⎿ Did 1 search in 16s
● 現在(2025年9月24日時点)の為替レートによると、1ドル = 約147-148円です。
具体的には:
- 147.78円(一部のソースより)
- 148.71円(別のソースより)
- 146.58円(その他のソースより)
為替レートはリアルタイムで変動しているため、各金融機関や為替サイトで若干異なる数値が表示されますが、現在は1ドル =
約147-148円の範囲で取引されています。
どこかのウェブで検索してきて取得したみたいです。
もちろん、MCPサーバーを作成する方が、正確でいつも安定な答えを取得できるのは確かです。
メルマガ購読の申し込みはこちらから。