# 📋 [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

> 작성: 2026-04-25 | 담당: 유승욱(구현), 이철승(설계)
> 부모 문서: `1dd8eaa3` (BizPO × BizData MCP 연동 방안 v1.0)
> 관련: `b62bb46b` (PKG-MA), `1d5fa484` (CXM 캠페인 엔진 레퍼런스)
> Asana: https://app.asana.com/1/259440093468323/project/1200220022474171/task/1214054113222918

---

## 1. 개요 — P1의 위치

GP 상담사를 **조회/응답**에서 **업무자동화** 방향으로 발전시키는 3단계 로드맵 중 첫 단계.

| Phase | 범위 | 위험 | 인프라 변경 |
|:---:|---|:---:|:---:|
| **P1 (본 문서, 2주)** | Read 확장: MA Dashboard + CRM 조회 | 🟢 낮음 | **없음 (Resolver 확장만)** |
| P2 (3주, 별도 설계) | Action MCP 신설 + 리포트 자동 발송 | 🟡 중간 | Action MCP 신규 |
| P3 (4주+, 별도 G0) | 캠페인 트리거·세그먼트 생성 | 🔴 높음 | GP MA Action API 신규 |

**P1 범위 한정 (G1 컨펌)**:
- 대상: **내부 직원/PM 한정** (외부 고객 노출 없음)
- 행위: **조회·요약만** (발송·트리거·DML 일체 없음)
- 인프라: 기존 BizData MCP의 read 도구 4개를 추가 호출

---

## 2. 추가 Intent 분기 (3개)

기존 5개 → 8개로 확장. v1.0의 분기 테이블 패턴 그대로.

| intent_type | 호출 MCP | Tool | 필요 슬롯 |
|---|---|---|---|
| (기존) SOLUTION_INQUIRY | BizPO | search_solutions | - |
| (기존) SOLUTION_COMPARE | BizPO | compare_solutions | compareTargets[] |
| (기존) DATA_INQUIRY | BizData | data_get_unified_kpi | clientCode, dateFrom, dateTo |
| (기존) GEO_INQUIRY | BizData | data_get_geo_som | siteDomain |
| **🆕 MA_DASHBOARD** | BizData | data_get_ma_dashboard | - (전체) |
| **🆕 DASHBOARD_GENERAL** | BizData | data_get_dashboard | clientCode, dateFrom, dateTo |
| **🆕 CRM_INQUIRY** | BizData | data_get_crm_sales / data_get_crm_products | days |
| (기존) GENERAL | RAG | - | - |

---

## 3. 추가 슬롯 (2개)

```json
{
  "days":          "최근 N일 (default 30, CRM 조회용)",
  "dashboardType": "ma | general | crm_sales | crm_products"
}
```

기존 v1.0 슬롯(`clientCode`, `siteDomain`, `compareTargets`)은 그대로 사용.

---

## 4. 수정 파일 (v1.0 패턴 동일 — 3곳)

### 4.1 `McpContextResolver.java` (기존 파일 확장)
v1.0의 switch에 case 3개만 추가:

```java
case "MA_DASHBOARD":
    return callBizData("data_get_ma_dashboard", Map.of());
case "DASHBOARD_GENERAL":
    return callBizData("data_get_dashboard", Map.of(
        "client_code", slots.get("clientCode"),
        "date_from",   slots.get("dateFrom"),
        "date_to",     slots.get("dateTo")
    ));
case "CRM_INQUIRY":
    String tool = "crm_products".equals(slots.get("dashboardType"))
        ? "data_get_crm_products" : "data_get_crm_sales";
    return callBizData(tool, Map.of("days", slots.getOrDefault("days", 30)));
```

### 4.2 `ConversationServiceImpl.java`
v1.0에서 추가한 1줄 그대로. 변경 없음.

### 4.3 COUNSEL/INTENT 프롬프트
intent_type 분류 목록에 3개 추가:
```
SOLUTION_INQUIRY / SOLUTION_COMPARE / DATA_INQUIRY / GEO_INQUIRY
/ MA_DASHBOARD / DASHBOARD_GENERAL / CRM_INQUIRY / GENERAL
```

### 4.4 COUNSEL/ANSWER 프롬프트
v1.0의 `{{mcpContext}}` 변수 그대로 사용. 변경 없음.

---

## 5. 호출 페이로드 예시

```http
POST https://ihzttwgqahhzlrqozleh.supabase.co/functions/v1/bizspring-data-mcp
Content-Type: application/json

{"method": "data_get_ma_dashboard", "params": {}}
```

응답: 캠페인 현황 / 추천 엔진 / 채널 분포 (JSON, ~5KB).

---

## 6. 테스트 케이스 (5건)

| # | 사용자 발화 | 예상 intent_type | 검증 포인트 |
|:---:|---|---|---|
| 1 | "실란트로 MA 캠페인 현황 알려줘" | MA_DASHBOARD | 전체 dashboard 반환 |
| 2 | "캘러웨이 지난 7일 ROAS는?" | DASHBOARD_GENERAL | clientCode 슬롯 추출 |
| 3 | "Cafe24 인기상품 Top 10" | CRM_INQUIRY (products) | dashboardType=crm_products |
| 4 | "최근 30일 매출 보여줘" | CRM_INQUIRY (sales) | days=30 default |
| 5 | "회사 솔루션 뭐 있어?" | SOLUTION_INQUIRY (기존) | 기존 분기 무영향 회귀 |

**MCP 실패 시**: McpContextResolver가 빈 문자열 반환 → 2차 LLM은 RAG만으로 답변 (v1.0 fallback 동일).

---

## 7. 일정 (2주, 10영업일)

| Week | Day | 작업 | 담당 |
|:---:|:---:|---|:---:|
| 1 | D1-2 | INTENT 프롬프트 분류 추가 + 단위 테스트 | 유승욱 |
| 1 | D3-4 | Resolver case 3개 추가 + HTTP POST 단위 테스트 | 유승욱 |
| 1 | D5 | 슬롯 추출 검증 (`days`, `dashboardType`) | 유승욱 |
| 2 | D6-7 | 통합 테스트 (5케이스) + 회귀 (기존 5 intent) | 유승욱 |
| 2 | D8 | 내부 PM 사용자 베타 (탁원정/구자훈/이철승) | 유승욱 |
| 2 | D9 | G2 검증 리포트 작성 + KHub 등록 | 이철승 |
| 2 | D10 | G3 (찰스) → P1 클로즈 + P2 G0 진입 | 찰스 |

---

## 8. 리스크 & 대응

| 리스크 | 영향 | 대응 |
|---|:---:|---|
| INTENT LLM이 신규 3개 intent 오분류 | 🟡 | 프롬프트에 발화 예시 3건/intent 명시 |
| `clientCode` 슬롯 추출 실패 → 다른 고객 데이터 노출 | 🔴 | clientCode 미추출 시 **명시적 재질문 강제**, default 금지 |
| BizData MCP 응답 5KB 초과 → 컨텍스트 폭발 | 🟡 | Resolver에서 핵심 필드만 추출 후 주입 |
| 기존 5 intent 회귀 버그 | 🟡 | D6-7 회귀 테스트 필수 |

---

## 9. G2 검증 기준

- [ ] 신규 3 intent 분류 정확도 ≥ 90% (테스트 케이스 50건 기준)
- [ ] 기존 5 intent 회귀 0건
- [ ] clientCode 미추출 시 재질문 동작 확인
- [ ] MCP 호출 실패 → RAG fallback 정상
- [ ] 평균 응답 시간 v1.0 대비 +500ms 이내

---

## 10. P1 → P2 전환 트리거

P1 G3 통과 후 P2(Action MCP 신설) G0 진입. P2는 다음 3가지 선결 과제 해결 후 시작:
1. 권한 매트릭스 정의 (client_code 격리, 세션 스코프)
2. Idempotency Key + Dry-run 모드 명세
3. AP-25 컨펌 게이트 UX 설계 (상담사 UI에서 어떻게 컨펌 받을지)

---

## 변경 이력
| 버전 | 날짜 | 변경 |
|:---:|:---:|---|
| v1.0 | 2026-04-25 | 최초 작성. P1 범위 확정 (Read 확장, 내부 한정, 발송 없음) |


## FAQ


---
출처: https://bizspring.ai/kb/ref/khub/common-gp-상담사-p1-ma-dashboard-결합-설계서-v1-0 · 최종 갱신 2026-08-24T11:53:45.186331+00:00
