Priority REST API MCP Server
Priority REST API MCP Server
AIアシスタント(Claudeなど)をPriority ERPシステムに直接接続するMCPサーバーです。すべてのOData操作(クエリ、作成、更新、削除、バッチ、添付ファイル、テキストフィールド)がMCPツールとして公開されるため、AIエージェントはカスタム統合コードなしでライブな業務データの読み書きができます。
バージョン: 0.2.0 · トランスポート: Streamable HTTP(SSEオプション) · ランタイム: Node.js 18 · ツール数: 19
クイックスタート
1. クローンしてインストール
git clone https://github.com/priority-mcp/priority-odata-mcp priority-mcp
cd priority-mcp
npm install2. サンプルから.envを作成
cp .env.example .env最低限、次の4つの変数を設定してください:
PRIORITY_BASE_URL=https://<host>/odata/Priority/<tabula.ini>/<company>/
PRIORITY_AUTH_TYPE=basic
PRIORITY_USERNAME=myuser
PRIORITY_PASSWORD=mypassword3. サーバーを起動
# Development (from source)
node src/index.js
# Production (bundled)
npm run build
node dist/index.js初回起動時にODATA_MCP_TOKENが設定されていない場合、ランダムなBearerトークンが生成されて標準出力に表示されます。次の手順のためにコピーしてください。
4. Claude Codeから接続
MCP設定に以下を追加します:
{
"mcpServers": {
"priority": {
"type": "http",
"url": "http://localhost:3000/mcp",
"headers": {
"Authorization": "Bearer <ODATA_MCP_TOKEN>"
}
}
}
}Related MCP server: mcp_sdk_eyra_accelerator
トランスポート
サーバーはプライマリトランスポートとしてStreamable HTTPを使用します。各POST /mcpリクエストは完全にステートレスです。リクエストごとに新しいMcpServerとStreamableHTTPServerTransportが作成され、処理後に破棄されます。
エンドポイント | メソッド | 目的 |
| POST | プライマリMCPエンドポイント(Streamable HTTP) |
| GET | SSEストリーム — |
| POST | SSEクライアント向けJSON-RPCメッセージ |
| GET | ヘルスチェック — バージョンとステータスを返す |
| GET | OAuth 2.1ディスカバリ(Claude Code ≥2.1.92で必須) |
| GET/POST | OAuth 2.1 PKCEフロー — 自動承認される |
注: OAuth 2.1エンドポイントは、Claude CodeのStreamable HTTP接続ハンドシェイクを満たすために存在します。すべてのリクエストを自動承認するため、実際のアクセス制御を目的としたものではありません。アクセス制御は
ODATA_MCP_TOKENによって処理されます。
認証
認証は2つの独立したレイヤーで動作します。
レイヤー1 — このサーバーの保護
すべてのルート(/healthとOAuthエンドポイントを除く)には以下が必要です:
Authorization: Bearer <ODATA_MCP_TOKEN>.envでODATA_MCP_TOKENを設定してください。設定されていない場合、起動時にランダムなUUIDが生成され標準出力に表示されます。
レイヤー2 — Priority ERPの呼び出し
PRIORITY_AUTH_TYPEによって制御されます:
basic—PRIORITY_USERNAME+PRIORITY_PASSWORDを使用したHTTP Basic認証pat—PRIORITY_PATによるBearerトークンoauth2—patと同じ(PATをBearerトークンとして渡す)none— 認証ヘッダーなし(ローカルテストのみ)
書き込み操作(POST/PATCH/DELETE)は、PriorityのCSRF保護パターンに従い、最初のリクエストが拒否された場合にX-CSRF-Tokenヘッダーを自動的に取得して再試行します。
PRIORITY_APP_IDとPRIORITY_APP_KEYが設定されている場合、オプションのアプリケーションライセンスヘッダー(X-App-Id / X-App-Key)がすべてのPriorityリクエストとともに送信されます。
設定
.env.exampleを.envにコピーしてください。サーバーは.envを次の順序で検索します: ENV_FILE_PATH → ./mcp-servers/Priority-REST-API-MCP-Server/.env → ./.env。
必須
変数 | 説明 |
| ODataルートURL — 形式: |
|
|
| ユーザー名 — |
| パスワード — |
Priority認証(オプション)
変数 | 説明 |
|
|
| パーソナルアクセストークン( |
| アプリケーションライセンスID — |
| アプリケーションライセンスキー — |
|
|
HTTPサーバー
変数 | デフォルト | 説明 |
|
| バインドアドレス |
|
| リッスンポート |
|
|
|
タイムアウトとTLS
変数 | デフォルト | 説明 |
|
| Priority API呼び出しの読み取りタイムアウト(ms) |
|
| POST/PATCH/DELETE操作のタイムアウト(ms) |
|
| バッチ操作のタイムアウト(ms) |
|
| 本番環境では |
デバッグ
変数 | デフォルト | 説明 |
|
|
|
|
| 完全なOData URL、パラメータ、結果件数を出力 |
|
| すべてのPriorityリクエストに |
|
| 空/モックのAPIレスポンスでエラーをスロー — テスト時のみ無効化 |
| — |
|
ツール
19個のツールはすべてsrc/tools/で定義され、src/tools/priorityTools.jsで登録されています。
システムとメタデータ
ツール | 説明 | パラメータ |
| Priorityサービスのバージョンとレスポンスヘッダーを取得 | — |
| すべてのODataエンティティセットを一覧表示。REST対応フォームのみにフィルタリング |
|
| サンプルレコードを取得してエンティティのフィールドスキーマを取得。サブフォーム名を親+ |
|
| サーバー側メタデータキャッシュをクリアして更新。常に完全フラッシュを実行(既知の制限を参照) |
|
クエリ
ツール | 説明 | パラメータ |
| キーまたはルックアップで単一レコードを取得。オプションで |
|
| 完全なfilter/select/top/skip/orderby/expand/countサポートでODataクエリを実行。取得後に日付フィルター結果を検証 |
|
|
|
|
| オプションのフィルター付きでエンティティ全体の数値フィールドを合計。最初に |
|
作成 / 更新 / 削除
ツール | 説明 | パラメータ |
| 新しいレコードを作成。 |
|
|
|
|
|
|
|
| 依存関係チェーン付きで複数のPOST/PATCH/DELETEを1つの |
|
テキストフィールド
ツール | 説明 | パラメータ |
| レコードの |
|
|
|
|
|
|
|
添付ファイル
ツール | 説明 | パラメータ |
| レコードの添付ファイルを一覧表示 |
|
| レコードの |
|
設定とヘルプ
ツール | 説明 | パラメーター |
| 完全な運用ガイドを返します: OData 構文、サブフォームパターン、スロットル制限、日付処理ルール、既知の障害パターン、アーキテクチャ例。馴染みのないエンティティを調査する際は、最初にこれを呼び出してください。 | — |
|
|
|
プロンプトとリソース
サーバーは MCP プロンプト (再利用可能な命令テンプレート) と リソース (ライブデータエンドポイント) を登録します。
プロンプト (src/prompts/)
名前 | 目的 |
| エンティティに対する OData クエリを構築するためのガイド |
| 指定されたエンティティのサブフォーム階層を説明します |
| 作成、更新、削除の各操作をガイドします |
| 日付フィルターの重要なルール — ISO 形式、演算子の検証 |
| 文書化された 404/501/400 パターンとその回避策 |
|
|
リソース (src/resources/)
URI | 目的 |
| REST 対応の全エンティティのライブリスト ( |
| 特定のエンティティのスキーマ (テンプレート URI) |
| すぐに使用できるクエリ例のライブラリ |
| サブフォームパターンと操作のリファレンスガイド |
ツール呼び出しの例
顧客 1011 の最新の売上注文 3 件を照会します — JSON-RPC 2.0 として POST /mcp に送信されます:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "query_run",
"arguments": {
"entity": "ORDERS",
"filter": "CUSTNAME eq '1011'",
"select": ["ORDNAME", "CUSTNAME", "CURDATE", "TOTPRICE"],
"top": 3,
"orderby": "CURDATE desc"
}
}
}サーバーは次を発行します:
GET /odata/Priority/.../ORDERS?$format=json&$filter=CUSTNAME+eq+'1011'
&$select=ORDNAME,CUSTNAME,CURDATE,TOTPRICE&$top=3&$orderby=CURDATE+descレスポンス:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [{
"type": "text",
"text": "{\"value\":[{\"ORDNAME\":\"SO25000001\",\"CUSTNAME\":\"1011\",\"CURDATE\":\"2025-07-15T00:00:00+03:00\",\"TOTPRICE\":15000.0},...],\"_mcp_metadata\":{\"entity\":\"ORDERS\",\"resultCount\":2,\"filterApplied\":true}}"
}],
"isError": false
}
}日付形式: Priority は日付を UTC
Zではなく、タイムゾーンオフセット付きの ISO 8601 (例:2025-07-15T00:00:00+03:00) として返します。日付フィルターでは、ISO-Z 形式ではなくCURDATE ge 2025-01-01構文を使用してください。
デプロイ
Docker
# Build
docker build -t priority-mcp .
# Run
docker run --env-file .env -p 3000:3000 priority-mcpDockerfile は node:18-slim を使用し、npm run build を実行して esbuild で src/ → dist/ をバンドルし、その後 dist/index.js を起動します。Docker Compose のセットアップとローカル TLS 証明書ジェネレーターは deployment/local/ にあります。
本番環境チェックリスト
ODATA_MCP_TOKENを明示的に設定してください — 自動生成されたものに依存しないでくださいTLS_REJECT_UNAUTHORIZED=trueを設定してくださいSTRICT_DATA_INTEGRITY=trueを設定してください (デフォルト)LOG_LEVEL=INFOを設定してください (デフォルト — ハウスキーピングノイズを抑制します)外部に公開しない場合は、
HTTP_HOSTを特定のインターフェースに固定してください
既知の制限事項
ビルド前に知っておく価値のある Priority ERP 固有の動作。
レート制限 — ユーザーあたり毎分 100 コール
Priority Cloud は、ユーザーごとに毎分 100 API コール、最大 10 件の並列リクエスト、コールごとに 3 分のタイムアウトに制限します。可能な場合は操作をバッチ処理するようにエージェントを設計してください。
レスポンス上限 — MAXFORMLINES
Priority は $top に関係なく、MAXFORMLINES システム定数の値でレスポンスを黙って切り詰めます。すべてのレコードが必要な場合は、$skip ベースのページネーションを使用してください。
サブフォームはスタンドアロンのエンティティではない
PORDERITEMS_SUBFORM を直接クエリすると HTTP 404 が返ります。サブフォームには、$expand=PORDERITEMS_SUBFORM を使用して親エンティティ経由でアクセスする必要があります。metadata_schema_get はこれを自動検出してリダイレクトします。
$apply=aggregate はサポートされていない
この Priority バージョンでは $apply=aggregate(...) がサポートされていないため、query_sum は常に完全なページングスキャンにフォールバックします。
GET /ENTITY/$count は 500 を返す
代わりに ?$top=0&$count=true を使用してください。内部的には、tryEstimateCount() は最初に /$count を試し、その後 500 レコード単位のバッチでページングします (上限 10,000)。
一部のフィールドでは contains()/startswith() がサポートされていない
EPROG.ENAME と EREP.ENAME は eq 完全一致のみをサポートしています — 文字列関数は HTTP 501 を返します。
エンティティレベルのメタデータ更新は 400 を返す
Priority がエンティティスコープのキャッシュクリアリクエストを拒否するため、metadata_refresh は entity 引数を無視して常に完全なキャッシュフラッシュを実行します。
バッチ URL エンコーディング
batch_operations リクエスト内の URL は自動エンコードされません。スペースと特殊文字は手動でパーセントエンコードする必要があります (スペース → %20)。
複合キー
一部のエンティティは複合キーを使用します。例: FORMLIMITED: ENAME='X',TYPE='F'; AINVOICES: IVNUM='T9696',IVTYPE='A',DEBIT='D'。完全な複合キー文字列を entity_update と entity_delete に渡してください。
プロジェクト構造
/
├── src/
│ ├── index.js Entry point — creates and starts PriorityMCPServer
│ ├── server.js Express app, all routes, auth guard, OAuth 2.1 PKCE
│ ├── sseServer.js SSE connection manager
│ ├── config.js Reads all env vars, resolves .env path
│ ├── version.js SERVER_VERSION, KNOWN_ISSUES list
│ │
│ ├── priority/
│ │ └── client.js PriorityClient — axios instance, auth headers,
│ │ all API methods (runQuery, createEntity, …)
│ │
│ ├── mcp/
│ │ ├── handler.js JSON-RPC 2.0 dispatcher (SSE path)
│ │ ├── registry.js ToolRegistry — registerTool, callTool, listTools
│ │ ├── prompt-registry.js
│ │ ├── resource-registry.js
│ │ ├── priority-mcp-sdk-server.js Wires registries into McpServer (SDK path)
│ │ ├── tool-call-runner.js Executes tool, wraps result for MCP response
│ │ └── json-schema-to-zod.js JSON Schema → Zod conversion
│ │
│ ├── tools/ One file per tool + priorityTools.js (registration)
│ ├── prompts/ One file per prompt + priorityPrompts.js
│ ├── resources/ One file per resource + priorityResources.js
│ └── utils/
│ ├── data-integrity.js ensureNoMockData(), validateApiResponse()
│ ├── date-handling.js Date parsing and validation helpers
│ ├── errors.js createPriorityApiError(), FilterNotAppliedError
│ ├── filter-resolver.js OData filter string building
│ ├── expand-resolver.js $expand normalization
│ ├── entity-resolver.js Entity name / subform name resolution
│ ├── resolve-query-args.js
│ └── subform-query-resolver.js
│
├── data/
│ └── entity-relationships.json Hardcoded subform map (PORDERS, ORDERS, …)
│
├── tests/
│ ├── scripts/ Manual test scripts
│ └── results/ Saved JSON/Markdown test output
│
├── docs/ Design docs (DATA_INTEGRITY_POLICY, DATE_HANDLING_RULES, …)
├── postman/ Postman collection for manual API testing
├── deployment/local/ Docker Compose + TLS cert generator
├── build.js esbuild bundler: src/ → dist/
└── .env.example All env vars documented with descriptionsテスト
自動テストランナーはありません。テストはライブの Priority 接続を必要とする手動スクリプトです:
# Read operations
node tests/scripts/test-priority-operations.js
# Write operations (interactive — asks for confirmation)
node tests/scripts/test-write-operations.js
# Test all 19 MCP tools via the running server
node tests/scripts/test-all-mcp-tools-via-server.js
# Standalone resolver smoke tests
node test-keyresolver.js
node test-resolver.js警告: 書き込みテストは実際のレコードを作成、更新、削除します。開発会社に対してのみ実行してください。
技術スタック
ランタイム: Node.js 18、ES モジュール (
"type": "module")MCP SDK:
@modelcontextprotocol/sdk ^1.29.0HTTP サーバー:
express ^4.21.1HTTP クライアント:
axios ^1.7.7スキーマ検証:
zod ^4.3.6バンドラー:
esbuild ^0.25.0(npm run build経由)その他:
cors、dotenv、form-data、uuid、http-errors
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceA generic MCP server that dynamically converts OpenAPI-defined REST APIs into tools for LLMs like Claude. It supports multiple authentication methods and transport protocols, enabling seamless interaction with any OpenAPI-compliant API.18MIT
- FlicenseNot gradedqualityDmaintenanceA standalone MCP server that exposes API endpoints as tools for AI assistants by proxying requests to a target API defined in an OpenAPI specification. It supports various authentication methods and utilizes Server-Sent Events (SSE) to facilitate integration with clients like Claude and ChatGPT.
- AlicenseCqualityDmaintenanceAn MCP server that bridges AI agents to the eyeot ERP, exposing ~600 business actions (CRM, sales, stock, HR, finance, etc.) as MCP tools over stdio via OAuth 2.1 authentication.331MIT
- AlicenseNot gradedqualityDmaintenanceA config-driven MCP server that exposes OData and REST APIs as MCP tools, enabling AI assistants to query, manage, and monitor SAP backends through natural language.4527MIT
Related MCP Connectors
MCP server for Argo RPG Platform — connects AI assistants to campaign data via OAuth2
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
Self-hosted MCP gateway: turn any API, database or MCP server into AI connectors — no code.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/priority-mcp/priority-odata-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server