6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Open Libertyで簡単に実現するMCPサーバー 【1: 動かす編】

Posted at

はじめに

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といったインターフェースは実装しておらず、ツールとしての機能もシナリオ検証用に絞り込まれています。

qiita-square

テーブル構成

図のテーブル構成としています。サンプルプログラムの仕様理解にご活用ください。

qiita-square

機能

ツールとして次の機能を公開します。

ツール コメント
図書館ルールのリスト取得 パラメータとして日付を指定しているが、ダミーとなっている
ユーザー情報取得 ロールは管理者とユーザーの2種類
蔵書検索 booksテーブルに評価を含めたビューを参照する
貸出履歴検索 特になし
貸出手続き ツール内にチェックロジックは敢えて実装していない
返却手続き 特になし
新規ユーザー追加 ツール内にチェックロジックは敢えて実装していない
データベース初期化 パスワードはシステム日付8桁

業務ルール

ツール内では、ここに記載したルールをチェックする実装は行っていません。ルールの判断と対応はAIエージェントの役割としています。

  • ユーザーは同時に3冊まで貸し出しができる
  • 借りている本のうち1冊でも延滞があると貸し出しができない
  • 一つの本を借りられるのは1ユーザーのみ、重複貸し出しはできない
  • ユーザー追加は管理者のみ実施可能
  • 本の貸し出し時には、最新のデータで貸し出し可能かのチェックを実施する必要がある

セットアップおよび起動

OpenLiberty ベータ版のダウンロード

OpenLibertyの公式サイトからベータ版のダウンロードが可能です。
こちらのページの後半に「Download package」というセクションがあり、Betasタブから最新ベータ版を取得します。記事作成時点では 26.0.0.1-beta が最新です。

qiita-square

ダウンロードが完了したら、展開して任意のフォルダに配置してください。
この記事では c:\Projects\wlp に配置するものとします。

サンプルプログラムのダウンロード

次のGitコマンドでサンプルプログラムをダウンロードします。

git clone https://github.com/tatsuya-ibm/library-mcp

サンプルプログラムの修正

pom.xmlの次の箇所を変更します。

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
qiita-square

Connectボタン押下後、「List Tools」ボタンを押してツールのリストが表示されればMCPサーバーは正常に起動しています。

qiita-square qiita-square

この画面からツールを指定してパラメータを渡すことで、直接ツールを実行することも可能です。

AIエージェントとの接続

MCP利用に対応したローカル駆動のAIエージェントは数多く存在します。あなたの環境に合ったエージェントアプリをご利用ください。この記事ではGooseとClaudeの設定手順をご紹介します。

Goose の設定手順

オープンソースのAIエージェントです。
この記事作成中に発表された「Agentic AI Foundation」(IBMもGoldMemberに名前を連ねています:confetti_ball:)が管理するプロジェクトとして、MCPと並んでリストアップされています。

インストール

公式サイトからWindows版の goose Desktop を指定してダウンロード、任意の場所に展開するだけです。

LLMの設定

ご利用のAIサービスに合わせて定義を行います。watsonx.aiは残念ながら現時点でリストにありませんが、LiteLLM経由で利用することが可能です。
(LiteLLMとwatsonx.aiを接続する手順はコチラの記事を参考にしてください)

初回起動時にモデル登録の画面が表示されます。画面中段にある Other Providers を選択します。

qiita-square

API KeyとAPIHostはコンテナ設定にあわせて指定します。Base Pathはデフォルト表示のままとします。

qiita-square

MCPサーバーの設定

メニューからExtensions > Add Custom extension を選択し、添付画像のように入力します。

qiita-square
項目 設定値
Extension Name (任意)
Type Streamable HTTP
Description (任意)
Endpoint http://localhost:9080/librarymcp/mcp
qiita-square

Enable Extensionsの欄に、登録したMCPサーバーが表示されればOKです。

qiita-square

Claude for Windows の設定手順

Windowsであれば次のコマンドでインストール可能です。

winget install Anthropic.Claude

MCPサーバーの設定

画面左下の「設定」から、デスクトップアプリのセクションにある「開発者」を選択します。

qiita-square qiita-square

「設定を編集」ボタンを押し、claude_desktop_config.json を次のように編集します(既存の設定がある場合、適宜追記してください)。
開発者設定ではStdio経由のMCPサーバー接続のみ対応していますが、Stdio経由でStreamableHTTPのリモートMCPサーバーと接続するmcp-remoteを使用します。

claude_desktop_config.json
{
  "mcpServers": {
    "library": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "http://localhost:9080/librarymcp/mcp"
      ]
    }
  }
}

編集後、Claudeアプリを再起動します。

チャット画面のツールアイコンを選択した際に、登録ツールが表示されていればOKです。

qiita-square

AIエージェントで図書館アプリを操作する

ここまでの設定で、AIエージェントから図書館アプリを操作することができるようになりました。
次の会話は一例ですが、AIエージェントがどのように動作するかを確認できます。AIエージェントツールやモデルの選択によって結果の傾向は変わる可能性があります。

図書館のルールを意識してもらう

私のユーザーIDは0001です、図書館の事務ルールを理解して対応してください
ツール名を指定せず、事務ルールを確認するよう促します。
AIは指示内容から適切なツールを選択し、呼び出した結果を復唱しています。

qiita-square

借りたい書籍をレコメンドしてもらう

過去に借りた本と同じカテゴリで、まだ過去に自分が借りたことがない本、かつ評価の高い本を3冊教えて
必要な本の条件を指定していますが、どのように抽出するかは指定していません。
AIはこの内容から必要なツールを複数選択し、適切な順序で呼び出しています。
スクショでは畳まれていますが、2回目のツール呼び出しでは、1回目の呼び出し結果(過去に借りたカテゴリ)をパラメータで指定しています。

qiita-square

狙った本が借りられるか確認する

Web Development with TypeScriptを貸し出しできますか
AIは「貸し出しチェックのツールを呼び出す」のではなく、ルール判断に必要なツールを呼び出し、その情報から貸し出し可否を判断しています。
従来はルールを再現したコードを実装していたところですが、ここではAIが自然文から自律的に判断しています。

この本は他者が既に借りているため、貸し出し不可と判断しました。ネクストアクションについてのサジェストがあるところはAIによくみられる気配りですね。

qiita-square

別の本を貸し出しする

Statistical Analysis with Rの貸し出しを行ってください
正常系の対応です。さきほどと同じようにチェックを行い、問題ないため貸し出し手続きを続けて実行しています。
ツール呼び出しで様々な処理を実行できるため、RAGでは対応できなかった「データの更新処理」も実現できています

qiita-square

借りている本を返却する

Introduction to Linux Command Lineを返却します
返却処理のためにはパラメータとして5段階評価が必要ですが、リクエストに評価は指定していません。
AIは情報が不足しているためユーザーに追加の確認を行い、最終的に返却処理のツール呼び出しを行っています。

qiita-square

おわりに

JavaでMCPサーバーの機能が提供できることを確認しました。
AIエージェントと組み合わせることで、ユーザーインターフェース、および業務ロジックを任せるという可能性が見えてきたのではないでしょうか。

引き続き、サンプルプログラムの実装内容をコード解説編でご紹介します。こちらでMCPサーバーの実装が容易であることをご認識ください。

6
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?