들어가며
Model Context Protocol(MCP)을 활용하여 Claude가 직접 블로그 포스트를 관리할 수 있는 시스템을 구축했습니다. 이 글에서는 구현 내용과 활용 방법을 소개합니다.
MCP란?
MCP(Model Context Protocol)는 Anthropic에서 개발한 프로토콜로, Claude와 외부 도구/데이터 소스 간의 표준화된 통신을 가능하게 합니다.
┌─────────────┐ MCP ┌─────────────┐
│ Claude │ ◄──────────► │ MCP Server │
└─────────────┘ └─────────────┘
│
▼
┌─────────────┐
│ Blog │
│ Files │
└─────────────┘
아키텍처
시스템 구성
blogs/
├── .claude/
│ ├── mcp_server.py # MCP 서버 구현
│ ├── requirements.txt # Python 의존성
│ ├── README.md # 사용 문서
│ └── claude_desktop_config.json
├── content/
│ └── posts/ # 블로그 포스트
└── static/
└── images/ # 이미지 파일
MCP 서버 구조
class BlogManager:
"""블로그 관리 클래스"""
def create_post(self, title, content, tags, categories):
"""새 포스트 생성"""
def list_posts(self, limit, offset):
"""포스트 목록 조회"""
def get_post(self, filename):
"""특정 포스트 조회"""
def update_post(self, filename, **kwargs):
"""포스트 수정"""
def delete_post(self, filename):
"""포스트 삭제"""
def search_posts(self, query):
"""포스트 검색"""
제공 도구
1. blog_create_post
새 블로그 포스트를 생성합니다.
{
"title": "포스트 제목",
"content": "Markdown 내용...",
"tags": ["tag1", "tag2"],
"categories": ["Development"],
"draft": false
}
2. blog_list_posts
포스트 목록을 조회합니다.
{
"limit": 20,
"offset": 0
}
3. blog_get_post
특정 포스트의 상세 내용을 조회합니다.
{
"filename": "2026-02-21-004-example.md"
}
4. blog_update_post
기존 포스트를 수정합니다.
{
"filename": "2026-02-21-004-example.md",
"content": "수정된 내용...",
"draft": false
}
5. blog_search_posts
내용으로 포스트를 검색합니다.
{
"query": "Docker"
}
자동화된 파일 명명
포스트 파일명은 다음 규칙으로 자동 생성됩니다:
YYYY-MM-DD-NNN-slug.md
YYYY-MM-DD: 작성일NNN: 일련번호 (001, 002, …)slug: 제목에서 생성된 URL 친화적 문자열
예: 2026-02-21-004-mcp-blog-automation.md
활용 시나리오
1. 빠른 포스트 작성
사용자: "Python 리스트 컴프리헨션에 대한 짧은 팁 포스트를 작성해줘"
Claude: blog_create_post 도구를 사용하여 포스트 생성
→ 파일 생성: 2026-02-21-005-python-list-comprehension.md
2. 기존 포스트 검색 및 수정
사용자: "Docker 관련 포스트를 찾아서 최신 버전 정보로 업데이트해줘"
Claude: blog_search_posts("Docker") → 결과 확인 → blog_update_post
3. 시리즈 포스트 관리
사용자: "지금까지 작성한 에이전트 관련 포스트 목록을 보여줘"
Claude: blog_search_posts("agent") → 관련 포스트 나열
구현상의 고려사항
Front Matter 파싱
Hugo의 TOML 형식 front matter를 파싱합니다:
def _parse_front_matter(self, content: str) -> Dict[str, Any]:
"""TOML front matter 파싱"""
if not content.startswith("+++"):
return {}
parts = content.split("+++", 2)
# ... 파싱 로직
동시성 처리
파일명 충돌을 방지하기 위해 기존 파일 수를 확인합니다:
existing_count = len(list(self.content_dir.glob("*.md")))
filename = self._generate_filename(title, existing_count + 1)
확장 가능성
1. 이미지 처리
blog_upload_image: 이미지 업로드 및 최적화
2. 자동 태그 추천
blog_suggest_tags: 내용 분석 기반 태그 추천
3. SEO 최적화
blog_optimize_seo: 메타 설명, 키워드 최적화
4. 배포 자동화
blog_publish: git commit, push, 배포 트리거
결론
MCP를 활용한 블로그 자동화 시스템을 통해:
- 생산성 향상: 자연어로 포스트 작성 가능
- 일관성 유지: 파일 명명 규칙 자동 적용
- 접근성 개선: Claude를 통한 직관적인 블로그 관리
이 시스템은 지속적으로 확장 가능하며, 이미지 처리, SEO 최적화, 자동 배포 등의 기능을 추가할 수 있습니다.