Skip to main content
Glama
rodfinch1-design

servicehawk-ad-intel

ServiceHawk Ad Intel MCP

An MCP server for building a competitive ad swipe file from public Meta Ads Library research, for ServiceHawk, an agency that sells automation to home service businesses (plumbers, HVAC, pest control, roofers, electricians).

It is not a bot for logging into Meta, scraping past a paywall, or bypassing rate limits. It does none of that, on purpose:

  • No credentials, ever. It has no login flow and cannot be given one.

  • No fetching outside a small host allowlist (facebook.com, www.facebook.com, m.facebook.com, transparency.meta.com by default).

  • No destructive tools. Every write goes to a local append-only file.

  • No cloning. The scoring tools grade a pattern's reusable structure (hook, offer, proof, format); the copy generator writes new lines from that structure, never a competitor's actual sentence.

What it is: a small, honest tool for turning public ad research into a scored, searchable swipe file, plus a generator that drafts new ServiceHawk ad copy from the angles that keep showing up as winners.

Why this exists

Meta's official Ad Library API only really covers social issue, election, and politics ads worldwide, plus all ad types for the UK and EU over the past year. For ordinary US commercial competitor research, that leaves the public Ad Library web UI and manually saved pages, not a clean API you can query in bulk. This server is built around that constraint instead of pretending it does not exist: it helps you build the right search URLs, captures a public page when one is reachable without login, and gives you a structured way to record what you saw by hand when it is not.

Related MCP server: AdWhispr MCP Server

Install

cd servicehawk-ad-intel-mcp
npm install
npm run smoke
npm run smoke:mcp

npm run smoke exercises the scoring and storage logic directly. npm run smoke:mcp spins up the server over stdio and calls it as a real MCP client would, so both checks run against the actual code path, not a mock.

Run

node /path/to/servicehawk-ad-intel-mcp/src/server.js

It speaks MCP over stdio, so in practice you point an MCP client at it instead of running it by hand. Example client config:

{
  "mcpServers": {
    "servicehawk-ad-intel": {
      "command": "node",
      "args": ["/path/to/servicehawk-ad-intel-mcp/src/server.js"]
    }
  }
}

Any MCP-capable client (Claude Code, Claude Desktop, or your own MCP client built on the SDK) can load it this way. The server has one job: expose the tools below over stdio. It does not manage its own client connection or UI.

Tools

Tool

Takes

Returns

build_meta_ad_library_url

Optional query, page_id, country (default US), media_type, ad_type, active_status (default active)

{ url, note }, a public facebook.com/ads/library search URL to open in a browser

capture_public_ad_page

url (required, must match the host allowlist), optional timeout_ms, max_text_chars

{ ok, capture, path } with the page title, meta description, stripped visible text, and a blocked_likely flag; or { ok: false, error } if the host is not allowlisted or the fetch fails

record_ad_swipe

page_name, headline, visual_notes, offer (required), plus optional source_url, vertical, format, primary_text, description, landing_page_url, active_since, active_days, variant_count, seen_repeated, notes

{ ok, record }, the stored swipe with a computed score block, appended to data/swipes.jsonl

score_ad_pattern

Same ad fields as above, without saving

{ score, verdict, factors, inferred_strategy, caveat }, scored but never written to disk

list_ad_swipes

Optional vertical, offer substring filters, min_score, limit

{ ok, count, records }, stored swipes sorted by score

summarize_winning_patterns

Optional min_score, top

{ ok, total_swipes, top_strategies, top_swipes, servicehawk_recommendation, next_research_moves }

generate_servicehawk_variants

angle (review_gap or finished_job), optional cta

{ ok, angle, variants, note }, drafted ad copy for that angle family, explicitly marked as a starting point to validate before launch

score_ad_pattern rewards signals that predict a reusable pattern: how long an ad has run, how many similar variants exist, whether the copy lands on a home-service pain point, whether the offer is a low-friction diagnostic (free audit, free report), and whether the headline is short enough to read in a feed scroll. It penalizes risky claims (guarantees, "#1", platform trademarks in the copy) and bloated primary text. The score is a signal for prioritizing research, not a prediction of CPA or ROAS, and the tool says so in its own output.

Data

Everything is stored locally as flat files, not a database:

data/swipes.jsonl        one recorded ad observation per line
data/captures/*.json     saved public-page captures

Override the location with AD_INTEL_DATA_DIR. See .env.example.

Safety

  • No credentials anywhere in this server or its config.

  • No logged-in scraping and no bypassing of Meta's own blocks. If a page comes back blocked, the tool says so and tells you to capture it by hand.

  • No arbitrary URL fetching. capture_public_ad_page checks the hostname against an allowlist before it makes a request, full stop.

  • Every write is append-only to a local file. Nothing here deletes or overwrites past research.

Approach

This server ships with a written contract for every tool: what it takes, what it returns, and what it explicitly refuses to do (see Safety, above). Getting that contract right did not come from one pass at the code.

The work was split across roles that each owned one narrow piece of it (the tool contracts, the scoring rules, the safety constraints) instead of one generalist trying to hold the whole thing in its head at once. A separate, independent pass then checked the result against the actual source code rather than trusting the first answer, and a set of deterministic checks, not a model's own say-so, decided what was safe to publish. That is the same standard applied to every claim in this README: the tool list, the input contracts, and the safety behavior above were verified against src/lib.js and src/server.js, not written from memory.

Layout

Path

What

src/server.js

MCP server: registers the tools above and wires each one to lib.js

src/lib.js

The actual logic: URL building, allowlisted fetch, scoring, and swipe file storage

scripts/smoke-test.js

Exercises the scoring and storage logic directly, no MCP layer

scripts/mcp-client-smoke.js

Spawns the server and calls it as a real MCP client, over stdio

Limits

  • The scoring model is a fixed set of hand-written rules, not a trained model. It rewards home-service and diagnostic-offer signals specifically, not general ad quality, so a strong score in a different vertical means less.

  • Meta can and does block automated fetches of Ad Library pages. When that happens the right move is manual capture into record_ad_swipe, not a workaround, and this server does not try to build one.

  • capture_public_ad_page only extracts text; it does not download images or video, and it does not render JavaScript.

About

Built by Roderick Finch, ServiceHawk AI (servicehawkai.com), Pembroke Pines, FL.

MIT licensed.

Available Tools

7 tools
build_meta_ad_library_urlA

Create a public Meta Ads Library search URL for manual competitive ad research.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoKeyword or advertiser phrase, such as 'review automation' or 'plumber reviews'.
ad_typeNoMeta ad type filter. Defaults to all.
countryNoTwo-letter country code. Defaults to US.
page_idNoOptional Meta page ID to view all active ads for a page.
media_typeNoCreative media type filter.
active_statusNoActive status filter. Defaults to active.

TDQS

A4.2/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It clearly states the tool only creates a URL for manual use, implying no side effects like fetching, capturing, or storing ad data. It does not detail the output format or error behavior, but for a pure URL generator the behavior is adequately disclosed.

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 sentence with no filler. The key action and purpose are front-loaded, and every word contributes to the agent's understanding.

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 tool with six optional parameters and no output schema, the description is nearly complete. It clearly states the result is a public Meta Ads Library search URL for manual research, making the return value obvious. A slightly more explicit note about the URL format or pure string return would make it fully 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 all six parameters are fully documented in the input schema. The description adds no per-parameter semantics, but it does not need to; the baseline of 3 applies when the schema does the heavy lifting.

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 uses a specific verb ('Create') and resource ('public Meta Ads Library search URL'), and the phrase 'for manual competitive ad research' distinguishes it from sibling tools like capture_public_ad_page or record_ad_swipe. An agent can immediately tell this builds a URL rather than performing research or recording results.

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 phrase 'manual competitive ad research' gives clear context for when to use the tool. It does not explicitly name alternatives or exclusions, but the sibling tool names make the distinction obvious, and no strong when-not guidance is needed for a simple URL builder.

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

capture_public_ad_pageA

Fetch and store metadata/text from an allowlisted public ad-library page without login or bypass behavior.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesPublic URL from Meta Ad Library, ad snapshot, or allowlisted transparency page.
timeout_msNoRequest timeout in milliseconds. Defaults to 10000.
max_text_charsNoMaximum extracted visible text characters to store. Defaults to 6000.

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations provided, the description must carry the full burden of behavioral disclosure. It does disclose that it operates only on 'allowlisted public' pages and does not attempt login or bypass, which is useful safety context. However, it doesn't state whether the operation is idempotent, what happens if the URL is not allowlisted, whether it overwrites existing stored data, or any error behavior. It also doesn't mention that it stores data (a write operation) with potential implications. These gaps reduce transparency.

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, compact sentence that front-loads the core action and constraints. It is free of filler and every clause carries meaning: it specifies what is fetched/stored, the source domain, and the negative constraint. This is exemplary conciseness.

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 tool with three parameters, no output schema, and no annotations, the description provides the core function but lacks important contextual details. It does not explain what the tool returns (the stored result or a confirmation), how it handles failures (e.g., if the URL is not public or allowlisted), or when an agent should prefer this over a sibling like record_ad_swipe. Given the lack of annotations and output schema, the description is not fully sufficient for an agent to decide when and how to use it correctly.

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 all three parameters (url, timeout_ms, max_text_chars) already have descriptions in the schema. The tool description adds little beyond the schema: it mentions 'fetch and store' and 'allowlisted public' but these are already implied by the schema's url description. There is no additional clarification about how parameters interact or edge cases, so the description adds minimal value beyond the structured 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 tool's function: 'Fetch and store metadata/text from an allowlisted public ad-library page'. It names the specific verb ('Fetch and store'), the resource ('allowlisted public ad-library page'), and explicitly notes what it does NOT do ('without login or bypass behavior'). This distinguishes it from siblings like build_meta_ad_library_url (which builds URLs) and record_ad_swipe (which records swipes), making it easy for an agent to understand its core role.

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 description gives context about the intended use: it is for 'allowlisted public ad-library pages' and avoids 'login or bypass behavior'. However, it does not explicitly name alternative tools or state when to use this tool versus siblings. For example, it doesn't mention that record_ad_swipe is for user swipes, or when to use build_meta_ad_library_url to construct a URL first. The usage guidance is implied but not explicit, leaving the agent to infer appropriate conditions.

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

generate_servicehawk_variantsB

Generate ServiceHawk-safe Meta still-image ad copy variants from known winning angle families.

ParametersJSON Schema
NameRequiredDescriptionDefault
ctaNoCTA label. Defaults to Get Free Audit.
angleNoAngle family to generate.

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It says 'ServiceHawk-safe' but does not define what that entails (e.g., compliance rules, formatting constraints). It does not state whether the tool is read-only, what it returns (e.g., a list of strings, count of variants), or if it depends on prior data from other tools. The behavior is vague and under-specified.

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-formed sentence that leads with the main action and object. It is concise with no redundant phrases or filler. It efficiently conveys the core purpose without over-explaining.

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

Completeness2/5

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

Given that there is no output schema and no annotations, the description must be self-sufficient. It does not describe the output format (e.g., a JSON array of strings), the number of variants generated, or what 'ServiceHawk-safe' means in practice. It also does not mention any prerequisites like needing to run summarize_winning_patterns first. An agent would be uncertain about the tool's exact behavior and return value.

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% – both 'cta' and 'angle' have descriptions, and 'angle' has an enum. The description's mention of 'known winning angle families' aligns with the angle enum but adds no new meaning. The description does not clarify default behaviors beyond the schema (e.g., default CTA is already given in the schema). Thus, the description adds no value beyond the schema, fitting 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 uses a specific verb 'generate' with a clear resource 'Meta still-image ad copy variants' and source 'known winning angle families'. It clearly distinguishes from sibling tools like build_meta_ad_library_url or record_ad_swipe, which handle different concerns. An agent can identify this tool's unique function without opening the schema.

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 does not mention when to use this tool versus alternatives, nor does it reference sibling tools or exclusion conditions. The phrase 'from known winning angle families' implies a dependency but does not explicitly state when this tool is appropriate. There is no guidance on when not to use it or how it relates to other ad-related tools.

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

list_ad_swipesB

List stored ad swipe observations filtered by vertical, offer, and minimum score.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of records to return.
offerNoOptional offer substring filter.
verticalNoOptional vertical substring filter.
min_scoreNoMinimum score from 0 to 100.

TDQS

B3.3/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. While it implies a read operation, it doesn't explicitly state that it's read-only, doesn't mention pagination behavior, ordering, or how the filters interact. It doesn't contradict anything, but offers no insight into side effects or performance.

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, concise sentence that front-loads the main action and lists all filter dimensions. No filler or repetition.

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 list tool with no output schema and all parameters optional, the description is mostly adequate. However, given no annotations and no output schema, it could add info about default sorting or result count, but that's a minor gap given the tool's simplicity.

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?

With 100% schema description coverage, the schema already documents each parameter's purpose. The description adds a high-level summary of filtering but doesn't clarify filter semantics (e.g., substring matching, whether min_score is inclusive) beyond what the schema 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?

The description clearly states a specific verb ('List'), resource ('ad swipe observations'), and the filtering dimensions (vertical, offer, minimum score). It distinguishes from siblings like record_ad_swipe and score_ad_pattern by focusing on retrieval, but doesn't explicitly name a sibling it is not.

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 description implies usage through its filter parameters, but provides no explicit guidance on when to use this tool versus alternatives like summarize_winning_patterns or generate_servicehawk_variants. It doesn't state when not to use it or offer alternative tool suggestions.

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

record_ad_swipeA

Record one observed ad pattern into the local swipe file and score its reusable winning signals.

ParametersJSON Schema
NameRequiredDescriptionDefault
notesNoAnalyst notes.
offerYesOffer or CTA, such as free audit, demo, report, or consultation.
formatNoCreative format, such as image, static image, carousel, or video.
headlineYesAd headline or largest visible hook.
verticalNoVertical, such as plumbing, HVAC, reputation management, or local SEO.
page_nameYesAdvertiser/page name.
source_urlNoPublic ad or library URL used as evidence.
active_daysNoObserved active duration if known.
descriptionNoAd description or link preview text.
active_sinceNoObserved start date in YYYY-MM-DD if known.
primary_textNoPrimary ad body text copied from the public ad.
visual_notesYesObserved visual pattern, layout, scene, or creative notes.
seen_repeatedNoWhether this hook/visual pattern appears repeatedly.
variant_countNoNumber of similar variants observed.
landing_page_urlNoLanding page URL if visible.

TDQS

A3.5/5.0
Behavior3/5

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

With no annotations, the description carries the burden of behavioral disclosure. It clearly indicates a write side effect ('local swipe file') and a scoring behavior, but it does not disclose whether recordings append, overwrite, or require an existing file, nor does it mention permissions or response 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 sentence with no filler. It front-loads the core action and resource, and every word contributes to the agent's understanding.

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?

The core action and target resource are clear, and the schema covers parameter details, making the tool callable. However, with no output schema and no annotations, the description does not mention what the tool returns, such as a confirmation, the saved record, or the winning-signal score.

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 input schema already fully documents all 15 parameters. The tool description adds no parameter-specific meaning, which is acceptable given the rich schema, yielding the baseline score.

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 ('Record'), resource ('local swipe file'), and adds a secondary behavior ('score its reusable winning signals'), so the agent understands what the tool does. It does not explicitly contrast itself with the sibling score_ad_pattern, which also involves scoring, so it slightly misses 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?

The phrase 'one observed ad pattern' implies this tool is for capturing a single observation, which provides some usage context. However, there is no guidance on when to prefer this over score_ad_pattern, or whether repeated recordings of the same pattern should be deduplicated.

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

score_ad_patternA

Score a copied ad pattern for reusable winning signals without saving it.

ParametersJSON Schema
NameRequiredDescriptionDefault
offerYesOffer or CTA.
formatNoCreative format.
headlineYesAd headline or visible hook.
verticalNoAd vertical.
active_daysNoObserved active duration if known.
descriptionNoDescription or link preview text.
active_sinceNoObserved start date in YYYY-MM-DD if known.
primary_textNoPrimary ad body text.
visual_notesYesVisual pattern or scene notes.
seen_repeatedNoWhether this hook/visual pattern appears repeatedly.
variant_countNoNumber of similar variants observed.

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It does disclose the key non-persistent behavior ('without saving it'), but it does not disclose what the scoring call returns, whether it makes external calls, or any other operation-level side effects.

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, front-loaded sentence with no wasted words. The critical 'without saving it' qualifier is placed prominently at the end of the main clause.

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?

The purpose and non-saving behavior are covered, and the schema handles parameter documentation. However, there is no output schema, and the description does not explain what the score result looks like or how to interpret it, leaving a meaningful gap for a scoring 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%, so the input schema already fully documents all 11 parameters. The description adds no parameter-specific meaning beyond framing them as aspects of a 'copied ad pattern', so the baseline 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 states a specific action ('Score'), a specific resource ('a copied ad pattern'), and the intent ('for reusable winning signals'). It also distinguishes itself from save-oriented tools with 'without saving it'.

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 makes clear this is for scoring an ad pattern rather than persisting it, which differentiates it from record_ad_swipe and list_ad_swipes. However, it does not explicitly name alternatives or state when-not-to-use it beyond the no-saving qualifier.

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

summarize_winning_patternsC

Summarize top stored swipe patterns and recommend ServiceHawk remix angles.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoNumber of top swipes to include.
min_scoreNoMinimum score to include.

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description alone must convey behavioral traits. It implies a read-only analytical operation, but it never explicitly says whether it mutates data, what side effects occur, or how it accesses stored patterns. This is a significant gap for an unannotated tool.

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, front-loaded sentence with no filler or redundancy. Every word earns its place, and the size is appropriate for a simple two-parameter tool.

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

Completeness2/5

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

Without annotations or an output schema, and with overlapping sibling tools, the description is too thin. It does not clarify the expected return format, default behavior when parameters are omitted, or which sibling handles variant generation versus summarization. The agent can infer the domain but lacks important invocation context.

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 top and min_score already have clear descriptions in the input schema. The tool description adds no additional parameter meaning, so the baseline score of 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?

The description uses a specific verb ('Summarize') with a clear resource ('top stored swipe patterns') and names the expected outcome ('recommend ServiceHawk remix angles'). It is distinguishable from list_ad_swipes and score_ad_pattern, though it does not explicitly contrast with generate_servicehawk_variants.

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 guidance on when to use this tool versus its siblings, such as generate_servicehawk_variants or list_ad_swipes. It also does not state prerequisites like having stored patterns first, or when another tool would be more appropriate.

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. 7 tool updatesv0.1.0
    • First observedbuild_meta_ad_library_url
    • First observedcapture_public_ad_page
    • First observedgenerate_servicehawk_variants
    • First observedlist_ad_swipes
    • First observedrecord_ad_swipe
    • First observedscore_ad_pattern
    • First observedsummarize_winning_patterns

TDQS

A3.7/5.0

Scored across 7 tools

Disambiguation4/5

Each tool targets a distinct step in the ad research workflow: generating variants, building search URLs, capturing pages, scoring/recording patterns, listing, and summarizing. The only mild overlap is between generate_servicehawk_variants and summarize_winning_patterns, but their inputs and outputs are clearly different enough.

Naming Consistency5/5

All tool names follow a predictable snake_case verb_noun pattern: generate_, build_, capture_, record_, score_, list_, summarize_. This makes the tool set easy to navigate and mentally model.

Tool Count5/5

Seven tools is well-scoped for an ad intelligence server, covering generation, capture, evaluation, storage, retrieval, and synthesis without unnecessary duplication. Each tool earns its place in the workflow.

Completeness4/5

The core ad-research lifecycle is covered: capture, score, record, list, and summarize. The main gap is the lack of update/delete operations for stored swipes, but agents can still complete the primary workflow without them.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Provides Meta and Google Ads intelligence for AI assistants, enabling users to analyze performance, track competitors, and manage ad campaigns through natural language. It features 17 tools for generating creative concepts, scraping competitor ads, and performing deep account-level analysis.
    17
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Chat with any brand's Meta (Facebook/Instagram) ads inside Claude — research a competitor's ad library, find their longest-running winners, extract hooks and formats, and clone winning ads for your own brand.
    11 npm
    MIT