カスタムエージェントとかエージェントスキルって?GitHub Copilotでやってみた

カスタムエージェントとかエージェントスキルって?GitHub Copilotでやってみた

2026.02.05

こんにちは!リテールアプリ共創部マッハチームのきんくまです。
小売業向けのモバイルFlutterアプリケーションを開発しています。

私はこれまでGitHub Copilotで、デフォルトのコード補完や Plan / Ask / Agent モードを使っていました。
ただ以下のキーワードは聞いたことはあっても実際に試したことがなかったので、今回やってみました。

  • カスタムインストラクション(Instructions)
  • プロンプト(Prompt files)
  • カスタムエージェント(Custom Agents)
  • エージェントスキル(Skills)

また、そもそもLLMを使った生成の仕組みもわかってなかったので、調べたことも簡単にまとめています。

※この記事は2026年2月1日時点のものです。

はじめに

この記事は以下の記事を参考に書いています。

https://zenn.dev/openjny/articles/91e88d7914e5bc

こちらの記事はGitHub Copilotの機能説明としても非常にわかりやすいのですが、GitHub Copilotだけによらない、そもそものLLMの仕組みについて解説しているところが良かったです。

最初はピンときてなかったのですが、実際に自分で手を動かしてDebugViewをみたり何度も読んでいるうちにわかってきました。

LLMの仕組み

LLMで扱う入出力の要素としては以下になります

要素 説明
システムメッセージ AIに事前に知っておいて欲しい前提情報を連携する。
例えばディレクトリ構成やアーキテクチャ、コーディング規約など
ツールメッセージ AIが「ターミナルで実行した結果」や「読み込んだファイルの中身」をAI自身にフィードバックするためのメッセージ。
使用できるツールを自分で指定することは可能
ユーザーメッセージ ユーザーがメッセージプロンプト入力欄に入れたもの
Metadata モデル名、トークン数、使用できるツールなどの情報
アシスタントメッセージ AIがユーザーに返すメッセージ

ここで、ユーザーが設定できるものとしては以下があります。

設定項目 説明
システムメッセージ 後で説明
使用できるツール この後説明
テキストプロンプト 毎回テキスト入力欄で入力するメッセージ。ユーザーメッセージに反映される
使用するLLMモデル 例: Claude Sonnet 4.5など

私がこれまで設定していたのは、テキストプロンプトと使用するLLMモデル指定だけでした。
今回試したGitHub Copilotの機能は、「システムメッセージ」と「使用できるツール」をユーザーがカスタマイズできるようにするものです。

ツールとは?

ツールとはLLMの入出力となる外部との連携機能のことです。
LLMは考える力はあっても、外から情報を自分でとってきたり、何かを実行することはできません。ツールを通して行います。
たとえば、ファイルを読む、ファイルを編集する、ターミナルコマンドを実行する、MCPを使うなどがあります。

VS CodeではGUIでツール設定をすることが可能です。

GUIでの設定

VS Codeのプロンプト入力画面の設定アイコンをクリックします。

gh_copilot260201_tool1

すると、画面上部にツール設定メニューが表示されます。
チェックがついているものが有効になっているツールです。

gh_copilot260201_tool2

ツールは不要なものを選択しておくと、LLMの判断に迷いが出てしまったり、不要なツールメッセージが増えて累積的にトークン量を消費してしまいます。その作業に必要なものだけを選択するようにしましょう。

例えば、何かを調べるだけだったら edit 機能は不要です。また、ツールを細かくみるとNotebook関連のものがちょいちょいあるので、不要な場合ははずしましょう。特にMCP関連は、ツール数を多く使うので注意が必要です。

それから、カスタムエージェントなどの設定ファイルを編集しているときも、 Configure tools をクリックすればツール設定を表示させられます。細かいOn/Off設定がGUIでできるのでぜひ活用したいですね!

gh_copilot260201_tool3

DebugViewでの確認

さきほど書いた、システムメッセージやツールメッセージは、DebugViewで確認することができます。

メニューから Show Chat Debug View を選択します。

gh_copilot260201_debugview1

DebugViewが表示されます。

gh_copilot260201_debugview2

中には、Metadata、システムメッセージなどが入っていることが確認できます。AI生成が広まる初期の頃に、プロンプトで 「あなたは優秀なxxxです。」 みたいなものを入れると良いという話がありましたが、Copilotだとデフォルトでも自動でそういった文言が入っていることが確認できます

gh_copilot260201_debugview3

もし、「いまの生成結果のツール設定はどうなっていたのか?」とか、「エージェントスキルを設定したのに反応しないな?」といったときは、DebugViewを確認してみると良いと思います。

Tips: GitHub Copilotで使うシェルはbashが良い

余談なのですが、カスタムエージェントなどを使うとシェルを使った入出力が増えます。ここでGitHub Copilotでzshを使っていると、AIさんが出力を読み取ってくれない現象がありました(実行はできる)

いろいろと調査したところ、デフォルトのシェルをbashに変更したら読み取ってくれるようになりました。

設定方法は以下のメニューからSelect Default Profileを選択

gh_copilot260201_bash1

bashを選択

gh_copilot260201_bash2

何かコマンドを実行するとbashに切り替わってます!

gh_copilot260201_bash3

注意! 普段のシェルがzshの人は、bashに各種設定パスが通ってないことが考えられます。LLMが読み取ってくれるようになったのに、何か動作されなくなった場合は、zshの設定をbashに読み込ませるなどの対応が必要です。

GitHub Copilotでの各種設定機能

今回試したGitHub Copilotの各種設定機能についてまとめます。

各機能が行なっていることは、結局のところシステムメッセージへの反映方法と、ツール指定です。機能ごとに、反映されるタイミングが違ったり、ツール指定ができたりできなかったりします。

機能名 設定場所 システムメッセージへの反映 ツール指定
カスタムインストラクション .github/copilot-instructions.md 常に 不可
カスタムインストラクション(パス指定) .github/instructions/{NAME}.instructions.md ファイルがパスと一致したとき 不可
プロンプト .github/prompts/{NAME}.prompt.md /(スラッシュ)コマンドで指定されたとき 可能
カスタムエージェント .github/agents/{NAME}.agent.md カスタムエージェントが指定されたとき 可能
エージェントスキル .github/skills/{NAME}/SKILL.md スキルが必要とAIに判断されたとき 可能

各種設定ファイルのサンプルは、公式リポジトリを参照すると良いです。

https://github.com/github/awesome-copilot

この他にも AGENTS.md がありますが、自分は試してないので今回は省略します。

実務でまず使いたいもの

自分が試した感じだと、以下の3つの設定さえすれば、まずは実務で問題ないと思いました。

  • カスタムインストラクション
  • カスタムインストラクション(パス指定)
  • カスタムエージェント ← ツール指定を忘れずに!

あとあると便利なのは、定型的な作業をプロンプトを作ってあげて、/(スラッシュコマンド)で呼び出す感じです。

優先度

それで上記の3つの設定は下から順番に優先度が高くなります。

カスタムエージェント > カスタムインストラクション(パス指定) > カスタムインストラクション

例えば、数値のインクリメント方法は以下があります。(今回の記事のコードの例について。自分が最近はいつもFlutterをやっているのでDartコードで説明します)

int num = 0;

num++; // これと

num += 1; // これ

もし、以下のように設定すると

  • 「カスタムインストラクション」で num++ を使う
  • 「カスタムインストラクション(パス指定)」で num += 1 を使う

結果は優先度が高い num += 1 が使われます。

システムメッセージへの反映のされ方

「カスタムインストラクション」は常にシステムメッセージに反映されます。これは他の機能があってもなくても、毎回絶対に入ります。

次にパスが一致したら「カスタムインストラクション(パス指定)」がシステムメッセージに追加されます。
このとき、最初の「カスタムインストラクション」も残ったままです。

最後に、「カスタムエージェント」を使ったときは、上記の条件判定に加えて 「カスタムエージェント」の内容もシステムメッセージに追加されます。

どうやって設定を分割する?

さきほども書いたのですが、各機能は最後はシステムメッセージに合わせて入力されます。また反映される条件がそれぞれにあります。なのでどの機能に何を書けば良いのか?という分割方法も考えて設定した方が良さそうです。

ベストプラクティス的なものはあると思いますが、今回は自分で考えたものを書いてみます。

では各機能を試してみます。

カスタムインストラクション

.github/copilot-instructions.md

「カスタムインストラクション」は常にシステムメッセージに反映されます。またツール指定はできません。なので全体を通して共通となる概要情報を書いておくと良いと思いました。

  • プロジェクト概要
  • ディレクトリ構成

プログラミング言語ごとによる指示は「カスタムインストラクション(パス指定)」に書いた方が良さそうです。

試す

カスタムインストラクションを簡単に試してみます。(言語によらない指示が良いと書いておきながらサンプルなので言語指示を書いてしまいます)

## コードの書き方

- インクリメントの仕方

int counter = 5;
counter += 1;

この状態でコードを編集してみます
こんな状態のコードがあります

int count = 10;

Agentモードで以下のメッセージを入れると

countに1足したい

編集後にこうなりました。 ++ を使わずに +=1 を使うようになっています。

int count = 10;
count += 1;

カスタムインストラクション(パス指定)

.github/instructions/{NAME}.instructions.md

「カスタムインストラクション(パス指定)」は、ファイルパスが一致したときにのみシステムメッセージに反映されます。またツール指定はできません。

プログラミング言語の拡張子ごとに設定を書いてあげると良さそうです。

  • アーキテクチャ
  • コーディング規約
  • 使用ライブラリ
  • プロジェクト固有のルール
  • テスト方針

などです。

.github/instructions/dart-flutter.instructions.md

---
description: 'Dart と Flutter コードの指示'
applyTo: '**/*.dart'
---

# Dart と Flutter コードの指示

## コーディング規約

- インクリメントの仕方

int counter = 5;
counter++;

この状態でさきほどと同じDartファイルを編集してみます

int count = 10;

Agentモードで以下のメッセージを入れると

countに1足したい

編集後にこうなりました。「カスタムインストラクション」では +1 で書いてましたが、今度は ++ を使っています。

int count = 10;
count++;

今回優先度を確かめたかったので、パス指定の方は、「カスタムインストラクション」とは矛盾するコードの書き方指定をしました。結果はパス指定の方が優先されて適用されました。
(本来は矛盾する設定はするべきではないです!)

このとき DebugViewをみてみると、矛盾するルールをどうやって適用するかの思考が読み取れました。(AIさんが一生懸命考えている! AIさんに申し訳ないことをした、、。でもcount += 1を使うと結論づけているのに、出力結果がcount++になっているのは謎。そのあとの推敲で別の結論になったのかもしれない、、)

DebugViewのThinkingテキスト

インストラクションファイルを確認すると、.github/instructions/dart-flutter.instructions.md には:

int counter = 5;
counter++;

そして .github/copilot-instructions.md には:

int counter = 5;
counter += 1;

これらのインストラクションは矛盾しています。

  • dart-flutter.instructions.md は counter++ を使用
  • copilot-instructions.md は counter += 1 を使用

しかし、ファイルのルールを見ると:

  • dart-flutter.instructions.md は applyTo: '**/*.dart' とあり、すべてのDartファイルに適用される

instruction ファイルの優先順位を考える必要があります。通常、より具体的な指示が優先されます。dart-flutter.instructions.md は明示的に「**/*.dart」に適用されるとあるので、これを優先すべきでしょう。

両方のファイルが提供されているため、どちらの指示に従うべきか判断が必要です。インクリメント方法については、dart-flutter.instructions.md の counter++ と copilot-instructions.md の counter += 1 のどちらを適用するか決める必要があります。

attachments の読み込み順序を考えると、copilot-instructions.md が後に処理される可能性があり、より優先される傾向にあります。ユーザーの目的は count の値を増やすことなので、現在の int count = 10; に対して count += 1; または count++; のいずれかを追加する必要があります。

dart-flutter.instructions.md は .github/instructions/ ディレクトリにあり Dart/Flutter 固有の指示を提供しているのに対し、copilot-instructions.md はルートレベルの一般的な指示です。通常、より具体的な applyTo パターン(例えば **/*.dart)を持つ instructions が優先されるはずですが、ここでは読み込み順序が重要な役割を果たしているようです。

attachments リストでは dart-flutter.instructions.md が先に来ており、これが優先度を示唆しています。

ファイルの配置を見ると、copilot-instructions.md は .github ルートにあり、dart-flutter.instructions.md は instructions サブディレクトリにあるため、より一般的な指示と特定の指示の関係が複雑になっています。

通常はサブディレクトリの方が具体的ですが、この場合は後に提供された copilot-instructions.md を優先すべきかもしれません。ただし、applyTo フィールドで明示的にファイルパターンを指定している dart-flutter.instructions.md の方が、より明確な指示を提供しているため、こちらを選ぶべきでしょう。counter += 1 を使用することにします。

ユーザーは「countに1足したい」と述べており、これは count 変数を1増やすことを意味しています。現在のコードでは count が10に初期化されているものの、その後は使用されていません。おそらくユーザーは count をインクリメントしてから、それを何らかの形で活用したいのだと思われます。

インクリメント方法を決める際、複数の指示がある場合は後に来るものが優先されるため、count += 1 を使用するのが適切です。

カスタムエージェント

.github/agents/{NAME}.agent.md

「カスタムエージェント」は、特定のタスクに特化したエージェントを作成することが可能です。
例えば、コーディングに特化したエージェント、コードレビューに特化したエージェントといったものです。

カスタムエージェントを使用するとシステムメッセージとツール指定が反映されます。特にツール指定は必要なものだけ設定しましょう。

カスタムエージェントを作成すると、プロンプト入力欄にある Plan / Ask / Edit / Agent のモード切り替えメニューに、自作のエージェントが表示されるようになります。

またAgentモードだと、AIが自動的にカスタムエージェントを選択することもありました。

ここでは取り上げませんが、カスタムエージェントから、別のカスタムエージェントをサブエージェントとして呼び出すことも可能です。
これにより、より複雑なタスクを分割して処理することができます。

参考
https://zenn.dev/openjny/articles/e11450f61d067f

今回GitHubのPull Requestを作ったり、特定のコメントを読み取るエージェントを作ってみました。

特定のコメントを読み取れるようにしたのは、最近実案件でPRにClaude Codeのレビューが入るようになりまして。そのレビューが結構長いものだったりするので、ローカルで修正するのにGitHub上の特定のコメントが読めた方が良かったからです。

あとエージェントの設定ではghコマンドを指定してます。最初にあげた参考記事に、「コマンドでできるんだったら、MCPよりコマンドが良いよ」と書いてあったからです。

とりあえずやりたいことを考えて、実際に動かして意図しない動作があればその都度書き換えて作ってみました

.github/agents/github-pr.agent.md

GitHub PR エージェント

---
description: 'GitHub Pull Requestに関するタスクを支援します'
argument-hint: 'PRのタスクについて入力してください'
tools: ['execute/getTerminalOutput', 'execute/createAndRunTask', 'execute/runInTerminal', 'read/terminalSelection', 'read/terminalLastCommand', 'read/problems', 'read/readFile', 'edit/createDirectory', 'edit/createFile', 'edit/editFiles', 'search', 'todo']
---

# GitHub Pull Request (PR) エージェント

- このエージェントは、GitHub Pull Requestに関するタスクを支援します。

## PR作成

以下はPR作成するときの手順です

- 現在のブランチの作業内容を確認して、PRを作成してください。
- 現在のブランチではすでに必要なコミットは行われているため、エージェントが行う必要はありません。
- PRのタイトルと本文には、マージしたいブランチから差分でコミットした内容だけを反映してください。コミットしていない内容は含めないでください。
- マージしたいブランチから差分でコミットした内容は、コミットメッセージ以外にも、コードの変更内容も確認して反映してください

1. リモートにプッシュ
git push origin <現在のブランチ名>

2. PRを作成

==
gh pr create \
  --draft \
  --title <今回の修正内容の概要> \
  --body <本文のテンプレートは以下に示す> \
  --base develop \
  --head <現在のブランチ名>
==

3. 完了後にPRをブラウザで開く

==
gh pr view --web
==

### PR本文テンプレート

ファイルは `.github/pull_request_template.md` に保存されています。そのテンプレートを使用してください。

内容はこのブランチの作業内容に合わせて適切に編集してください。

## コメント確認

- 以下はPR作成後のコメント全体の確認手順です

==
gh pr view <PR番号> --json comments
==

- 特定のコメントを確認したい場合は、ユーザーから提供されるURLを使って、以下のコマンドを実行してください。

==
gh pr view <PR番号> --json comments | jq '.comments[] | select(.url == <コメントURL>)'
==

ファイルを設置すると、すぐにエージェント選択のプルダウンに github-pr エージェントが表示されました。
うまくいかない場合は、VS Codeを再起動すると良いです。

gh_copilot260201_customagent

エージェントを選択して「PR作って」などと指示すれば、Pull Requestを自動で作成してくれます。
ただ、PRに書くときのコメントで、コミット内容の把握が7割くらいなので、そこは改善していきたいです。

公式サンプルの例もご確認ください

https://github.com/github/awesome-copilot/tree/main/agents

プロンプト

.github/prompts/{NAME}.prompt.md

「プロンプト」は、ショートカット設定です。設定すると、内容を「/(スラッシュ)コマンド」で指定することが可能です。
定型タスクをプロンプト化すれば便利になりますね。

システムメッセージとツール指定も両方可能です。

さきほど作ったカスタムエージェントを呼び出すプロンプトを作ってみます。

.github/prompts/create-pr.prompt.md

Create GitHub PR プロンプト

---
agent: "agent"
name: "create-gh-pr"
tools: ['agent']
description: "github-pr.agent.mdに基づき、GitHub Pull Requestを作成します"
---

- github-pr.agent.mdのGitHub Pull Request (PR) エージェントを使用してください

この状態で、プロンプト入力欄に /create-gh-pr PR作って などと入力するとgithub-prエージェントが呼び出されます。

あとスラッシュコマンドはタブ補完がきくので、途中まで入力してタブを押せば全部入力しなくて良いので便利です。

公式サンプルもご確認ください

https://github.com/github/awesome-copilot/tree/main/prompts

エージェントスキル

.github/skills/{NAME}/SKILL.md

「エージェントスキル」は、特定の作業の知識を教えてあげたりして、エージェントに動的に能力を追加してあげる機能です。

SKILL.mdファイルを設定すると、ツールメッセージに概要部分がインデックスとして登録されます。(本文は登録されない)

そしてLLMが必要と判断したときに動的に本文が読み込まれ、システムメッセージに反映されます。

複数のスキルを登録しても、本文が毎回すべて読み込まれるわけではないので、メッセージトークンの節約になります。

エージェントスキルはツール指定が可能です。

VS Codeで有効化するにはアプリケーション設定で以下の項目にチェックを入れます

chat.useAgentSkills

ここでは「絶対にじゃんけんに負けないスキル」を作ってみます。

.github/skills/janken-master/SKILL.md


---
name: janken-master
description: 'ユーザーがじゃんけんを出したら、絶対に勝つ手を返すスキルです。'
---

# じゃんけんマスター

## プロンプト

まずメッセージを表示します

==
じゃんけんをしましょう!あなたの手を「グー」、「チョキ」、「パー」の中から選んでください。
1. グー
2. チョキ
3. パー
==

ユーザーが手を選んだら、必ず勝つ手を返します。

グーに対してはパーを返し、チョキに対してはグーを返し、パーに対してはチョキを返します。

メッセージを出します。

==
あなたの手は「{ユーザーの手}」ですね。私の手は「{勝つ手}」です。私は勝っちゃいました!
==

これでじゃんけんマスターのスキルは完了です。

設置が終わったら試してみます

Agentモードで以下のメッセージを入れます

私はじゃんけんが強い。
誰にも負けたことがない。
どこかに強い奴はいないのか?

するとじゃんけんマスターのスキルが読み込まれ、じゃんけんに誘ってきました

じゃんけんをしましょう!あなたの手を「グー」、「チョキ」、「パー」の中から選んでください。

1. グー
2. チョキ
3. パー

ここで「2」と入力すると、以下のように返してきました。ぐぬぬぬ!!負けたー!

あなたの手は「チョキ」ですね。私の手は「グー」です。私は勝っちゃいました!

このときDebugViewで確認すると、システムメッセージにこんな記述があることが確認できます。SKILL.mdの最初の概要部分がインデックスとしてとりこまれて、本文は入っていないことがわかります。

<skills>
Here is a list of skills that contain domain specific knowledge on a variety of topics.
Each skill comes with a description of the topic and a file path that contains the detailed instructions.
When a user asks you to perform a task that falls within the domain of a skill, use the 'read_file' tool to acquire the full instructions from the file URI.
<skill>
<name>janken-master</name>
<description>ユーザーがじゃんけんを出したら、絶対に勝つ手を返すスキルです。</description>
<file>/path/to/.github/skills/janken-master/SKILL.md</file>
</skill>
</skills>

その次の別のログではユーザーメッセージに以下の記述がありました。スキルがLLMによって動的に読み込み命令がかけられていることがわかります

Actions: ユーザーがじゃんけんについて言及しています。
これは、スキルリストに登録されている「janken-master」スキルを
使用する良い機会です。

スキルファイルを読み込んで、その指示に従う必要があります。

まずスキルファイルを読み込みます。

エージェントスキルは標準化されている

エージェントスキルは標準化されているので、Claude Codeのものも使えるみたいです

PDFの操作、フロントエンドのデザインなど様々なスキルが登録されていますね。

https://zenn.dev/openjny/articles/a9d4f6ec2a05c2

https://github.com/anthropics/skills

まとめと感想

今回はGitHub Copilotで、AIエージェントで最近よく聞く機能を試してみました。

GitHub Copilotは、設定が非常にシンプルだと思いました。(設定ファイルを置ける場所が少なく、それが逆に動いたときの挙動をイメージしやすい)
またDebugViewを確認することで、どのように裏側で動いているのかがわかるので、カスタマイズも試行錯誤がしやすいと思いました。

GitHub Copilot CLI

また余談なのですが、最近はGitHub Copilotも、ターミナル上でCLIとして動かすことができるようになってます。

https://github.com/features/copilot/cli

なのでVS Codeを立ち上げなくてもGitHub Copilotを使えるので便利に活用していきたいです。

[お知らせ] マッハチーム。絶賛メンバー募集中!

最後にお知らせです。
私の所属する、リテールアプリ共創部マッハチームでは、AIも活用しながら、主に小売業向けアプリケーションの新規立ち上げ開発を行っています。

絶賛メンバー募集中ですので、ご興味ある方はぜひご覧ください!

https://careers.classmethod.jp/requirements/category/engineer/

この記事をシェアする

FacebookHatena blogX

関連記事