Skip to main content
Glama
andrealufino

aapl-ads-mcp

by andrealufino

aapl-ads-mcp

Node version License andrealufino/aapl-ads-mcp MCP server

MCP-сервер, который подключает Claude (и любой MCP-совместимый клиент) к Apple Search Ads API v5.

Что это такое

MCP (Model Context Protocol) — это открытый стандарт, позволяющий ИИ-ассистентам вызывать внешние инструменты. Этот сервер реализует транспорт MCP stdio и предоставляет 9 инструментов «только для чтения», которые запрашивают данные вашего аккаунта Apple Search Ads: кампании, группы объявлений, ключевые слова и отчеты об эффективности.

Вы устанавливаете его один раз, указываете на него в Claude Desktop, а затем задаете вопросы на обычном языке: «Какие ключевые слова принесли больше всего установок в прошлом месяце?» или «Покажи мне кампании с нулевым количеством показов на этой неделе».

Related MCP server: Reddit Ads MCP Server

Зачем это нужно

Официальные панели управления ASA хороши для людей, но не подходят для ситуативного анализа или автоматизированной отчетности. Существующие альтернативы MCP либо являются SaaS-решениями (вы передаете свои ключи), либо не поддерживаются. Это self-hosted решение с открытым исходным кодом, которое вы полностью контролируете.

Функции

  • list_orgs — проверка аутентификации, список доступных организаций

  • list_campaigns — перечисление кампаний, с возможностью фильтрации по статусу

  • list_ad_groups — группы объявлений для заданной кампании

  • list_keywords — целевые ключевые слова с суммами ставок и типом соответствия

  • get_campaign_report — показы, нажатия, установки, расходы, CPI, TTR по кампаниям

  • get_ad_group_report — те же метрики с разбивкой по группам объявлений

  • get_keyword_report — эффективность по ключевым словам с еженедельной/ежедневной/ежемесячной детализацией

  • get_search_terms_report — реальные поисковые запросы, которые активировали ваши объявления (наиболее полезно для поиска новых возможностей)

Все инструменты по умолчанию используют данные за последние 30 дней. Отчеты поддерживают детализацию HOURLY, DAILY, WEEKLY и MONTHLY.

Ограничения

  • Только для чтения. В этом релизе нет операций записи (создание, обновление, приостановка).

  • Требуется доступ к API управления кампаниями Apple Search Ads. Вам необходимо создать API-пользователя в своем аккаунте ASA и сгенерировать пару ключей ES256.

  • Агрегированные метрики установок работают без интеграции на стороне приложения. Поля tapInstalls, viewInstalls и связанные с ними поля в отчетах ASA заполняются непосредственно Apple Search Ads и не требуют наличия SDK в вашем приложении. AdServices / AdAttributionKit нужны только в том случае, если вы хотите атрибутировать установки конкретным кампаниям изнутри вашего приложения (например, для персонализации онбординга).

  • Одна организация. ID организации фиксируется в конфигурации. Переключение между несколькими организациями не реализовано.

Настройка

1. Генерация пары ключей ES256

Используйте современную команду genpkey — она сразу создает формат PKCS#8, который требуется этому серверу. Старая команда ecparam -genkey создает формат SEC1, что приведет к ошибке при запуске.

# Generate private key (PKCS#8)
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out private-key.pem

# Derive public key
openssl pkey -in private-key.pem -pubout -out public-key.pem

Убедитесь, что закрытый ключ начинается с -----BEGIN PRIVATE KEY----- (а не -----BEGIN EC PRIVATE KEY-----). Если он начинается с варианта EC, конвертируйте его:

openssl pkcs8 -topk8 -nocrypt -in ec-key.pem -out private-key.pem

По возможности храните private-key.pem вне корня репозитория (например, ~/.ssh/asa-private-key.pem).

2. Создание API-пользователя в Apple Search Ads

  1. Перейдите в ASA → Account Settings → User Management

  2. Нажмите Create User, выберите роль API Account Read Only для доступа только для чтения (рекомендуется для этого сервера). API Campaign Manager также подойдет и добавит права на запись, если вы планируете расширить сервер инструментами записи в будущем.

  3. Перейдите на вкладку API, нажмите Create Client

  4. Загрузите public-key.pem

  5. Скопируйте client_id, team_id и key_id с экрана подтверждения

  6. Найдите свой org_id в Account Settings → Overview

3. Клонирование и сборка

git clone https://github.com/andrealufino/aapl-ads-mcp.git
cd aapl-ads-mcp
npm install
npm run build

4. Настройка Claude Desktop

Отредактируйте ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "aapl-ads": {
      "command": "node",
      "args": ["/absolute/path/to/aapl-ads-mcp/dist/index.js"],
      "env": {
        "ASA_CLIENT_ID": "SEARCHADS.your-client-id-here",
"ASA_TEAM_ID": "SEARCHADS.your-team-id-here",
"ASA_KEY_ID": "your-key-id-here",
"ASA_ORG_ID": "12345678",
"ASA_PRIVATE_KEY_PATH": "/absolute/path/to/private-key.pem"

} }


} }

Примечание: ASA_PRIVATE_KEY_PATH должен быть абсолютным путем. Тильда (~) не раскрывается Node.js — используйте полный путь.

Для контейнерных или облачных развертываний, где монтирование файла непрактично, установите ASA_PRIVATE_KEY как встроенное содержимое PEM (с сохранением переносов строк). Если установлены оба параметра, ASA_PRIVATE_KEY имеет приоритет.

Перезапустите Claude Desktop. Задайте вопрос «run health check», чтобы убедиться, что сервер подключен.

Примеры использования

Это запросы на естественном языке, которые работают в Claude Desktop после запуска сервера:


List my Apple Ads campaigns

Покажи мне эффективность кампаний за последние 30 дней

Какие ключевые слова принесли установки в моей кампании Brand на прошлой неделе?

Какие поисковые запросы активировали мои объявления в прошлом месяце? Сосредоточься на тех, у которых есть показы, но нет установок.

Сравни еженедельные расходы по всем кампаниям за 1 квартал 2025 года

Покажи группы объявлений в кампании 1234567890 с их ставками


## Development

```bash
npm run build      # compile TypeScript
npm test           # run test suite (Vitest)
npm run typecheck  # type-check without emitting
npm run lint       # Biome lint
npm run format     # Biome format (write)

MCP Inspector

Для интерактивной отладки вызовов инструментов без Claude Desktop:

npx @modelcontextprotocol/inspector node dist/index.js

Установите переменные окружения в интерфейсе Inspector перед подключением.

Pre-commit хуки

Установите хуки lefthook локально после клонирования:

npx lefthook install

Это настраивает:

  • gitleaks protect --staged — блокирует коммиты, содержащие секреты

  • Проверку линтинга Biome для подготовленных (staged) .ts файлов

  • Проверку типов TypeScript

Участие в разработке

См. docs/ARCHITECTURE.md для получения технических подробностей: поток аутентификации, дизайн HTTP-клиента, паттерн инструментов, особенности схемы отчетов и уроки, извлеченные из ASA v5 во время разработки.

Отчеты об ошибках и пулл-реквесты приветствуются.

Безопасность

  • Никогда не коммитьте файлы .env или *.pem — оба типа файлов добавлены в .gitignore

  • Храните private-key.pem вне корня репозитория

  • Токен доступа хранится только в оперативной памяти и никогда не записывается на диск

  • Если вы подозреваете, что ключ был скомпрометирован, обновите его в ASA → Account Settings → API

Лицензия

MIT — см. LICENSE.

Available Tools

9 tools
get_ad_group_reportA

Fetch performance metrics for ad groups within a specific Apple Search Ads campaign: impressions, taps, TTR, spend, CPI, installs (tap-through and view-through), and install rate. Requires ASA authentication; read-only. Use get_campaign_report for a campaign-level summary, or get_keyword_report for keyword-level detail. Results are grouped by country/region and include grand totals. Defaults to the last 30 days with WEEKLY granularity.

NameRequiredDescriptionDefault
endDateNoEnd of the reporting period (YYYY-MM-DD). Defaults to today.
startDateNoStart of the reporting period (YYYY-MM-DD). Defaults to 30 days ago.
adGroupIdsNoRestrict results to these ad group IDs. Omit to include all ad groups in the campaign.
campaignIdYesID of the campaign to report on. Obtain from list_campaigns.
granularityNoTime granularity for the breakdown rows: HOURLY, DAILY, WEEKLY, or MONTHLY. Defaults to WEEKLY.

TDQS

A4.6/5.0
Behavior4/5

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

No annotations provided, so description carries full burden. Describes read-only nature, grouping by country/region, grand totals, and default time range/granularity. However, does not cover potential error behaviors or rate limits.

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 well-structured sentences, front-loaded with core purpose, no redundant information. Every sentence adds value.

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?

Despite no output schema, description lists the metrics returned. Covers key behavioral aspects and parameter defaults. Could include more on error handling or pagination, but adequate for a report tool.

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%, baseline 3. Description adds context beyond schema: e.g., 'Obtain from list_campaigns' for campaignId, defaults for startDate/endDate/granularity, and meaning of adGroupIds absence.

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?

Description clearly states it fetches ad group performance metrics for a specific ASA campaign, listing specific metrics (impressions, taps, etc.). It distinguishes from siblings by naming get_campaign_report and get_keyword_report.

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 when to use this tool vs. alternatives ('Use get_campaign_report for a campaign-level summary, or get_keyword_report for keyword-level detail.'). Also mentions authentication requirements and defaults.

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

get_campaign_reportA

Fetch performance metrics for Apple Search Ads campaigns: impressions, taps, tap-through rate (TTR), localSpend, avgCPT, avgCPM, tapInstalls, viewInstalls, totalInstalls, new downloads, redownloads, CPI, and install rate. Requires ASA authentication; read-only. Use get_ad_group_report or get_keyword_report for deeper breakdowns. Results are grouped by country/region and include grand totals. Defaults to the last 30 days with WEEKLY granularity.

NameRequiredDescriptionDefault
startDateNoStart of the reporting period (YYYY-MM-DD). Defaults to 30 days ago.
endDateNoEnd of the reporting period (YYYY-MM-DD). Defaults to today.
granularityNoTime granularity for the breakdown rows: HOURLY, DAILY, WEEKLY, or MONTHLY. Defaults to WEEKLY.
campaignIdsNoRestrict results to these campaign IDs. Omit to include all campaigns in the org.

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations, the description carries full burden. It mentions authentication requirements and read-only nature. It also describes grouping and grand totals. Could be more explicit about return format, but sufficient.

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 concise (4 sentences), well-structured, and front-loaded with the main action. No unnecessary words.

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?

Given no output schema, the description explains what metrics are returned, grouping, defaults, and authentication. It is complete for the tool's complexity.

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 3. Description adds value by specifying defaults (last 30 days, WEEKLY granularity) and mentioning grouping by country/region, which is not in schema.

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?

The description clearly states it fetches performance metrics for Apple Search Ads campaigns, listing specific metrics. It distinguishes itself from siblings by mentioning get_ad_group_report and get_keyword_report for deeper breakdowns.

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?

The description explicitly tells when to use alternatives ('Use get_ad_group_report or get_keyword_report for deeper breakdowns') and provides default behavior (last 30 days, WEEKLY granularity).

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

get_keyword_reportA

Fetch performance metrics for targeting keywords in a specific Apple Search Ads ad group: impressions, taps, TTR, spend, CPI, installs, and install rate broken down per keyword. Requires ASA authentication; read-only. Use get_search_terms_report to see the actual user queries that triggered these keywords. Results are grouped by country/region and include grand totals. Defaults to the last 30 days with WEEKLY granularity.

NameRequiredDescriptionDefault
startDateNoStart of the reporting period (YYYY-MM-DD). Defaults to 30 days ago.
endDateNoEnd of the reporting period (YYYY-MM-DD). Defaults to today.
granularityNoTime granularity for the breakdown rows: HOURLY, DAILY, WEEKLY, or MONTHLY. Defaults to WEEKLY.
campaignIdYesID of the campaign containing the ad group. Obtain from list_campaigns.
adGroupIdYesID of the ad group to report on. Obtain from list_ad_groups.

TDQS

A4.4/5.0
Behavior4/5

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

No annotations provided, so description carries full burden. It states read-only, authentication requirement, results grouping by country/region, inclusion of grand totals, and default time range/granularity. Lacks details on rate limits or error behavior but is sufficient for typical use.

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 concise sentences that front-load the purpose and provide necessary context without unnecessary detail. Every sentence adds value.

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?

No output schema, but description lists expected metrics, grouping, defaults, and authentication. It references sibling tools for obtaining required IDs. Could be improved by mentioning pagination or data limits, but overall complete for a reporting tool.

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 each parameter having a clear description. The description does not add additional parameter-level meaning beyond what the schema already provides, so baseline score of 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?

The description explicitly states 'Fetch performance metrics for targeting keywords' and lists specific metrics (impressions, taps, TTR, etc.). It clearly differentiates from the sibling tool get_search_terms_report by stating that tool shows actual user queries.

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?

Provides explicit guidance on when to use the alternative tool ('Use get_search_terms_report to see the actual user queries') and mentions prerequisites ('Requires ASA authentication; read-only'). Also indicates default parameters.

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

get_search_terms_reportA

Fetch the actual user search queries that triggered Apple Search Ads impressions, along with performance metrics per search term. Requires ASA authentication; read-only. Most useful for keyword discovery (finding new terms to add) and negation (finding irrelevant queries to exclude). Does not support granularity breakdown — returns aggregate totals per search term. Use get_keyword_report to see metrics for your configured targeting keywords instead. Defaults to the last 30 days.

NameRequiredDescriptionDefault
startDateNoStart of the reporting period (YYYY-MM-DD). Defaults to 30 days ago.
endDateNoEnd of the reporting period (YYYY-MM-DD). Defaults to today.
granularityNoIgnored for this report — the ASA API does not support granularity on search terms reports.
campaignIdYesID of the campaign containing the ad group. Obtain from list_campaigns.
adGroupIdYesID of the ad group to report on. Obtain from list_ad_groups.

TDQS

A4.6/5.0
Behavior4/5

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

Discloses read-only nature, authentication requirement, that granularity is not supported, and aggregate totals are returned. However, lacks details on error handling, rate limits, or specific performance metrics returned.

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?

Five sentences, each serving a purpose. Front-loaded with main action, then usage, then limitations. No redundant information.

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 purpose, usage, behavior, and limitations. Lacks specifics on return format or metrics, but given no output schema, the description is reasonably complete for a report tool.

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% and description adds value by explaining defaults for startDate/endDate, that granularity is ignored, and how to obtain campaignId and adGroupId (via list_campaigns and list_ad_groups).

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?

Description specifies the verb 'Fetch' and resource 'actual user search queries... along with performance metrics per search term'. It clearly distinguishes from sibling tool get_keyword_report by stating the difference between search terms and configured targeting keywords.

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?

Provides explicit when-to-use scenarios: 'keyword discovery' and 'negation'. Explicitly directs to use get_keyword_report for targeting keywords. Also notes that granularity is ignored and defaults to 30 days.

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

healthA

Check if the aapl-ads-mcp server is running and reachable. Use this to verify the MCP connection before making API calls. No ASA authentication is required — returns server name, version, and current timestamp.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

No annotations provided, so description carries full burden. It describes return values and non-destructive nature. Lacks error handling details but sufficient for a simple health check.

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 concise sentences with front-loaded purpose. No wasted words; every sentence adds necessary information.

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?

With zero parameters and no output schema, the description fully covers purpose, usage, and return expectations. No gaps remain.

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?

No parameters exist, so description adds value by clarifying expected output and usage context. Baseline 4 applies.

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?

The description clearly states the tool checks if the server is running and reachable, with specific return values (server name, version, timestamp). It distinctly differs from sibling tools that focus on data retrieval.

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

Usage Guidelines4/5

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

Explicitly advises to use before making API calls, and notes no authentication required. Could strengthen by mentioning not to use for data operations, but context is clear.

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

list_ad_groupsA

List ad groups within a specific Apple Search Ads campaign. Requires ASA authentication; read-only. Returns ad group metadata (id, name, status, default bid, automated keyword opt-in) but not performance metrics — use get_ad_group_report for metrics. Supports pagination via limit/offset; default limit 20, max 1000.

NameRequiredDescriptionDefault
campaignIdYesID of the campaign whose ad groups to list. Obtain from list_campaigns.
limitNoMax ad groups to return (1–1000). Defaults to 20.
offsetNoZero-based page offset for pagination. Defaults to 0.

TDQS

A4.7/5.0
Behavior5/5

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

Discloses read-only nature, describes return content (metadata fields) and what is not returned (performance metrics), providing full behavioral context without annotations.

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 purpose, no redundant information, efficient use of text.

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?

Despite lacking output schema, the description covers authentication, return content, limitations, pagination, and alternative tools, making it fully contextual for a 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?

Since schema covers 100% of parameters with descriptions, the description adds useful context like obtaining campaignId from list_campaigns, slightly exceeding the baseline of 3.

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?

The description clearly states the tool lists ad groups within a specific Apple Search Ads campaign, distinguishing it from siblings like get_ad_group_report for performance metrics.

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

Usage Guidelines4/5

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

Specifies read-only operation, pagination details (limit/offset defaults and max), and directs to get_ad_group_report for performance metrics, but does not explicitly exclude other sibling tools.

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

list_campaignsA

List all campaigns in the configured Apple Search Ads organization. Requires ASA authentication; read-only. Returns campaign metadata (id, name, status, budget, country, channel type) but not performance metrics — use get_campaign_report for metrics. Optionally filter by status. Supports pagination via limit/offset; default limit 20, max 1000.

NameRequiredDescriptionDefault
statusNoFilter results to campaigns with this status. Omit to return all statuses.
limitNoMax campaigns to return (1–1000). Defaults to 20.
offsetNoZero-based page offset for pagination. Defaults to 0.

TDQS

A4.7/5.0
Behavior5/5

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

Discloses read-only nature, authentication requirement, returned fields, pagination behavior with default and max limit, and explicitly states what is not returned (performance metrics).

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 all critical information front-loaded; no unnecessary words, efficient use of space.

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?

Fully describes return value (fields listed), excludes performance metrics, notes authentication, and covers pagination details. No missing information for a list tool without output schema.

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?

Input schema has 100% coverage with descriptions; the description reiterates filter and pagination options but does not add new semantic meaning beyond the schema.

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?

The description explicitly states the tool lists campaigns in the Apple Search Ads organization, specifies the resource and scope, and distinguishes from sibling tool get_campaign_report by noting it returns metadata not performance metrics.

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?

Provides clear guidance on when to use this tool (for campaign metadata) and when to use an alternative (get_campaign_report for metrics), along with optional filtering and pagination details.

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

list_keywordsA

List targeting keywords for a specific Apple Search Ads ad group. Requires ASA authentication; read-only. Returns keyword metadata (text, match type BROAD/EXACT, bid amount, status) but not performance metrics — use get_keyword_report for metrics. Supports pagination via limit/offset; default limit 20, max 1000.

NameRequiredDescriptionDefault
campaignIdYesID of the campaign that contains the ad group. Obtain from list_campaigns.
adGroupIdYesID of the ad group whose keywords to list. Obtain from list_ad_groups.
limitNoMax keywords to return (1–1000). Defaults to 20.
offsetNoZero-based page offset for pagination. Defaults to 0.

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of disclosure. It states the tool is read-only, requires ASA authentication, returns keyword metadata (text, match type, bid amount, status), and supports pagination with default and maximum limits. However, it does not cover possible error conditions or rate limits.

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 paragraph that front-loads the purpose, then covers constraints, alternatives, and pagination details. Every sentence adds essential information with no redundancy.

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?

Given the lack of annotations and output schema, the description covers the main functional aspects: purpose, return content, authentication, pagination, and differentiation from related tools. It could have mentioned the response structure or error handling, but it is fairly complete for a listing tool.

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?

All parameters are described in the input schema with full coverage. The description adds value by explaining authentication requirements and pagination defaults, though it does not provide additional semantic depth beyond what the schema already offers.

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?

The description clearly states the tool lists targeting keywords for a specific Apple Search Ads ad group, using specific verbs and identifying the resource. It distinguishes itself from sibling tools like get_keyword_report.

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

Usage Guidelines4/5

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

The description provides clear context: it is read-only, requires ASA authentication, and explicitly mentions that performance metrics should be retrieved using get_keyword_report. It also explains pagination limits, giving good guidance on when to use the tool.

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

list_orgsA

List all Apple Search Ads organizations accessible with the configured credentials. Requires ASA authentication. Use this to verify credentials are valid and to discover available org IDs before calling other tools. Returns org ID, name, currency, timezone, payment model, and assigned role names.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior3/5

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

With no annotations provided, the description carries full burden. It mentions authentication requirement ('Requires ASA authentication') and lists return fields, but does not disclose potential limitations (e.g., rate limits, error handling, pagination). Adequate but not exceptional.

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 sentences, each necessary and front-loaded: purpose, usage guidance, return data. No wasted words.

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?

Given zero parameters, no output schema, and a simple list operation, the description covers all needed information: what it does, authentication, usage timing, and return fields. Completely sufficient.

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?

No parameters exist (baseline 4). The description adds value by detailing what the return data includes (org ID, name, currency, timezone, payment model, assigned role names), which is beyond the empty schema.

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?

The description clearly states the verb 'List' and resource 'organizations' within the context of Apple Search Ads. It distinguishes itself from sibling tools like list_campaigns by specifying 'organizations' and includes the qualifier 'accessible with configured credentials'.

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 tells the agent when to use this tool: 'Use this to verify credentials are valid and to discover available org IDs before calling other tools.' This is excellent guidance for workflow sequencing.

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. 9 tool updatesv1.0.0
    • First observedget_ad_group_report
    • First observedget_campaign_report
    • First observedget_keyword_report
    • First observedget_search_terms_report
    • First observedhealth
    • First observedlist_ad_groups
    • First observedlist_campaigns
    • First observedlist_keywords
    • First observedlist_orgs

TDQS

A4.5/5.0

Scored across 9 tools

Disambiguation5/5

Each tool targets a distinct entity and action: list_* for enumerating hierarchy levels, get_*_report for metrics at each level, get_search_terms_report for search queries, and health for server status. No two tools could be confused for the same task.

Naming Consistency4/5

Most tools follow the list_ or get_*_report pattern clearly separating metadata enumeration from report retrieval. The single deviation is 'health', which is a noun rather than a verb-prefixed action (e.g., check_health), making the pattern slightly inconsistent.

Tool Count5/5

Nine tools is well-scoped for a read-only Apple Search Ads data access server: four list tools for entity hierarchy, four report tools for metrics breakdowns, and a health check. Each tool serves a distinct need without redundancy.

Completeness4/5

The read-only surface covers the full object hierarchy (org → campaign → ad group → keyword) with list operations and corresponding report endpoints, including search terms. However, the complete absence of write operations (no create/update/delete for campaigns or keywords) could be a gap if management tasks are expected, though it appears intentionally read-only.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Provides read-only access to TikTok advertising data, including campaigns, ad groups, ads, and performance reports through the TikTok Business API.
    6
    43 PyPI
    46
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Read-only access to Reddit Ads API v3 for listing ad accounts, campaigns, ad groups, ads, and generating performance reports with OAuth2 authentication.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables read-only analysis of Apple Ads Platform data, allowing AI assistants to query campaign structure, keywords, search terms, and performance reports without modifying anything.
    MIT