Skip to main content
Glama
crashzero9
by crashzero9

OHMS - 주문 허브 관리 시스템 (Order Hub Management System)

Flauraly Flowers and Plants - Replit Reserved VM에서 호스팅되는 Python FastMCP 서버.

목적

OHMS는 주문 및 재고 관련 도구의 작고 강화된 세트를 Model Context Protocol을 통해 Violet(및 기타 승인된 MCP 클라이언트)에 노출합니다. 이 시스템은 Shopify Admin REST 액세스를 Bearer 인증 게이트 뒤에 중앙 집중화하여 에이전트가 원시 Shopify 자격 증명에 직접 접근하지 못하도록 합니다.

아키텍처

+-----------------+      Bearer       +------------------------------+
|  MCP Client     |  ---------------> |  OHMS (Replit Reserved VM)   |
|  (Violet, etc.) |   /mcp or /sse    |                              |
+-----------------+                   |  Starlette parent app        |
                                      |  +-- /health (open)          |
                                      |  +-- /mcp   (Streamable HTTP)|
                                      |  +-- /sse   (SSE fallback)   |
                                      |  +-- BearerAuthMiddleware    |
                                      +--------------+---------------+
                                                     |
                                                     v
                                      +------------------------------+
                                      |  Shopify Admin REST API      |
                                      +------------------------------+

/mcp(Streamable HTTP)와 /sse(Server-Sent Events 폴백)가 동시에 마운트되어 모든 MCP 클라이언트 전송 프로필이 작동합니다.

환경 변수

OHMS는 OAuth 2.0 client_credentials 권한 부여를 통해 Shopify에 인증합니다. 서버는 장기 지속되는 SHOPIFY_ACCESS_TOKEN을 보유하지 않으며, 대신 SHOPIFY_CLIENT_ID + SHOPIFY_CLIENT_SECRET 쌍을 보유하고 https://{shop}.myshopify.com/admin/oauth/access_token에 요청하여 단기 액세스 토큰을 즉시 생성합니다. 생성된 토큰은 5분 클록 스큐 버퍼와 함께 메모리에 캐시되며, 자동으로(또는 이후 호출에서 401/403 오류 발생 시) 재생성됩니다. 모든 값은 os.environ.get(...)을 통해 읽어오며, 하드코딩된 값은 없습니다.

변수

목적

PORT

바인딩할 TCP 포트 (Replit이 이를 주입하며, 기본값은 8080입니다).

OHMS_API_TOKEN

/health를 제외한 모든 요청에 필요한 정적 Bearer 토큰 (클라이언트와 OHMS 간 인증 - Shopify와는 별개).

SHOPIFY_STORE_URL

상점 도메인 (예: flauraly.myshopify.com).

SHOPIFY_CLIENT_ID

Shopify 앱 클라이언트 ID (OAuth client_credentials 권한 부여에 사용).

SHOPIFY_CLIENT_SECRET

Shopify 앱 클라이언트 시크릿 (OAuth client_credentials 권한 부여에 사용). Secrets_Registry.md 일정에 따라 교체하십시오.

SHOPIFY_API_VERSION

고정된 Shopify API 버전 (예: 2025-01).

PRINTER_IP

영수증 프린터의 로컬 네트워크 IP (스텁에서 사용).

플레이스홀더 템플릿은 .env.example을 참조하십시오.

로컬 개발 (Windows)

OHMS는 로컬에서 실행될 때만( python-dotenv를 통해) .env를 읽습니다. 비밀 정보를 일반 텍스트로 입력하는 대신 Windows DPAPI 보호 비밀 저장소에서 .env를 부트스트랩하십시오:

# 1. Pull each secret from DPAPI into the local .env (PowerShell pseudocode)
$secrets = @("OHMS_API_TOKEN","SHOPIFY_STORE_URL","SHOPIFY_CLIENT_ID","SHOPIFY_CLIENT_SECRET","SHOPIFY_API_VERSION","PRINTER_IP")
foreach ($k in $secrets) {
    $v = Unprotect-DpapiSecret -Name $k    # your local helper
    Add-Content .env "$k=$v"
}

# 2. Run the server
python -m venv .venv
.venv\Scripts\Activate.ps1
pip install -r requirements.txt
python main.py

서버는 기본적으로 http://0.0.0.0:8080에서 수신 대기합니다. 다음으로 테스트하십시오:

curl http://localhost:8080/health
# => OHMS OK

Replit 배포

  1. Replit 프로젝트를 생성하고 이 폴더를 가져옵니다.

  2. Secrets 창에서 .env.example의 모든 변수를 설정합니다 (실제 값을 사용하며, 커밋된 파일에 붙여넣지 마십시오).

  3. .replit 파일에 deploymentTarget = "reserved_vm" 및 포트 8080 -> 80이 설정되어 있는지 확인합니다.

  4. 배포합니다. 공개 URL은 https://ohms-server.crashzero9.replit.app입니다.

  5. 두 전송 방식을 모두 확인합니다:

curl https://ohms-server.crashzero9.replit.app/health
curl -H "Authorization: Bearer $OHMS_API_TOKEN" \
     -H "Content-Type: application/json" \
     -d '{"jsonrpc":"2.0","method":"tools/list","id":1}' \
     https://ohms-server.crashzero9.replit.app/mcp

도구 레지스트리

도구

소스

참고

get_order(order_id)

Shopify Admin REST

GET /orders/{id}.json

list_pending_orders()

Shopify Admin REST

GET /orders.json?status=open&limit=50

update_order_status(order_id, status)

Shopify Admin REST

PUT /orders/{id}.json (태그 설정)

get_inventory_snapshot()

Shopify Admin REST

GET /inventory_levels.json?limit=50

get_doordash_orders_via_browser()

스텁

브라우저 자동화 핸드오프를 위한 라우팅 딕셔너리 반환.

print_order_ticket(order_id)

스텁

PRINTER_IP를 읽고 대기 상태를 반환. 드라이버 대기 중.

단계 상태

  • 1단계 (현재): MVP 스캐폴드, Bearer 인증, 6개 도구(4개 라이브 + 2개 스텁), Replit Reserved VM 배포, 기본 pytest 스위트.

  • 2단계 (계획): 정적 Bearer를 대체하는 OAuth 2.1, 전체 DoorDash 드라이버, 실제 네트워크 프린터 드라이버, 비밀 정보가 마스킹된 구조화된 로깅, 속도 제한.

보안 참고 사항

  • 커밋된 파일에는 비밀 값이 나타나지 않습니다.

  • Authorization 헤더와 전체 Shopify 응답 본문은 기록되지 않습니다.

  • /health는 버전, 환경, 경로 정보 없이 문자열 OHMS OK만 반환합니다.

  • 모든 httpx 호출에는 30초의 명시적 타임아웃이 설정되어 있습니다.

Related MCP Connectors