[{"data":1,"prerenderedAt":1758},["ShallowReactive",2],{"content-/code-execution-with-mcp":3,"all-pages-for-dir":1739,"related-/code-execution-with-mcp":1740,"og-image-/code-execution-with-mcp":1757},{"id":4,"title":5,"body":6,"category":1722,"concepts":1722,"description":1723,"extension":1724,"meta":1725,"navigation":306,"ogImage":1722,"path":1726,"project_name":1722,"published":1727,"publishedAt":1728,"seo":1729,"source":1722,"stem":1730,"tags":1731,"todo":1722,"unpublished":1727,"updatedAt":1722,"__hash__":1738},"pages/2025-12/2025-12-30/code-execution-with-mcp.md","MCPでのコード実行：より効率的なエージェントの構築",{"type":7,"value":8,"toc":1694},"minimark",[9,13,21,27,40,181,184,187,190,193,196,200,203,209,213,216,223,227,230,233,236,246,250,469,472,649,652,661,664,668,671,678,682,685,818,821,825,828,1000,1003,1007,1010,1187,1198,1202,1205,1401,1405,1408,1664,1667,1670,1675,1678,1681,1684,1687,1690],[10,11,5],"h1",{"id":12},"mcpでのコード実行より効率的なエージェントの構築",[14,15,16,20],"p",{},[17,18,19],"strong",{},"公開日:"," 2025年11月4日",[14,22,23,26],{},[17,24,25],{},"著者:"," Adam Jones、Conor Kelly",[14,28,29,32,33],{},[17,30,31],{},"原文:"," ",[34,35,39],"a",{"href":36,"rel":37},"https://www.anthropic.com/engineering/code-execution-with-mcp",[38],"nofollow","Code Execution with MCP: Building More Efficient Agents",[41,42,45,50,120,124,131,134,157,160,166,178],"callout",{"title":43,"type":44},"Claude Codeユーザーへの適用可能性評価","info",[46,47,49],"h2",{"id":48},"私の環境claude-codeで使えるか","私の環境（Claude Code）で使えるか？",[51,52,53,69],"table",{},[54,55,56],"thead",{},[57,58,59,63,66],"tr",{},[60,61,62],"th",{},"アプローチ",[60,64,65],{},"適用可否",[60,67,68],{},"備考",[70,71,72,89,99,109],"tbody",{},[57,73,74,78,81],{},[75,76,77],"td",{},"コード実行によるツールオーケストレーション",[75,79,80],{},"❌",[75,82,83,84,88],{},"Claude APIのベータ機能（",[85,86,87],"code",{},"code_execution","）が必要",[57,90,91,94,96],{},[75,92,93],{},"MCPサーバーのファイルシステム構成",[75,95,80],{},[75,97,98],{},"Claude Codeでは直接サポートされていない",[57,100,101,104,106],{},[75,102,103],{},"PII自動トークン化",[75,105,80],{},[75,107,108],{},"カスタムMCPクライアント実装が必要",[57,110,111,114,117],{},[75,112,113],{},"カスタムMCPサーバー作成",[75,115,116],{},"✅",[75,118,119],{},"自作MCPサーバーをClaude Codeに接続可能",[121,122,123],"h3",{"id":123},"結論",[14,125,126,127,130],{},"この記事で紹介されている",[17,128,129],{},"コード実行アプローチの大部分は、Claude Codeでは直接利用できません","。",[14,132,133],{},"理由：",[135,136,137,147,154],"ol",{},[138,139,140,143,144,146],"li",{},[17,141,142],{},"Programmatic Tool Calling","（",[85,145,87],{},"ツール）はClaude APIのベータ機能",[138,148,149,150,153],{},"Claude Codeは従来の",[17,151,152],{},"直接ツール呼び出し方式","のみサポート",[138,155,156],{},"MCPサーバーをファイルシステムとして公開する機能はない",[121,158,159],{"id":159},"唯一できること",[14,161,162,165],{},[17,163,164],{},"カスタムMCPサーバーの作成","は可能です。例えば：",[167,168,169,172,175],"ul",{},[138,170,171],{},"複数のツールをまとめた高レベルMCPサーバーを自作",[138,173,174],{},"データフィルタリングをサーバー側で行い、結果のみ返す",[138,176,177],{},"これにより間接的にトークン削減は実現可能",[14,179,180],{},"ただし、記事で説明されている「エージェントがコードを書いてツールをオーケストレーション」というパターンは使えません。",[182,183],"hr",{},[46,185,186],{"id":186},"概要",[14,188,189],{},"この記事では、エージェントが直接ツール呼び出しではなくコード実行を通じてMCPサーバーとより効率的に連携する方法を探ります。",[46,191,192],{"id":192},"課題",[14,194,195],{},"エージェントが多数のMCPサーバーに接続する際に2つの主要な課題が生じます：",[121,197,199],{"id":198},"_1-ツール定義のオーバーロード","1. ツール定義のオーバーロード",[14,201,202],{},"すべてのツール定義を事前に読み込むと、コンテキストウィンドウの大部分を消費します。",[204,205,206],"blockquote",{},[14,207,208],{},"「ツールの説明がコンテキストウィンドウをより多く占有し、応答時間とコストが増加する」",[121,210,212],{"id":211},"_2-中間結果の重複","2. 中間結果の重複",[14,214,215],{},"エージェントがツールを順次呼び出すと、結果はモデルを複数回通過する必要があります。",[14,217,218,219,222],{},"たとえばGoogle Driveから会議の議事録を取得してSalesforceに添付する場合、議事録全体がコンテキストを2回通過し、長いドキュメントでは",[17,220,221],{},"50,000トークン以上","が追加される可能性があります。",[46,224,226],{"id":225},"解決策コード実行アプローチ","解決策：コード実行アプローチ",[14,228,229],{},"ツールを直接関数呼び出しとして公開する代わりに、MCPサーバーをコードAPIとして提示します。エージェントはコードを書いてツールと対話し、オンデマンドのツール読み込みと環境内でのデータ処理によって両方の課題に対処します。",[121,231,232],{"id":232},"ファイルシステムアーキテクチャ",[14,234,235],{},"MCPツールをファイルシステムとして構成：",[237,238,243],"pre",{"className":239,"code":241,"language":242},[240],"language-text","servers\n├── google-drive\n│   ├── getDocument.ts\n│   ├── ... (他のツール)\n│   └── index.ts\n├── salesforce\n│   ├── updateRecord.ts\n│   ├── ... (他のツール)\n│   └── index.ts\n└── ... (他のサーバー)\n","text",[85,244,241],{"__ignoreMap":245},"",[121,247,249],{"id":248},"実装例ツールラッパー","実装例：ツールラッパー",[237,251,255],{"className":252,"code":253,"language":254,"meta":245,"style":245},"language-typescript shiki shiki-themes vitesse-light vitesse-light","// ./servers/google-drive/getDocument.ts\nimport { callMCPTool } from \"../../../client.js\";\n\ninterface GetDocumentInput {\n  documentId: string;\n}\n\ninterface GetDocumentResponse {\n  content: string;\n}\n\nexport async function getDocument(input: GetDocumentInput):\n  Promise\u003CGetDocumentResponse> {\n  return callMCPTool\u003CGetDocumentResponse>\n    ('google_drive__get_document', input);\n}\n","typescript",[85,256,257,266,301,308,322,336,342,347,357,369,374,379,409,426,441,464],{"__ignoreMap":245},[258,259,262],"span",{"class":260,"line":261},"line",1,[258,263,265],{"class":264},"sxvE3","// ./servers/google-drive/getDocument.ts\n",[258,267,269,273,277,281,284,287,291,295,298],{"class":260,"line":268},2,[258,270,272],{"class":271},"sHkkW","import",[258,274,276],{"class":275},"shFtX"," {",[258,278,280],{"class":279},"s4oTP"," callMCPTool",[258,282,283],{"class":275}," }",[258,285,286],{"class":271}," from",[258,288,290],{"class":289},"sMJiu"," \"",[258,292,294],{"class":293},"sdGka","../../../client.js",[258,296,297],{"class":289},"\"",[258,299,300],{"class":275},";\n",[258,302,304],{"class":260,"line":303},3,[258,305,307],{"emptyLinePlaceholder":306},true,"\n",[258,309,311,315,319],{"class":260,"line":310},4,[258,312,314],{"class":313},"stQ0i","interface",[258,316,318],{"class":317},"sSkh3"," GetDocumentInput",[258,320,321],{"class":275}," {\n",[258,323,325,328,331,334],{"class":260,"line":324},5,[258,326,327],{"class":279},"  documentId",[258,329,330],{"class":275},": ",[258,332,333],{"class":317},"string",[258,335,300],{"class":275},[258,337,339],{"class":260,"line":338},6,[258,340,341],{"class":275},"}\n",[258,343,345],{"class":260,"line":344},7,[258,346,307],{"emptyLinePlaceholder":306},[258,348,350,352,355],{"class":260,"line":349},8,[258,351,314],{"class":313},[258,353,354],{"class":317}," GetDocumentResponse",[258,356,321],{"class":275},[258,358,360,363,365,367],{"class":260,"line":359},9,[258,361,362],{"class":279},"  content",[258,364,330],{"class":275},[258,366,333],{"class":317},[258,368,300],{"class":275},[258,370,372],{"class":260,"line":371},10,[258,373,341],{"class":275},[258,375,377],{"class":260,"line":376},11,[258,378,307],{"emptyLinePlaceholder":306},[258,380,382,385,388,391,395,398,401,403,406],{"class":260,"line":381},12,[258,383,384],{"class":271},"export",[258,386,387],{"class":313}," async",[258,389,390],{"class":313}," function",[258,392,394],{"class":393},"senZ8"," getDocument",[258,396,397],{"class":275},"(",[258,399,400],{"class":279},"input",[258,402,330],{"class":275},[258,404,405],{"class":317},"GetDocumentInput",[258,407,408],{"class":275},"):\n",[258,410,412,415,418,421,424],{"class":260,"line":411},13,[258,413,414],{"class":317},"  Promise",[258,416,417],{"class":275},"\u003C",[258,419,420],{"class":317},"GetDocumentResponse",[258,422,423],{"class":275},">",[258,425,321],{"class":275},[258,427,429,432,434,436,438],{"class":260,"line":428},14,[258,430,431],{"class":271},"  return",[258,433,280],{"class":279},[258,435,417],{"class":275},[258,437,420],{"class":279},[258,439,440],{"class":275},">\n",[258,442,444,447,450,453,455,458,461],{"class":260,"line":443},15,[258,445,446],{"class":275},"    (",[258,448,449],{"class":289},"'",[258,451,452],{"class":293},"google_drive__get_document",[258,454,449],{"class":289},[258,456,457],{"class":275},",",[258,459,460],{"class":279}," input",[258,462,463],{"class":275},");\n",[258,465,467],{"class":260,"line":466},16,[258,468,341],{"class":275},[121,470,471],{"id":471},"実践的な使用パターン",[237,473,475],{"className":252,"code":474,"language":254,"meta":245,"style":245},"import * as gdrive from './servers/google-drive';\nimport * as salesforce from './servers/salesforce';\n\nconst transcript = (await gdrive.getDocument\n  ({ documentId: 'abc123' })).content;\nawait salesforce.updateRecord({\n  objectType: 'SalesMeeting',\n  recordId: '00Q5f000001abcXYZ',\n  data: { Notes: transcript }\n});\n",[85,476,477,502,524,528,553,579,593,610,626,644],{"__ignoreMap":245},[258,478,479,481,484,487,490,492,495,498,500],{"class":260,"line":261},[258,480,272],{"class":271},[258,482,483],{"class":313}," *",[258,485,486],{"class":271}," as",[258,488,489],{"class":279}," gdrive",[258,491,286],{"class":271},[258,493,494],{"class":289}," '",[258,496,497],{"class":293},"./servers/google-drive",[258,499,449],{"class":289},[258,501,300],{"class":275},[258,503,504,506,508,510,513,515,517,520,522],{"class":260,"line":268},[258,505,272],{"class":271},[258,507,483],{"class":313},[258,509,486],{"class":271},[258,511,512],{"class":279}," salesforce",[258,514,286],{"class":271},[258,516,494],{"class":289},[258,518,519],{"class":293},"./servers/salesforce",[258,521,449],{"class":289},[258,523,300],{"class":275},[258,525,526],{"class":260,"line":303},[258,527,307],{"emptyLinePlaceholder":306},[258,529,530,533,536,539,542,545,547,550],{"class":260,"line":310},[258,531,532],{"class":313},"const ",[258,534,535],{"class":279},"transcript",[258,537,538],{"class":275}," =",[258,540,541],{"class":275}," (",[258,543,544],{"class":271},"await",[258,546,489],{"class":279},[258,548,549],{"class":275},".",[258,551,552],{"class":279},"getDocument\n",[258,554,555,558,562,564,566,569,571,574,577],{"class":260,"line":324},[258,556,557],{"class":275},"  ({ ",[258,559,561],{"class":560},"sz8Xr","documentId",[258,563,330],{"class":275},[258,565,449],{"class":289},[258,567,568],{"class":293},"abc123",[258,570,449],{"class":289},[258,572,573],{"class":275}," })).",[258,575,576],{"class":279},"content",[258,578,300],{"class":275},[258,580,581,583,585,587,590],{"class":260,"line":338},[258,582,544],{"class":271},[258,584,512],{"class":279},[258,586,549],{"class":275},[258,588,589],{"class":393},"updateRecord",[258,591,592],{"class":275},"({\n",[258,594,595,598,600,602,605,607],{"class":260,"line":344},[258,596,597],{"class":560},"  objectType",[258,599,330],{"class":275},[258,601,449],{"class":289},[258,603,604],{"class":293},"SalesMeeting",[258,606,449],{"class":289},[258,608,609],{"class":275},",\n",[258,611,612,615,617,619,622,624],{"class":260,"line":349},[258,613,614],{"class":560},"  recordId",[258,616,330],{"class":275},[258,618,449],{"class":289},[258,620,621],{"class":293},"00Q5f000001abcXYZ",[258,623,449],{"class":289},[258,625,609],{"class":275},[258,627,628,631,634,637,639,641],{"class":260,"line":359},[258,629,630],{"class":560},"  data",[258,632,633],{"class":275},": { ",[258,635,636],{"class":560},"Notes",[258,638,330],{"class":275},[258,640,535],{"class":279},[258,642,643],{"class":275}," }\n",[258,645,646],{"class":260,"line":371},[258,647,648],{"class":275},"});\n",[46,650,651],{"id":651},"効率性の向上",[204,653,654],{},[14,655,656,657,660],{},"「これにより、トークン使用量が150,000トークンから2,000トークンに削減され、",[17,658,659],{},"98.7%の時間とコストの削減","となる」",[46,662,663],{"id":663},"主要な利点",[121,665,667],{"id":666},"_1-段階的開示progressive-disclosure","1. 段階的開示（Progressive Disclosure）",[14,669,670],{},"モデルはファイルシステムを自然にナビゲートし、すべてを事前に読み込むのではなく、オンデマンドでツール定義を読み取ります。",[14,672,673,674,677],{},"代替アプローチとして、エージェントが詳細レベル（最小限 vs 完全なスキーマ）を指定できる",[85,675,676],{},"search_tools","関数を実装することもできます。",[121,679,681],{"id":680},"_2-コンテキスト効率的な結果","2. コンテキスト効率的な結果",[14,683,684],{},"エージェントは実行環境内で大規模なデータセットをフィルタリングしてから、モデルに結果を返すことができます。",[237,686,688],{"className":252,"code":687,"language":254,"meta":245,"style":245},"const allRows = await gdrive.getSheet\n  ({ sheetId: 'abc123' });\nconst pendingOrders = allRows.filter(row =>\n  row[\"Status\"] === 'pending'\n);\nconsole.log(pendingOrders.slice(0, 5));\n",[85,689,690,709,727,752,781,785],{"__ignoreMap":245},[258,691,692,694,697,699,702,704,706],{"class":260,"line":261},[258,693,532],{"class":313},[258,695,696],{"class":279},"allRows",[258,698,538],{"class":275},[258,700,701],{"class":271}," await",[258,703,489],{"class":279},[258,705,549],{"class":275},[258,707,708],{"class":279},"getSheet\n",[258,710,711,713,716,718,720,722,724],{"class":260,"line":268},[258,712,557],{"class":275},[258,714,715],{"class":560},"sheetId",[258,717,330],{"class":275},[258,719,449],{"class":289},[258,721,568],{"class":293},[258,723,449],{"class":289},[258,725,726],{"class":275}," });\n",[258,728,729,731,734,736,739,741,744,746,749],{"class":260,"line":303},[258,730,532],{"class":313},[258,732,733],{"class":279},"pendingOrders",[258,735,538],{"class":275},[258,737,738],{"class":279}," allRows",[258,740,549],{"class":275},[258,742,743],{"class":393},"filter",[258,745,397],{"class":275},[258,747,748],{"class":279},"row",[258,750,751],{"class":275}," =>\n",[258,753,754,757,760,762,765,767,770,773,775,778],{"class":260,"line":310},[258,755,756],{"class":279},"  row",[258,758,759],{"class":275},"[",[258,761,297],{"class":289},[258,763,764],{"class":293},"Status",[258,766,297],{"class":289},[258,768,769],{"class":275},"]",[258,771,772],{"class":313}," === ",[258,774,449],{"class":289},[258,776,777],{"class":293},"pending",[258,779,780],{"class":289},"'\n",[258,782,783],{"class":260,"line":324},[258,784,463],{"class":275},[258,786,787,790,792,795,797,799,801,804,806,810,812,815],{"class":260,"line":338},[258,788,789],{"class":279},"console",[258,791,549],{"class":275},[258,793,794],{"class":393},"log",[258,796,397],{"class":275},[258,798,733],{"class":279},[258,800,549],{"class":275},[258,802,803],{"class":393},"slice",[258,805,397],{"class":275},[258,807,809],{"class":808},"sM54T","0",[258,811,457],{"class":275},[258,813,814],{"class":808}," 5",[258,816,817],{"class":275},"));\n",[14,819,820],{},"10,000行のスプレッドシートを処理する場合、モデルに返すのはフィルタリングされた5行だけになります。",[121,822,824],{"id":823},"_3-制御フロー","3. 制御フロー",[14,826,827],{},"ループ、条件分岐、エラー処理がモデルの繰り返し呼び出しを必要とせず、コード内で実行されます。",[237,829,831],{"className":252,"code":830,"language":254,"meta":245,"style":245},"let found = false;\nwhile (!found) {\n  const messages = await slack.getChannelHistory\n    ({ channel: 'C123456' });\n  found = messages.some(m =>\n    m.text.includes('deployment complete'));\n  if (!found) await new Promise\n    (r => setTimeout(r, 5000));\n}\n",[85,832,833,848,865,885,904,926,951,972,996],{"__ignoreMap":245},[258,834,835,838,841,843,846],{"class":260,"line":261},[258,836,837],{"class":313},"let ",[258,839,840],{"class":279},"found",[258,842,538],{"class":275},[258,844,845],{"class":271}," false",[258,847,300],{"class":275},[258,849,850,853,855,858,860,863],{"class":260,"line":268},[258,851,852],{"class":271},"while",[258,854,541],{"class":275},[258,856,857],{"class":313},"!",[258,859,840],{"class":279},[258,861,862],{"class":275},")",[258,864,321],{"class":275},[258,866,867,870,873,875,877,880,882],{"class":260,"line":303},[258,868,869],{"class":313},"  const ",[258,871,872],{"class":279},"messages",[258,874,538],{"class":275},[258,876,701],{"class":271},[258,878,879],{"class":279}," slack",[258,881,549],{"class":275},[258,883,884],{"class":279},"getChannelHistory\n",[258,886,887,890,893,895,897,900,902],{"class":260,"line":310},[258,888,889],{"class":275},"    ({ ",[258,891,892],{"class":560},"channel",[258,894,330],{"class":275},[258,896,449],{"class":289},[258,898,899],{"class":293},"C123456",[258,901,449],{"class":289},[258,903,726],{"class":275},[258,905,906,909,911,914,916,919,921,924],{"class":260,"line":324},[258,907,908],{"class":279},"  found",[258,910,538],{"class":275},[258,912,913],{"class":279}," messages",[258,915,549],{"class":275},[258,917,918],{"class":393},"some",[258,920,397],{"class":275},[258,922,923],{"class":279},"m",[258,925,751],{"class":275},[258,927,928,931,933,935,937,940,942,944,947,949],{"class":260,"line":338},[258,929,930],{"class":279},"    m",[258,932,549],{"class":275},[258,934,242],{"class":279},[258,936,549],{"class":275},[258,938,939],{"class":393},"includes",[258,941,397],{"class":275},[258,943,449],{"class":289},[258,945,946],{"class":293},"deployment complete",[258,948,449],{"class":289},[258,950,817],{"class":275},[258,952,953,956,958,960,962,964,966,969],{"class":260,"line":344},[258,954,955],{"class":271},"  if",[258,957,541],{"class":275},[258,959,857],{"class":313},[258,961,840],{"class":279},[258,963,862],{"class":275},[258,965,701],{"class":271},[258,967,968],{"class":313}," new",[258,970,971],{"class":560}," Promise\n",[258,973,974,976,979,982,985,987,989,991,994],{"class":260,"line":349},[258,975,446],{"class":275},[258,977,978],{"class":279},"r",[258,980,981],{"class":275}," =>",[258,983,984],{"class":393}," setTimeout",[258,986,397],{"class":275},[258,988,978],{"class":279},[258,990,457],{"class":275},[258,992,993],{"class":808}," 5000",[258,995,817],{"class":275},[258,997,998],{"class":260,"line":359},[258,999,341],{"class":275},[14,1001,1002],{},"条件ロジックは反復的なモデル呼び出しを必要とせず、環境内で実行されます。",[121,1004,1006],{"id":1005},"_4-プライバシー保護","4. プライバシー保護",[14,1008,1009],{},"中間結果はデフォルトで実行環境内に留まります。システムは個人識別情報（PII）を自動的にトークン化し、データをモデルに公開することなくサービス間で流すことができます。",[237,1011,1013],{"className":252,"code":1012,"language":254,"meta":245,"style":245},"const sheet = await gdrive.getSheet\n  ({ sheetId: 'abc123' });\nfor (const row of sheet.rows) {\n  await salesforce.updateRecord({\n    objectType: 'Lead',\n    recordId: row.salesforceId,\n    data: {\n      Email: row.email,\n      Phone: row.phone,\n      Name: row.name\n    }\n  });\n}\n",[85,1014,1015,1032,1048,1074,1087,1103,1119,1127,1143,1159,1173,1178,1183],{"__ignoreMap":245},[258,1016,1017,1019,1022,1024,1026,1028,1030],{"class":260,"line":261},[258,1018,532],{"class":313},[258,1020,1021],{"class":279},"sheet",[258,1023,538],{"class":275},[258,1025,701],{"class":271},[258,1027,489],{"class":279},[258,1029,549],{"class":275},[258,1031,708],{"class":279},[258,1033,1034,1036,1038,1040,1042,1044,1046],{"class":260,"line":268},[258,1035,557],{"class":275},[258,1037,715],{"class":560},[258,1039,330],{"class":275},[258,1041,449],{"class":289},[258,1043,568],{"class":293},[258,1045,449],{"class":289},[258,1047,726],{"class":275},[258,1049,1050,1053,1055,1057,1059,1062,1065,1067,1070,1072],{"class":260,"line":303},[258,1051,1052],{"class":271},"for",[258,1054,541],{"class":275},[258,1056,532],{"class":313},[258,1058,748],{"class":279},[258,1060,1061],{"class":313}," of",[258,1063,1064],{"class":279}," sheet",[258,1066,549],{"class":275},[258,1068,1069],{"class":279},"rows",[258,1071,862],{"class":275},[258,1073,321],{"class":275},[258,1075,1076,1079,1081,1083,1085],{"class":260,"line":310},[258,1077,1078],{"class":271},"  await",[258,1080,512],{"class":279},[258,1082,549],{"class":275},[258,1084,589],{"class":393},[258,1086,592],{"class":275},[258,1088,1089,1092,1094,1096,1099,1101],{"class":260,"line":324},[258,1090,1091],{"class":560},"    objectType",[258,1093,330],{"class":275},[258,1095,449],{"class":289},[258,1097,1098],{"class":293},"Lead",[258,1100,449],{"class":289},[258,1102,609],{"class":275},[258,1104,1105,1108,1110,1112,1114,1117],{"class":260,"line":338},[258,1106,1107],{"class":560},"    recordId",[258,1109,330],{"class":275},[258,1111,748],{"class":279},[258,1113,549],{"class":275},[258,1115,1116],{"class":279},"salesforceId",[258,1118,609],{"class":275},[258,1120,1121,1124],{"class":260,"line":344},[258,1122,1123],{"class":560},"    data",[258,1125,1126],{"class":275},": {\n",[258,1128,1129,1132,1134,1136,1138,1141],{"class":260,"line":349},[258,1130,1131],{"class":560},"      Email",[258,1133,330],{"class":275},[258,1135,748],{"class":279},[258,1137,549],{"class":275},[258,1139,1140],{"class":279},"email",[258,1142,609],{"class":275},[258,1144,1145,1148,1150,1152,1154,1157],{"class":260,"line":359},[258,1146,1147],{"class":560},"      Phone",[258,1149,330],{"class":275},[258,1151,748],{"class":279},[258,1153,549],{"class":275},[258,1155,1156],{"class":279},"phone",[258,1158,609],{"class":275},[258,1160,1161,1164,1166,1168,1170],{"class":260,"line":371},[258,1162,1163],{"class":560},"      Name",[258,1165,330],{"class":275},[258,1167,748],{"class":279},[258,1169,549],{"class":275},[258,1171,1172],{"class":279},"name\n",[258,1174,1175],{"class":260,"line":376},[258,1176,1177],{"class":275},"    }\n",[258,1179,1180],{"class":260,"line":381},[258,1181,1182],{"class":275},"  });\n",[258,1184,1185],{"class":260,"line":411},[258,1186,341],{"class":275},[14,1188,1189,1190,1193,1194,1197],{},"MCPクライアントはPIIをインターセプトし、モデルが見る前に",[85,1191,1192],{},"[EMAIL_1]","、",[85,1195,1196],{},"[PHONE_1]","のようなトークンに変換します。実際の値はモデルに公開されることなく、サービス間で直接流れます。",[121,1199,1201],{"id":1200},"_5-状態の永続化","5. 状態の永続化",[14,1203,1204],{},"エージェントは中間結果をファイルに書き込むことができ、進捗追跡と再開可能なワークフローを可能にします。",[237,1206,1208],{"className":252,"code":1207,"language":254,"meta":245,"style":245},"const leads = await salesforce.query({\n  query: 'SELECT Id, Email FROM Lead LIMIT 1000'\n});\nconst csvData = leads.map(l =>\n  `${l.Id},${l.Email}`).join('\\n');\nawait fs.writeFile('./workspace/leads.csv', csvData);\n\n// 後で読み込み\nconst saved = await fs.readFile\n  ('./workspace/leads.csv', 'utf-8');\n",[85,1209,1210,1230,1244,1248,1272,1324,1352,1356,1361,1379],{"__ignoreMap":245},[258,1211,1212,1214,1217,1219,1221,1223,1225,1228],{"class":260,"line":261},[258,1213,532],{"class":313},[258,1215,1216],{"class":279},"leads",[258,1218,538],{"class":275},[258,1220,701],{"class":271},[258,1222,512],{"class":279},[258,1224,549],{"class":275},[258,1226,1227],{"class":393},"query",[258,1229,592],{"class":275},[258,1231,1232,1235,1237,1239,1242],{"class":260,"line":268},[258,1233,1234],{"class":560},"  query",[258,1236,330],{"class":275},[258,1238,449],{"class":289},[258,1240,1241],{"class":293},"SELECT Id, Email FROM Lead LIMIT 1000",[258,1243,780],{"class":289},[258,1245,1246],{"class":260,"line":303},[258,1247,648],{"class":275},[258,1249,1250,1252,1255,1257,1260,1262,1265,1267,1270],{"class":260,"line":310},[258,1251,532],{"class":313},[258,1253,1254],{"class":279},"csvData",[258,1256,538],{"class":275},[258,1258,1259],{"class":279}," leads",[258,1261,549],{"class":275},[258,1263,1264],{"class":393},"map",[258,1266,397],{"class":275},[258,1268,1269],{"class":279},"l",[258,1271,751],{"class":275},[258,1273,1274,1277,1280,1282,1284,1287,1290,1292,1294,1296,1298,1301,1303,1306,1309,1312,1314,1316,1320,1322],{"class":260,"line":324},[258,1275,1276],{"class":289},"  `",[258,1278,1279],{"class":271},"${",[258,1281,1269],{"class":293},[258,1283,549],{"class":275},[258,1285,1286],{"class":293},"Id",[258,1288,1289],{"class":271},"}",[258,1291,457],{"class":293},[258,1293,1279],{"class":271},[258,1295,1269],{"class":293},[258,1297,549],{"class":275},[258,1299,1300],{"class":293},"Email",[258,1302,1289],{"class":271},[258,1304,1305],{"class":289},"`",[258,1307,1308],{"class":275},").",[258,1310,1311],{"class":393},"join",[258,1313,397],{"class":275},[258,1315,449],{"class":289},[258,1317,1319],{"class":1318},"snbK4","\\n",[258,1321,449],{"class":289},[258,1323,463],{"class":275},[258,1325,1326,1328,1331,1333,1336,1338,1340,1343,1345,1347,1350],{"class":260,"line":338},[258,1327,544],{"class":271},[258,1329,1330],{"class":279}," fs",[258,1332,549],{"class":275},[258,1334,1335],{"class":393},"writeFile",[258,1337,397],{"class":275},[258,1339,449],{"class":289},[258,1341,1342],{"class":293},"./workspace/leads.csv",[258,1344,449],{"class":289},[258,1346,457],{"class":275},[258,1348,1349],{"class":279}," csvData",[258,1351,463],{"class":275},[258,1353,1354],{"class":260,"line":344},[258,1355,307],{"emptyLinePlaceholder":306},[258,1357,1358],{"class":260,"line":349},[258,1359,1360],{"class":264},"// 後で読み込み\n",[258,1362,1363,1365,1368,1370,1372,1374,1376],{"class":260,"line":359},[258,1364,532],{"class":313},[258,1366,1367],{"class":279},"saved",[258,1369,538],{"class":275},[258,1371,701],{"class":271},[258,1373,1330],{"class":279},[258,1375,549],{"class":275},[258,1377,1378],{"class":279},"readFile\n",[258,1380,1381,1384,1386,1388,1390,1392,1394,1397,1399],{"class":260,"line":371},[258,1382,1383],{"class":275},"  (",[258,1385,449],{"class":289},[258,1387,1342],{"class":293},[258,1389,449],{"class":289},[258,1391,457],{"class":275},[258,1393,494],{"class":289},[258,1395,1396],{"class":293},"utf-8",[258,1398,449],{"class":289},[258,1400,463],{"class":275},[121,1402,1404],{"id":1403},"_6-スキル開発","6. スキル開発",[14,1406,1407],{},"エージェントは動作するコード実装を再利用可能な関数として保存し、より高レベルな機能のツールボックスを徐々に構築できます。",[237,1409,1411],{"className":252,"code":1410,"language":254,"meta":245,"style":245},"// ./skills/save-sheet-as-csv.ts\nimport * as gdrive from './servers/google-drive';\n\nexport async function saveSheetAsCsv(sheetId: string) {\n  const data = await gdrive.getSheet({ sheetId });\n  const csv = data.map(row =>\n    row.join(',')).join('\\n');\n  await fs.writeFile\n    (`./workspace/sheet-${sheetId}.csv`, csv);\n  return `./workspace/sheet-${sheetId}.csv`;\n}\n\n// 使用例\nimport { saveSheetAsCsv } from\n  './skills/save-sheet-as-csv';\nconst csvPath = await saveSheetAsCsv('abc123');\n",[85,1412,1413,1418,1438,1442,1465,1490,1512,1544,1555,1582,1603,1607,1611,1616,1629,1641],{"__ignoreMap":245},[258,1414,1415],{"class":260,"line":261},[258,1416,1417],{"class":264},"// ./skills/save-sheet-as-csv.ts\n",[258,1419,1420,1422,1424,1426,1428,1430,1432,1434,1436],{"class":260,"line":268},[258,1421,272],{"class":271},[258,1423,483],{"class":313},[258,1425,486],{"class":271},[258,1427,489],{"class":279},[258,1429,286],{"class":271},[258,1431,494],{"class":289},[258,1433,497],{"class":293},[258,1435,449],{"class":289},[258,1437,300],{"class":275},[258,1439,1440],{"class":260,"line":303},[258,1441,307],{"emptyLinePlaceholder":306},[258,1443,1444,1446,1448,1450,1453,1455,1457,1459,1461,1463],{"class":260,"line":310},[258,1445,384],{"class":271},[258,1447,387],{"class":313},[258,1449,390],{"class":313},[258,1451,1452],{"class":393}," saveSheetAsCsv",[258,1454,397],{"class":275},[258,1456,715],{"class":279},[258,1458,330],{"class":275},[258,1460,333],{"class":317},[258,1462,862],{"class":275},[258,1464,321],{"class":275},[258,1466,1467,1469,1472,1474,1476,1478,1480,1483,1486,1488],{"class":260,"line":324},[258,1468,869],{"class":313},[258,1470,1471],{"class":279},"data",[258,1473,538],{"class":275},[258,1475,701],{"class":271},[258,1477,489],{"class":279},[258,1479,549],{"class":275},[258,1481,1482],{"class":393},"getSheet",[258,1484,1485],{"class":275},"({ ",[258,1487,715],{"class":279},[258,1489,726],{"class":275},[258,1491,1492,1494,1497,1499,1502,1504,1506,1508,1510],{"class":260,"line":338},[258,1493,869],{"class":313},[258,1495,1496],{"class":279},"csv",[258,1498,538],{"class":275},[258,1500,1501],{"class":279}," data",[258,1503,549],{"class":275},[258,1505,1264],{"class":393},[258,1507,397],{"class":275},[258,1509,748],{"class":279},[258,1511,751],{"class":275},[258,1513,1514,1517,1519,1521,1523,1525,1527,1529,1532,1534,1536,1538,1540,1542],{"class":260,"line":344},[258,1515,1516],{"class":279},"    row",[258,1518,549],{"class":275},[258,1520,1311],{"class":393},[258,1522,397],{"class":275},[258,1524,449],{"class":289},[258,1526,457],{"class":293},[258,1528,449],{"class":289},[258,1530,1531],{"class":275},")).",[258,1533,1311],{"class":393},[258,1535,397],{"class":275},[258,1537,449],{"class":289},[258,1539,1319],{"class":1318},[258,1541,449],{"class":289},[258,1543,463],{"class":275},[258,1545,1546,1548,1550,1552],{"class":260,"line":349},[258,1547,1078],{"class":271},[258,1549,1330],{"class":279},[258,1551,549],{"class":275},[258,1553,1554],{"class":279},"writeFile\n",[258,1556,1557,1559,1561,1564,1566,1568,1570,1573,1575,1577,1580],{"class":260,"line":359},[258,1558,446],{"class":275},[258,1560,1305],{"class":289},[258,1562,1563],{"class":293},"./workspace/sheet-",[258,1565,1279],{"class":271},[258,1567,715],{"class":293},[258,1569,1289],{"class":271},[258,1571,1572],{"class":293},".csv",[258,1574,1305],{"class":289},[258,1576,457],{"class":275},[258,1578,1579],{"class":279}," csv",[258,1581,463],{"class":275},[258,1583,1584,1586,1589,1591,1593,1595,1597,1599,1601],{"class":260,"line":371},[258,1585,431],{"class":271},[258,1587,1588],{"class":289}," `",[258,1590,1563],{"class":293},[258,1592,1279],{"class":271},[258,1594,715],{"class":293},[258,1596,1289],{"class":271},[258,1598,1572],{"class":293},[258,1600,1305],{"class":289},[258,1602,300],{"class":275},[258,1604,1605],{"class":260,"line":376},[258,1606,341],{"class":275},[258,1608,1609],{"class":260,"line":381},[258,1610,307],{"emptyLinePlaceholder":306},[258,1612,1613],{"class":260,"line":411},[258,1614,1615],{"class":264},"// 使用例\n",[258,1617,1618,1620,1622,1624,1626],{"class":260,"line":428},[258,1619,272],{"class":271},[258,1621,276],{"class":275},[258,1623,1452],{"class":279},[258,1625,283],{"class":275},[258,1627,1628],{"class":271}," from\n",[258,1630,1631,1634,1637,1639],{"class":260,"line":443},[258,1632,1633],{"class":289},"  '",[258,1635,1636],{"class":293},"./skills/save-sheet-as-csv",[258,1638,449],{"class":289},[258,1640,300],{"class":275},[258,1642,1643,1645,1648,1650,1652,1654,1656,1658,1660,1662],{"class":260,"line":466},[258,1644,532],{"class":313},[258,1646,1647],{"class":279},"csvPath",[258,1649,538],{"class":275},[258,1651,701],{"class":271},[258,1653,1452],{"class":393},[258,1655,397],{"class":275},[258,1657,449],{"class":289},[258,1659,568],{"class":293},[258,1661,449],{"class":289},[258,1663,463],{"class":275},[46,1665,1666],{"id":1666},"実装上の考慮事項",[14,1668,1669],{},"このアプローチには、適切なサンドボックス化、リソース制限、監視を備えた安全なコード実行インフラストラクチャが必要です。",[204,1671,1672],{},[14,1673,1674],{},"「エージェントが生成したコードを実行するには、適切なサンドボックス化、リソース制限、監視を備えた安全な実行環境が必要です」",[14,1676,1677],{},"これらの運用要件は、効率性の向上と比較検討する必要があります。",[46,1679,1680],{"id":1680},"関連情報",[14,1682,1683],{},"記事ではCloudflareの並行した取り組みに言及し、LLMコード生成の利点に関する類似の洞察を指摘しています。MCPコミュニティとの実装共有も推奨しています。",[46,1685,123],{"id":1686},"結論-1",[14,1688,1689],{},"コード実行は複雑さを導入しますが、確立されたソフトウェアエンジニアリングパターンをエージェント開発に適用し、馴染みのあるプログラミング構造を通じてより効率的なMCPサーバー連携を実現します。",[1691,1692,1693],"style",{},"html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html pre.shiki code .sHkkW, html code.shiki .sHkkW{--shiki-default:#1E754F;--shiki-dark:#1E754F}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .s4oTP, html code.shiki .s4oTP{--shiki-default:#B07D48;--shiki-dark:#B07D48}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html pre.shiki code .stQ0i, html code.shiki .stQ0i{--shiki-default:#AB5959;--shiki-dark:#AB5959}html pre.shiki code .sSkh3, html code.shiki .sSkh3{--shiki-default:#2E8F82;--shiki-dark:#2E8F82}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sz8Xr, html code.shiki .sz8Xr{--shiki-default:#998418;--shiki-dark:#998418}html pre.shiki code .sM54T, html code.shiki .sM54T{--shiki-default:#2F798A;--shiki-dark:#2F798A}html pre.shiki code .snbK4, html code.shiki .snbK4{--shiki-default:#A65E2B;--shiki-dark:#A65E2B}",{"title":245,"searchDepth":268,"depth":268,"links":1695},[1696,1700,1701,1705,1710,1711,1719,1720,1721],{"id":48,"depth":268,"text":49,"children":1697},[1698,1699],{"id":123,"depth":303,"text":123},{"id":159,"depth":303,"text":159},{"id":186,"depth":268,"text":186},{"id":192,"depth":268,"text":192,"children":1702},[1703,1704],{"id":198,"depth":303,"text":199},{"id":211,"depth":303,"text":212},{"id":225,"depth":268,"text":226,"children":1706},[1707,1708,1709],{"id":232,"depth":303,"text":232},{"id":248,"depth":303,"text":249},{"id":471,"depth":303,"text":471},{"id":651,"depth":268,"text":651},{"id":663,"depth":268,"text":663,"children":1712},[1713,1714,1715,1716,1717,1718],{"id":666,"depth":303,"text":667},{"id":680,"depth":303,"text":681},{"id":823,"depth":303,"text":824},{"id":1005,"depth":303,"text":1006},{"id":1200,"depth":303,"text":1201},{"id":1403,"depth":303,"text":1404},{"id":1666,"depth":268,"text":1666},{"id":1680,"depth":268,"text":1680},{"id":1686,"depth":268,"text":123},null,"MCPサーバーとの連携を直接ツール呼び出しではなくコード実行で行うことで、トークン使用量を98.7%削減する手法を解説。","md",{},"/code-execution-with-mcp",false,"2025-12-30T00:00:00.000Z",{"title":5,"description":1723},"2025-12/2025-12-30/code-execution-with-mcp",[1732,1733,1734,1735,1736,1737],"Claude","Anthropic","MCP","AI","エージェント","コード実行","T2bK8UKvgGTM5UCyb9YMHMlxrPemxtc7oa-0IoSQxzk",[],[1741,1744,1748,1751,1754],{"title":1742,"path":1743,"publishedAt":1728},"効果的なエージェントの構築","/building-effective-agents",{"title":1745,"path":1746,"publishedAt":1747},"AI格差は、まず体験格差として現れる","/ai-experience-gap-frontier-models","2026-06-29T00:00:00.000Z",{"title":1749,"path":1750,"publishedAt":1728},"Claude開発者プラットフォームの高度なツール利用機能","/advanced-tool-use",{"title":1752,"path":1753,"publishedAt":1728},"Agent Skillsで実世界に対応するAIエージェントを構築する","/agent-skills",{"title":1755,"path":1756,"publishedAt":1728},"Claude Agent SDKでエージェントを構築する","/claude-agent-sdk","https://log.eurekapu.com/og/blog/code-execution-with-mcp.png?v=2025-12-30T00%3A00%3A00.000Z&title=MCP%E3%81%A7%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E5%AE%9F%E8%A1%8C%EF%BC%9A%E3%82%88%E3%82%8A%E5%8A%B9%E7%8E%87%E7%9A%84%E3%81%AA%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E6%A7%8B%E7%AF%89&author=Kei%20Komatsu&sig=c8e34fa3bfab4f11",1785654699151]