Community코딩 & 개발github.com

headless-cms-mcp-pipeline

헤드리스 CMS 콘텐츠를 MCP 도구를 통해 오케스트레이션할 때 사용합니다.

headless-cms-mcp-pipeline란 무엇인가요?

Headless CMS MCP 콘텐츠 파이프라인은 AI 에이전트(Hermes)가 헤드리스 WordPress CMS 및 Next.js 프론트엔드와 상호 작용하여 블로그 게시물, 페이지, 탐색 메뉴를 관리, 작성, 게시할 수 있도록 설계된 포괄적인 기술입니다. Model Context Protocol(MCP)을 통해 WordPress를 순수 데이터 저장소로 사용하며, AI 에이전트는 연구, 카피 작성, 이미지 생성(9Router 멀티 모델 게이트웨이 활용) 등 모든 장기 실행 작업을 수행합니다. 이 기술은 업서트 전용 도구(save_post, save_page)를 사용하여 게시물과 페이지를 엄격하게 분리하고, 각 페이지의 상업적/법적 역할(예: 리드 마그넷, 개인정보처리방침)을 명확히 분류하며, 동적 네비게이션 메뉴를 WordPress 단일 진실 공급원으로 유지합니다. 또한, 편집 지침, E-E-A-T 표준, 브랜드 시각적 규칙을 WordPress 데이터베이스 옵션에서 동적으로 가져와 AI 출력이 대시보드 설정과 100% 일치하도록 보장합니다. 워크플로우는 10단계로 구성되어 있으며, 토픽 클러스터 검색, 의미론적 카니발리제이션 방지, 다계층 인용 연구를 포함하여 콘텐츠 품질과 SEO를 최적화합니다.

지원 대상✓Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/imadegunawinangun/skill-headless-cms-mcp-pipeline/tree/HEAD

Installed? Explore more 코딩 & 개발 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

미리보기

스킬 README에서

headless-cms-mcp-pipeline preview

문서

헤드리스 CMS MCP 콘텐츠 파이프라인

사용 시기

  • 모델 컨텍스트 프로토콜(MCP)을 통해 헤드리스 WordPress에서 블로그 게시물 및 페이지 관리, 작성, 게시.
  • Next.js 헤드리스 프론트엔드에 대한 자율 AI 기사 생성 파이프라인 오케스트레이션.
  • 외부 AI 에이전트를 Sayoti Suite MCP RPC(/wp-json/sayoti-mcp/v1/rpc)에 연결.
  • 편집 표준, The Borderline Matrix, 임상 E-E-A-T 규칙, 브랜드 시각적 지침을 CMS와 AI 에이전트 간 동기화.
  • 동적 헤드리스 탐색 메뉴, 온페이지 초점 키워드 감사, 특수 페이지 역할(리드 마그넷, 개인정보처리방침, 이용약관) 구성.

전제 조건 및 제로 시크릿 정책

⚠️ 엄격한 자격 증명 보호 (제로 시크릿 누출)

  • API 키, 비밀번호, 또는 베어러 토큰을 절대 SKILL.md나 git 추적 파일에 하드코딩하지 마십시오.
  • 모든 자격 증명은 $HERMES_HOME/.env 또는 프로필별 .env 파일의 환경 변수에서만 엄격하게 확인되어야 합니다.
  • 이 파이프라인에 필요한 자격 증명:
    1. MCP_SAYOTI_CMS_KEY: WordPress MCP RPC 인증을 위한 마스터 시크릿 키 (headers: {'X-Sayoti-Key': '${MCP_SAYOTI_CMS_KEY}'}).
    2. HERMES_CUSTOM_9ROUTER_SAYOTI_MY_ID_API_KEY 또는 NINEROUTER_API_KEY: 9Router 멀티 모델 게이트웨이(image_generate 및 임베딩)용 API 키.
  • WordPress MCP 서버 구성 (config.yaml의 mcp_servers 아래):
    mcp_servers:
      sayoti-cms:
        url: "http://wordpress-sentra/wp-json/sayoti-mcp/v1/rpc"
        headers:
          X-Sayoti-Key: "${MCP_SAYOTI_CMS_KEY}"
        enabled: true
        timeout: 180
    
  • 벡터 데이터베이스 전제 조건:
    • WordPress 관리자(sayoti_mcp_settings)에서 embedding_status를 enabled로 설정하고 모델을 local/nomic-embed-text로 설정하여 rag_search 및 자동 게시물 색인을 지원해야 합니다.

아키텍처 원칙

  1. 순수 데이터 저장소로서의 WordPress (제로 타임아웃):

    • WordPress는 REST/MCP 요청 중에 장기 실행 동기 AI 호출(LLM 생성, 확산 모델)을 절대 실행해서는 안 됩니다.
    • AI 에이전트(Hermes)가 실행 엔진 역할을 합니다: 연구 수행, 카피 초안 작성, 9Router를 통한 시각 자료 생성, 미디어 삽입을 수행한 후 데이터를 CMS로 보냅니다.
    • CMS 작업(save_post, save_page)은 순수하게 빠른 데이터베이스 트랜잭션(< 1초)으로 실행되어야 하며 Next.js 온디맨드 ISR 재검증을 트리거해야 합니다.
  2. 업서트를 통한 엄격한 엔터티 분리:

    • 블로그 게시물에는 항상 전용 save_post 도구를, 정적/랜딩 페이지에는 save_page를 사용하십시오.
    • 게시물과 페이지를 조건부 매개변수가 있는 단일 일반 도구로 결합하지 마십시오. 별도 스키마는 매개변수 누출과 LLM 환각을 제거합니다.
    • 업서트 로직: id 또는 일치하는 slug가 있으면 업데이트를 수행하고, 없으면 새 콘텐츠를 생성합니다.
  3. 특수 페이지 역할 및 리드 마그넷 분류:

    • 페이지는 유입 경로에서 특정 상업적 또는 법적 역할을 수행합니다: standard, lead_magnet, privacy_policy, terms_of_service, 또는 disclaimer.
    • 리드 마그넷 페이지를 모호하게 남겨두지 마십시오. 항상 page_role: 'lead_magnet'으로 분류하고 lead_magnet_type을 통해 정확한 자산 유형을 명시하십시오 (예: "Checklist Milestone Perkembangan 2–7 Tahun (PDF)").
    • CMS는 /wp-json/sayoti/v1/site-settings를 통해 이를 노출하고 WordPress 관리자에 게시물 상태 배지([🎁 LEAD MAGNET: ...], [🔒 PRIVACY POLICY], [📜 TERMS OF SERVICE])를 등록하여 인간 편집자가 페이지 기능을 즉시 인식할 수 있도록 합니다.
  4. 동적 헤드리스 탐색 메뉴:

    • 메뉴는 프론트엔드에 절대 하드코딩되어서는 안 됩니다. WordPress는 /wp-json/sayoti/v1/menus?location=primary 및 footer를 통한 단일 진실 공급원입니다.
    • WP 관리자(Appearance -> Menus)에서 메뉴를 업데이트하면 태그 menu와 경로 /를 사용하여 ISR 재검증 웹훅이 실행되어 재배포 없이 Next.js 헤더와 푸터를 즉시 업데이트합니다.
    • 첫 실행 시 항상 기본 탐색 메뉴를 자동 시드하여 WP 관리자 대시보드에 즉시 편집 가능한 깔끔한 메뉴를 제공합니다.
  5. 편집 및 시각적 규칙에 대한 단일 진실 공급원:

    • 편집 규칙(content.md), E-E-A-T 표준(sayoti-editorial.md), 브랜드 시각적 규칙(sayoti-visual-branding.md), 온페이지 SEO 키워드 규칙은 WordPress 데이터베이스 옵션에 상주합니다.
    • 에이전트는 get_editorial_guidelines를 통해 이러한 규칙을 동적으로 가져와 출력이 대시보드 내 생성과 100% 일치하도록 합니다.
  6. 분리된 2-플러그인 아키텍처 (범용 콘텐츠 vs 헤드리스 브리지):

    • AI, 토픽 클러스터, MCP 서버를 헤드리스 리디렉션 로직에 절대 결합하지 마십시오. 모놀리식 플러그인은 클라이언트가 이미 활성 WordPress 테마(Astra, Elementor, Divi)를 가지고 있고 AI/SEO 엔진만 원하는 경우 문제를 일으킵니다.
    • 두 개의 깔끔하고 독립적인 플러그인으로 분리하십시오:
      • sayoti-content-engine: 범용 및 테마에 구애받지 않음. MariaDB 11.8 벡터 RAG, 토픽 클러스터(허브 앤 스포크), 링크 탐색기, 끊어진 링크 자동 복구, 대시보드 내 AI 작성기, 리드 마그넷 CPT 및 CRM, MCP 서버(/wp-json/sayoti-mcp/v1/rpc)를 포함. 리디렉션이나 Next.js 종속성 없음. 모든 기존 WordPress 설치에서 작동.
      • sayoti-headless-bridge: 헤드리스 Next.js 프론트엔드를 사용할 때만 설치. 301 템플릿 리디렉션(구성 가능한 토글 포함), REST /site-settings 및 /menus, ISR 재검증 웹훅, 페이지 컨트롤러(홈페이지 및 법적 역할), 동적 마케팅 추적 태그(GTM, Meta Pixel, TikTok, 광고) 및 로컬 SEO 스키마(Google 지도 및 비즈니스 주소)를 포함.

포괄적인 10단계 기사 생성 워크플로우

[사용자 토픽 프롬프트]
        ↓ 1. 작업 수집
[WordPress MCP: get_topic_cluster & get_editorial_guidelines]
        ↓ 2. 필러 분류 체계 및 편집 지침 가져오기
[에이전트 (Hermes): 초점 키워드 및 앵글]
        ↓ 3. 초점 키워드 및 특정 앵글 공식화
[WordPress MCP: rag_search]
        ↓ 4. 의미론적 카니발리제이션 확인(>80%) 및 내부 링크 후보 가져오기
[웹 연구: 범용 4계층 인용 계층 구조]
        ↓ 5. 사실 확인 및 주장 입증
[에이전시 에이전트: content-creator]
        ↓ 6. 전문 작가 페르소나 로드
[콘텐츠 작성: 네이티브 구텐베르크]
        ↓ 7. 900-1500단어 의미론적 HTML 초안 작성 (훅, H2, 허브 링크, FAQ, CTA, 면책 조항)
[9Router image_generate + MCP upload_media]
        ↓ 8. 적응형 워터마크로 시각 자산 사이드로드 (제로 타임아웃)
[WordPress MCP: save_post]
        ↓ 9. 즉시 데이터베이스 트랜잭션 + 자동 벡터 색인 + Next.js ISR
[WordPress MCP: audit_post_seo]
        ↓ 10. SEO 점수 감사 (목표 80-100%) 및 라이브 보고서 제공
[Vercel Next.js에서 라이브]

1단계: 토픽 및 컨텍스트 수집

사용자 또는 편집 일정에서 초기 콘텐츠 요청을 받습니다. 대상 청중의痛点 및 상업적 의도를 식별합니다.

2단계: 지침 및 분류 체계 검색

sayoti-cms 도구를 호출하여 구조적 경계를 설정합니다:

  1. get_topic_cluster: 사용 가능한 카테고리 필러를 검사하고 의도된 카테고리에 대한 공식 기본 허브(게시물 ID, 제목, 슬러그)를 검색합니다.
  2. get_editorial_guidelines: 활성 편집 길이 제한(900–1,500단어), 필수 시작 구성, FAQ 아코디언 규칙, 액션 프레임워크, 공식 16진수 색상 팔레트를 가져옵니다.

3단계: 심층 초점 키워드 연구 및 앵글 공식화

  • 검색 의도 및 키워드 연구: 연구 없이 무작위 구문을 선택하지 마십시오. 프로필에 정의된 대상 청중이 사용하는 현실적인 검색 행동과 쿼리(정보 질문, 문제 또는 웹 검색/키워드 패턴을 통한 조사 비교)를 적극적으로 연구하십시오.
  • 기본 초점 키워드 선택: 연구 결과를 기반으로 명확한 롱테일 검색 의도를 가진 정확히 1개의 기본 초점 키워드를 설정하십시오 (예: 광범위하고 일반적인 헤드 용어 대신 "cara melatih anak speech delay 2 tahun mandiri").
  • 날카롭고 독특한 앵글 정의: 선택한 키워드를 독특한 앵글(예: 특정 연령 전환, 현실적인 일상 가정 루틴, 24시간 이내에 적용 가능한 구체적인 단계)로 고정하십시오.
  • 단일 URL 매핑: 이 초점 키워드가 단일 고유 URL에 엄격하게 전용되어 향후 키워드 경쟁을 방지하도록 보장합니다.

4단계: 의미론적 RAG 확인 및 카니발리제이션 확인

rag_search(query: "<focus_keyword> <angle>", limit: 5)를 실행합니다:

  1. 카니발리제이션 필터: 게시된 기사가 동일한 앵글에서 80% 이상의 의미론적 유사성을 보이면 즉시 앵글을 전환합니다 (예: 일반적인 증상에서 가정 루틴 또는 특정 이정표 전환으로 이동).
  2. 수평적 링킹 검색: 벡터 검색에서 반환된 관련 기존 기사를 기록하여 컨텍스트 내부 링크로 사용합니다.

5단계: 다계층 인용 연구 (범용 4계층 계층 구조)

범용 증거 계층 구조를 사용하여 모든 사실적 주장을 입증합니다:

  • 계층 1 (1차 법정 및 과학 권위 - 금본위제): 공식 임상 협회(IDAI, Himpsi, PPHI, WHO, CDC, AAP), 정부 건강 지침, 동료 검토 저널. 연령 이정표 수치, 임상 정의, 의학적 주장에 필수.
  • 계층 2 (평판 좋은 2차 및 산업 연구): 신뢰할 수 있는 뉴스 기관(Kompas, Antara, BBC) 및 거시적 추세에 대한 기관 백서.
  • 계층 3 (관찰 및 현장 정서): 실제 청중/사용자 어려움, 실무자 현장 노트, 커뮤니티 토론. 공감을 불러일으키는 오프닝 훅을 만드는 데 사용. 항상 정서 또는 실용적 현장 관찰로 표시하고, 규범적 법정 또는 임상 사실로 표시하지 마십시오.
  • 계층 4 (금지): 콘텐츠 팜, 출처 미기재 SEO 블로그, 기본 링크 없는 AI 재가공. 절대 인용하지 마십시오.

6단계: 전문가 페르소나 로드

agency_agents_load(agent="content-creator") (또는 적절한 에이전시 전문가)를 호출하고 활성 프로필의 SOUL.md에 의해 지정된 커뮤니케이션 톤을 적용합니다.

7단계: 전체 의미론적 HTML 초안 작성 (네이티브 구텐베르크)

네이티브 WordPress 구텐베르크 블록 주석(<!-- wp:paragraph -->, <!-- wp:heading -->, <!-- wp:separator -->, <!-- wp:list -->)을 사용하여 900–1,500단어의 의미론적 HTML을 작성합니다:

  1. 단일 H1: 페이지 템플릿에서 처리되며, 여는 단락으로 본문을 직접 시작합니다.
  2. 3단락 시작 구성:
    • 단락 1 (훅): 청중의 어려움을 확인하는 실제 시나리오 (계층 3 인사이트에서 파생).
    • 단락 2 (빠른 답변): 자연스럽고 차분한 직접 답변 (딱딱한 "빠른 답변:" 레이블 없음).
    • 단락 3 (전환): 함께 해결책을 탐구하도록 따뜻하게 초대.
  3. H2당 설명: 각 제목 아래 3~5개의 포괄적인 단락, 실용적인 가정 자극 단계(≤24시간) 통합.
  4. 내부 링킹 통합:
    • 수직 (필수): 처음 300-500단어 내에 기본 허브로의 자연스러운 컨텍스트 링크: <a href="/posts/<hub-slug>" class="text-primary font-semibold underline hover:text-accent">...</a>.
    • 수평: 4단계에서 발견된 관련 스포크 기사에 대한 컨텍스트 링크.
  5. 강조 상자 대비 규칙: 특별 참고 사항은 <div class="my-8 rounded-2xl border-2 border-primary/25 bg-card p-6 sm:p-8 shadow-sm">를 사용하고 제목은 text-primary font-bold 또는 text-foreground font-bold를 사용해야 합니다. 밝은 카드에 text-secondary를 절대 사용하지 마십시오.
  6. 마무리 순서:
    • <h2>Kesimpulan &amp; Langkah Pendampingan Terbaik</h2>: 3개의 액션 링크(/metode-belajar, /checklist-milestone, /kontak 또는 직접 WhatsApp)로 마무리.
    • <h2>Pertanyaan yang Sering Diajukan Orang Tua (FAQ)</h2>: <details class="faq-accordion mb-4 rounded-xl border border-border p-4 bg-card transition-all"><summary class="cursor-pointer font-semibold text-foreground flex items-center justify-between"><span>...</span><span class="text-primary font-bold ml-2">+</span></summary><div class="mt-3 text-sm text-foreground/80 leading-relaxed border-t border-border pt-3">...</div></details> 형식으로 최소 5개 질문. 면책 조항 앞에 배치.
    • 필수 임상 면책 조항: <div class="my-6 rounded-xl border border-border bg-muted/30 p-4 text-xs italic text-muted-foreground leading-relaxed">참고: 이 가이드의 정보는 가정에서의 자체 자극을 지원하기 위한 교육적 목적이며, 소아과 전문의 또는 전문 치료사의 직접 평가 및 의학적 조언을 대체하지 않습니다.</div>
    • <h2>참고 문헌</h2>: 인라인 인용과 일치하는 클릭 가능한 전체 https:// URL이 포함된 확인된 출처의 <ol> 목록.
  7. 7가지 온페이지 SEO 기준: 초점 키워드가 제목, 퍼머링크 슬러그, 처음 100단어, 최소 하나의 H2/H3, 발췌문에 존재하고 밀도가 0.5%–2.0%로 유지되어야 합니다.

8단계: 시각 자료 생성 및 미디어 사이드로드 (제로 타임아웃)

  1. 공식 브랜드 16진수 색상 및 엄격한 anti_text_rule(캔버스에 텍스트/숫자/워터마크 없음)을 적용하여 image_generate (9Router)를 통해 이미지를 생성합니다.
  2. MCP 도구 upload_media를 통해 이미지를 업로드합니다:
    • image_url 또는 image_base64를 전달합니다.
    • 특성 이미지의 경우 apply_watermark: true (PHP GD를 통해 브랜드 로고를 적응적으로 자동 스탬프)를 전달하고, H2 본문 일러스트레이션의 경우 apply_watermark: false를 전달합니다.
    • 도구는 CMS 도메인(https://cms...)에서 공식 id (첨부 파일 ID) 및 url을 반환하며, Next.js Vercel remotePatterns와 100% 호환됩니다.
  3. 기사 내 이미지를 <figure class="wp-block-image size-large"><img src="..." alt="..." /><figcaption>...</figcaption></figure> 블록에 직접 삽입합니다.

9단계: 즉시 게시 (save_post)

다음과 함께 save_post를 호출합니다:

  • title, slug, content, category_id, focus_keyword, excerpt.
  • featured_media_id: 8단계의 upload_media에서 반환된 첨부 파일 id로 설정.
  • generate_featured_image: false 및 generate_in_article_images: false (서버 측 동기 이미지 생성을 우회하여 즉시 DB 쓰기로 실행 <1초, 타임아웃 위험 완전 제거).
  • WordPress 자동:
    1. 게시물 저장 및 SEO 메타 필드 업데이트.
    2. Next.js 온디맨드 ISR 재검증 트리거.
    3. 기사 청크를 MariaDB 벡터 임베딩 테이블(wp_sayoti_vectors)에 색인.

10단계: SEO 감사 및 최종 보고

  1. audit_post_seo(post_id: <id>)를 호출하여 점수를 검색하고 최소 목표(80%)를 확인합니다.
  2. 점수 < 80%인 경우: 보고된 문제(누락된 메타 설명, 밀도 오류 등)를 해결하고 점수가 목표 범위에 도달할 때까지 다시 감사합니다.
  3. 최종 보고서 제공: 대상 URL, 최종 SEO 점수, 카테고리, 초점 키워드, 로드된 이미지 수, 사용된 내부 링크, 최종 단어 수.

페이지 관리 워크플로우

리드 마그넷 페이지 생성 (save_page)

목적: PDF 체크리스트, 가이드, 템플릿과 같은 프리미엄 자산에 대한 전환 랜딩 페이지.

  • title: 가치 제안 포함 (예: "[무료] 체크리스트 발달 이정표 2-7세").
  • slug: 키워드 관련.
  • page_role: 'lead_magnet'.
  • lead_magnet_type: 정확한 다운로드 가능 자산 이름.
  • content: 간결하고 혜택 중심. 많은 텍스트 블록 없음. 위험 최소화와 가치 극대화에 초점.
  • excerpt: 짧은 가치 제안.

정적 법적 페이지 생성 (save_page)

목적: 개인정보처리방침, 이용약관, 면책 조항.

  • page_role: 각각 'privacy_policy', 'terms_of_service', 'disclaimer'.
  • content: 완전하고 법적으로 규정을 준수하는 텍스트. 헤드리스 프론트엔드는 이러한 페이지에 대해 특별히 엄격한 템플릿을 적용합니다 (예: 푸터 보안 배지, 포괄적인 머리말).

문제 해결 가이드

MCP 오류: 타임아웃

  • WordPress config.yaml에서 timeout: 180 (3분)을 확인하십시오.
  • WordPress가 데이터 저장소 역할만 하는지 확인하십시오: generate_featured_image: true를 보내지 마십시오; 대신 이미지를 업로드한 후 featured_media_id를 사용하십시오.

MCP 오류: 인증 실패

  • MCP_SAYOTI_CMS_KEY가 .env 파일에서 내보내졌는지 확인하십시오.
  • 9Router 호출 시 NINEROUTER_API_KEY의 철자가 올바른지 확인하십시오.

벡터 검색 오류

  • sayoti_mcp_settings 페이지의 WordPress 관리자에서 embedding_status가 enabled로 설정되어 있는지 확인하십시오.
  • 필요한 모델(local/nomic-embed-text)이 설치되어 있는지 확인하십시오.

이미지 생성 실패

  • 힌트: "캔버스에 텍스트나 워터마크를 포함하지 마십시오."를 프롬프트에 추가하여 anti_text_rule을 적용합니다.
  • image_generate가 공식 브랜드 16진수 색상과 일치하는지 확인합니다.

배포 체크리스트

  • sayoti-content-engine가 WordPress에 설치 및 활성화되었습니까?
  • sayoti-headless-bridge가 WordPress에 설치 및 활성화되었습니까?
  • MCP_SAYOTI_CMS_KEY가 $HERMES_HOME/.env에 설정되었습니까?
  • NINEROUTER_API_KEY가 $HERMES_HOME/.env에 설정되었습니까?
  • embedding_status가 WordPress 관리자에서 enabled로 설정되었습니까?
  • config.yaml의 mcp_servers.sayoti-cms.timeout이 180으로 설정되었습니까?
  • 기본 탐색 메뉴가 시드되었습니까? (Appearance > Menus에서 확인)
  • Next.js ISR 웹훅이 WordPress에서 구성되었습니까?

보안 참고 사항

제로 시크릿 누출 정책

  • 자격 증명을 코드나 구성에 하드코딩하지 마십시오.
  • 모든 민감한 값은 환경 변수를 통해 주입해야 합니다.
  • 정기적으로 HERMES_HOME/.env 권한을 감사하십시오 (읽기 전용 600 권장).

API 키 순환

  • MCP_SAYOTI_CMS_KEY를 정기적으로 교체하고 WordPress sayoti_mcp_settings 페이지에서 업데이트하십시오.
  • 교체 후 모든 에이전트 인스턴스가 새 키로 업데이트되었는지 확인하십시오.

관련 스킬