「足りない機能は公式アップデートを待つしかない」——そう感じたことはありませんか。Pi Coding Agentは、その前提を覆すターミナル型コーディングエージェントです。MCPやサブエージェントを標準非搭載にし、TypeScriptのextensionで自分の環境に合わせて機能を足していく設計です。

この記事では、Pi Coding Agentの考え方と、検索機能を自作する実践例までを解説します。

この記事でわかること

  • Pi Coding Agentが「完成品」ではなく「ハーネス」と呼ばれる理由
  • 標準で用意されているツールと、あえて入れていない機能
  • extensionでcommand・tool・hookを追加する仕組み
  • はてなブックマーク検索やWeb検索を自作する流れ

https://github.com/earendil-works/pi

Pi Coding Agentとは

Pi Coding Agentは、libGDXの作者Mario Zechner氏が開発するオープンソースのターミナル型コーディングエージェントです。公式サイトでは「minimal agent harness(最小限のエージェントハーネス)」と説明され、GitHubリポジトリearendil-works/piは2026年6月時点で6.6万スターを超えています。

ハーネスとは、LLM(大規模言語モデル)を動かす土台のことです。Piはモデル本体ではなく、モデルにツールを渡してファイル操作やコマンド実行を繰り返させるランタイム層を担います。OpenClawのような常駐型エージェントも、PiをSDKとして組み込んでいます。

デフォルトでモデルに渡されるツールは4つだけです。

  • read:ファイル読み取り
  • write:ファイル作成・上書き
  • edit:差分編集
  • bash:シェルコマンド実行

CLI側ではgrepfindlsも利用できます。特定プロバイダー向けの体験を厚く作るのではなく、tool callingできるモデルに薄く接続する設計のため、新しいモデルを試すときの挙動が見やすいのが特徴です。

あえて入れていない機能

Claude CodeやCursorのように最初から多機能なエージェントを選ぶ方法もあります。Piは逆のアプローチを取り、次の機能を標準非搭載にしています。

  • MCP(Model Context Protocol)
  • サブエージェント
  • プランモード
  • 組み込みTODO
  • 権限確認ポップアップ
  • バックグラウンドbash

公式サイトは「Primitives, not features(機能ではなく部品)」と明記しています。使わない機能までシステムプロンプトに載せるとコンテキストウィンドウを圧迫するため、必要なものだけextensionやPi packageで足す思想です。リポジトリ内にはplan modeをextensionとして実装したサンプルも同梱されています。

extensionで機能を足す

Piの拡張の中心は、TypeScriptで書くextensionです。Skillsが作業手順をテキストで渡す仕組みであるのに対し、MCPが外部プロセス経由でツールを提供する仕組みであるのに対し、extensionはPiのプロセス内で動くコードです。

公式ドキュメントで公開されているAPIから、次のような要素を登録できます。

追加要素 用途 API
スラッシュコマンド ユーザーが手動で呼ぶ操作 pi.registerCommand()
ツール LLMが作業中に呼ぶ機能 pi.registerTool()
フック 実行イベントへの介入 pi.on(...)
UI・プロバイダー 表示更新やモデル接続先 ctx.ui.*pi.registerProvider()

extensionは~/.pi/agent/extensions/(グローバル)または.pi/extensions/(プロジェクト単位)に置き、/reloadで再読み込みできます。

検索機能を自作する例

エンジニアの和田優介氏は、Piに足りない検索機能をextensionで追加する実践例を公開しています(参考)。

はてなブックマーク検索では、はてなブックマーク検索RSS(https://b.hatena.ne.jp/search/text?mode=rss&q=<検索語>)を呼ぶextensionを作成しました。/hatenaコマンドとhatena_bookmark_searchツールの2形態で登録し、Google検索では拾いにくい日本語圏の文脈を補完できます。

Web検索では、SearXNGをバックエンドにしたweb_searchツールを~/.pi/agent/extensions/web-search.tsとして実装しました。Brave Search APIやTavily、Exaなど、好みのSERP APIに差し替え可能です。

X検索では、xAIのResponses APIにtools: [{ type: "x_search" }]を渡すextensionを作成しました。Hermes Agentが持つX検索体験を、PiでもAPIキー方式で再現できます。

いずれの例も、流れは共通です。Piに「検索toolを作って」と依頼し、生成されたTypeScriptファイルをextensionディレクトリに置き、/reloadで読み込む。エージェントに道具を渡すだけでなく、エージェント自身に道具を作らせる点がPiの強みです。

hookで動作を観測する

pi.on("tool_call")pi.on("tool_result")のフックを使えば、検索クエリや返却URLをJSONLに記録できます。ツールを増やすだけでなく、エージェントがどの情報を見て判断したかを横から追跡できるため、継続実行ループの改善にも役立ちます。

使い始める

インストールはnpm一行です。

npm install -g --ignore-scripts @earendil-works/pi-coding-agent

起動後、/loginでChatGPT Plus/Pro(Codex)やClaude Pro/Maxなどのサブスクリプション認証、/modelでモデル選択ができます。APIキー方式ではAnthropic、OpenAI、Google Gemini、OpenRouterなど15以上のプロバイダーに対応しています。

動作モードは4種類あります。対話型TUI、スクリプト向けのprint/JSON、stdin/stdoutのRPC、自社アプリへのSDK組み込みです。薄いコアの上に自分のワークフローだけを積み上げたい開発者向けの設計と言えます。

注意点

extensionはTypeScriptコードとしてそのまま実行されます。APIキーの扱い、ログに残す内容、外部packageのソース確認は必須です。公式ドキュメントでも、信頼できないpackageのインストールには注意が促されています。

音声入力のようにOS権限や常駐処理が絡む機能は、extensionではなく外部CLIに置く方が自然です。LLMが呼ぶ道具はtool、ユーザー操作はcommand、実行中の観測はhook——この置き場所を設計できることが、Piをハーネスとして使う面白さです。

全員に同じ高機能UIを配るのではなく、小さなコアを自分の作業環境に合わせて育てる。Pi Coding Agentは、その方向性を体現したエージェント基盤です。