はじめに
25年はAIエージェントを支える技術としてMCPが急速に普及しました。
自分の過去記事でも多く取り上げており、簡単な実装例も紹介しています。Javaで実装して公開するためにMCP公式サイトで提供されているSDKを使用していましたが、Servetベースでは手順は慣れるまで時間がかかるところもありました。
REST APIと同じ感覚で実装できるよう、OpenLibertyでMCPサーバーを簡単に提供するFeatureが準備中となっています。
ベータ版として提供されて利用もできますので、この機能で構築したアプリケーションを動かしつつ機能と実装に関する解説をおこないます。
こちらの記事は「動かす編」になります。お手元のAIエージェントと組み合わせて動作するところを体験していただけます。
サンプルプログラムでのFeatureを使った実装手順はコード解説編でご紹介します。
MCPサーバーについて理解を深めたい方は、コチラの記事でも取り上げていますのでご確認ください。ただこの記事を記載した時点からMCPの仕様が2回更新されていますので、最新仕様を把握したい方はMCPの公式サイトもご確認ください。
前提条件
- RDBはMariadbを使用します、コンテナ上で実行するためPodmanなどのコンテナ環境が必要です
- Java17以上のJDK
- Git
- npm(Node Package Manager)、これはMCPサーバーの実行には必要ありませんが検証とサーバー接続に使用します
検証は次の環境で実施しています。
- Windows11 Home
- IBM Semeru21 JDK
- Podman
サンプルプログラム
MCP利用に特化した図書館アプリケーションです。GUIやAPIといったインターフェースは実装しておらず、ツールとしての機能もシナリオ検証用に絞り込まれています。
テーブル構成
図のテーブル構成としています。サンプルプログラムの仕様理解にご活用ください。
機能
ツールとして次の機能を公開します。
| ツール | コメント |
|---|---|
| 図書館ルールのリスト取得 | パラメータとして日付を指定しているが、ダミーとなっている |
| ユーザー情報取得 | ロールは管理者とユーザーの2種類 |
| 蔵書検索 | booksテーブルに評価を含めたビューを参照する |
| 貸出履歴検索 | 特になし |
| 貸出手続き | ツール内にチェックロジックは敢えて実装していない |
| 返却手続き | 特になし |
| 新規ユーザー追加 | ツール内にチェックロジックは敢えて実装していない |
| データベース初期化 | パスワードはシステム日付8桁 |
業務ルール
ツール内では、ここに記載したルールをチェックする実装は行っていません。ルールの判断と対応はAIエージェントの役割としています。
- ユーザーは同時に3冊まで貸し出しができる
- 借りている本のうち1冊でも延滞があると貸し出しができない
- 一つの本を借りられるのは1ユーザーのみ、重複貸し出しはできない
- ユーザー追加は管理者のみ実施可能
- 本の貸し出し時には、最新のデータで貸し出し可能かのチェックを実施する必要がある
セットアップおよび起動
OpenLiberty ベータ版のダウンロード
OpenLibertyの公式サイトからベータ版のダウンロードが可能です。
こちらのページの後半に「Download package」というセクションがあり、Betasタブから最新ベータ版を取得します。記事作成時点では 26.0.0.1-beta が最新です。
ダウンロードが完了したら、展開して任意のフォルダに配置してください。
この記事では c:\Projects\wlp に配置するものとします。
サンプルプログラムのダウンロード
次のGitコマンドでサンプルプログラムをダウンロードします。
git clone https://github.com/tatsuya-ibm/library-mcp
サンプルプログラムの修正
pom.xmlの次の箇所を変更します。
<properties>
(略)
<wlp-dir-path>C:\projects\wlp</wlp-dir-path>
<mcp-jar-version>1.0.108</mcp-jar-version>
</properties>
| 項目 | 変更後の値 |
|---|---|
| wlp-dir-path | OpenLibertyを展開したフォルダに変更します。 |
| mcp-jar-version | 展開フォルダに含まれるライブラリのバージョン(ベータ版毎に異なります)に書き換えます。 (展開フォルダ)\dev\api\ibm\io.openliberty.mcp_XXX.jar というJarファイルのXXXがバージョンです。 |
MariaDBの起動
MariaDBのコンテナを起動します。
podman run -d --name maria01 -e MYSQL_ROOT_PASSWORD=rootpwd -e MYSQL_DATABASE=db01 -e MYSQL_USER=usr01 -e MYSQL_PASSWORD=pwd01 -p 3306:3306 mariadb:latest
MCPサーバー起動
サンプルプログラムを展開したフォルダで、Powershellで起動コマンドを入力します。
RDBへのテーブル定義やテストデータ投入は起動時に行われます。
./mvnw liberty:dev
MCPの検証
起動したMCPサーバーが正常に動作しているか検証するため、MCP公式が提供している MCP Inspector を使用します。
次のコマンドで、InspectorをD/Lおよび起動します。自動的に新しいブラウザタブが起動しますが、起動しない場合はコンソール上に表示されているURLにパラメータ含めてアクセスしてください。
npx @modelcontextprotocol/inspector
起動後、画面上で次の接続先設定を行い「Connect」をクリックします。
| 項目 | 変更後の値 |
|---|---|
| Transport Type | Streamable HTTP |
| URL | http://localhost:9080/librarymcp/mcp |
| Connection Type | Via Proxy |
Connectボタン押下後、「List Tools」ボタンを押してツールのリストが表示されればMCPサーバーは正常に起動しています。
この画面からツールを指定してパラメータを渡すことで、直接ツールを実行することも可能です。
AIエージェントとの接続
MCP利用に対応したローカル駆動のAIエージェントは数多く存在します。あなたの環境に合ったエージェントアプリをご利用ください。この記事ではGooseとClaudeの設定手順をご紹介します。
Goose の設定手順
オープンソースのAIエージェントです。
この記事作成中に発表された「Agentic AI Foundation」(IBMもGoldMemberに名前を連ねています
)が管理するプロジェクトとして、MCPと並んでリストアップされています。
インストール
公式サイトからWindows版の goose Desktop を指定してダウンロード、任意の場所に展開するだけです。
LLMの設定
ご利用のAIサービスに合わせて定義を行います。watsonx.aiは残念ながら現時点でリストにありませんが、LiteLLM経由で利用することが可能です。
(LiteLLMとwatsonx.aiを接続する手順はコチラの記事を参考にしてください)
初回起動時にモデル登録の画面が表示されます。画面中段にある Other Providers を選択します。
API KeyとAPIHostはコンテナ設定にあわせて指定します。Base Pathはデフォルト表示のままとします。
MCPサーバーの設定
メニューからExtensions > Add Custom extension を選択し、添付画像のように入力します。
| 項目 | 設定値 |
|---|---|
| Extension Name | (任意) |
| Type | Streamable HTTP |
| Description | (任意) |
| Endpoint | http://localhost:9080/librarymcp/mcp |
Enable Extensionsの欄に、登録したMCPサーバーが表示されればOKです。
Claude for Windows の設定手順
Windowsであれば次のコマンドでインストール可能です。
winget install Anthropic.Claude
MCPサーバーの設定
画面左下の「設定」から、デスクトップアプリのセクションにある「開発者」を選択します。
「設定を編集」ボタンを押し、claude_desktop_config.json を次のように編集します(既存の設定がある場合、適宜追記してください)。
開発者設定ではStdio経由のMCPサーバー接続のみ対応していますが、Stdio経由でStreamableHTTPのリモートMCPサーバーと接続するmcp-remoteを使用します。
{
"mcpServers": {
"library": {
"command": "npx",
"args": [
"mcp-remote",
"http://localhost:9080/librarymcp/mcp"
]
}
}
}
編集後、Claudeアプリを再起動します。
チャット画面のツールアイコンを選択した際に、登録ツールが表示されていればOKです。
AIエージェントで図書館アプリを操作する
ここまでの設定で、AIエージェントから図書館アプリを操作することができるようになりました。
次の会話は一例ですが、AIエージェントがどのように動作するかを確認できます。AIエージェントツールやモデルの選択によって結果の傾向は変わる可能性があります。
図書館のルールを意識してもらう
「私のユーザーIDは0001です、図書館の事務ルールを理解して対応してください」
ツール名を指定せず、事務ルールを確認するよう促します。
AIは指示内容から適切なツールを選択し、呼び出した結果を復唱しています。
借りたい書籍をレコメンドしてもらう
「過去に借りた本と同じカテゴリで、まだ過去に自分が借りたことがない本、かつ評価の高い本を3冊教えて」
必要な本の条件を指定していますが、どのように抽出するかは指定していません。
AIはこの内容から必要なツールを複数選択し、適切な順序で呼び出しています。
スクショでは畳まれていますが、2回目のツール呼び出しでは、1回目の呼び出し結果(過去に借りたカテゴリ)をパラメータで指定しています。
狙った本が借りられるか確認する
「Web Development with TypeScriptを貸し出しできますか」
AIは「貸し出しチェックのツールを呼び出す」のではなく、ルール判断に必要なツールを呼び出し、その情報から貸し出し可否を判断しています。
従来はルールを再現したコードを実装していたところですが、ここではAIが自然文から自律的に判断しています。
この本は他者が既に借りているため、貸し出し不可と判断しました。ネクストアクションについてのサジェストがあるところはAIによくみられる気配りですね。
別の本を貸し出しする
「Statistical Analysis with Rの貸し出しを行ってください」
正常系の対応です。さきほどと同じようにチェックを行い、問題ないため貸し出し手続きを続けて実行しています。
ツール呼び出しで様々な処理を実行できるため、RAGでは対応できなかった「データの更新処理」も実現できています。
借りている本を返却する
「Introduction to Linux Command Lineを返却します」
返却処理のためにはパラメータとして5段階評価が必要ですが、リクエストに評価は指定していません。
AIは情報が不足しているためユーザーに追加の確認を行い、最終的に返却処理のツール呼び出しを行っています。
おわりに
JavaでMCPサーバーの機能が提供できることを確認しました。
AIエージェントと組み合わせることで、ユーザーインターフェース、および業務ロジックを任せるという可能性が見えてきたのではないでしょうか。
引き続き、サンプルプログラムの実装内容をコード解説編でご紹介します。こちらでMCPサーバーの実装が容易であることをご認識ください。