{
  "id": "736a2fcf-fa3e-4e57-9a07-a38475e3b29f",
  "slug": "ref/khub/common-gp-상담사-p1-ma-dashboard-결합-설계서-v1-0",
  "doc_type": "ref",
  "title": "📋 [GP 상담사 P1] MA Dashboard 결합 설계서 v1.0",
  "title_en": null,
  "one_liner": "# 📋 [GP 상담사 P1] MA Dashboard 결합 설계서 v1.0 > 작성: 2026-04-25 | 담당: 유승욱(구현), 이철승(설계) > 부모 문서: `1dd8eaa3` (BizPO × BizData MCP 연동 방안 v1.0) > 관련: `b62bb46b` (PKG-MA",
  "summary_bullets": [],
  "body_md": "# 📋 [GP 상담사 P1] MA Dashboard 결합 설계서 v1.0\n\n> 작성: 2026-04-25 | 담당: 유승욱(구현), 이철승(설계)\n> 부모 문서: `1dd8eaa3` (BizPO × BizData MCP 연동 방안 v1.0)\n> 관련: `b62bb46b` (PKG-MA), `1d5fa484` (CXM 캠페인 엔진 레퍼런스)\n> Asana: https://app.asana.com/1/259440093468323/project/1200220022474171/task/1214054113222918\n\n---\n\n## 1. 개요 — P1의 위치\n\nGP 상담사를 **조회/응답**에서 **업무자동화** 방향으로 발전시키는 3단계 로드맵 중 첫 단계.\n\n| Phase | 범위 | 위험 | 인프라 변경 |\n|:---:|---|:---:|:---:|\n| **P1 (본 문서, 2주)** | Read 확장: MA Dashboard + CRM 조회 | 🟢 낮음 | **없음 (Resolver 확장만)** |\n| P2 (3주, 별도 설계) | Action MCP 신설 + 리포트 자동 발송 | 🟡 중간 | Action MCP 신규 |\n| P3 (4주+, 별도 G0) | 캠페인 트리거·세그먼트 생성 | 🔴 높음 | GP MA Action API 신규 |\n\n**P1 범위 한정 (G1 컨펌)**:\n- 대상: **내부 직원/PM 한정** (외부 고객 노출 없음)\n- 행위: **조회·요약만** (발송·트리거·DML 일체 없음)\n- 인프라: 기존 BizData MCP의 read 도구 4개를 추가 호출\n\n---\n\n## 2. 추가 Intent 분기 (3개)\n\n기존 5개 → 8개로 확장. v1.0의 분기 테이블 패턴 그대로.\n\n| intent_type | 호출 MCP | Tool | 필요 슬롯 |\n|---|---|---|---|\n| (기존) SOLUTION_INQUIRY | BizPO | search_solutions | - |\n| (기존) SOLUTION_COMPARE | BizPO | compare_solutions | compareTargets[] |\n| (기존) DATA_INQUIRY | BizData | data_get_unified_kpi | clientCode, dateFrom, dateTo |\n| (기존) GEO_INQUIRY | BizData | data_get_geo_som | siteDomain |\n| **🆕 MA_DASHBOARD** | BizData | data_get_ma_dashboard | - (전체) |\n| **🆕 DASHBOARD_GENERAL** | BizData | data_get_dashboard | clientCode, dateFrom, dateTo |\n| **🆕 CRM_INQUIRY** | BizData | data_get_crm_sales / data_get_crm_products | days |\n| (기존) GENERAL | RAG | - | - |\n\n---\n\n## 3. 추가 슬롯 (2개)\n\n```json\n{\n  \"days\":          \"최근 N일 (default 30, CRM 조회용)\",\n  \"dashboardType\": \"ma | general | crm_sales | crm_products\"\n}\n```\n\n기존 v1.0 슬롯(`clientCode`, `siteDomain`, `compareTargets`)은 그대로 사용.\n\n---\n\n## 4. 수정 파일 (v1.0 패턴 동일 — 3곳)\n\n### 4.1 `McpContextResolver.java` (기존 파일 확장)\nv1.0의 switch에 case 3개만 추가:\n\n```java\ncase \"MA_DASHBOARD\":\n    return callBizData(\"data_get_ma_dashboard\", Map.of());\ncase \"DASHBOARD_GENERAL\":\n    return callBizData(\"data_get_dashboard\", Map.of(\n        \"client_code\", slots.get(\"clientCode\"),\n        \"date_from\",   slots.get(\"dateFrom\"),\n        \"date_to\",     slots.get(\"dateTo\")\n    ));\ncase \"CRM_INQUIRY\":\n    String tool = \"crm_products\".equals(slots.get(\"dashboardType\"))\n        ? \"data_get_crm_products\" : \"data_get_crm_sales\";\n    return callBizData(tool, Map.of(\"days\", slots.getOrDefault(\"days\", 30)));\n```\n\n### 4.2 `ConversationServiceImpl.java`\nv1.0에서 추가한 1줄 그대로. 변경 없음.\n\n### 4.3 COUNSEL/INTENT 프롬프트\nintent_type 분류 목록에 3개 추가:\n```\nSOLUTION_INQUIRY / SOLUTION_COMPARE / DATA_INQUIRY / GEO_INQUIRY\n/ MA_DASHBOARD / DASHBOARD_GENERAL / CRM_INQUIRY / GENERAL\n```\n\n### 4.4 COUNSEL/ANSWER 프롬프트\nv1.0의 `{{mcpContext}}` 변수 그대로 사용. 변경 없음.\n\n---\n\n## 5. 호출 페이로드 예시\n\n```http\nPOST https://ihzttwgqahhzlrqozleh.supabase.co/functions/v1/bizspring-data-mcp\nContent-Type: application/json\n\n{\"method\": \"data_get_ma_dashboard\", \"params\": {}}\n```\n\n응답: 캠페인 현황 / 추천 엔진 / 채널 분포 (JSON, ~5KB).\n\n---\n\n## 6. 테스트 케이스 (5건)\n\n| # | 사용자 발화 | 예상 intent_type | 검증 포인트 |\n|:---:|---|---|---|\n| 1 | \"실란트로 MA 캠페인 현황 알려줘\" | MA_DASHBOARD | 전체 dashboard 반환 |\n| 2 | \"캘러웨이 지난 7일 ROAS는?\" | DASHBOARD_GENERAL | clientCode 슬롯 추출 |\n| 3 | \"Cafe24 인기상품 Top 10\" | CRM_INQUIRY (products) | dashboardType=crm_products |\n| 4 | \"최근 30일 매출 보여줘\" | CRM_INQUIRY (sales) | days=30 default |\n| 5 | \"회사 솔루션 뭐 있어?\" | SOLUTION_INQUIRY (기존) | 기존 분기 무영향 회귀 |\n\n**MCP 실패 시**: McpContextResolver가 빈 문자열 반환 → 2차 LLM은 RAG만으로 답변 (v1.0 fallback 동일).\n\n---\n\n## 7. 일정 (2주, 10영업일)\n\n| Week | Day | 작업 | 담당 |\n|:---:|:---:|---|:---:|\n| 1 | D1-2 | INTENT 프롬프트 분류 추가 + 단위 테스트 | 유승욱 |\n| 1 | D3-4 | Resolver case 3개 추가 + HTTP POST 단위 테스트 | 유승욱 |\n| 1 | D5 | 슬롯 추출 검증 (`days`, `dashboardType`) | 유승욱 |\n| 2 | D6-7 | 통합 테스트 (5케이스) + 회귀 (기존 5 intent) | 유승욱 |\n| 2 | D8 | 내부 PM 사용자 베타 (탁원정/구자훈/이철승) | 유승욱 |\n| 2 | D9 | G2 검증 리포트 작성 + KHub 등록 | 이철승 |\n| 2 | D10 | G3 (찰스) → P1 클로즈 + P2 G0 진입 | 찰스 |\n\n---\n\n## 8. 리스크 & 대응\n\n| 리스크 | 영향 | 대응 |\n|---|:---:|---|\n| INTENT LLM이 신규 3개 intent 오분류 | 🟡 | 프롬프트에 발화 예시 3건/intent 명시 |\n| `clientCode` 슬롯 추출 실패 → 다른 고객 데이터 노출 | 🔴 | clientCode 미추출 시 **명시적 재질문 강제**, default 금지 |\n| BizData MCP 응답 5KB 초과 → 컨텍스트 폭발 | 🟡 | Resolver에서 핵심 필드만 추출 후 주입 |\n| 기존 5 intent 회귀 버그 | 🟡 | D6-7 회귀 테스트 필수 |\n\n---\n\n## 9. G2 검증 기준\n\n- [ ] 신규 3 intent 분류 정확도 ≥ 90% (테스트 케이스 50건 기준)\n- [ ] 기존 5 intent 회귀 0건\n- [ ] clientCode 미추출 시 재질문 동작 확인\n- [ ] MCP 호출 실패 → RAG fallback 정상\n- [ ] 평균 응답 시간 v1.0 대비 +500ms 이내\n\n---\n\n## 10. P1 → P2 전환 트리거\n\nP1 G3 통과 후 P2(Action MCP 신설) G0 진입. P2는 다음 3가지 선결 과제 해결 후 시작:\n1. 권한 매트릭스 정의 (client_code 격리, 세션 스코프)\n2. Idempotency Key + Dry-run 모드 명세\n3. AP-25 컨펌 게이트 UX 설계 (상담사 UI에서 어떻게 컨펌 받을지)\n\n---\n\n## 변경 이력\n| 버전 | 날짜 | 변경 |\n|:---:|:---:|---|\n| v1.0 | 2026-04-25 | 최초 작성. P1 범위 확정 (Read 확장, 내부 한정, 발송 없음) |\n",
  "related_slugs": [],
  "faq": [],
  "jsonld": null,
  "keywords": [],
  "source_id": "06a7167c-a6c4-446a-afb8-30d944509b95",
  "video_url": null,
  "duration_sec": null,
  "thumbnail_url": null,
  "image_url": null,
  "caption": null,
  "solution_slug": null,
  "captured_at": null,
  "width": null,
  "height": null,
  "created_at": "2026-08-24T11:53:45.186331+00:00",
  "updated_at": "2026-08-24T11:53:45.186331+00:00",
  "visibility": "public",
  "source_stage": "1",
  "anonymized": true,
  "source_key": "legacy-khub",
  "origin": "ingest",
  "locked": false,
  "locked_by": null,
  "locked_at": null,
  "gate_state": {
    "g1": {
      "hits": [],
      "pass": true
    },
    "g2": {
      "pass": true,
      "total": 49,
      "issues": [
        "핵심 요약 불릿이 3개 미만입니다",
        "Q&A 쌍이 3개 미만입니다"
      ],
      "applies": true
    },
    "g3": {
      "pass": true,
      "required": false
    },
    "stage": "1",
    "decided_at": "2026-08-24T11:53:44.334Z"
  },
  "raw_id": "962a63b2-85ea-45aa-875e-d91ae6702803",
  "search_text": "📋 [GP 상담사 P1] MA Dashboard 결합 설계서 v1.0  # 📋 [GP 상담사 P1] MA Dashboard 결합 설계서 v1.0 > 작성: 2026-04-25 | 담당: 유승욱(구현), 이철승(설계) > 부모 문서: `1dd8eaa3` (BizPO × BizData MCP 연동 방안 v1.0) > 관련: `b62bb46b` (PKG-MA  # 📋 [GP 상담사 P1] MA Dashboard 결합 설계서 v1.0\n\n> 작성: 2026-04-25 | 담당: 유승욱(구현), 이철승(설계)\n> 부모 문서: `1dd8eaa3` (BizPO × BizData MCP 연동 방안 v1.0)\n> 관련: `b62bb46b` (PKG-MA), `1d5fa484` (CXM 캠페인 엔진 레퍼런스)\n> Asana: https://app.asana.com/1/259440093468323/project/1200220022474171/task/1214054113222918\n\n---\n\n## 1. 개요 — P1의 위치\n\nGP 상담사를 **조회/응답**에서 **업무자동화** 방향으로 발전시키는 3단계 로드맵 중 첫 단계.\n\n| Phase | 범위 | 위험 | 인프라 변경 |\n|:---:|---|:---:|:---:|\n| **P1 (본 문서, 2주)** | Read 확장: MA Dashboard + CRM 조회 | 🟢 낮음 | **없음 (Resolver 확장만)** |\n| P2 (3주, 별도 설계) | Action MCP 신설 + 리포트 자동 발송 | 🟡 중간 | Action MCP 신규 |\n| P3 (4주+, 별도 G0) | 캠페인 트리거·세그먼트 생성 | 🔴 높음 | GP MA Action API 신규 |\n\n**P1 범위 한정 (G1 컨펌)**:\n- 대상: **내부 직원/PM 한정** (외부 고객 노출 없음)\n- 행위: **조회·요약만** (발송·트리거·DML 일체 없음)\n- 인프라: 기존 BizData MCP의 read 도구 4개를 추가 호출\n\n---\n\n## 2. 추가 Intent 분기 (3개)\n\n기존 5개 → 8개로 확장. v1.0의 분기 테이블 패턴 그대로.\n\n| intent_type | 호출 MCP | Tool | 필요 슬롯 |\n|---|---|---|---|\n| (기존) SOLUTION_INQUIRY | BizPO | search_solutions | - |\n| (기존) SOLUTION_COMPARE | BizPO | compare_solutions | compareTargets[] |\n| (기존) DATA_INQUIRY | BizData | data_get_unified_kpi | clientCode, dateFrom, dateTo |\n| (기존) GEO_INQUIRY | BizData | data_get_geo_som | siteDomain |\n| **🆕 MA_DASHBOARD** | BizData | data_get_ma_dashboard | - (전체) |\n| **🆕 DASHBOARD_GENERAL** | BizData | data_get_dashboard | clientCode, dateFrom, dateTo |\n| **🆕 CRM_INQUIRY** | BizData | data_get_crm_sales / data_get_crm_products | days |\n| (기존) GENERAL | RAG | - | - |\n\n---\n\n## 3. 추가 슬롯 (2개)\n\n```json\n{\n  \"days\":          \"최근 N일 (default 30, CRM 조회용)\",\n  \"dashboardType\": \"ma | general | crm_sales | crm_products\"\n}\n```\n\n기존 v1.0 슬롯(`clientCode`, `siteDomain`, `compareTargets`)은 그대로 사용.\n\n---\n\n## 4. 수정 파일 (v1.0 패턴 동일 — 3곳)\n\n### 4.1 `McpContextResolver.java` (기존 파일 확장)\nv1.0의 switch에 case 3개만 추가:\n\n```java\ncase \"MA_DASHBOARD\":\n    return callBizData(\"data_get_ma_dashboard\", Map.of());\ncase \"DASHBOARD_GENERAL\":\n    return callBizData(\"data_get_dashboard\", Map.of(\n        \"client_code\", slots.get(\"clientCode\"),\n        \"date_from\",   slots.get(\"dateFrom\"),\n        \"date_to\",     slots.get(\"dateTo\")\n    ));\ncase \"CRM_INQUIRY\":\n    String tool = \"crm_products\".equals(slots.get(\"dashboardType\"))\n        ? \"data_get_crm_products\" : \"data_get_crm_sales\";\n    return callBizData(tool, Map.of(\"days\", slots.getOrDefault(\"days\", 30)));\n```\n\n### 4.2 `ConversationServiceImpl.java`\nv1.0에서 추가한 1줄 그대로. 변경 없음.\n\n### 4.3 COUNSEL/INTENT 프롬프트\nintent_type 분류 목록에 3개 추가:\n```\nSOLUTION_INQUIRY / SOLUTION_COMPARE / DATA_INQUIRY / GEO_INQUIRY\n/ MA_DASHBOARD / DASHBOARD_GENERAL / CRM_INQUIRY / GENERAL\n```\n\n### 4.4 COUNSEL/ANSWER 프롬프트\nv1.0의 `{{mcpContext}}` 변수 그대로 사용. 변경 없음.\n\n---\n\n## 5. 호출 페이로드 예시\n\n```http\nPOST https://ihzttwgqahhzlrqozleh.supabase.co/functions/v1/bizspring-data-mcp\nContent-Type: application/json\n\n{\"method\": \"data_get_ma_dashboard\", \"params\": {}}\n```\n\n응답: 캠페인 현황 / 추천 엔진 / 채널 분포 (JSON, ~5KB).\n\n---\n\n## 6. 테스트 케이스 (5건)\n\n| # | 사용자 발화 | 예상 intent_type | 검증 포인트 |\n|:---:|---|---|---|\n| 1 | \"실란트로 MA 캠페인 현황 알려줘\" | MA_DASHBOARD | 전체 dashboard 반환 |\n| 2 | \"캘러웨이 지난 7일 ROAS는?\" | DASHBOARD_GENERAL | clientCode 슬롯 추출 |\n| 3 | \"Cafe24 인기상품 Top 10\" | CRM_INQUIRY (products) | dashboardType=crm_products |\n| 4 | \"최근 30일 매출 보여줘\" | CRM_INQUIRY (sales) | days=30 default |\n| 5 | \"회사 솔루션 뭐 있어?\" | SOLUTION_INQUIRY (기존) | 기존 분기 무영향 회귀 |\n\n**MCP 실패 시**: McpContextResolver가 빈 문자열 반환 → 2차 LLM은 RAG만으로 답변 (v1.0 fallback 동일).\n\n---\n\n## 7. 일정 (2주, 10영업일)\n\n| Week | Day | 작업 | 담당 |\n|:---:|:---:|---|:---:|\n| 1 | D1-2 | INTENT 프롬프트 분류 추가 + 단위 테스트 | 유승욱 |\n| 1 | D3-4 | Resolver case 3개 추가 + HTTP POST 단위 테스트 | 유승욱 |\n| 1 | D5 | 슬롯 추출 검증 (`days`, `dashboardType`) | 유승욱 |\n| 2 | D6-7 | 통합 테스트 (5케이스) + 회귀 (기존 5 intent) | 유승욱 |\n| 2 | D8 | 내부 PM 사용자 베타 (탁원정/구자훈/이철승) | 유승욱 |\n| 2 | D9 | G2 검증 리포트 작성 + KHub 등록 | 이철승 |\n| 2 | D10 | G3 (찰스) → P1 클로즈 + P2 G0 진입 | 찰스 |\n\n---\n\n## 8. 리스크 & 대응\n\n| 리스크 | 영향 | 대응 |\n|---|:---:|---|\n| INTENT LLM이 신규 3개 intent 오분류 | 🟡 | 프롬프트에 발화 예시 3건/intent 명시 |\n| `clientCode` 슬롯 추출 실패 → 다른 고객 데이터 노출 | 🔴 | clientCode 미추출 시 **명시적 재질문 강제**, default 금지 |\n| BizData MCP 응답 5KB 초과 → 컨텍스트 폭발 | 🟡 | Resolver에서 핵심 필드만 추출 후 주입 |\n| 기존 5 intent 회귀 버그 | 🟡 | D6-7 회귀 테스트 필수 |\n\n---\n\n## 9. G2 검증 기준\n\n- [ ] 신규 3 intent 분류 정확도 ≥ 90% (테스트 케이스 50건 기준)\n- [ ] 기존 5 intent 회귀 0건\n- [ ] clientCode 미추출 시 재질문 동작 확인\n- [ ] MCP 호출 실패 → RAG fallback 정상\n- [ ] 평균 응답 시간 v1.0 대비 +500ms 이내\n\n---\n\n## 10. P1 → P2 전환 트리거\n\nP1 G3 통과 후 P2(Action MCP 신설) G0 진입. P2는 다음 3가지 선결 과제 해결 후 시작:\n1. 권한 매트릭스 정의 (client_code 격리, 세션 스코프)\n2. Idempotency Key + Dry-run 모드 명세\n3. AP-25 컨펌 게이트 UX 설계 (상담사 UI에서 어떻게 컨펌 받을지)\n\n---\n\n## 변경 이력\n| 버전 | 날짜 | 변경 |\n|:---:|:---:|---|\n| v1.0 | 2026-04-25 | 최초 작성. P1 범위 확정 (Read 확장, 내부 한정, 발송 없음) |\n",
  "embedding": null,
  "embedded_at": null,
  "embedding_hash": null,
  "backlinks": [],
  "html_url": "https://bizspring.ai/kb/ref/khub/common-gp-상담사-p1-ma-dashboard-결합-설계서-v1-0",
  "markdown_url": "https://bizspring.ai/kb/ref/khub/common-gp-상담사-p1-ma-dashboard-결합-설계서-v1-0.md"
}