# ๐ง ๊ธฐ๋ฅ ์๊ตฌ์ฌํญ - WorkflowMCP Dashboard API
## ๐ฏ ๊ฐ์
WorkflowMCP ๋์๋ณด๋์ ๋ชจ๋ ๊ธฐ๋ฅ์ REST API๋ก ์ ๊ณตํ์ฌ MCP ๋๊ตฌ์ ์น ๋์๋ณด๋ ๊ธฐ๋ฅ์ ํตํฉ์ ์ผ๋ก ์ ๊ทผํ ์ ์๋๋ก ํฉ๋๋ค.
## ๐ 1. PRD ๊ด๋ฆฌ API
### 1.1 PRD CRUD ๊ธฐ๋ฅ
#### FR-PRD-001: PRD ๋ชฉ๋ก ์กฐํ
- **์๋ํฌ์ธํธ**: `GET /api/prds`
- **๊ธฐ๋ฅ**: ๋ฑ๋ก๋ ๋ชจ๋ PRD ๋ชฉ๋ก์ ์กฐํ
- **ํ๋ผ๋ฏธํฐ**:
- `status` (์ ํ): ์ํ๋ณ ํํฐ๋ง
- `project_id` (์ ํ): ํ๋ก์ ํธ๋ณ ํํฐ๋ง
- `sort` (์ ํ): ์ ๋ ฌ ๊ธฐ์ค (created_desc, updated_desc ๋ฑ)
- **์๋ต**: PRD ๋ชฉ๋ก๊ณผ ์ด ๊ฐ์
#### FR-PRD-002: PRD ์์ฑ
- **์๋ํฌ์ธํธ**: `POST /api/prds`
- **๊ธฐ๋ฅ**: ์๋ก์ด PRD ๋ฌธ์ ์์ฑ
- **์
๋ ฅ**: title, description, requirements, acceptance_criteria, priority, status
- **๊ฒ์ฆ**: ํ์ ํ๋ ํ์ธ, ์ค๋ณต ์ ๋ชฉ ๊ฒ์ฌ
- **์๋ต**: ์์ฑ๋ PRD ์ ๋ณด
#### FR-PRD-003: PRD ์์ธ ์กฐํ
- **์๋ํฌ์ธํธ**: `GET /api/prds/{id}`
- **๊ธฐ๋ฅ**: ํน์ PRD์ ์์ธ ์ ๋ณด ์กฐํ
- **ํฌํจ**: ์ฐ๊ฒฐ๋ ๋ฌธ์, ์์
, ํ๋ก์ ํธ ์ ๋ณด
- **์๋ต**: PRD ์ ์ฒด ๋ฐ์ดํฐ
#### FR-PRD-004: PRD ์
๋ฐ์ดํธ
- **์๋ํฌ์ธํธ**: `PUT /api/prds/{id}`
- **๊ธฐ๋ฅ**: ๊ธฐ์กด PRD ์ ๋ณด ์์
- **๋ถ๋ถ ์
๋ฐ์ดํธ**: PATCH ๋ฐฉ์์ผ๋ก ์ผ๋ถ ํ๋๋ง ์์ ๊ฐ๋ฅ
- **๋ฒ์ ๊ด๋ฆฌ**: ์์ ์ updated_at ์๋ ๊ฐฑ์
#### FR-PRD-005: PRD ์ญ์
- **์๋ํฌ์ธํธ**: `DELETE /api/prds/{id}`
- **๊ธฐ๋ฅ**: PRD ์ญ์ (์ฐ๊ฒฐ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ)
- **์์ ์ฅ์น**: ์ฐ๊ฒฐ๋ ์์
์ด ์์ผ๋ฉด ์ญ์ ๋ถ๊ฐ
- **์ํํธ ์ญ์ **: ์ค์ ์ญ์ ๋์ ์ํ ๋ณ๊ฒฝ ์ต์
### 1.2 PRD ๋ฌธ์ ์ฐ๊ฒฐ ๊ธฐ๋ฅ
#### FR-PRD-006: PRD ๋ฌธ์ ์ฐ๊ฒฐ
- **์๋ํฌ์ธํธ**: `POST /api/prds/{id}/documents`
- **๊ธฐ๋ฅ**: PRD์ ๋ฌธ์ ์ฐ๊ฒฐ
- **์ฐ๊ฒฐ ํ์
**: specification, analysis, notes ๋ฑ
#### FR-PRD-007: PRD ์ฐ๊ฒฐ ๋ฌธ์ ์กฐํ
- **์๋ํฌ์ธํธ**: `GET /api/prds/{id}/documents`
- **๊ธฐ๋ฅ**: PRD์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ๋ฌธ์ ์กฐํ
- **ํํฐ๋ง**: ๋ฌธ์ ํ์
๋ณ ํํฐ๋ง ๊ฐ๋ฅ
## ๐ 2. Task ๊ด๋ฆฌ API
### 2.1 Task CRUD ๊ธฐ๋ฅ
#### FR-TASK-001: Task ๋ชฉ๋ก ์กฐํ
- **์๋ํฌ์ธํธ**: `GET /api/tasks`
- **๊ธฐ๋ฅ**: ์์
๋ชฉ๋ก ์กฐํ
- **ํ๋ผ๋ฏธํฐ**: status, priority, assignee, project_id
- **์ ๋ ฌ**: ์์ฑ์ผ, ์ฐ์ ์์, ๋ง๊ฐ์ผ ๋ฑ
- **ํ์ด์ง**: limit, offset ์ง์
#### FR-TASK-002: Task ์์ฑ
- **์๋ํฌ์ธํธ**: `POST /api/tasks`
- **๊ธฐ๋ฅ**: ์ ์์
์์ฑ
- **์
๋ ฅ**: title, description, priority, assignee, due_date
- **์๋ ID**: ๊ณ ์ ID ์๋ ์์ฑ
#### FR-TASK-003: Task ์์ธ ์กฐํ
- **์๋ํฌ์ธํธ**: `GET /api/tasks/{id}`
- **๊ธฐ๋ฅ**: ์์
์์ธ ์ ๋ณด
- **ํฌํจ**: ์์กด์ฑ, ์ฐ๊ฒฐ๋ ๋ฌธ์, ํ
์คํธ ์ผ์ด์ค
#### FR-TASK-004: Task ์
๋ฐ์ดํธ
- **์๋ํฌ์ธํธ**: `PUT /api/tasks/{id}`
- **๊ธฐ๋ฅ**: ์์
์ ๋ณด ์์
- **์ํ ๋ณ๊ฒฝ**: pending โ in_progress โ done
- **์งํ๋ฅ **: estimated_hours, actual_hours ์ถ์
#### FR-TASK-005: Task ์ญ์
- **์๋ํฌ์ธํธ**: `DELETE /api/tasks/{id}`
- **๊ธฐ๋ฅ**: ์์
์ญ์
- **์์กด์ฑ ํ์ธ**: ๋ค๋ฅธ ์์
์ด ์์กดํ๋ ๊ฒฝ์ฐ ์ญ์ ๋ถ๊ฐ
### 2.2 Task ์์กด์ฑ ๊ด๋ฆฌ
#### FR-TASK-006: ์์กด์ฑ ์ถ๊ฐ
- **์๋ํฌ์ธํธ**: `POST /api/tasks/{id}/dependencies`
- **๊ธฐ๋ฅ**: ์์
๊ฐ ์์กด์ฑ ์์ฑ
- **์ํ ์์กด์ฑ ๊ฒ์ฌ**: ๋ฌดํ ๋ฃจํ ๋ฐฉ์ง
#### FR-TASK-007: ์์กด์ฑ ์กฐํ
- **์๋ํฌ์ธํธ**: `GET /api/tasks/{id}/dependencies`
- **๊ธฐ๋ฅ**: ์์
์ ์์กด์ฑ ๊ทธ๋ํ ์กฐํ
- **๋ฐฉํฅ**: ์์กดํ๋ ์์
, ์์กด๋ฐ๋ ์์
๋ชจ๋ ์ ๊ณต
#### FR-TASK-008: ์์กด์ฑ ์ญ์
- **์๋ํฌ์ธํธ**: `DELETE /api/tasks/{id}/dependencies/{dep_id}`
- **๊ธฐ๋ฅ**: ํน์ ์์กด์ฑ ๊ด๊ณ ์ ๊ฑฐ
## ๐ 3. Document ๊ด๋ฆฌ API
### 3.1 Document CRUD ๊ธฐ๋ฅ
#### FR-DOC-001: Document ๋ชฉ๋ก ์กฐํ
- **์๋ํฌ์ธํธ**: `GET /api/documents`
- **๊ธฐ๋ฅ**: ๋ฌธ์ ๋ชฉ๋ก ์กฐํ
- **ํ๋ผ๋ฏธํฐ**: doc_type, category, status, tags
- **๊ฒ์**: ์ ๋ชฉ, ๋ด์ฉ ์ ๋ฌธ ๊ฒ์ ์ง์
#### FR-DOC-002: Document ์์ฑ
- **์๋ํฌ์ธํธ**: `POST /api/documents`
- **๊ธฐ๋ฅ**: ์ ๋ฌธ์ ์์ฑ
- **์
๋ ฅ**: title, content, doc_type, category, tags
- **์๋ ์ธ๋ฑ์ฑ**: FTS ๊ฒ์ ์ธ๋ฑ์ค ์๋ ์์ฑ
#### FR-DOC-003: Document ์์ธ ์กฐํ
- **์๋ํฌ์ธํธ**: `GET /api/documents/{id}`
- **๊ธฐ๋ฅ**: ๋ฌธ์ ์์ธ ์ ๋ณด
- **ํฌํจ**: ์ ์ฒด ๋ด์ฉ, ๋ฉํ๋ฐ์ดํฐ, ์ฐ๊ฒฐ ์ ๋ณด
#### FR-DOC-004: Document ์
๋ฐ์ดํธ
- **์๋ํฌ์ธํธ**: `PUT /api/documents/{id}`
- **๊ธฐ๋ฅ**: ๋ฌธ์ ์์
- **๋ฒ์ ๊ด๋ฆฌ**: ์์ ์ด๋ ฅ ์ถ์
- **์ฌ์ธ๋ฑ์ฑ**: ๋ด์ฉ ๋ณ๊ฒฝ ์ ๊ฒ์ ์ธ๋ฑ์ค ์
๋ฐ์ดํธ
#### FR-DOC-005: Document ์ญ์
- **์๋ํฌ์ธํธ**: `DELETE /api/documents/{id}`
- **๊ธฐ๋ฅ**: ๋ฌธ์ ์ญ์
- **์ฐ๊ฒฐ ํ์ธ**: ๋ค๋ฅธ ์ํฐํฐ์์ ์ฐ๊ฒฐ ๊ด๊ณ ์ ๋ฆฌ
### 3.2 Document ๊ฒ์ ๊ธฐ๋ฅ
#### FR-DOC-006: ์ ๋ฌธ ๊ฒ์
- **์๋ํฌ์ธํธ**: `GET /api/documents/search`
- **๊ธฐ๋ฅ**: ๋ฌธ์ ๋ด์ฉ ์ ๋ฌธ ๊ฒ์
- **ํ๋ผ๋ฏธํฐ**: query, doc_type, category, limit
- **ํ์ด๋ผ์ดํ
**: ๊ฒ์์ด ๊ฐ์กฐ ํ์
#### FR-DOC-007: ํ๊ทธ ๊ธฐ๋ฐ ๊ฒ์
- **์๋ํฌ์ธํธ**: `GET /api/documents/tags/{tag}`
- **๊ธฐ๋ฅ**: ํน์ ํ๊ทธ์ ๋ฌธ์ ์กฐํ
- **๊ด๋ จ ํ๊ทธ**: ํจ๊ป ์ฌ์ฉ๋๋ ํ๊ทธ ์ถ์ฒ
## ๐ 4. ์ฐ๊ฒฐ ๊ด๋ฆฌ API
### 4.1 ์ํฐํฐ ์ฐ๊ฒฐ ๊ธฐ๋ฅ
#### FR-CONN-001: ์ฐ๊ฒฐ ์์ฑ
- **์๋ํฌ์ธํธ**: `POST /api/connections`
- **๊ธฐ๋ฅ**: ์ํฐํฐ ๊ฐ ์ฐ๊ฒฐ ์์ฑ (PRD-Task, Task-Document ๋ฑ)
- **์ฐ๊ฒฐ ํ์
**: related, dependent, blocking, reference
#### FR-CONN-002: ์ฐ๊ฒฐ ์กฐํ
- **์๋ํฌ์ธํธ**: `GET /api/connections`
- **๊ธฐ๋ฅ**: ๋ชจ๋ ์ฐ๊ฒฐ ๊ด๊ณ ์กฐํ
- **ํํฐ๋ง**: ์ํฐํฐ ํ์
, ์ฐ๊ฒฐ ํ์
๋ณ ํํฐ๋ง
#### FR-CONN-003: ์ฐ๊ฒฐ ์ญ์
- **์๋ํฌ์ธํธ**: `DELETE /api/connections/{id}`
- **๊ธฐ๋ฅ**: ์ฐ๊ฒฐ ๊ด๊ณ ์ ๊ฑฐ
## ๐ 5. ๋์๋ณด๋ ๋ฐ์ดํฐ API
### 5.1 ํ๋ก์ ํธ ๋์๋ณด๋
#### FR-DASH-001: ํ๋ก์ ํธ ๊ฐ์
- **์๋ํฌ์ธํธ**: `GET /api/projects/{id}/dashboard`
- **๊ธฐ๋ฅ**: ํ๋ก์ ํธ ์ ์ฒด ๊ฐ์ ๋ฐ์ดํฐ
- **ํฌํจ**: ์งํ๋ฅ , ์์
ํํฉ, ์ต๊ทผ ํ๋
#### FR-DASH-002: ์งํ๋ฅ ํ์๋ผ์ธ
- **์๋ํฌ์ธํธ**: `GET /api/projects/{id}/timeline`
- **๊ธฐ๋ฅ**: ํ๋ก์ ํธ ์งํ๋ฅ ์๊ณ์ด ๋ฐ์ดํฐ
- **๊ธฐ๊ฐ**: ์ผ๋ณ, ์ฃผ๋ณ, ์๋ณ ์ง๊ณ
#### FR-DASH-003: ์์
ํต๊ณ
- **์๋ํฌ์ธํธ**: `GET /api/projects/{id}/task-stats`
- **๊ธฐ๋ฅ**: ์์
์ํ๋ณ ํต๊ณ
- **์ฐจํธ ๋ฐ์ดํฐ**: ํ์ด์ฐจํธ, ๋ง๋์ฐจํธ์ฉ ๋ฐ์ดํฐ
### 5.2 ์ ์ฒด ์์คํ
๋์๋ณด๋
#### FR-DASH-004: ์์คํ
๊ฐ์
- **์๋ํฌ์ธํธ**: `GET /api/dashboard/overview`
- **๊ธฐ๋ฅ**: ์ ์ฒด ์์คํ
ํํฉ
- **ํฌํจ**: ์ด PRD/Task/Document ์, ์ต๊ทผ ํ๋
#### FR-DASH-005: ํ๋ ํผ๋
- **์๋ํฌ์ธํธ**: `GET /api/dashboard/activities`
- **๊ธฐ๋ฅ**: ์ต๊ทผ ํ๋ ํผ๋
- **์ค์๊ฐ**: SSE๋ฅผ ํตํ ์ค์๊ฐ ์
๋ฐ์ดํธ
## ๐ 6. ๋ฐฐ์น ์์
API
### 6.1 ์ผ๊ด ์ฒ๋ฆฌ ๊ธฐ๋ฅ
#### FR-BATCH-001: ์ผ๊ด PRD ์ฒ๋ฆฌ
- **์๋ํฌ์ธํธ**: `POST /api/batch/prds`
- **๊ธฐ๋ฅ**: ์ฌ๋ฌ PRD ์ผ๊ด ์์ฑ/์
๋ฐ์ดํธ
- **ํธ๋์ญ์
**: ์ ์ฒด ์ฑ๊ณต ๋๋ ์ ์ฒด ์คํจ
#### FR-BATCH-002: ์ผ๊ด Task ์ฒ๋ฆฌ
- **์๋ํฌ์ธํธ**: `POST /api/batch/tasks`
- **๊ธฐ๋ฅ**: ์ฌ๋ฌ ์์
์ผ๊ด ์ฒ๋ฆฌ
- **์์กด์ฑ**: ์ผ๊ด ์์กด์ฑ ์ค์ ์ง์
#### FR-BATCH-003: ์ผ๊ด Document ์ฒ๋ฆฌ
- **์๋ํฌ์ธํธ**: `POST /api/batch/documents`
- **๊ธฐ๋ฅ**: ์ฌ๋ฌ ๋ฌธ์ ์ผ๊ด ์ฒ๋ฆฌ
- **์ธ๋ฑ์ฑ**: ์ผ๊ด ๊ฒ์ ์ธ๋ฑ์ค ์
๋ฐ์ดํธ
## ๐ 7. ์ค์๊ฐ ์
๋ฐ์ดํธ API
### 7.1 Server-Sent Events
#### FR-SSE-001: ์ค์๊ฐ ์ด๋ฒคํธ ์คํธ๋ฆผ
- **์๋ํฌ์ธํธ**: `GET /api/events/stream`
- **๊ธฐ๋ฅ**: ์ค์๊ฐ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์๋ฆผ
- **์ด๋ฒคํธ ํ์
**: create, update, delete
#### FR-SSE-002: ์ด๋ฒคํธ ํํฐ๋ง
- **ํ๋ผ๋ฏธํฐ**: entity_type, project_id
- **๊ธฐ๋ฅ**: ํน์ ์ํฐํฐ๋ ํ๋ก์ ํธ์ ์ด๋ฒคํธ๋ง ์์
## โก 8. ์ฑ๋ฅ ์ต์ ํ ๊ธฐ๋ฅ
### 8.1 ์บ์ฑ
#### FR-CACHE-001: ์๋ต ์บ์ฑ
- **๋์**: ์์ฃผ ์กฐํ๋๋ ๋ฐ์ดํฐ (๋ชฉ๋ก, ํต๊ณ)
- **๋ฌดํจํ**: ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ ์๋ ์บ์ ๋ฌดํจํ
#### FR-CACHE-002: ์ฟผ๋ฆฌ ์ต์ ํ
- **๊ธฐ๋ฅ**: ๋ณต์กํ ์กฐ์ธ ์ฟผ๋ฆฌ ์ต์ ํ
- **์ธ๋ฑ์ฑ**: ์์ฃผ ์ฌ์ฉ๋๋ ๊ฒ์ ์กฐ๊ฑด ์ธ๋ฑ์ฑ
### 8.2 ํ์ด์ง๋ค์ด์
#### FR-PAGE-001: ์ปค์ ๊ธฐ๋ฐ ํ์ด์ง
- **๋ชจ๋ ๋ชฉ๋ก API**: cursor, limit ํ๋ผ๋ฏธํฐ ์ง์
- **์ฑ๋ฅ**: ๋์ฉ๋ ๋ฐ์ดํฐ์์๋ ์ผ์ ํ ์ฑ๋ฅ
## ๐ 9. ๊ฒ์ ๋ฐ ํํฐ๋ง
### 9.1 ๊ณ ๊ธ ๊ฒ์
#### FR-SEARCH-001: ๋ณตํฉ ๊ฒ์
- **๊ธฐ๋ฅ**: ์ฌ๋ฌ ์กฐ๊ฑด์ ์กฐํฉํ ๊ฒ์
- **์ฐ์ฐ์**: AND, OR, NOT ์ง์
#### FR-SEARCH-002: ์ ๋ ฌ ์ต์
- **๋ค์ค ์ ๋ ฌ**: ์ฌ๋ฌ ํ๋ ์กฐํฉ ์ ๋ ฌ
- **์ฌ์ฉ์ ์ ์**: ์ฌ์ฉ์ ์ ์ ์ ๋ ฌ ๊ธฐ์ค ์ ์ฅ
## ๐ 10. ๋ฐ์ดํฐ ๊ฒ์ฆ ๋ฐ ๋ฌด๊ฒฐ์ฑ
### 10.1 ์
๋ ฅ ๊ฒ์ฆ
#### FR-VALID-001: ์คํค๋ง ๊ฒ์ฆ
- **๋ชจ๋ ์
๋ ฅ**: JSON ์คํค๋ง ๊ธฐ๋ฐ ๊ฒ์ฆ
- **ํ์
๊ฒ์ฌ**: ๋ฐ์ดํฐ ํ์
๋ฐ ํ์ ๊ฒ์ฆ
#### FR-VALID-002: ๋น์ฆ๋์ค ๊ท์น ๊ฒ์ฆ
- **์์กด์ฑ**: ์ํ ์์กด์ฑ ๋ฐฉ์ง
- **์ํ ์ ์ด**: ์ ํจํ ์ํ ๋ณ๊ฒฝ๋ง ํ์ฉ
### 10.2 ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ
#### FR-INTEG-001: ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ
- **์ธ๋ํค**: ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฌ
- **์นด์ค์ผ์ด๋**: ์ฐ๊ฒฐ๋ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ ์ ์ง
---
**์์ฑ์ผ**: 2025-09-11
**์์ฑ์**: ์๊ตฌ์ฌํญ ๋ถ์๊ฐ (Claude Code)
**๊ฒํ ์**: ์์คํ
์ค๊ณ์
**๋ฒ์ **: 1.0
**์ํ**: ์์ธ ์ค๊ณ ๋๊ธฐ