🌽

Agent Skillsを実行するMCPサーバーを作ってみた

に公開

Agent Skillsを実行するMCPサーバーを作ってみました。

https://github.com/k-ibaraki/agent-skills-mcp-server

作った経緯

年始にこの記事を書きました。
https://zenn.dev/ncdc/articles/206fbad44d1dba
その後、やっぱり開発環境や個人のローカル環境以外でも、そしてエンジニア以外でも、気軽にAgent Skillsを使えるようにしたいなぁと思いました。

そうなると、ガバナンスを効かせる為に本体のAgentから分離した環境で動かす必要があり、かつエージェントから標準的な方法で気軽に使えることが必要と考えました。

それってMCPかな。と思ったのでMCPサーバーという形にしてみました。

という経緯で作ったので、開発時に使うことは特に想定していません。スキルを直接使った方が早いし精度も出ると思います。ただ、Cloud Runとかにホスティングして複数人でSkillを共有するために使うなどの使い道はあるかも知れません。


nano bananaが描いた扉絵

MCPツールとコンテキスト

Agent Skillsを使うMCPサーバーを作る上でまず問題になるのは、MCPはコンテキストを使いすぎる点です。
MCPをスキルに置き換えることでコンテキストの節約に成功したという話は聞いたことがあるでしょう。つまり、逆にスキルを素直にMCPサーバーにすると、コンテキストを大量に消費することになります。それは避ける必要があります。
そこで、今回作成したMCPサーバーはskill毎にツールを用意するのではなく、以下の2個のツールのみを固定で用意する方針にしました。(後述しますが1個追加したので実際は3個あります)

  • skills-search
    • スキルを検索する
  • skills-execute
    • スキルを実行する

こうすることで検索→実行の2ステップが必要になりますが、スキルがどんなに増えてもコンテキスト消費が増えることはありません。

スキル実行のアーキテクチャ

MCPサーバーではありますが、Agent Skillsを実行するからには、当然エージェントを実装する必要があります。
そこで、今回は Strands Agents + LiteLLM を採用しました。
当初は、LiteLLMのみを使おうとしていたのですが、それだとスキルを使わせるのが難しく、かといってLangChainを導入するのは重すぎると悩んでいました。そこでいろいろ調べていたら、Strands AgentsではAgent SkillsのAWS公式の実装サンプルがある事に気づきました。

https://github.com/aws-samples/sample-strands-agents-agentskills

ですが、Strands AgentsはAWS製のライブラリです。素で使うとAmazon Bedrockにロックインされてしまう懸念があったので、LiteLLMを挟むことで特定のLLMのみに依存せずに使えるようにしました。

スキル検索のアーキテクチャ

スキルの実行ができたので、次はスキルの検索です。
スキルの検索は単純なキーワード検索では不十分です。例えば「東京の天気」を調べるべき単語は「東京」でしょうか「天気」でしょうか。「東京」特化のスキルがあれば前者ですし、「天気」特化のスキルがあれば後者でしょう。しかし、検索段階ではどちらがあるか分からないので最適なスキルを見つけられない事が多いでしょう。
そこで、単純なキーワードマッチではなく、セマンティック検索(意味的な検索)を採用しました。セマンティック検索であれば、例えば「東京の天気を調べたい」という検索に対して柔軟にweather-forecastスキルがヒットしてくれます。

実際の構成には、ChromaDB + sentence-transformers を使っています。ChromaDBはベクトルデータベースで、sentence-transformersは文章を埋め込みベクトルに変換するためのライブラリです。埋め込みモデルには多言語対応のモデルを使用しているので、日本語での検索にも対応しています。
処理の具体的な流れとしては、MCPサーバー起動時にすべてのスキルのメタデータ(名前、説明文など)をChromaDBにインデックスし、skills-search が呼ばれた時にクエリとの類似度で検索結果を返します。要するに、アプリ起動中のみ使える簡易的なRAGをメモリ上に構築しているということになります。
なお、ChromaDBやsentence-transformersは完全にローカルで完結している点もポイントです。これにより、検索に関しては外部サービスへの依存を排除しています。特定の環境にロックされるのは避けたかったのでこだわりました。

スキル作成機能

ここまででスキルの実行に必要な機能が揃いました。しかし、ここで私は思いました。「スキルを作るのが面倒くさい」と。
最初に書いたように「 エンジニア以外でも 気軽にAgent Skillsを使えるようにしたい」と考えています。スキルはテキストなので、エージェントを作ったりMCPサーバーを立てたりするよりは遥かに簡単なんですけど、それでもまともに機能するものを作るのは結構面倒くさいのですよね。それに、そもそもスキルはAIに作らせるのが前提になっている設計だと思いますし。
ということで、MCPサーバーにスキルを作る機能をつけました。当初この機能はAnthropic公式のskill-creator スキルをそのまま使えば良いと思って実装したのですが、以下のような問題がありました。

  • ローカルで動く前提のものを作ろうとするので、隔離した環境でのMCPサーバー上では上手く機能しないものになることが多い
  • 質の高いものを作ろうとするのは良いが、あまりにも時間がかかりすぎる

ということで、このMCPサーバー専用の skill-builder スキルを独自に作り対応しました。
この対応により、対応したスキルがなければスキルを作って対応することができるようになりました。

MCPサーバーの認証

ローカルで個人利用するだけなら認証は不要ですが、エンジニア以外も気軽に使えるようにするには、ホスティングして共有する必要があります。今回はMCPの標準的な認証仕様に基づきOAuthに対応しました。標準的なOIDC仕様に準拠しているので、Google、Azure AD、Oktaなど、メジャーなIDプロバイダーであれば基本的にどれでも使えるようにしたつもりです。
(ただしGoogleでしか試していませんが。。。)

MCPのOAuth認証については今回は深堀りはしませんが、過去にいくつか記事を書いているので興味があればそちらを見ていただけると嬉しいです。
https://zenn.dev/ncdc/articles/40a7a51a2a016d
https://zenn.dev/ncdc/articles/2d704a34ca1eed

実際に使ってみよう

では、実際にClaudeから使ってみます。
とりあえず、Google Cloud の Cloud Run にデプロイして、環境変数でVertexAIの呼び出しやGoogle認証を設定をしておきます。


Cloud Runにデプロイ

Claudeでコネクタに追加して、MCPサーバーに設定したGoogle認証を通します。


Claudeに接続して、MCPサーバーのGoogle認証を通す

スキルがない質問をしてみる

とりあえず、スキルを使って課題を解決するように質問してみます。

まずは質問に対してスキルを検索

該当するスキルがないので、新規作成をしようとします。

AIがスキルを新規作成してくれる

作成したスキルを使って、結果を出してくれました。

作ったスキルを即実行


最初の質問の答えを取得

作成済のスキルを検索して使わせてみる

コンテキストをリセットして、もう一度同じことを聞いてみます。2回目以降は検索にヒットするので、そのまま使ってくれます。

作られたスキルの確認

作られたスキルはファイルで保存されます。コンテナで動かすと消えてしまうので今回Cloud Runで動かしたときは、Cloud Storageをマウントすることで永続化しました。こういう事が簡単にできるCloud Runは便利すぎます。
ファイルでさえ残せれば、あとは手動で追加、編集、削除することも出来ます。

課題

このMCPサーバーを作ってみて想定した動きは最低限してくれましたが、改善の余地がありそうな点は多々あります。

スキルで出来ることが少ない

はっきりいって普通のAgent Skillsより出来ることが限られます。主に以下のような点です。

隔離されたコンテナ内で動くのが前提なので、ローカルのPC内の資産は使えない

これはセキュリティとトレードオフなので仕方がないかなと思っています。。。

認証が必要な操作をするスキルはかなり限定的

例えば自分のGitHubのPrivateリポジトリを参照するとか普通の開発用スキルなら当然出来ることでも困難です。上手くセキュリティ情報を渡す仕組みがあると良いのですが、一旦保留しています。

作成されたスキルの質が低い

これは大きく2つの理由からです。

  • そもそもAIに自動で質の高いスキルを作ってもらうことが難しいこと
  • スキルを作るスキルの質が悪いこと

前者は仕方がないとして、後者は前述の通りAnthropic公式のskill-creatorでなく自作のスキルを使っているからですね。そしてそのスキルの質が低い。現状は「最低限動くものを作った」状態なので、どこかで質の改善もしたいと思っています。

ユーザーを待たせる時間が長い

実際に答えを得るまでに時間がかかるのですよね。特にスキルの作成が遅いです。
スキルがない状態から、スキル検索→ないので作る→作ったスキルで回答で数分かかってしまいます。
ある程度待たせるのは仕方がないかなと思っているのですが、待たされている感を少なくする仕組みは必要だと思っています。

まとめ

Agent Skillsを実行するMCPサーバーを作ってみました。
まだ問題は多いので、エンジニア以外が簡単にAgent Skillsの良さを味わってもらえるまでは至れていないですが、普通にClaudeに聞いても失敗したことをこのMCPサーバーを通すと成功したりもするので、それなりに有用なんじゃないかなと思っています。
あと、エージェントが勝手にスキルを生やしてくれるので、使っていると成長していくのが結構面白いです。

NCDC テックブログ

Discussion