Skip to main content
Glama
2duckchun

naver-ads-mcp

by 2duckchun

naver-ads-mcp

네이버 검색광고 API를 감싼 stdio MCP 서버. 캠페인·광고그룹·키워드·소재 구조와 성과 지표를 MCP 클라이언트(Claude Code, Claude Desktop 등)에서 바로 조회합니다.

현재 범위는 조회 전용입니다. 생성·수정·삭제 툴은 아직 노출하지 않습니다.

요구 사항

  • Node.js 20 이상

  • 네이버 검색광고 API 라이선스 — 광고시스템 > 도구 > API 사용 관리에서 발급 (무료)

Related MCP server: Google Ads MCP Server

빠른 시작

이 저장소에서 바로 받아 씁니다. 별도 설치 단계는 없고, MCP 클라이언트가 알아서 프로세스를 띄웁니다.

npx -y github:2duckchun/naver-ads-mcp --help

특정 브랜치나 태그를 물리려면 #을 붙입니다.

npx -y github:2duckchun/naver-ads-mcp#v0.1.0 --help

환경변수

MCP 클라이언트 설정의 env로 넘깁니다(아래 등록 예시 참고). 로컬에서 소스를 직접 돌릴 때는 .env.example을 복사해 씁니다.

변수

필수

기본값

설명

NAVER_SA_API_KEY

액세스라이선스

NAVER_SA_SECRET_KEY

비밀키

NAVER_SA_CUSTOMER_ID

광고계정 ID (숫자)

NAVER_SA_BASE_URL

https://api.searchad.naver.com

API 베이스 URL

NAVER_SA_TIMEOUT_MS

15000

요청 타임아웃

NAVER_SA_MAX_RETRIES

2

429·5xx·네트워크 오류 재시도 횟수

값이 비었거나 형식이 틀리면 기동 시 어떤 변수가 문제인지 한 번에 stderr로 출력하고 종료합니다.

MCP 클라이언트 등록

Claude Code

claude mcp add naver-ads \
  --env NAVER_SA_API_KEY=... \
  --env NAVER_SA_SECRET_KEY=... \
  --env NAVER_SA_CUSTOMER_ID=... \
  -- npx -y github:2duckchun/naver-ads-mcp

Claude Desktop (claude_desktop_config.json)

{
  "mcpServers": {
    "naver-ads": {
      "command": "npx",
      "args": ["-y", "github:2duckchun/naver-ads-mcp"],
      "env": {
        "NAVER_SA_API_KEY": "...",
        "NAVER_SA_SECRET_KEY": "...",
        "NAVER_SA_CUSTOMER_ID": "..."
      }
    }
  }
}

로컬 클론을 직접 물리려면 commandnode, args["/절대경로/naver-ads-mcp/dist/index.js"]로 바꾸면 됩니다.

모두 readOnlyHint가 붙은 조회 전용입니다. 각 툴은 customerId를 선택 인자로 받아 호출 단위로 광고계정을 바꿀 수 있습니다(대행사 계정용).

엔드포인트

용도

list_campaigns

GET /ncc/campaigns

캠페인 목록

get_campaign

GET /ncc/campaigns/{id}

캠페인 단건

list_adgroups

GET /ncc/adgroups

광고그룹 목록

get_adgroup

GET /ncc/adgroups/{id}

광고그룹 단건

get_adgroup_targets

GET /ncc/adgroups/{id}/targets

요일·시간, 지역, 매체 타게팅

list_keywords

GET /ncc/keywords

키워드 목록·입찰가

get_keyword

GET /ncc/keywords/{id}

키워드 단건

get_related_keywords

GET /keywordstool

연관 키워드·월간 검색량

list_ads

GET /ncc/ads

광고 소재 목록

get_ad

GET /ncc/ads/{id}

광고 소재 단건

list_ad_extensions

GET /ncc/ad-extensions

확장 소재

get_stats

GET /stats

성과 지표

list_business_channels

GET /ncc/channels

비즈채널

list_customer_links

GET /customer-links

연결된 광고계정

naver_ads_get

(임의 GET)

전용 툴이 없는 엔드포인트용 탈출구

get_statsidsnccCampaignId / nccAdgroupId / nccKeywordId / nccAdId를 섞어 받고, 기간은 since+until 또는 datePreset 중 하나로 지정합니다. 둘 다 생략하면 네이버 기본 기간이 적용됩니다. breakdown으로 PC/모바일·요일·시간대·지역별 분해가 가능합니다.

/statsids콤마 조인으로, fieldsJSON 배열로 받습니다. 한쪽 형식을 반대로 보내면 전체가 400입니다(ids유효하지 않은 ID 형식입니다, fieldsfields 파라미터 파싱 실패). 이 비대칭은 src/tools/__tests__/stats.test.ts로 고정해 두었습니다.

인증 방식

네이버 검색광고 API는 요청마다 HMAC 서명을 요구합니다.

X-Timestamp: {epoch milliseconds}
X-API-KEY:   {액세스라이선스}
X-Customer:  {광고계정 ID}
X-Signature: base64(HMAC-SHA256(secretKey, "{timestamp}.{METHOD}.{path}"))

서명 대상 경로에는 쿼리스트링이 들어가지 않습니다. /stats?ids=...를 호출해도 서명에는 /stats만 씁니다. 이 규칙은 src/naver/signature.ts에 격리되어 있고 단위 테스트로 고정되어 있습니다.

서버 시각이 네이버와 수 분 이상 어긋나면 403이 납니다.

구조

src/
├── index.ts              진입점 — 설정 로드, serveStdio, 시그널 처리
├── server.ts             McpServer 조립
├── config.ts             환경변수 zod 검증
├── naver/
│   ├── signature.ts      HMAC 서명 + 인증 헤더
│   ├── client.ts         서명된 HTTP 클라이언트 (쿼리 직렬화·재시도·타임아웃)
│   └── errors.ts         NaverAdsApiError / NaverAdsTransportError
├── tools/
│   ├── define.ts         registerReadTool — 조회 툴 등록 헬퍼
│   ├── shared.ts         공통 인자·enum
│   └── *.ts              도메인별 툴
└── utils/result.ts       CallToolResult 직렬화

툴 추가하기

registerReadTool이 읽기 힌트·JSON 직렬화·에러 변환을 처리하므로, 툴 파일에는 "무엇을 어떤 인자로 부르는가"만 남습니다.

registerReadTool(server, {
  name: 'list_labels',
  title: '라벨 목록 조회',
  description: '광고계정에 등록된 라벨을 조회합니다. ...',
  inputSchema: z.object({ customerId: customerIdArg }),
  run: ({ customerId }) => client.get('/ncc/labels', undefined, { customerId }),
});

src/tools/index.tsregisterAllTools에 등록 함수를 추가하면 끝입니다.

에러 처리 방침

네이버 API 오류는 예외로 던지지 않고 isError: true 툴 결과로 내려보냅니다. 프로토콜 오류로 던지면 모델이 원인을 보지 못해 스스로 교정할 수 없기 때문입니다. 결과에는 status·code·title·detail과 문의용 transactionId, 그리고 상태 코드별 조치 힌트가 함께 들어갑니다.

stdout 규칙

stdout은 JSON-RPC 전용입니다. 로그는 반드시 stderr로 보내야 하며, Biome의 suspicious/noConsole 규칙을 error로 올려 실수를 막고 있습니다.

개발

git clone https://github.com/2duckchun/naver-ads-mcp.git
cd naver-ads-mcp
pnpm install
cp .env.example .env   # 발급받은 키 입력
pnpm dev            # tsx로 직접 실행 (.env 있으면 자동 로드)
pnpm build          # dist/ 재생성
pnpm test           # vitest
pnpm lint           # biome check (린트 + 포맷 + import 정렬)
pnpm lint:fix       # 자동 수정
pnpm check          # typecheck + lint + test
pnpm inspect        # MCP Inspector로 툴 확인 (pnpm build 후)

dist 는 저장소에 커밋됩니다

빌드 산출물 dist/ 를 추적하고, 설치 시점에 빌드하던 prepare 스크립트는 두지 않습니다. 설치 경로가 빌드 툴체인에 의존하지 않게 하려는 것입니다.

그래서 src/ 를 고쳤으면 pnpm builddist/ 도 함께 커밋해야 합니다. CI 가 pnpm build 를 돌린 뒤 git diff --exit-code -- dist 로 어긋남을 막습니다.

설치 경로별 동작

node 22 / npm 10.9.8 기준으로 확인했습니다.

방법

결과

npx -y github:2duckchun/naver-ads-mcp

정상

npm install github:2duckchun/naver-ads-mcp (로컬)

정상

git clonenpm packnpm install -g <tarball>

정상

npm install -g github:2duckchun/naver-ads-mcp

깨짐 — 아래 참고

npm install -g 에 git 주소를 직접 주면 npm 이 전역 node_modules 항목을 npm 캐시 안의 임시 클론 디렉터리(_cacache/tmp/git-clone*)로 심링크합니다. 그 디렉터리는 설치 직후 지워지므로 링크가 끊기고, 종료코드는 0인데 실행파일은 없는 상태가 됩니다.

이건 이 패키지에 국한된 문제가 아닙니다. 무관한 저장소(github:isaacs/rimraf)도 -g 로는 실패합니다(이쪽은 exit 127). npm 10.x 의 git 스펙 + -g 조합 문제로 보이며, dist 를 커밋해도 이 경로는 살아나지 않습니다.

Docker 이미지에 넣는다면 tarball 경로를 쓰세요. dist 가 커밋되어 있으므로 클론에 빌드 툴체인이 필요 없고, 설치 후 클론을 지워도 실행파일이 남습니다.

RUN git clone --depth 1 --branch v0.1.0 \
      https://github.com/2duckchun/naver-ads-mcp.git /src \
 && cd /src && npm install -g "$(npm pack | tail -1)" \
 && rm -rf /src

알려진 제약

  • get_statstimeIncrement: '1'(일별 추이)은 /stats에서 "지원하지 않는 기능입니다"(400)로 거부될 수 있습니다. 일별 데이터는 대용량 리포트(/stat-reports) 쪽 기능입니다.

  • get_statsbreakdown최근 7일 이내 기간에서만 동작합니다. 더 긴 기간과 함께 쓰면 400입니다.

  • list_customer_links대행사(매니저) 계정 전용입니다. 일반 광고주 계정으로 부르면 본문 없는 404가 돌아옵니다.

  • 목록 조회 툴의 선택 파라미터는 확실한 것만 노출했습니다. 페이지네이션(baseSearchId, recordSize)이나 selector 같은 파라미터가 필요하면 naver_ads_get으로 우회하세요.

  • 응답은 타입 없이 그대로 통과시킵니다. 도메인 타입은 필요한 시점에 붙이는 편이 낫다고 판단했습니다.

다음 단계 후보

  • 쓰기 툴 (POST/PUT/DELETE) — NAVER_SA_ALLOW_WRITE 같은 안전장치와 함께

  • 대용량 리포트 (/stat-reports, /master-reports) — 잡 생성 → 폴링 → 다운로드

  • 입찰가 추정 (/estimate/*)

  • 자주 쓰는 분석 절차를 MCP Prompt로 제공

참고

Available Tools

15 tools
get_ad광고 소재 단건 조회B
Read-onlyIdempotent

nccAdId로 광고 소재 하나의 상세 정보를 조회합니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
adIdYesnccAdId
customerIdNo조회할 광고계정 CUSTOMER_ID. 생략하면 NAVER_ADS_CUSTOMER_ID를 사용합니다.

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is fully covered by structured data. The description adds nothing beyond that — it does not explain rate limits, auth requirements, or what '상세 정보' includes, so it contributes no behavioral context of its own.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence with no filler, and the identifying parameter is front-loaded. It is efficiently sized for a simple lookup tool, though it is so terse that it conveys little beyond the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter read tool with rich annotations and a complete schema, the description is minimally sufficient — the schema handles the customerId fallback and there is no output schema to explain. However, it gives no sense of what fields the returned detail contains, leaving the agent to infer the value of calling it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the schema already documents both adId (nccAdId) and the optional customerId with its fallback to NAVER_ADS_CUSTOMER_ID. The description only restates the identifier concept, adding no syntax or format detail beyond the schema, which matches the baseline 3 for fully-documented schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (조회) and resource (광고 소재) plus the single-record scope ('하나의'), which implicitly separates it from the sibling list_ads. It stops short of explicitly naming that alternative, so it is clear but not fully differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The word '단건' (single) plus the required nccAdId implies this is the lookup-by-id tool rather than the listing tool, but there is no explicit statement of when to use it versus list_ads or get_campaign/get_adgroup, and no prerequisites are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_adgroup광고그룹 단건 조회C
Read-onlyIdempotent

nccAdgroupId로 광고그룹 하나의 상세 정보를 조회합니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
adgroupIdYesnccAdgroupId (예: grp-a001-01-000000012345678)
customerIdNo조회할 광고계정 CUSTOMER_ID. 생략하면 NAVER_ADS_CUSTOMER_ID를 사용합니다.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered. The description adds no behavioral context beyond that (no auth/permission notes, no behavior when the adgroup is missing).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero waste. It is efficient, though this brevity is what leaves the usage and behavioral gaps.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple annotated read tool the coverage is adequate, but with no output schema the description says only '상세 정보' without indicating what the detail comprises, leaving the return shape entirely unspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented, including the customerId fallback to NAVER_ADS_CUSTOMER_ID. The description merely repeats the nccAdgroupId identifier and adds no syntax or format detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (조회/retrieve), resource (광고그룹/adgroup) and cardinality (하나의, single), which implicitly separates it from list_adgroups. It does not, however, name or contrast any sibling tool explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The singular '하나의' hints at single-record lookup versus a list call, but there is no explicit when-to-use, no prerequisites, and no mention of alternatives such as list_adgroups or get_adgroup_targets.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_adgroup_targets광고그룹 타게팅 조회B
Read-onlyIdempotent

광고그룹에 설정된 타게팅(요일·시간, 지역, 매체, PC/모바일 등)을 조회합니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
adgroupIdYesnccAdgroupId
customerIdNo조회할 광고계정 CUSTOMER_ID. 생략하면 NAVER_ADS_CUSTOMER_ID를 사용합니다.

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered. The description adds useful behavioral context by enumerating which targeting categories are returned. It does not, however, say what happens when no targeting is configured (empty result vs. error), which would be genuinely additive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with the verb and resource up front and no filler. The parenthetical enumeration is compact and informative. Not padded, though it does not use the space to add usage or behavioral detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-parameter read tool with rich annotations but no output schema, the description supplies the key missing piece: what targeting fields the response contains. An agent has enough to invoke it correctly. Optional gaps (empty-targeting behavior, ordering/nesting of results) remain, keeping it from a 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and both parameters carry their own descriptions, including the customerId fallback to NAVER_ADS_CUSTOMER_ID. The description adds no parameter-level detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb (조회합니다) and a clearly bounded resource (광고그룹에 설정된 타게팅), and it even enumerates the targeting dimensions covered (요일·시간, 지역, 매체, PC/모바일). This makes it easy to distinguish from generic siblings like get_adgroup. It does not explicitly name a sibling it is not, so it falls just short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to use this tool versus alternatives, nor any prerequisite or exclusion guidance. The read-only nature is only inferable from the annotations and the verb '조회합니다'. An agent gets no routing help for the many list_*/get_* siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_campaign캠페인 단건 조회B
Read-onlyIdempotent

nccCampaignId로 캠페인 하나의 상세 정보를 조회합니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
campaignIdYesnccCampaignId (예: cmp-a001-01-000000001234567)
customerIdNo조회할 광고계정 CUSTOMER_ID. 생략하면 NAVER_ADS_CUSTOMER_ID를 사용합니다.

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered structurally. The description contributes nothing beyond the purpose sentence — no note on what happens when the campaignId is unknown, what account context is used, or rate/scope caveats.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence with the identifier front-loaded and zero filler. It is efficient, though with only one sentence there is no structure or prioritization to speak of.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read tool with full annotation coverage and complete schema docs, this is sufficient to invoke correctly. However, with no output schema present, the description could have sketched what '상세 정보' comprises; that omission keeps it at minimum-viable rather than complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (campaignId, customerId) are already documented with format hints, including the fallback to NAVER_ADS_CUSTOMER_ID. The description only echoes nccCampaignId and adds no syntax or constraint detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb (조회합니다 / retrieve) and resource (캠페인 하나 / a single campaign) and keys it on nccCampaignId. It is clearly distinguishable from the sibling list_campaigns by virtue of the singular scope, though it never names that alternative explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: the singular '하나의' and the sibling pair list_campaigns/get_campaign make the select-single-record intent inferable. There is no statement of when to prefer this over list_campaigns, no prerequisite or error-condition guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_keyword키워드 단건 조회B
Read-onlyIdempotent

nccKeywordId로 키워드 하나의 상세 정보를 조회합니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
keywordIdYesnccKeywordId (예: nkw-a001-01-000000123456789)
customerIdNo조회할 광고계정 CUSTOMER_ID. 생략하면 NAVER_ADS_CUSTOMER_ID를 사용합니다.

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered. The description adds nothing behavioral beyond that — no note on what happens when the keywordId is unknown, no permission/account-scoping caveat despite customerId defaulting to an env var.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler or redundancy. It is appropriately sized, though it is perhaps too terse to earn a 5 given the gaps noted above.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-entity read tool with rich annotations and no output schema, the description is adequate — the agent knows exactly what is fetched and by which key. It lacks only error/not-found behavior, which is a minor omission.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both keywordId (with an example value) and customerId (with its env-var fallback) are already fully documented in the schema. The description merely restates the lookup key, adding no format or fallback detail beyond it, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (조회) and a singular resource (키워드 하나) with the lookup key (nccKeywordId), so an agent can distinguish it from list_keywords. It stops short of naming the sibling or clarifying scope beyond the singular/plural naming convention.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use guidance: nothing says to call this when you already hold a keywordId, nor points to list_keywords for discovery. The singular phrasing only implies the distinction, which is the weakest form of guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_stats성과 지표 조회A
Read-onlyIdempotent

캠페인·광고그룹·키워드·소재의 성과 지표를 조회합니다. ids는 종류를 가리지 않고 nccCampaignId / nccAdgroupId / nccKeywordId / nccAdId를 모두 받습니다. since+until과 datePreset 중 하나만 지정하세요. 둘 다 생략하면 네이버 기본 기간이 적용됩니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYes지표를 조회할 대상 ID 목록. 한 번에 최대 100개.
sinceNo조회 시작일 (YYYY-MM-DD). until과 함께 지정합니다.
untilNo조회 종료일 (YYYY-MM-DD). since와 함께 지정합니다.
fieldsNo조회할 지표. impCnt=노출수, clkCnt=클릭수, ctr=클릭률, cpc=클릭당비용, salesAmt=광고비, ccnt=전환수, avgRnk=평균노출순위, drtCrto=직접전환율.
breakdownNo분해 축. pcMblTp=PC/모바일, dayw=요일, hh24=시간대, regnNo=지역.
customerIdNo조회할 광고계정 CUSTOMER_ID. 생략하면 NAVER_ADS_CUSTOMER_ID를 사용합니다.
datePresetNo기간 프리셋. since/until 대신 씁니다.
timeIncrementNoallDays=기간 합계, 1=일별 추이.allDays

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, so safety is covered. The description adds operational context beyond annotations: the ID-type-agnostic behavior and the date-source mutual exclusion with an implicit default, which are non-obvious traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with purpose, then the ID-typing rule, then the date rule. No filler, though slightly terse for English-reading agents given the Korean-only text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the two genuinely ambiguous behaviors (polymorphic ids, mutually exclusive date params with default) for an 8-param read tool. Output format is not described, but the tool is read-only and a consumer can rely on the fields parameter; no output schema exists, so a brief return-shape note would have closed the last gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description still adds value by describing ids' polymorphic acceptance and the since/until vs datePreset constraint that the schema's individual field descriptions do not state as a cross-field rule.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (조회) and the exact resources covered (캠페인·광고그룹·키워드·소재), making it distinguishable from single-resource sibling getters like get_campaign or get_keyword.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly resolves a real ambiguity: only one of since+until or datePreset may be set, and omitting both falls back to NAVER's default period. It also clarifies that ids accepts heterogeneous ID types, removing guesswork about mixing campaign/adgroup/keyword/ad IDs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_ad_extensions확장 소재 목록 조회B
Read-onlyIdempotent

캠페인 또는 광고그룹에 붙은 확장 소재(전화번호, 위치정보, 홍보문구 등)를 조회합니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
ownerIdYes확장 소재를 소유한 nccCampaignId 또는 nccAdgroupId
customerIdNo조회할 광고계정 CUSTOMER_ID. 생략하면 NAVER_ADS_CUSTOMER_ID를 사용합니다.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds that the tool retrieves extension assets attached to a campaign or adgroup, but does not disclose pagination, rate limits, authentication requirements, or return format details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that front-loads the core action and resource without any wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list tool with fully described parameters and annotations covering safety, the description is adequate. It does not explain the return structure, but no output schema exists, and the tool name implies a list. Minor missing detail on possible filtering or pagination.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both parameters fully documented in the input schema. The description adds no parameter-level semantics beyond what the schema already provides, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the verb '조회합니다' (retrieves) and the resource '확장 소재' (extension assets) attached to a campaign or adgroup, listing examples like phone numbers, location info, and promotional text. It implicitly distinguishes from siblings since no other listed tool handles extension assets, but lacks explicit sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus alternatives, nor any mention of prerequisites or exclusions. Usage is only implied from the purpose statement.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_adgroups광고그룹 목록 조회A
Read-onlyIdempotent

캠페인에 속한 광고그룹 목록을 조회합니다. 광고그룹은 입찰가·소재·키워드를 묶는 단위입니다. campaignId를 생략하면 광고계정 전체 광고그룹을 조회합니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
adgroupIdsNo특정 광고그룹만 조회할 때의 nccAdgroupId 목록.
campaignIdNo조회할 캠페인의 nccCampaignId. list_campaigns로 먼저 확인하세요.
customerIdNo조회할 광고계정 CUSTOMER_ID. 생략하면 NAVER_ADS_CUSTOMER_ID를 사용합니다.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, non-destructive behavior, so the safety profile is covered. The description adds genuine context beyond that: the conceptual role of an adgroup and the scoping effect of omitting campaignId. It omits pagination/return-size behavior for a list tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, no waste, with the core action front-loaded. The middle domain-definition sentence earns its place by clarifying the entity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequate for a read-only list tool: annotations cover safety, schema covers all three params with descriptions, and the description covers scoping. Missing only pagination/result-limit guidance, which matters for an unbounded list operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds meaning the schema lacks: the campaignId-omitted default (account-wide) scoping rule. adgroupIds and customerId semantics are left entirely to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (조회/광고그룹 목록) and even defines what an adgroup is, so the agent understands the entity. It does not explicitly distinguish itself from get_adgroup or list_campaigns, so it falls short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives one conditional mode: omitting campaignId returns all adgroups in the account, and campaignId's schema text points to list_campaigns first. However it never says when to use this vs get_adgroup for a single adgroup, nor any prerequisite chain, leaving alternatives implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_ads광고 소재 목록 조회B
Read-onlyIdempotent

광고그룹에 등록된 광고 소재(제목·설명·연결 URL)와 검수 상태를 조회합니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
adgroupIdYes조회할 광고그룹의 nccAdgroupId
customerIdNo조회할 광고계정 CUSTOMER_ID. 생략하면 NAVER_ADS_CUSTOMER_ID를 사용합니다.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered by structured data. The description adds that the read returns title, description, link URL and review status, but does not describe ordering, pagination, or result limits, which is a moderate gap for a list operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single short sentence that front-loads the resource, scope, returned fields and status. Every element earns its place with no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple 2-parameter read tool with full schema coverage, full annotations and no output schema, the description is nearly sufficient. It tells the agent what entity is listed and what data comes back; only list behavior such as pagination or ordering is unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with adgroupId and customerId both documented in the schema, including the fallback to NAVER_ADS_CUSTOMER_ID. The description adds no additional meaning beyond saying the target is an ad group, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (조회합니다) and resource (광고 소재 목록) scoped to an ad group, and lists the returned fields (제목·설명·연결 URL) plus review status. It is clear what the tool does, though it does not explicitly distinguish itself from the sibling get_ad, which likely returns a single ad.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool versus alternatives such as get_ad or other list_* tools. No prerequisites, no when-not-to-use conditions, and no routing hints are present.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_business_channels비즈채널 목록 조회A
Read-onlyIdempotent

광고계정에 등록된 비즈채널(웹사이트, 전화번호, 네이버 톡톡, 쇼핑몰 등)을 조회합니다. 광고그룹이 연결하는 대상입니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
customerIdNo조회할 광고계정 CUSTOMER_ID. 생략하면 NAVER_ADS_CUSTOMER_ID를 사용합니다.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered externally. The description adds only the semantic context that ad groups target these channels — nothing about result volume, pagination, or ordering. Adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with the resource and its enumeration front-loaded, followed by the relational context. No filler, though the second sentence's value is modest given the annotations already frame the operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read-only listing tool with 100% schema coverage and full annotations, the description supplies what is needed to call it correctly; no output schema means return details are not required here. The only gap is the absence of sibling differentiation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single customerId parameter is fully documented in the schema, including the NAVER_ADS_CUSTOMER_ID fallback. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a clear verb (조회) and resource (비즈채널), and enriches it by enumerating concrete channel types (웹사이트, 전화번호, 네이버 톡, 쇼핑몰). It does not distinguish itself from siblings like list_ad_extensions or list_customer_links, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The second sentence ('광고그룹이 연결하는 대상입니다') implies the context in which these channels matter, but there is no explicit when-to-use, no when-not-to-use, and no named alternative among the many listing siblings. Usage is inferable but not guided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_campaigns캠페인 목록 조회A
Read-onlyIdempotent

광고계정의 캠페인 목록을 조회합니다. 캠페인은 파워링크·쇼핑검색·파워컨텐츠 등 광고 유형과 예산을 관리하는 최상위 단위입니다. 반환되는 nccCampaignId는 list_adgroups의 입력값이 됩니다.

ParametersJSON Schema
NameRequiredDescriptionDefault
customerIdNo조회할 광고계정 CUSTOMER_ID. 생략하면 NAVER_ADS_CUSTOMER_ID를 사용합니다.
campaignIdsNo특정 캠페인만 조회할 때의 nccCampaignId 목록. 생략하면 전체를 조회합니다.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so safety and idempotency are covered. The description adds useful domain context (what a campaign is, the linkage to list_adgroups) but does not disclose pagination, rate limits, or return format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences, front-loaded with the core action, then domain definition, then the practical linkage to a sibling tool. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter read tool with 100% schema coverage and full safety annotations, the description is nearly complete. It could add a note about whether results are paginated or ordered, but the essentials are covered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents customerId (with the NAVER_ADS_CUSTOMER_ID fallback) and campaignIds (max 100, full list if omitted). The description adds no parameter-level detail beyond what the schema already provides; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it retrieves a list of campaigns for an ad account and defines what a campaign is (top-level unit managing ad type and budget). Distinguishes from get_campaign (singular) by scope, though it doesn't explicitly name alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the description's mention that the returned nccCampaignId feeds into list_adgroups, but it does not state explicit when-to-use or when-not conditions, nor name sibling tools directly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_keywords키워드 목록 조회A
Read-onlyIdempotent

광고그룹에 등록된 키워드 목록과 입찰가·상태를 조회합니다. 노출·클릭·비용 같은 성과 지표는 포함되지 않으므로 get_stats를 함께 쓰세요.

ParametersJSON Schema
NameRequiredDescriptionDefault
adgroupIdYes조회할 광고그룹의 nccAdgroupId. list_adgroups로 먼저 확인하세요.
customerIdNo조회할 광고계정 CUSTOMER_ID. 생략하면 NAVER_ADS_CUSTOMER_ID를 사용합니다.

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so safety is covered. The description adds what is returned (bid, status) and what is excluded (impressions, clicks, cost), but does not disclose pagination, rate limits, or output format details; with annotations doing heavy lifting, this is adequate but has clear gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero waste. The purpose is front-loaded, and the exclusion plus alternative is stated compactly and secondarily.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a list tool with no output schema, annotations covering safety, and full schema coverage, the description is complete enough: it states scope, returned fields, and the key exclusion, and routes the agent to the right sibling for performance data.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both adgroupId and customerId are fully documented in the schema. The description adds no parameter syntax or format details beyond what the schema already provides, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: list keywords in an ad group, including bid and status. It distinguishes the tool from get_stats by noting that performance metrics are excluded, so the agent can route correctly without opening other schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says performance metrics are not included and directs the agent to use get_stats together. This names the alternative and the condition that selects it, leaving nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 15 tool updatesv0.1.0
    • First observedget_ad
    • First observedget_adgroup
    • First observedget_adgroup_targets
    • First observedget_campaign
    • First observedget_keyword
    • First observedget_related_keywords
    • First observedget_stats
    • First observedlist_ad_extensions
    • First observedlist_adgroups
    • First observedlist_ads
    • First observedlist_business_channels
    • First observedlist_campaigns
    • First observedlist_customer_links
    • First observedlist_keywords
    • First observednaver_ads_get

TDQS

B3.4/5.0

Scored across 15 tools

Disambiguation4/5

Tools target distinct resources with clear list/get separation; only minor potential confusion between list_ads and list_ad_extensions, or the generic naver_ads_get fallback, but descriptions clarify intended use.

Naming Consistency4/5

Predominantly list_/get_ + noun in snake_case; the generic naver_ads_get breaks the pattern and get_adgroup_targets uses get_ for what is a list operation, but overall readable and predictable.

Tool Count5/5

15 tools is within the recommended range and each maps to a clear resource or operation; the generic fallback prevents over-proliferation for uncovered endpoints.

Completeness2/5

Surface is entirely read-only: no create, update, or delete operations for campaigns, adgroups, keywords, ads, or extensions; agents cannot perform ad management lifecycle tasks, a major gap for an ads platform.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    B
    maintenance
    A read-only MCP server that provides comprehensive access to the TikTok Business API for retrieving advertising data, including campaigns, ad groups, ads, and performance reports.
    24
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides read-only access to Google Ads account data including campaigns, ad groups, keywords, and performance reports. Enables querying via GAQL through an MCP interface.
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables querying and analysis of Kakao Keyword Ads data, including campaigns, ad groups, keywords, and performance reports. Supports 21 read-only tools and 2 resources for accessing ad account information and metrics.
    25
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    A read-only MCP server for querying Google Ads data using GAQL, enabling AI assistants to safely read campaign performance, ad groups, and keywords.
    12
    MIT