Copilot Agent Modeの返答に気付けないので、終わったことを教えてくれるMCPサーバーを作った
はじめに
Visual Studio Code v1.99で利用可能になったCopilot Agent Mode、みなさん普段からお使いになっていると思います。
私も普段の開発業務で利用していて、簡単なタスクから多くのファイルを見て書き換えを行うような大規模なタスクまで、幅広いタスクをAgentにおまかせしています。
しかし複雑だったり時間のかかるタスクをお願いしている時、Chatの返答に時間が非常にかかるようなケースが多く見られることに気づきました。
Agentにタスクをお願いしている間、他のタスクを自分で行ったり、あるいはコーヒーを淹れたりとVS Codeから目を離すことが多いです。
そうなるとAgent側は返答を返して私の指示を待っているのに、それに私が気付けないという問題が発生するのです。
これをどうにかしようと、気付ける仕組みを作ってみました。
まとめ
- Chatやタスクの結果のサマリが通知される体験は良い
- MCPサーバー作るのは簡単なので、Agentを利用して困っていることを解決する1手段になるかも
- VS Codeの設定( vscode://settings/accessibility.signals.chatResponseReceived ) を使ったほうが正直早いぞ
作ったもの
MCP C# SDK を使用し、渡されたテキストを読み上げるのがこのアプリケーションの概要です。
音声の再生には macOS では afplay
を、Linux では play
(soxコマンドについていた…はず…)を使用して、コマンドラインを裏側で叩くような仕組みとなっています。
C# SDK を使用して MCP サーバーを作成するのはかなり easy で、以下のようなコードを書くと実現できます。
他にももう少し書く必要はありますが、大まかに必要な箇所はこんな感じです。
Program.cs
using NotifyAgentActMCP.Services;
var builder = Host.CreateApplicationBuilder(args);
builder.Services
.AddMcpServer()
.WithStdioServerTransport()
.WithToolsFromAssembly();
await builder.Build().RunAsync();
Tools/VoicevoxSpeechTools.cs
using ModelContextProtocol;
using ModelContextProtocol.Server;
[McpServerToolType]
public sealed class VoicevoxSpeechTools
{
[McpServerTool, Description("Speech text with Voicevox")]
public static Task Speech(
IMcpServer server,
[Description("What to speech.")] string speechText)
{
Task.Run(async () =>
{
try
{
// ここで再生
}
catch (Exception ex)
{
await server.SendNotificationAsync("VoicevoxSpeechTools/SynthesizeError", ex.Message);
}
});
return Task.CompletedTask;
}
}
この様な実装をした後に、mcp.json でこのサーバーを起動できるようにすれば完了です。
Agentへのお願い文章はこんな感じにすると動作確認が出来ます。
このプロジェクトを完結に #Speech で教えて下さい。
動作している様子は以下のポストにあるので、もしよかったら見てみてください。
終わりに
今回の載せたコードには一切記述がありませんが、Voicevox を音声生成のバックエンドに使用しているため、タスクが終わる度にずんだもんが喋りかけてくれるのは良いです。
とはいえ、発話しているテキストが長い場合止める手段がないので、長い文章が MCP サーバーに投げられた時はかなーーり長い文章を聞くことになります。
なので、本当にただ通知音が欲しい場合は vscode://settings/accessibility.signals.chatResponseReceived
のアクセシビリティを用いるのが実は良いかもしれません。
もしくは、通知音ではなくて、各 OS の Notification API などを使用し視覚的にわかるようにしても良いかもしれませんね。
Discussion