diff --git a/docs/superpowers/plans/2026-10-21-compact-mcp.md b/docs/superpowers/plans/2026-10-21-compact-mcp.md index 8f095741..8e80dfb1 100644 --- a/docs/superpowers/plans/2026-10-21-compact-mcp.md +++ b/docs/superpowers/plans/2026-10-21-compact-mcp.md @@ -1,6 +1,6 @@ # 공개 MCP 도구 10개 구현 계획 -> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [x]`) syntax for tracking. **Goal:** 기본 MCP 도구를 10개로 고정하고 구형 호출을 보존한다. **Architecture:** 명시적 작업 매핑과 기존 Zod 입력/핸들러를 재사용하는 어댑터. SDK 등록은 모두 유지하고 목록 응답만 고정 공개 계약으로 제공한다. @@ -23,5 +23,5 @@ ### 4. 검증과 반영 - [x] `npm run check`, `npm run test:coverage`, `npm run build`를 실행해 전체 성공/네 지표100%를 확인한다. SDK 실제통신과 invalid 조합 회귀는 단순 모킹과 별도로 유지한다. -- [ ] 독립 리뷰 후 검증된 변경을 논리적으로 커밋/푸시하고 PR을 생성·첨부한다. GitHub CI/Coverage/CodeQL 통과 후 병합한다. -- [ ] 운영 / 및 /mcp tools/list10개, 새/구형 상품·매장·재고 호출과 CLI 유지 검증 후 PROJECT.md에 근거와 남은 문제를 쓴다. PlayMCP 콘솔 등록목록은 별도 갱신이 필요함을 구분한다. +- [x] 독립 리뷰 후 검증된 변경을 논리적으로 커밋/푸시하고 PR을 생성·첨부한다. GitHub CI/Coverage/CodeQL 통과 후 병합한다. +- [x] 운영 / 및 /mcp tools/list10개, 새/구형 상품·매장·재고 호출과 CLI 유지 검증 후 PROJECT.md에 근거와 남은 문제를 쓴다. PlayMCP 콘솔 등록목록은 별도 갱신이 필요함을 구분한다. diff --git a/src/services/gs25/tools/checkInventory.ts b/src/services/gs25/tools/checkInventory.ts index a14dabc3..6c1f311f 100644 --- a/src/services/gs25/tools/checkInventory.ts +++ b/src/services/gs25/tools/checkInventory.ts @@ -102,6 +102,17 @@ async function checkInventory(args: CheckInventoryArgs): Promise { }); }); + +it('MCP는 매장 카탈로그로 좌표를 못 찾으면 지역 검색으로 무료 좌표를 보완한다',async()=>{ + mocks.stores.mockResolvedValueOnce({stores:[],totalCount:0,cacheHit:false}); + mocks.geocode.mockResolvedValueOnce({latitude:37.4979,longitude:127.0276}); + const result=await createCheckInventoryTool().handler({keyword:'콜라',itemCode:'ITEM',storeKeyword:'강남'}); + expect(mocks.geocode).toHaveBeenCalledWith('강남',expect.any(Object)); + expect(mocks.stores.mock.calls[1][0]).toMatchObject({itemCode:'ITEM',latitude:37.4979,longitude:127.0276}); + expect(JSON.parse(result.content[0].text)).toMatchObject({geocodeUsed:true}); +}); +it('MCP는 후보 주소 변환이 실패해도 지역 검색이 실패하면 기존 미확인 오류를 유지한다',async()=>{ + await expect(createCheckInventoryTool().handler({keyword:'콜라',itemCode:'ITEM',storeKeyword:'부산'})).rejects.toMatchObject({code:'GS25_LOCATION_UNRESOLVED'}); + expect(mocks.geocode.mock.calls.map(call=>call[0])).toEqual(['부산 중구 중앙대로 1','부산']); + expect(mocks.stores).toHaveBeenCalledTimes(1); +});