gRPC 用の MCP サーバーを作ってみました — gRPC を自然言語で操作しよう
作ったもの
開発ではgrpcurlを使ってましたが、Node.js/TypeScript同じように動作するものがほしいな→できた→MCPサーバーにしてみよう的な感じです。
grpcurlをAIエージェントから自然言語で操作できればくらいに思ってましたが、使ってみると予想以上にAIがリクエストやレスポンスの内容を理解してくれるので便利でした。Protoファイルがようなスキーマがあるのがよかったのかな。
概要
grpc-mcp
は Node.js/TypeScript 製の MCP(Model Control Protocol)サーバーで、Protocol Buffer ファイルから service/method 情報を取得し、自然言語指示やツール経由で gRPC (Unary)リクエストを簡単に送信できます。
主な用途
- Proto からサービス・メソッド情報を取得
- gRPC サーバーへリクエスト送信する
- 応答時間の計測・統計
- 自然言語(MCP クライアントや VSCode 拡張)からの操作
インストール方法・使い方
README
プロンプト
使用感
以下のProtoをもとにサーバーを起動
ユーザー情報を返却するメソッド
syntax = "proto3";
package user;
service UserService {
rpc GetUser (GetUserRequest) returns (GetUserResponse) {}
}
message GetUserRequest {
repeated int32 id = 1;
}
message GetUserResponse {
User user = 1;
}
message User {
int32 id = 1;
string name = 2;
UserType user_type = 3;
int32 address_id = 4;
}
enum UserType {
UNKNOWN = 0;
ADMIN = 1;
NORMAL = 2;
}
アドレス情報を返却するメソッド
syntax = "proto3";
package address;
service AddressService {
rpc GetAddress (GetAddressRequest) returns (GetAddressResponse) {}
}
message GetAddressRequest {
repeated int32 address_id = 1;
}
message GetAddressResponse {
int32 address_id = 1;
int32 post_code = 2;
string city = 3;
}
自然言語によるgRPCリクエスト送信
-
プロンプト起動後、まずは必要な情報の入力
-
入力の情報をもとにProtoファイルを解析
MCPツールのloadProtoでProtoファイル解析を行いパッケージ名、サービス名、メソッド名を取得
-
取得したProtoの情報をもとにより詳細な情報を取得
MCPツールのgetMethodInformationを使用してリクエスト、レスポンスの情報を取得
取得した項目の補足説明までやってくれます。
-
自然言語でgRPCサーバーへリクエストを送信
「id: 123のユーザーに紐づく住所の都市を教えて」という指示を出しました。
idから都市を取得するには2段階でAPIを実行する必要があり、それも推論し計画を立て実行してくれます。正しく想定した結果が返却されました。
性能分析
「UserService.GetUserをid: 111で10回送信して平均、最小、最大の応答時間を出して」など性能を見てもらいました。ちゃんと平均、最小、最大の応答時間がでました。
APIの使い方を質問
「ユーザーの郵便番号が見たいときはどうしたらいい?」と質問しました。どの順番でAPIをどのパラメーターで呼べばよいか教えてくれました。
まとめ
当初はもう少し具体的にAPI名を指定、リクエストなどはJSON形式で渡して使用できればいいかなくらいに考えてましたが予想より自然言語に近い形でやりとりできるので便利でした。
指定のAPIを送信するだけでなく、性能調査やAPIの仕様確認など幅広く応用できたのでよかったです。
MCPの設計として、エージェントのコンテキストを意識して必要以上に不要な情報が乗らないよう意識しました。ユースケースに合わせて段階的に詳細な情報を取得する形に設計する必要がありました。最初は全体のインデックスような情報を渡し、入力に合わせてインデックスの中から追加で必要な情報を検索するイメージです。
Discussion