Skip to content

原文(日本語に翻訳) ​

claude mcp serve のツール呼び出しが、outputSchema をバリデートするMCPクライアントで「Tool execution failed」で失敗する問題を修正しました。

原文(英語) ​

Fixed claude mcp serve tool calls failing with "Tool execution failed" in MCP clients that validate outputSchema

概要 ​

claude mcp serve で提供されるツールを、outputSchema のバリデーションを行うMCPクライアントから呼び出した場合に、「Tool execution failed」エラーが発生していました。Claude Codeが提供するツールの outputSchema が、一部のMCPクライアントが期待する形式と一致していなかったことが原因です。このアップデートにより、互換性が改善されました。

基本的な使い方 ​

bash
# Claude CodeをMCPサーバーとして起動
claude mcp serve

# 修正前: outputSchemaを検証するMCPクライアントからの呼び出しが失敗
# Error: Tool execution failed - outputSchema validation error

# 修正後: 正しいoutputSchemaが提供され、バリデーションが通る

実践例 ​

MCPサーバーとしてのClaude Code設定 ​

bash
# Claude CodeをMCPサーバーとして起動する設定

# 起動コマンド
claude mcp serve --port 3000

# または設定ファイルで指定
cat ~/.claude/mcp-server.json
json
{
  "server": {
    "port": 3000,
    "host": "localhost"
  },
  "tools": {
    "expose": ["Read", "Write", "Edit", "Bash"]
  }
}

MCP対応クライアントからの接続 ​

python
# Python MCPクライアントでClaude Codeのツールを使用
import asyncio
from mcp import Client

async def use_claude_tools():
    async with Client("http://localhost:3000") as client:
        # ツール一覧を取得(outputSchemaが含まれる)
        tools = await client.list_tools()
        
        for tool in tools:
            print(f"Tool: {tool.name}")
            print(f"Output Schema: {tool.output_schema}")
            # 修正後: outputSchemaが正しい形式で返される
        
        # ツールの実行
        result = await client.call_tool("Read", {
            "file_path": "/path/to/file.txt"
        })
        print(result)

asyncio.run(use_claude_tools())

TypeScript MCPクライアントでの使用 ​

typescript
// TypeScript MCPクライアント
import { MCPClient } from '@modelcontextprotocol/sdk/client/index.js';
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';

const client = new MCPClient();

async function connectToClaudeCode() {
  const transport = new StdioClientTransport({
    command: 'claude',
    args: ['mcp', 'serve']
  });
  
  await client.connect(transport);
  
  // ツール一覧を取得
  const tools = await client.listTools();
  
  console.log('Available tools:');
  tools.tools.forEach(tool => {
    console.log(`- ${tool.name}: ${tool.description}`);
    // 修正後: outputSchemaが正しく含まれる
    if (tool.outputSchema) {
      console.log(`  Output schema: ${JSON.stringify(tool.outputSchema)}`);
    }
  });
  
  // Read ツールを呼び出し
  const result = await client.callTool({
    name: 'Read',
    arguments: {
      file_path: './README.md'
    }
  });
  
  console.log('Result:', result);
}

connectToClaudeCode();

outputSchemaのデバッグ ​

bash
# MCP Inspectorでツールのスキーマを確認
npx @modelcontextprotocol/inspector claude mcp serve

# curlでMCPエンドポイントを直接テスト
curl -X POST http://localhost:3000/tools \
  -H "Content-Type: application/json" \
  -d '{"method": "tools/list"}'

# outputSchemaが含まれるか確認
curl -X POST http://localhost:3000/tools \
  -H "Content-Type: application/json" \
  -d '{"method": "tools/list"}' | python3 -m json.tool | grep -A 20 "outputSchema"

注意点 ​

  • この修正はMCPクライアント側で outputSchema のバリデーションを行う実装に影響します
  • claude mcp serve で提供されるすべてのツールの outputSchema が修正されます
  • MCPプロトコルの仕様に準拠した形式でスキーマが提供されます
  • 既存のMCPクライアント実装でバリデーションを行っていない場合は影響がありません
  • MCP Inspector などのデバッグツールで修正されたスキーマを確認できます

関連情報 ​