はじめに
先日AnthropicからMCP (Model Context Protocol) が発表され話題になっています。
MCPのサーバー側の基本機能としてはPrompt, Resource, Toolの3つが存在するのですが、SNS等で話題になっているMCPの利用例はToolの利用がほとんどであり、その他のResourceやPromptについては触れられているものが少なかったので、調べてみることにしました。
MCPサーバーの3つの基本機能について
下記ページに記載の内容を日本語で整理します。
Prompts:LLMとのインタラクションをガイドする、事前定義されたテンプレートや指示
Resources:モデルに追加のコンテキストを提供する構造化データやコンテンツ
Tools:モデルが操作を行ったり、情報を取得したりできるようにする実行可能な関数各要素は、以下の制御階層でまとめることができます。
プリミティブ | 制御主体 | 説明 | 例 |
---|---|---|---|
Prompts | ユーザー制御 | ユーザーの選択によって呼び出される対話型テンプレート | スラッシュコマンド、メニューオプション |
Resources | アプリケーション制御 | クライアントによって付与・管理されるコンテキストデータ | ファイル内容、Git履歴 |
Tools | モデル制御 | LLM(大規模言語モデル)に公開された実行関数 | API POSTリクエスト、ファイル書き込み |
また、大きな違いとしてPromptとToolは呼び出し時に変数を渡せるのに対し、ResourceはURIを指定することしかできません。
https://spec.modelcontextprotocol.io/specification/server/prompts/#getting-a-prompt
https://spec.modelcontextprotocol.io/specification/server/resources/#reading-resources
https://spec.modelcontextprotocol.io/specification/server/tools/#calling-tools
Claude Desktop Appでの活用例
実際に、それぞれの機能を提供するMCPサーバーを、Claudeのデスクトップアプリを通して触ってみます。
(Apple sillicon, MacOS 15.1.1)
Prompt
Everything MCP Server
まずは簡単な例を確かめるために、以下のeverythingサーバーを使ってみます。
この中で提供されているPromptは以下の2つです
- simple_prompt: シンプルな固定prompt
- complex_prompt: 変数ありのprompt
このサーバーを設定してClaudeを起動してみるとファイルを添付するボタンの横に Attach from MCP
というボタンが出現します。
このボタンをクリックすると、サーバーで定義されているPromptが表示されました。
(後述するResourceもここに表示されています)
実際に simple_prompt
を選択してみるとこのようにtxtファイルが添付されるだけでした。
選んだらpromptが展開される挙動を期待していたのですが、現状はそこまで実装されていないようです。
続いて変数ありの complex_prompt
を選択してみると、変数の入力モーダルが展開されます。
ただしこれも、値を入力してsubmitすると添付ファイルができるだけでした。
もちろんこれでも十分プロンプトテンプレートを提供する機能は果たせていますが、体験としてはちょっと物足りないかなと感じました。
Fetch MCP Server
もう1つ、Prompt機能を提供しているサーバーがあったので、こちらも試してみます。
このサーバーでは、URLを引数として渡せる fetch
promptが提供されています。
先ほど同様、設定をしてClaudeを起動すると fetch
というpromptが選択できます。
すると先ほど同様に、txtファイルが添付ファイルとして添付されました。
そのファイルの中身を見てみるとPromptではなく実際にfetchしてきた内容そのものが入っていました。
個人的にはPromptの使い方としてはあくまで、MCPサーバー内のツールをうまく使えるプロンプトなどをスラッシュコマンドなどで呼び出し、展開するようなものだと考えていました。
しかしこのように、ResourceのURI指定だけだと対応できない、動的なコンテキスト付与を行いたい場合にもPromptが活用できるようです。
Resource
Google Drive server
Resourceに関してはGoogle DriveのMCPサーバーを使って検証します。
Google Driveサーバーの設定
google driveのサーバーだけ、READMEの通りだとうまくいかなかったので少し設定を補足します。
まずREADMEのGetting startedの1~6までを実行します。
その後
# このリポジトリをclone
git clone git@github.com:modelcontextprotocol/servers.git
# 6で落としてきたjsonファイルを `servers/` に `gcp-oauth.keys.json` という名前で置く
mv (DLしてきたcredential情報が載っているjson) servers/gcp-oauth.keys.json
# ディレクトリ移動
cd path/to/servers/src/gdrive
npm install
npm run build
# googleの認証を通す
# このコマンドを実行すると、ブラウザが開いて認証画面が表示される
node ./dist auth
ここまでやったら claude_desktop_config.json
に
{
"mcpServers": {
"gdrive": {
"command": "node",
"args": [
"path/to/servers/src/gdrive/dist/index.js"
]
}
}
}
を設定し、Claudeアプリを再起動してください。
Google Driveサーバーでは、接続したDrive内のファイルがリソースとして活用できます。
設定を済ませてClaudeを起動し、Promptの時同様「Attach from MCP」ボタンをクリックしてみます。
Drive内のファイルたちが、選択できるようになっています。
ファイルを選択すると、コンテキストとして添付することができます。
ただし現状のClaudeアプリだと、検索窓もなく、表示件数もサーバーで指定されている数だけ(デフォルトだと10件)でページャーもないので、かなり使い勝手は悪いです。
Tool
Slack MCP Server
Toolに関しては、下記のSlackのMCPサーバーで試します。
このMCPサーバーでは、以下の8つのツールが提供されています。
- slack_list_channels
- slack_post_message
- slack_reply_to_thread
- slack_add_reaction
- slack_get_channel_history
- slack_get_thread_replies
- slack_get_users
- slack_get_user_profile
今回は slack_list_channel
で自分のtimesを見つけ、 slack_post_message
でテスト投稿をするところまでやってみます。
設定に関しては slackのMCPサーバーのREADMEに沿ってやれば問題ありません。
(ただし今回は、作ったbotをいちいちチャンネルに参加させるのが面倒だったので、Bot TokenのScopeに chat:write.public
を追加しています。)
無事接続に成功すると、チャットエリアの右下に🔨アイコンと 8
という数字が表示されます。
ここをクリックすると、無事SlackのMCPサーバーが提供しているtoolが使えるようになっていることが確認できました。
実際にtimesを探してテスト投稿をしてもらうようにお願いしてみると、適切なtoolを活用してちゃんと正しいチャンネルに投稿してくれました。
まとめ
Prompt, Resource, Toolそれぞれについて、Claudeアプリをクライアントとして実際に試してみましたが、現状Tool以外は体験としてはなんともいえませんでした。
Promptを動的なコンテキスト付与だと捉えると少し活用幅は広がりそうかなと思いましたが、クライアント側の機能拡張がもう少し進まないと、引き続きToolの利用が主目的になるかなという感じです。
逆に自分がクライアント側の実装をする時には、これらの機能をフル活用できるように作りたいなと思います