HN 日本語サマリー

← 一覧へ戻る
プログラミング

「MCPは不要だと言ったのに」

You said no MCP (earendil.com)

679 pointsby yarapavan362 コメント

要約

Earendil Engineeringは、以前はMCP(Model-Centric Prompting)を支持しないと公言していましたが、最近のPiのアップデートでMCPがサポートされるようになりました。これは、MCP自体が進化したこと、そしてPiのエコシステムとの親和性が高まったためです。特に、MCPとCodemodeを組み合わせることで、より柔軟で強力なツール連携が可能になり、LLMの能力を最大限に引き出すことを目指しています。

全文翻訳

「MCPは不要だと言ったのに!」 日付: 2026年9月29日(火) 送信元: Earendil Engineering <rfc@earendil.com> 宛先: あなた 件名: 「MCPは不要だと言ったのに!」 過去にpi.devを訪れたことがあるなら、PiはMCPをサポートしていないという誇り高い宣言を見つけたでしょう。Piについて話したポッドキャストを聞いたなら、私たちからのMCPに対する軽蔑的な発言を一つ以上見つけたでしょう。Marioによる投稿も含まれています。それにもかかわらず、Piにアップグレードすると、MCPがサポートされる機能になっていることがわかります。何が起こったのでしょうか? 物事は変化します まず覚えておくべきことは、世界は静的ではないということです。私たちは過去1年間MCPに注目しており、今日のMCPは昨年のMCPではありません。それだけでは、コアに組み込む大きな理由にはならないでしょう。ご存知のように、Piは拡張機能の素晴らしいエコシステムを持っています。確かにMCPも拡張機能になったかもしれません。Earendilが承認した拡張機能でさえ。そしてはい、MCPが拡張機能であったことはまさにその通りです。MCPが現在コアの一部となっているのは、私たちが頭を突き合わせて再考した結果です。 具体的に何が変わったのか? MCPをコアに組み込んだ理由は、MCP自体の変化だけでなく、必要な変更が一般的に有用であることを見出したためでもあります。例えば、MCPに加えられた変更により、Pi内でJevをより簡単に使用できるようになります。最終的にPiが必要としているものは、MCPが必要としているものと非常に似ています。それは、インタープリターという形で遊ぶためのサンドボックスです。MCPについては多くの改善がありましたが、そうでないものもいくつかあります。MCPの最大の課題は、依然としてコンポジションの難しさです。ツール呼び出しを構成するための便利なサンドボックスであるCodemodeでさえ、MCPはこれを完全に実現していません。しかし、この時点ではMCPの問題というよりも、MCPサーバーやそれらを扱うさまざまなアプローチのハーネスの問題です。多くのMCPサーバーは、ツールをコンテキストに投入し、トークン効率を最適化するためにテキストを返すことを試みるハーネスのためにまだ構築されています。この時点での私たちのMCPの考え方は、OpenAPIにインテリジェントなツール検出を加えて、より近いものであるべきです。つまり、ツールは構造化されたデータを返し、ツールはそのドキュメントと説明によって検出可能であるべきです。CLIが非常に機能的である理由は、エージェントとモデルが効率的なbashismでそれらを配線するだけだからです。しかし、MCPでもそれができないという根本的な理由はありません。PiにおけるMCPは、他のハーネス(Codexなど)と同様に、これらのツールをJavaScriptサンドボックスに公開することに基づいています。 モダンLLMにおけるMCP これにより、なぜMCPなしでCodemodeを導入しなかったのかという疑問が生じるでしょう。答えの一部は、Piでツールがどのように表現されるかということです。最近の数ヶ月で、Piが遅延ツールロード、会話中のシステムメッセージ、推論レベルの変更を可能にする新しいモデルで意味をなすように、多くの作業を行いました。しかし、これらの新しい機能にうまく対応するために、まだツールロードアウトをアップグレードしていません。Codemodeの世界では、ツールがLLMで利用可能か、それともLLMのCodemode部分でのみ利用可能かを決定する必要があります。通常のMCP拡張機能は、Piのツールロードアウトから十分なメタデータを取得できず、そのエクスペリエンスをうまく機能させることができません。そのため、ツールを遅延させるか、Codemode固有のものとして構成できるようにする必要があります。そして、MCP拡張機能を改善するためにメタデータを配線することもできましたが、MCPとCodemodeが伝統的に持っていた問題のいくつかを解決すると考えています。私たちは、何かに肯定的な影響を与える最善の方法は、それを受け入れることだと信じています。そして、現代のMCPは過去のMCPよりもはるかに良い状態にあると考えていますが、サーバーとパターンにはまだ改善の余地があります。そのため、私たちはその会話に参加し、傍観して見ているだけでなく、小さなハーネスでうまく機能するように形作るのを手助けしたいと考えています。 Codemodeとは何か? Codemodeについてこれほど多く語ってきたので、それが何であるかを説明する価値があるかもしれません。ハーネスがツールを実行するとき、ほとんどの場合2つの側面があります。bashが実行される場所で実行するか、ハーネスエージェントループが実行される場所で実行するかです。両方の側での信頼レベルは非常に異なります。ハーネスループはしばしば信頼される環境で実行されますが、それが実行するツールはしばしばそれほど信頼されないサンドボックス内で実行されます。Codemodeは、ハーネスが実行される場所で実行されるという点で特別です。それは、エージェントがツール呼び出しを、どの順序で行うかについてより柔軟性を持たせ、JavaScriptを使用してそれらを組み合わせることができる方法で発行できるメカニズムとして最もよく理解されます。Codemodeはハーネス側でも実行されるため、その状態はファイルシステムではなく、セッショントランスクリプトの一部として維持されます。理論的にはどの言語でも可能ですが、JavaScriptは、JavaScriptの小さなバージョンをWASMバイナリとして出荷でき、合理的なレベルの保護を可能にするため、非常に魅力的です。Piでは、MCPが構成されているときにCodemodeが自動的にロードされるか、デフォルトツールとして構成に追加できます。Piに再構成を依頼してCodemodeを有効にしてください!その後、MCPだけでなく、非常に興味深いことに使用できます。例えば、「Jev」を提供するプロバイダーでログインしている場合、次のようなことができます。 typesafe/jevをCodemode経由で使用して、私たちのissue trackerで最も不満を持っている20人のコメント投稿者を見つける そして、Linear MCPとJevのようなものを巧妙に組み合わせて、Pi内からコンテキストを無駄にすることなく、その分析を実行します。 > typesafe/jevをCodemode経由で使用して、issue trackerで最も不満を持っている人々を見つける Linearからオープンなissueを取得し、Jevに各スレッドのトーンを一度に4つずつ評価させます。 codemode const { issues } = await tools.mcp__linear__list_issues({ team: "Pi", state: "open", limit: 250, }); const jev = await models.getModelOfType( "classifier", "cloudflare-workers-ai", "typesafe/jev", ); const questions = { frustration: { type: "choice", instructions: "感情的なトーンを判断してください。バグの深刻さは無視してください。", criteria: { none: "中立、事実、または友好的、深刻なバグであっても", mild: "明らかな苛立ち、焦り、または失望", high: "明らかに怒り、うんざり、皮肉、またはうんざりしている", }, }, }; const results = []; let next = 0; async function worker() { while (next < issues.length) { const issue = issues[next++]; const { comments } = await tools.mcp__linear__list_comments({ issueId: issue.identifier, }); const c = await models.classify(jev, { state: { ...issue, comments }, questions }); results.push({ id: issue.identifier, title: issue.title, ...c.answers.frustration }); } } await Promise.all([worker(), worker(), worker(), worker()]); store("frustration", results); const score = (r) => r.probabilities.mild * 0.5 + r.probabilities.high; const counts = {}; for (const r of results) counts[r.choice] = (counts[r.choice] ?? 0) + 1; const flagged = results.filter((r) => r.choice !== "none"); flagged.sort((a, b) => score(b) - score(a)); return { total: results.length, counts, flagged: flagged.map((r) => `${r.id} ${r.title}`), }; } ... (331 earlier calls) ✓ mcp__linear__list_comments {"issueId":"PI-4714"} 255ms ✓ mcp__linear__list_comments {"issueId":"PI-3200"} 354ms ✓ models.classify cloudflare-workers-ai/typesafe/jev 756ms ✓ models.classify cloudflare-workers-ai/typesafe/jev 750ms { "total": 167, "counts": { "none": 156, "mild": 11 }, "flagged": [ "PI-7740 TUI after /reload does not follows custom tool's re…", "PI-9566 context size defaults to 128k despite the real size…", "PI-10031 Pi sporadically stuck in "Working..." when thinking…", "PI-4714 [feature] /update TUI command instead of pi update", "PI-5916 Support provider extensions with model aliases and…", "PI-7547 [Windows] [sink-thread] How do you use Pi on window…", "PI-6907 Add an Installation section to the README", "PI-6212 Proposal: Bedrock path should honor `compat.forceA