JavaでつくるMCP SSEサーバー on Liberty【2: うごかす編】

## はじめに
「25年はAIエージェントが流行る」という観測が多く聞かれましたが、昨今開発界隈で話題の**Model Context Protocol** (MCP)により、現実味が増してきたように思います。
既に多くの方が記事化されていますが、Claudeと開発ツール系のMCPサーバーを組み合わせるパターンが多く見受けられます。またPythonのサンプルコードは多いですが、Javaは少数派です。
そこで当記事では「**業務データを扱うMCP**」をイメージして、どんなことが実現できるのかを体験していきたいと思います。プラットフォームは業務システムで広く利用されているJavaを使用します。

### 実現すること
JavaのOpenLiberty上で動作するサービスをSSEのMCPサーバーとして実行し、AIアプリケーションと組み合わせて動作を確認します。

1:[つくる編](https://qiita.com/mi-ta/items/bc57dac96b0a05291134)
2:うごかす編（当記事）

当記事では、MCPサーバーを起動して動作確認を行い、MCPクライアント機能を持つVSCodeと接続してAIと会話する手順と結果を解説します。「つくる編」で実施したセットアップが完了していることを前提とします。

### 環境
| ツール等 | バージョン |
|:-:|:-:|
| JDK  | IBM Semeru Runtime 21.0.4  |
| Liberty  | 25.0.0.4 |
| OS | Windows 11 Enterprise 23H2 |
| VSCode | 1.99.3 |
| MCP SDK | 0.9.0 |
| Python | 3.12.3 |
| node.js | 22.15 |

Pythonとnode.jsはMCPサーバーの動作検証ツールを使用するために使いますが、検証ツール使用をスキップしてもMCPサーバーは動かすことができます。

## MCPサーバーの起動
MCPサーバーをインストールしたフォルダで
```
mvnw liberty:run
```
で起動できます（PowerShellから実行する場合は ./mvnw〜）。

## MCPサーバーの検証
:::note info
この手順はスキップしても問題ありませんが、試してみることでより理解が深まるでしょう。ご自身でMCPサーバーをスクラッチ構築する際にも役立つはずです。
:::

### MCP Inspector のインストールと起動
https://modelcontextprotocol.io/docs/tools/inspector

公式サイトでは「MCP Inspector」というツールが公開されています。このツールを利用すると、MCPサーバーにアクセスして、Toolsをはじめとする提供機能の一覧表示や、パラメータを指定して特定のToolをその場で呼び出すことが可能です。

当記事では、MCP Inspectorを実行する手順を解説します（Pythonのインストール手順は割愛します）。取得から実行までの手順は以下のとおりです。
```
git clone https://github.com/modelcontextprotocol/inspector
cd inspector
npm install
npm run dev:windows
```
もしインストール中に「Cannot find module @rollup/rollup-win32-x64-msvc」というエラーに遭遇する場合は、[こちらのissue](https://github.com/rollup/rollup/issues/5571)を参考にして、**package.json**を修正してみてください（overrides以降を末尾に追加）。
```
  "devDependencies": {
    "@types/jest": "^29.5.14",
    "@types/node": "^22.7.5",
    "@types/shell-quote": "^1.7.5",
    "jest-fixed-jsdom": "^0.0.9",
    "prettier": "3.3.3",
    "typescript": "^5.4.2"
  },
  "overrides": {
    "vite": {
      "rollup": "npm:@rollup/wasm-node"
    }
  }
}
```
修正後にnode_modulesフォルダとpackage-lock.jsonを削除して再実行してみてください。


<img width="400" alt="qiita-square" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536604/f753334b-17a5-46e8-99f6-d923c32248c1.png">

このような起動画面まで到達したら、**ブラウザから記載のURLにアクセス**してください。


### MCP Inspectorの接続

<img width="300" alt="qiita-square" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536604/05792598-8807-43a3-822f-a0d4aa335ccd.png">

表示された画面に対し、次の設定を変更して「Connect」を押します。
| 項目 | 設定値 |
|:-:|:-:|
| Transport Type | SSE |
| URL | http://localhost:9080/mcpserver/sse |

<img width="800" alt="qiita-square" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536604/7ea947e6-6c81-49c7-9639-f384dfe5a1af.png">

MCPサーバーが正常に動作していれば、ステータスが「Connected」になり、上の画面に切り替わります。
サーバーが持つ機能を上のタブから選択し、List XXXを押すことで提供されている機能を一覧表示できます。

<img width="800" alt="qiita-square" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536604/8abc2489-0eec-40e2-8c79-bcc6643f8739.png">

リストからtoolを選択すると、右ペインにtool説明や入力項目が表示されます。
この画面で入力項目に値を指定して「Run Tool」ボタンを押すと、MCPサーバーにリクエストを投げて結果を返します。
**Inspector上の処理はMCPサーバーの機能を確認しているだけなので、まだAIは関係していないという点は認識しておいてください。**

## MCPクライアントの設定
MCPサーバーの機能を実際にAIから呼び出すために、MCPクライアントの機能を持つAIツールの準備を行ないます。

### VSCode の設定
25年3月にリリースされたバージョン1.99で提供された**エージェントモード**機能を使用します。現在、バージョンが1.99未満の方は、1.99以上にアップデートしてください。

:::note info
当記事では、Java開発者にとって馴染み深いと思われるVSCodeを選択し、これを基準に解説を進めます。他のMCPクライアントでも実行可能ですが、先行する記事ではClaude Desktopを用いられることが多いですが、記事作成時点ではSSE（Server-Sent Events）に対応していません。別ツールを併用したClaudeで接続する手順は後述します。
:::

https://apidog.com/jp/blog/vscode-agent-mode-jp/

エージェントモードを利用する準備などは、Apidog様の記事が参考になるかと思います。

VSCodeに慣れた方向けの説明としては、
* 「設定」からmcpで絞り込み、Chat > Mcp:Enabled になっていることを確認
* 「設定」からchat.agentで絞り込み、Chat > Agent:Enabled になっていることを確認

です。

VSCodeのコマンドパレット（Ctrl+Shift+P）を開き、「MCP」と入力して表示される候補から「MCP: サーバーの追加」「HTTP: サーバー送信イベント」を選択し、表示される入力欄に今回起動したMCPサーバーのエントリーポイントである「http://localhost:9080/mcpserver/sse」を入力してください。

その後、サーバーIDとスコープの入力を促されますので、適切な値を入力してください。

### VSCode とMCPサーバーの接続
再びコマンドパレット（Ctrl+Shift+P）を開き、「MCP」と入力して絞り込み、「MCP: サーバーの一覧表示」を選択します。表示されたサーバーリストから、先ほど登録したサーバーIDを選択してください。

次に、「サーバーの起動」を選択し、VSCodeのコンソール出力に「Discovered 1 tools」と表示されれば、MCPサーバーとの接続は成功しています。

### Claude Desktop と接続する
記事執筆時点では、Claude DesktopはSSEに対応していないため、今回のMCPサーバーに直接接続することはできません。しかし、STDIOとSSEを相互に変換するプロキシのようなアプリケーションを介することで接続が可能になります。ここでは、その一例として[mcp-remote](https://www.npmjs.com/package/mcp-remote)を利用した接続方法を紹介します。

```
{
  "mcpServers": {
    "weather-mars": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "http://localhost:9080/mcpserver/sse"
      ]
    }
  }
}
```
claude_desktop_config.jsonにこのような設定を行なうことで、
* MCPクライアントとmcp-remoteはSTDIOで接続する
* mcp-remoteとMCPサーバーはSSEで接続する

という構成をつくることができます。

## AIエージェントへの問合せ
### チャットの起動
Ctrl+Shift+Iを押すとAIチャットが起動します。エディタにファイルが開いている状態だと、それらのファイル内容もAIへの入力として参照されてしまうため、AIチャットを起動する前に開いているファイルはすべて閉じておいてください。
<img width="400" alt="qiita-square" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536604/8562f31e-b1b3-4021-8c66-2d794b232cf4.png">

チャットの実行モードが「質問する」になっている場合、「エージェント」に変更します。

<img width="400" alt="qiita-square" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536604/6f9ae893-45a2-4d80-990d-010a3f1228e9.png">

このような表示になっていれば問題ありません。左上のアイコンを見ることで、利用可能なツールが1つ存在することがわかります。
モデルはデフォルトで指定されているGPT-4oを使います。

### 聞いてみる
#### 火星のaoniaの今日の天気を教えてください

<img width="400" alt="qiita-square" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536604/a0aab60c-346c-4761-93d5-112a10600403.png">

AIが質問内容を適切に理解し、登録されたツールの中から回答に最も適していると判断して「mars-weather」を呼び出していることが確認できます。
**期待どおりの結果が得られました。**
VSCodeのチャット機能では、ツールを実行する前にユーザーに実行の可否を確認するため、安心して利用できそうです。

#### 火星のキンメリアの今日の天気を教えてください

<img width="400" alt="qiita-square" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536604/d4f7b63e-a317-4546-adb1-f1c4a6de6ae6.png">

toolのdescriptionを「gives today's weather of mars for a given cotinent written in English.」と設定しています。この設定に合わせて、質問する際には「キンメリア」を英語表記の「Cimmeria」に変更しています。
**期待どおりの結果が得られました。**

#### 火星のノアキス、サバエア、ティルヘナのなかで今日の気温がもっとも高いのはどこですか

<img width="400" alt="qiita-square" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536604/2e895eaf-3c6c-4cfd-88d4-274641833c28.png">

AIは、3つの大陸それぞれの天気情報を取得する必要があると判断し、ツールを3回呼び出しています。そして、取得した結果データから気温を抽出し、それらの大小を比較した上で結果を報告しています。
**期待どおりの結果が得られました。**

#### （前の質問に続けて）もっとも天気がよいのはどこですか

<img width="400" alt="qiita-square" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536604/274f6803-dc6e-4350-b6a8-216708d6aecf.png">

チャットの会話履歴を参照し、ノアキス、サバエア、ティルヘナの天気を判断対象としています。既に必要なデータは取得済であるため、改めてツールを呼び出すことなく回答しています。
**期待どおりの結果が得られました。**

### 困った点
他の端末で評価した際は問題なかったと記憶しているのですが、MCPサーバーを起動（接続）してから少し放っておくと接続が解除されます。
その度に再接続が必要なのは少々手間だと感じました。
この点については HTTP+SSEからStreambaleHTTPへの接続形式の移行によって解消されることを期待したいですね。

## 当記事のまとめ
MCPを使うことでAIアプリケーションと外部ツールを簡単な定義で接続できて、期待どおりに動作することを確認しました。
今回は天気のデータを例としましたが、対象を業務のRDB上のトランザクションデータ・マスタデータその他に置き換えて考えると、色々な可能性が広がるかと思います。
皆さんが担当されている業務システムにもMCPサーバーを組み込んで、AIの機能を拡張するようなユースケースを検討してみてください。

今回使用したMCPサーバーの構造については[つくる編](https://qiita.com/mi-ta/items/bc57dac96b0a05291134)でご確認ください。

## さらに詳しい情報をお探しの方へ
IBMの最新情報、イベント情報、さらに役立つ資料は、以下のIBM Communityでも発信・格納されています。
最新のトレンドや有益な情報をチェックするために、ぜひご覧ください！
- **WebSphere**: [IBM Community - WebSphere](https://community.ibm.com/community/user/wasdevops/communities/community-home?CommunityKey=d6c93aa2-6e10-48da-96dc-3831da8ee185)
WebSphere関連の最新情報やディスカッション、イベント情報、技術資料を公開中！
- **ELM (Engineering Lifecycle Management)**: [IBM Community - ELM](https://community.ibm.com/community/user/sustainability/communities/community-home?CommunityKey=f8bc69e0-9d61-4688-939b-018f5f74519e)
ELMに関する最新のイベント情報、ナレッジ共有、便利なドキュメントをチェック！
- **Integration**: [IBM Community - Integration](https://community.ibm.com/community/user/integration/communities/globalgrouphome?CommunityKey=fe1b09d3-7042-4a5f-bce0-6bcc19aa0ed9)
Integrationに関する最新のイベント情報、ナレッジ共有、便利なドキュメントをチェック！