{
  "markdown": "# content-genie-mcp\n\n> Korean-content-creator MCP that gives Claude live Naver/Daum/Google/YouTube/Zum trends, a 100+ Korean-holiday DB, and a viral-score predictor — so you stop tab-hopping between 5 trend dashboards before every post.\n\n[![CI](https://github.com/MUSE-CODE-SPACE/content-genie-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/MUSE-CODE-SPACE/content-genie-mcp/actions/workflows/ci.yml)\n[![npm](https://img.shields.io/npm/v/content-genie-mcp.svg)](https://www.npmjs.com/package/content-genie-mcp)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n![Maintained](https://img.shields.io/badge/maintained-yes-brightgreen.svg)\n\n[English](#english) · [한국어](#한국어)\n\n---\n\n<a name=\"english\"></a>\n## Why content-genie?\n\nMost \"trend\" MCPs are thin wrappers around Google Trends. If you're publishing for a Korean audience (Naver Blog, YouTube Korea, Instagram KR, TikTok), Google alone misses the signal — Naver Datalab, Daum search, Zum realtime, and KR-region YouTube each surface different keywords at different hours. content-genie consolidates **all five sources** into one MCP, layers a **100+ Korean-holiday + 14일-day-series + 절기 event database** so Claude can plan around 빼빼로데이 and 수능 without being told, and finishes the loop with a **viral-score predictor** trained on the structural patterns (numbers, brackets, emotional triggers, urgency words) that move CTR in Korean content.\n\nThe Phase 4 refactor (v2.12.0, May 2026) made the whole thing safe to depend on: every scraper sits behind a **per-source circuit breaker** (3 fails → open 5 min) with a **stale-cache fallback**, so a Naver HTML change no longer takes the whole MCP down — it just degrades that one source and tells the LLM about it via `resource://content-genie/sources`.\n\n## What's new in v2.12.0\n\n- **17 tools, one registry, six small files.** The old 4,712-line `index.ts` is gone — tools live in `src/tools/{trends,seo,contentIdeas,viralScoring,competitorAnalysis,koreanEvents}.ts`. Adding a tool is a one-liner.\n- **Scrapers can't take the server down anymore.** Per-source circuit breaker + LRU/TTL cache (15 min, 100 entries) + stale fallback. When Naver is degraded, Claude sees `source_status: 'stale'` and adapts.\n- **Two new MCP Resources for `@-mention`.** `resource://content-genie/korean-events/{year}` returns the full event DB rebased to any year; `resource://content-genie/sources` exposes live breaker + cache state.\n- **Two MCP Prompts as guided workflows.** `viral-title` chains `optimize_title_hashtags` → `predict_viral_score` → `generate_ab_test_variants`. `competitor-analysis` does URL analysis + gap-filling ideation.\n- **38 tests across 8 suites.** Circuit breaker transitions, cache eviction, scraper fallback paths, SSRF guard, every tool group — runs on Node 20 + 22 in CI.\n\n## 5-minute Quickstart\n\n```bash\n# 1. Install via Claude Code (recommended)\nclaude mcp add content-genie -- npx -y content-genie-mcp\n\n# 2. Or add to Claude Desktop's claude_desktop_config.json:\n```\n\n```json\n{\n  \"mcpServers\": {\n    \"content-genie\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"content-genie-mcp\"]\n    }\n  }\n}\n```\n\n3. Restart Claude Desktop (or `claude` will pick it up on the next run).\n4. Try this in Claude:\n\n```\n오늘 한국에서 뜨는 키워드 5개로 유튜브 쇼츠 제목 후보 3개씩 만들고, 각각 바이럴 점수 등급 매겨줘.\n```\n\n5. Expected: Claude calls `get_korean_trends` (naver+daum+google+youtube+zum merged) → `optimize_title_hashtags` per keyword → `predict_viral_score` → returns a ranked S/A/B/C/D grade table with the structural reason (\"제목에 숫자 + 호기심 트리거 포함\").\n\n## Real use cases\n\n### 1. \"I need a Korean blog post topic that won't be obsolete by tomorrow\"\n**Problem:** Naver Blog rewards quick takes on the keywords trending *right now*, but those keywords change every 4 hours.\n**With this MCP:** Claude calls `get_korean_trends({ platform: 'naver', limit: 20 })` and then `generate_content_ideas` against the freshest 5 keywords with `seasonal: true`. The seasonal layer adds upcoming Korean events from the 100+ DB — so the suggestion isn't just \"AI 추천 도구\" but \"AI 추천 도구 + 수능 D-30 콘텐츠 기획\" because `get_seasonal_content_guide` saw 수능 is 4 weeks out.\n**Why it's better than the Naver Datalab UI:** Datalab gives you a chart. This MCP gives you 5 titled, hashtag-optimized post drafts grounded in those same trends, in one conversational round-trip.\n\n### 2. \"Will this YouTube Shorts title actually pop?\"\n**Problem:** Title CTR is the single biggest lever on Shorts, but you only know after you publish.\n**With this MCP:** Paste your draft into Claude, say \"use the `viral-title` prompt\". The prompt chains `optimize_title_hashtags` → `predict_viral_score` → `generate_ab_test_variants` and returns an S~D grade plus 5 A/B variants with the structural deltas (added number, added urgency word, shortened to 25 chars).\n**Why it's better than vibes:** the scorer reads the same 6 signal classes a Korean copywriter would — emotional triggers (`충격|실화|숨겨진`), structural elements (numbers/brackets/`?`/`!`), urgency, social proof, utility framings (`방법|꿀팁|노하우`), and length window — and tells you which ones are missing.\n\n### 3. \"I run a small Korean brand, I need a content calendar that respects local holidays\"\n**Problem:** Generic calendar tools don't know about 빼빼로데이, 김장철, 수능, or 한가위 연휴, so you end up posting a promo on 현충일.\n**With this MCP:** Claude calls `create_content_calendar({ months: 3, niche: 'beauty' })`, which joins your 3-month window against the 100+ event DB (공휴일 18 + 데이 시리즈 12 + 절기 15 + 상업 이벤트 15 + 시즌/날씨 12 + 입시 10 + 쇼핑 10 + 크리에이터 특화 8) and produces a date-by-date plan with content themes per event.\n**Why it's better than a Notion template:** the DB is rebased to any year (`resource://content-genie/korean-events/2027` is a single `@-mention` away), so the calendar stays accurate next year without you maintaining it.\n\n## Tools / Resources / Prompts\n\n| Name | Type | What it does |\n|------|------|--------------|\n| `get_korean_trends` | tool | Real-time trends across Naver / Daum / Google / YouTube / Zum, merged + de-duped |\n| `analyze_news_trends` | tool | Korean news headline trends with category buckets |\n| `analyze_seo_keywords` | tool | Naver + Google autocomplete + long-tail expansion |\n| `optimize_title_hashtags` | tool | CTR-optimized title rewrites + per-platform hashtag set |\n| `generate_hashtag_strategy` | tool | Per-platform (IG/YT/TikTok/Naver) hashtag mix with breadth/depth split |\n| `generate_content_ideas` | tool | Idea generation seeded by trend + season + niche |\n| `generate_script_outline` | tool | Long-form script / short-form scene-by-scene outline |\n| `repurpose_content` | tool | One post → cross-platform variants (Blog → Shorts → Reel → Thread) |\n| `predict_viral_score` | tool | S~D grade with structural / emotional / urgency reasons |\n| `generate_ab_test_variants` | tool | N A/B title variants with the lever changed in each |\n| `predict_content_performance` | tool | Heuristic CTR / share / save estimate |\n| `analyze_thumbnail` | tool | Thumbnail concept analysis + CTR-optimization checklist |\n| `analyze_competitor_content` | tool | URL-fetch competitor post (SSRF-guarded) + gap analysis |\n| `benchmark_content_performance` | tool | Industry benchmarks by niche / platform |\n| `analyze_influencer_collab` | tool | Influencer fit / audience-overlap / brief generator |\n| `create_content_calendar` | tool | Multi-month calendar joined against Korean event DB |\n| `get_seasonal_content_guide` | tool | \"What should I post in the next 2 weeks?\" — event-aware |\n| `resource://content-genie/korean-events/{year}` | resource | Full 100+ event DB rebased to any year (JSON) |\n| `resource://content-genie/sources` | resource | Live scraper breaker + cache state for graceful degradation |\n| `prompt://content-genie/viral-title` | prompt | optimize → predict → A/B-vary, one slash command |\n| `prompt://content-genie/competitor-analysis` | prompt | URL fetch → gap-fill ideation workflow |\n\n## How it works\n\n```\n                    Claude (or any MCP client)\n                              │\n                              ▼\n                        McpServer (SDK 1.25)\n                              │\n                  ┌───────────┼───────────┐\n                  ▼           ▼           ▼\n              17 tools    Resources    Prompts\n                  │\n                  ▼\n            runScraper()  ◄── core/cache.ts (LRU + 15min TTL)\n                  │       ◄── core/circuitBreaker.ts (3-fail → open 5min)\n                  ▼\n         scrapers/{naver,daum,google,youtube,zum}.ts\n                  │\n                  ▼\n            core/security.ts (SSRF + 30s timeout + 5MiB cap)\n```\n\nThree design choices that matter:\n1. **Per-source circuit breaker.** A bad day at Naver doesn't take down 16 other tools — only the trend tools that need Naver, and even those return a stale-cache `status: 'stale'` envelope so the LLM can adapt.\n2. **Scrapers never throw.** They return a `ScrapeResult` envelope (`ok | stale | unavailable`). All error handling is in one place (`runScraper`), so adding a new source is \"write a scraper, return `ScrapeResult`, done\".\n3. **Event DB rebased on read.** The 100+ Korean holiday/event database is stored as month-day rules and rebased to any year on demand — so `…/korean-events/2027` works today.\n\n## Configuration\n\n| Env var | Default | Purpose |\n|---------|---------|---------|\n| `MCP_HTTP_MODE` | `false` | `true` to run as Streamable HTTP server instead of stdio |\n| `HOST` | `0.0.0.0` | HTTP bind host |\n| `PORT` | `3000` | HTTP bind port |\n| `CONTENT_GENIE_ALLOWED_HOSTS` | KR search/social/commerce allowlist | Comma-separated host allowlist for `analyze_competitor_content` SSRF guard. Override to add your own competitor domains. |\n\nHTTP endpoints (when `MCP_HTTP_MODE=true`):\n\n| Method | Path | Purpose |\n|--------|------|---------|\n| GET | `/` | Server info |\n| GET | `/health` | Health probe (Railway/Docker) |\n| POST | `/mcp` | MCP JSON-RPC requests (2025-03-26 spec) |\n| GET | `/mcp` | SSE stream for server-initiated messages |\n\n## Known limitations\n\n- **Scrapers are HTML-driven.** Naver / Daum / Zum don't expose public trend APIs; the scrapers parse HTML. When they change their markup, the affected source returns `status: 'unavailable'` until we ship a parser fix. The circuit breaker keeps the rest of the MCP working in the meantime.\n- **Viral score is structural, not semantic.** `predict_viral_score` is a heuristic over Korean copy patterns. It can't read the *meaning* of your post — only the structural / emotional / urgency signals in the title + description.\n- **No thumbnail image analysis.** `analyze_thumbnail` works on a *thumbnail concept description*, not on an uploaded image. Image-in is on the roadmap.\n- **Korean-first.** Hashtag templates, urgency words, and the event DB are Korean. English/JP modes are not in scope for v2.x.\n\n## When NOT to use this\n\n- If you need a **global trend dashboard**, use Google Trends directly — content-genie is opinionated toward the Korean creator stack.\n- If you need **paid keyword data with search volume** (네이버 검색광고 API, Ahrefs, SEMrush), use those — content-genie's SEO tools rely on free autocomplete + heuristic long-tail expansion.\n- If you need **deterministic LLM-free copy generation** for compliance reasons, this MCP feeds an LLM — the LLM is what writes the actual titles.\n\n## Comparison\n\n| | content-genie-mcp | Raw scraping yourself | Naver Datalab UI | SmartEditor / 네이버 검색광고 API |\n|---|---|---|---|---|\n| Multi-source merge (5 KR sources) | yes | DIY | Naver only | Naver only |\n| Korean event DB built-in | 100+ events | no | no | no |\n| Circuit breaker + cache | yes | DIY | n/a | n/a |\n| Viral score heuristic | yes | no | no | no |\n| MCP-native (Claude `@-mention` events) | yes | no | no | no |\n| Cost | free (npm) | dev time | free | paid above quota |\n\n## Roadmap\n\n- **More sources.** Tistory realtime, Brunch picks, Kakao View — currently 5 sources, want 8.\n- **Image-in thumbnail analysis.** Accept uploaded thumbnails and run vision-based CTR scoring.\n- **Cached-trend Resource.** Expose `resource://content-genie/trends/{platform}/latest` so the LLM can `@-mention` last-scrape results without spending a tool call.\n- **Video script → captions/subtitles.** Pair `generate_script_outline` with a captions formatter for Shorts upload.\n- **Naver 검색광고 API integration (opt-in).** When the user supplies an API key, switch SEO tools from autocomplete heuristics to real search volume.\n\n## Contributing\n\nPRs welcome. The Phase 4 refactor made the codebase contributor-friendly — adding a tool is a single-file change. See the `Contributing` section below or open an issue first if you want to discuss a larger change. CI runs `typecheck + test + build` on Node 20 + 22 against every PR.\n\nQuick contributor loop:\n\n```bash\ngit clone https://github.com/MUSE-CODE-SPACE/content-genie-mcp\ncd content-genie-mcp\nnpm install\nnpm run typecheck && npm test && npm run build\n```\n\n## Security\n\nThis MCP fetches third-party URLs and takes LLM-driven input. The threat model, SSRF host allowlist, 30-second fetch timeout + 5 MiB body cap, and `CONTENT_GENIE_ALLOWED_HOSTS` override are documented in [`SECURITY.md`](./SECURITY.md). **Report vulnerabilities privately** via a GitHub Security Advisory at <https://github.com/MUSE-CODE-SPACE/content-genie-mcp/security/advisories/new>.\n\n## License\n\nMIT — SPDX identifier declared in [`package.json`](./package.json) (a top-level `LICENSE` file will be added in the next release).\n\n## Maintainer\n\n[@yoon-k](https://github.com/MUSE-CODE-SPACE) (MUSE-CODE-SPACE). For support, open an issue: <https://github.com/MUSE-CODE-SPACE/content-genie-mcp/issues>.\n\n---\n\n<a name=\"한국어\"></a>\n## 한국어 요약\n\ncontent-genie-mcp는 한국 콘텐츠 크리에이터를 위한 MCP 서버입니다. **네이버 / 다음 / 구글 / 유튜브 / 줌** 5개 소스의 실시간 트렌드를 한 번에 합쳐 보여주고, **100+ 한국 기념일/이벤트 DB**(공휴일 18, 데이 시리즈 12, 절기 15, 상업 이벤트 15, 시즌/날씨 12, 입시 10, 쇼핑 10, 크리에이터 특화 8)와 **바이럴 점수 예측기**(S~D 등급, 한국어 카피 패턴 기반)를 함께 제공합니다.\n\nv2.12.0(2026-05-20)에서 **17개 도구**가 도메인별로 모듈화되었고, **스크래퍼별 회로 차단기 + LRU 캐시 + stale fallback** 으로 한 소스가 망가져도 나머지가 정상 동작합니다. `@-mention` 가능한 **MCP Resources 2개**와 슬래시 명령용 **Prompts 2개**도 추가되었습니다.\n\n설치 (Claude Code):\n\n```bash\nclaude mcp add content-genie -- npx -y content-genie-mcp\n```\n\n첫 호출 예시:\n\n```\n오늘 한국에서 뜨는 키워드 5개로 유튜브 쇼츠 제목 후보 3개씩 만들고, 각각 바이럴 점수 등급 매겨줘.\n```\n\n자세한 내용은 영문 섹션, 변경 이력은 [`CHANGELOG.md`](./CHANGELOG.md), 위협 모델은 [`SECURITY.md`](./SECURITY.md)를 참고하세요.\n",
  "bytes": 14460,
  "sha": "e8d952c02963ed50d53c8ed1300bd87a531247b9e3849fab554e9bc6ca4d7d39",
  "repo_slug": "muse-code-space/content-genie-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_muse_code_space_content_genie_90083a7a/readme"
}