Skip to content

MCPツールのmaxResultSizeCharsがトークンベースの永続化レイヤーをバイパスしない問題の修正

原文(日本語に翻訳)

_meta["anthropic/maxResultSizeChars"] を持つMCPツールがトークンベースの永続化レイヤーをバイパスしない問題を修正しました。

原文(英語)

Fixed MCP tools with _meta["anthropic/maxResultSizeChars"] not bypassing the token-based persist layer

概要

MCP(Model Context Protocol)ツールが _meta["anthropic/maxResultSizeChars"] メタデータを使って結果サイズの上限を指定している場合、その設定がトークンベースの永続化(コンテキスト保持)レイヤーに反映されず、ツール結果が期待通りに扱われない問題がありました。この修正により、maxResultSizeChars の設定が永続化レイヤーにも正しく適用されるようになります。

基本的な使い方

修正前の動作

javascript
// MCPツールがmaxResultSizCharsを指定している場合
{
  "content": [{ "type": "text", "text": "大量のデータ..." }],
  "_meta": {
    "anthropic/maxResultSizeChars": 10000  // 最大10000文字を指定
  }
}

// 修正前: このメタデータが永続化レイヤーで無視され、
// トークンベースのデフォルト制限が適用されていた
// → 意図した制限サイズと異なる挙動になる場合があった

修正後の動作

javascript
// 同じMCPツールの出力
{
  "content": [{ "type": "text", "text": "大量のデータ..." }],
  "_meta": {
    "anthropic/maxResultSizeChars": 10000
  }
}

// 修正後: maxResultSizeCharsが永続化レイヤーでも正しく尊重される
// → 指定した文字数制限に従って結果が処理される

実践例

### 大量データを返すMCPツールの設定

データベース検索やログ取得など大量データを返す可能性があるMCPツールでの使用:

python
# MCPツールの実装例(Python)
def search_database(query: str) -> dict:
    results = db.search(query)
    formatted_results = format_results(results)
    
    return {
        "content": [
            {
                "type": "text",
                "text": formatted_results
            }
        ],
        "_meta": {
            "anthropic/maxResultSizeChars": 50000  # 最大50,000文字
        }
    }

# 修正後: この設定が永続化レイヤーでも有効になり、
# コンテキストウィンドウを適切に管理できる

### ファイルシステムMCPツールでの大きなファイル読み取り

javascript
// ファイル読み取りMCPツールの実装例
async function readFile(filePath) {
  const content = await fs.readFile(filePath, 'utf-8');
  return {
    content: [{ type: 'text', text: content }],
    _meta: {
      'anthropic/maxResultSizeChars': 100000  // 100KB文字制限
    }
  };
}

// 修正後: この制限がトークンベースの永続化にも反映され、
// 大きなファイルでもコンテキストを効率的に管理できる

### カスタムMCPサーバーでの結果サイズ管理

typescript
// TypeScript MCP サーバーの実装
server.setRequestHandler(CallToolRequestSchema, async (request) => {
  const result = await processLargeData(request.params);
  
  return {
    content: [{ type: 'text', text: result }],
    _meta: {
      'anthropic/maxResultSizeChars': 25000
    }
  };
});

// 修正後: カスタムMCPサーバーで指定した文字数制限が
// 永続化レイヤーでも正しく機能する

注意点

  • _meta["anthropic/maxResultSizeChars"] はAnthropicが提供するMCP拡張メタデータです。すべてのMCPクライアントがこのメタデータをサポートするわけではありません。
  • この修正はMCPツール開発者向けのものです。Claude Codeのエンドユーザーは特別な設定なしに恩恵を受けます。
  • maxResultSizeChars は文字数(バイト数ではない)での制限です。マルチバイト文字を含むコンテンツでは注意が必要です。
  • トークンベースの永続化レイヤーはコンテキストウィンドウ管理に関わるため、この修正により長いセッションでのメモリ効率が改善される場合があります。

関連情報