브랜드 보이스
브랜드가 이미 말하고 있는 것과 고객이 이미 반응하는 것을 바탕으로 구축된 보이스 가이드입니다. 보이스는 모든 곳에서 동일하게 유지되는 성격입니다. 톤은 그 성격이 순간에 따라 어떻게 조정되는지 보여줍니다: 검색 광고, 사과, 밤 11시에 글을 쓰는 걱정하는 고객 등. 스타일은 둘 다 반복 가능하게 만드는 작은 규칙의 집합입니다. 이 스킬은 세 가지를 모두 문서화하고, 각 선택을 브랜드 자체 카피, 클릭 결과, 고객의 말, 라이벌이 남긴 격차에 근거합니다.
또한 웹사이트 메시징 감사(7단계 이후)라는 모드를 단독으로 실행합니다. 이 모드는 사이트의 주요 페이지를 함께 읽고 광고와 일관된 하나의 스토리를 전달하는지 확인한 다음, 트래픽에 따라 수정 사항의 우선순위를 매깁니다.
시작하기 전에
브랜드 자체 카피의 소스(Google Ads 또는 Meta 광고 계정, Facebook 페이지, Instagram 또는 LinkedIn 페이지, 또는 DataForSEO가 읽을 수 있는 웹사이트)가 하나 이상 연결된 InsightfulPipe MCP가 필요합니다. 이 중 어느 것도 없다면 마지막의 "연결 없이"를 사용하세요.
request="accounts"로query_contexts를 호출하여google-ads,facebook-ads,facebook-pages,instagram-profile,linkedin-pages,google-search-console및dataforseo에 대해 실행합니다.workspace_id, 각 행의 고유한brand_id(한 비즈니스의 계정이 다른 브랜드 아래에 있을 수 있음), 계정, 페이지, 사이트 또는 조직 ID를 기록합니다. 에이전시 워크스페이스에서 이 가이드가 대상으로 하는 비즈니스를 묻고 해당 비즈니스의 계정만 읽습니다.- 아래 "호출"의 모든 읽기에 대해
request="actions_details"로query_contexts를 호출하고, "쿼리 실행 방법"에 나열된 예외를 제외하고 반환된 본문 형태를 따릅니다. - 사용자에게 물어보고, 사용자가 모를 경우 기본값을 사용합니다:
- 한 줄로 된 브랜드: 무엇을 하고 누구를 위한 것인지. 기본값: 광고와 페이지에서 추론하며, 추론임을 명시합니다.
- 마음에 드는 카피와 잘못되었다고 느껴지는 카피. 각각 두세 가지 예시, 자신의 것이든 다른 사람의 것이든. 선택 사항이며, 물어볼 가치가 있습니다: 잘못되었다고 느껴지는 것은 옳다고 느껴지는 것만큼 유용합니다.
- 브랜드가 지지하고 반대하는 것. 브랜드가 말하는 방식을 형성하는 두세 가지 신념(예: "사람들은 정직한 답변을 받을 자격이 있다"). 선택 사항. 기본값: 제공되지 않으며, 기둥은 증거에만 기반합니다. 그렇게 명시합니다.
- 경쟁사. 2~5개의 이름 또는 도메인. 기본값: Google에서 브랜드의 상위 두 비브랜드 검색 테마(5단계)에 대해 나타나는 비즈니스.
- 이미 존재하는 규칙: 스타일 가이드, 금지된 단어, 주장에 대한 법적 또는 규제 제한(법률, 건강, 금융, 주류). 기본값: 없으나 모든 최상급은 여전히 플래그가 지정됩니다(6단계).
- 카피가 사용되는 곳: 가이드가 다루어야 할 채널. 기본값: 1단계에서 찾은 채널과 웹사이트 및 이메일.
웹사이트 메시징 감사만의 경우, 1단계에서 google-analytics 및 crawler도 조회하고 위 목록 대신 해당 모드의 자체 질문("모드: 웹사이트 메시징 감사" 참조)을 물어봅니다.
기간. 광고, 게시물 및 검색어: 최근 90일 전체. 보고서 상단에 날짜를 명시합니다.
쿼리 실행 방법
모든 읽기는 명명된 플랫폼으로 query_data를 통해 이루어집니다. 이 스킬은 execute_action을 호출하지 않습니다. 라이브 실행에서 발견된 규칙:
- Google Ads 날짜.
DURING LAST_90_DAYS는 거부됩니다.segments.date BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD'를 사용하세요. - Meta Ads는 중첩 필드를 거부합니다.
creative{title,body}가 포함된get_ads는 거부됩니다. 일반creative필드를 요청하면 creative ID가 반환되므로get_ad_creatives로 텍스트를 읽으세요. 삭제된 광고는 인사이트에는 여전히 표시되지만get_ads에는 없습니다. 해당 광고는 제외하고 개수에 포함하지 마세요. - 일부 사이트는 자동화된 리더를 거부합니다. 빌드 실행에서 클라이언트 사이트가 403을 응답했고
onpage_content_parsing이 0개 항목(오류 없음)을 반환했습니다. 이런 경우 5단계 검색에서 브랜드 페이지의 Google 자체 제목과 스니펫에서 페이지 보이스를 읽고, 사용자에게 한두 개의 주요 페이지를 붙여넣도록 요청하고, 사용한 것을 명시하세요. - SEO 크롤러가 다운될 수 있습니다. 2026-10-06에 모든 크롤러 작업이 제어 사이트에서도
Error fetching URL을 반환했습니다. 페이지 텍스트에는 DataForSEO를 사용하고content-quality-checker와brand-extractor는 선택적 추가 기능으로 취급하세요. 2026-10-30에는 크롤러가 다시 작동했고brand-extractor가 색상, 글꼴 및 버튼을 반환했습니다. - 광고 라이브러리가 다운될 수 있습니다. 같은 날
google_company_ads와google_search_advertisers가 매우 큰 광고주에 대해서도 비어 있는 결과를 반환했고facebook_search_companies는 연결 재설정으로 실패했습니다. 광고 라이브러리의 경쟁사 광고는 빌드 실행에서 테스트되지 않았습니다. 대신 Google 결과(5단계)에서 경쟁사 보이스를 가져옵니다. - LinkedIn 페이지는 재연결이 필요할 수 있습니다. 호출이 "LinkedIn 페이지를 다시 연결해 주세요"를 반환하면 LinkedIn을 건너뛰고 그렇게 말한 후 계속 진행하세요. LinkedIn 읽기는 연결될 때까지 테스트되지 않았습니다.
- Search Console은 쿼리 전용 풀을 1,000행으로 제한합니다. 어휘에는 충분합니다. 목록이 상위 1,000개임을 명시하세요.
- DataForSEO는 비용이 듭니다. 대상이 다른 곳이 아니라면
location_code2840 및language_codeen을 사용하세요. 실행을 6회 호출로 유지하세요: 최대 3회 페이지 읽기와 2~3회 검색. 가장 많이 방문한 페이지를 먼저 읽으세요. 0개 항목이 반환되면 사이트가 리더를 거부하는 것이므로 다른 페이지 비용을 지불하지 마세요. 웹사이트 메시징 감사에는 자체 예산이 있습니다: 페이지당 한 번의 페이지 읽기, 실행 전에 명시됨(W1). - 웹사이트 메시징 감사 호출은 2026-10-30에 테스트되었습니다.
landingPage별 GA4get_report는 페이지당 세션 및 주요 이벤트를 반환했습니다. 페이지 및 쿼리별 Search Consolesearch_analytics는 전체row_limit인 5,000행을 반환했습니다. 크롤러 검사는 리더를 허용하는 사이트에서 작동했으며brand-extractor는 버튼 레이블을 반환했습니다. 자동화된 리더를 거부하는 사이트에서 크롤러는 오류를 제공하지 않습니다:meta-tags-checker는title_tag_count0을 반환하고headings-checker는no_headings를 반환합니다. 이를 "읽을 수 없음"으로 처리하고, 누락된 제목이나 H1으로 절대 처리하지 마세요. 브랜드에 DataForSEO 연결이 두 개 이상 있는 경우 페이지 읽기에account_id를 추가하세요. - 호출 속도를 조절하세요. 2초에 한 번 이상 호출을 보내지 마세요. 재시도 시간과 함께 호출이 거부되면 해당 시간만큼 기다렸다가 한 번 재시도하세요.
호출이 실패하면 계속 진행하세요. 해당 소스를 알 수 없음으로 표시하고, 어떤 호출이 실패했고 그 이유를 말하고, 추측으로 빈칸을 채우지 마세요.
호출
Google Ads: 자체 클릭이 있는 모든 헤드라인과 설명
{"platform": "google-ads", "action": "gaql", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "account_id": "<CUSTOMER_ID>",
"query": "SELECT campaign.name, ad_group_ad_asset_view.field_type, ad_group_ad_asset_view.performance_label, asset.text_asset.text, metrics.impressions, metrics.clicks, metrics.conversions FROM ad_group_ad_asset_view WHERE segments.date BETWEEN '<START>' AND '<END>' AND ad_group_ad_asset_view.field_type IN ('HEADLINE', 'DESCRIPTION') AND campaign.status = 'ENABLED' AND ad_group_ad_asset_view.enabled = TRUE AND metrics.impressions > 0 ORDER BY metrics.impressions DESC LIMIT 1000"}
Google Ads: 광고와 사람들을 보내는 곳
{"platform": "google-ads", "action": "gaql", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "account_id": "<CUSTOMER_ID>",
"query": "SELECT campaign.name, ad_group.name, ad_group_ad.ad.id, ad_group_ad.ad.responsive_search_ad.headlines, ad_group_ad.ad.responsive_search_ad.descriptions, ad_group_ad.ad.final_urls, ad_group_ad.ad_strength, metrics.impressions, metrics.clicks, metrics.conversions FROM ad_group_ad WHERE segments.date BETWEEN '<START>' AND '<END>' AND ad_group_ad.status = 'ENABLED' AND campaign.status = 'ENABLED' AND ad_group_ad.ad.type = 'RESPONSIVE_SEARCH_AD' AND metrics.impressions > 0 ORDER BY metrics.impressions DESC LIMIT 50"}
가장 많은 노출수를 가진 최종 URL은 1단계에서 읽을 페이지입니다.
Google Ads: 계정의 총 노출수 및 클릭수(검색어 보고서가 얼마나 많은 부분을 다루는지 명시하기 위해)
{"platform": "google-ads", "action": "gaql", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "account_id": "<CUSTOMER_ID>",
"query": "SELECT metrics.impressions, metrics.clicks FROM customer WHERE segments.date BETWEEN '<START>' AND '<END>'"}
Google Ads: 고객이 검색하는 단어
{"platform": "google-ads", "action": "search_terms_report", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "account_id": "<CUSTOMER_ID>", "start_date": "<START>", "end_date": "<END>", "limit": 5000}
Meta Ads: 어떤 광고가 실행되었는지, 그 다음 텍스트
{"platform": "facebook-ads", "action": "get_insights_adaccount", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "ad_account_id": "act_<ID>", "level": "ad", "fields": ["ad_id", "ad_name", "impressions", "inline_link_clicks", "inline_link_click_ctr", "spend"], "time_range": {"since": "<START>", "until": "<END>"}}
{"platform": "facebook-ads", "action": "get_ads", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "ad_account_id": "act_<ID>", "fields": ["id", "name", "status", "creative"]}
{"platform": "facebook-ads", "action": "get_ad_creatives", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "ad_account_id": "act_<ID>", "fields": ["id", "name", "title", "body", "object_story_spec"]}
광고 → creative ID → body(기본 텍스트) 및 title(헤드라인)을 일치시킵니다. 기본 텍스트는 object_story_spec.link_data.message에도 있을 수 있습니다.
Facebook 페이지 게시물
{"platform": "facebook-pages", "action": "get_posts", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "page_id": "<PAGE_ID>", "fields": ["id", "message", "created_time", "permalink_url", "status_type", "shares"], "since": "<START>", "until": "<END>", "limit": 50}
{"platform": "facebook-pages", "action": "get_post_insights", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "page_id": "<PAGE_ID>", "post_id": "<POST_ID>", "metrics": ["post_media_view", "post_clicks", "post_reactions_by_type_total"], "period": "lifetime"}
get_posts는 도우미가 나열하더라도 likes.summary(true)와 같은 중첩 필드를 거부하므로 이러한 호출은 댓글 수를 반환하지 않습니다. shares는 게시물에서 누락될 수 있습니다(빌드 실행에서 읽은 페이지의 모든 게시물에서 누락되었습니다). 누락된 필드는 0으로 계산하세요. 게시물당 하나의 인사이트 호출; 최근 게시물 30개까지만 읽습니다.
Instagram 게시물
{"platform": "instagram-profile", "action": "get_media", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "account_id": "<INSTAGRAM_USER_ID>", "fields": "id,caption,media_type,media_product_type,permalink,timestamp,comments_count,like_count", "limit": 50}
LinkedIn 페이지 게시물(연결될 때까지 테스트되지 않음)
{"platform": "linkedin-pages", "action": "fetch_organization_posts", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "org_id": "<ORG_ID>", "count": 50}
Search Console: 사람들이 사이트를 찾는 방법
{"platform": "google-search-console", "action": "search_analytics", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "site_url": "<SITE_URL>", "dimensions": ["query"], "start_date": "<START>", "end_date": "<END>", "row_limit": 1000}
페이지 텍스트(DataForSEO, 페이지당 한 번의 유료 호출)
{"platform": "dataforseo", "action": "onpage_content_parsing", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "url": "<PAGE_URL>"}
텍스트는 page_content.main_topic에 있습니다: 각 블록에는 h_title, level 및 primary_content[].text가 있습니다. 홈페이지와 광고가 가장 많은 사람들을 보내는 한두 페이지를 읽습니다.
Google의 경쟁사 및 브랜드 자체 스니펫(DataForSEO, 검색당 한 번의 유료 호출)
{"platform": "dataforseo", "action": "serp_google_organic", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "keyword": "<TOP_NON_BRAND_THEME>", "location_code": 2840, "language_code": "en", "depth": 20}
선택적 추가 기능
{"platform": "crawler", "action": "content-quality-checker", "workspace_id": "<WORKSPACE_ID>", "url": "<PAGE_URL>"}
{"platform": "crawler", "action": "brand-extractor", "workspace_id": "<WORKSPACE_ID>", "url": "<HOMEPAGE_URL>"}
content-quality-checker는 가독성과 단어 수를 추가합니다. brand-extractor는 가이드의 시각적 정체성 라인을 위한 색상, 글꼴 및 버튼을 추가합니다. 경쟁사 광고: 경쟁사의 page_id로 facebook_search_companies를 호출한 후 facebook_company_ads를 호출하거나, 경쟁사의 domain으로 google_company_ads(ads-libraries)를 호출합니다.
웹사이트 메시징 감사를 위한 호출
GA4: 방문이 시작되는 페이지(주요 이벤트 포함)
{"platform": "google-analytics", "action": "get_report", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "property_id": "properties/<PROPERTY_ID>", "dimensions": ["landingPage"], "metrics": ["sessions", "keyEvents"], "start_date": "<START>", "end_date": "<END>"}
랜딩 페이지별 세션은 진입점입니다: 해당 페이지에서 시작된 방문.
Search Console: 각 페이지가 발견되는 쿼리
{"platform": "google-search-console", "action": "search_analytics", "workspace_id": "<WORKSPACE_ID>", "brand_id": "<BRAND_ID>", "site_url": "<SITE_URL>", "dimensions": ["page", "query"], "start_date": "<START>", "end_date": "<END>", "row_limit": 5000}
크롤러: 한 페이지의 제목, 메타 설명, 헤딩 및 버튼 레이블(무료 크레딧)
{"platform": "crawler", "action": "meta-tags-checker", "workspace_id": "<WORKSPACE_ID>", "url": "<PAGE_URL>"}
{"platform": "crawler", "action": "headings-checker", "workspace_id": "<WORKSPACE_ID>", "url": "<PAGE_URL>"}
{"platform": "crawler", "action": "brand-extractor", "workspace_id": "<WORKSPACE_ID>", "url": "<PAGE_URL>"}
버튼 레이블은 brand-extractor의 primaryButton.text 및 buttons[].text에 있습니다. 두 크롤러 검사 모두 비어 있는 경우(title_tag_count 0 및 no_headings) 사이트가 크롤러를 거부한 것입니다: 페이지 텍스트에서 제목, 헤드라인 및 레이블을 가져오거나 붙여넣기를 요청하세요.
페이지 본문 텍스트: DataForSEO onpage_content_parsing 호출입니다(위 "페이지 텍스트" 참조). 이 감사 모드는 모든 페이지에 대해 이 호출을 필요로 합니다.