Skip to main content
Glama
logispot_mcp.py7.67 kB
# from typing import Any # import httpx # from mcp.server.fastmcp import FastMCP # from dotenv import load_dotenv # import os # # # 전역 변수 # auth_token = None # # LARAVEL_API_BASE = "https://api.test-spot.com/api/v1" # # # MCP 서버 인스턴스 # mcp = FastMCP("logispot_mcp") # # # Laravel API 경로 매핑 # def get_api_map(): # return { # "token_authentication": f"{LARAVEL_API_BASE}/authentication/token", # "get_order_list": f"{LARAVEL_API_BASE}/orders/get" # } # # # 공통 API 호출 함수 # async def call_laravel(func_name: str, payload: dict, use_auth: bool = False): # url = get_api_map().get(func_name) # if not url: # return {"error": "API 경로를 찾을 수 없습니다."} # # headers = {} # if use_auth and auth_token: # headers["Authorization"] = f"Bearer {auth_token}" # # async with httpx.AsyncClient(timeout=10.0) as client: # try: # res = await client.post(url, json=payload, headers=headers) # res.raise_for_status() # return res.json() # except httpx.HTTPStatusError as e: # # 개발 로그용 # print(f"[Laravel 오류] status={e.response.status_code}, body={e.response.text}") # return {"error": "스케줄 조회 중 문제가 발생했습니다. 관리자에게 문의해주세요."} # except Exception as e: # print(f"[네트워크 오류] {str(e)}") # return {"error": "서버와의 연결에 실패했습니다."} # # # # ✅ 9. 토큰 인증 (로그인) # @mcp.tool() # async def token_authentication(id: str, password: str, user_type: int): # """ # 사용자 로그인 후 토큰은 내부에 저장되며, 외부로는 노출되지 않습니다. # """ # global auth_token # response = await call_laravel("token_authentication", { # "id": id, # "password": password, # "user_type": user_type # }) # # token = None # try: # token = response.get("token") # except Exception: # pass # # if token: # auth_token = token # print("✅ 로그인 성공. 토큰 저장됨.") # return {"message": "로그인 성공"} # else: # print("❌ 로그인 실패:", response) # return {"error": "로그인 실패"} # # # ✅ 10. 오더 목록 조회 (파라미터 상세 지정) # @mcp.tool() # async def get_order_list( # reference_date: str, # is_driver_management: bool, # start_date: str, # end_date: str, # page: int = 1, # max_result: int = 20, # version2: bool = True # ): # """ # 오더 목록을 조회합니다. 날짜 기준, 운전기사 관리 여부, 페이지 정보 등을 설정할 수 있습니다. # """ # global auth_token # if not auth_token: # return "❌ 인증 토큰이 없습니다. 먼저 로그인하세요." # # payload = { # "reference_date": reference_date, # "is_driver_management": is_driver_management, # "start_date": start_date, # "end_date": end_date, # "page": page, # "max_result": max_result, # "version2": version2 # } # # response = await call_laravel("get_order_list", payload, use_auth=True) # # if "error" in response: # return f"❌ 오류: {response['error']}" # # orders = response.get("orders", []) # pagination = response.get("pagination", {}) # stats = response.get("stat", []) # # message_lines = [ # f"{start_date}부터 {end_date}까지의 주문 목록을 조회한 결과입니다:", # "📋 **주문 요약**", # f"\n총 주문 건수: {pagination.get('total', 0)}건", # f"페이지: {pagination.get('current_page', 1)}/{pagination.get('last_page', 1)} (총 {len(orders)}건)\n" # ] # # for order in orders: # message_lines.append("🚛 **주문 상세 정보**") # message_lines.append(f"주문 #{order['order_id']}") # message_lines.append("") # message_lines.append(f"주문 ID: {order['order_id']} (내부 ID: {order['id']})") # message_lines.append(f"주문 생성일: {order['order_created_at']}") # message_lines.append(f"주문 상태: {order.get('order_status_text', '알 수 없음')}") # message_lines.append("") # message_lines.append("👥 **관련자 정보**") # message_lines.append(f"고객사: {order.get('client_name', '-')}") # message_lines.append(f"주문자: {order.get('user_client_name', '-')}" # f" ({order.get('user_client_phone_number', '-')})") # message_lines.append(f"운전기사: {order.get('user_driver_name', '-')}" # f" ({order.get('user_driver_phone_number', '-')})") # message_lines.append(f"차량: {order.get('user_driver_number_plate', '-')} ({order.get('car_ton', '-') + '톤 트럭'})") # message_lines.append(f"커스텀 코드: {order.get('custom_code', '-')}") # message_lines.append("") # message_lines.append("📦 **화물 정보**") # message_lines.append(f"화물명: {order.get('freight_name', '-')}") # message_lines.append("무게/크기: 미지정") # 필요한 경우 상세 필드 추가 # message_lines.append("") # message_lines.append("🗺️ **운송 정보**") # message_lines.append(f"상차일시: {order.get('load_date')} ({order.get('load_time', '-')})") # message_lines.append(f"상차지: {order.get('load_company_name')} ({order.get('load_address')})") # message_lines.append(f"하차일시: {order.get('unload_date')} ({order.get('unload_time', '-')})") # message_lines.append(f"하차지: {order.get('unload_company_name')} ({order.get('unload_address')})") # message_lines.append("") # message_lines.append("💰 **운임 정보**") # fee = order.get('order_pay_order_fee') or order.get('order_pay_contract_fee') or 0 # message_lines.append(f"계약 운임: {int(fee)}원") # message_lines.append(f"결제 방법: {'선불' if order.get('order_pay_method') == 1 else '기타'}") # message_lines.append(f"부가세율: {order.get('pays', [{}])[0].get('vat', 0)}%") # message_lines.append("") # # # 통계 요약 # if stats: # message_lines.append("📊 **통계 요약**\n") # for stat in stats: # message_lines.append(f"{stat.get('order_status', '-')} 상태: {stat.get('cnt', 0)}건 " # f"(계약운임 {stat.get('contract_fee', '0')}원)") # message_lines.append("") # # return "\n".join(message_lines).strip() # # if __name__ == "__main__": # # Initialize and run the server # mcp.run(transport="sse") # import os # # api_base = os.getenv("LARAVEL_API_BASE") # # if not api_base: # raise RuntimeError("LARAVEL_API_BASE 환경변수가 설정되지 않았습니다!") # # LARAVEL_API_BASE = api_base # # .env 파일 불러오기 # load_dotenv() # # # 환경 구분 # env = os.getenv("APP_ENV", "local") # # # 환경에 따라 API 주소 선택 # if env == "test": # api_base = os.getenv("LARAVEL_TEST_API_BASE") # elif env == "prod": # api_base = os.getenv("LARAVEL_PROD_API_BASE") # else: # api_base = os.getenv("LARAVEL_LOCAL_API_BASE") # # # 예외 처리: 환경변수가 빠졌을 때 명확하게 알림 # if not api_base: # raise RuntimeError("API 주소가 설정되지 않았습니다! .env 파일을 확인해주세요.") # # # 전역적으로 사용할 API Base URL # LARAVEL_API_BASE = api_base

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/ilil1/fastapi_mcp_sse'

If you have feedback or need assistance with the MCP directory API, please join our Discord server