はじめに
3週間ほど前、SAP Communityのブログで"Universal OData ↔ MCP Bridge"というツールが紹介されていました。
何をしてくれるツールか?
ODataのメタデータをもとに、MCPクライアント(例:ClaudeなどのAIアシスタント)が理解可能なツール定義を自動生成するツールです。このツールを使用することで、任意のODataサービス(V2/V4)をMCPクライアントから呼ぶことができます。
たとえば、対話形式でNorthwindのODataサービスから最も値段の高い製品を取得することが可能です。
使い方
Windows 11でUniversal OData ↔ MCP Bridgeを使ってみます。MCPクライアントについてはChatGPTに聞いたところ最も手軽に始められそうだったのがClaudeだったため、ClaudeのPro版を使用することにしました。
ステップ
- Cluade Desktopをダウンロード
- Universal OData ↔ MCP Bridgeをダウンロード
- claude_desktop_config.jsonを設定
- Universal OData ↔ MCP Bridgeを利用
1. Cluade Desktopをダウンロード
ローカルのツール呼び出しはDesktopアプリからしか行えないため、Cluade Desktopをダウンロードします。
2. Universal OData ↔ MCP Bridgeをダウンロード
以下のリポジトリのReleasesから、最新のリリースをダウンロードします。
Windowsなので、odata-mcp-<version>-windows-amd64.zip
をダウンロードしました。
zipフォルダを解凍後、odata-mcp.exe
とリネームして任意のフォルダ(例:C:/bin
)に格納します。
4. claude_desktop_config.jsonを設定
%APPDATA%\Claude
のディレクトリにclaude_desktop_config.json
を作成し、以下の設定を追加します。args
に指定できるフラグについてはドキュメントで説明されています。
{
"mcpServers": {
"northwind-go": {
"args": [
"--service",
"https://services.odata.org/V2/Northwind/Northwind.svc/",
"--tool-shrink"
],
"command": "C:/bin/odata-mcp.exe"
}
}
}
試しにコマンドラインから以下のコマンドを打つと、生成されるツールの定義を見ることができます。
C:\bin\odata-mcp.exe --trace https://services.odata.org/V2/Northwind/Northwind.svc/
この中にodata_service_info_for_<サービス名>
というツールがあり、MCPクライアントはまずこのツールを呼んでODataのメタデータを取得した後、個別のツールを使ってリクエストを送信するという流れのようです。
{
"name": "odata_service_info_for_NorthSvc",
"description": "Get information about the OData service including metadata, entity sets, and capabilities",
"parameters": null,
"operation": "info",
"properties": {
"properties": {
"include_metadata": {
"default": false,
"description": "Include detailed metadata information",
"type": "boolean"
}
},
"type": "object"
}
}
5. Universal OData ↔ MCP Bridgeを利用
Cloud Desktopを再起動し(※)、ツールの中に"northwind-go"があることを確認します。
※アプリを閉じ、タスクマネージャから終了させる
"northwind-go"をクリックすると登録された個別のツールが表示されます。
NorthwindのODataサービスに関するクエリを入力してみます。
(例)
- 値段の高いProductのトップ10を教えて
- 直近で登録されたOrder 10件の納期と出荷状況を教えて
カスタムODataサービスでやってみる
CAPでTODOを管理する簡単なODataサービスを作成します。
サービス定義
スキーマ定義
namespace todo;
using { managed } from '@sap/cds/common';
entity Todos: managed {
key ID: UUID;
title: String(100);
description: String(500);
done: Boolean;
deadline: DateTime;
}
サービス定義
using { todo } from '../db/schema';
service TodoService {
entity Todos as projection on todo.Todos;
}
cds watch
でローカルで実行しておきます。
[cds] - server listening on { url: 'http://localhost:4004' }
[cds] - server launched in: 231.194ms
[cds] - [ terminate with ^C ]
claude_desktop_config.jsonを設定
claude_desktop_config.json
に以下の設定を追加します。
{
"mcpServers": {
"northwind-go": {
"args": [
"--service",
"https://services.odata.org/V2/Northwind/Northwind.svc/",
"--tool-shrink"
],
"command": "C:/bin/odata-mcp.exe"
},
"manage-todo": {
"args": [
"--service",
"http://localhost:4004/odata/v4/todo",
"--tool-shrink"
],
"command": "C:/bin/odata-mcp.exe"
}
}
}
カスタムODataサービスと連携
Claudeを再起動後、"manage-todo"のツールが表示されます。
クエリを実行してみます。
問題:OData V4でパラメータつきのGETリクエストが失敗する
以下のリクエストがバックエンドに送信ました。
[odata] - GET /odata/v4/todo/Todos { '$filter': 'done eq false' }
[error] - 400 - peg$SyntaxError: Parsing URL failed at position 33: Expected "(", "/", a whitespace, or an optional whitespace but "+" found.
正しくは/odata/v4/todo/Todos?$filter=done eq false
となるべきところ、クエリパラメータが変換されずにそのまま渡されています。ツール側でパラメータつきのクエリの生成方法に問題があるようです。この件はGitにIssueとして登録しました。
https://github.com/oisee/odata_mcp_go/issues/9
OData V2にしたところGETリクエストも成功しました。
おわりに
Universal OData ↔ MCP Bridgeを使って、NorthwindサービスやCAPで作成したカスタムODataサービスをClaudeから自然言語で操作できることを確認しました。現時点ではOData V4でフィルタークエリに問題がありますが、V2であれば問題なく動作します。とても手軽に始めることができたので、興味のある方はぜひ使ってみてください。