TaskfileをAIに理解させる - MCP Server化による開発効率化

こんにちは。AIイノベーション推進チームの黒木です。

次世代EC開発プロジェクトでは、Taskfile というタスクランナーを導入しています。Taskfileは、スクリプトをシンプルなエイリアスで管理できるツールです。学習コストも低く、普段の開発で重宝しています。

ところが、Taskfile を使った開発でいくつかの課題に直面しました。AI にタスクを実行してもらう際、複数の Taskfile をコンテキストに指定する必要があったり、間違ったタスク名で実行してエラーになったりします。また、人の手でタスクを実行する場合でも、タスクが多すぎて適切なものを見つけるのに時間がかかるかかる問題がありました。

これらの課題を解決するため、Taskfile を MCP Server 化しました。本記事では、その実装方法と効果を紹介します。

Taskfile とは

Taskfile は、スクリプトエイリアスとして管理・実行できるタスクランナーです。YAML 形式でタスク(スクリプト)を定義し、シンプルなコマンドで実行できます。

次世代ECプロジェクトでは、AI がタスクを理解しやすいように summary または desc を記載しています。

version: '3'

tasks:
  wire:
    summary: wireコマンドを実行します
    desc: >
      internal/api配下のwire.goファイルを変更したら、このコマンドを実行してください。
    dir: internal/api
    cmds:
      - wire ./...

このように設定すると、CLI 上でタスクを実行できます。

$ task wire

従来であれば cd internal/api してから wire ./... を実行する必要がありましたが、Taskfile を使用することでワンライナーで実行できます。

プロジェクトでの構成

次世代ECプロジェクトでは、以下のような構成で Taskfile を管理しています。

root/
├ backend/
│   └ Taskfile.yml
├ frontend/
│   └ Taskfile.yml
└ Taskfile.yml

バックエンドとフロントエンドでそれぞれ Taskfile を分け、プロジェクトルートの Taskfile で両方を include することで、どのディレクトリからでも全てのタスクを実行できるようにしています。

Taskfile 運用の課題

Taskfile を使った開発では、以下の3つの課題に直面しました。

課題1: AIにタスクを実行してもらう際に、複数の Taskfile をコンテキストに指定する必要がある

AI に Taskfile を認識させるには、タスクが書かれているファイルをコンテキストとして渡す必要があります。次世代ECプロジェクトのように、バックエンドとフロントエンドで Taskfile が分かれている場合、毎回複数のファイルを指定する必要がありました。

プロジェクト内の複数のTaskfile.ymlをコンテキストとして指定

課題2: 実行ディレクトリによってタスク名が変わるので、AIにタスクを実行してもらうと間違ったタスク名で実行してエラーになる

Taskfile には、実行するディレクトリによってタスク名が変わる仕様があります。

例えば、backend/Taskfile.yml に定義された wire タスクは、以下のように異なるタスク名で実行する必要があります。

  • backend ディレクトリから実行: task wire
  • プロジェクトルートから実行: task backend:wire

AI が YAML ファイルを読んだだけでは、どのディレクトリから実行すべきかを判断できず、エラーになるケースがありました。

課題3: 人の手でタスクを実行する場合、タスク数が多いと適切なタスクを見つけられない

次世代ECプロジェクトには38個のタスクがあります。人の手でタスクを実行する場合、task --list でタスク一覧を取得して、その中から適切なタスクを見つけるのは時間がかかる作業でした。

% task --list
task: Available tasks for this project:
* backend:aqua:install:                                    aqua install
* backend:docker:down:                                     全てのコンテナを停止します
* backend:docker:run:all:                                  全てのコンテナを起動します
...
(38個のタスクが表示される)

MCP Server 化による解決

これらの課題を解決するため、Taskfile を MCP Server 化しました。

MCP Server 化の最大のメリットは、AI がタスクを自動認識できるようになることです。これにより、課題1の「複数の Taskfile をコンテキストに指定する手間」が不要になります。さらに、AI がツールとして全タスクを提示できるため、課題3の「タスク数が多いと適切なタスクを見つけられない」問題も解決します。AI が自動で適切なタスクを選択してくれるからです。

先行事例として rsclarke/mcp-taskfile-server があったので、これをベースに実装を進めました。

実装の工夫点

ベースとなるリポジトリのコードをそのまま使うのではなく、以下の2点を改良しました。

1. タスクの説明を MCP ツールに反映

Taskfile の summarydescMCP ツールの説明として設定することで、AI がタスクの目的と使用タイミングを正確に理解できるようにしました。

- description := taskDef.Desc
- if description == "" {
-     description = fmt.Sprintf("Execute task: %s", taskName)
- }
+ description = fmt.Sprintf("Execute task: %s", taskName)
+ var description string
+ if taskDef.Summary != "" {
+     description = fmt.Sprintf("%s\n# Summary\n%s\n", description, taskDef.Summary)
+ }
+ if taskDef.Desc != "" {
+     description = fmt.Sprintf("%s\n# Description\n%s\n", description, taskDef.Desc)
+ }

これにより、AI は単なるタスク名だけでなく、「何のためのタスクか」「いつ実行すべきか」を理解した上で適切なタスクを選択できます。

2. 実行ディレクトリを固定化

課題2の「間違ったタスク名で実行してエラーになる」問題を解決するため、MCP Server 側で実行ディレクトリを固定しました。

Taskfile MCP Server は github.com/go-task/task/v3 ライブラリを使用しており、WithDir でタスクの実行ディレクトリを指定できます。プロジェクトルートを指定することで、AI は常に backend:wire のような名前空間付きのタスク名で実行すればよくなり、エラーを回避できます。

executor := task.NewExecutor(
    task.WithDir(workdir),
    task.WithTimeout(time.Minute*2),
    task.WithStdout(&stdout),
    task.WithStderr(&stderr),
    task.WithSilent(true),
)

動作確認

実装した MCP Server は、@modelcontextprotocol/inspector を使って動作確認を行いました。これは MCP Server をGUI上でテストできる便利なツールです。

まず、MCP Server をビルドします。

$ go build -o ./taskfile ./main.go

次に、inspector の設定ファイル config.json を作成します。

{
  "mcpServers": {
    "taskfile": {
      "command": "./taskfile"
    }
  }
}

inspector を起動すると、GUI上でタスク一覧の取得や実行をテストできます。

$ npx @modelcontextprotocol/inspector --config ./config.json --server taskfile

inspectorを使用してMCP Serverをテスト

まとめ

Taskfile を MCP Server 化することで、3つの課題を解決できました。

  • 複数ファイル指定の手間を削減 (課題1): MCP Server が全てのタスクを自動認識するため、AI 利用時に手動で Taskfile をコンテキストに指定する必要がなくなった。
  • 実行ディレクトリの問題を解消 (課題2): サーバー側で実行ディレクトリを固定することで、AI が常に正しいタスク名で実行できるようになった。
  • タスク検索の効率化 (課題3): AI がタスクを自動認識して適切なものを選択してくれるため、人の手で task --list から探す必要がなくなった。また、summarydesc の情報も活用され、より正確なタスク選択が可能になった。

MCP Server 化の核心は「AI によるタスクの自動認識」です。これにより、AI に関する課題(課題1、2)だけでなく、人の手でのタスク検索の課題(課題3)も同時に解決できました。

実装は先行事例をベースに、プロジェクト固有の課題に合わせてカスタマイズする形で進めました。結果として、AI がタスクを正確に理解して実行できるようになり、開発効率が大きく向上しています。

Taskfile を使っているプロジェクトで AI 開発を行っている方は、MCP Server 化を検討してみてはいかがでしょうか。