Claude Cowork 에 설치해 과거 제안서를 DB 에 쌓고, 새 RFP/과업지시서/공고가 오면 유사 사례를 찾아 오오티비랩(OOTB Lab) 브랜드 포맷의 제안서 초안 PPT 를 자동으로 만들어 주는 플러그인.
┌──────────────────────────────────────────────────────────────────┐
│ Claude Cowork (Mac) │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Plugin: ootb-proposal-automation (GitHub 마켓플레이스) │ │
│ │ ├─ dashboard ⭐ 메인 진입점 │ │
│ │ ├─ proposal-supabase-sync PDF 등록·검색 │ │
│ │ └─ rfp-to-proposal-pipeline RFP → outline.yaml → .pptx │ │
│ │ (.pptx는 anthropic-skills:pptx) │ │
│ └─────────────┬──────────────────────────┬─────────────────┘ │
│ │ │ │
│ Supabase MCP 로컬 Python │
│ (SQL 실행, 메타데이터) (PDF 텍스트 추출) │
└────────────────┼───────────────────────────┼──────────────────────┘
│ │
│ │ HTTP POST (PDF 바이너리)
▼ ▼
┌──────────────────────────────────────────────────────────────────┐
│ Supabase │
│ ┌──────────────┐ ┌──────────────────────────────────────────┐ │
│ │ Postgres │ │ Edge Functions │ │
│ │ proposals │ │ • upload-binary (~50MB PDF) │ │
│ │ (pgvector) │ │ • embed (GEMINI_API_KEY env) │ │
│ └──────┬───────┘ │ • sign-url (SERVICE_ROLE_KEY env) │ │
│ │ └──────┬───────────────────────────────────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────────┐ │
│ │ Storage │ ← upload-binary 이 Storage에 직접 PUT │
│ │ proposals/ │ │
│ └──────────────┘ │
│ │
│ Gemini API ◀── embed Edge Function — GEMINI_API_KEY env로 호출 │
└──────────────────────────────────────────────────────────────────┘
PDF 파일
→ prep.py (텍스트 추출)
→ Edge Function upload-binary (HTTP POST 바이너리) → Storage
→ Claude (구조화 추출: 제목·태그·요약)
→ MCP execute_sql + gemini_embed_vault() → Postgres (메타+벡터)
질의문 → MCP execute_sql:
match_proposals(query_text, gemini_embed_vault(query_text))
→ top-N 유사 제안서
RFP PDF
→ prep_rfp.py (텍스트만)
→ Claude (RFP 구조화)
→ match_proposals_with_url() (유사 사례 top-3 + signed URL)
→ Claude (outline.yaml 합성)
→ render_deck.js (pptxgenjs) → .pptx
| 스킬 | 역할 |
|---|---|
dashboard |
⭐ 메인 진입점. 채팅 안 마크다운 카드 + AskUserQuestion 으로 대화형 메뉴 |
proposal-supabase-sync |
과거 제안서 PDF 를 Supabase DB + Storage 에 수집, 하이브리드 검색 |
rfp-to-proposal-pipeline |
RFP → 유사 사례 top-3 → outline.yaml → .pptx (렌더링은 anthropic-skills:pptx 위임, OOTB brand reference 포함) |
Edge Function 환경변수 등록 (Supabase Dashboard → Project Settings → Functions → Secrets):
GEMINI_API_KEY— Gemini 임베딩용 (Google AI Studio 발급)SERVICE_ROLE_KEY— Storage signed URL 생성용 (Project Settings → API →service_role키)
스키마 + 함수 적용 (apply_migration 으로 순서대로):
sql/001_init.sql—proposals테이블 +match_proposalsRPCsql/002_embed_in_db.sql—http확장sql/003_vault_helpers.sql—match_proposals_with_url등 (006이 일부 함수 overwrite)sql/006_edge_secrets.sql—gemini_embed_vault/sign_storage_url(Edge Function 호출 방식). proj_url + anon_key를 자기 프로젝트에 맞게 수정 후 적용.
Edge Functions 배포 (3개):
edge-functions/upload-binary/— PDF 바이너리 업로드 (~50MB)edge-functions/embed/— Gemini 임베딩 (GEMINI_API_KEY 사용)edge-functions/sign-url/— Storage signed URL (SERVICE_ROLE_KEY 사용)
- Cowork → 설정 → Connectors → Supabase MCP 연결
- 마켓플레이스 추가:
https://github.com/hellogpc/ootb-proposal-plugin - 플러그인 설치:
ootb-proposal-automation - Python 의존성:
pip install -r skills/proposal-supabase-sync/scripts/requirements.txt pip install -r skills/rfp-to-proposal-pipeline/scripts/requirements.txt # PPT 렌더링은 anthropic-skills:pptx 가 Cowork 내장 의존성 처리
✅ 로컬
.env불필요 — 모든 시크릿은 Supabase Edge Function 환경변수에 보관됨
Cowork 채팅창에서 한 마디:
| 상황 | 명령 |
|---|---|
| 메뉴 열기 | "대시보드 보여줘" |
| 새 PDF 등록 | "이 PDF 등록해줘" + 파일 첨부 |
| 과거 사례 검색 | "복지 관련 제안서 찾아줘" |
| 제안서 초안 생성 | "이 RFP로 제안서 만들어줘" + 파일 첨부 |
| 등록 현황 | "DB에 몇 건 있지?" |
대시보드가 상태 카드(Edge Functions / Function Secrets / DB 연결 / 등록 건수)를 표시한 후, 메뉴 선택으로 진행합니다.
ootb-proposal-plugin/
├── .claude-plugin/
│ ├── plugin.json # 플러그인 매니페스트
│ └── marketplace.json # 마켓플레이스 항목
└── skills/
├── dashboard/ ⭐ 메인 진입점 (대화형 메뉴)
├── proposal-supabase-sync/ PDF 등록·검색
│ ├── scripts/prep.py 텍스트 추출 + HTTP 업로드
│ ├── sql/ 001~004 마이그레이션
│ └── edge-functions/ upload-binary, upload-b64
└── rfp-to-proposal-pipeline/ RFP → outline 합성 + .pptx 렌더
(.pptx는 anthropic-skills:pptx + references/brand_*)
| 원칙 | 구현 |
|---|---|
| 시크릿은 서버에만 | Gemini·service role 키 모두 Supabase Edge Function Secrets. 로컬·git에 평문 키 없음 |
| MCP가 메인 채널 | Claude ↔ DB 통신은 모두 execute_sql |
| 바이너리는 HTTP로 | PDF는 Edge Function 직접 POST (~50MB). MCP의 3.4MB 한계 우회 |
| 임베딩은 DB-side | gemini_embed_vault(text) 한 줄. 로컬 Gemini 호출 없음 |
| Plugin은 read-only | git 마켓플레이스 → Cowork 자동 동기화. GitHub이 진실의 원천 |
- Supabase — Postgres + pgvector + Storage + Edge Functions (MCP)
- Google Gemini — Embedding (1536-d). API 키는 Edge Function Secrets
- pptxgenjs — 플러그인 내
npm install - LibreOffice + poppler (선택) — QA 용
- 0.7.0 —
ootb-proposal-pptx스킬 제거. PPT 렌더링은anthropic-skills:pptx에 위임. brand_tokens.json + brand_design.md 가 rfp-to-proposal-pipeline/references/ 로 이전. 스킬 4개 → 3개. - 0.6.1 — render_deck.js 버그 수정. brand.json 키 이름 불일치로 검은 화면 렌더링되던 문제 해결. v1 alias 키(navy_deep / blue / white / blue_light 등) + sizes_pt fallback 복원. hex() / sz() 함수에 명시적 경고 로그 추가 (누락 키 즉시 식별).
- 0.6.0 — PPT 스킬을 Brandlogy 디자인 시스템 (MiniMax-inspired) 으로 리디자인. 7-슬라이드 타입 → 5-zone locked skeleton + 6 body patterns (A: KPI Strip, B: Two-Column, C: Diagram-Centered, D: Process Flow, E: Quote+Evidence, F: Stacked Insight). White-dominant canvas + Pretendard-only + Hero Gradient accent + Visualization-First rule.
- 0.5.5 — Vault 관련 가이드 잔재 정리. SKILL.md/README 전반에서
vault.create_secret안내 제거하고 "Project Settings → Functions → Secrets" 가이드로 통일. - 0.5.4 — Vault 의존성 제거. 시크릿을 Edge Function 환경변수(
GEMINI_API_KEY,SERVICE_ROLE_KEY)로 관리. 신규 Edge Functionembed/sign-url+ SQL 마이그레이션006_edge_secrets.sql. SQLgemini_embed_vault/sign_storage_url은 이제 Edge Function을 호출. - 0.5.3 — Storage 업로드를 Edge Function
upload-binary직접 HTTP 방식으로 전환 (~50 MB 지원). MCPexecute_sql의 ~3.4 MB payload 한계 우회. - 0.5.2 —
configure-env/web-ui스킬 제거, deprecated 스크립트 정리. 로컬.env완전 불필요. - 0.5.1 —
.plugin번들·GitHub Action 제거 (마켓플레이스 설치는 repo 직접 참조). - 0.5.0 — Env-free 운영 전환. Vault + Edge Function
upload-b64+gemini_embed_vault(). - 0.4.0 —
web-ui스킬 추가 (이후 0.5.2에서 제거). - 0.3.x —
configure-envTUI / 사용자 config 위치 (이후 0.5.2에서 제거). - 0.2.0 —
configure-env스킬 추가 (이후 0.5.2에서 제거). - 0.1.0 — 초기 릴리스
내부 자산 (Proprietary).