テック技報最新号へ →
AIコーディング

incur: エージェントが使いやすい CLI を TypeScript で作る(スキル生成・MCP 化・次のコマンド案内つき)

incur(wevm/incur)は TypeScript の CLI フレームワークで、1つの定義から人間向けの CLI、エージェント向けのスキルファイル、MCP サーバーを同時に用意できる。実行結果に「次に呼ぶとよいコマンド」を添える仕組みや、出力のトークンを減らす形式も最初から入っている。

@_kaiinui · 投稿 2026-02-28
#ai-coding#cli#typescript#スキル#mcp#トークン節約

どんな問題を解決する?

  • 自作の CLI をエージェントに使わせたいが、使い方を毎回説明するか、別途 SKILL.md や MCP サーバーを書く必要がある
  • JSON の出力が大きく、エージェントのコンテキストを圧迫する
  • エージェントが次に何を呼べばいいか分からず、試行錯誤する

使い方

ts
// npm i incur
import { Cli, z } from 'incur'

Cli.create('greet', {
  args: z.object({ name: z.string() }),
  run(c) {
    return { message: `hello ${c.args.name}` }
  },
}).serve()

作った CLI には、次の組み込みコマンド・フラグが自動で付く。

  • skills add: コマンド定義からスキルファイルを生成し、エージェントの設定に入れる(定義を変えたら同期し直せる)
  • mcp add: エージェントに MCP サーバーとして登録する。--mcp で stdio の MCP サーバーとして起動
  • --llms: エージェント向けのマニフェストを出力。--schema で引数のスキーマ
  • --format toon|json|yaml|md|jsonl: 出力形式を選ぶ。--filter-output で必要な項目だけ、--token-limit/--token-offset/--token-count で長い出力をトークン単位で区切って読む

次のコマンドを案内する(CTA)

ts
run(c) {
  return c.ok(data, {
    cta: { commands: [{ command: 'deploy', args: { env: 'staging' }, description: 'ステージングに反映する' }] },
  })
}

実行結果と一緒に「次はこれを呼ぶ」が返るので、エージェントが手順を迷いにくい。エラー(c.error() や IncurError)にも同じように CTA を付けられ、「先に auth login を」と案内できる。

注意点

  • トークン比較(20コマンドの CLI を1セッション使う場合、incur が約$0.0131、MCP+JSON が約$0.0325、1つのスキル+JSON が約$0.0410)は作者側の試算。自分の CLI で同じになるとは限らない
  • 生成されるコマンドに使うパッケージ名は package で固定できる。スキル連携が不要なら sync: false
  • 既存の CLI の使い方をスキルとして渡す方法は よく使う CLI の「利用者向けリファレンス」をスキルにして持たせる。incur は「これから作る CLI」向け
  • MIT ライセンス

出典

X の元の投稿を開く