Skip to main content
Glama
priority-mcp

Priority REST API MCP Server

by priority-mcp

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 install

2. 예시에서 .env 생성

cp .env.example .env

최소한 다음 네 가지 변수를 설정하세요:

PRIORITY_BASE_URL=https://<host>/odata/Priority/<tabula.ini>/<company>/
PRIORITY_AUTH_TYPE=basic
PRIORITY_USERNAME=myuser
PRIORITY_PASSWORD=mypassword

3. 서버 시작

# Development (from source)
node src/index.js

# Production (bundled)
npm run build
node dist/index.js

첫 실행 시 ODATA_MCP_TOKEN이 설정되지 않은 경우 임의의 Bearer 토큰이 생성되어 stdout에 출력됩니다. 다음 단계를 위해 복사하세요.

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 요청은 완전히 무상태(stateless)입니다. 요청마다 새 McpServerStreamableHTTPServerTransport가 생성된 후 정리됩니다.

엔드포인트

메서드

용도

/mcp

POST

기본 MCP 엔드포인트(Streamable HTTP)

/sse

GET

SSE 스트림 — SSE_ENABLED=true 필요

/sse

POST

SSE 클라이언트용 JSON-RPC 메시지

/health

GET

상태 확인 — 버전 및 상태 반환

/.well-known/oauth-authorization-server

GET

OAuth 2.1 검색(Claude Code ≥2.1.92에 필요)

/authorize, /token, /register

GET/POST

OAuth 2.1 PKCE 흐름 — 자동 승인

참고: OAuth 2.1 엔드포인트는 Claude Code의 Streamable HTTP 연결 핸드셰이크를 충족하기 위해 존재합니다. 모든 요청을 자동 승인하며 실제 액세스 제어를 위한 것이 아닙니다. 액세스 제어는 ODATA_MCP_TOKEN이 담당합니다.


인증

인증은 두 개의 독립적인 계층에서 작동합니다.

계층 1 — 이 서버 보호

모든 경로(/health 및 OAuth 엔드포인트 제외)에는 다음이 필요합니다:

Authorization: Bearer <ODATA_MCP_TOKEN>

.envODATA_MCP_TOKEN을 설정하세요. 없으면 시작 시 임의의 UUID가 생성되어 stdout에 출력됩니다.

계층 2 — Priority ERP 호출

PRIORITY_AUTH_TYPE으로 제어됩니다:

  • basicPRIORITY_USERNAME + PRIORITY_PASSWORD를 사용한 HTTP Basic 인증

  • patPRIORITY_PAT를 통한 Bearer 토큰

  • oauth2pat과 동일(PAT를 Bearer 토큰으로 전달)

  • none — 인증 헤더 없음(로컬 테스트 전용)

쓰기 작업(POST/PATCH/DELETE)은 초기 요청이 거부되면 Priority의 CSRF 보호 패턴에 따라 X-CSRF-Token 헤더를 자동으로 가져와 재시도합니다.

PRIORITY_APP_IDPRIORITY_APP_KEY가 설정된 경우 모든 Priority 요청에 선택적 앱별 라이선스 헤더(X-App-Id / X-App-Key)가 전송됩니다.


구성

.env.example.env로 복사하세요. 서버는 다음 순서로 .env를 검색합니다: ENV_FILE_PATH./mcp-servers/Priority-REST-API-MCP-Server/.env./.env.

필수

변수

설명

PRIORITY_BASE_URL

OData 루트 URL — 형식: https://<host>/odata/Priority/<tabula.ini>/<company>/

PRIORITY_AUTH_TYPE

basic | pat | oauth2 | none

PRIORITY_USERNAME

사용자 이름 — AUTH_TYPE=basic일 때 필수

PRIORITY_PASSWORD

비밀번호 — AUTH_TYPE=basic일 때 필수

Priority 인증(선택)

변수

설명

ODATA_MCP_TOKEN

/mcp을 보호하는 Bearer 토큰. 설정되지 않으면 임의 UUID 사용.

PRIORITY_PAT

개인 액세스 토큰(AUTH_TYPE=pat 또는 oauth2일 때)

PRIORITY_APP_ID

애플리케이션 라이선스 ID — X-App-Id 헤더로 전송

PRIORITY_APP_KEY

애플리케이션 라이선스 키 — X-App-Key 헤더로 전송

PRIORITY_LANGUAGE

Accept-Language 헤더 재정의(예: en)

HTTP 서버

변수

기본값

설명

HTTP_HOST

0.0.0.0

바인딩 주소

HTTP_PORT

3000

수신 포트

SSE_ENABLED

false

/sse 엔드포인트 활성화

시간 초과 및 TLS

변수

기본값

설명

PRIORITY_HTTP_TIMEOUT_MS

30000

Priority API 호출 읽기 시간 초과(ms)

MCP_WRITE_TIMEOUT

15000

POST/PATCH/DELETE 작업 시간 초과(ms)

MCP_PROC_TIMEOUT

45000

배치 작업 시간 초과(ms)

TLS_REJECT_UNAUTHORIZED

false

프로덕션에서 자체 서명 인증서를 거부하려면 true로 설정

디버깅

변수

기본값

설명

LOG_LEVEL

INFO

DEBUG는 모든 요청 및 응답을 로그

MCP_DEBUG

false

전체 OData URL, 매개변수, 결과 수 출력

PRIORITY_ENABLE_TRACE

false

모든 Priority 요청에 X-App-Trace: 1 추가

STRICT_DATA_INTEGRITY

true

빈/모의 API 응답에서 오류 발생 — 테스트에서만 비활성화

ENV_FILE_PATH

.env 파일 경로 재정의(서브모듈 배포에 유용)


도구

19개 도구는 모두 src/tools/에 정의되어 있으며 src/tools/priorityTools.js에 등록되어 있습니다.

시스템 및 메타데이터

도구

설명

매개변수

version_get

Priority 서비스 버전 및 응답 헤더 가져오기

metadata_entities_list

모든 OData 엔티티 세트 나열; REST 지원 양식만 필터링

apiOnly?, includeMetadata?

metadata_schema_get

샘플 레코드를 가져와 엔티티의 필드 스키마 가져오기. 하위 양식 이름을 상위 + $expand로 자동 리디렉션

entity, sample?, top?

metadata_refresh

서버 측 메타데이터 캐시를 지우고 새로 고침. 항상 전체 플러시 수행(알려진 제한 사항 참조)

entity?

쿼리

도구

설명

매개변수

entity_get

키 또는 조회로 단일 레코드 가져오기, 선택적 $expand$select 지원

entity, key, lookup, select?, expand?

query_run

전체 필터/선택/상위/건너뛰기/정렬/확장/개수 지원으로 OData 쿼리 실행. 가져온 후 날짜 필터 결과 검증

entity, filter?, select?, top?, skip?, orderby?, expand?, count?, deltaToken?

safe_query_run

query_run과 유사하지만 먼저 유효한 필드를 자동으로 발견하고 실행 전에 $select 필드 이름을 검증 — 잘못된 열 이름으로 인한 400 오류 방지

entity, filter?, select?, top?, skip?, expand?, count?

query_sum

선택적 필터로 엔티티 전체의 숫자 필드 합계. 먼저 $apply=aggregate 시도; 실패 시 전체 페이지 스캔으로 대체

entity, field?, filter?

생성 / 업데이트 / 삭제

도구

설명

매개변수

entity_create

새 레코드 생성. parentEntity + parentKey + subform을 통한 하위 양식 생성 지원

entity, data, parentEntity?, parentKey?, parentLookup?, subform?

entity_update

If-Match: *를 사용한 PATCH로 레코드 업데이트. 복합 키 지원

entity, key, data, parentEntity?, parentKey?, subform?

entity_delete

If-Match: *를 사용한 DELETE로 레코드 삭제. 하위 양식 삭제 지원

entity, key, parentEntity?, parentKey?, subform?

batch_operations

종속성 체이닝으로 하나의 $batch 요청에서 여러 POST/PATCH/DELETE 실행

requests[] (id, method, url, body?, dependsOn?)

텍스트 필드

도구

설명

매개변수

entity_text_get

레코드의 /Text 하위 리소스의 리치 텍스트 콘텐츠 가져오기

entity, key

entity_text_create

/Entity(Key)/Text에 새 텍스트 콘텐츠 POST

entity, key, textData

entity_text_update

/Entity(Key)/Text의 기존 텍스트 콘텐츠 PATCH

entity, key, textData

첨부 파일

도구

설명

매개변수

entity_attachments_get

레코드의 첨부 파일 목록

entity, key

entity_attachments_upload

파일을 레코드의 /Attachments 하위 리소스에 multipart/form-data로 업로드. fileData는 base64로 인코딩되어야 함

entity, key, fileData, fileName, contentType?

구성 및 도움말

도구

설명

매개변수

instructions_get

전체 운영 가이드를 반환합니다: OData 구문, 하위 양식 패턴, 스로틀 제한, 날짜 처리 규칙, 알려진 실패 패턴, 아키텍처 예시. 익숙하지 않은 엔티티를 탐색할 때 먼저 호출하세요.

config_restflag_update

Priority 양식에 대한 REST API 액세스를 활성화하거나 비활성화하려면 FORMLIMITED 테이블에서 RESTFLAG=Y 또는 N을 설정합니다.

formName, restFlag, formType?


프롬프트 및 리소스

서버는 MCP 프롬프트(재사용 가능한 지침 템플릿)와 리소스(실시간 데이터 엔드포인트)를 등록합니다.

프롬프트 (src/prompts/)

이름

용도

query_priority_entity

엔티티에 대한 OData 쿼리 구성을 위한 가이드

explore_entity_relationships

지정된 엔티티의 하위 양식 계층 구조를 설명합니다

modify_priority_data

생성, 업데이트, 삭제 작업을 안내합니다

date_handling_guide

날짜 필터의 중요한 규칙 — ISO 형식, 연산자 검증

known_failure_patterns

문서화된 404/501/400 패턴 및 해결 방법

pagination_guide

$top/$skip 및 개수 패턴을 설명합니다

리소스 (src/resources/)

URI

용도

priority://entities/list

REST 지원 엔티티의 실시간 목록 (RESTFLAG=Y)

priority://entity-schema/{entity}

특정 엔티티의 스키마 (템플릿 URI)

priority://queries/common

바로 사용 가능한 쿼리 예제 라이브러리

priority://subforms/reference

하위 양식 패턴 및 작업에 대한 참조 가이드


예제 도구 호출

고객 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-mcp

Dockerfile은 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.ENAMEEREP.ENAMEeq 정확히 일치만 지원합니다 — 문자열 함수는 HTTP 501을 반환합니다.

엔티티 수준 메타데이터 새로고침은 400을 반환합니다 metadata_refreshentity 인수를 무시하고 항상 전체 캐시를 플러시합니다. Priority가 엔티티 범위의 캐시 삭제 요청을 거부하기 때문입니다.

배치 URL 인코딩 batch_operations 요청 내부의 URL은 자동 인코딩되지 않습니다. 공백과 특수 문자는 수동으로 퍼센트 인코딩해야 합니다(공백 → %20).

복합 키 일부 엔티티는 복합 키를 사용합니다. 예: FORMLIMITED: ENAME='X',TYPE='F'; AINVOICES: IVNUM='T9696',IVTYPE='A',DEBIT='D'. entity_updateentity_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.0

  • HTTP 서버: express ^4.21.1

  • HTTP 클라이언트: axios ^1.7.7

  • 스키마 검증: zod ^4.3.6

  • 번들러: esbuild ^0.25.0 (npm run build 사용)

  • 기타: cors, dotenv, form-data, uuid, http-errors

A
license - permissive license
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

  • A
    license
    Not graded
    quality
    C
    maintenance
    A 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.
    18
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    A 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.
  • A
    license
    C
    quality
    D
    maintenance
    An 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.
    33
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A 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.
    45
    27
    MIT

View all related MCP servers

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.

View all MCP Connectors

Latest Blog Posts

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