블로그에 AI 기능 붙이기 (2편) - MCP 서버로 Claude 교육시키기
TL;DR
- 문제: 50개 블로그 포스팅에서 특정 주제 찾으려면 파일 탐색기 + 검색 5~10분 소요
- 원인: Claude가 내 블로그 내용을 모름, 매번 수동으로 복사/붙여넣기 필요
- 해결: MCP 서버 (Python FastAPI) + Private Git 웹훅 + GCP Cloud Run 배포
- 효과: “Spring Batch 글 있어?” 한 마디로 즉시 검색, 5~10분 → 5초, 블로그가 AI의 개인 아카이브
- 한계: Python 필수, GCP 배포 복잡도, 웹훅 설정, 초기 구축 시간 (1주), 무료 플랜 제한
글 머리말
“Spring Batch 성능 최적화 글… 예전에 썼던 것 같은데?”
블로그를 운영하면서 가장 답답한 순간입니다. 50개가 넘는 포스팅 중에서 특정 주제를 찾으려면 파일 탐색기를 열고, Cmd+F로 검색하고, 파일을 하나씩 열어봐야 합니다. 매번 5~10분씩 허비하는 게 일상이었거든요.
1편에서는 블로그에 AI 코드 설명 기능을 붙이면서 Supabase 캐싱으로 API 비용을 95% 줄인 경험을 공유했습니다. 그런데 글을 쓰다 보니 새로운 니즈가 생겼 습니다. “Claude가 내 블로그 전체를 알고 있으면 얼마나 편할까?”
그래서 MCP(Model Context Protocol) 서버를 만들어봤습니다. “Spring Batch 글 있어?”라고 물으면 Claude가 즉시 검색해서 답해줍니다. 50개 파일을 뒤질 필요 없이, 제가 쓴 모든 포스팅이 AI가 직접 접근할 수 있는 개인 아카이브가 된 거죠.
이번 글에서는 Python으로 MCP 서버를 구현하고, GCP Cloud Run에 배포한 뒤, Private Git 저장소와 웹훅으로 연동한 전체 과정을 정리했습니다.
MCP란 무엇인가
MCP는 Model Context Protocol의 약자입니다. Anthropic에서 만든 표준 프로토콜인데, 쉽게 말하면 AI가 외부 데이터를 읽을 수 있게 해주는 다리 역할을 합니다.
일반 Claude vs MCP 연결된 Claude
일반 Claude:
나: "내 블로그에 Spring Batch 글이 있어?"
Claude: "죄송하지만 외부 데이터에는 접근할 수 없습니다."MCP 연결된 Claude:
나: "내 블로그에 Spring Batch 글이 있어?"
Claude: [MCP 서버로 검색 중...]
"네, 2개 있습니다.
1. Spring Batch 성능 최적화 (1편) - 2023-10-14
2. Spring Batch 성능 최적화 (2편) - 2023-10-15"결국 MCP 서버는 AI의 눈과 귀가 되어주는 겁니다. 제 블로그의 컨텐츠, 파일 구조, 카테고리, 태그 정보를 Claude가 직접 읽고 분석할 수 있게 만들어줍니다.
MCP Tools 개념
MCP는 Tools라는 단위로 기능을 제공합니다. 각 Tool은 특정 작업을 수행하는 함수라고 생각하면 됩니다.
flowchart TB
AI[AI Claude] --> Tools
subgraph Tools["MCP Tools (5개)"]
T1[list_categories<br/>카테고리 목록]
T2[search_posts<br/>포스팅 검색]
T3[get_post_content<br/>전체 내용 읽기]
T4[get_stats<br/>블로그 통계]
T5[generate_template<br/>템플릿 생성]
end
Tools --> Data[Markdown Files<br/>content/blog/*.md]
style AI fill:#E3F2FD
style T1 fill:#FFF3E0
style T2 fill:#FFF3E0
style T3 fill:#FFF3E0
style T4 fill:#FFF3E0
style T5 fill:#FFF3E0
style Data fill:#E8F5E9제가 구현한 Tools는 5가지입니다:
list_categories: 블로그의 모든 카테고리 목록 조회search_posts: 키워드로 포스팅 검색 (제목, 태그, 본문)get_post_content: 특정 포스팅의 전체 내용 읽기get_stats: 블로그 통계 (카테고리별 분포, 연도별 추이 등)generate_template: 기존 포스팅 구조를 참고한 빈 템플릿 생성
왜 MCP 서버가 필요했나
블로그 관리의 불편함
블로그를 3년 넘게 운영하면서 쌓인 불편함이 있었습니다.
중복 주제 체크의 번거로움
새 글을 쓰려고 할 때마다 “이 주제로 이미 쓴 적 있나?” 확인이 필요했습니다. 50개 넘는 파일을 훑어보는 건 생각보다 귀찮더라고요. 그래서 종종 비슷한 내용을 다시 쓰게 되는 경우도 있었습니다.
예전 글 참고의 어려움
“JPA N+1 문제 해결 글에서 어떤 해결책 제시했더라?” 이런 걸 확인하려면 직접 파일을 찾아서 열어봐야 했습니다. 제가 쓴 글인데 검색이 안 되니 답답했어요.
블로그 통계 확인의 번거로움
카테고리별 포스팅 개수, 연도별 분포, 자주 쓰는 태그 같은 통계를 보려면 코드를 직접 돌려야 했습니다. 간단한 건데 매번 스크립트 짜기는 귀찮더라고요.
시도했던 방법들
처음엔 단순하게 접근해봤습니다.
graph TD
Problem[문제: 50개 포스팅 관리] --> Try1[방법 1: 전체 복붙]
Problem --> Try2[방법 2: 매번 수동 검색]
Problem --> Try3[방법 3: RAG + 벡터 DB]
Problem --> Solution[방법 4: MCP 서버 ✅]
Try1 --> Fail1[❌ 토큰 제한 초과<br/>Claude 200K<br/>포스팅 500K]
Try2 --> Fail2[❌ 검색 5-10분 소요<br/>비효율적]
Try3 --> Fail3[❌ 과도한 비용<br/>Pinecone $70/월]
Solution --> Success[✅ 월 100원 이하<br/>자동 동기화<br/>어디서든 접근]
style Problem fill:#ffebee
style Fail1 fill:#ffcdd2
style Fail2 fill:#ffcdd2
style Fail3 fill:#ffcdd2
style Success fill:#c8e6c9방법 1: 블로그 전체를 Claude에 복붙 50개 포스팅을 합치면 대략 500K 토큰 정도 됩니다. Claude의 컨텍스트 윈도우가 200K인데, 절반도 못 넣어요.
방법 2: 매번 필요한 글만 복붙 이건 결국 수동 작업이잖아요. 매번 5~10분씩 검색하는 건 비효율적입니다.
방법 3: RAG (Retrieval-Augmented Generation) 벡터 DB에 블로그 글을 임베딩하는 방식인데, Pinecone 월 $70에 임베딩 API 비용까지… 개인 블로그 하나 관리하는데 좀 과하다 싶었습니다.
그러다 Anthropic의 MCP 문서를 보게 됐습니다. 가볍고, 표준화되어 있고, 확장 가능했습니다. 딱 제가 원하던 거였어요.
설계 논의: 어떤 방식으로 구현할까
MCP 서버를 만들기로 결정하고 두 가지 방식을 고민했습니다.
| 항목 | 로컬 MCP (Stdio) | REST API MCP (SSE) |
|---|---|---|
| 통신 방식 | 표준 입출력 | Server-Sent Events |
| 배포 | 로컬에서만 실행 | Cloud Run 배포 |
| 사용 환경 | Claude Desktop만 | Cursor, 웹 Claude 등 어디서든 |
| 파일 접근 | 로컬 파일 직접 접근 (빠름) | Git Clone 필요 (느림) |
| 공유 | 불가능 | 가능 |
| 비용 | 무료 | 월 100원 이하 |
| 자동 동기화 | 불가능 | Webhook으로 가능 |
최종 선택: 둘 다 만들기
고민하다가 결국 두 가지 다 만들었습니다. 각자 역할이 다르더라고요.
- 로컬 MCP 서버: 글쓰기 작업에 사용
- Claude Desktop에서 실행
- 로컬 파일을 직접 생성/수정 가능
- REST API MCP 서버: 검색/조회 용도로 어디서든 접근
- Cursor IDE, 웹 Claude에서 사용
- GCP Cloud Run에 배포
- GitHub Webhook으로 Push 시 자동 동기화
이번 글에서는 REST API MCP 서버 (Cloud Run 배포) 구현에 집중합니다.
전체 아키텍처
먼저 큰 그림을 보겠습니다.
flowchart TB
subgraph clients["AI 클라이언트"]
A1["Claude Desktop"]
A2["Cursor IDE"]
A3["웹 Claude"]
end
subgraph server["MCP API Server (Cloud Run)"]
B["Tools API"]
S["Local Storage<br/>/tmp/blog-content/"]
W["Webhook Handler"]
end
subgraph github["Private GitHub"]
G["content/blog/"]
end
A1 & A2 & A3 -->|① SSE 연결| B
B -->|② 파일 읽기| S
S -->|③ Git Clone/Pull| G
G -->|④ Push Event| W
W -->|⑤ 동기화| S
style A1 fill:#BBDEFB
style A2 fill:#BBDEFB
style A3 fill:#BBDEFB
style B fill:#FFE0B2
style S fill:#E1BEE7
style W fill:#FFCDD2
style G fill:#C8E6C9핵심은 3개 레이어입니다:
- MCP API 레이어: AI가 사용하는 Tools 제공
- Git Sync 레이어: Private 저장소에서 컨텐츠 가져오기
- Webhook 레이어: Push 시 자동으로 최신 내용 동기화