Ads MCP
Server Details
Create, launch & analyze ad campaigns, spy on competitors - Google, Meta, TikTok, LinkedIn & more.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2024-11-05
- URL
- Repository
- adkit/ads-mcp
- GitHub Stars
- 13
- Server Listing
- AdKit
TDQS
Scored across 11 tools
There is notable overlap between adkit_manage, adkit_upload_file, and adkit_studio regarding file uploads and media handling, and adkit_manage is a broad catch-all that could be confused with more specific tools like adkit_integrations for reporting. However, the descriptions help clarify boundaries.
All tools share the adkit_ prefix, but the action part varies between verbs (manage, help, setup) and nouns (library, projects, status). Not a strict verb_noun pattern, but the prefix makes it predictable.
11 tools is within the ideal 3-15 range for a complex ads management domain. Each tool has a distinct purpose (even though adkit_manage is broad), and the count feels well-scoped.
The set covers management, reporting, creative generation, library browsing, integrations, projects, and setup. Minor gaps include adkit_manage being overloaded, but it handles many operations; overall coverage is comprehensive for the domain.
Available Tools
11 toolsadkit_checkinAInspect
Onboarding only. Records that this agent successfully used AdKit after setup. Intended solely for setup and connection verification, at the user's explicit request.
| Name | Required | Description | Default |
|---|---|---|---|
| agentId | No | Canonical agent id for this setup flow, for example "openclaw", "claude-code", or "cursor". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint=false and idempotentHint=false, so the writing nature is implied. The description adds the important consent and onboarding context, but it does not disclose what happens on repeated calls or what the tool returns, leaving some behavioral ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the key constraint front-loaded. Every phrase earns its place and there is no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a lightweight one-parameter tool with no output schema, the description adequately covers purpose, scope, and consent requirements. Minor missing context includes duplicate-call behavior and expected return value, but these are low-risk for an onboarding check-in.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the single agentId parameter is fully documented by the schema. The tool description adds no parameter-level detail, which is acceptable since the schema already carries the semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action (records check-in), a specific resource (successful AdKit usage after setup), and a strict scope (onboarding only). This clearly distinguishes it from siblings like adkit_setup or adkit_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear usage context: onboarding, setup and connection verification, and only at the user's explicit request. It also excludes non-onboarding use via 'Onboarding only' and 'solely,' though it does not explicitly name alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adkit_feedbackAInspect
Report an AdKit bug, confusing behavior, missing capability, or product feedback. Fire-and-forget: it never blocks the user's task.
Fields, filled with whatever is known:
intent: what the user was trying to accomplish.
error: the exact error text, code, or HTTP status.
context: {"toolPath": "adkit_manage meta campaigns create", "platform": "meta", "accountId": "..."}.
Do not include secrets, tokens, request/response bodies, uploaded files, or personal data.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Report type. | |
| error | No | The exact error text, code, or HTTP status. | |
| intent | No | What the user was trying to accomplish. | |
| context | No | Operation context: {"toolPath": "adkit_manage meta campaigns create", "platform": "meta", "accountId": "act_123"}. Include resource IDs relevant to the issue. No secrets or personal data. | |
| message | Yes | Plain-English feedback or bug report. Required. | |
| severity | No | Severity. Use critical when the agent is blocked or users are likely affected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations provide basic mutability hints, but the description adds valuable behavioral context: fire-and-forget semantics, that it never blocks the user's task, and a clear privacy boundary excluding secrets, tokens, bodies, uploaded files, and personal data. This goes beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with purpose. The field list is short and earns its place by adding filling guidance rather than just repeating the schema, and the privacy rule is a single necessary sentence. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a fire-and-forget feedback tool with no output schema, the description covers what triggers it, what fields to populate, the expected non-blocking behavior, and what to omit. It does not explicitly state what the tool returns, but the fire-and-forget framing makes that less critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds practical guidance by saying fields should be filled with whatever is known, giving a concrete context example with toolPath/platform/accountId, and reinforcing the sensitive-data exclusion. This elevates it above the schema-only case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Report'), the target resource (AdKit), and enumerates accepted categories (bug, confusing behavior, missing capability, product feedback). It is clear and specific, though it does not explicitly distinguish itself from the sibling tool adkit_help.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: to report a bug or feedback, and it calls out the fire-and-forget, non-blocking nature. It does not explicitly name alternatives or state when not to use it, but the conditions are reasonably clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adkit_helpARead-onlyIdempotentInspect
Discover the AdKit MCP contract with progressive drill-down. Top-level paths: "manage" (campaigns, accounts, and reporting across Meta, Google, TikTok, Reddit, X, and LinkedIn, plus Microsoft and ChatGPT Ads raw access and drafts), "integrations" (read-only GA4 data), "library" (browse ads, advertisers, and inspiration boards), and "studio" (AI static ad generation). Start with adkit_help() for the root overview, or drill down like adkit_help({ path: "manage google campaigns create" }). A keyword search with q, e.g. adkit_help({ q: "keyword planner" }) → "manage google research keywords", covers the full command catalog: a capability missing from one drill-down path may still exist under another.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Keyword search across every help path (Manage, Google/Meta/TikTok/LinkedIn/Reddit/X/Microsoft, Library, Studio). Returns the top matching command paths, e.g. q: "keyword planner" finds "manage google research keywords". A nonblank q takes precedence over path and detail. Search here before telling the user a capability is unavailable. | |
| path | No | Help path, for example "manage meta campaigns" or "library advertisers". | |
| detail | No | Optional detail level. Use "full" to include advanced params. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior, and the description adds navigational behavior: progressive drill-down, q-based keyword search across the full catalog, and cross-path fallback semantics. It does not contradict the annotations, though it could describe the return/response format more explicitly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two well-organized sentences carry the full contract: the first establishes the catalog categories, the second gives concrete invocation patterns and search behavior. It is dense but front-loaded and free of filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a help tool with no required parameters and rich annotations, the description covers root invocation, drill-down paths, keyword search, and precedence semantics, with examples. The lack of an output schema is not a gap because the return is clearly help content.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema covers 100% of the parameters, so the baseline is 3; the description adds value with worked examples for path and q and clarifies that q searches the entire command catalog. This extends the schema documentation meaningfully without redundancy.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly identifies this as the AdKit help/discovery tool with a specific verb ('discover') and resource (the AdKit MCP contract). The top-level path categories distinguish it from sibling operation tools and make its scope concrete with examples.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: start with adkit_help() for the root overview, drill down via path, or use q for keyword search. The directive to search before telling a user a capability is unavailable, plus the note that a capability may exist under another path, is strong usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adkit_integrationsARead-onlyIdempotentInspect
Read connected Google Analytics 4 properties and run native read-only reports. For actions and report fields, call adkit_help({ path: "integrations ga4" }).
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | List accessible properties or run a read-only GA4 report. | |
| report | No | Native GA4 runReport request body (dateRanges, metrics, dimensions, filters, etc.). Required for run_report. | |
| property | No | GA4 property resource from list_properties, e.g. "properties/123456789". Required for run_report. | |
| provider | Yes | Data provider. Currently Google Analytics 4. | |
| projectId | No | Required. Get from adkit_projects. Auto-resolves only for single-project users. | |
| connectionId | No | Optional connected GA4 login. Use the connectionId returned by list_properties when more than one login is connected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, which signal safe read-only operations. The description adds that reports are 'native read-only' and directs users to adkit_help for deeper behavioral details, but does not explicitly mention connection complexities or multi-login scenarios, though the schema's connectionId parameter implies that. Overall, strong alignment with annotations plus value addition.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no waste. It front-loads the primary purpose and immediately directs to adkit_help for further information. This is concise and structurally effective, though it could be slightly more self-contained by including a brief summary of the two actions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is moderately complex with nested objects and two actions, but the schema is fully documented (100% coverage) and the description references adkit_help for advanced details. With no output schema, the description doesn't need to cover return values. The description is sufficient for basic invocation, but for advanced report building it relies on external help, which is a slight gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are well-documented in the schema itself. The description does not add new semantic nuance beyond what the schema provides (e.g., that 'report' is the native GA4 runReport body). Therefore, a baseline of 3 is appropriate, as the schema carries the heavy lifting and the description adds minimal extra meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads GA4 properties and runs native read-only reports, with a specific reference to adkit_help for more details. It names the two actions (list_properties and run_report) which distinguishes it from other adkit tools that are not GA4-related.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs to call adkit_help for actions and report fields, providing a clear path for when to seek more information. It differentiates itself from siblings by being GA4-specificming, and the schema's action descriptions (e.g., list properties vs run report) offer additional usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adkit_libraryAInspect
Browse 500k+ ads from over 1000 advertisers across Meta, Google, and LinkedIn, track advertisers, and save selected ads to shareable inspiration boards. For advertiser list/search, params.scope is library (default, all advertisers) or watchlist (the selected project's My Watchlist). Create and fill boards before setting shareEnabled: true through boards update, and only enable sharing when the user explicitly asks. The user's own campaigns live in adkit_manage.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Entity identifier. Required for get, track, untrack, boards get, boards update, and boards add-ads. | |
| action | Yes | Library action to execute. For advertisers, track/untrack changes the selected project watchlist. For boards, list/get reads the selected project, create/update changes board metadata, and add-ads saves selected library ads. | |
| entity | Yes | Library entity to query. | |
| params | No | Free-form request params. Sent as query for GET requests and as body fields for mutations. | |
| projectId | No | Required. Get from adkit_projects. Auto-resolves only for single-project users. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are sparse (readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false), so the description carries the burden. It discloses side effects like track/untrack changing the watchlist and boards update/creation altering metadata. It also mentions the safety rule about sharing. No contradiction with annotations. Lacks explicit detail on reversibility or exact consequences, but is nonetheless transparent enough for most agent use cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but well-structured. It opens with the core purpose, then adds critical scoping and safety constraints, and ends with a pointer to a sibling tool. Every sentence adds necessary information; there is no fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (multiple entities, actions, and a free-form params object), the description covers almost everything an agent needs: scope semantics, projectId requirement, board sharing safety, and differentiation from adkit_manage. No output schema is present, but the description doesn't overpromise return details. The only minor omission is explicit pagination/return format, but that is not essential for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (all params have descriptions), so baseline is 3. The description adds extra value by clarifying the semantics of params.scope for library vs watchlist, and specifying which actions apply to which entities and when id/projectId are required. This goes beyond schema descriptions and helps the agent construct correct calls.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific purpose: browse ads across platforms, track advertisers, and save ads to boards. It clearly distinguishes from sibling adkit_manage by noting the user's own campaigns live there. This differentiates it from other tools without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage context: explains the scope parameter (library vs watchlist), instructs when to enable sharing (only when the user explicitly asks), and directs users to adkit_manage for their own campaigns. This gives clear when-to-use and when-not-to-use guidance, going beyond basic function description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adkit_manageADestructiveInspect
Manage AND report on Meta, Google, TikTok, Reddit, X, LinkedIn, Microsoft, and ChatGPT Ads.
Reporting & analytics — campaign performance, results, spend, ROAS, impressions, clicks, conversions, CPC/CPA: use entity:"results" (Google also supports action:"placements" and "search-terms"). Answers "how are my ads doing" / "what's my spend" / "show campaign performance".
Management — connect project accounts and create, edit, or publish supported ad resources. ChatGPT Ads supports normalized account assignment; its advertiser operations use entity:"platform-api-request".
Coverage differs per platform — the exact entities, actions, and params for each platform are documented under adkit_help({ path: "manage " }).
Most mutations create drafts by default; publish:true sends changes live and requires explicit user approval. Use AdKit field names in params (not raw platform fields); pass full request bodies as top-level data. Use platformOverrides for raw fields on supported resources. Unsupported native platform resources and workflows are reachable via the raw platform API: entity:"platform-api-request" action:"mutate" (project opt-in); adkit_feedback is the channel for reporting these AdKit gaps. File uploads: entity:"media" action:"request_upload_url" → PUT the bytes → reference the returned uploadId. For creatives/variants/images inside an ad set, use entity:"ads".
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Optional entity identifier for single-item actions like get, update, disconnect, pages, pixels, and similar routes. Do not use this for drafts publish/delete; those require ids[]. | |
| ids | No | Draft batch identifier list. Required for entity: "drafts" with action: "publish" or "delete", even for a single draft. Each array item must be exactly one draft ID. Good: ["id1","id2"]. Bad: ["id1,id2"]. | |
| data | No | Top-level AdKit request body merged over params for mutation requests after request shaping. | |
| action | Yes | Action: list, get, create, update, delete. Entity-specific actions are listed under adkit_help({ path: "manage <platform>" }). | |
| entity | Yes | Entity name. Common: campaigns, adsets, ads, accounts, media, research, results, drafts, platform-api-request. Platform-specific entities are listed under adkit_help({ path: "manage <platform>" }). | |
| params | No | Free-form request params. GET requests send params as query. Mutations send params as body fields by default, but some Google mutations route IDs like accountId/adGroupId/campaignId into query when the REST route expects them there. Batch/full AdKit bodies belong in top-level data. | |
| publish | No | Optional publish flag for create flows that support immediate execution. | |
| platform | No | Ad platform for the requested entity and action. | |
| accountId | No | Ad account to act on for the selected platform. Auto-resolved when the project has exactly one account on that platform; REQUIRED when multiple are connected. Get available ids from adkit_status or the platform accounts entity. | |
| projectId | No | Required. Get from adkit_projects. Auto-resolves only for single-project users. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with annotations present, the description adds valuable behavioral context: most mutations create drafts by default, publish:true requires explicit user approval, and coverage differs per platform. These details go well beyond the structured annotations and correctly align with readOnlyHint:false and destructiveHint:true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-organized and front-loaded with the primary purpose. Each paragraph covers a distinct concern (reporting, management, platform coverage, drafts, raw API, uploads), and while dense, the sentences are information-bearing rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 10-parameter tool with no output schema, the description covers mutations, reporting, uploads, account resolution, and alternatives. It appropriately defers platform-specific entity/action details to adkit_help, which is a reasonable completeness strategy rather than a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaningful usage rules: use AdKit field names, pass full request bodies as top-level data, use platformOverrides for raw fields, and distinguish id vs ids[]. This clarifies intent beyond the bare parameter schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Manage AND report on Meta, Google... Ads', clearly stating the verb, resource, and scope. It also distinguishes this tool from siblings by routing documentation to adkit_help, reporting gaps to adkit_feedback, and unsupported workflows to the raw platform API.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: reporting vs management, platform-specific entity docs under adkit_help, unsupported resources via platform-api-request, and gaps via adkit_feedback. It also explains file upload flow and draft publication, making it easy for an agent to decide between this tool and its alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adkit_projectsAInspect
List, create, or update AdKit projects. Use a projectId returned by list for update and other project-scoped tools. List also returns accessible workspaces.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Project or business name. | |
| tags | No | Business tags for action "create" or "update". Updating replaces the full list. | |
| brand | No | Brand colors for action "update". | |
| limit | No | Maximum projects to return for action "list". Defaults to 20; max 50. | |
| query | No | Optional project name or website search for action "list". | |
| action | No | Defaults to "list". Use "create" when no project exists. For "update", pass projectId and only the fields to change. | |
| website | No | Project website URL or domain. | |
| category | No | Business category for action "create" or "update". | |
| industry | No | Business industry for action "create" or "update". | |
| projectId | No | Project to update. Required when action is "update". | |
| description | No | Business description for action "create" or "update". | |
| workspaceId | No | Optional workspace for action "create". Choose an ID returned in workspaces; omit for the default workspace. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false and destructiveHint=false, so the mutation-without-destruction profile is conveyed structurally. The description adds value by disclosing that 'List also returns accessible workspaces,' a non-obvious behavioral trait, and the schema adds replace-semantics for tags ('Updating replaces the full list'). The description does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each with a distinct job: sentence one states the core purpose, sentence two gives the critical workflow constraint, sentence three discloses a non-obvious return value. There is zero filler or repetition of schema content, and the purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter, three-action tool with no output schema, the definition is largely complete because the 100%-covered schema thoroughly documents action-scoped parameter applicability. The description covers the essential ordering constraint (list to obtain projectId for update and other tools) and the workspaces return. The only real gap is that neither the description nor an output schema hints at what create/update return, leaving the agent to infer that create yields a projectId.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline of 3 applies and the description rightly leans on the schema for parameter meaning. The schema descriptions are genuinely rich — the action enum defaults to 'list', projectId is marked required for 'update', limit has defaults and max — so the tool's parameter semantics are fully conveyed without the description needing to repeat them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'List, create, or update AdKit projects' — a specific multi-verb statement tied to a named resource that instantly tells an agent what the tool does. It also distinguishes the tool from siblings by identifying it as the project entry point in the AdKit family, complementing rather than duplicating the purpose of adkit_studio, adkit_manage, or adkit_library.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence, 'Use a projectId returned by list for update and other project-scoped tools,' establishes a clear list-first workflow and routes the agent from this tool to dependent project-scoped operations. It provides clear context for the primary usage pattern, though it stops short of naming specific alternatives or stating explicit when-not-to-use conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adkit_setupARead-onlyIdempotentInspect
Launch browser-based AdKit setup flows. Requires projectId from adkit_projects. Returns dashboard URLs the user can open.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | Setup flow to launch. Currently only "manage" is supported for linking ad platforms. | |
| platform | No | Optional platform to deep-link directly into. Omit to get the general manage setup links. | |
| projectId | No | Required. Get from adkit_projects. Auto-resolves only for single-project users. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnly, idempotent, and non-destructive hints, so the description does not need to restate those. It adds useful behavioral context beyond the annotations by noting that it is browser-based and that the result is dashboard URLs the user can open.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences carry all the essential information: what the tool does, the key dependency, and what it returns. No filler or redundant restatement of the title or schema is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with only three parameters, full schema coverage, and annotations covering safety traits, the description is largely complete. It explains the return value and the main prerequisite, though it slightly overstates projectId as unconditionally required when the schema allows auto-resolution for single-project users.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters and their enum values. The description only repeats the projectId dependency from adkit_projects without adding new parameter-level meaning, keeping this at the baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool launches browser-based AdKit setup flows, which is a specific verb and resource. It does not explicitly differentiate itself from sibling tools like adkit_manage, but the setup flow focus and return of dashboard URLs are distinctive enough for an agent to understand its purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says it requires projectId from adkit_projects, giving an agent a clear prerequisite and pointing to the correct sibling tool for obtaining that ID. It does not state explicit when-not-to-use scenarios, but for a focused setup tool this is adequate guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adkit_statusARead-onlyIdempotentInspect
Return project context, connected platforms, assigned ad accounts, and Studio setup. Requires projectId from adkit_projects.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | No | Required. Get from adkit_projects. Auto-resolves only for single-project users. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint, and the description adds what data is returned. However, 'Requires projectId' is slightly overstated because the schema notes the parameter auto-resolves for single-project users, and no edge-case behavior is disclosed. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence that front-loads the return contents and immediately states the dependency. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description explains what the tool returns and the input dependency. It lacks an explicit call scenario or output-shape details, but given a single parameter and read-only safe operation, it is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, the description adds no new parameter meaning; it simply repeats that projectId is required and sourced from adkit_projects, which the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Return') and a precise resource ('project context, connected platforms, assigned ad accounts, and Studio setup'), which clearly identifies the tool as a status/read-only lookup and distinguishes it from sibling tools like adkit_projects or adkit_setup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states the prerequisite: projectId must come from adkit_projects. This tells the agent which prior tool to call. It does not name alternatives or exclusion cases, so it misses the highest bar, but the usage context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adkit_studioADestructiveInspect
AI ad generation workspace. Create ad briefs, generate images (create/clone/resize/edit), list ad media, inspect media items, and share briefs. Use entity "ads" + action "generate" to generate images. Omit id to auto-create an ad, or provide id to add variants to an existing ad.
To use a user's own photo as a clone/edit reference: entity:"media" action:"request_upload_url" → PUT file bytes → pass { type:"temporary_upload", id: } in generate references.
Has no live campaign data, spend, or performance reporting; that data lives in adkit_manage. Studio ads are creative drafts, not launched ads.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Ad or media ID. For generate: omit to auto-create an ad, or provide an ad ID to add variants. For media list: provide the ad ID whose media should be returned. | |
| action | Yes | Ads actions: list, get, create, update, delete, generate, share. Media actions: list, get, delete, request_upload_url. | |
| entity | Yes | Studio entity to operate on. | |
| params | No | Request params. For generate: mode, aspectRatio, quantity, instructions, audience, model (for example: gpt-image-2), quality (OpenAI: Low/Medium/High; Gemini: 1K/2K/4K), colors, references (array of { type: "media"|"library-ad"|"temporary_upload", id: string }), title. For reads: fields (comma-separated or "all"). | |
| projectId | No | Required. Get from adkit_projects. Auto-resolves only for single-project users. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal readOnly=false and destructiveHint=true; the description adds meaningful behavior beyond that: Studio entities are drafts, no live campaign data is exposed, and the temporary-upload workflow requires a PUT before passing the reference. It does not detail side effects of delete/update, but the key conceptual boundary is well disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but efficiently organized: capability overview, critical action mapping, the upload workflow, and boundary with adkit_manage. Every sentence contributes guidance an agent needs, and no space is wasted restating the tool name or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-entity, multi-action tool with nested params and no output schema, the description covers the major decision points: which entity/action combos to use, id behavior, the upload sequence, and where live data lives. It does not describe return payloads, but that is a minor gap given the breadth of operations and the strong schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description enhances it materially with action-specific id semantics ('omit to auto-create' vs 'provide id to add variants'), the temporary_upload reference shape, and example enum values for model/quality. It leaves a few actions to the schema, but adds real operational meaning beyond the property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific role: 'AI ad generation workspace' and enumerates concrete operations (create briefs, generate images, list media, inspect media items, share briefs). It also distinguishes itself from adkit_manage by explicitly stating Studio ads are creative drafts, so an agent can separate this tool from its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing instructions: use entity 'ads' with action 'generate', omit or provide id depending on variant behavior, and use the media request_upload_url flow for user photos. It also states what the tool does NOT contain (live campaign data/spend/performance) and directs that data to adkit_manage, which is clear when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adkit_upload_fileAInspect
Beta. Upload one file to Meta, Google, TikTok, LinkedIn, X, or Studio from a host-provided attachment, public HTTPS URL, or completed temporary upload. X currently supports JPEG and PNG images. When no attachment or public URL exists, a requested upload URL fills the same role. Base64 payloads and local file paths are not accepted. Report upload failures with adkit_feedback.
| Name | Required | Description | Default |
|---|---|---|---|
| files | No | File supplied automatically by a host that supports MCP attachments. Never construct this field. | |
| action | Yes | Use "upload" when the file is already attached, at a public URL, or in a completed temporary upload. Use "request_upload_url" only when the client cannot pass the file. | |
| source | No | One public URL or completed temporary upload. Do not use when the host supplied a file. | |
| filename | No | Filename for request_upload_url. | |
| accountId | No | Ad account for Meta, Google, TikTok, LinkedIn, or X. May be omitted when AdKit can resolve one account. | |
| projectId | No | Required. Get from adkit_projects. Auto-resolves only for single-project users. | |
| sizeBytes | No | Optional exact file size for request_upload_url. | |
| contentType | No | MIME type for request_upload_url, for example image/png or video/mp4. | |
| destination | No | Required for upload. The platform or Studio library that should receive the file. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal a mutating external operation (readOnlyHint=false, openWorldHint=true). The description adds useful behavioral context beyond annotations: the beta status, X's JPEG/PNG-only limitation, unsupported input methods, and a failure reporting path. It does not detail duplicate creation or auth requirements, but it does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is six short, dense sentences with the core operation front-loaded. Every sentence earns its place: beta warning, destination platforms, accepted source types, X restriction, fallback behavior, unsupported inputs, and error routing. There is no filler or redundant repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 9-parameter upload tool with no output schema, the description covers the main invocation paths, source selection, platform destinations, and important limitations; the rich schema descriptions handle parameter details. It is slightly incomplete regarding what the tool returns after request_upload_url or a successful upload, but the core calling contract is clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters are already well documented in the schema. The description adds semantic constraints not present in the schema: base64/local paths are invalid, X supports only JPEG/PNG, and a requested upload URL substitutes when no attachment or public URL exists. This lifts it above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Upload one file to Meta, Google, TikTok, LinkedIn, X, or Studio.' It also enumerates the supported source types and includes a platform-specific format caveat, making the tool's purpose unmistakable and distinguishable from sibling tools like adkit_library or adkit_studio.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit when-to-use guidance: attach a file, use a public HTTPS URL, use a completed temporary upload, or request an upload URL when no attachment/public URL exists. It also states clear exclusions ('Base64 payloads and local file paths are not accepted') and routes failures to adkit_feedback.
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 tool update
- Added
adkit_integrations
3 tool updates
- Changed
adkit_library2 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"Library action to execute. For advertisers, track/untrack changes the selected project watchlist. For boards, create/update changes board metadata and add-ads saves selected library ads."New value: +"Library action to execute. For advertisers, track/untrack changes the selected project watchlist. For boards, list/get reads the selected project, create/update changes board metadata, and add-ads saves selected library ads." - changed
Input schema / properties / id / descriptionPrevious value: -"Entity identifier. Required for get, track, untrack, boards update, and boards add-ads."New value: +"Entity identifier. Required for get, track, untrack, boards get, boards update, and boards add-ads."
- Changed
adkit_manage2 fields changed- changed
Input schema / properties / accountId / descriptionPrevious value: -"Ad account to act on: Meta act_ id, Google customerId, TikTok advertiserId, Reddit ad account id, or X ad account id. Auto-resolved when the project has exactly one account on that platform; REQUIRED when multiple are connected. Get the available ids from adkit_status."New value: +"Ad account to act on for the selected platform. Auto-resolved when the project has exactly one account on that platform; REQUIRED when multiple are connected. Get available ids from adkit_status or the platform accounts entity." - changed
Input schema / properties / platform / enumPrevious value: -[ - "meta", - "google", - "tiktok", - "reddit", - "x", - "linkedin", - "microsoft" -]New value: +[ + "meta", + "google", + "tiktok", + "reddit", + "x", + "linkedin", + "microsoft", + "chatgpt" +]
- Changed
adkit_setup1 field changed- changed
Input schema / properties / platform / enumPrevious value: -[ - "meta", - "google", - "tiktok", - "reddit", - "x", - "linkedin", - "microsoft" -]New value: +[ + "meta", + "google", + "tiktok", + "reddit", + "x", + "linkedin", + "microsoft", + "chatgpt" +]
1 tool update
- Changed
adkit_library4 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"Library action to execute. For advertisers, track/untrack adds/removes an existing advertiser from the selected project watchlist; add requires a website or ad library URL and tracks the advertiser. For a name, search first, then track its ID."New value: +"Library action to execute. For advertisers, track/untrack changes the selected project watchlist. For boards, create/update changes board metadata and add-ads saves selected library ads." - changed
Input schema / properties / action / enumPrevious value: -[ - "list", - "search", - "get", - "similar", - "add", - "track", - "untrack" -]New value: +[ + "list", + "search", + "get", + "similar", + "add", + "track", + "untrack", + "create", + "update", + "add-ads" +] - changed
Input schema / properties / entity / enumPrevious value: -[ - "advertisers", - "ads" -]New value: +[ + "advertisers", + "ads", + "boards" +] - changed
Input schema / properties / id / descriptionPrevious value: -"Entity identifier. Required for get, track, and untrack; track/untrack change watchlist membership for the selected project only."New value: +"Entity identifier. Required for get, track, untrack, boards update, and boards add-ads."
10 tool updates
- First observed
adkit_checkin - First observed
adkit_feedback - First observed
adkit_help - First observed
adkit_library - First observed
adkit_manage - First observed
adkit_projects - First observed
adkit_setup - First observed
adkit_status - First observed
adkit_studio - First observed
adkit_upload_file
Related MCP Connectors
- adsOAuthcom.adspirer
Manage Google, Meta, Amazon, TikTok, LinkedIn & ChatGPT ads. 430 tools for campaigns & analytics.
Run ads on Google, Meta, LinkedIn, TikTok and more from AI. 460+ tools across 14 platforms.
Manage ad campaigns across Google, Meta, LinkedIn, Reddit, TikTok, and more via AI.
Manage ad campaigns across Google, Meta, LinkedIn, Reddit, TikTok, and more via AI.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceSearches and analyzes competitor ads and content across Meta, Google, Instagram, TikTok, and YouTube with AI-powered creative analysis and cross-platform brand discovery.1-
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to create, analyze, and optimize ad campaigns across Google Ads, Meta Ads, TikTok Ads, LinkedIn Ads, Amazon Ads, and ChatGPT Ads through natural language using 400+ tools.93MIT
- AlicenseNot gradedqualityCmaintenanceEnables competitive intelligence, market analysis, and advertising insights by providing 15+ advanced tools to search, analyze, monitor, and predict Facebook ad performance.241MIT
- AlicenseAqualityDmaintenanceProvides 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.17MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.