mcp-server
Server Details
Koongo product-feed & marketplace tools: manage feeds, listings & orders from your AI assistant.
- Status
- Healthy
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP
- URL
TDQS
Scored across 105 tools
Each tool targets a distinct resource and action; ads, marketplaces, feeds, orders, rules, and categories form separate families with clearly differentiated operations. Parallel tools like get_ad_report and get_ad_item_report are explicitly separated as integration-wide vs item-level, so an agent can reliably pick the right one.
The overwhelming majority follow a consistent verb_snake_case pattern, e.g. list_ads, get_marketplace, map_feed_attribute, delete_rule, set_category_mapping. The main deviation is ad_status and marketplace_status, which use a noun_status pattern instead of the get_*_status used by get_feed_status and get_import_status. Aside from those two, the naming is highly predictable.
With 105 tools, this server is far beyond the 50+ threshold the rubric calls an extreme mismatch. The count is inflated by near-duplicate families across ads, marketplaces, orders, and feeds, which expands the surface far past what is defensible for a cohesive tool set.
CRUD/lifecycle coverage is broad and thorough: feeds support create/get/update/delete/restore/export/submit; marketplaces and ads have full setup, configuration, status, reporting, item actions, and operations; rules, category mapping, order sync, and enrichment sources are all represented. Minor gaps exist (e.g., no delete operation for standalone order connections), but agents can work around them with disable or configure.
Available Tools
105 toolsad_statusARead-onlyIdempotentInspect
Get the live run status of one ad: readiness, connection, and product counts. Ads are ads-based channels (advertising / price-comparison / classifieds), not marketplaces: they publish products to the ad platform and have no order sync. Returns {integrationId, status, ready, lastStep, isReady, isConnected, isOverlimit, productsRefreshing, productsSubmitting, productStats:{listed, processing, errors, inactive, total}, upgradeUrl}. productStats counts the products in the ad feed. isOverlimit=true means the plan product limit is exceeded — upgradeUrl is null; explain that the current plan limit is exceeded. productsRefreshing=true means an export / feed generation is running (the ad is 'updating'); productsSubmitting=true means items are being pushed to the channel. While EITHER is true the data is still changing — this is the signal to WAIT: after any export (finishing the wizard summary, repair_ad, a step transition that re-exports, or a submit) poll ad_status until BOTH productsRefreshing AND productsSubmitting are false, THEN read the results. The KOONGO DATA CHECK (get_ad_report's dataCheckErrors) and the productStats counts are only current once the refresh has finished — reading mid-refresh gives stale/empty data. ad_id is the id from categoryAttributeWarmup is the OTHER wait: on channels whose attributes depend on the mapped categories, that download runs in the background. While the block is present with pending:true the category-driven attributes are NOT in get_ad_attributes yet — poll ad_status (retryAfterSeconds says how long to wait; state 'rescheduled' means a channel rate limit parked it until nextTryAt) until the block is absent or state is 'ready'. state 'failed' is terminal: call refresh_ad_category_attributes ONCE to start it again, do not poll on. list_ads. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects). Use ad_status for run progress and get_ad for configuration/mapping. For the detailed error breakdown use get_ad_report.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as a safe idempotent read, but the description goes well beyond: it explains isOverlimit/upgradeUrl=null semantics, the meaning of productsRefreshing/productsSubmitting as a WAIT signal, that productStats and dataCheckErrors are stale mid-refresh, and the categoryAttributeWarmup states (pending/rescheduled/failed) with retry behavior. This is unusually rich behavioral disclosure.
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 core purpose and sibling routing are front-loaded, but the body is long and rambling with a broken sentence mid-way that merges an ad_id explanation with the warmup discussion. Dense and mostly useful, yet it repeats the wait/poll idea and could be tightened.
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?
With no output schema, the description enumerates every returned field and its interpretation, covers the polling lifecycle including rate-limit and terminal states, and clarifies the ad_id/project_id inputs. An agent has everything needed to call and interpret this tool correctly.
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 0%, so the description must compensate. It clearly explains project_id as OPTIONAL (inferred for single-project customers, else project_id_required → call list_projects), which is real added meaning. The ad_id sentence is garbled ("ad_id is the id from categoryAttributeWarmup is the OTHER wait"), leaving ad_id's source only loosely implied via the list_ads reference.
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 verb and resource ("Get the live run status of one ad") and enumerates the facets returned (readiness, connection, product counts). It explicitly distinguishes itself from siblings: "Use ad_status for run progress and get_ad for configuration/mapping. For the detailed error breakdown use get_ad_report." An agent can route 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use and when-to-wait rules: poll until BOTH productsRefreshing and productsSubmitting are false before reading results. It names alternatives by condition (get_ad for config, get_ad_report for errors, refresh_ad_category_attributes on 'failed') and explains the ad_id provenance and project_id fallback path.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clone_adAInspect
Clone an ad — create a copy of it (settings and configuration) as a new ad. Ads are ads-based channels (advertising / price-comparison / classifieds), not marketplaces: they publish products to the ad platform and have no order sync. Returns {integrationId, action:'clone', status:'cloned', kind:'ads', editUrl, message}, where integrationId is the id of the NEW clone. ad_id is the source ad from list_ads. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-read-only, non-idempotent, non-destructive write. The description adds value beyond that by disclosing the exact return shape and semantics (integrationId is the id of the NEW clone, not the source). It doesn't explicitly discuss repeat-invocation behavior, but the copy-creation framing is clear and consistent with 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?
Front-loads the core action, then layers domain context, return shape, and parameter meaning. Every sentence earns its place, though the density is high and could be broken up slightly for scanability.
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 2-parameter clone tool with no output schema, the description supplies the return structure, the meaning of the returned id, and the source of both parameters. Nothing an agent needs to call it correctly is missing.
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 0%, so the description must carry the load — and it does. ad_id is defined as the source ad from list_ads, and project_id is explained as optional with the inference rule and the fallback action (list_projects) when it becomes required.
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?
Starts with a specific verb+resource ('Clone an ad — create a copy of it (settings and configuration) as a new ad') that is unambiguous. It further disambiguates the resource by defining what 'ads' are versus marketplaces, so the agent can distinguish it from clone_marketplace 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context and prerequisites: ad_id comes from list_ads, and project_id is optional for single-project customers but otherwise requires calling list_projects. It also clarifies the ads-vs-marketplace domain so the wrong sibling isn't chosen. It stops short of an explicit when-not-to-use / alternative statement (e.g., vs create_ad), so 4 rather than 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clone_marketplaceAInspect
Clone a marketplace — create a copy of it (settings and configuration) as a new marketplace. Returns {integrationId, action:'clone', status:'cloned', kind, editUrl, message}, where integrationId is the id of the NEW clone. marketplace_id is the source marketplace from list_marketplaces. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | ||
| marketplace_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=false). The description goes beyond them by disclosing the return payload shape and stressing that integrationId refers to the NEW clone, a genuinely useful non-obvious detail. It stops short of stating permission requirements or whether the clone is reversible.
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?
Front-loaded with the core action, then the return values, then parameter sourcing. Dense and all content earns its place, though the single long sentence mixing return shape and parameter semantics is slightly awkward to scan.
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?
There is no output schema, so the description compensates by enumerating the returned fields and clarifying the id semantics. Combined with the annotations covering safety traits and the description covering both parameters, an agent has everything needed to call this clone operation correctly.
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 0% schema description coverage, the description carries the full burden and does so: marketplace_id is defined as the source from list_marketplaces, and project_id is explained as optional with the inference rule and the project_id_required fallback. Both parameters gain meaning not present in the 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?
States a specific verb (clone) and resource (marketplace), and immediately clarifies the semantics: it copies existing settings and configuration into a new marketplace, distinguishing it from create_marketplace. An agent can pick it apart from the many create_/configure_ siblings without opening a schema.
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?
Gives operational routing: marketplace_id comes from list_marketplaces, and project_id is optional with an explicit fallback condition (call list_projects when project_id_required). It does not state when to prefer this over create_marketplace or clone_ad, but the conditional guidance is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
configure_ad_stepADestructiveInspect
Configure ONE step of an ad's setup wizard. CRITICAL: configuring the SUMMARY step FINISHES + ACTIVATES the ad — in AUTO product mode that publishes EVERY matching product to the LIVE channel (spends budget), so to test safely set MANUAL mode FIRST (set_ad_product_mode) and submit one item with run_ad_item_action; check activationBehavior in get_ad before finishing. Ads are ads-based channels (advertising / price-comparison / classifieds), not marketplaces, and have no order sync. Ads are set up step by step IN ORDER: call this repeatedly, targeting each step the previous result reported as nextStepType, until nextStepType is null (setup complete). Identify the step by step_index (from get_ad steps[].index) — step_type alone targets the FIRST step of that type. Out-of-order calls return 'prerequisite_not_met' / 'step_not_available'. CONNECTION IS NOT CONFIGURABLE HERE: the connection/auth step (credentials, API keys, OAuth) can NEVER be set through MCP. 'oauth_required' / 'credentials_in_ui' is TERMINAL — hand the returned oauthUrl or editUrl to the USER, then STOP and wait; do NOT resend the step, guess field codes or retry. Returns {integrationId, stepType, status, ready, lastStep, nextStepType, oauthUrl, transitions[], message}; status is 'saved', 'oauth_required', 'credentials_in_ui', 'prerequisite_not_met', 'step_not_available' or 'validation_failed'. A product export/generation and a deferred category-attribute download run ASYNC — poll ad_status (productsRefreshing, productsSubmitting, categoryAttributeWarmup) before trusting counts or reading the attribute list. A dropdown field takes options[].value, never its position in the list. Full walkthrough (every step type's payload, the product-filter flags, optionsPending, the deferred-attribute branch): call koongo_knowledge with slug 'ad-wizard-steps'. ad_id is from list_ads / create_ad. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | ||
| payload | No | Settings for this step. Form / order-settings: {items: {fieldCode: value}} from get_ad steps[].fields. A connection/auth step takes NO payload and cannot be configured here — omit it (also for advance-only steps). | |
| step_type | No | Target the step by type (the nextStepType from the previous step). Ambiguous when two steps share a type — prefer step_index. | |
| project_id | No | ||
| step_index | No | Target the step by its index (get_ad steps[].index) — use this to disambiguate steps that share a step_type. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, idempotentHint=false, openWorldHint=true, but the description adds far more: the SUMMARY step finishes and ACTIVATES the ad, publishing every matching product to a live channel and spending budget; terminal 'oauth_required'/'credentials_in_ui' states with a stop-and-wait protocol; out-of-order calls returning prerequisite_not_met; async export/generation and category-attribute warmup requiring ad_status polling; and the full status enum. This is exactly the behavioral context annotations cannot carry.
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?
Very long, but dense and front-loaded with the highest-risk fact (activation/spend) before the mechanical ordering rules. Almost every sentence carries operational weight; only the step_type/step_index redundancy with the schema description is mildly duplicative.
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, stateful, destructive 5-param tool with no output schema, the description covers ordering, error statuses, terminal handoff, async side effects, the return object shape, and a pointer to the full walkthrough knowledge slug. Nothing an agent needs to invoke it safely is missing.
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 60%, and the description compensates well: it explains step_index vs step_type disambiguation (type alone targets the first matching step), that connection/auth steps take no payload, that dropdowns take options[].value not list position, and that project_id is optional/inferred or project_id_required. Some of this (step_type ambiguity) is already in the schema's own description, slightly reducing the added value.
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?
Opens with a specific verb+resource and scope ('Configure ONE step of an ad's setup wizard'), and the capitalized 'ONE' plus the step-by-step guidance clearly differentiates it from configure_marketplace_step and configure_order_connection. An agent can identify this as the ad-wizard step configurator 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit about when to use it (repeatedly, in order, targeting nextStepType until null), when NOT to (connection/auth step is never configurable here; must hand off oauthUrl and STOP), what to do first for safe testing (set_ad_product_mode to MANUAL, run_ad_item_action, check activationBehavior), and which siblings to consult (set_ad_product_mode, koongo_knowledge, get_ad, list_projects). Alternatives and exclusions are both present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
configure_marketplace_stepADestructiveInspect
Configure ONE step of a marketplace's setup wizard. CRITICAL: configuring the SUMMARY step FINISHES + ACTIVATES the marketplace — in AUTO product mode that publishes EVERY matching product to the LIVE channel (spends budget), so to test safely set MANUAL mode FIRST (set_marketplace_product_mode) and submit one item with run_marketplace_item_action; check activationBehavior in get_marketplace before finishing. Marketplaces are set up step by step IN ORDER: call this repeatedly, targeting each step the previous result reported as nextStepType, until nextStepType is null (setup complete). Identify the step by step_index (from get_marketplace steps[].index) — step_type alone targets the FIRST step of that type. Out-of-order calls return 'prerequisite_not_met' / 'step_not_available'. CONNECTION IS NOT CONFIGURABLE HERE: the connection/auth step (credentials, API keys, OAuth) can NEVER be set through MCP. 'oauth_required' / 'credentials_in_ui' is TERMINAL — hand the returned oauthUrl or editUrl to the USER, then STOP and wait; do NOT resend the step, guess field codes or retry. Returns {integrationId, stepType, status, ready, lastStep, nextStepType, oauthUrl, transitions[], message}; status is 'saved', 'oauth_required', 'credentials_in_ui', 'prerequisite_not_met', 'step_not_available' or 'validation_failed'. A product export/generation and a deferred category-attribute download run ASYNC — poll marketplace_status (productsRefreshing, productsSubmitting, categoryAttributeWarmup) before trusting counts or reading the attribute list. A dropdown field takes options[].value, never its position in the list. Full walkthrough (every step type's payload, the product-filter flags, optionsPending, the deferred-attribute branch, order sync): call koongo_knowledge with slug 'marketplace-wizard-steps'. marketplace_id is from list_marketplaces / create_marketplace. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| payload | No | Settings for this step. Form / order-settings: {items: {fieldCode: value}} from get_marketplace steps[].fields. A connection/auth step takes NO payload and cannot be configured here — omit it (also for advance-only steps). | |
| step_type | No | Target the step by type (the nextStepType from the previous step). Ambiguous when two steps share a type — prefer step_index. | |
| project_id | No | ||
| step_index | No | Target the step by its index (get_marketplace steps[].index) — use this to disambiguate steps that share a step_type. | |
| marketplace_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and idempotentHint=false, but the description adds crucial behavior beyond them: the SUMMARY step activates the marketplace and in AUTO mode publishes every matching product to the LIVE channel (spending budget), oauth_required/credentials_in_ui are terminal hand-off-to-user states, and export/category-attribute work runs async requiring polling. This is rich, non-redundant behavioral disclosure.
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?
Front-loaded with the CRITICAL activation warning, and nearly every sentence carries operational weight. It is dense and lengthy — the wall-of-text format slightly hurts scanability — but few sentences are truly expendable.
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 destructive, non-idempotent mutation tool with no output schema, the description covers return shape (explicit fields and status enum values), async polling, error cases, and hand-off states. Nothing an agent needs to call this correctly is missing.
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 60%, and the description compensates meaningfully: payload derives from get_marketplace steps[].fields, connection steps take no payload, step_type targets the first step of that type while step_index disambiguates, and marketplace_id/project_id origins and inference rules are spelled out. It adds real meaning beyond the schema, though some param detail (fieldCode formats) is deferred to koongo_knowledge.
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 verb ('configure'), resource ('one step of a marketplace's setup wizard') and scope ('ONE step'), making it immediately distinguishable from siblings like configure_ad_step and configure_order_connection. An agent knows exactly what this does 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly defines the in-order workflow (call repeatedly targeting nextStepType until null), the step_index vs step_type selection rule, the out-of-order failure modes, and the terminal oauth/credentials branch. It also routes to alternatives and prerequisites: set_marketplace_product_mode, run_marketplace_item_action, get_marketplace, marketplace_status, and koongo_knowledge for the full walkthrough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
configure_order_connectionAIdempotentInspect
Set a standalone order connection's Orders Config, sync level and on/off state. order_config is a {code: value} map using codes from get_order_connection.orderConfigFields; order_sync_level is 'orders_and_stock' or 'stock_only'; order_status 'active' enables order syncing for this connection, 'disabled' turns it off. Returns {connectionId, action:'configure', status, orderStatus, addonCode, upsellUrl, message}: 'updated' on success; 'rejected' (HTTP 400) if you tried to set an unknown, paid-locked or unavailable field (NOTHING is saved — message lists them, no purchase link for a locked field); or 'prerequisite_not_met' (HTTP 409) if you try to enable a connection that has not finished authentication yet (complete it in the Koongo UI and confirm with test_order_connection first). Only order settings are changed here — marketplace credentials are NEVER set via MCP. Provided order_config keys are merged (other settings are left untouched). connection_id is from get_order_overview. project_id is OPTIONAL (project_id_required otherwise — then call list_projects). Reactivating a disabled standalone connection is refused before saving if it incurs a new metered charge or billing eligibility cannot be verified.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | ||
| order_config | No | Map of Orders Config values, {code: value}, using codes from get_order_connection.orderConfigFields. | |
| order_status | No | 'active' enables order syncing for this connection, 'disabled' turns it off. | |
| connection_id | Yes | connectionId of the order connection (from get_order_overview). | |
| order_sync_level | No | Order sync level: 'orders_and_stock' or 'stock_only'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (idempotent, non-destructive), and the description goes well beyond them: it discloses merge semantics ('other settings are left untouched'), the exact 'updated'/'rejected'/'prerequisite_not_met' outcomes with HTTP codes, that a rejection saves NOTHING, the 409 auth prerequisite, and the metered-charge refusal on reactivation. This is unusually rich behavioral disclosure.
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?
Front-loaded with the core action, then dense multi-clause sentences covering errors and prerequisites. It is wordy at the margin but nearly every clause carries operational signal, so little is wasted.
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 mutation tool with no output schema, the description supplies the return shape, all failure modes, prerequisites, and merge behavior, leaving nothing an agent needs to call it correctly unspecified.
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 80%, so the baseline is 3, but the description adds genuine value: it points order_config codes at get_order_connection.orderConfigFields, states connection_id comes from get_order_overview, and clarifies project_id's optionality and the project_id_required fallback.
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 verb ('Set') and resource ('standalone order connection's Orders Config, sync level and on/off state') with precise scope. The closing line 'Only order settings are changed here — marketplace credentials are NEVER set via MCP' cleanly separates it from the marketplace configuration 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?
Gives real routing guidance: complete authentication in the Koongo UI and confirm with test_order_connection before enabling, and use list_projects when project_id_required. It stops short of naming which sibling tool to use instead for adjacent configuration tasks, so it is clear but not exhaustively comparative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_adAInspect
Create a new ad for a project from one of the channels in list_ad_channels. Ads are ads-based channels (advertising / price-comparison / classifieds), not marketplaces: they publish products to the ad platform and have no order sync. channel_code is the channelCode from list_ad_channels. Returns {integrationId, action:'create', status, kind:'ads', editUrl, nextStepType, message}. status is 'created' (the ad exists; continue with configure_ad_step starting at nextStepType) or 'prerequisite_not_met' (HTTP 409 — message explains what must be done first, e.g. an offer/primary feed must exist first, or you are over your plan's ads limit (the message explains the unavailable entitlement); nextStepType names the step). multichannel_code links a multichannel definition when the channel offers one. definition_code picks a SPECIFIC definition of the channel when it has more than one — take it from get_ad_channel definitions[].definitionCode; omit it for the channel's default/primary definition. name is an OPTIONAL human-readable label so you can later find this ad by name (names are not unique — set_ad_name can change it later). project_id is OPTIONAL (inferred for a single-project customer; if project_id_required is returned, call list_projects and pass project_id). The returned integrationId is the ad_id for get_ad / configure_ad_step and other ads tools.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional human-readable name for the new ad. | |
| project_id | No | ||
| channel_code | Yes | channelCode of the ad channel (from list_ad_channels). | |
| definition_code | No | Pick a specific definition (definitionCode from get_ad_channel) when the channel has more than one; omit for the default/primary definition. | |
| multichannel_code | No | Definition code of a multichannel option when the channel offers one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare it is a non-idempotent, non-destructive write. The description goes well beyond: it explains the full response envelope, the two possible status values including the HTTP 409 prerequisite failure mode and plan-limit entitlement errors, and that the returned integrationId serves as the ad_id for downstream tools. This is rich behavioral context that annotations cannot carry.
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?
Dense but front-loaded: the core action and domain distinction come first, then parameter semantics, then the return contract. Every sentence earns its place, though the single-paragraph form is heavy for quick scanning.
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?
With no output schema, the description fully documents the return shape (integrationId, action, status, kind, editUrl, nextStepType, message) and the create→configure workflow, covering everything an agent needs to call correctly and act on the result.
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 80%, but the description adds meaning beyond it: channel_code provenance, definition_code = specific-vs-default behavior sourced from get_ad_channel definitions[].definitionCode, multichannel_code linking semantics, name being optional and non-unique (changeable via set_ad_name), and project_id inference/fallback via list_projects.
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 verb+resource ('Create a new ad for a project') and explicitly distinguishes the ads domain from marketplaces ('Ads are ads-based channels... not marketplaces: they publish products to the ad platform and have no order sync'). This differentiation from siblings like create_marketplace is unusually precise.
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?
Explicitly chains the workflow: channel_code from list_ad_channels, then continue with configure_ad_step starting at nextStepType, and definition_code comes from get_ad_channel. It also states when-not conditions (status 'prerequisite_not_met' explains what must be done first).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_feedAInspect
Create a Koongo product feed for a project. feed_code MUST be one returned by list_feed_templates. Returns {feedId, feedCode, status, customerId, editUrl, categoryMappingNeeded}. project_id is OPTIONAL: omit it when the customer has a single project (it is inferred); if they have several you get project_id_required — call list_projects and pass one. If categoryMappingNeeded is true, map its categories with list_unmapped_categories + search_target_categories + set_category_mapping (pass the returned feedId as feed_id). The core next step is to MAP output attributes: call get_feed + list_source_attributes, then map_feed_attribute per attribute (category mapping only covers categories, not attributes). Requires the project's data imported (dataStatus='ok', see get_import_status). If the plan's channels limit is reached, the call is refused with error 'quota_reached' (HTTP 403) with addonCode. Explain the plan limitation and do not retry or offer an upgrade.
| Name | Required | Description | Default |
|---|---|---|---|
| feed_code | Yes | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare this is a write (readOnlyHint=false, destructiveHint=false, non-idempotent), and the description adds substantial context: the quota_reached HTTP 403 refusal with addonCode, the instruction not to retry or offer an upgrade, the returned field set including categoryMappingNeeded, and the dataStatus prerequisite. This goes well beyond what the annotations provide.
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?
Front-loads the core action and returns, then sequences workflow guidance in a dense but readable block. It is longer than typical, but nearly every clause adds actionable information; minor tightening could remove some repetition around category vs attribute mapping.
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 creation tool with no output schema and 0% parameter coverage, the description supplies the return shape, prerequisites, error behavior, and the full downstream mapping sequence. An agent can complete the create-and-map workflow without opening sibling schemas.
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 0%, so the description carries full responsibility. It documents feed_code semantics (must come from list_feed_templates) and project_id optionality including the exact inference rule and error path when several projects exist — meaning well beyond the bare integer/string 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?
States a specific verb+resource ('Create a Koongo product feed for a project') and immediately distinguishes itself from related tools by mandating feed_code from list_feed_templates. The follow-on workflow description makes its role in the feed lifecycle unambiguous relative to siblings like update_feed, delete_feed, and map_feed_attribute.
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?
Explicitly says when to omit project_id (single project vs several), names the fallback tool (list_projects) and error (project_id_required), and lays out the required prerequisite (data imported, see get_import_status). It also names the exact downstream tools (get_feed, list_source_attributes, map_feed_attribute) and clarifies that category mapping does not cover attributes, giving an agent precise routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_marketplaceAInspect
Create a new marketplace integration for a project from one of the channels in list_marketplace_channels. channel_code is the channelCode from list_marketplace_channels. Returns {integrationId, action:'create', status, kind:'marketplace', editUrl, nextStepType, message}. status is 'created' (the marketplace exists; continue with configure_marketplace_step starting at nextStepType) or 'prerequisite_not_met' (HTTP 409 — message explains what must be done first, e.g. an offer/primary feed must exist first, a plan limit is reached (the message explains the unavailable entitlement), or the primary channel must be created first — see nextStepType). primary_sync marks this as the primary product source; order_sync enables order synchronization if the channel supports it; multichannel_code links a multichannel definition when the channel offers one (see get_marketplace_channel). definition_code picks a SPECIFIC definition of the channel when it has more than one (e.g. Amazon/Kaufland expose 'Offers' AND 'New Products') — take it from get_marketplace_channel definitions[].definitionCode; OMIT it to create the channel's default/primary definition. (versionType primary/secondary in get_marketplace_channel tells the definitions apart; it is NOT the same as primary_sync, which just marks this integration as the primary product source.) name is an OPTIONAL human-readable label so you can later find this marketplace by name (names are not unique — set_marketplace_name can change it later). project_id is OPTIONAL (inferred for a single-project customer; if project_id_required is returned, call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional human-readable name for the new marketplace. | |
| order_sync | No | Enable order synchronization (only if the channel supports it). | |
| project_id | No | ||
| channel_code | Yes | channelCode of the marketplace channel (from list_marketplace_channels). | |
| primary_sync | No | Mark this marketplace as the primary product source. | |
| definition_code | No | Pick a specific definition (definitionCode from get_marketplace_channel) when the channel has more than one, e.g. New Products vs Offers; omit for the default/primary definition. | |
| multichannel_code | No | Definition code of a multichannel option when the channel offers one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only give the safety profile (non-read-only, non-idempotent, non-destructive). The description goes well beyond that: it documents the returned object shape, both status values ('created' vs 'prerequisite_not_met' with HTTP 409), and the concrete prerequisite failure causes (missing offer/primary feed, plan limit, missing primary channel). No output schema exists, so this return-value disclosure carries real weight.
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 content is valuable but delivered as one dense paragraph with nested parentheticals and some near-verbatim overlap with the schema descriptions (channel_code, definition_code). It is front-loaded on purpose, but readability suffers and a few clauses could be trimmed or split into a structured block.
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 mutation tool with no output schema and 7 parameters, the definition supplies the parameters' origins, success/failure semantics, follow-up tool, and the returned fields. Nothing an agent needs to invoke it correctly or handle the response appears to be missing.
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 already 86%, yet the description adds non-schema meaning: that definition_code should be omitted to get the default, the explicit primary_sync-vs-versionType disambiguation, that names are non-unique and mutable via set_marketplace_name, and that project_id is inferred for single-project customers. This is genuine added semantics rather than restatement.
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 verb+resource ('Create a new marketplace integration for a project') and immediately ties the required input to its source tool (list_marketplace_channels). An agent can distinguish this from sibling creators like create_ad, create_feed, or clone_marketplace without opening any schema.
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?
Explicitly names the alternative/informational tools (list_marketplace_channels for channel_code, get_marketplace_channel for definitions, list_projects on project_id_required) and prescribes the next step via configure_marketplace_step on success. It also enumerates the failure branches and what to do about them, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_order_connectionARead-onlyIdempotentInspect
Resolve the browser setup link for a standalone order connection using a channel from list_order_channels. Reads the channel and existing plan; does not create a connection, save credentials or start OAuth. Returns status:'auth_required' and authUrl only when adding the connection is included in the current plan. If the plan limit is reached, a new charge would apply, or billing eligibility cannot be verified, returns status:'rejected' without an activation link. Explain the limitation; do not offer a purchase or upgrade. The user completes authentication in the browser. Afterwards use get_order_overview, test_order_connection and configure_order_connection. project_id is optional for a single-project account.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | ||
| channel_api_code | Yes | channelApiCode of the channel to add (from list_order_channels). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotent/non-destructive, so safety is covered; the description adds substantive behavior on top: return statuses, the billing-eligibility gate, the 'rejected' branch with no activation link, and the fact that the user completes auth in the browser. It does not cover pagination or link expiry, keeping it short of a 5.
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?
Front-loaded with the core action and its exclusions, then the outcome branches and follow-ups. Dense and well-ordered, though the billing/upsell instruction runs a little long for a single-sentence constraint.
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?
There is no output schema, and the description supplies the return semantics (auth_required + authUrl vs rejected) that the schema would otherwise carry. Combined with prerequisites, follow-ups, and the optional-parameter note, an agent has everything needed to call and sequence it correctly.
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 50%, and the description compensates for the undocumented project_id by explaining it is optional for a single-project account, while channel_api_code is already documented in the schema. This adds real meaning beyond the structured fields for the gap parameter.
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 verb and resource ('Resolve the browser setup link for a standalone order connection') and immediately differentiates itself from siblings by declaring what it does NOT do (create a connection, save credentials, start OAuth), which separates it from configure_order_connection. An agent can distinguish it without opening any schema.
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?
Names the prerequisite source (a channel from list_order_channels) and the exact follow-up tools (get_order_overview, test_order_connection, configure_order_connection), and tells the agent which branch to take on each status outcome. Explicit when-to-use and when-not-to-do-something guidance is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_ruleAInspect
Create a NEW product rule (an Attribute Rule). GUARDRAIL: a Rule is NEVER a substitute for per-product enrichment — if you would need MORE THAN 3 text-contains conditions (contains/contains_any/starts_with on a description/title) to derive a value (color, material, gender…), do NOT create a Rule; enrich instead with set_api_source/set_ai_source and map that source attribute (see the server ENRICH guidance). A Rule patches FEED OUTPUT only and writes NOTHING onto the products; if the user asked to enrich the products / add attribute X to the products, use set_api_source/set_ai_source (or ask first) — never substitute a Rule. ALWAYS validate_rule it first and fix every error. Pass the full rule document as rule — {name, description, category, icon, rules:[{sortId, enabled, type, conditions, operationGroups:[{mode, parentMode, attributes, operations:[{name, arguments:{key:value}}]}]}]} (see discover_rule_operations for the vocabulary). Any _id/id you include is IGNORED — the server always mints a new one (this tool never overwrites an existing rule; use update_rule for edits). scope selects where it is created: 'project' (default) = the project's own library; 'shared_template' = the reusable shared template library (a template_read_only error means your access cannot write there). Returns {ruleId, scope, status, changed, reason, validation}; status 'created' on success, or 'rejected' with the validation errors when the rule is invalid (HTTP 200, nothing written). SAVE-ONLY: a new rule has NO effect on any feed until you attach it to a feed attribute with map_feed_attribute (rule_id) and then export_feed; a shared_template rule affects no feed at all until it is used by a project. VALUE/OPTIONS MAPPING: for a map_attribute_value operation, search and replace are arrays of {value:''} objects paired by index (NOT plain strings — plain strings save but map nothing, showing empty rows); replace optional. That op is not executed by validate_rule's dry-run (passthrough computedValue) — verify only after a real export/build. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| rule | Yes | ||
| scope | No | Where to create the rule: 'project' (default) = the project's own library; 'shared_template' = the reusable shared template library. | |
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only state readOnlyHint/idempotentHint/destructiveHint all false; the description adds substantial behavioral context: rules write nothing onto products, included _id/id is ignored, the server always mints a new id, the tool never overwrites, invalid rules return HTTP 200 with status 'rejected', and new rules have no feed effect until attached and exported. 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?
Long, but appropriately so for a complex creation tool with many failure modes. It is front-loaded with purpose and guardrail, uses labeled sections (GUARDRAIL, SAVE-ONLY, VALUE/OPTIONS MAPPING), and every block addresses a distinct pitfall an agent would otherwise hit. Dense and structured rather than padded.
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?
There is no output schema, so the description carries the return contract: {ruleId, scope, status, changed, reason, validation}. It also covers project_id inference, dry-run limitations, value mapping array semantics, and post-create attachment workflow. An agent has everything needed to invoke this tool correctly and avoid common mistakes.
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 only 33%, but the description compensates fully. It supplies the complete nested rule document shape, explains that scope has 'project' as default and the shared_template behavior including template_read_only error, and clarifies project_id is optional/inferred unless required. This goes well beyond the sparse 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?
Opens with a specific verb and resource: 'Create a NEW product rule (an Attribute Rule).' It is clearly distinguished from siblings like update_rule, delete_rule, and validate_rule by explicitly saying edits use update_rule and validation is a prerequisite. The purpose is unmistakable.
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 emphatic when-not-to-use guidance: do not create a Rule for complex per-product enrichment; use set_api_source/set_ai_source instead; validate_rule first; use map_feed_attribute/export_feed to give it effect; use update_rule for edits. Alternatives and exclusions are explicit and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_adADestructiveIdempotentInspect
Delete an ad. DESTRUCTIVE and NOT reversible from this surface: it stops syncing, is removed from the list, and ALSO hard-deletes the ad's feeds (channel profiles) — there is no restore tool here, so warn the user that deletion cannot be undone. Ads are ads-based channels (advertising / price-comparison / classifieds), not marketplaces: they publish products to the ad platform and have no order sync. Confirm with the user first, then call with confirm:true. Without confirm:true the call returns error 'confirm_required' (HTTP 400) and nothing is deleted. Returns {integrationId, action:'delete', status:'deleted', kind:'ads'}. ad_id is from list_ads. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | ||
| confirm | No | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations: it discloses that deletion stops syncing, removes the ad from the list, hard-deletes the ad's feeds/channel profiles, and has no restore tool. It also explains the HTTP 400 error when confirm is missing and specifies the exact return payload. This is unusually transparent for a destructive tool.
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 every clause earns its place. It front-loads the destructive warning, then covers confirmation behavior, scope of deletion, return value, and parameter provenance in a tight sequence. 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?
For a destructive, multi-effect mutation with a confirmation guard, the description covers the essential context: what is deleted, what is not affected (no order sync), what happens without confirmation, how to get required IDs, and the expected return. There is no output schema, so the return shape description is necessary and sufficient.
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 0%, so the description must carry parameter meaning. It does: ad_id is sourced from list_ads, confirm must be true to execute, and project_id is optional/inferred unless project_id_required, in which case list_projects is the prerequisite. This fully compensates for the bare 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 states a precise verb and resource ('Delete an ad') and immediately differentiates ads from marketplaces: 'Ads are ads-based channels ... not marketplaces: they publish products to the ad platform and have no order sync.' This clearly distinguishes it from sibling tools like delete_marketplace and delete_feed.
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?
Usage guidance is explicit and actionable: confirm with the user first, call with confirm:true, warn that deletion cannot be undone. It also gives the failure mode ('Without confirm:true the call returns error confirm_required') and instructs when to call list_projects for project_id. No inference is left to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_ai_sourceADestructiveIdempotentInspect
Remove an AI source (its CSV + registration) by code so it is no longer applied on future imports. DESTRUCTIVE: confirm with the user first, then call with confirm:true. Without confirm:true this tool returns error 'confirm_required' and nothing is deleted (the gate is enforced here, before the call reaches Koongo). Set apply:true to re-import now. NOTE: the custom_ values already written onto products are NOT immediately erased — they clear on the next full product import. project_id is OPTIONAL (inferred for a single-project customer). Requires the additional-sources addon: without it the call is refused with error 'addon_required' (HTTP 403) with addonCode. Explain the unavailable entitlement and do not retry. Returns {status:'deleted'|'not_found', code, applied}. The additional-source import can also fetch URLs already configured on this project; this tool does not accept a URL.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ||
| apply | No | ||
| confirm | No | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the destructive/idempotent annotations: it discloses the confirm_required error gate, the addon_required 403 refusal, that custom_<code> values persist until the next full import, and project_id inference. This is exactly the extra behavioral detail annotations cannot convey.
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?
Front-loaded with the DESTRUCTIVE warning, then the gate, addon, and return shape in a logical order. It is dense and mostly earns its place, though a few clauses (e.g., the trailing URL note) add length without being essential to this call.
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 destructive, entitlement-gated mutation with no output schema, the description supplies the confirmation protocol, failure modes, persistence caveat, and return shape ({status, code, applied}). An agent has everything needed to call it correctly.
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 0% schema coverage, the description carries the full burden and does: code drives the deletion, confirm:true is the safety gate, apply:true triggers re-import, and project_id is optional/inferred. All four parameters are given meaning beyond the bare 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?
States a specific verb (Remove), resource (AI source), scope (its CSV + registration), and the consequence (no longer applied on future imports). This clearly distinguishes it from siblings like delete_api_source and delete_feed.
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?
Gives strong operational context: confirm with the user first, the confirm:true gate, apply:true to re-import now, and the addon prerequisite. It does not explicitly compare against the closest alternatives (e.g., set_ai_source or delete_api_source), so it stops short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_api_sourceADestructiveIdempotentInspect
Remove an API source attribute by code from every product so it is no longer applied. DESTRUCTIVE: confirm with the user first, then call with confirm:true. Without confirm:true this tool returns error 'confirm_required' and nothing is deleted (the gate is enforced here, before the call reaches Koongo). Set apply:true to re-import now (otherwise it clears on the next import). project_id is OPTIONAL (inferred for a single-project customer). Requires the additional-sources addon: without it the call is refused with error 'addon_required' (HTTP 403) with addonCode. Explain the unavailable entitlement and do not retry. Returns {status:'deleted', code, applied}.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ||
| apply | No | ||
| confirm | No | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses the confirm gate and where it is enforced, the exact error codes (confirm_required, addon_required/HTTP 403 with addonCode), entitlement requirements, the deferred-clear behavior of apply, and the response shape. Multiple safety- and auth-relevant behaviors are surfaced that annotations alone could not convey. No contradiction with 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?
Dense but every sentence carries a distinct, load-bearing fact (gate, error, entitlement, apply timing, return value). Purpose leads, though the destructive warning and the entitlement note are somewhat interleaved rather than cleanly ordered.
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 destructive 4-parameter mutation with no output schema, the description supplies the return value ({status:'deleted', code, applied}), the failure modes, and the entitlements needed. An agent has everything required to call it correctly and handle refusals.
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 0%, so the description must carry the burden and it does: `code` is the attribute key, `confirm` is the destructive gate, `apply` controls immediate re-import vs deferred clear, and `project_id` is optional and inferred for single-project customers. All four parameters gain meaning beyond the bare 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?
States a specific verb (Remove), resource (API source attribute), keying field (`code`), and scope (from every product so it is no longer applied). An agent can distinguish this from delete_ai_source and set_api_source purely from the name plus the described scope.
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?
Gives strong call-time guidance: confirm with the user first, call with confirm:true, and what happens otherwise (confirm_required error, nothing deleted). Also states the addon prerequisite and explicitly says not to retry. It lacks explicit contrast with sibling alternatives (e.g. delete_ai_source, set_api_source), which keeps it just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_feedADestructiveIdempotentInspect
Delete a feed (soft delete — the generated file and config are removed but it can be restored with restore_feed). DESTRUCTIVE: confirm with the user first, then call with confirm:true. Without confirm:true the call returns error 'confirm_required' (HTTP 400) and nothing is deleted. Returns {feedId, action:'delete', status:'deleted'}. feed_id from list_feeds; project_id OPTIONAL.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | ||
| feed_id | Yes | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, it discloses soft-delete behavior, the confirm guard and its exact error/HTTP status, that nothing is deleted without confirmation, the return shape, and recoverability via restore_feed. This is rich behavioral context that annotations alone do not provide, and it does not contradict any annotation.
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?
Four dense, purpose-driven sentences with the destructive warning front-loaded. Every sentence adds operational value: semantics, confirmation requirement, error behavior, return value, and parameter provenance.
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 simple 3-param, no-output-schema tool, the description covers input semantics, required confirmation, error behavior, return value, and recovery path. An agent has everything needed to invoke it safely and correctly.
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 0%, so the description carries the burden. It explains confirm:true as required for deletion, identifies feed_id's source, and marks project_id as optional. It does not explain project_id's role further, but all three params receive at least meaningful semantic coverage.
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 'Delete a feed' with specific soft-delete semantics, and explicitly references restore_feed, distinguishing it from other delete_* siblings. The resource and action are unambiguous.
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 operational guidance: confirm with the user first, pass confirm:true, and notes the error without it. It also tells the agent where feed_id comes from. It doesn't deeply contrast with alternatives, but the restore_feed mention and deletion context make the guidance clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_marketplaceADestructiveIdempotentInspect
Delete a marketplace. DESTRUCTIVE and NOT reversible from this surface: it stops syncing, is removed from the list, and ALSO hard-deletes the marketplace's feeds (channel profiles) and unregisters its webhooks — there is no restore tool here, so warn the user that deletion cannot be undone. Confirm with the user first, then call with confirm:true. Without confirm:true the call returns error 'confirm_required' (HTTP 400) and nothing is deleted. Returns {integrationId, action:'delete', status:'deleted', kind}. marketplace_id is from list_marketplaces. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | ||
| project_id | No | ||
| marketplace_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description goes well beyond them by disclosing the cascade (feeds/channel profiles hard-deleted, webhooks unregistered), the absence of a restore path, and the exact guard-rail error and HTTP status. That is precisely the extra behavioral detail annotations cannot carry.
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 destructive warning is front-loaded and every sentence carries information, but it is a single dense block that packs cascade effects, error codes, and parameter sourcing into one run-on passage. Slightly restructured line breaks would improve scanability without losing 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?
Although there is no output schema, the description supplies the return shape ({integrationId, action:'delete', status:'deleted', kind}) and covers preconditions, confirmation flow, and fallback lookups. Nothing an agent needs to invoke this safely is missing.
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 0%, so the description must carry the load and does: it explains where marketplace_id comes from, that project_id is optional with a named failure condition, and that confirm is a required-for-success boolean whose absence yields a specific 400 error. Zero-coverage parameters are fully compensated.
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 verb and resource ('Delete a marketplace') and immediately scopes what deletion means in practice: stops syncing, removed from the list, hard-deletes feeds, unregisters webhooks. This separates it from sibling deletes like delete_feed, delete_ad, and delete_rule, which act on narrower resources.
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?
Explicitly instructs to warn the user, confirm first, then call with confirm:true, and states the failure mode (error 'confirm_required', HTTP 400, nothing deleted) if confirm is omitted. It also routes parameter sourcing: marketplace_id from list_marketplaces and project_id from list_projects when project_id_required, with the single-project inference case named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_ruleADestructiveIdempotentInspect
Delete a product rule (Attribute Rule) and unlink it from every feed attribute that uses it. DESTRUCTIVE: a rule may shape a live feed — check its usageCount with list_rules / get_rule first, warn the user, then call with confirm:true. Without confirm:true the call returns error 'confirm_required' and nothing is deleted. Identify the rule by rule_id (from list_rules). scope selects the library: 'project' (default) or 'shared_template' (a template_read_only error means your access cannot write there). Returns {ruleId, scope, status:'deleted', changed, reason, validation}. Any feed that used this rule reverts to its other value source; run export_feed on those feeds to refresh their output. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | Which library the rule lives in: 'project' (default) = the project's own library; 'shared_template' = the reusable shared template library. | |
| confirm | No | Must be true to actually delete; without it the call returns 'confirm_required' and nothing is deleted. | |
| rule_id | Yes | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations that already mark destructiveHint=true, the description discloses the confirm_required guardrail, the unlink behavior, the effect on feeds reverting to another value source, and the return payload shape. It also explains that export_feed should be run on affected feeds, which is important operational context.
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, front-loading the destructive nature and key prerequisite before scope and project_id details. Every sentence carries real guidance, though the information density makes it slightly longer than strictly necessary.
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 covers prerequisites, error cases, return values, side effects, and required follow-up actions. With no output schema present, it fully explains what the agent should expect and do, leaving no critical gaps for a destructive operation.
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 only 50%; rule_id and project_id lack descriptions in the schema. The description compensates by explaining how to identify the rule via list_rules and by detailing when project_id is optional versus required, adding meaning the schema alone does not provide.
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 and resource — 'Delete a product rule (Attribute Rule)' — and clearly distinguishes the scope of what happens: the rule is deleted and unlinked from every feed attribute using it. It differentiates from siblings like update_rule by naming the unique destructive behavior and its consequences.
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 explicit when-to-use guidance: check usageCount with list_rules/get_rule first, warn the user, and only call with confirm:true. It also explains the shared_template access error and how to handle missing project_id, providing clear prerequisites and troubleshooting steps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
discover_rule_operationsARead-onlyIdempotentInspect
Discover the vocabulary for building a product rule (an attribute-value transformation — the feature Koongo's UI and help call "Attribute Rules" / "Rules"). Call this FIRST, before you write a rule, so you use only supported operations, conditions and arguments. GUARDRAIL: a Rule must never be keyword-matching — if a value would need MORE THAN 3 text-contains conditions to derive (color, material, gender… from free text), STOP and enrich per-product with set_api_source/set_ai_source instead of building the Rule. A Rule patches FEED OUTPUT only and writes NOTHING onto the products; if the user asked to enrich the products, use set_api_source/set_ai_source (or ask first) — never substitute a Rule. Returns {operations:[{name, label, group, returnType, valueType, math, attributeVariant, arguments:[{name, label, type, required, options, placeholder, optionsSource}]}], conditions:[{operator, label, group, disabledFor, arguments}], ruleSchema, examples:[{title, description, rule, sampleProduct, expectedValue}]}. Filter to one operation group with group; set detail 'full' for the complete argument specs and 'compact' (default) for a lighter list. include_conditions adds the condition operators; include_examples adds curated end-to-end worked examples. Operations in a group run left-to-right and chain by type: an op's valueType is its INPUT and returnType its OUTPUT, so each op's returnType must match the next op's valueType. Full authoring recipe — the rule-document and condition-tree shape, sortId precedence and the Default Rule, matching a condition value's type to its attribute, and the map_attribute_value (search/replace as ARRAYS OF OBJECTS {value:'…'} paired by index — the #1 gotcha) and setoption recipes: call koongo_knowledge with slug 'rule-authoring'. ALWAYS validate_rule a rule before create_rule / update_rule.
| Name | Required | Description | Default |
|---|---|---|---|
| group | No | ||
| detail | No | ||
| include_examples | No | ||
| include_conditions | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), yet the description adds substantial context: Rules patch feed output only and write nothing to products, the guardrail against keyword-matching rules, and the left-to-right chaining semantics where returnType must match the next op's valueType.
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?
Purpose and the 'call FIRST' directive are front-loaded, and every clause carries real instruction. However, the dense return-shape and recipe references arrive as one long run-on block, making it harder to scan than it needs to be.
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?
No output schema exists, but the description spells out the full return shape (operations, conditions, ruleSchema, examples) and points to the knowledge slug for the authoring recipe. An agent has everything needed to call and interpret it.
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 0%, so the description must carry all four params — and it does: `group` filters to one operation group, detail 'full' vs 'compact' (default), include_conditions adds condition operators, include_examples adds worked examples. This fully compensates for the empty 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?
States a specific verb (discover) plus resource (rule operations vocabulary) and defines the domain in the user's own language ('Attribute Rules' / 'Rules'). It is unmistakably distinct from siblings like create_rule, validate_rule, and get_rule.
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?
Explicitly instructs 'Call this FIRST, before you write a rule' and adds a hard exclusion: if a value needs more than 3 contains conditions, stop and use set_api_source/set_ai_source instead. It also routes to validate_rule before create_rule/update_rule and names koongo_knowledge for the authoring recipe.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
enable_marketplace_order_syncAIdempotentInspect
Add ORDER SYNC to an existing marketplace — the capability, not the on/off switch. Order sync has two layers: the capability (whether the marketplace pulls orders at all, which adds an 'order-settings' wizard step) and the active on/off mode (set_marketplace_order_mode). This tool turns the CAPABILITY on for a marketplace created without it: it adds the order-settings step and leaves syncing OFF. Only offer it when get_marketplace reports canEnableOrderSync:true (the channel definition allows order sync and the store platform supports orders); otherwise it returns status 'prerequisite_not_met' (HTTP 409). After it succeeds: (1) re-fetch get_marketplace, find the new 'order-settings' step and configure it with configure_marketplace_step (a form step — payload {items:{fieldCode:value}} from the step's fields), then (2) call set_marketplace_order_mode enabled:true to START syncing. Returns {integrationId, action:'enable_order_sync', status, kind, editUrl, message}; status is 'updated' (added, or already on) or 'prerequisite_not_met'. marketplace_id is from list_marketplaces. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects). Marketplaces only — ads have no order sync.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | ||
| marketplace_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare idempotentHint:true, but the description adds substantial behavioral context beyond that: it states that the tool adds the order-settings step and leaves syncing OFF, that status can be 'updated' (added or already on) or 'prerequisite_not_met', and that it returns a specific object shape. It also clarifies that it is a capability enabler, not a toggle, which is a non-obvious nuance. The description complements and extends the annotation rather than contradicting them.
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 every sentence earns its place: it defines the tool, distinguishes it from the mode toggle, explains the prerequisite, outlines the workflow, defines return values, and specifies both parameters. It is organized logically from definition to mechanics to follow-up actions, and it front-loads the core distinction. Length is justified by the tool's complexity; there is 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?
Given the tool's complexity, the absence of an output schema, and the 0% schema coverage, the description covers everything an agent needs: the exact purpose, the precondition, the post-step workflow referencing sibling tools (configure_marketplace_step, set_marketplace_order_mode, list_marketplaces, list_projects), the return object structure, and the domain restriction. Nothing essential is missing.
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?
The input schema has zero description coverage (0%), so the description must carry the full burden for both parameters. It does: it explains that marketplace_id comes from list_marketplaces, and that project_id is optional when the customer has a single project but required otherwise, and to call list_projects if needed. This fully compensates for the schema's silence.
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 precise verb+resource: 'Add ORDER SYNC to an existing marketplace' and immediately distinguishes the capability from the on/off switch, framing it as 'the capability, not the on/off switch.' It explicitly names the alternative tool (set_marketplace_order_mode) and specifies that this tool turns the capability ON for marketplaces created without it. This leaves no ambiguity about what the tool does or how it differs 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?
The description gives explicit when-to-use and when-not-to-use guidance: only offer it when get_marketplace reports canEnableOrderSync:true, and that otherwise it returns 'prerequisite_not_met' (HTTP 409). It also details the full following workflow: re-fetch get_marketplace, configure the new 'order-settings' step with configure_marketplace_step, then call set_marketplace_order_mode enabled:true. It even explains the marketplaces-only limitation. This is thorough and leaves no inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_feedADestructiveInspect
Trigger a (re)generation of the feed file. Returns {feedId, action:'export', status, feedStatus}. status is 'queued' (async via the export queue — normal) or 'done'. After this, poll get_feed_status until status becomes 'generated'. feed_id from list_feeds / create_feed; project_id OPTIONAL. Regeneration replaces the existing output file, including files already pulled by channels, and API feeds may auto-submit after export. Confirm this effect with the user before running it.
| Name | Required | Description | Default |
|---|---|---|---|
| feed_id | Yes | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial behavior beyond the annotations (destructiveHint=true, idempotentHint=false): exact return shape, that queued status is normal async behavior, that regeneration replaces output files already pulled by channels, and that API feeds may auto-submit. This is exactly the kind of impact disclosure the annotations cannot convey.
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?
Front-loaded with the action, then return shape, then workflow, then caveats. Dense but every sentence is informative; the embedded JSON return description makes it slightly heavier than ideal but not wasteful.
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?
With no output schema, the description compensates by documenting the return payload and status values, plus the downstream polling step and the destructive side effect. An agent has everything needed to call it and reason about consequences.
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 0%, so the description must carry the load. It states feed_id comes from list_feeds/create_feed and that project_id is OPTIONAL, which is useful provenance, but adds no format, constraint, or interpretation detail (e.g. what project_id scopes). Partial compensation for the coverage gap.
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 verb+resource: 'Trigger a (re)generation of the feed file.' An agent knows exactly what the tool produces. It does not explicitly distinguish itself from close siblings like submit_feed or get_feed_output, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear usage context: trigger, then poll get_feed_status until 'generated', and explicitly instructs the agent to confirm the destructive effect with the user first. It names the follow-up tool but never states when to prefer this over submit_feed, so no explicit exclusion/alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_adARead-onlyIdempotentInspect
Get the full detail of one ad: identity + state + the configuration wizard steps. CRITICAL — read activationBehavior in the RESULT: 'summary_step_activates_and_submits_all' means completing the wizard's SUMMARY step ACTIVATES the ad and publishes EVERY matching product to the LIVE channel (spends budget), so to test safely set MANUAL mode FIRST (set_ad_product_mode) — it then reads 'summary_step_activates_no_auto_submit' and activation auto-submits nothing; 'already_active' = already live. Ads are ads-based channels (advertising / price-comparison / classifieds), not marketplaces: they publish products to the ad platform and have no order sync. Returns {integrationId, projectId, name, channelCode, kind:'ads', definitionCode, status, ready, lastStep, isReady, isConnected, isOverlimit, primarySync, orderSync, productMode, orderMode, taxonomyCode, categoryMappingRequired, connectionStatus, connectionMessage, connectionExpiresAt, steps:[{type, label, sort, index, ready, current, fields:[{code, label, type, required, options, optionsSource, optionsPending, htmlAttributes, value, help, showIf, hiddenIf}]}], editUrl, activationBehavior}. steps describe the setup wizard: 'current' is the next step to configure (via configure_ad_step, targeting it by its index — two steps can share a type) and 'ready' marks completed steps. fields is the step's input schema: for a form/order-settings step, build configure_ad_step payload {items:{code:value}} from it — required marks mandatory fields, options is the allowed value set (value→label), htmlAttributes carry constraints, value is Some field metadata comes from the channel connection and does NOT exist before the auth step is done: optionsPending=true means the option list could not be resolved yet (an empty options array is a state, not permission to send anything), and a disabled field whose default could not be resolved arrives without that flag because you have to supply the value yourself. Do not cache this schema across the auth step — re-read it once the connection exists. the current value. Steps with an empty fields list take a structured payload instead. The connection/auth step (OAuth or credentials) is NOT configurable via MCP: the user completes it in the browser / Koongo UI, and configure_ad_step returns oauth_required / credentials_in_ui for it — terminal, never retry it with a payload. Each ad owns exactly ONE connection (never shared): connectionStatus is its health (NEW / OK / WARNING / ERROR / EXPIRED), connectionMessage/connectionExpiresAt add detail, and test_ad_connection re-checks it live. taxonomyCode is set AUTOMATICALLY from the channel and is READ-ONLY — it cannot be changed via MCP; category mapping (a wizard step) maps your store categories TO this fixed taxonomy, and categoryMappingRequired says whether that step applies. Secrets are never returned. ad_id is the id from list_ads / create_ad. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects). Use get_ad for configuration and ad_status for run progress.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and this description honors it, while disclosing a rich behavioral caveat the read itself implies: activationBehavior values encode side-effects that the wizard can trigger (summary_step_activates_and_submits_all publishes all products to the LIVE channel and spends budget). Also discloses optionsPending semantics, the auth-step exception, one-connection-per-ad, secrets never returned, and read-only taxonomy. Annotations cover the read safety of the tool itself; the description flags downstream effects the caller must know.
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?
Front-loaded with the essential verb+resource and the critical activationBehavior warning, but the body is a dense run-on covering activation behavior, return shape, wizard step semantics, field schema mechanics, auth-step exceptions, connection ownership, taxonomy, secrets, and parameter notes without paragraph breaks or headers. Every sentence earns its place, but the structure is hard to scan.
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 read tool with no output schema and complex nested wizard-step returns, the description supplies the full field inventory, step semantics, field-schema mechanics for building configure_ad_step payloads, the auth-step terminal behavior, and connection/taxonomy semantics. Nothing an agent needs in order to call it correctly and interpret its result is missing.
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 0%, so the description must carry the load. It does a lot: ad_id is the id from list_ads/create_ad, project_id is optional and inferred for a single-project customer, and project_id_required otherwise (then call list_projects). The remaining gap is that project_id's exact relationship (do you pass it always?) isn't completely nailed down, but the semantics are meaningfully covered.
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 verb (get) and resource (one ad), and explicitly enumerates what it returns: identity, state, wizard steps, and a full field list. It also carves out the ads-vs-marketplaces distinction and contrasts with sibling ad_status ('Use get_ad for configuration and ad_status for run progress'). This is well-differentiated from 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?
Explicit when-to-use and when-not-to-use: route to ad_status for run progress, set MANUAL mode first before testing, complete auth in browser not MCP, never retry the connection step with a payload. Names alternative tools (list_ads, create_ad, configure_ad_step, list_projects, test_ad_connection).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ad_attributesARead-onlyIdempotentInspect
List an ad's OUTPUT attributes and how each is currently sourced — the tool for SOLVING THE ATTRIBUTE FORM (the discipline users struggle with). Returns {integrationId, attributes:[{code, label, required, hidden, valueSource, platformCode, constant, composedValue, defaultPlatformCode, defaultConstant, allowedValues, formatType, ruleId, ruleName, ruleEnabled, priceAttribute, currency, currencyConversionEnabled, configured, stepField}], requiredCount, requiredUnmappedCount, unresolvedCodes}. valueSource is rule|composed|attribute|constant|unmapped (the effective source; a rule attached but ruleEnabled=false does NOT count and the attribute reads 'unmapped'). priceAttribute=true marks a money attribute (formatType price / price_with_delete); currency is its target currency and currencyConversionEnabled whether Koongo converts the value into it (null = not a price attribute). Conversion only matters when the price is in a DIFFERENT currency than the store; if the attribute's name already names a currency (e.g. its label/code contains "EUR") the value is ALREADY in that currency, so set currencyConversionEnabled=false to avoid converting it twice. requiredUnmappedCount is the running count of REQUIRED attributes with no working source — 0 means the form is solved and the ad can build/export; unresolvedCodes lists exactly which ones to fix. Pass only_unresolved:true to get just those rows. To fill one, match the user's attribute label to its code, then map_ad_attribute. ad_id is from Each row also says WHERE its value comes from: configured=true is a mapping of the customer's own, stepField names a wizard form step field that drives it (change it there with configure_ad_step — mapping it here writes an override that beats the step for good), and neither means the value is only the channel definition's default. A default is not a decision: check it against the store's data before trusting it. list_ads. project_id is OPTIONAL (project_id_required otherwise — then call list_projects). IF categoryAttributeWarmup IS PRESENT WITH pending:true THIS LIST IS INCOMPLETE: the channel's category-specific attributes are still downloading, so requiredUnmappedCount and unresolvedCodes are PROVISIONAL — a required attribute that is not in the list yet cannot be counted as unmapped, so the form can look solved when it is not. Poll ad_status until the block is absent or state is 'ready', then read this again before mapping.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | ||
| project_id | No | ||
| only_unresolved | No | Return only REQUIRED attributes that still have no working value source. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnly/idempotent/non-destructive, and the description adds substantial non-obvious behavior: the valueSource enum semantics, that ruleEnabled=false makes an attribute read 'unmapped', the currency double-conversion pitfall, and the warmup provisional-count caveat. It does not cover pagination or auth, but the behavioral depth here is well above the annotation floor.
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 dense run-on block of sentences mixing purpose, schema field enumeration, workflow, edge cases, and warnings. The 19-field return-value listing and currency aside bloat the description and bury the critical warmup warning at the end rather than front-loading it.
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?
No output schema exists, so the description must carry return-shape burden, and it does enumerate the return object. It covers the complex warmup lifecycle, mapping workflow, and value-source semantics thoroughly. Slightly heavy, but complete for a complex read tool.
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 only 33%, so the description compensates: it explains ad_id's source, project_id's optionality and fallback, and only_unresolved:true's filtering behavior. This meaningfully exceeds what the schema alone documents, though it could be tighter.
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 verb and resource ('List an ad's OUTPUT attributes and how each is currently sourced') and explicitly frames it as the tool for solving the attribute form, distinguishing it from siblings like get_ad, get_attribute_options, or map_ad_attribute. The response schema enumeration further sharpens the 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?
Names the next action (map_ad_attribute) and where the ad_id comes from (list_ads), explains project_id optionality, and prescribes an entire workflow for the warmup case ('poll ad_status until the block is absent... then read this again'). Includes both when-to-use and when-not-to-trust (the provisional warning).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ad_channelARead-onlyIdempotentInspect
Get one ad channel's detail: the integration TYPES it supports and each type's capabilities. Ads are ads-based channels (advertising / price-comparison / classifieds), not marketplaces: they publish products to the ad platform and have no order sync. Returns {channelCode, label, kind:'ads', devOnly, multichannel, multichannelCode, definitions:[{ definitionCode, type, typeLabel, label, versionType, primary, capabilities:{orderSync, categoryMapping, productFilter, attributeMapping}}]}. versionType is 'primary' or 'secondary' (primary marks the default). Call this before create_ad to choose the right definitionCode for the channel. channel_code is the channelCode from list_ad_channels. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects and pass its project_id).
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | ||
| channel_code | Yes | channelCode of the ad channel (from list_ad_channels). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive, so the description focuses on operationally useful behavior: the ads-vs-marketplace distinction, the conditional project_id inference, and the project_id_required failure path. It stops short of stating pagination or any per-call limits, but for an idempotent read that is minor.
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?
Front-loaded with purpose, then return payload, then the call-ordering guidance, then parameter notes. Every sentence carries information, though the dense inline return-shape enumeration makes it longer than typical and slightly harder to scan.
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?
There is no output schema, so the description carries the full burden of describing the return: field list including definitions[].capabilities and the versionType primary/secondary semantics. Combined with parameter sourcing and call-order guidance, nothing an agent needs to call and interpret this tool is missing.
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 50% (only channel_code documented). The description compensates by explaining channel_code's origin (list_ad_channels), project_id's optionality and inference behavior, and the fallback path when it is required. That is meaningfully beyond the bare 'integer' schema definition.
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 verb+resource ('Get one ad channel's detail') and immediately scopes it: integration types plus each type's capabilities. It also distinguishes ads channels from marketplaces ('they publish products to the ad platform and have no order sync'), which is essential given the sibling tools get_marketplace_channel and get_ad coexist.
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?
Explicitly states the trigger and the downstream action: 'Call this before create_ad to choose the right definitionCode for the channel.' It also names where inputs come from (channel_code from list_ad_channels; project_id via list_projects) and the condition under which project_id becomes required (project_id_required for multi-project customers).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ad_item_historyARead-onlyIdempotentInspect
Get ONE ad listing item's action-log timeline — the sequence of events that acted on the product and its Koongo/channel state at each point, so you can explain WHY an item ended in its current state. Returns {itemId, returned, entries:[{createdAt, event, eventLabel, message, messageLabel, operation, operationLabel, koongoStatus, channelStatus}]} newest first. eventLabel/messageLabel/operationLabel are the human-readable rendering the Koongo UI shows (event name, plain-language explanation, operation title); event/message/operation are the raw codes. Entries are process metadata only (no raw product values); an item with no recorded activity yet returns an empty list. item_id is the itemId from list_ad_items (the same id get_ad_item_report uses); pair the two to diagnose a failing product. ad_id is the integrationId from list_ads. project_id is OPTIONAL (project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | integrationId of the ad (from list_ads). | |
| limit | No | Max timeline entries to return (default 20, max 50). | |
| item_id | Yes | The listing itemId (from list_ad_items). | |
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so safety is covered. The description adds real behavioral context beyond them: entries are process metadata only (no raw product values), an item with no activity returns an empty list, and results are newest-first. Auth/rate-limit behavior is not mentioned, keeping it short of a 5.
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?
Front-loaded with the core purpose, then the return shape, then id provenance, then the optional-parameter caveat. It is a single dense paragraph but nearly every clause carries actionable information; the explicit field enumeration of the returned entries is slightly verbose.
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?
With no output schema, the description fully carries the return contract, listing the returned object shape, the entries' fields and their raw-vs-label duality, the newest-first ordering, and the empty-list case. Combined with usage and id-provenance guidance, an agent has everything needed to call and interpret it.
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 75% and the schema already documents ad_id and item_id origins. The description compensates for the undocumented project_id by explaining it is OPTIONAL and only required when project_id_required is set (then call list_projects). The limit parameter's default/max lives only in the schema and is not restated, which is acceptable.
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 verb and resource: 'Get ONE ad listing item's action-log timeline' and clarifies it covers the sequence of events on the product plus its Koongo/channel state. This clearly distinguishes it from siblings like get_ad_item_report (a report) and get_marketplace_item_history (the marketplace counterpart).
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?
Explicitly frames the diagnostic use case ('so you can explain WHY an item ended in its current state'), names the source of each id (list_ad_items, list_ads, list_projects), and instructs pairing with get_ad_item_report to diagnose a failing product. Alternatives and prerequisites are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ad_item_reportARead-onlyIdempotentInspect
Get the full error report of ONE ad listing item (why the product passed/failed): {itemId, koongoProductId, status, statusDescription, channelStatus, channelStatusLabel, channelStatusDescription, reportMessage, reportCode, errors:[{source, field, fieldLabel, message, code, level, additionalInfo, currentValue}], sensitiveGate}. statusDescription/channelStatusLabel/channelStatusDescription and each error's fieldLabel are the human wording the Koongo UI shows; status/channelStatus/field are raw codes. Each error names the offending attribute (field), its source (export = Koongo-side validation, fixable via a mapping/rule change; adapter / api_error = channel-side reject) and severity (level). SENSITIVE: the offending attribute's currentValue is withheld on the first call (returns a sensitiveGate with confirmationRequired:true + the field CODES); show the gate to the user, then re-call with acknowledge_sensitive:true to receive the values. item_id is the itemId from list_ad_items. ad_id is the integrationId from list_ads. project_id is OPTIONAL (project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | integrationId of the ad (from list_ads). | |
| item_id | Yes | The listing itemId (from list_ad_items). | |
| project_id | No | ||
| acknowledge_sensitive | No | Set true only AFTER the user approves seeing the item's real attribute value(s). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnly/idempotent/no-destructive and say nothing about the sensitive two-phase gate. The description discloses the withheld currentValue on first call, the sensitiveGate.confirmationRequired:true response, the user-approval requirement, and the re-call with acknowledge_sensitive:true — real behavioral context that cannot be inferred from structured fields.
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?
Front-loaded with purpose, then the semantic key, then the sensitive-gate procedure, then param provenance. It is dense and the long inline field enumeration is heavy, but most of it earns its place given there is no output schema to carry that load.
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?
With no output schema, the description enumerates the returned fields and explains the raw-code vs display-label distinction, plus error source/level interpretation (export vs adapter/api_error) and the sensitive-value recovery path. An agent has everything needed to call it and interpret the response.
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 75% with ad_id, item_id and acknowledge_sensitive already documented in the schema. The description adds sourcing hints and, importantly, supplies the only guidance for the undocumented project_id ('OPTIONAL ... project_id_required otherwise — then call list_projects'), plus the semantics of raw codes vs human labels that affect interpretation of the results.
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?
Specific verb+resource with an explicit scope qualifier ('full error report of ONE ad listing item') and a parenthetical that states what the payload answers (why the product passed/failed). It is readily distinguishable from siblings like get_ad_report and get_marketplace_item_report by the 'ad item' granularity.
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?
Gives concrete prerequisites and provenance for each param (item_id from list_ad_items, ad_id from list_ads, project_id fallback to list_projects) and a clear when-to-call-again rule for acknowledge_sensitive. It does not explicitly say when to prefer this over get_ad_report or the marketplace counterpart, so routing between the three report tools is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ad_reportARead-onlyIdempotentInspect
Get the validation report for one ad: the aggregated errors and warnings that block or degrade its feed, with fix suggestions. Ads are ads-based channels (advertising / price-comparison / classifieds), not marketplaces: they publish products to the ad platform and have no order sync. The errors are SPLIT into two groups (as in the CP's two separate views). Returns {integrationId, errorCount, warningCount, statusCounts:[{status, count}], listingStatusCounts:[{status, count}], dataCheckErrors:[...], channelErrors:[...]}, where each error is {source, field, message, code, level, count, fixSuggestions:[{type, stepType, label}]}. dataCheckErrors = the pre-submission KOONGO DATA CHECK (feed-generation validation, source='export' — the same the wizard summary/preview shows, produced when the feed is generated BEFORE anything reaches the channel). channelErrors = the ad channel's OWN responses AFTER submission (source='adapter'/'api_error'). errorCount/warningCount are the COMBINED totals across both groups. Data-check errors exist only after a generation has run — finish the wizard, or repair_ad to (re)generate; export is async, so poll ad_status until productsRefreshing AND productsSubmitting are false, then read the report. statusCounts is how many items sit in each koongo processing status (e.g. completed / error / pending); listingStatusCounts the same by channel listing status (e.g. active / rejected / error). level is error|danger(=warning)|info; count is how many products hit that error. fixSuggestions.type is add_category_mapping|fix_settings|rewrite_attribute|exclude_product, and stepType (when set) names the wizard step to open with configure_ad_step. ad_id is the id from list_ads. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotent/non-destructive, and the description adds substantial context beyond them: the report is split into two groups with different sources ('export' vs 'adapter'/'api_error'), errorCount/warningCount are combined totals, export is async, and results are only meaningful after a generation. This is exactly the kind of operational detail annotations cannot convey.
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?
Front-loaded with purpose, then return shape, then usage sequencing and parameter notes — a logical order. It is unusually dense and long, but nearly every clause (error sources, async polling, enum-ish value lists) carries information an agent needs; a small amount of compression could be achieved without loss.
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?
With no output schema and no meaningful annotation detail beyond safety, the description fully compensates: it enumerates the return object fields and nested error structure, explains status/listing status count meanings, and clarifies how ad_id and project_id are obtained. Nothing critical for correct invocation is missing.
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 0%, so the description must carry parameter meaning, and it does: ad_id is 'the id from list_ads,' and project_id is OPTIONAL, inferred for single-project customers, but project_id_required otherwise (calling list_projects to resolve). Both parameters are fully explained despite empty schema 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?
States a specific verb and resource ('Get the validation report for one ad') and immediately defines the payload as 'aggregated errors and warnings that block or degrade its feed, with fix suggestions.' It further disambiguates from the large sibling set by explicitly defining ads as ads-based channels 'not marketplaces,' so an agent can distinguish it from get_marketplace_report.
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?
Gives explicit preconditions and sequencing: data-check errors exist only after a generation has run, so the agent should finish the wizard or call repair_ad, then poll ad_status until productsRefreshing and productsSubmitting are false. It also names concrete alternatives (repair_ad, configure_ad_step, list_ads, list_projects) with the conditions that select them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_attribute_optionsARead-onlyIdempotentInspect
Get the allowed OPTION choices (value + label) of a target feed/channel attribute, so you can pick a VALID value for a "Set option" — an attribute that takes a fixed value from its predefined list (select/dropdown attributes like Fastener Type, Availability, Condition…). Returns {options:[{value, label}], hasMore, nextOffset}. The stored/exported value is the option's value (NOT its label); label is the human-readable text (often equal to value). Two ways to apply a Set option once you pick a value: WITHOUT conditions set the attribute's constant to that value via map_feed_attribute / map_marketplace_attribute / map_ad_attribute (cheapest — no rule needed); CONDITIONALLY build a rule with a setoption operation (operationGroups mode 'set_option', operations [{name:'setoption', arguments:{value:''}}]) — see discover_rule_operations. Empty options = the attribute is not a closed-option attribute (free text — use set_value instead). Page with offset (from nextOffset) while hasMore is true. TARGET: pass EXACTLY ONE of feed_id (a feed, from list_feeds) or integration_id (a marketplace/ad — the marketplace_id/ad_id from list_marketplaces / list_ads). attribute_code comes from get_feed / get_marketplace_attributes / get_ad_attributes. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | Pagination cursor: pass the previous response's nextOffset to fetch the next page (default 0). | |
| feed_id | No | Target a feed (from list_feeds). Pass exactly one of feed_id or integration_id. | |
| project_id | No | ||
| attribute_code | Yes | The target attribute whose options you want (code from get_feed / get_marketplace_attributes / get_ad_attributes). | |
| integration_id | No | Target a marketplace/ad — the marketplace_id or ad_id from list_marketplaces / list_ads. Pass exactly one of feed_id or integration_id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive. The description adds context beyond that: the return shape, that the stored value is the option's `value` not its label, pagination behavior, and the branch when options are empty. It's richer than the annotations, though it doesn't discuss auth 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Content is dense and front-loaded on the core purpose, but the description is a long run-on paragraph mixing return format, two application strategies, pagination, target selection, and project_id handling. It's information-rich but not well-structured; splitting into short labeled sentences would improve scanability.
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 no output schema, the description fully covers the return shape {options:[{value,label}], hasMore, nextOffset}, pagination, the empty-result branch, target parameter rules, and how to act on the result. An agent has everything needed to call and interpret it.
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 already 80% (all params documented). The description adds meaning beyond the schema by clarifying the EXCLUSIVE-OR between feed_id and integration_id, the source of attribute_code, project_id being optional/inferred, and offset pagination semantics. It goes beyond the schema text.
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 verb and resource ('Get the allowed OPTION choices (value + label) of a target feed/channel attribute') and explains the downstream purpose (picking a valid value for a Set option). It distinguishes itself from siblings like get_feed_attributes and set_value by scoping to closed-option (select/dropdown) attributes.
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?
Explicitly says when to use it (to pick a valid value for a Set option), names alternatives (map_feed_attribute / map_marketplace_attribute / map_ad_attribute for unconditional, setoption rule for conditional, set_value for free text), and gives the 'Empty options = not a closed-option attribute' exclusion. This is exceptional routing guidance across multiple siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_category_mappingARead-onlyIdempotentInspect
Get the current category-mapping rules for a taxonomy (store categories → marketplace/taxonomy categories). The rule set is SHARED per project + taxonomy_code + locale (every feed on that taxonomy sees it). Address the taxonomy either by feed_id (its taxonomy is used) OR explicitly by taxonomy_code (+ optional taxonomy_locale). Returns {taxonomyCode, taxonomyLocale, rules:[{type, operator, storeCategoryIds, storeCategoryPaths, attribute, value, targetHash, targetPath}], total}. Use list_unmapped_categories to find gaps, search_target_categories to find a target, and set_category_mapping to fill them. project_id is OPTIONAL (inferred for a single-project customer).
| Name | Required | Description | Default |
|---|---|---|---|
| feed_id | No | ||
| project_id | No | ||
| taxonomy_code | No | Target taxonomy id (e.g. 'google'); alternative to feed_id for addressing the taxonomy. | |
| taxonomy_locale | No | Locale of the taxonomy tree, e.g. 'en_GB' — defaults to the taxonomy's own default when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld=false), so the bar is lower. The description goes further with the non-obvious SHARED-ness semantics ('every feed on that taxonomy sees it') and an inline description of the return shape, which materially affects how an agent interprets the result.
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?
Front-loaded with purpose and scope, then addressing modes, then return shape, then sibling routing — every sentence carries information. It is dense (long parenthetical return summary), but nothing is redundant 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 4-param read tool with no output schema, the description covers addressing modes, the shared-rule scope, and even the returned fields (taxonomyCode, taxonomyLocale, rules[], total), so an agent can call and interpret it without extra docs.
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 only 50%, but the description compensates: it explains feed_id vs taxonomy_code as mutually alternative addressing paths, notes taxonomy_locale defaults to the taxonomy's own default, and marks project_id as optional/inferred. This adds real meaning beyond the bare schema types.
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 verb+resource ('Get the current category-mapping rules for a taxonomy') and immediately defines the domain mapping (store categories → marketplace/taxonomy categories). It also names the exact scope (per project + taxonomy_code + locale) that separates it from sibling rule-listing tools.
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?
Explicitly names alternatives with conditions: 'Use list_unmapped_categories to find gaps, search_target_categories to find a target, and set_category_mapping to fill them.' It also states the two accepted addressing modes (feed_id OR taxonomy_code+locale) and that project_id is optional/inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_feedARead-onlyIdempotentInspect
Get the full detail of one feed: identity + state + the attribute mapping (how each output column is sourced). Returns {feedId, projectId, feedCode, name, feedType, fileFormat, channelCode, status, enabled, taxonomyCode, taxonomyLocale, feedUrl, exportOutOfStock, attributeCount, requiredUnmappedCount, attributes:[{code, label, platformCode, constant, composedValue, required, hidden, valueSource, defaultPlatformCode, defaultConstant, allowedValues, formatType, ruleId, ruleName, ruleEnabled, priceAttribute, currency, currencyConversionEnabled}]}. hidden=true means the attribute is internal and must NEVER be mapped or surfaced in output; valueSource is rule|composed|attribute|constant|unmapped; allowedValues is the closed value set (empty = open). ruleId/ruleName/ruleEnabled describe an attached Attribute Rule (null when none); valueSource is 'rule' only when the rule is ENABLED — an attribute with ruleId set but ruleEnabled=false has a rule attached-but-disabled that does NOT drive its value (it reads as its other source, or 'unmapped'), so surface it and offer to enable it. priceAttribute=true marks a money attribute (formatType price / price_with_delete); currency is its target currency and currencyConversionEnabled whether Koongo converts the value into it (null = not a price attribute) — only relevant when the price is in a DIFFERENT currency than the store; if the attribute's name already names a currency (label/code contains "EUR") the value is ALREADY in it, so set currencyConversionEnabled=false to avoid double conversion. requiredUnmappedCount is how many REQUIRED attributes still have no working source (valueSource='unmapped'); 0 means the attribute form is solved and the feed can export. Map source attributes with map_feed_attribute (see list_source_attributes). The response also includes settings (the feed's channel output settings): currency/number-format (read-only here) plus stock {stockInValue, stockOutValue, stockAvailabilityAttribute} and shipping {shippingDependentAttribute, shippingMethodName, shippingIntervals:[{from,to,cost}]} — the stock and shipping settings are EDITABLE via set_feed_settings. feed_id is the id from list_feeds / create_feed. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects). A soft-deleted feed returns error 'feed_deleted' (not 'not_found') — the id is still valid and the feed can be brought back with restore_feed; it just won't appear in list_feeds while deleted. Use get_feed for configuration/mapping and get_feed_status for run progress. Requires the project's data imported (dataStatus='ok', see get_import_status).
| Name | Required | Description | Default |
|---|---|---|---|
| feed_id | Yes | ||
| project_id | No | ||
| response_format | No | Verbosity of the returned feed. 'full' (default) includes the complete attribute mapping; 'compact' asks for identity + state only (omit the attributes list) to save context when you just need the feed's status/config. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the read-only/idempotent safety profile, and the description far exceeds that: hidden=true semantics, valueSource enum meaning, enabled-vs-disabled rule behavior, price/currency double-conversion warning, requiredUnmappedCount interpretation, and the 'feed_deleted' error contract for soft-deleted feeds. This is rich behavioral context beyond structured fields.
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?
Purpose is correctly front-loaded, but the body is a single dense paragraph with a long inline field dump. Given no output schema, return-shape explanation is warranted, yet the packaging is hard to parse and could be segmented rather than delivered as one wall of text.
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 a read-only 3-param tool with no output schema, the description covers return shape, edge cases (soft-delete, disabled rules, currency), prerequisites, and sibling routing. Nothing material an agent needs to call it correctly is missing.
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 only 33% (just response_format documented), so the description must compensate and does: feed_id is 'the id from list_feeds / create_feed' and project_id is OPTIONAL/inferred, with list_projects named when required. Only response_format's two modes are left to the schema, so it adds clear 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?
States a specific verb+resource ('Get the full detail of one feed') and enumerates the scope: identity + state + attribute mapping. It clearly differentiates itself from get_feed_status, get_feed_output, list_feeds, and even update_feed in the sibling set.
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?
Explicitly routes the agent: 'Use get_feed for configuration/mapping and get_feed_status for run progress,' names map_feed_attribute/list_source_attributes for the next step, and states prerequisites (dataStatus='ok'). It also handles project_id optionality and the soft-delete/restore path, so when-to-use is fully covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_feed_outputARead-onlyIdempotentInspect
Read the CURRENT output of a feed's already-generated file WITHOUT regenerating it — so it works on a read-only connection (unlike export_feed, which regenerates the file and is a write action). Use this to see what a feed currently contains: its live download URL, product count and a sample of the actual rows, instead of downloading the file and counting it yourself. Inputs: feed_id (the feed's id from list_feeds / create_feed), project_id (OPTIONAL — inferred for a single-project customer; project_id_required if they have several, then call list_projects), sample_size (default 20, max 20), offset (default 0 — skip this many rows to read a deeper page; page by increasing offset in steps of sample_size). Returns {feedId, projectId, feedCode, fileFormat, feedUrl, fileExists, fileSize, productsCount, lastGeneratedAt, sampleRowCount, sample:[{field: value}, ...]}. feedUrl is the public download URL of the current file; productsCount is exactly the number of rows in that file; lastGeneratedAt is when it was last generated. fileExists:false means the feed has not been generated yet — call export_feed, then poll get_feed_status until it is generated. The sample rows are real feed data returned only after you set acknowledge_sensitive:true. The first call (flag absent/false) returns {sensitiveGate:{confirmationRequired:true, itemCount, fields, kind}} with sample EMPTY (all the metadata is still returned) — present that gate to the USER, get approval, then re-call with acknowledge_sensitive:true to receive the rows.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | Skip this many rows to read a deeper page of the feed; page by increasing offset in steps of sample_size (default 0). | |
| feed_id | Yes | ||
| project_id | No | ||
| sample_size | No | How many feed rows to return in the sample (default 20, max 20). | |
| acknowledge_sensitive | No | Set true only AFTER the user approves seeing real data. When absent/false the tool returns a sensitive gate with an empty sample (metadata still included); with true it returns the actual rows. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered by structured data. The description adds real behavioral context the annotations cannot: the sensitive-data gate requiring acknowledge_sensitive:true after user approval, and the reduced first-call response with an empty sample. However, because the read-only/idempotent traits are fully carried by annotations, the marginal descriptive contribution is moderate rather than exceptional.
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?
Front-loaded with purpose and contrast to export_feed, then metadata, then the gate workflow. It is a dense wall of text that repeats offset/sample_size defaults already in the schema, but with no output schema the return-value listing is legitimate content, so most sentences earn their place.
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?
No output schema exists, and the description fully enumerates the return shape ({feedId, projectId, feedUrl, productsCount, lastGeneratedAt, sample...}) plus the special gate response. Combined with the fileExists:false recovery path and the two-phase sensitive flow, an agent has everything needed to call and interpret this tool.
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 only 60%, so the description must compensate, and it does: it explains feed_id's origin (list_feeds/create_feed), project_id's optionality and the project_id_required fallback via list_projects, sample_size default/max, offset paging semantics (steps of sample_size), and the acknowledge_sensitive gate behavior. This adds meaning well beyond the two schema-described params.
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 verb and resource ('read the CURRENT output of a feed's already-generated file') and immediately distinguishes itself from the sibling export_feed, noting it does NOT regenerate. An agent can route between get_feed_output and export_feed without opening either schema.
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?
Explicitly names when to use it (see a feed's live URL, product count, sample rows without downloading) versus the alternative (export_feed regenerates and is a write action). It also gives conditional guidance: project_id inference rules, what to do on fileExists:false (call export_feed then poll get_feed_status), and the two-call sensitive-gate flow.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_feed_statusARead-onlyIdempotentInspect
Get the runtime status of one feed: generation state, progress, last run/submit and any error. Returns {feedId, projectId, feedCode, status, enabled, progressPercent, productsCount, lastRunAt, submitStatus, lastSubmitAt, fileExists, errorMessage}. status is one of new|pending|processing|generated|submited|error|overlimit. Next action per status: generated → verify_feed_attributes then submit_feed; processing/pending → keep polling; error → read errorMessage, fix, export_feed; overlimit → feed exceeds the plan limit. Use get_feed for configuration/mapping and this tool for run progress. feed_id is the id from list_feeds / create_feed. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| feed_id | Yes | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world, so safety is covered, but the description goes well beyond them: it discloses the enumerated status alphabet, the meaning of 'overlimit', the recommended polling behavior for processing/pending, and the error recovery path. It also documents the inferral behavior of project_id (optional for single-project customers, required otherwise), which is behavioral context no annotation provides.
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?
Front-loaded with purpose, then return shape, then status semantics, then parameter notes — no sentence is wasted. It is a dense wall of text rather than scannable structure, which costs it a point, but nothing is 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?
There is no output schema, so the inline return-field list and status enum are necessary and present. Combined with next-action guidance, sibling differentiation, and parameter provenance, an agent has everything needed to call and interpret this tool correctly.
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 0%, so the description carries the full burden and does so: feed_id is defined as 'the id from list_feeds / create_feed', and project_id is explained as OPTIONAL with the inference rule and the fallback action (call list_projects) when project_id_required. This is meaning the schema's bare integer types cannot convey.
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 verb and resource ('Get the runtime status of one feed') and enumerates the exact facets returned: generation state, progress, last run/submit, and error. It further differentiates itself from the sibling get_feed by contrasting 'run progress' against 'configuration/mapping', so an agent can select it without opening either schema.
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?
Explicitly names the alternative ('Use get_feed for configuration/mapping and this tool for run progress') and gives a full when-to-do-what decision table keyed on status: generated → verify_feed_attributes then submit_feed; processing/pending → keep polling; error → fix + export_feed; overlimit → plan limit. This is explicit routing rather than implied usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_import_statusARead-onlyIdempotentInspect
Check whether a project's store data is connected, imported and fresh before advising on feeds/mapping. Returns {projectId, code, apiStatus, dataStatus, lastImportAt, progressPercent, productsCount, categoriesCount, lastRun:{...}, recentRuns:[{status, type, startedAt, endedAt, productTotal, productsAvailable, errorMessage, importTimeSeconds, running}]}. apiStatus is GRANTED|REVOKED|OVERLIMIT; dataStatus is not_imported|pending|processing|ok|error|suspend|stopped (the project-wide state — map only when 'ok'). recentRuns lists the latest runs newest-first, each tagged by type (normal|partial|api_source|additional_source|upgrade) and running (true while pending/processing); lastRun is the newest of them. Use recentRuns to verify a specific enrichment import: after set_api_source/set_ai_source with apply:true (or run_import), poll here until the newest run of that type (api_source for set_api_source, additional_source for set_ai_source) has running:false and status 'ok' — THEN the new attribute is available in list_source_attributes / list_api_sources and you can map it or continue the integration. A run with status 'error' → read its errorMessage and run_import to retry. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects). When dataStatus='ok', proceed to preview_products then list_feed_templates.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint, idempotentHint, destructiveHint=false, but the description adds substantial behavioral context beyond them: the full return shape (including nested lastRun and recentRuns), status enum meanings, the rule that mapping should only occur when dataStatus='ok', and the polling semantics for enrichment imports. This is exactly the kind of extra detail that helps an agent use the tool correctly.
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-structured and front-loaded: purpose first, then return shape, then status semantics, then usage workflows. Every sentence earns its place—even 'lastRun is the newest of them' clarifies a non-obvious relationship. There is 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?
Given one optional parameter, no output schema, and rich annotations, the description is complete: it explains the return data, status enums, polling workflow, error recovery, and next steps. An agent has everything needed to call it correctly and interpret the result without external documentation.
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 0% for the single project_id parameter, so the description must compensate fully. It does: 'project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects)'. This explains the optionality, the fallback condition, and the recovery action, adding complete meaning beyond the bare schema type.
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 and resource: 'Check whether a project's store data is connected, imported and fresh'. It distinguishes from siblings like get_feed_status by clarifying it's about project-level store import status before feeds/mapping, and it even names the follow-up tools (preview_products, list_feed_templates). An agent can tell what this tool does 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use: 'before advising on feeds/mapping', and when to poll: 'after set_api_source/set_ai_source with apply:true (or run_import), poll here until the newest run of that type has running:false and status 'ok''. Also gives error handling ('run_import to retry') and next steps ('proceed to preview_products then list_feed_templates'). No ambiguity about alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_marketplaceARead-onlyIdempotentInspect
Get the full detail of one marketplace: identity + state + the configuration wizard steps. CRITICAL — read activationBehavior in the RESULT: 'summary_step_activates_and_submits_all' means completing the wizard's SUMMARY step ACTIVATES the marketplace and publishes EVERY matching product to the LIVE channel (spends budget), so to test safely set MANUAL mode FIRST (set_marketplace_product_mode) — it then reads 'summary_step_activates_no_auto_submit' and activation auto-submits nothing; 'already_active' = already live. Returns {integrationId, projectId, name, channelCode, kind, definitionCode, status, ready, lastStep, isReady, isConnected, isOverlimit, primarySync, orderSync, canEnableOrderSync, productMode, orderMode, taxonomyCode, categoryMappingRequired, connectionStatus, connectionMessage, connectionExpiresAt, steps:[{type, label, sort, index, ready, current, fields:[{code, label, type, required, options, optionsSource, optionsPending, htmlAttributes, value, help, showIf, hiddenIf}]}], editUrl, activationBehavior}. steps describe the setup wizard: 'current' is the next step to configure (via configure_marketplace_step, targeting it by its index — two steps can share a type) and 'ready' marks completed steps; fields is that step's input schema. Do not cache this schema across the auth step: field metadata from the channel connection (options, resolved defaults) does not exist before it. The connection/auth step (OAuth or credentials) is NOT configurable via MCP — the user completes it in the browser / Koongo UI. taxonomyCode is set AUTOMATICALLY from the channel and is READ-ONLY. Full field-by-field reference (step payloads, optionsPending, connection health, category mapping, order sync, marketplace_status): call koongo_knowledge with slug 'marketplace-wizard-steps'. marketplace_id is the id from list_marketplaces / create_marketplace. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | ||
| marketplace_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite readOnlyHint=true, the description adds substantial beyond-annotation context: the critical activationBehavior warning (SUMMARY step activates and spends budget), the safe-testing guidance to set MANUAL mode first, the auth step not being configurable via MCP, taxonomyCode being read-only, and caching caveats across the auth step. These are strong value-adds.
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?
Front-loaded purpose is good, but the description is a dense wall of text with mixed concerns (activation warning, return schema enumeration, caching, auth, read-only notes, knowledge lookup, parameter provenance). Some of the return-field enumeration duplicates what an agent would discover. Could be trimmed.
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 no output schema and low schema coverage, the description carries the return shape and step/field semantics thoroughly, covers connection/auth limits, points to koongo_knowledge for deep reference, and handles the activation risk. Complete for a complex read tool.
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 0%, so the description must compensate. It explains marketplace_id provenance and project_id's optional/inferred behavior plus project_id_required path — meaningful, but the two integer parameters are simple and the schema's exclusiveMinimum is not addressed. Marginal coverage, not full compensation.
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 verb and resource ('Get the full detail of one marketplace') and enumerates exactly what is returned: identity, state, and the configuration wizard steps. This is clearly distinguishable from siblings like list_marketplaces (plural listing) and get_marketplace_attributes.
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 sequencing guidance: use marketplace_id from list_marketplaces/create_marketplace, note that project_id is optional and inferred for single-project customers. It doesn't explicitly name competing siblings to avoid, but the context of when to call it is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_marketplace_attributesARead-onlyIdempotentInspect
List a marketplace's OUTPUT attributes and how each is currently sourced — the tool for SOLVING THE ATTRIBUTE FORM (the discipline users struggle with). Returns {integrationId, attributes:[{code, label, required, hidden, valueSource, platformCode, constant, composedValue, defaultPlatformCode, defaultConstant, allowedValues, formatType, ruleId, ruleName, ruleEnabled, priceAttribute, currency, currencyConversionEnabled, configured, stepField}], requiredCount, requiredUnmappedCount, unresolvedCodes}. valueSource is rule|composed|attribute|constant|unmapped (the effective source; a rule attached but ruleEnabled=false does NOT count and the attribute reads 'unmapped'). priceAttribute=true marks a money attribute (formatType price / price_with_delete); for those, currency is its target currency and currencyConversionEnabled whether Koongo converts the value into it (null = not a price attribute). Currency conversion only matters when the price is in a DIFFERENT currency than the store; if the attribute's name already names a currency (e.g. its label/code contains "EUR") the value is ALREADY in that currency, so set currencyConversionEnabled=false to avoid converting it twice. requiredUnmappedCount is the running count of REQUIRED attributes with no working source — 0 means the form is solved and the integration can build/export; unresolvedCodes lists exactly which ones to fix. Pass only_unresolved:true to get just those rows. To fill one, match the user's attribute label to its code, then map_marketplace_attribute. Each row also says WHERE its value comes from: configured=true is a mapping of the customer's own, stepField names a wizard form step field that drives it (change it there with configure_marketplace_step — mapping it here writes an override that beats the step for good), and neither means the value is only the channel definition's default. A default is not a decision: check it against the store's data before trusting it. marketplace_id is from list_marketplaces. project_id is OPTIONAL (project_id_required otherwise — then call list_projects). IF categoryAttributeWarmup IS PRESENT WITH pending:true THIS LIST IS INCOMPLETE: the channel's category-specific attributes are still downloading, so requiredUnmappedCount and unresolvedCodes are PROVISIONAL — a required attribute that is not in the list yet cannot be counted as unmapped, so the form can look solved when it is not. Poll marketplace_status until the block is absent or state is 'ready', then read this again before mapping.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | ||
| marketplace_id | Yes | ||
| only_unresolved | No | Return only REQUIRED attributes that still have no working value source. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read (readOnlyHint, idempotentHint, non-destructive), and the description adds substantial context beyond them: the ruleEnabled=false pitfall where a rule silently reads as 'unmapped', the currency double-conversion trap, the configured/stepField/default precedence and the warning that a step override 'beats the step for good', and the provisional-count caveat during category warmup. These are exactly the traps annotations cannot express.
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?
Front-loaded with purpose and workflow before descending into field semantics, and nearly every sentence carries operational value rather than filler. It is nonetheless a very dense block that enumerates roughly twenty return fields inline, which is heavy for a single paragraph and slightly harder to scan than it needs to be given there is no output schema to carry that load.
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?
With no output schema, the description carries the full burden of explaining the return payload and does so field-by-field (valueSource enum, priceAttribute/currency semantics, requiredUnmappedCount, unresolvedCodes) plus the warmup state caveat. For a complex, workflow-coupled mapping tool this is complete enough to call correctly on the first try.
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 only 33% (one of three params documented), so the description must compensate and does: only_unresolved is explained as returning just the REQUIRED-but-unresolved rows, marketplace_id is sourced from list_marketplaces, and project_id's optionality plus the project_id_required fallback to list_projects is spelled out. No parameter is left ambiguous.
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 verb+resource ('List a marketplace's OUTPUT attributes and how each is currently sourced') and frames the tool's job sharply as 'SOLVING THE ATTRIBUTE FORM'. This is far more specific than a tautology. It does not explicitly contrast itself with the closest siblings (get_ad_attributes, list_source_attributes, get_category_mapping), so an agent must infer the marketplace vs. ad-channel distinction rather than being told.
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?
Explicitly names when to use it (solving the form, resolving requiredUnmappedCount/unresolvedCodes), the immediate follow-up (map_marketplace_attribute to fill one, configure_marketplace_step to change a step-driven value), and the prerequisites (marketplace_id from list_marketplaces; project_id optional or list_projects when required). It also states a when-NOT-to-trust condition: with pending warmup the list is incomplete, so poll marketplace_status first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_marketplace_channelARead-onlyIdempotentInspect
Get, for ONE marketplace channel, the integration TYPES it supports and each type's capabilities. Returns {channelCode, label, kind, devOnly, multichannel, multichannelCode, definitions:[{definitionCode, type, typeLabel, label, versionType, primary, capabilities:{orderSync, categoryMapping, productFilter, attributeMapping}}]}. kind is always 'marketplace' here. versionType is 'primary' or 'secondary' and primary marks the default definition. capabilities tell you what a given definition supports (order sync, category mapping, product filtering, attribute mapping). Call this before create_marketplace to choose the right definition for the channel. channel_code is the channelCode from list_marketplace_channels. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects and pass its project_id).
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | ||
| channel_code | Yes | channelCode of the marketplace channel (from list_marketplace_channels). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, non-openWorld). The description adds real behavioral value beyond that: it enumerates the returned payload shape (channelCode, label, kind, definitions with capabilities), clarifies that kind is always 'marketplace', and explains versionType/primary semantics. This meaningfully compensates for the absence of an output schema.
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?
Front-loaded with the core purpose, followed by return shape and then parameter/usage notes — a logical order. The inline JSON return-shape block is dense but justified by the lack of an output schema; otherwise efficient, with only minor redundancy in restating capabilities.
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 read-only, 2-parameter tool with no output schema, the description covers everything an agent needs: what it returns (including field-level semantics), when to call it, and how to supply both parameters. Nothing essential is missing.
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 only 50% (channel_code is described, project_id is bare), yet the description compensates: it explains channel_code's origin ('from list_marketplace_channels') and fully characterizes project_id's optionality and fallback ('inferred for a single-project customer; project_id_required otherwise'). This adds semantics the schema alone does not provide.
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 verb+resource ('Get ... the integration TYPES it supports and each type's capabilities') scoped to ONE marketplace channel. The scoping word 'ONE' implicitly distinguishes it from the sibling list_marketplace_channels, and the named downstream use (before create_marketplace) separates it from get_marketplace.
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?
Explicitly states when to call it ('Call this before create_marketplace to choose the right definition for the channel') and documents the dependency chain (channel_code from list_marketplace_channels, project_id from list_projects when required). No explicit when-not-to-use case or named alternative tool, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_marketplace_item_historyARead-onlyIdempotentInspect
Get ONE listing item's action-log timeline — the sequence of events that acted on the product and its Koongo/channel state at each point, so you can explain WHY an item ended in its current state (e.g. it was created, changed, validated, pre-paired, submitted, rescheduled, removed, locked). Returns {itemId, returned, entries:[{createdAt, event, eventLabel, message, messageLabel, operation, operationLabel, koongoStatus, channelStatus}]} newest first. eventLabel/messageLabel/operationLabel are the human-readable rendering the Koongo UI shows (event name, plain-language explanation, operation title); event/message/ operation are the raw codes. Entries are process metadata only (no raw product values). item_id is the itemId from list_marketplace_items (the same id get_marketplace_item_report uses). Pair this with get_marketplace_item_report (current errors) to diagnose a failing product. marketplace_id is the integrationId from list_marketplaces. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max timeline entries to return (default 20, max 50). | |
| item_id | Yes | The listing itemId (from list_marketplace_items). | |
| project_id | No | ||
| marketplace_id | Yes | integrationId of the marketplace (from list_marketplaces). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld=false), so the marginal burden is low. The description does add real behavioral context: entries arrive newest-first, labels versus raw codes are both returned, and entries are process metadata only with no raw product values. It stops short of describing pagination semantics, truncation behavior, or what happens when an item has no history.
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?
Purpose is front-loaded and every clause does work, but the middle run-on sentence packs the return shape, three label/raw-code pairs, and a metadata caveat into a dense block. Line breaks or a short structured list would have improved scanability without losing 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?
There is no output schema, and the description compensates fully by inlining the return shape ({itemId, returned, entries:[...]}) with every field named, plus the meaning of the label fields. Combined with ID provenance and the sibling-tool workflow, an agent has everything needed to call this correctly on the first attempt.
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 75%, so the schema already documents item_id, marketplace_id, and limit. The description adds genuine meaning the schema lacks: project_id is optional/inferred, and both required IDs have named source tools. However, the limit parameter's interaction with the timeline (default 20, max 50) is left entirely to the schema, and no filtering or ordering semantics for it are added.
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 verb and resource ('Get ONE listing item's action-log timeline') and adds the scope qualifier 'ONE' plus the outcome it enables ('explain WHY an item ended in its current state'). The enumerated event vocabulary and the explicit contrast with get_marketplace_item_report make it distinguishable from the many sibling get_*_report tools.
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?
Names the companion tool and the condition for pairing it ('Pair this with get_marketplace_item_report (current errors) to diagnose a failing product'), and explains the project_id prerequisite including the fallback ('inferred for a single-project customer; project_id_required otherwise — then call list_projects'). ID provenance is given for every required parameter.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_marketplace_item_reportARead-onlyIdempotentInspect
Get the detailed report for ONE listing item of a marketplace: why this product fails or warns on the channel. Returns {itemId, koongoProductId, status, statusDescription, channelStatus, channelStatusLabel, channelStatusDescription, reportMessage, reportCode, errors:[{source, field, fieldLabel, message, code, level, additionalInfo, currentValue}], sensitiveGate}. statusDescription/channelStatusLabel/ channelStatusDescription and each error's fieldLabel are the human wording the Koongo UI shows (status + attribute name); status/channelStatus/field are the raw codes. source is export|adapter|api_error; level is error|danger(=warning)|info. currentValue is the offending value that was sent to the channel. SENSITIVE-GATE: currentValue exposes real product data, so the first call (acknowledge_sensitive absent/false) returns the report with currentValue withheld and a {sensitiveGate:{confirmationRequired:true, itemCount, fields, kind}} — present that gate to the USER, get their approval, then re-call with acknowledge_sensitive:true to receive the actual values. item_id is the id from list_marketplace_items; marketplace_id is the id from list_marketplaces. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects). For the marketplace-wide breakdown use get_marketplace_report.
| Name | Required | Description | Default |
|---|---|---|---|
| item_id | Yes | ||
| project_id | No | ||
| marketplace_id | Yes | ||
| acknowledge_sensitive | No | Set true only AFTER the user approves seeing real data. When absent/false the tool withholds currentValue and returns a sensitiveGate; with true it returns the actual values. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a safe, idempotent read, but the description adds material behavior on top: the sensitive-gate protocol (first call withholds currentValue and returns a sensitiveGate, user approval is required, then re-call with acknowledge_sensitive:true), plus the semantics of source, level, and human-vs-raw code fields. This is exactly the kind of behavioral context annotations cannot carry.
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?
Purpose, return shape, gate flow, parameter provenance, and the sibling alternative are all front-loaded in priority order with no wasted sentences. The single dense paragraph enumerating every return field is justified given there is no output schema, though formatting it into distinct blocks would improve scanability.
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?
With no output schema, the description carries the return-value burden and does so by enumerating the payload fields and explaining the gate object. Combined with parameter provenance and the alternative-tool pointer, an agent has everything needed to invoke this correctly in one or two calls.
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 only 25%, so the description must compensate, and it does by giving provenance for item_id and marketplace_id, explaining project_id's optional/inferred behavior, and restating the acknowledge_sensitive gate. It adds routing value more than deep per-field semantics (e.g. no constraint notes), so it falls just short of a full 5.
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 ('Get the detailed report for ONE listing item of a marketplace') and immediately scopes it ('why this product fails or warns on the channel'). It names the sibling it is not ('For the marketplace-wide breakdown use get_marketplace_report'), so an agent can distinguish it from get_marketplace_report and get_ad_item_report without opening a schema.
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 routes the agent: item_id comes from list_marketplace_items, marketplace_id from list_marketplaces, project_id is optional/inferred or requires list_projects when project_id_required, and get_marketplace_report is named for the marketplace-wide case. When-to-use, prerequisites, and alternatives are all stated rather than implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_marketplace_reportARead-onlyIdempotentInspect
Get the validation report for one marketplace: the aggregated errors and warnings that block or degrade its listing, with fix suggestions. The errors are SPLIT into two groups (as in the CP's two separate views). Returns {integrationId, errorCount, warningCount, statusCounts:[{status, count}], listingStatusCounts:[{status, count}], dataCheckErrors:[...], channelErrors:[...]}, where each error is {source, field, message, code, level, count, fixSuggestions:[{type, stepType, label}]}. dataCheckErrors = the pre-submission KOONGO DATA CHECK (feed-generation validation, source='export' — the same the wizard summary/preview shows, produced when the feed is generated BEFORE anything reaches the channel). channelErrors = the marketplace's OWN responses AFTER submission (source='adapter'/'api_error' — the integration detail). errorCount/warningCount are the COMBINED totals across both groups. Data-check errors exist only after a generation has run — finish the wizard, or repair_marketplace to (re)generate; export is async, so poll marketplace_status until productsRefreshing AND productsSubmitting are false, then read the report. statusCounts is how many items sit in each koongo processing status (e.g. completed / error / pending); listingStatusCounts the same by channel listing status (e.g. active / rejected / error). level is error|danger(=warning)|info; count is how many products hit that error. fixSuggestions.type is add_category_mapping|fix_settings|rewrite_attribute| exclude_product, and stepType (when set) names the wizard step to open with configure_marketplace_step. This is the marketplace-wide breakdown; for a single product's report use get_marketplace_item_report. marketplace_id is the id from list_marketplaces. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | ||
| marketplace_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds substantial behavior beyond them: the two-group split of errors sourced from export vs adapter/api_error, the async generation dependency, and the required polling sequence. This is exactly the operational context an agent needs to call it correctly.
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 purpose and scoping are front-loaded, and the dense output-shape and fix-suggestion detail is largely load-bearing, but the single giant paragraph mixes return format, async caveats, and parameter notes with little visual structure, and side comments like '(as in the CP's two separate views)' add minor noise.
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?
With no output schema, the description fully specifies the return shape (top-level counts, statusCounts, listingStatusCounts, dataCheckErrors, channelErrors and the per-error fields), plus the async precondition. Nothing an agent needs to invoke or interpret the tool is missing.
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 0%, so the description must compensate, and it does: marketplace_id is defined as the id from list_marketplaces, and project_id is documented as optional/inferred with the project_id_required fallback and the list_projects remedy. Both parameters are fully disambiguated.
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 verb and resource ('Get the validation report for one marketplace') and immediately scopes it as aggregated errors/warnings blocking listing, explicitly contrasting with the sibling get_marketplace_item_report for single products. An agent can distinguish this from all other report tools.
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?
Gives explicit preconditions and alternatives: data-check errors only exist after a generation has run, so finish the wizard or call repair_marketplace, and because export is async, poll marketplace_status until productsRefreshing AND productsSubmitting are false before reading the report. It also names get_marketplace_item_report for the single-product case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_order_connectionARead-onlyIdempotentInspect
Full detail of ONE standalone order connection, including its Orders Config form. Returns {connectionId, name, channelCode, channelLabel, channelApiCode, status, orderStatus, orderSyncLevel, authType, connected, expired, hasCredentials, authMessage, lastSyncStatus, lastSyncAt, lastSyncMessage, ordersThisMonth, orderConfigFields:[{code, label, description, type, required, options, optionsSource, value, defaultValue, adminOnly, locked, addonCode, upsellUrl}]}. A field with locked:true is a paid feature (not included in the current plan) and cannot be set until unlocked; options may be null for a field whose choices are only known after the connection is authenticated. Use orderConfigFields to build a configure_order_connection call. connection_id is from get_order_overview. project_id is OPTIONAL (project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | ||
| connection_id | Yes | connectionId of the order connection (from get_order_overview). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely non-obvious data semantics: locked:true means a paid feature that cannot be set until unlocked, and options may be null until the connection is authenticated. It does not cover error behavior for a bad connection_id, but the added constraints are substantive.
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?
Purpose and routing are front-loaded, and the long field enumeration substitutes for the missing output schema so it earns its space. The block is dense and could be tightened, but no sentence is pure 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?
With no output schema and only partial schema coverage, the description carries the burden and delivers: it enumerates the return shape, explains two tricky field semantics, and closes the loop with the sibling calls needed to go from overview to configuration. Complete for this tool.
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 only 50% (project_id is undocumented in the schema), and the description fully compensates: it states where connection_id originates and that project_id is optional with the exact conditional fallback when project_id_required is set. Nothing an agent needs to supply the parameters is missing.
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?
Starts with a specific verb+resource and scope: 'Full detail of ONE standalone order connection.' The word 'ONE' and 'standalone' implicitly distinguish it from get_order_overview, which is named as the source of the ID. An agent can tell what it retrieves 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: connection_id comes from get_order_overview, the returned orderConfigFields feeds configure_order_connection, and project_id behavior is spelled out with the fallback (call list_projects when project_id_required). Both the input source and the downstream consumer are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_order_overviewARead-onlyIdempotentInspect
The project's ORDER dashboard for standalone order connections (marketplaces managed WITHOUT a product wizard). Returns order counts and the project's order connections in one call: {ordersToday, ordersThisMonth, ordersLastMonth, ordersLast12Months, ordersWithError, ordersNotInserted, activeConnectionCount, syncStatus, syncStatusLabel, syncStartedAt, syncedAt, syncMessage, connections:[{connectionId, name, channelCode, channelLabel, channelApiCode, status, orderStatus, orderSyncLevel, authType, hasCredentials, lastSyncStatus, lastSyncAt, lastSyncMessage}]}. orderStatus is 'active'|'disabled'|'not allowed'|'overlimit' (whether that connection is syncing orders). Start here to see order state, then drill into one connection with get_order_connection. A newly added connection appears here once the user finishes authentication in the Koongo UI. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotent/destructive=false, and the description adds real value beyond them: the full return shape, the meaning and enum values of orderStatus, the rule that a new connection only appears after the user finishes authentication in the Koongo UI, and the project_id inference behavior.
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?
Purpose is front-loaded in the first clause, but the inline enumeration of every returned connection field is verbose. It earns most of its length by substituting for an absent output schema, though it could be trimmed without losing routing value.
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?
With no output schema, the description carries the full burden of describing return values and does so thoroughly (counts, sync state, connections array). Combined with annotations covering safety, an agent has everything needed to call and interpret this tool.
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 0% for the single project_id parameter, but the description compensates by explaining it is OPTIONAL, gets inferred for single-project customers, and that project_id_required triggers list_projects. That is meaningful semantics beyond the bare integer 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?
States a specific verb+resource (order dashboard) and scopes it precisely to standalone order connections (marketplaces without a product wizard), explicitly separating itself from get_order_connection which drills into a single connection. An agent can distinguish it from siblings like list_orders and get_order_connection immediately.
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?
Gives explicit when-to-use ('Start here to see order state'), names the follow-up alternative ('then drill into one connection with get_order_connection'), and describes the project_id prerequisite path (optional when single-project, otherwise project_id_required and call list_projects).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_profileARead-onlyIdempotentInspect
Get a project's catalog product profile so you can recommend suitable sales channels for it. Returns {projectId, marketCategories:[{name, score, source}], stats:{productsCount, productsTotal, categoriesCount, avgPrice, medianPrice, currency, eanFillRate, eanBucket, metricsSyncedAt}}. marketCategories is the AI-detected catalog VERTICAL, ordered by score DESC — the first is the dominant vertical (e.g. 'Fashion & Accessories', 'Home & Decoration'); score is 0–1 confidence, source is ai|manual; the list is empty when the catalog has not been categorised yet. stats are catalog aggregates: avgPrice/medianPrice are in currency; eanFillRate is the 0–1 EAN/GTIN coverage and eanBucket its coarse form none|low|medium|high; a null means not-yet-computed (metricsSyncedAt shows how fresh the price/EAN figures are). Use the dominant vertical + price band + EAN coverage to suggest fitting marketplaces/ads: cross-reference list_marketplace_channels / list_ad_channels and propose ONLY channels whose available is true, then walk the create/configure wizard. Never invent channels that aren't in the catalog. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered. The description still adds real behavioral context beyond that: marketCategories is empty when uncategorised, null stats mean not-yet-computed, and metricsSyncedAt conveys freshness. It doesn't discuss failure/auth modes, so a 4 rather than 5.
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?
Front-loaded purpose and usage, then a dense parenthetical of field semantics. It is longer than most definitions but nearly every clause adds operational meaning; the return-shape enumeration is arguably compact enough to keep.
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?
With no output schema, the description fully documents the return shape, field meanings, units, and null/empty edge cases, and it links the result to the recommended next tools. An agent has everything needed to call it and act on the output.
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 0% and the single parameter is otherwise bare, so the description must carry the load — and it does, stating project_id is OPTIONAL but inferred only for single-project customers, otherwise required with a call list_projects. The schema's integer/exclusiveMinimum constraint is not restated, a minor omission.
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?
Opens with a specific verb and resource ('Get a project's catalog product profile') and immediately scopes the intent (to recommend sales channels). An agent can distinguish this from list_projects, get_marketplace, or get_category_mapping without opening any schema.
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?
Explicitly tells the agent what to do with the result (cross-reference list_marketplace_channels / list_ad_channels, propose only channels whose `available` is true, then walk the create/configure wizard) and what not to do ('Never invent channels'). It also routes the project_id fallback: call list_projects when project_id_required. When/when-not/alternatives are all covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ruleARead-onlyIdempotentInspect
Get the full definition of one product rule (Attribute Rule), including its verbatim rules[] (round-trippable — you can edit it and pass it back to update_rule). Returns {ruleId, name, description, category, scope, rules, createdAt, updatedAt}. rules[] is {sortId, enabled, type, conditions, operationGroups:[{mode, parentMode, attributes, operations:[{name, arguments}]}]} (see discover_rule_operations). scope selects the library: 'project' (default) or 'shared_template'. An unknown rule_id returns error 'not_found'. rule_id is from list_rules. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| scope | No | Which library to read from: 'project' (default) = the project's own rules; 'shared_template' = the reusable shared template library. | |
| rule_id | Yes | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint false, openWorldHint false). The description adds useful behavioral context beyond annotations: the error behavior ('not_found' for unknown rule_id), project_id inference/requirement logic, and the verbatim round-trippability of rules[]. However, it does not discuss rate limits or other runtime constraints.
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?
Front-loads the core action (get full definition, round-trippable), then the return shape, then rule structure, then scope, then error and project_id behavior. Efficient but dense; the nested rules[] shape description is long and slightly interruptive to the primary usage message.
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 single-resource read tool with no output schema, the description richly covers return shape, rule array structure, scope semantics, error case, and parameter fallbacks. An agent has everything needed to call it correctly.
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 only 33%, so the description must compensate. It explains scope semantics ('project' default vs 'shared_template'), rule_id's origin (from list_rules), and project_id's optional/inferred vs required behavior. This meaningfully compensates for the low schema coverage, though rule_id's exact source of truth could be tighter.
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 verb+resource (get the full definition of one product/Attribute Rule) and precisely scopes it via 'one rule'. It clearly distinguishes itself from list_rules (which enumerates) and update_rule (which it explicitly references as the round-trip target).
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?
Explicitly explains the round-trip workflow (edit and pass back to update_rule), names sibling tools (list_rules, discover_rule_operations, list_projects), and specifies the fallback when project_id is required. When-to-use vs alternatives is directly addressed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_value_mapping_inputsARead-onlyIdempotentInspect
Get the inputs needed to build a value-mapping rule (Attribute Rule) that remaps a source attribute's values onto a target attribute's allowed set (e.g. store colours → the channel's accepted colour list). Works for BOTH a feed and a marketplace/ad. This is for value→value MAPPING (the map_attribute_value operation); to just assign ONE fixed value from an attribute's option list (a "Set option") use get_attribute_options instead. Returns {sourceValues:[{value, label}], targetAllowedValues:[{value, label}], alreadyMapped:[{search, replace}], hasMore, nextOffset}. sourceValues are the distinct values of source_attribute_code in the store; targetAllowedValues are the values target_attribute_code accepts on the target; alreadyMapped are the pairs already configured. YOU propose the search→replace pairs from these two lists — this tool runs no AI and never writes. Apply the pairs by adding a map_attribute_value operation (arguments search/replace) to the rule via create_rule / update_rule, then attach the rule (map_feed_attribute / map_marketplace_attribute / map_ad_attribute with rule_id); values you leave unmapped pass through unchanged for the user to finish manually. search/replace on the map_attribute_value op you build from these are arrays of {value:''} objects paired by index (NOT plain strings). Pass only_unmapped:true to get only source values that still need a pair; page with offset (from nextOffset) while hasMore is true. TARGET: pass EXACTLY ONE of feed_id (a feed, from list_feeds) or integration_id (a marketplace/ad — the marketplace_id/ad_id from list_marketplaces / list_ads); integration_id resolves the integration's attributes. The attribute codes come from get_feed / get_marketplace_attributes / get_ad_attributes / list_source_attributes. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects). This tool returns real store data values only after you set acknowledge_sensitive:true. The first call (flag absent/false) returns {sensitiveGate:{confirmationRequired:true, itemCount, fields, kind}} with the sourceValues / alreadyMapped arrays EMPTY — present that gate to the USER, get their approval, then re-call with acknowledge_sensitive:true to receive the actual values.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | Pagination cursor: pass the previous response's nextOffset to fetch the next page (default 0). | |
| feed_id | No | Target a feed (from list_feeds). Pass exactly one of feed_id or integration_id. | |
| project_id | No | ||
| only_unmapped | No | When true, return only source values that still need a search→replace pair (skip already-mapped ones); default false. | |
| integration_id | No | Target a marketplace/ad — the marketplace_id or ad_id from list_marketplaces / list_ads. Pass exactly one of feed_id or integration_id. | |
| acknowledge_sensitive | No | Set true only AFTER the user approves seeing real data. When absent/false the tool returns a sensitiveGate with sourceValues / alreadyMapped empty; with true it returns the actual values. | |
| source_attribute_code | Yes | ||
| target_attribute_code | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds material behavior they cannot convey: it runs no AI and never writes, the sensitive-data gate returns empty sourceValues/alreadyMapped on the first call and real values only after acknowledge_sensitive:true, and unmapped values pass through unchanged. This is exactly the extra context the annotation bar leaves room for.
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?
Purpose and the sibling exclusion are front-loaded, and the remaining sentences are information-dense rather than filler. It is nonetheless a long block that mixes output shape, gating, parameter guidance and workflow in one stream; a little structure would improve scanning.
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 an 8-parameter tool with no output schema, the description supplies the return shape (sourceValues/targetAllowedValues/alreadyMapped/hasMore/nextOffset), the two-step sensitive gate, the exclusive target choice, pagination, and the full rule-creation workflow. Nothing needed to call it correctly is missing.
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 63% and the description compensates well: it explains that the attribute codes come from get_feed / get_marketplace_attributes / get_ad_attributes / list_source_attributes, clarifies the feed_id vs integration_id choice and its origins, and adds project_id inference logic ('inferred for a single-project customer ... then call list_projects'). The pagination and only_unmapped semantics largely duplicate the schema, so it sits just below 5.
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 verb and resource ('Get the inputs needed to build a value-mapping rule that remaps a source attribute's values onto a target attribute's allowed set') and gives a concrete example. It explicitly distinguishes itself from the nearest sibling get_attribute_options ('to just assign ONE fixed value ... use get_attribute_options instead'), so an agent can route without opening either schema.
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?
Names the when-to-use (value→value mapping via map_attribute_value), the when-not plus the alternative (Set option → get_attribute_options), and the downstream workflow (create_rule / update_rule, then map_feed_attribute / map_marketplace_attribute / map_ad_attribute with rule_id). It also states the fallback behavior for unmapped values.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
koongo_knowledgeARead-onlyIdempotentInspect
Fetch Koongo help/reference knowledge ON DEMAND — glossaries and deep-detail topics kept out of the always-loaded instructions to save context. Call with NO args for the topic index (slug + title + summary); with slug for one topic's full body (plus a canonical help url when available); with query to keyword-search the corpus. Reach for it when you need to interpret a marketplace/ad listing status or item status (from list_*items / get*_item_report / *_status / *_report), or need the reference for the product filter, value/options mapping, currency conversion, or safe activation. Topics: listing-and-item-status, product-filter, value-and-options-mapping, currency-conversion, safe-activation, marketplace-wizard-steps, ad-wizard-steps, rule-authoring. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | No | ||
| query | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds genuinely useful behavior: context-saving purpose, the no-args/slug/query mode split, and per-mode return shapes. It does not say whether slug and query can be combined or what happens if both are supplied.
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?
Front-loaded with the core purpose and the three modes, then the trigger conditions. The topic enumeration is long but earns its place by enabling selection without a round-trip; overall density is high with little 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?
With no output schema, the description compensates well by describing what each mode returns (slug+title+summary index; full body plus canonical help URL). Remaining gap is only the ambiguous both-parameters case, which is minor for a two-param read-only lookup.
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 0%, so the description must carry the load, and it does explain both parameters' semantics (slug = one topic's full body plus canonical URL; query = keyword search; no args = index). It stops short of stating the slug format or the precedence/behavior when slug and query are both given.
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 verb and resource (fetch Koongo help/reference knowledge) and spells out three distinct invocation modes with their returns. It is the only knowledge/reference tool among the siblings, so differentiation is inherent and reinforced by the scope note that this content is kept out of always-loaded instructions.
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?
Explicitly says when to reach for it, naming the upstream tools whose output it helps interpret (list_*_items, get_*_item_report, *_status, *_report) and the four reference areas it covers. It also enumerates the available topics, so an agent can decide before calling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ad_channelsARead-onlyIdempotentInspect
Search the CATALOG of ADS channels you can ADD — advertising channels (Google Shopping, Meta, Microsoft, Pinterest, …) you can create an ads integration for (to list the ads that ALREADY exist, use list_ads). Ads are ads-based channels (advertising / price-comparison / classifieds), not marketplaces: they publish products to the ad platform and have no order sync. SEARCHABLE + PAGED: pass query to match a channelCode/label, page with limit/offset (response carries hasMore + nextOffset). Response = {channels, returned, total, kind, hasMore, nextOffset}; each channel = {channelCode, label, kind, available, availabilityReason, authType, orderSyncSupported, multichannel, multichannelCode, primaryChannelCode, devOnly, upgradeUrl, appstoreUrl, feedManagerUrl}. available=false → availabilityReason says why: 'plan_limit' (not included in the current plan) or 'appstore' (unavailable through this connection). orderSyncSupported is always false for ads. Use channelCode with get_ad_channel (definition types + capabilities) then create_ad. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max channels per page (default 50, max 200). | |
| query | No | Filter to channels whose code or label contains this text. | |
| offset | No | Channels to skip; use the response nextOffset to page. | |
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive, so safety is covered. The description adds genuinely useful behavior beyond them: search + paging semantics (limit/offset, hasMore, nextOffset), the meaning of available=false with 'plan_limit' and 'appstore' reasons, and the invariant that orderSyncSupported is always false for ads. It does not restate annotation facts but enriches them.
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 opening sentence front-loads the core purpose and the disambiguation before detail. It is dense and somewhat long for a list tool — the embedded response-field enumeration ({channelCode, label, kind, ...}) is heavy — but every clause carries usable information, so it stays just this side of bloated.
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?
There is no output schema, and the description fully compensates by spelling out the response envelope ({channels, returned, total, kind, hasMore, nextOffset}) and per-channel fields, plus the availability/auth semantics. For a 4-parameter, zero-required list tool, nothing an agent needs to call it correctly is missing.
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 75% and the schema already documents limit/query/offset. The description goes further by explaining the practical use of each (query matches channelCode/label, offset driven by response nextOffset) and by clarifying that project_id is OPTIONAL and inferred for single-project customers but triggers project_id_required otherwise, which the schema does not convey at all.
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 and resource — searching the CATALOG of ads channels you can ADD — and immediately contrasts it with the sibling it is most easily confused with ('to list the ads that ALREADY exist, use list_ads'). It further scopes 'ads-based channels (advertising / price-comparison / classifieds), not marketplaces', so an agent can distinguish it from list_marketplace_channels and list_order_channels without opening any schema.
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 names when to use this versus alternatives (list_ads for existing ads, get_ad_channel + create_ad as the downstream flow), and documents the conditional next step when project_id is required (call list_projects). That is a full when/when-not/next-step routing guide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ad_itemsARead-onlyIdempotentInspect
AD items — list the individual listing items of one ADS integration, the per-product rows for listing-based ad channels (e.g. Marktplaats and other classifieds, which create one ad per product). Some ad channels (e.g. Google Shopping) submit the whole product set in bulk rather than as individual listings and so have no per-item rows — they return an empty list; use ad_status / get_ad_report for those. Returns {integrationId, total, returned, items:[{itemId, koongoProductId, parentId, productType, status, channelStatus, listingId, listingUrl, hasErrors, errorCount}]}. Filter with koongo_status, channel_status, listing_id or product_id to find failures; page with limit / offset. Rows carry only identifiers + statuses (no gate); an item's actual attribute value + full error report come from get_ad_item_report. itemId is what you pass to get_ad_item_report / get_ad_item_history. ad_id is the integrationId from list_ads. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | integrationId of the ad (from list_ads). | |
| limit | No | Max items to return (page size). | |
| offset | No | Number of items to skip (paging). | |
| listing_id | No | Filter by the item's listing id on the channel. | |
| product_id | No | Filter to one Koongo product id. | |
| project_id | No | ||
| koongo_status | No | Filter by the Koongo-side listing status. | |
| channel_status | No | Filter by the channel's own listing status. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds real beyond-annotation context: bulk channels yield an empty list rather than an error, rows carry only identifiers plus statuses with no attribute gate, and full values/error reports require get_ad_item_report. It also documents the project_id inference failure mode and the follow-up call required.
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?
It is a single dense paragraph that front-loads the core purpose and return shape before filters and prerequisites. Every sentence carries information, though the run-on packing of return shape and routing hints slightly hurts scannability.
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?
With no output schema, the description compensates by listing the full return structure ({integrationId, total, returned, items:[...]}) with field names, plus filtering, paging, and downstream tool routing. Nothing an agent needs to call and interpret this tool correctly is missing.
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 88% and already documents most parameters, but the description adds cross-tool semantics: itemId is the key to pass to get_ad_item_report/get_ad_item_history, ad_id is the integrationId from list_ads, and project_id's optional/inferred behavior. This meaningfully exceeds what the schema alone conveys.
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 verb and resource ('list the individual listing items of one ADS integration') and immediately scopes it to per-product listing-based channels, contrasting with bulk channels like Google Shopping. An agent can distinguish it from ad_status, get_ad_report, and get_ad_item_report without opening any schema.
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?
Explicitly names when NOT to use it ('Google Shopping ... return an empty list; use ad_status / get_ad_report for those') and when to use it (filtering koongo_status/channel_status/listing_id/product_id to find failures). It also covers the project_id prerequisite ('inferred for a single-project customer; project_id_required otherwise — then call list_projects').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_adsARead-onlyIdempotentInspect
List the CREATED ads of a project (the advertising integrations that already exist, not the catalog of channels you can add — use list_ad_channels for that). Ads are ads-based channels (advertising / price-comparison / classifieds), not marketplaces: they publish products to the ad platform and have no order sync. Returns {integrations, returned, total}; each row is {integrationId, projectId, name, channelCode, kind:'ads', definitionCode, status, ready, lastStep, isReady, isConnected, isOverlimit, productMode, orderMode, orderSync}. project_id is OPTIONAL: with it you get that project's ads; WITHOUT it you get ads across ALL your projects (each row carries its projectId). If a call returns project_id_required, pick a project (see list_projects) and pass its project_id. integrationId is what you pass as ad_id to get_ad / ad_status and the other ads tools.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds real behavioral context beyond that: ads have no order sync, project_id being optional changes the result scope, the project_id_required error can occur, and the exact return shape is disclosed since no output schema exists.
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 purpose and the key sibling distinction are front-loaded in the first clause. It is dense and the long enumeration of row fields is somewhat encyclopedic, but with no output schema those details earn their place and the structure remains scannable via parentheticals and clauses.
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 zero-mandatory-param list tool with no output schema, the description supplies everything needed: return envelope {integrations, returned, total}, full row shape, ads-vs-marketplaces semantics, optional-parameter behavior, and error handling. Nothing an agent needs to call it correctly is missing.
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 a single parameter at 0% schema coverage, the description fully carries the load: it explains project_id is OPTIONAL, what happens with and without it ('that project's ads' vs 'across ALL your projects, each row carries its projectId'), and the error that triggers when it is needed. This far exceeds what the bare integer schema conveys.
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 verb+resource ('List the CREATED ads of a project') and explicitly contrasts itself with list_ad_channels ('not the catalog of channels you can add'). It also distinguishes ads from marketplaces and names the sibling tool to use instead, so an agent can route correctly without opening either schema.
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?
Gives explicit when-to-use and when-not-to-use guidance: use list_ad_channels for the channel catalog, and pass integrationId as ad_id to get_ad/ad_status. It also documents the project_id_required error path and points to list_projects as the remedy, leaving no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ai_sourcesARead-onlyIdempotentInspect
List the AI sources currently registered on a project (attributes populated via set_ai_source). Returns {items:[{code, url, handle}]} — code is the attribute name (available as custom_ once applied), handle the product key it joins on. project_id is OPTIONAL (inferred for a single-project customer).
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and idempotentHint annotations, the description documents the exact return shape {items:[{code, url, handle}]} and explains the meaning of each field, including the custom_<code> behavior and join semantics of handle. It also discloses that project_id may be inferred, adding valuable runtime behavior not present in 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 the core action. Every sentence adds necessary information: the purpose, the response contract with field semantics, and the only parameter's optionality. There is no wasted text.
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 simple list operation with one optional parameter and no output schema, the description is complete. It gives the return format, explains what code and handle mean, and clarifies project_id behavior, so an agent has everything needed to call the tool correctly.
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?
The input schema provides only the integer type and exclusiveMinimum for project_id, with 0% schema description coverage. The description compensates fully by stating that project_id is optional and inferred for single-project customers, which is essential for correct invocation.
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 a specific verb and resource: 'List the AI sources currently registered on a project'. It ties the data to set_ai_source, which helps distinguish from set/delete_ai_source, but it does not explicitly contrast with list_api_sources, leaving some sibling differentiation to the tool names.
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 implies when to use the tool: to see AI sources that were previously populated via set_ai_source. It also clarifies that project_id is optional and inferred for single-project customers. However, it does not explicitly state when to prefer this over related list tools such as list_api_sources or list_source_attributes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_api_sourcesARead-onlyIdempotentInspect
List the API source attribute codes registered on a project (populated via set_api_source; usable in rules as api_source.). Returns {codes:[...]}. project_id is OPTIONAL (inferred for a single-project customer).
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive. The description adds useful behavioral detail beyond that: it states the exact return shape '{codes:[...]}' and discloses that project_id is inferred for single-project customers. No contradictions exist between description and 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 two succinct sentences with no filler. It front-loads the core purpose, then quickly covers output shape and parameter behavior, earning every word.
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 simple read-only list operation with one optional parameter and no output schema, the description is complete. It covers what is listed, where the data comes from, how it is used, what is returned, and when project_id can be omitted.
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 0%, but the description compensates fully for the single parameter by explaining project_id is optional and inferred for a single-project customer. This gives the agent the key semantic nuance that the bare integer schema does not provide.
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 and resource: it lists 'API source attribute codes registered on a project' and clarifies their role as 'usable in rules as api_source.<code>'. This clearly distinguishes it from generic list tools and connects it to set_api_source.
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 retrieve API source codes, especially after set_api_source. It also explains project_id optionality and inference for single-project customers, but it does not explicitly contrast this with sibling tools like list_source_attributes or list_ai_sources.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_feedsARead-onlyIdempotentInspect
List the customer's CREATED feeds (the feeds that already exist, not the catalog of types — use list_feed_templates for that). Each item is {feedId, projectId, feedCode, name, feedType, fileFormat, channelCode, status, feedUrl, lastRunAt}. project_id is OPTIONAL: with it you get that project's feeds; WITHOUT it you get your feeds across ALL your projects (each item carries its projectId). If a call returns project_id_required, pick a project (see list_projects) and pass its project_id. feedId is the per-project id you pass as feed_id to get_feed / verify_feed_attributes. Integration-managed feeds are excluded; only standalone feeds are returned. Returns all matching feeds in one call; not paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds substantive behavior beyond them: integration-managed feeds are excluded and only standalone feeds returned, results are not paginated, and an error token (project_id_required) with a recovery path is documented. This is behavior an agent cannot get from 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?
Front-loaded with purpose and sibling disambiguation, then item shape, then parameter semantics, then id relationships, then exclusions and pagination. The item enumeration earns its place because there is no output schema; every sentence adds information.
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 single-optional-param read tool with no output schema and full annotation coverage, the description is complete: it explains scope, return shape, exclusions, pagination status, and error handling. Nothing an agent needs in order to call it correctly is missing.
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 0%, so the description carries the full burden and does so: project_id is OPTIONAL, its with/without semantics are spelled out (single project vs all projects), each returned item carries projectId, and the error token plus remediation is described. It also clarifies that feedId is the per-project id passed as feed_id, which the bare integer schema cannot convey.
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 verb+resource ('List the customer's CREATED feeds') and immediately disambiguates from the catalog sibling by naming list_feed_templates as the wrong choice. An agent can distinguish it from get_feed, list_feed_templates and list_projects without opening any schema.
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?
Explicitly covers when to use it vs list_feed_templates, the conditional behavior of project_id (with/without), the error-recovery path when project_id_required is returned (pick a project via list_projects), and where feedId is consumed (get_feed / verify_feed_attributes). When-to-use, when-not, and alternatives are all named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_feed_templatesARead-onlyIdempotentInspect
List the PUBLIC Koongo feed TEMPLATES available for a project — the catalog of feed TYPES you can create from (the feedCode source for create_feed). These are NOT the customer's existing feeds (use list_feeds for those). Each item is {feedCode, name, type, fileType, channelCode, country}. project_id is OPTIONAL: omit it when the customer has a single project (it is inferred); if they have several you get project_id_required — call list_projects and pass one. Pass query as a BROAD coarse filter — ideally just the channel/marketplace name (e.g. 'google'); do NOT put country/format/language words in it, because feed codes are cryptic and a literal match will miss. Instead match the user's request (country e.g. CZ/Czech/Česko, format e.g. xml, type e.g. product vs promotions) against the STRUCTURED fields of the returned items yourself — word order and synonyms don't matter. Show the best matches, let the user confirm which feedCode, then call create_feed. Returns all matching templates in one call; not paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety burden is lifted. The description adds real behavioral context beyond that: 'Returns all matching templates in one call; not paginated' and the project_id_required error condition. It does not describe rate limits or caching, but coverage is good.
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?
Dense but front-loaded: identity, disambiguation, return shape, parameter guidance, and workflow all in order. Every sentence carries information; it runs long, but with almost 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?
With no output schema and 0% schema coverage, the description compensates by documenting the item fields, the unpaginated return, error behavior, and the downstream create_feed handoff. Nothing an agent needs to select or invoke it is missing.
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 0%, so the description carries the full parameter burden and does so: it explains project_id is optional and inferred for single-project customers (with the project_id_required failure mode), and warns that query must be a BROAD coarse filter, explicitly excluding country/format/language terms and redirecting matching to structured fields.
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 verb+resource ('List the PUBLIC Koongo feed TEMPLATES') and defines what a template is, including the return item shape {feedCode, name, type, ...}. It explicitly distinguishes itself from the sibling list_feeds ('These are NOT the customer's existing feeds').
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?
Gives explicit when-to-use routing: use list_feeds for existing feeds, use this for the creation catalog. It also prescribes the workflow (show matches, let user confirm feedCode, then call create_feed) and the recovery path when project_id is ambiguous (call list_projects).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_marketplace_channelsARead-onlyIdempotentInspect
Search the CATALOG of marketplace channels you can ADD — every sales channel (Amazon, eBay, Kaufland, Bol, Zalando, comparison sites, …) you can create a marketplace integration for (to list the marketplaces that ALREADY exist, use list_marketplaces). The catalog is large (many country variants), so it is SEARCHABLE + PAGED: pass query to match a channelCode/label (e.g. "amazon"), and page with limit/offset (the response carries hasMore + nextOffset). Response = {channels, returned, total, kind, hasMore, nextOffset}; each channel = {channelCode, label, kind, available, availabilityReason, authType, orderSyncSupported, multichannel, multichannelCode, primaryChannelCode, devOnly, upgradeUrl, appstoreUrl, feedManagerUrl}. available=false means you cannot add it now and availabilityReason says why: 'plan_limit' (the current plan does not include it), 'appstore' (unavailable through this connection), or 'fallback' (feedManagerUrl — connect it via Feed Manager). authType is oauth|credentials|null. Use channelCode with get_marketplace_channel (to see the definition types + capabilities) and then create_marketplace. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max channels per page (default 50, max 200). | |
| query | No | Filter to channels whose code or label contains this text. | |
| offset | No | Channels to skip; use the response nextOffset to page. | |
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, non-destructive), and the description goes well beyond them: searchable+paged behavior with default/max limits, hasMore/nextOffset contract, the meaning of available=false with its three availabilityReason values (plan_limit, appstore, fallback), and authType enumeration. This is rich disclosure not derivable from 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?
Front-loaded with the core purpose and alternative, and nearly every sentence carries actionable detail. It is a long single block with heavy caps emphasis, which adds some visual noise, but little is truly wasted.
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?
No output schema exists, and the description fully specifies the response shape ({channels, returned, total, kind, hasMore, nextOffset}), per-channel fields, and the meaning of key flags. Combined with the workflow and paging contract, an agent has everything needed to call and interpret it.
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 75% and the description compensates on the uncovered project_id, explaining the inference/required logic and the list_projects fallback. It also adds examples and match semantics for query ('channelCode/label', e.g. "amazon") and paging intent for limit/offset.
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 verb and resource — searching the CATALOG of addable marketplace channels — and immediately distinguishes it from list_marketplaces (which lists existing ones). Names the exact set (Amazon, eBay, Kaufland, ...) so an agent can route without opening schemas.
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?
Explicit when-to-use with a named alternative ('to list the marketplaces that ALREADY exist, use list_marketplaces') and a downstream workflow (get_marketplace_channel for capabilities, then create_marketplace). Also states project_id is optional vs project_id_required, and to call list_projects in the latter case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_marketplace_itemsARead-onlyIdempotentInspect
MARKETPLACE items — list the individual listing items of one marketplace, the per-product rows of what is (or should be) listed on the channel. Applies to marketplace integrations. Returns {integrationId, total, returned, items:[{itemId, koongoProductId, parentId, productType, status, channelStatus, listingId, listingUrl, hasErrors, errorCount}]}. status is the Koongo-side listing state; channelStatus is the channel's own state; listingId / listingUrl are the item's identity on the channel. Rows carry only identifiers and statuses — never a raw product attribute VALUE — so no confirmation is needed here; to see an item's actual attribute value plus its full error report, use get_marketplace_item_report (which gates the value behind a user confirmation). Filter with koongo_status (e.g. the failed items), channel_status, listing_id or product_id to drive a fix; page with limit / offset. itemId is what you pass as item_id to get_marketplace_item_report. marketplace_id is the id from list_marketplaces. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items to return (page size). | |
| offset | No | Number of items to skip (paging). | |
| listing_id | No | Filter by the item's listing id on the channel. | |
| product_id | No | Filter to one Koongo product id. | |
| project_id | No | ||
| koongo_status | No | Filter by the Koongo-side listing status. | |
| channel_status | No | Filter by the channel's own listing status. | |
| marketplace_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds genuinely non-obvious behavior: rows never carry raw attribute values, so no confirmation is needed here, whereas get_marketplace_item_report gates values behind a user confirmation. It also documents paging and the status-vs-channelStatus distinction.
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?
Front-loaded with the resource definition and return shape, then filters and parameter guidance. It is dense and slightly overpacked in places (status/channelStatus explanation repeated around the return shape), but nearly every sentence carries usable routing or semantic information.
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?
With no output schema, the description compensates by enumerating the returned fields and their meaning, plus the alternative tool, filter options, paging, and parameter sourcing. An agent has everything needed to call it correctly.
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 75%, but the description adds real meaning beyond it: it explains status vs channelStatus semantics, that itemId is the value to pass as item_id elsewhere, that marketplace_id comes from list_marketplaces, and that project_id is inferred for single-project customers. It does not add syntax detail for the remaining filter params, so it stops short of a 5.
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 verb and resource ('list the individual listing items of one marketplace, the per-product rows'), and distinguishes it from list_marketplaces, list_marketplace_channels, and get_marketplace_item_report by describing exactly what a row is.
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?
Explicitly routes the agent: use this for identifier/status rows, use get_marketplace_item_report for attribute values and error reports, filter with koongo_status/channel_status/listing_id/product_id 'to drive a fix', and it spells out the project_id fallback path (list_projects when project_id_required).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_marketplacesARead-onlyIdempotentInspect
List the CREATED marketplace integrations of a project — the marketplace integrations that already exist, not the catalog of channels you can add (use list_marketplace_channels for that). Each item is {integrationId, projectId, name, channelCode, kind, definitionCode, status, ready, lastStep, isReady, isConnected, isOverlimit, productMode, orderMode, orderSync}. The response wrapper is {integrations, returned, total}. project_id is OPTIONAL: with it you get that project's marketplaces; WITHOUT it you get marketplaces across ALL your projects (each item carries its projectId). If a call returns project_id_required, pick a project (see list_projects) and pass its project_id. integrationId is what you pass as marketplace_id to get_marketplace / marketplace_status and the other marketplace tools.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false, destructiveHint=false, so the safety profile is covered. The description adds real behavioral context beyond annotations: the exact item shape, the response wrapper {integrations, returned, total}, and the project_id_required error-recovery path. It stops short of pagination/limit behavior, keeping it short of a 5.
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?
Front-loads the core purpose and sibling disambiguation in the first sentence. It is dense — a long field enumeration and multiple conditional clauses — but every sentence earns its place. Slightly verbose field list keeps it from a 5.
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 read-only list tool with no output schema, one optional param, and no nested objects, this description covers scope, sibling disambiguation, parameter behavior, return shape, wrapper keys, and error recovery. Nothing an agent needs to call it correctly is missing.
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 0% and there is one optional parameter, so the description carries the full burden. It explains that project_id is OPTIONAL, what happens with and without it (single project vs. all projects, each item carrying its projectId), and connects integrationId to marketplace_id in downstream tools — rich semantics entirely absent from the 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?
States a precise verb and resource ('List the CREATED marketplace integrations of a project') and explicitly distinguishes itself from the near-identically-named sibling list_marketplace_channels, clarifying it returns existing integrations rather than the addable channel catalog. An agent can distinguish it from list_marketplace_channels, list_marketplace_items, etc., without opening schemas.
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?
Gives explicit when-to-use vs. the alternative (use list_marketplace_channels for the catalog), spells out the with/without project_id behavior, and provides recovery guidance for the project_id_required error (pick a project via list_projects). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_order_channelsARead-onlyIdempotentInspect
List the marketplaces that can be added as a standalone ORDER connection — order-capable channels that do NOT have a product wizard. (Channels that DO have a wizard are added with create_marketplace instead, not here.) Returns {channels:[{channelApiCode, label, channelCode, logoUrl, authType ('oauth'|'api_key'), available}], total}. 'available' is false when the plan's order-connection limit is already reached. Pass a channelApiCode to create_order_connection to start adding one. Optional query filters by name/code. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Optional filter on channel name/code. | |
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnly, idempotent, non-destructive), so the bar is lower. The description adds real behavioral context beyond annotations: the exact return shape, the meaning of 'available' (false when the plan's order-connection limit is reached), the authType enum, and the project_id inference rule. Doesn't mention pagination, but a bounded channel list makes that less material.
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?
Front-loads the core purpose, then the sibling routing rule, then the return contract and parameter notes. Dense but every sentence carries unique, actionable information.
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?
Covers purpose, sibling routing, return structure, availability semantics, downstream usage, and parameter behavior. For a 2-param read-only list with no output schema, this is complete enough to call correctly without guessing.
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 50%, with project_id lacking a schema description. The description compensates by explaining project_id's optionality and inference, and by describing the query filter; it also ties channelApiCode (from the response) to the next tool.
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 verb and resource ('List the marketplaces that can be added as a standalone ORDER connection') and crisply delineates the subset ('order-capable channels that do NOT have a product wizard'). It explicitly distinguishes itself from create_marketplace and routes to create_order_connection, so an agent can tell it apart from list_marketplace_channels and list_ad_channels.
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?
Explicit when-to-use (order-capable channels without a product wizard) and when-not (channels with a wizard use create_marketplace) are both stated. It also names the downstream step (create_order_connection) and the fallback for missing project_id (call list_projects).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ordersARead-onlyIdempotentInspect
List recent order records for the project, PII-FREE — customer name, e-mail, phone and billing/shipping addresses are NEVER returned. Best for spotting sync problems: pass errors_only:true to see only orders that failed or were not inserted. Optional connection_id restricts to one order connection; limit caps the result (default 50, max 200). Returns {orders:[{channelOrderId, channelOrderName, storeOrderId, connectionId, channelCode, marketplaceCode, status, syncStatus, createdAt}], total}. syncStatus flags which orders failed ('error'/'not_inserted'); the free-text error reason is intentionally not exposed (it can contain customer data) — the user reviews details in the Koongo UI. project_id is OPTIONAL (project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max records (default 50, max 200). | |
| project_id | No | ||
| errors_only | No | Only orders that failed to sync / were not inserted. | |
| connection_id | No | Restrict to one order connection (from get_order_overview). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (read-only, idempotent, non-destructive) by disclosing that PII fields are NEVER returned and that the free-text error reason is deliberately withheld because it may contain customer data. This is exactly the kind of behavioral context annotations cannot convey.
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?
Front-loads the most decision-relevant fact (PII-free, sync-problem focus) and remains dense and largely waste-free. It is a long sentence cluster, but nearly every clause earns its place by resolving a real ambiguity.
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?
With no output schema and no required parameters, the description compensates fully by spelling out the return object shape (orders array with named fields, total) and the syncStatus values. An agent has everything needed to call and interpret it.
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 75%, and the description still adds meaning: it clarifies project_id is OPTIONAL here but required for the sibling list_projects, restates limit's default/max, and explains that connection_id is sourced from get_order_overview. This enriches beyond the schema's terse param 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?
States a specific verb (List) and resource (recent order records) scoped to the project, and immediately differentiates itself by emphasizing PII-free output and sync-problem spotting. An agent can place this against siblings like get_order_overview and sync_project_orders without opening a schema.
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?
Gives a clear primary use case ('Best for spotting sync problems') with the concrete invocation (errors_only:true). It names follow-up routes for the optional project_id (call list_projects), though it could more explicitly contrast with get_order_overview for non-sync use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsARead-onlyIdempotentInspect
List your projects. Each item is {projectId, code, name, apiStatus, dataStatus, language, customerId, customerEmail, platformCode, platformName}. platformCode is the shop's e-commerce platform (shopify, magento_2, woocommerce, ...) when the control panel reports one; setup and available integrations differ by it. Call this FIRST when you don't know which project to act on, or when another tool returns project_id_required. Let the user pick, then pass the chosen projectId to the other tools. When you own a single project you usually don't need this — the other tools infer it. Pass query to search projects by name, code, or owner email. IMPORTANT: if the call returns an EMPTY list, do not assume there are no projects — some accounts only return projects that MATCH a search term, so ask the user what to look for (a project name/code or the owner's email) and retry with a query. A broad search may be capped, so keep the query specific. apiStatus GRANTED = active; REVOKED/OVERLIMIT projects are listed too so the user sees them. After the user picks, the usual next step is get_import_status for that projectId.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Optional search term to filter projects by name, code, or owner email. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover read-only safety, but the description adds non-obvious behavior: empty lists can be misleading due to match-only accounts, broad searches are capped, and revoked/overlimit projects still appear. This is exactly the kind of operational context that annotations cannot express.
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?
Front-loaded with purpose, return shape, then usage. The field enumeration is necessary for an agent to interpret results. Dense but every sentence carries operational value; minor room for trimming.
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 1-param read-only listing with no output schema, the description covers return field semantics, apiStatus meaning, empty-result pitfalls, search caps, and next steps. Nothing an agent needs to call it correctly is missing.
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% and already documents `query`, but the description reinforces it with matching detail (name/code/email) and adds usage guidance (keep specific due to caps). Slightly above the baseline thanks to the cap warning.
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?
Specific verb+resource: 'List your projects' with a documented return shape. It distinguishes itself from siblings by explaining its role as the entry point (call FIRST when you don't know which project) versus inference-based tools.
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?
Explicit when: call first when project unknown, or when another tool returns project_id_required. Explicit when-not: single-project users usually don't need it. Names the alternative (inference) and the downstream tool (get_import_status).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_rulesARead-onlyIdempotentInspect
List the product rules (Attribute Rules) available to a project. Returns {rules:[{ruleId, name, description, category, scope, usageCount}], returned, total}. usageCount is how many feed attributes currently use the rule. scope selects which library to list: 'project' (default) = the project's own rules; 'shared_template' = the reusable shared template library; 'all' = both. Optionally pass query: a case-insensitive SUBSTRING match on the rule NAME only (a coarse pre-filter — rule names are not unique, so confirm the match yourself and disambiguate when more than one matches). Use get_rule to fetch a rule's full rules[]. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects). Returns all rules in one call (returned === total); not paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Optional case-insensitive SUBSTRING match on the rule NAME only (a coarse pre-filter; confirm the match yourself as names are not unique). | |
| scope | No | Which library to list: 'project' (default) = the project's own rules; 'shared_template' = the reusable shared template library; 'all' = both. | |
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnly, idempotent, non-destructive). The description adds valuable behavioral context: the return shape, that usageCount is computed, that the query is a SUBSTRING match on NAME only and is coarse/non-unique, and that it's not paginated (returned === total). These details go well beyond 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?
Dense but well-organized, front-loading the resource and return shape. Every sentence conveys distinct information. Slightly long, but no wasted 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?
Comprehensive for a read-only list tool with no output schema: it documents return structure, parameter behavior, filtering caveats, project_id resolution path, and pagination behavior. An agent has everything needed to call it correctly.
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 67% but the description compensates: it clarifies query semantics (case-insensitive substring on NAME only, non-unique) and scope enum meanings, and explains project_id's optionality and inference. Adds meaning beyond the 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?
States a specific verb (list) and resource (Attribute Rules) with explicit scope of what's returned. It distinguishes itself from sibling get_rule ('Use get_rule to fetch a rule's full rules[]'), making the relationship clear.
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?
Explicitly directs to get_rule for full rule details, and explains project_id behavior including a fallback action (call list_projects when project_id_required). Scope values are documented with their meanings, giving clear when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_source_attributesARead-onlyIdempotentInspect
List the source attributes the store provides that a feed column can be mapped from (the valid platform_code values for map_feed_attribute) — e.g. brand, ean, price, color, category_name. Returns {attributes:[{code, label, dataType}], returned, total}. Pass feed_id for full parity with the feed editor (adds the feed's taxonomy_* attributes); project_id alone omits taxonomy. Call this BEFORE map_feed_attribute to choose a valid platform_code. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects). Requires the project's data imported (dataStatus='ok', see get_import_status). Returns all attributes in one call (returned === total); not paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| feed_id | No | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/non-destructive, so the safety profile is covered; the description goes further by disclosing the return shape, that results are unpaginated (returned === total), the data-import prerequisite, and project_id inference behavior. Nothing material about behavior is left implicit.
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?
Front-loaded with purpose and the call-ordering rule, then the return shape and parameter conditions; nearly every sentence earns its place. It is still a dense single paragraph with heavy parentheticals, which makes it slightly harder to scan than it needs to be.
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 two-param read tool with no output schema, the description supplies return shape, pagination behavior, prerequisites, project_id resolution semantics, and the downstream call it feeds. An agent has everything needed to invoke it correctly without further exploration.
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 0%, so the description carries the full burden and does: feed_id is explained as adding taxonomy parity with the feed editor, and project_id is explained as optional/inferred-or-required with the escape hatch (list_projects). This is meaning well beyond the bare integer types in the 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?
States a specific verb+resource ('list the source attributes the store provides that a feed column can be mapped from') and immediately relates it to the sibling it feeds into, map_feed_attribute. The examples (brand, ean, price) make the resource concrete, so an agent can distinguish it from get_ad_attributes, get_marketplace_attributes and get_attribute_options.
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?
Gives explicit ordering ('Call this BEFORE map_feed_attribute to choose a valid platform_code'), branch conditions for feed_id vs project_id (full parity with the feed editor / taxonomy_* attributes vs omitting taxonomy), and the fallback path when project_id is required ('then call list_projects'). It also names the prerequisite state (dataStatus='ok', see get_import_status).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_store_categoriesARead-onlyIdempotentInspect
List the project's store categories (the source side of category mapping and of a feed's category filter). Returns {categories:[{id, name, path}], returned, total, hasMore, nextOffset}; path is the full breadcrumb (e.g. "Electronics > Computers > Laptops"). Use the ids with set_category_mapping (map store categories to a marketplace category) or set_feed_filter (category_ids). project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects). Paginated: default limit 200, max 1000. When hasMore is true, call again with offset = nextOffset and keep paging until hasMore is false to see every category.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max categories to return in this page (default 200, max 1000). | |
| offset | No | Pagination cursor: pass the previous response's nextOffset to fetch the next page (default 0). | |
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered; the description adds real behavioral context beyond that: pagination defaults and limits, the hasMore/nextOffset loop, and the project_id inference rule. It does not discuss permissions or error cases, so it stops short of a 5.
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?
Front-loaded with purpose and return shape, then usage, then pagination; no filler sentences. It is dense and semicolon-heavy, but each clause carries distinct information an agent needs.
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?
Even with no output schema, the description enumerates the return payload ({categories, returned, total, hasMore, nextOffset}) and defines `path` as a breadcrumb, so an agent knows both what comes back and how to continue paging.
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?
limit and offset are already documented in the schema, but project_id has no schema description and the prose supplies the missing semantics (optional, inferred for single-project customers, otherwise project_id_required with a call to list_projects). That compensation is the value add.
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 verb and resource ('List the project's store categories') and immediately scopes it as the source side of category mapping and feed filters, which separates it from search_target_categories and list_unmapped_categories in the sibling list.
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?
Explicitly routes the returned ids to the two consuming tools (set_category_mapping, set_feed_filter with category_ids), explains the optional project_id and the list_projects fallback when project_id_required, and gives concrete paging instructions (offset = nextOffset until hasMore is false).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_unmapped_categoriesARead-onlyIdempotentInspect
List the project's store categories that have NO mapping rule yet for a taxonomy — the gaps to map. Address the taxonomy by feed_id (its taxonomy is used) OR explicitly by taxonomy_code (+ optional taxonomy_locale). Returns {categories:[{id, name, path}], returned, total, taxonomyCode, taxonomyLocale, hasMore, nextOffset}. For each gap, find a target with search_target_categories and map it with set_category_mapping. project_id is OPTIONAL (inferred for a single-project customer). Paginated: default limit 200, max 1000. When hasMore is true, call again with offset = nextOffset and keep paging until hasMore is false to see every gap.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max categories to return in this page (default 200, max 1000). | |
| offset | No | Pagination cursor: pass the previous response's nextOffset to fetch the next page (default 0). | |
| feed_id | No | ||
| project_id | No | ||
| taxonomy_code | No | Target taxonomy id (e.g. 'google'); alternative to feed_id for addressing the taxonomy. | |
| taxonomy_locale | No | Locale of the taxonomy tree, e.g. 'en_GB' — defaults to the taxonomy's own default when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds genuine behavioral context: pagination is required to see every gap (hasMore → offset = nextOffset), default/max page size, and that project_id may be inferred for single-project customers.
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?
Front-loaded with the core purpose and the alternative-addressing rule, then pagination and next steps. It is dense but each sentence carries information; the return-shape enumeration is long but justified since no output schema exists.
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?
No output schema, yet the description enumerates the response fields and pagination cursor, covers both addressing modes, the optional project_id, and the follow-up tools. An agent has everything needed to call and page this tool correctly.
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 67% schema coverage and no description on feed_id or project_id, the description compensates: it explains the feed_id OR taxonomy_code addressing modes, that taxonomy_locale is optional and defaults to the taxonomy's own default, and that project_id is optional/inferred. It adds real semantics beyond the 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?
States a specific verb+resource+scope: store categories that have NO mapping rule for a taxonomy, framed as 'the gaps to map'. This is sharply distinguishable from siblings like list_store_categories (all store categories) and get_category_mapping (an existing rule).
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?
Explicitly routes the agent through the workflow: find a target with search_target_categories and map it with set_category_mapping for each gap. It also spells out the two alternate ways to address the taxonomy (feed_id vs taxonomy_code + taxonomy_locale), leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
map_ad_attributeAIdempotentInspect
Set where ONE of an ad's output attributes gets its value — the write half of solving the attribute form. Target the output attribute by code (from get_ad_attributes). Set platform_code to a source attribute (from list_source_attributes) to map it, and/or constant for a fixed value; default_platform_code / default_constant are the fallback used when the primary source is empty. For an IDENTIFIER (sku, gtin/ean/barcode, mpn), first confirm the chosen source is actually populated across the catalog (get_project_profile eanFillRate; page preview_products) — mapping or requiring an identifier the products lack yields an empty, non-functional integration. rule_id attaches an Attribute Rule (from list_rules / create_rule) — the value is then computed by that rule; send rule_id:"" to detach it, and rule_enabled:false to attach it disabled. To re-enable an attached-but-disabled rule, send rule_enabled:true (with or without its rule_id, from get_ad_attributes). rule_enabled on its own applies to whatever rule is already attached; with none attached it is rejected as unknown_rule. Provide at least one field (send an empty string to clear a text field). rule_id together with platform_code/constant in the same call is contradictory and is rejected. Setting a source (platform_code/constant) on an attribute that currently has a rule DETACHES that rule (mutually exclusive; changed then includes rule_id). SAVE + REBUILD: the mapping is written to the integration and its built feed is rebuilt immediately, but reaching the ad platform still needs a re-export/submit — call repair_ad or run_ad_operation (submit_all) afterwards (auto-pilot ads re-export on their next sync). Map only attributes returned by get_ad_attributes; hidden ones are internal and cannot be mapped by regular users. Returns {integrationId, code, status, changed:[...], reason, rebuilt, overridesStepField}; status is 'updated' | 'no_changes' | When the attribute was already driven by a wizard step field, the response says so in overridesStepField: the rewrite rule beats that step for good, so a later change in the step has no effect. If the step already sets the right source, change it there instead of mapping here. 'rejected' (reason: unknown_attribute | unknown_source_attribute | value_not_allowed | unknown_rule). Category-specific attributes are mapped here too, the same way — but they only exist after a category is mapped, so run refresh_ad_category_attributes first (they then appear in get_ad_attributes). ad_id is from list_ads. project_id is OPTIONAL (inferred for a single-project customer).
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ||
| ad_id | Yes | ||
| rule_id | No | ||
| constant | No | ||
| project_id | No | ||
| rule_enabled | No | ||
| platform_code | No | ||
| default_constant | No | ||
| default_platform_code | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Though annotations already indicate a non-read-only, idempotent write operation, the description goes far beyond them. It discloses that the mapping writes to the integration and rebuilds the feed immediately but still requires a separate re-export to reach the ad platform. It details the exact status response values, the behavior of overridesStepField (including that the rewrite rule permanently overrides a wizard step), the mutual exclusivity of rule with platform_code/constant leading to detachment, and the rejection of rule_enabled alone with no attached rule. All this is invaluable for correct invocation and interpretation of results.
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 every sentence earns its place. It is front-loaded with the core purpose, then systematically covers parameters, rules, save/rebuild behavior, response statuses, and edge cases. There is no filler or repetition; the information density is high while remaining logically ordered. For a tool with 9 parameters and many interdependencies, this length is justified and could not be significantly shortened without losing critical guidance.
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 and the absence of an output schema, the description is exceptionally complete. It explains the return object (including status values and overridesStepField), prerequisites, the distinction between hidden and mappable attributes, the special handling of identifiers with eanFillRate, and the follow-up actions required for re-export. The agent has everything needed to call this correctly without any additional lookups.
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 schema description coverage at 0%, the description fully carries the parameter documentation. It explains every parameter explicitly: code (from get_ad_attributes), platform_code (source attribute), constant (fixed value), default_platform_code / default_constant (fallbacks), rule_id (attachment/detachment), rule_enabled (enable/disable), project_id (optional, inferred for single-project), and ad_id (from list_ads). It also clarifies the interplay between rule_id and platform_code/constant and the condition for providing at least one field. This is complete and handles the 0% coverage gap perfectly.
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 precise statement of what the tool does: 'Set where ONE of an ad's output attributes gets its value — the write half of solving the attribute form.' It names the specific verb ('Set'), the target resource ('an ad's output attribute'), and immediately distinguishes it from the read side by referencing get_ad_attributes. This clearly separates it from sibling tools like get_ad_attributes and map_feed_attribute.
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 extensive usage guidance: it states when to use the tool (the 'write half' of attribute mapping) and when not to ('If the step already sets the right source, change it there instead of mapping here'). It also prescribes the required prerequisites (get_ad_attributes, list_source_attributes) and even tells the agent to run refresh_ad_category_attributes first for category-specific attributes. It explicitly names alternative actions like repair_ad or run_ad_operation for the re-export step that follows.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
map_feed_attributeAIdempotentInspect
Set where one feed attribute's value comes from. Target the output attribute by code (from get_feed). Set platform_code to a source attribute (from list_source_attributes) to map it, and/or constant for a fixed value; default_platform_code / default_constant are the fallback used when the primary source is empty. rule_id attaches a product rule (Attribute Rule, from list_rules / create_rule) — the attribute's value is then computed by that rule; send rule_id:"" to detach it (revert to platform_code/constant), and rule_enabled:false to attach it disabled. To re-enable an attached-but-disabled rule, send rule_enabled:true (with or without its rule_id, from get_feed). rule_enabled on its own applies to whatever rule is already attached; with none attached it is rejected as unknown_rule. Provide at least one field (send an empty string to clear a text field). rule_id together with platform_code/constant in the same call is contradictory and is rejected. Setting a source (platform_code/constant) on an attribute that currently has a rule DETACHES that rule (source and rule are mutually exclusive; changed then includes rule_id). SAVE-ONLY: persists the mapping and bumps the revision but does NOT regenerate the feed — call export_feed afterwards for the change to reach the output. Map only attributes returned by get_feed. Returns {feedId, code, status, changed:[...], reason, revisionBefore, revisionAfter}; status is 'updated' | 'no_changes' | 'rejected' (reason: unknown_attribute | unknown_source_attribute | value_not_allowed | unknown_rule). (rule_id together with platform_code/constant is a request-level invalid_request/400, not a 'rejected' reason.) project_id is OPTIONAL (inferred for a single-project customer). Attributes flagged hidden in get_feed are internal plumbing and cannot be mapped by regular users; skip them. PRECEDENCE: a feed value is resolved rule → composed → platform_code → constant (valueSource 'rule' is a Rule). If an attribute's valueSource (from get_feed) is 'composed', its value comes from a composed rule, so a platform_code/constant you set here is silently overridden — change composed values in the Koongo UI (the feed's editUrl). A 'rule' value source (a Rule), however, is settable here via rule_id.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ||
| feed_id | Yes | ||
| rule_id | No | ||
| constant | No | ||
| project_id | No | ||
| rule_enabled | No | ||
| platform_code | No | ||
| default_constant | No | ||
| default_platform_code | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=false and idempotentHint=true, but the description adds crucial behavioral detail: SAVE-ONLY semantics, the need to call export_feed, mutual exclusivity of rule_id with source fields, rule_enabled rejection with no attached rule, silent override for composed values, and return status/reason vocabulary. This far exceeds what annotations provide.
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 every sentence earns its place for a 9-parameter tool. It is front-loaded with the core purpose, then organized around save-only behavior, error modes, precedence, and edge cases. The SAVE-ONLY and PRECEDENCE markers help an agent scan.
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 mutation with no output schema and no param coverage, this is exceptionally complete. It covers return shape, status and reason enums, request-level 400 distinction, optional project_id, hidden-attribute restrictions, precedence resolution, and rule detachment behavior. Nothing an agent needs to invoke it correctly is missing.
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 0% schema description coverage, the description carries the full burden and succeeds. It explains code, platform_code, constant, default_platform_code/default_constant, rule_id, rule_enabled, project_id, and the clearing behavior with empty strings. Only feed_id is implicit, but context makes it obvious.
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: 'Set where one feed attribute's value comes from.' It immediately distinguishes the feed-attribute mapping scope from sibling tools like map_ad_attribute and map_marketplace_attribute by repeatedly grounding it in get_feed and feed-specific concepts.
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 explains when to map (attributes returned by get_feed), when not to map (hidden attributes, composed-value source attributes), and what to do after a successful save ('call export_feed afterwards'). It even directs composed values to the Koongo UI as an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
map_marketplace_attributeAIdempotentInspect
Set where ONE of a marketplace's output attributes gets its value — the write half of solving the attribute form. Target the output attribute by code (from get_marketplace_attributes). Set platform_code to a source attribute (from list_source_attributes) to map it, and/or constant for a fixed value; default_platform_code / default_constant are the fallback used when the primary source is empty. For an IDENTIFIER (sku, gtin/ean/barcode, mpn), first confirm the chosen source is actually populated across the catalog (get_project_profile eanFillRate; page preview_products) — mapping or requiring an identifier the products lack yields an empty, non-functional integration. rule_id attaches an Attribute Rule (from list_rules / create_rule) — the value is then computed by that rule; send rule_id:"" to detach it, and rule_enabled:false to attach it disabled. To re-enable an attached-but-disabled rule, send rule_enabled:true (with or without its rule_id, from get_marketplace_attributes). rule_enabled on its own applies to whatever rule is already attached; with none attached it is rejected as unknown_rule. Provide at least one field (send an empty string to clear a text field). rule_id together with platform_code/constant in the same call is contradictory and is rejected. Setting a source (platform_code/constant) on an attribute that currently has a rule DETACHES that rule (mutually exclusive; changed then includes rule_id). SAVE + REBUILD: the mapping is written to the integration and its built feed is rebuilt immediately, but reaching the sales channel still needs a re-export/submit — call repair_marketplace or run_marketplace_operation (submit_all) afterwards (auto-pilot marketplaces re-export on their next sync). Map only attributes returned by get_marketplace_attributes; hidden ones are internal and cannot be mapped by regular users. Returns {integrationId, code, status, changed:[...], reason, rebuilt, overridesStepField}; status is 'updated' | 'no_changes' | 'rejected' (reason: unknown_attribute When the attribute was already driven by a wizard step field, the response says so in overridesStepField: the rewrite rule beats that step for good, so a later change in the step has no effect. If the step already sets the right source, change it there instead of mapping here. | unknown_source_attribute | value_not_allowed | unknown_rule). Category-specific attributes are mapped here too, the same way — but they only exist after a category is mapped, so run refresh_marketplace_category_attributes first (they then appear in get_marketplace_attributes). marketplace_id is from list_marketplaces. project_id is OPTIONAL (inferred for a single-project customer).
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ||
| rule_id | No | ||
| constant | No | ||
| project_id | No | ||
| rule_enabled | No | ||
| platform_code | No | ||
| marketplace_id | Yes | ||
| default_constant | No | ||
| default_platform_code | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, and destructiveHint=false. The description adds meaningful behavioral context beyond these: it discloses that mapping triggers an immediate rebuild of the integrated feed, but a separate export/submit is required to reach the sales channel. It also details side effects like detaching a rule when a source is set, overriding wizard step fields (overridesStepField), and the rejection of contradictory rule_id+source combinations. This goes well beyond what annotations state.
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 (over 500 words) but every sentence contributes operational detail. It is structured: purpose → parameters → conditions → workflow → return values. However, it is not front-loaded with the most critical usage rules; several important warnings (e.g., identifier population check, wizard-step override) appear mid-way. Given the tool's complexity (9 parameters, many edge cases), the length is justified, but it could be organized more efficiently with earlier emphasis on common pitfalls.
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 is exceptionally complete for a tool with no output schema. It specifies the return object fields (integrationId, code, status, changed, reason, rebuilt, overridesStepField) and enumerates status values with rejection reasons. It covers all prerequites (code from get_marketplace_attributes, source from list_source_attributes, rules from list_rules/create_rule), mentions the optional project_id inference, and explains category-specific attribute handling. Nothing an agent needs to call this correctly is missing.
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 schema description coverage at 0%, the description carries full burden for all 9 parameters. It explains each: code (target from get_marketplace_attributes), platform_code/constant (source/fixed value), default_platform_code/default_constant (fallbacks), rule_id (attach/detach rule), rule_enabled (enable/disable), project_id (optional, inferred for single-project), and marketplace_id (from list_marketplaces). It also clarifies nuanced behaviors like sending rule_id:"" to detach and the rejection of unknown_rule when rule_enabled is set without an attached rule. This is comprehensive and meaningful.
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+resource: 'Set where ONE of a marketplace's output attributes gets its value' and names it as the write half of solving the attribute form. It distinguishes from sibling tools (map_feed_attribute, map_ad_attribute) by explicitly targeting marketplace attributes and referencing get_marketplace_attributes as the source of valid codes. This is unambiguous and fully differentiates the tool.
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 extensive when-to-use guidance: it directs to confirm identifier source population via get_project_profile and preview_products, instructs to run refresh_marketplace_category_attributes before mapping category-specific attributes, and warns against mapping attributes already driven by a wizard step ('change it there instead of mapping here'). It also explains the post-save workflow (repair_marketplace or run_marketplace_operation submit_all) and notes that hidden attributes cannot be mapped. This is exemplary usage guidance covering prerequisites, exclusions, and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
marketplace_statusARead-onlyIdempotentInspect
Get the live run status of one marketplace: readiness, connection, and product/order counts. Returns {integrationId, status, ready, lastStep, isReady, isConnected, isOverlimit, productsRefreshing, productsSubmitting, productStats:{listed, processing, errors, inactive, total}, orderStats:{total, synced, error, pending}, upgradeUrl}. productStats counts the listing on the channel; orderStats is present only when order sync is enabled. isOverlimit=true means the plan product limit is exceeded — upgradeUrl is null; explain that the current plan limit is exceeded. productsRefreshing=true means an export / feed generation is running (the integration is 'updating'); productsSubmitting=true means items are being pushed to the channel. While EITHER is true the data is still changing — this is the signal to WAIT: after any export (finishing the wizard summary, repair_marketplace, a step transition that re-exports, or a submit) poll marketplace_status until BOTH productsRefreshing AND productsSubmitting are false, THEN read the results. The KOONGO DATA CHECK (get_marketplace_report's dataCheckErrors) and the productStats counts are only current once the refresh has finished — reading mid-refresh gives stale/empty data. categoryAttributeWarmup is the OTHER wait: on channels whose attributes depend on the mapped categories, that download runs in the background. While the block is present with pending:true the category-driven attributes are NOT in get_marketplace_attributes yet — poll this tool (retryAfterSeconds says how long to wait; state 'rescheduled' means a channel rate limit parked it until nextTryAt) until the block is absent or state is 'ready'. state 'failed' is terminal: call refresh_marketplace_category_attributes ONCE to start it again, do not poll on. marketplace_id is the id from list_marketplaces. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects). Use marketplace_status for run progress and get_marketplace for configuration/mapping. For the detailed error breakdown use get_marketplace_report.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | ||
| marketplace_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, closed-world, but the description adds substantial context beyond them: the meaning of isOverlimit (plan limit exceeded, upgradeUrl null), the two in-flight flags and their 'data is still changing' implication, stale-data warnings mid-refresh, and rate-limit behavior (retryAfterSeconds, 'rescheduled'/'nextTryAt').
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?
It is lengthy (~350 words), but front-loads the purpose and the return shape before the operational detail, and the WAIT/OTHER-wait structure with explicit emphasis is scannable. A few sentences are dense but every one contributes operational meaning, so the size is mostly earned.
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 polling/status tool with no output schema and 0% param coverage, the description compensates by enumerating the return object fields, documenting the wait conditions, and covering both marketplace_id/project_id. Nothing critical for correct invocation is left unstated.
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 0%, so the description must carry parameter meaning, and it does: marketplace_id is sourced from list_marketplaces, and project_id is explained as optional/inferred for single-project customers with a project_id_required fallback pointing to list_projects. It omits format/type nuance already implied by the schema but covers the substantive 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?
The opening sentence states a specific verb and resource ('Get the live run status of one marketplace') and enumerates the scope (readiness, connection, product/order counts). It explicitly contrasts itself with siblings get_marketplace (configuration/mapping) and get_marketplace_report (detailed errors), so an agent can route without opening a schema.
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 when-to-use instructions ('Use marketplace_status for run progress'), names two alternatives with their conditions, and provides procedural guidance for polling (wait until productsRefreshing AND productsSubmitting are both false) plus an explicit stop condition ('state failed is terminal: call refresh_marketplace_category_attributes ONCE, do not poll on').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_adAIdempotentInspect
Pause an ad — synchronization to the channel stops until it is resumed with resume_ad. Ads are ads-based channels (advertising / price-comparison / classifieds), not marketplaces: they publish products to the ad platform and have no order sync. Returns {integrationId, action:'pause', status:'paused', kind:'ads'}. ad_id is from list_ads. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by explaining the actual behavioral effect (synchronization stops until resumed), clarifying that ads have no order sync, and disclosing the exact return shape. The idempotentHint is consistent with the described paused state.
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?
Every sentence earns its place: effect, domain clarification, return value, and parameter provenance are all packed into a compact, front-loaded description with 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?
For a two-parameter tool with no output schema, the description covers behavior, domain context, return value, parameter sourcing, and conditional project handling. Nothing needed to call the tool correctly is missing.
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 0%, but the description fully compensates: it states that ad_id comes from list_ads and explains the optional/conditional behavior of project_id, including the single-project inference and when to call list_projects.
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 verb and resource ('Pause an ad') and precisely defines the effect: synchronization to the channel stops until resumed. It also differentiates ads-based channels from marketplaces, distinguishing this from sibling tools like pause_feed and pause_marketplace.
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 guidance on when the tool applies ('ads are ads-based channels... not marketplaces'), names the corresponding resume action, and clarifies the conditional project_id requirement with a fallback instruction to call list_projects. This gives the agent clear decision criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_feedAIdempotentInspect
Pause (disable) a feed — it stops being exported/submitted on schedule. Returns {feedId, action:'pause', status:'disabled', feedStatus, enabled:false}. feed_id from list_feeds / create_feed; project_id OPTIONAL.
| Name | Required | Description | Default |
|---|---|---|---|
| feed_id | Yes | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide idempotentHint, readOnlyHint=false, and destructiveHint=false. The description adds the real side effect (scheduled exports/submissions stop) and the exact return shape with status:'disabled' and enabled:false. This gives the agent a clear model of what happens when the tool is invoked, with no hidden surprises and 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?
The description is two compact sentences with the main effect front-loaded. The return shape and parameter sourcing are packed into the second sentence without filler or redundant restatement of the tool name.
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 simple state-changing tool, the description covers the effect, the response shape, and the source of the required parameter, while annotations cover safety and idempotence. It is slightly incomplete because project_id's role is undefined and there is no pointer to resume_feed for reversing the pause, but these are not blocking 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 description coverage is 0%, so the description must compensate. It adds useful provenance for feed_id (from list_feeds / create_feed), but project_id is only described as 'OPTIONAL', which merely restates the schema's required list. The purpose of project_id and when to include it are not explained, so the description only partially compensates for the missing parameter documentation.
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 and resource: 'Pause (disable) a feed'. It clearly states the behavioral consequence — it stops being exported/submitted on schedule — which distinguishes this from resume_feed, submit_feed, delete_feed, and restore_feed. This is unambiguous and selection-relevant.
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 implies when to use the tool via its defined effect and tells the agent where feed_id comes from (list_feeds / create_feed). However, it never names alternatives such as resume_feed or delete_feed, and it gives no explicit when-not-to-use guidance. Usage is inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_marketplaceAIdempotentInspect
Pause a marketplace — synchronization to the channel stops until it is resumed with resume_marketplace. Returns {integrationId, action:'pause', status:'paused', kind}. marketplace_id is from list_marketplaces. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | ||
| marketplace_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint=false, idempotentHint=true, and destructiveHint=false, so the description only needs to add what pausing actually does. It provides that: synchronization stops until resumed, and the operation returns {integrationId, action:'pause', status:'paused', kind}. No statement contradicts 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?
All four sentences are information-bearing: effect, return shape, marketplace_id source, and project_id rule. The most important behavior is front-loaded before the return and parameter details.
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 simple, the annotations cover safety and idempotence, and the description fills in the missing return shape and parameter provenance. Given no output schema, including the exact return object is valuable; nothing needed for correct invocation appears to be missing.
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 0% schema description coverage, the description carries the full burden and largely succeeds: marketplace_id is sourced from list_marketplaces, and project_id is explained as optional when inferred, otherwise requiring list_projects. It stops short of describing validation edge cases, but the semantics of both parameters are clear.
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 the precise action ('Pause a marketplace') and the concrete behavioral effect ('synchronization to the channel stops'), while naming the inverse operation resume_marketplace. This clearly distinguishes it from siblings like pause_ad and pause_feed.
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 says pausing persists 'until it is resumed with resume_marketplace', establishing when that related alternative is needed. It also gives acquisition guidance: marketplace_id is from list_marketplaces, and project_id handling depends on whether the customer is single-project, with list_projects as the fallback. It does not explicitly list exclusions for pause_ad/pause_feed, but the context is otherwise strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_productsARead-onlyIdempotentInspect
Get a page of the project's imported products with their real source-attribute values, so you can inspect the data and advise on feed mapping (e.g. see that brand holds "Nike" or color holds hex codes). Returns {products:[{id, type, attributes:{:}}], returned, requested, total, offset, hasMore, nextOffset}. attributes keys are source attribute codes (as in list_source_attributes); only catalogued, non-sensitive attributes are included — cost/margin and internal fields are never returned, and empty values are omitted. sample_size is the page window (default 5, max 100); page through the whole catalog with offset — when hasMore is true, re-call with offset=nextOffset until hasMore is false. project_id is OPTIONAL (inferred for a single-project customer). Data must be imported first (see get_import_status). This tool returns real product data values only after you set acknowledge_sensitive:true. The first call (flag absent/false) returns {sensitiveGate:{confirmationRequired:true, itemCount, fields, kind}} with an EMPTY products array — present that gate to the USER, get their approval, then re-call with acknowledge_sensitive:true to receive the actual values. To review the full generated feed output for every product (not just source attributes), use export_feed instead of paging this preview — that is the intended bulk path. Next: pick a template (list_feed_templates) and map attributes (map_feed_attribute).
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | Number of products to skip (paging); pass the response's nextOffset to get the next page. | |
| project_id | No | ||
| sample_size | No | Page window: how many products to return per call (default 5, max 100). | |
| acknowledge_sensitive | No | Set true only AFTER the user approves seeing real data. When absent/false the tool returns a sensitiveGate with an empty products array; with true it returns the actual attribute values. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: it discloses a two-phase sensitive-data gate (first call returns a sensitiveGate with an empty products array; real values only after acknowledge_sensitive:true following user approval), which fields are excluded (cost/margin, internal), and that empty values are omitted. This is exactly the kind of behavioral nuance annotations cannot express.
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?
Purpose and return shape are front-loaded, and most sentences carry load-bearing detail. The prose is dense and long, verging on overloaded, but nearly every clause (gate flow, paging, exclusions, alternatives) is actionable 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?
With no output schema, the description compensates by inlining the response shape ({products, returned, requested, total, offset, hasMore, nextOffset}) and the gate shape. Prerequisites, paging, exclusions, and follow-on tools are all covered, leaving nothing essential for a correct invocation missing.
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?
Adds meaning beyond the 75% schema coverage: it defines the paging loop via offset/nextOffset, characterizes sample_size as a page window (default 5, max 100), clarifies project_id is optional and inferred for single-project customers, and fully explains the acknowledge_sensitive gate semantics already hinted at in the 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?
Starts with a specific verb+resource and scope: 'Get a page of the project's imported products with their real source-attribute values.' It explicitly contrasts itself with the sibling export_feed (bulk path) and ties into list_source_attributes for the meaning of attribute keys. An agent can distinguish it from nearby tools without opening any schema.
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?
States prerequisites ('Data must be imported first (see get_import_status)'), names the alternative for the bulk case (export_feed), and prescribes the next steps (list_feed_templates, map_feed_attribute). It also tells the agent exactly how to page (re-call with offset=nextOffset until hasMore is false).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refresh_ad_category_attributesAInspect
AD category attributes — fetch the channel's CATEGORY attributes for the ad's currently mapped categories and refresh its rewrite rules — the same 'Update Category Attributes' action the wizard runs. Some ad channels expose extra, category-specific required attributes that only appear AFTER a category is mapped; run this after configuring the category-mapping step so those attributes show up in get_ad_attributes. Calls the channel (a live read) and rebuilds the integration. After this the category attributes appear in get_ad_attributes and you map them with map_ad_attribute like any other attribute. Returns {integrationId, action:'refresh_category_attributes', status:'updated', kind, editUrl, message}. Re-export/submit afterwards to reach the channel. ad_id is from list_ads. project_id is OPTIONAL (project_id_required otherwise — then call list_projects). ON CHANNELS THAT PRE-CACHE, THIS DOES NOT CALL THE CHANNEL SYNCHRONOUSLY: if the attributes for the current categories are not downloaded yet it returns status:'warming' with a categoryAttributeWarmup block and does the work in the background — that is a SUCCESS, not an error. Then poll ad_status until the block is absent or state is 'ready'; the attributes are pulled in automatically, so you do NOT have to call this again. Only call it a second time if ad_status reports state 'failed'.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare openWorldHint, non-readOnly, non-idempotent, so the agent knows this is an outward-facing rebuild. The description adds substantial context the annotations cannot: it calls the channel live, rebuilds the integration, and critically discloses the pre-cache 'warming' branch where status:'warming' is a SUCCESS rather than an error, plus the polling loop. That is exactly the kind of behavioral disclosure beyond structured fields that earns credit.
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?
Front-loaded with purpose, then return shape, then the warming edge case. The explanation is dense but every clause carries operational value; there is mild redundancy in restating that attributes appear in get_ad_attributes, which keeps it from a 5.
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?
With no output schema, the description supplies the return shape ({integrationId, action, status, kind, editUrl, message}), the warming variant, and the async follow-up flow via ad_status. For a live, non-idempotent, open-world mutation this is complete enough to call correctly without experimenting.
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 0%, so the description must carry both parameters, and it does: ad_id is sourced from list_ads, and project_id is OPTIONAL with the fallback 'project_id_required otherwise — then call list_projects'. It compensates well, though it does not state type/format details (integers) that the schema already implies.
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 verb+resource: fetch the channel's CATEGORY attributes for the ad's mapped categories and refresh its rewrite rules, and explicitly equates it to the wizard's 'Update Category Attributes' action. It distinguishes itself from get_ad_attributes (where results later appear) and map_ad_attribute (which consumes them), so an agent can place it precisely among 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?
Gives explicit sequencing: run this after configuring the category-mapping step, then map the new attributes with map_ad_attribute, then re-export/submit to reach the channel. It also specifies the re-call condition (only if ad_status reports 'failed') and how to check the ad_status alternative, covering when-not as well as when.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refresh_marketplace_category_attributesAInspect
MARKETPLACE category attributes — fetch the channel's CATEGORY attributes for the marketplace's currently mapped categories and refresh its rewrite rules — the same 'Update Category Attributes' action the wizard runs. Many channels expose extra, category-specific required attributes (e.g. Amazon per product type) that only appear AFTER a category is mapped; run this after configuring the category-mapping step so those attributes show up in get_marketplace_attributes. Calls the channel (a live read) and rebuilds the integration. After this the category attributes appear in get_marketplace_attributes and you map them with map_marketplace_attribute like any other attribute. Returns {integrationId, action:'refresh_category_attributes', status:'updated', kind, editUrl, message}. Re-export/submit afterwards to reach the channel. marketplace_id is from list_marketplaces. project_id is OPTIONAL (project_id_required otherwise — then call list_projects). ON CHANNELS THAT PRE-CACHE, THIS DOES NOT CALL THE CHANNEL SYNCHRONOUSLY: if the attributes for the current categories are not downloaded yet it returns status:'warming' with a categoryAttributeWarmup block and does the work in the background — that is a SUCCESS, not an error. Then poll marketplace_status until the block is absent or state is 'ready'; the attributes are pulled in automatically, so you do NOT have to call this again. Only call it a second time if marketplace_status reports state 'failed'.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | ||
| marketplace_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond annotations: discloses live channel call, integration rebuild, and critically the 'warming' async behavior with status:'warming' and categoryAttributeWarmup block framed as SUCCESS, plus polling instructions. Annotations only give readOnlyHint=false/openWorldHint=true; the description carries the real behavioral burden.
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?
Dense and information-rich but overstuffed — long run-on sentences with em-dashes and ALL-CAPS emphasis. Front-loaded with the core action, but the async/error-handling detail is buried in a single sprawling paragraph that reduces scanability.
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?
Complete despite no output schema: includes literal return shape (integrationId, action, status, kind, editUrl, message), the warming-state handling, polling via marketplace_status, and next-step chaining. An agent has everything needed to call and follow up correctly.
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 0%, so description must compensate, and it does: explains marketplace_id source (list_marketplaces) and project_id optionality with the project_id_required fallback path via list_projects. Both params given meaning and provenance.
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?
Specific verb + resource: fetches channel category attributes for mapped categories and rebuilds rewrite rules. Explicitly identifies the wizard action it mirrors ('Update Category Attributes'), distinguishing it from get_marketplace_attributes and refresh_ad_category_attributes.
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?
States exactly when to run it ('after configuring the category-mapping step'), what to do afterward ('map them with map_marketplace_attribute', 'Re-export/submit afterwards'), and when to re-run ('Only call it a second time if marketplace_status reports state failed'). Names sibling tools by name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
repair_adADestructiveInspect
Repair an ad — rebuild its internal profiles, clear its cache and re-export. Ads are ads-based channels (advertising / price-comparison / classifieds), not marketplaces: they publish products to the ad platform and have no order sync. Use this when an ad is in a broken or inconsistent state. Returns {integrationId, action:'repair', status:'repaired', kind:'ads', message}. ad_id is from list_ads. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects). Re-export replaces generated output and can publish through an active automatic integration. Confirm with the user before repair; do not retry blindly.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (destructiveHint=true, idempotentHint=false), yet the description adds meaningfully beyond them: it names what is rebuilt/cleared, warns that re-export replaces generated output, and warns that it can publish through an active automatic integration. That side-effect disclosure is exactly the context annotations cannot convey.
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?
Front-loaded with the purpose and operation breakdown, then caveats and parameter sourcing in descending importance; every clause carries information. Minor redundancy in 'Ads are ads-based channels' keeps it just short of ideal density.
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 destructive mutation with no output schema and zero schema descriptions, the definition supplies the return shape ({integrationId, action, status, kind, message}), parameter sourcing, side effects, and required user confirmation. An agent has everything needed to invoke it safely.
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 0%, so the description carries the full burden and does: ad_id originates from list_ads, project_id is optional and auto-inferred for single-project customers but required otherwise (with list_projects as the fallback). Both parameters are fully explained despite the empty 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?
States a concrete verb+resource ('Repair an ad') and immediately decomposes it into the three operations performed: rebuild internal profiles, clear cache, re-export. It also disambiguates the resource class ('ads-based channels ... not marketplaces'), which separates it from repair_marketplace without the agent opening either schema.
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?
Explicit trigger condition ('when an ad is in a broken or inconsistent state'), explicit prerequisites for resolving ad_id (list_ads) and project_id (list_projects when project_id_required), and an explicit caution ('Confirm with the user before repair; do not retry blindly'). Nothing about when to choose this tool is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
repair_marketplaceADestructiveInspect
Repair a marketplace — rebuild its internal profiles, clear its cache and re-export. Use this when a marketplace is in a broken or inconsistent state. Returns {integrationId, action:'repair', status:'repaired', kind, message}. marketplace_id is from list_marketplaces. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects). Re-export replaces generated output and can publish through an active automatic integration. Confirm with the user before repair; do not retry blindly.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | ||
| marketplace_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=true, idempotentHint=false, openWorldHint=true, so the safety profile is known. The description adds the behavioral constraint that re-export replaces generated output and can publish through an active automatic integration, which is useful context beyond the annotations, but it does not explain side effects on related orders or feeds.
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?
Front-loads the action and its components, then quickly covers return shape, parameter sourcing, and warnings. It is dense but well organized; the return-value string is arguably redundant given no output schema, but still helpful.
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 destructive, non-idempotent mutation with no output schema and low schema coverage, the description covers when to use, parameter sourcing, return shape, and a strong caution. It leaves out the precise destructive scope (what exactly is cleared/re-exported) and any permission requirements, but is otherwise complete enough for a repair tool.
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 0% for 2 parameters, so the description must (and does) explain both: marketplace_id comes from list_marketplaces, and project_id is optional/inferred or required with list_projects fallback. This adds substantial meaning beyond the bare integer types in the 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?
States a specific verb (rebuild/clear/re-export) and resource (marketplace internal profiles, cache), and distinguishes itself from siblings like get_marketplace, marketplace_status, and repair_ad. An agent can tell this is a state-repair tool, not a status or read operation.
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?
Explicitly says when to use it ('marketplace is in a broken or inconsistent state'), gives preconditions (project_id_required otherwise, call list_projects), and adds a caution ('confirm with the user before repair; do not retry blindly'), which is strong routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_mcp_issueAInspect
Report a problem, gap, or workaround with THIS MCP toolset back to the Koongo team so it can be fixed or extended. Use it when: a tool returned an error you could not resolve after a legitimate attempt (ESPECIALLY a 500 / unexpected server error or an unreachable-facade error), a capability you needed is missing, a tool's result was wrong or confusing versus what its docs implied, or you and the user AGREED on a manual workaround because MCP could not do something — or whenever the user says 'report this'. This is BACKGROUND product feedback, not a user-facing action and not something the user's task depends on: briefly ask the user's OK first ('want me to report this?'), file ONE report per scenario, then continue — do NOT loop or re-file the same thing. Provide category + a short title + a detailed description (what the user wanted, what actually happened, and any agreement/workaround). Strongly include steps[] — the CALL STACK: the sequence of tools you called with their key arguments and each one's outcome/error — plus the specific error, and expected vs actual where relevant, so an engineer can reproduce from the report alone. NEVER put credentials, tokens, API keys or personal data in a report (the server redacts known-sensitive keys defensively, but you must not include them). Returns {status:'recorded', reportId, ts}.
| Name | Required | Description | Default |
|---|---|---|---|
| error | No | The specific error message/payload, if any. | |
| steps | No | The call stack: the ordered tools you called with their key arguments and each one's outcome/error that led to this report. | |
| title | Yes | A short one-line summary of the issue. | |
| actual | No | What actually happened. | |
| detail | Yes | Full description: what the user wanted, what actually happened, and any workaround/agreement made with the user. | |
| context | No | Optional ids that help reproduce (project/marketplace/ad/feed/rule/attribute). | |
| category | Yes | What kind of report: error | missing_capability | wrong_result | confusing | workaround | suggestion. | |
| expected | No | What you expected to happen. | |
| severity | No | How badly it blocks the user: low | medium | high. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only say it is a non-read-only, non-idempotent, non-destructive write), the description discloses workflow behavior (ask permission first, one report per scenario, don't re-file), a security constraint (never include credentials; server defensively redacts), and the exact return shape {status:'recorded', reportId, ts}. That is substantial context the structured fields do not carry.
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?
It is front-loaded with the purpose sentence first and organizes the triggers into a clear list. It runs long with dense parentheticals ('ESPECIALLY a 500...'), but each clause carries actionable instruction rather than filler, so only minor trimming is possible.
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 9-parameter nested-object submission tool with no output schema, the description covers the trigger conditions, the payload expectations, the safeguards, the interaction protocol, and the return shape. Nothing an agent needs to file a correct report is missing.
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 already 100%, so the baseline is 3. The description adds real value on top: it tells the agent which fields to populate (category + short title + detailed description covering what the user wanted, what happened, and any agreement), strongly directs including steps[] as a reproduction call stack with key arguments and outcomes, and warns against embedding secrets.
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?
It states a precise verb+resource: report a problem/gap/workaround with THIS MCP toolset back to the Koongo team. This is unambiguously distinct from every sibling tool, which performs actual Koongo operations, so an agent can immediately tell it is the feedback channel rather than a functional API call.
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 enumerates explicit triggers (unresolvable error, especially 500/unreachable-facade, missing capability, wrong/confusing result, agreed workaround, or the user saying 'report this') and contrasts the tool's role: background feedback, not user-facing, ask the user's OK first, one report per scenario, do not loop or re-file. This is a near-complete when/when-not/alternatives specification.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_feedADestructiveInspect
Restore a soft-deleted feed and re-export it. Use this when a feed was deleted (delete_feed) — get_feed (and other feed actions) report a deleted feed as error 'feed_deleted', which is recoverable; list_feeds simply omits it while deleted — or when the user asks to bring a feed back. The feed id stays valid after deletion; this reverses it. Returns {feedId, action:'restore', status:'restored'}. feed_id from the feed_deleted error or an earlier list_feeds; project_id OPTIONAL. Restoration queues a fresh export on every call and may resume external publishing when the feed is enabled. Confirm with the user; do not retry blindly.
| Name | Required | Description | Default |
|---|---|---|---|
| feed_id | Yes | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=false, and openWorld=true. The description adds real context beyond them: restoration queues a fresh export on every call, may resume external publishing when the feed is enabled, is not safely retryable ('do not retry blindly'), and should be confirmed with the user.
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?
Front-loaded with the primary action and return shape, and most sentences earn their place. The parenthetical explanation of the deleted-state signals is slightly dense but useful, not wasteful.
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?
With no output schema, the description supplies the return shape ({feedId, action:'restore', status:'restored'}), parameter sourcing, usage triggers, side effects, and a caution about retries. Enough for an agent to invoke it correctly.
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 0%, so the description must carry the load, and it does: feed_id is sourced from the feed_deleted error or an earlier list_feeds, and project_id is explicitly OPTIONAL. It adds meaning beyond the bare integer types, though it doesn't explain project_id's role or the id's format.
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 verb (restore) and resource (a soft-deleted feed), plus the re-export side effect, and names the related siblings (delete_feed, get_feed, list_feeds) that signal the deleted state. An agent can distinguish this from resume_feed and other feed actions without opening schemas.
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?
Explicitly says when to use it: when delete_feed was called and get_feed returns the recoverable 'feed_deleted' error, when list_feeds omits the feed, or when the user asks to bring a feed back. It names the alternative signals and the condition that selects this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resume_adADestructiveIdempotentInspect
Resume a paused ad — synchronization to the channel starts again. Ads are ads-based channels (advertising / price-comparison / classifieds), not marketplaces: they publish products to the ad platform and have no order sync. Returns {integrationId, action:'resume', status:'resumed', kind:'ads'}. ad_id is from list_ads. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects). Resuming can restart automatic publication to the live ad channel. Confirm with the user before resuming.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations carry the safety profile (destructiveHint=true, idempotentHint=true, openWorldHint=true), and the description adds the concrete consequence they only abstract: resuming restarts automatic publication to the live ad channel, so the user should be asked first. It also returns the response shape, which matters because there is no output schema.
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?
Front-loaded with the action and consequence, then parameters, then the caution — a logical order with little waste. It is dense, and the inline JSON return-shape literal is slightly heavy in prose form, but every clause is load-bearing.
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 two-parameter mutation with no output schema and no annotation text, it covers consequence, confirmation, parameter sourcing, and return shape. It omits error/failure behavior (e.g. resuming an already-running ad), which is the one remaining 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 0% (both parameters are bare integers), so the description must compensate and it does: it names the source of ad_id (list_ads) and explains that project_id is optional with an inference rule plus a concrete fallback path (list_projects / project_id_required).
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?
Specific verb + resource ("Resume a paused ad") with the immediate consequence spelled out ("synchronization to the channel starts again"). It also explicitly separates ads from marketplaces, so an agent can route away from resume_marketplace/resume_feed without opening a schema.
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?
Gives prerequisites for both parameters (ad_id comes from list_ads; project_id is inferred for single-project customers, otherwise call list_projects) and mandates user confirmation before acting. It stops short of stating when-not-to-use, e.g. what to do if the ad is not actually paused.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resume_feedADestructiveIdempotentInspect
Resume (re-enable) a paused feed. Returns {feedId, action:'resume', status:'enabled', feedStatus, enabled:true}. feed_id from list_feeds / create_feed; project_id OPTIONAL. Re-enabling permits scheduled export and submission to resume, including changes to live listings. Confirm with the user before enabling.
| Name | Required | Description | Default |
|---|---|---|---|
| feed_id | Yes | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag destructiveHint=true and idempotentHint=true, and the description adds real consequence context beyond them: re-enabling lets scheduled export and submission resume, including changes to live listings, plus a user-confirmation requirement. It stops short of stating permission requirements or what happens to feeds already enabled.
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?
Dense and front-loaded — action first, then return shape, then parameter provenance, then the safety condition. Every sentence is functional; the inline return-shape literal is slightly cramped but earns its place given no output 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?
With no output schema, the description compensates by spelling out the return shape ({feedId, action, status, feedStatus, enabled}), and annotations already cover the safety profile. The main remaining gap is disambiguating from restore_feed.
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 0% (bare integers), so the description carries the load: it names where feed_id comes from and explicitly marks project_id OPTIONAL. That adds genuine meaning to both parameters, though no format/ID-range detail is given.
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 verb and resource with scope: 'Resume (re-enable) a paused feed.' An agent can distinguish it from pause_feed immediately, though it never explicitly contrasts with the sibling restore_feed, which is the nearest ambiguous alternative.
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?
Gives the source of feed_id ('from list_feeds / create_feed'), marks project_id as OPTIONAL, and adds a usage condition: 'Confirm with the user before enabling.' No explicit when-not guidance or direct alternative routing (e.g., vs restore_feed).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resume_marketplaceADestructiveIdempotentInspect
Resume a paused marketplace — synchronization to the channel starts again. Returns {integrationId, action:'resume', status:'resumed', kind}. marketplace_id is from list_marketplaces. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects). Resuming can restart automatic publication to the live marketplace. Confirm with the user before resuming.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | ||
| marketplace_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and openWorldHint=true, so the safety profile is partly covered. The description still adds non-obvious behavior: resuming restarts automatic publication to the live marketplace, and the user should confirm first. It does not detail permission requirements or side effects on in-flight operations.
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?
Front-loaded with the action and effect, then the parameter sourcing and the confirmation caveat. Dense but each clause adds actionable information; slightly verbose in the parenthetical about project_id inference.
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?
Covers the action, its consequences, parameter sourcing, the confirm-before-acting requirement, and even the response shape ({integrationId, action, status, kind}) despite no output schema existing. Nothing an agent needs to invoke this correctly is missing.
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 0%, so the description must carry parameter meaning, and it does: marketplace_id is sourced from list_marketplaces, and project_id is optionally inferred or required with list_projects as the fallback. It stops short of stating types/formats, but the semantic sourcing of both params is covered.
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 verb and resource ('Resume a paused marketplace') plus the concrete effect ('synchronization to the channel starts again'). It is clearly distinguishable from siblings such as pause_marketplace, resume_ad, and resume_feed, which differ by resource or action.
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?
Gives real usage context: where marketplace_id comes from (list_marketplaces), when project_id is optional vs required (single-project inference, otherwise project_id_required and call list_projects), and a caution to confirm before resuming. Missing an explicit 'do not use this when X' statement, which keeps it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_ad_item_actionADestructiveInspect
AD item action — run a listing action on one, several, or all items of an ad integration. DESTRUCTIVE: these actions PUSH TO THE LIVE AD CHANNEL — they submit, relist, remove or otherwise change what appears on the channel. Confirm with the user first, then call with confirm:true. Without confirm:true the call returns error 'confirm_required' (HTTP 400) and nothing runs. action is one of: 'submit' (send items to the channel — works even in MANUAL product mode: it forces the targeted item(s) through, so submitting a single item_id is the safe way to test-publish one item and watch the result before doing the rest), 'clean_resubmit' (clear the channel listing and submit again), 'clean' (clear the channel listing), 'remove' (remove/end the listing on the channel), 'force_insert' (force a fresh insert), 'lock' / 'unlock' (lock/unlock items from automatic changes), 'pause' (pause the items), 'repricer_enable' (where supported). An action the channel does not support returns status:'not_allowed'. Target items with item_ids (an array of itemId from list_ad_items) OR all_items:true for every item; provide exactly one. Returns {integrationId, action, status ('queued'|'done'|'not_allowed'), itemCount, async, message}. ad_id is the integrationId from list_ads. project_id is OPTIONAL (project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | integrationId of the ad (from list_ads). | |
| action | Yes | The listing action to run against the live ad channel. | |
| confirm | No | ||
| item_ids | No | itemId values (from list_ad_items) to act on. Use this OR all_items. | |
| all_items | No | Apply to every item of the integration. Use this OR item_ids. | |
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructive/openWorld/non-idempotent, and the description goes well beyond them: it spells out that actions push to the LIVE channel, documents the confirm gate and its exact error/http code, and notes the not_allowed outcome for unsupported channel actions. This is exactly the extra behavioral context the annotations cannot carry.
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?
Front-loaded with the DESTRUCTIVE warning and the confirm requirement, which is the right priority for a live-channel mutation. However, it packs everything into one dense block, making the action catalog harder to scan than a short list would be.
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 destructive tool with no output schema, the description covers the safety gate, action catalog, targeting rules, failure modes, and even the return shape ({integrationId, action, status, itemCount, async, message}). An agent has everything needed to call it correctly and safely.
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 67%, and the description compensates richly: it defines each enum action's meaning (submit, clean_resubmit, clean, remove, force_insert, lock/unlock, pause, repricer_enable) with semantics beyond the enum labels, states the item_ids/all_items mutual exclusivity, and explains project_id's optionality with the project_id_required fallback.
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 verb ('run a listing action') and resource ('items of an ad integration') with explicit scope (one, several, or all). It is clearly distinguishable from the many sibling tools, especially run_marketplace_item_action and pause_ad/resume_ad, because it names the channel-listing mutation domain directly.
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?
Gives strong conditional guidance: confirm with the user first, then call with confirm:true, and explains that omitting confirm yields 'confirm_required' (HTTP 400) with nothing run. It also explains the item targeting rule (item_ids OR all_items, exactly one). It stops short of naming sibling tools as alternatives, so it is clear context rather than explicit exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_ad_operationADestructiveInspect
AD-wide operation — run a WHOLE-INTEGRATION control-panel operation on an ad integration (acts on every item, not a chosen subset — for specific items use run_ad_item_action). operation is one of: 'submit_all' (submit every item to the channel — ONLY works in manual product mode; in Auto-Pilot mode submission is automatic and this returns status:'not_allowed'), 'clean_resubmit_all' (clear every item record and re-submit — allowed once every ~5 minutes; refused if the connection is down), 'pre_pair' (attempt to pre-pair existing channel items with your Koongo items — non-destructive), 'remove_all' (remove every item from the channel and lock them — PERMANENT). DESTRUCTIVE + pushes to the LIVE ad channel: submit_all / clean_resubmit_all / remove_all require confirm:true after you confirm with the user (pre_pair does not). Returns {integrationId, action, status ('queued'|'done'|'not_allowed'), itemCount, async, message}. ad_id is the integrationId from list_ads. project_id is OPTIONAL (project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | integrationId of the ad (from list_ads). | |
| confirm | No | ||
| operation | Yes | The whole-integration operation to run. | |
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and non-idempotent, but the description adds material context beyond them: which specific operations are destructive/permanent (remove_all locks items), which push to the LIVE channel, which require confirm:true after user confirmation, mode-dependent behavior, a rate limit, and a connection-down refusal condition. This is exactly the disclosure an agent needs before a destructive call.
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?
Single dense block that is front-loaded with the whole-vs-subset scope and the destructive warning, then the return shape and parameter guidance. Information-dense with little waste, though the length as one uninterrupted paragraph makes it slightly harder to scan than a structured layout.
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?
No output schema exists, yet the description documents the return object ({integrationId, action, status, itemCount, async, message}) including the 'not_allowed' status meaning. Combined with per-operation behavior and confirmation prerequisites, an agent has everything needed to call it correctly.
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 only 50%, but the description compensates fully: it explains ad_id provenance, each enum value of operation with its behavior, the confirm:true requirement and when it applies, and project_id's optionality with the project_id_required fallback. It adds substantial meaning beyond the terse 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?
States a specific verb+resource ('AD-wide control-panel operation on an ad integration') and immediately scopes it as whole-integration vs. item-level, explicitly naming the sibling run_ad_item_action as the alternative. An agent can distinguish this from run_marketplace_operation and run_ad_item_action without opening any schema.
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?
Explicitly names when to use each alternative: whole-integration here vs. run_ad_item_action for specific items, list_ads for the integrationId, list_projects when project_id is required. It also states per-operation conditions (submit_all only in manual product mode, clean_resubmit_all rate-limited to ~5 minutes and refused if the connection is down), which is unusually thorough routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_importAInspect
(Re)run an ENRICHMENT import to materialize previously-written source values onto products, WITHOUT re-sending them. Use it to retry after an import failed or is stuck, or to apply values you wrote with apply:false (set_api_source / set_ai_source). source picks which import: "api_source" (the set_api_source values, land as api_source.) or "additional_source" (the set_ai_source CSV values, land as custom_). This does NOT change the stored values — it only dispatches the same import the apply:true flag fires. Returns {status:'dispatched'|'skipped', type}; 'skipped' means the project's store data is not connected (apiStatus not GRANTED) so nothing ran. The import is asynchronous — after dispatch, poll get_import_status until the newest run of this type in recentRuns has running:false and status 'ok', then the attribute is available in list_source_attributes. project_id is OPTIONAL (inferred for a single-project customer). Requires the additional-sources addon: without it the call is refused with error 'addon_required' (HTTP 403) with addonCode. Explain the unavailable entitlement and do not retry or offer a purchase. The additional-source import can also fetch URLs already configured on this project; this tool does not accept a URL.
| Name | Required | Description | Default |
|---|---|---|---|
| source | Yes | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag readOnly=false, idempotent=false, destructive=false, openWorld=true; the description goes far beyond by disclosing async dispatch semantics, the {status:'dispatched'|'skipped'} return and what 'skipped' means (apiStatus not GRANTED), the addon_required 403 refusal, and the required polling workflow via get_import_status.
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?
Dense and front-loaded, with purpose first, then parameters, then async/error handling. It is on the long side and could trim a clause or two, but nearly every sentence carries operational or entitlement information an agent needs.
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?
No output schema exists, yet the description supplies the return shape, the async polling completion criterion (running:false with status 'ok', then visible in list_source_attributes), and the failure mode, leaving nothing essential missing 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?
With 0% schema description coverage, the description fully compensates: it defines both enum values of `source` ('api_source' lands as api_source.<code>, 'additional_source' lands as custom_<code>) and explains that project_id is optional and inferred for single-project customers.
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 verb+resource with scope: '(Re)run an ENRICHMENT import to materialize previously-written source values onto products, WITHOUT re-sending them.' It explicitly differentiates from siblings by contrasting with set_api_source/set_ai_source value-writing and routing async follow-up to get_import_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?
Names concrete when-to-use conditions (retry a failed/stuck import, apply values written with apply:false) and a when-not/what-it-doesn't-do clause: 'This does NOT change the stored values — it only dispatches the same import the apply:true flag fires.' It also states the entitlement prerequisite and that a URL cannot be passed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_marketplace_item_actionADestructiveInspect
MARKETPLACE item action — run a listing action on one, several, or all items of a marketplace. DESTRUCTIVE: these actions PUSH TO THE LIVE MARKETPLACE — they submit, relist, remove or otherwise change what buyers see on the channel. Confirm with the user first, then call with confirm:true. Without confirm:true the call returns error 'confirm_required' (HTTP 400) and nothing runs. action is one of: 'submit' (send items to the channel — works even in MANUAL product mode: it forces the targeted item(s) through, so submitting a single item_id is the safe way to test-publish one item and watch the result before doing the rest), 'clean_resubmit' (clear the channel listing and submit again), 'clean' (clear the channel listing), 'remove' (remove/end the listing on the channel), 'force_insert' (force a fresh insert), 'lock' / 'unlock' (lock/unlock items from automatic changes), 'pause' (pause the items), 'repricer_enable' (enable the repricer for the items). Target items with item_ids (an array of itemId from list_marketplace_items) OR all_items:true for every item; provide exactly one. Returns {integrationId, action, status, itemCount, async, message}. status is 'queued' (async — running in the background), 'done' (applied synchronously) or 'not_allowed' (the action is not available for this marketplace; message explains). marketplace_id is from list_marketplaces. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The listing action to run against the live channel. | |
| confirm | No | ||
| item_ids | No | itemId values (from list_marketplace_items) to act on. Use this OR all_items. | |
| all_items | No | Apply to every item of the marketplace. Use this OR item_ids. | |
| project_id | No | ||
| marketplace_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it destructive, but the description adds crucial behavioral detail: actions push to the live marketplace, the confirm_required error behavior without confirm:true, the meaning of async vs synchronous statuses, and the not_allowed response. This far exceeds what annotations alone convey.
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?
Despite its length, the description is front-loaded with the DESTRUCTIVE warning and confirmation requirement, then proceeds through action meanings, targeting rules, and return values. Every sentence contributes necessary operational detail for a high-risk, multi-action tool.
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?
With no output schema, the description fully documents the return shape and status values. It covers prerequisites, confirmation, targeting, action semantics, and error cases, leaving no major gap for an agent to call it correctly.
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 only 50% schema description coverage, the description compensates thoroughly: it explains each action enum value, clarifies that item_ids and all_items are mutually exclusive, states where item_ids and marketplace_id come from, and explains the optional project_id inference behavior. It adds substantial meaning beyond the 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?
States a specific verb (run a listing action) and resource (marketplace items), and explicitly scopes it to one, several, or all items of a marketplace. This clearly distinguishes it from marketplace-level operations and ad item actions in the sibling set.
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 strong context: confirms the tool is destructive, requires user confirmation before calling, explains the confirm:true requirement, and gives a testing workflow for single-item submit. However, it does not explicitly name alternative sibling tools (e.g., run_marketplace_operation or run_ad_item_action) for when this tool is not appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_marketplace_operationADestructiveInspect
MARKETPLACE-wide operation — run a WHOLE-INTEGRATION control-panel operation on a marketplace (acts on every item, not a chosen subset — for specific items use run_marketplace_item_action). operation is one of: 'submit_all' (submit every item to the channel — ONLY works in manual product mode; in Auto-Pilot mode submission is automatic and this returns status:'not_allowed'), 'clean_resubmit_all' (clear every item record from the Koongo wizard and re-submit — allowed once every ~5 minutes; refused if the connection is down), 'pre_pair' (attempt to pre-pair existing channel items with your Koongo items — non-destructive, no removal or full resync), 'remove_all' (remove every item from the channel and lock them — PERMANENT). DESTRUCTIVE + pushes to the LIVE marketplace: submit_all / clean_resubmit_all / remove_all require confirm:true after you confirm with the user (pre_pair does not). Returns {integrationId, action, status ('queued'|'done'|'not_allowed'), itemCount, async, message}. marketplace_id is the integrationId from list_marketplaces. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | ||
| operation | Yes | The whole-integration operation to run. | |
| project_id | No | ||
| marketplace_id | Yes | integrationId of the marketplace (from list_marketplaces). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, openWorldHint=true, idempotentHint=false, but the description adds substantial context beyond them: which specific operations are PERMANENT (remove_all), which are non-destructive (pre_pair), the ~5-minute throttle on clean_resubmit_all, the manual-mode precondition on submit_all, and the confirm:true gate for live-marketplace pushes.
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?
Structurally sound — scope first, then per-operation behavior, then the destructive/confirm warning, then the return shape, then parameter notes. It is dense and heavily capitalized, which adds some visual noise, but nearly every clause carries actionable information for a four-operation destructive tool.
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?
Despite no output schema, the description inlines the return contract ({integrationId, action, status, itemCount, async, message}) including the 'not_allowed' status case. Combined with per-operation preconditions, rate limits, and confirmation requirements, an agent has everything needed to invoke this correctly and interpret the result.
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 only 50%, and the description compensates: confirm is explained as required for submit_all/clean_resubmit_all/remove_all but not pre_pair; project_id is documented as OPTIONAL with inference rules and the project_id_required fallback to list_projects; marketplace_id is tied to the integrationId from list_marketplaces. The operation enum values, listed bare in the schema, are each given semantics in the description.
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?
Opens with a specific verb+resource ('MARKETPLACE-wide operation — run a WHOLE-INTEGRATION control-panel operation on a marketplace') and immediately scopes it against the sibling: 'acts on every item, not a chosen subset — for specific items use run_marketplace_item_action.' The four valid operations are each named and characterized, so an agent can distinguish this from run_marketplace_item_action, run_ad_operation, and repair_marketplace without opening any schema.
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?
Gives explicit when-to-use (whole integration, not a subset), when-not-to-use per operation ('submit_all ONLY works in manual product mode', 'clean_resubmit_all allowed once every ~5 minutes; refused if the connection is down'), and names the alternative for subset work (run_marketplace_item_action). It also states the confirm:true precondition tied to user confirmation and when project_id is required versus inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_target_categoriesARead-onlyIdempotentInspect
Search a feed's target taxonomy tree (marketplace categories) by a substring of the category path. Address the taxonomy by feed_id (its taxonomy is used) OR explicitly by taxonomy_code (+ optional taxonomy_locale). Returns {categories:[{hash, name, path}], returned, total, taxonomyCode, taxonomyLocale}; pass a returned hash as target_hash to set_category_mapping. query matches the full path (e.g. 'laptop', 'shoes'); limit bounds the results (default 50). project_id is OPTIONAL (inferred for a single-project customer).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max categories to return (default 50). | |
| query | Yes | ||
| feed_id | No | ||
| project_id | No | ||
| taxonomy_code | No | Target taxonomy id (e.g. 'google'); alternative to feed_id for addressing the taxonomy. | |
| taxonomy_locale | No | Locale of the taxonomy tree, e.g. 'en_GB' — defaults to the taxonomy's own default when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, openWorld, idempotent, non-destructive), yet the description still adds genuine context: the exact return shape, that results are meant to be fed into set_category_mapping, and that query matches the full path. It stops short of documenting pagination behavior if the total exceeds limit.
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 purpose is front-loaded and every sentence adds information (addressing, return shape, param behavior, downstream use). It is dense and slightly run-on with back-to-back clauses, but nothing is 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?
There is no output schema, but the description supplies the return shape and explains how to consume the result, plus the addressing alternatives and defaults. For a read-only search tool this is complete enough for an agent to call it correctly.
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 only 50% schema coverage, the description carries real weight: it clarifies feed_id means 'its taxonomy is used', explains taxonomy_code/taxonomy_locale addressing, notes project_id is optional and inferred for single-project customers, and gives query matching plus the limit default of 50. This compensates well for the undocumented query/feed_id/project_id schema fields.
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?
Specific verb (search) plus resource (a feed's target taxonomy tree / marketplace categories) and scope (substring of the category path) are all stated. It also names the sibling it feeds into (set_category_mapping), letting an agent distinguish it from lookalikes like list_store_categories without opening a schema.
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 clearly explains the two addressing modes (feed_id vs taxonomy_code + taxonomy_locale) and the downstream action (pass the returned hash as target_hash to set_category_mapping). What's missing is an explicit contrast against sibling lookup tools such as list_store_categories or get_category_mapping, so routing is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_ad_nameAIdempotentInspect
AD name — set or clear the human-readable name of an ad so you (and the user) can identify it later. Names are free-text and NOT unique — use this to give an unnamed ad a memorable label, or to rename one. Pass name:"" (empty) to clear the name back to none. Returns {integrationId, action:'set_name', status:'updated', kind, editUrl, message}. ad_id is from list_ads. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | New name; pass an empty string to clear the name. | |
| ad_id | Yes | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readOnly, idempotent, non-destructive, but the description adds meaningful behavior beyond them: names are non-unique free text, empty string reverts to none, the exact return payload is disclosed, and it explains the project_id inference/required fallback. This is genuine operational context rather than restating annotation flags.
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?
Front-loaded with the core set/clear action, and each sentence earns its place (use cases, clearing semantics, return shape, argument sourcing). It is dense with parentheticals but no sentence is 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 3-param setter with no output schema, the description covers action semantics, argument sourcing, the project_id fallback, and the return payload. An agent has enough to invoke it correctly; only deep edge cases on name validation are unaddressed.
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 only 33% (name is documented; ad_id and project_id are not), so the description compensates well — it states where ad_id originates (list_ads) and explains project_id's optional/inferred/required behavior. Only minor detail is missing, such as format constraints on names.
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 verb pair (set/clear) and resource (an ad's human-readable name), and clarifies the semantics of the resource itself — free-text, NOT unique — so the agent understands this is a labeling operation, not a keyed identifier assignment. It is easily separable from set_marketplace_name by the explicit 'AD name' framing.
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?
Gives concrete use cases (label an unnamed ad, rename an existing one) and the clear operation (empty string clears it). It also supplies the prerequisite chain for arguments: ad_id comes from list_ads, and project_id is inferred or requires list_projects. It stops short of naming alternatives, but the when-to-use context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_ad_product_modeADestructiveInspect
Set how an ad synchronizes products to its channel. Ads are ads-based channels (advertising / price-comparison / classifieds), not marketplaces: they publish products to the ad platform and have no order sync. mode is 'auto' (products are synced automatically — publishes every matching product), 'manual' (NOTHING is auto-published; products go to the channel only when you trigger them, so this is the safe way to activate for a test) or 'pause' (product sync is paused). In MANUAL mode you push items yourself: run_ad_item_action (submit) forces a single item through, and run_ad_operation (submit_all / clean_resubmit_all) forces the whole set — even though auto-publish is off. Returns {integrationId, action:'set_product_mode', status, kind:'ads', editUrl, message} — status is 'updated' for auto/manual and 'paused' for pause; read ad_status or get_ad afterwards to confirm the applied mode. ad_id is from list_ads. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects). Each auto call queues a submission again, even if the mode was already auto. Get user approval before enabling auto and do not retry blindly.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | Product sync mode: 'auto', 'manual' or 'pause'. | |
| ad_id | Yes | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag destructive=true and idempotent=false; the description explains exactly why, disclosing that 'each auto call queues a submission again, even if the mode was already auto' — a concrete, non-obvious side effect. It also specifies the return payload and status values, adds the ad_id/project_id provenance, and states how to verify the applied mode via ad_status/get_ad.
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?
Front-loaded with the purpose and mode semantics, and every sentence carries functional content (modes, alternatives, return values, prerequisites, cautions). It is dense but long, leaning on nested parentheses and em-dashes; a shorter breakdown would be easier to parse, though nothing is truly wasted.
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?
With no output schema, the description still inlines the response shape and status values ('updated' vs 'paused'), covers the destructive/non-idempotent behavior, the project_id inference rule, and a post-call verification path. An agent has everything required to call, confirm, and safely retry-or-not.
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 only 33% and the schema documents nothing for ad_id or project_id. The description compensates fully: ad_id comes from list_ads, project_id is OPTIONAL and inferred for single-project customers but required otherwise ('then call list_projects'), and each of the three mode enum values is explained in operational terms beyond the schema's terse gloss.
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 verb+resource (set product sync mode on an ad) and immediately disambiguates the resource class: 'Ads are ads-based channels... not marketplaces', which separates it from the many marketplace siblings. An agent can classify the tool 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly defines when to pick each mode ('manual' = nothing auto-published, safe for a test; 'auto' = publishes every matching product; 'pause' = sync paused), and names the alternative tools (run_ad_item_action, run_ad_operation) that push items manually. It also gives an operational precondition ('Get user approval before enabling auto') and a caution ('do not retry blindly').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_ai_sourceAInspect
AI SOURCE (CSV-joined enrichment) — store per-product values that YOU (the client's own model) extracted, as a new 'AI source' attribute — so a feed rule can read the attribute directly instead of matching free text with contains/conditions. Typical flow: call preview_products to read products, derive ONE value per product with your own reasoning (e.g. the color, gender, or material from the title/description), then call this with values as a JSON OBJECT (not an array) mapping each product's id (the id field from preview_products) to the extracted value. code is the new attribute name (e.g. "ai_color"); once applied it becomes the source attribute custom_ (visible in list_source_attributes). Send large catalogs in BATCHES: first batch mode:"replace", following batches mode:"append"; set apply:true on the LAST batch only, to materialize (this re-imports the additional sources so the values land on products — an ASYNCHRONOUS import). VERIFY before using it: poll get_import_status until the newest additional_source run in recentRuns has running:false and status 'ok', and the code appears in list_source_attributes; only THEN attach the attribute to a feed with map_feed_attribute. If that run errors, run_import retries without re-sending the values. handle overrides the product key to join on (default header.id, which matches the preview_products id). project_id is OPTIONAL (inferred for a single-project customer). Requires the additional-sources addon: without it the call is refused with error 'addon_required' (HTTP 403) with addonCode. Explain the unavailable entitlement and do not retry or offer a purchase. Returns {status:'written'|'applied', code, url, valueCount, applied}. The additional-source import can also fetch URLs already configured on this project; this tool does not accept a URL.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ||
| mode | No | ||
| apply | No | ||
| handle | No | ||
| values | Yes | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations covering the safety profile, the description adds substantial behavioral context: the operation is an ASYNCHRONOUS import, requires the additional-sources addon (else HTTP 403 with error 'addon_required'), requires polling until recentRuns shows running:false and status 'ok', and specifies the return shape. readOnlyHint=false is consistent with the write semantics, so no contradiction.
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 purpose and typical flow are front-loaded, and nearly every sentence carries operational weight (batching, verification, addon error, return shape). However it is a dense, semicolon-heavy block of roughly 250 words that is harder to scan than it could be, with some capitalization emphasis that reads as shouting.
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 async, addon-gated, batch-aware write tool with no output schema, the description covers the full lifecycle: input derivation, batching order, materialization trigger, verification via get_import_status, downstream wiring via map_feed_attribute, and the failure/entitlement path. An agent has everything needed to invoke and follow up correctly.
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 0%, so the description must carry the load, and it does for all six parameters: `values` is a JSON OBJECT keyed by product id (not an array), `code` names the new attribute (becoming custom_<code>), `mode` is replace/append, `apply` materializes on the last batch, `handle` overrides the join key (default header.id), and `project_id` is optional/inferred. Little is left ambiguous.
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 verb+resource: stores per-product values the client model extracted as a new 'AI source' attribute. Explicitly distinguishes it from free-text matching ('so a feed rule can read the attribute directly instead of matching free text with contains/conditions') and implicitly from set_api_source/delete_ai_source siblings. An agent can tell this apart from sibling tools without opening any schema.
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 an explicit end-to-end flow: call preview_products first, derive one value per product, then call this tool; batch large catalogs with mode:'replace' then 'append'; set apply:true only on the last batch; verify with get_import_status before map_feed_attribute. Also states when-not: it does not accept a URL, and describes the addon-gated refusal path. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_api_sourceAInspect
API SOURCE (written to the data store) — store per-product values that YOU (the client's own model) computed, as a new 'API source' attribute — written straight into the project's data store (no CSV, no join handle) — so a feed rule can read the attribute directly instead of matching free text with contains/conditions. PREFER this whenever a rule would otherwise need a long or complex condition tree. Typical flow: call preview_products to read products, derive ONE value per product with your own reasoning (e.g. the color, gender, or material from the title/description), then call this with values as a JSON OBJECT (not an array) mapping each product's id (the id field from preview_products) to the computed value. Values keep their JSON type — send a NUMBER for a numeric attribute (so numeric rule operators work), a boolean, or a string; a null clears that product. code is the new attribute name (e.g. "ai_color"); once applied it becomes the source attribute api_source. (visible in list_source_attributes). Send large catalogs in BATCHES: first batch mode:"replace", following batches mode:"append"; set apply:true on the LAST batch only, to materialize (this re-imports so the values land on products — an ASYNCHRONOUS import). VERIFY before using it: poll get_import_status until the newest api_source run in recentRuns has running:false and status 'ok', and the code appears in list_source_attributes; only THEN attach the attribute to a feed with map_feed_attribute or reference api_source. in a rule (create_rule / update_rule). If that run errors, run_import retries without re-sending the values. code must not collide with an existing source attribute of another class. project_id is OPTIONAL (inferred for a single-project customer). Requires the additional-sources addon: without it the call is refused with error 'addon_required' (HTTP 403) with addonCode. Explain the unavailable entitlement and do not retry or offer a purchase. Returns {status:'written'|'applied', code, valueCount, applied}.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ||
| mode | No | ||
| apply | No | ||
| values | Yes | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, non-idempotent, non-destructive; the description adds substantial context: the write is an ASYNCHRONOUS import, apply only on the last batch, a null clears a value, addon gating with error 'addon_required' (HTTP 403) and addonCode, plus an explicit instruction not to retry or offer a purchase, and a verify-then-attach protocol.
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?
Purpose is front-loaded and every clause carries operational value, so length is largely justified by tool complexity. It is, however, a dense run-on sentence with heavy em-dash nesting that could be broken into scannable structure for faster parsing.
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 5-param async mutation tool with no output schema, the description supplies the return shape ({status, code, valueCount, applied}), the async verification path, batching rules, entitlement behavior, and downstream usage — nothing an agent needs to call it correctly is missing.
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 0%, so the description carries the full burden and does: values is a JSON OBJECT (not array) mapping product id to value, JSON types are preserved (send a NUMBER for numeric operators), null clears, code is the new attribute name surfaced as api_source.<code>, mode replace/append controls batching, apply materializes on the last batch, and project_id is optional for single-project customers.
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 verb and resource — 'store per-product values ... as a new API source attribute' — and specifies the write target (the project's data store, no CSV, no join handle). It is clearly distinguishable from siblings like set_ai_source, delete_api_source, and list_api_sources.
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?
Explicit 'PREFER this whenever a rule would otherwise need a long or complex condition tree,' plus a named typical flow with specific siblings (preview_products, list_source_attributes, map_feed_attribute, create_rule/update_rule) and the replace/append batching condition. When-to-use and which alternative are both spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_category_mappingADestructiveIdempotentInspect
Map store categories to marketplace/taxonomy categories. Address the taxonomy by feed_id OR explicitly by taxonomy_code (+ optional taxonomy_locale). rules is a list of {store_category_ids:[...], target_hash} — each maps those store categories (ids from list_store_categories / list_unmapped_categories) to one target (hash from search_target_categories); a store category already mapped is re-pointed to the new target. The rule set is SHARED per project+taxonomy+locale, so if OTHER feeds use this taxonomy the call returns status=mapping_exists_requires_confirm (HTTP 409) with affectedFeedIds — re-call with confirm:true to apply. SAVE-ONLY: persists but does NOT regenerate — call export_feed afterwards. Returns {taxonomyCode, taxonomyLocale, status, rulesWritten, reason, affectedFeedIds}; status is 'updated' | 'no_changes' | 'mapping_exists_requires_confirm' | 'rejected' (reason: no_taxonomy | unknown_target | unknown_store_category | empty_rules). project_id is OPTIONAL (inferred for a single-project customer).
| Name | Required | Description | Default |
|---|---|---|---|
| rules | Yes | ||
| confirm | No | Set true to apply when other feeds share this taxonomy (status=mapping_exists_requires_confirm); default false. | |
| feed_id | No | ||
| project_id | No | ||
| taxonomy_code | No | Target taxonomy id (e.g. 'google'); alternative to feed_id for addressing the taxonomy. | |
| taxonomy_locale | No | Locale of the taxonomy tree, e.g. 'en_GB' — defaults to the taxonomy's own default when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral detail beyond the annotations: the shared rule set per project+taxonomy+locale, the HTTP 409 conflict requiring confirm:true, re-pointing of already mapped categories, save-only persistence without regeneration, and the full status/reason vocabulary. This is exactly the kind of context annotations cannot convey.
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 every sentence carries essential operational information: addressing, rule structure, sharing/conflict behavior, save-only caveat, and return statuses. It is front-loaded with the core purpose and structured logically, so the length is justified by the tool's complexity.
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 is complete for a tool of this complexity. It covers all parameter semantics, the conflict/confirm flow, post-call requirements (export_feed), and the exact return status values despite the absence of an output schema. An agent has everything needed to invoke it correctly.
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 only 50% schema description coverage, the description compensates fully: it explains the rules structure (store_category_ids and target_hash), the origin of IDs, feed_id vs taxonomy_code addressing, the optional project_id inference, and confirm semantics. Even for parameters that have schema descriptions (confirm, taxonomy_code, taxonomy_locale), the description integrates them into a coherent workflow.
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 operation: 'Map store categories to marketplace/taxonomy categories.' It distinguishes itself from siblings by referencing helper tools (list_store_categories, search_target_categories) and export_feed, and by explaining the two addressing modes (feed_id vs taxonomy_code). This leaves no ambiguity about what the tool does.
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 rich usage context: it tells the agent where to source store_category_ids and target_hash, how to address the taxonomy, and that export_feed must be called afterwards. It does not explicitly say 'use get_category_mapping to read existing mappings' or provide any when-not-to-use exclusions, but the workflow is clearly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_feed_attribute_filterAIdempotentInspect
Set (or clear) a feed's ATTRIBUTE filter: conditions on source attributes that decide which products export, joined by combination 'and' | 'or' (default 'and'). Each condition is {attribute, operator, value}: attribute is a source attribute code (from list_source_attributes); operator is one of equals, not_equals, contains, not_contains, starts, not_starts, ends, not_ends, empty, not_empty, greater, greater_or_equal, less, less_or_equal, regex, not_regex, is_true, is_false; value is the comparison string (omit for empty / not_empty). Pass conditions:[] to CLEAR the attribute filter. This is separate from the category filter (set_feed_filter). To include or exclude out-of-stock products use export_out_of_stock on set_feed_filter — NEVER build a qty/stock condition here. SAVE-ONLY: persists and bumps the revision but does NOT regenerate — call export_feed afterwards. Returns {feedId, status, changed, reason, revisionBefore, revisionAfter}; status is 'updated' | 'no_changes' | 'rejected' (reason: invalid_value | unknown_source_attribute | invalid_condition). project_id is OPTIONAL (inferred for a single-project customer).
| Name | Required | Description | Default |
|---|---|---|---|
| feed_id | Yes | ||
| conditions | Yes | ||
| project_id | No | ||
| combination | No | How the conditions are joined: 'and' = a product must match all (default), 'or' = match any. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses critical behavior: clearing via conditions:[], save-only semantics (persists and bumps revision but does not regenerate), and the exact response statuses and rejection reasons. This adds substantial behavioral context not present in the annotations or schema.
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 every sentence earns its place; there is no filler. It front-loads the core purpose and then systematically covers condition grammar, clearing behavior, distinctions from siblings, post-call requirements, and return semantics.
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 low schema coverage and no output schema, the description is remarkably complete. It covers input semantics, operational behavior, return shape, status/reason values, sibling differentiation, and optional parameter behavior — nothing critical is missing for an agent to invoke it correctly.
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 only 25%, so the description carries most of the parameter semantics. It fully explains conditions structure, the complete operator list, value omission for empty/not_empty, combination default, and project_id optionality — all beyond the sparse 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 states a specific verb ('Set (or clear)') and resource ('a feed's ATTRIBUTE filter'), and explicitly distinguishes it from the category filter set_feed_filter. This makes the tool's purpose unambiguous and separates it from its sibling.
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 when-to-use guidance: use this for attribute conditions, use set_feed_filter for category filters, and NEVER use this for stock/qty conditions (use export_out_of_stock instead). It also explains the post-call requirement to invoke export_feed after this save-only operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_feed_filterAIdempotentInspect
Set a feed's product filter — which products reach the output. Common flags: export_out_of_stock (include items with zero stock), export_variants_as_single (export child variants instead of the parent), export_removed_products (no = only active | yes = all incl. removed | only = removed only). Category filter: category_ids (store category ids from list_store_categories) with category_operator include|exclude (default include); category_ids:[] clears the category filter (export all categories). Provide at least one field; a field you omit is left unchanged. SAVE-ONLY: persists and bumps the revision but does NOT regenerate the feed — call export_feed afterwards. Returns {feedId, status, changed:[...], reason, revisionBefore, revisionAfter}; status is 'updated' | 'no_changes' | 'rejected' (reason: invalid_value | unknown_store_category). project_id is OPTIONAL (inferred for a single-project customer).
| Name | Required | Description | Default |
|---|---|---|---|
| feed_id | Yes | ||
| project_id | No | ||
| category_ids | No | ||
| category_operator | No | Whether category_ids are an allow-list ('include', default) or a block-list ('exclude'). | |
| export_out_of_stock | No | ||
| export_removed_products | No | Which products to export by removal state: 'no' = only active (default), 'yes' = all incl. removed, 'only' = removed only. | |
| export_variants_as_single | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses important side effects beyond the annotations: the call persists and bumps the revision but does not regenerate the feed, and it explains the meaning of statuses ('updated', 'no_changes', 'rejected') and reasons. It also documents special behavior for category_ids:[] clearing the filter and the optional project_id inference, which annotations alone do not convey.
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 front-loaded with the core purpose and then organized into flags, category filtering, caveats, and return values. Every sentence carries information, though the clustered formatting and multiple uses of vertical bars make it slightly harder to scan quickly.
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 7-parameter mutation tool with no output schema, the description covers invocation rules, defaults, side effects, follow-up action, return shape, statuses, and error reasons. An agent has enough to select and call the tool correctly without needing to infer hidden behavior.
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 only 29%, but the description compensates by explaining export_out_of_stock, export_variants_as_single, the three export_removed_products modes, category_ids with category_operator defaults, and clearing behavior. It also clarifies project_id is optional and inferred, adding meaning beyond the bare schema properties.
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 verb and resource: 'Set a feed's product filter' with an explanatory clause 'which products reach the output.' It differentiates from the sibling set_feed_attribute_filter by focusing on product-level export filters rather than attribute mappings, and from set_feed_settings by scoping to filter behavior.
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 operational guidance: at least one field must be provided, omitted fields are unchanged, and the SAVE-ONLY behavior explicitly instructs to call export_feed afterwards. It does not name direct alternative tools for when to use another filter/settings tool, so it stops short of a full when/when-not comparison.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_feed_settingsAIdempotentInspect
Set a feed's general output settings: SHIPPING cost and STOCK. Send shipping and/or stock; within each object only the keys you include change (omitted keys are left as-is). shipping: {dependent_attribute (a source attribute code from list_source_attributes the cost depends on, e.g. weight/price — '' clears it), method_name (free text), intervals (the cost table — REPLACES the whole set; each row {from, to, cost} numeric with 0 <= from <= to <= 1000000 and cost >= 0; intervals:[] clears all rows)}. stock: {in_value (the value exported when a product is In stock), out_value (the value when Out of stock), availability_attribute (a source attribute code exported as availability when out of stock — '' clears it)}. Provide at least one of shipping / stock. To rename the feed use update_feed (the feed name is not set here). SAVE-ONLY: persists and bumps the revision but does NOT regenerate the feed — call export_feed afterwards. Read the current values from get_feed (settings). Returns {feedId, status, changed:[...], reason, revisionBefore, revisionAfter}; status is 'updated' | 'no_changes' | 'rejected' (reason: invalid_value | unknown_source_attribute | invalid_interval). project_id is OPTIONAL (inferred for a single-project customer).
| Name | Required | Description | Default |
|---|---|---|---|
| stock | No | Stock settings; only the keys you send change. | |
| feed_id | Yes | ||
| shipping | No | Shipping cost settings; only the keys you send change. | |
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description reveals SAVE-ONLY behavior, revision bumping, non-regeneration of the feed, and the need to call export_feed. It also names the return statuses and rejection reasons, adding meaningful runtime behavior that the annotations do not cover. No contradiction with readOnlyHint=false or idempotentHint=true is present.
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 every sentence earns its place: purpose is front-loaded, then partial semantics, object-level details, alternatives, save-only caveat, and return shape. There is no filler for a tool with two nested objects and a non-obvious side-effect profile.
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?
Because there is no output schema, the description correctly supplies the return shape and status/reason enums. It also covers the revision side effects, follow-up export_feed call, and where to read current settings and rename the feed, making the tool self-contained enough to invoke correctly.
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 50%, and the description compensates fully: it explains partial object updates, intervals replacement and clearing, '' clearing semantics for dependent_attribute/availability_attribute, numeric interval constraints, and the optional project_id. It adds value beyond the schema's field 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 'Set a feed's general output settings: SHIPPING cost and STOCK', a specific verb plus resource and scope. It explicitly distinguishes itself from update_feed ('To rename the feed use update_feed') and export_feed, so an agent can separate it from nearby 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 when/how guidance: 'Provide at least one of shipping / stock', states the partial-update behavior, and names alternatives ('To rename the feed use update_feed', 'call export_feed afterwards', 'Read the current values from get_feed'). This is clear routing and prerequisite context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_marketplace_nameAIdempotentInspect
MARKETPLACE name — set or clear the human-readable name of a marketplace so you (and the user) can identify it later. Names are free-text and NOT unique — use this to give an unnamed marketplace a memorable label, or to rename one. Pass name:"" (empty) to clear the name back to none. Returns {integrationId, action:'set_name', status:'updated', kind, editUrl, message}. marketplace_id is from list_marketplaces. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | New name; pass an empty string to clear the name. | |
| project_id | No | ||
| marketplace_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds real behavioral context on top: names are free-text and NOT unique, empty string reverts to none, and project_id may be required with a fallback path. It stops short of describing error/failure behavior, so not a 5.
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?
Front-loaded with the core action and every sentence earns its place, but the single paragraph crams clearing behavior, return shape, and two ID-provenance rules together, which makes it denser than ideal for scanning.
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?
With no output schema, the description step-in and enumerates the return fields, and it covers the indirect dependency (project_id inference, list_projects fallback) that an agent would otherwise only discover at call time. Nothing needed to invoke this correctly is missing.
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 only 33% (only name is documented), so the description must compensate – and it does, explaining name semantics (free-text, non-unique, empty clears) and where marketplace_id comes from (list_marketplaces) plus project_id's optional/inferred status. Not a 5 because marketplace_id's format or validation is never touched.
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 first clause names a specific verb (set/clear) and resource (marketplace name) and explicitly scopes it to the human-readable label, which cleanly separates it from sibling set_ad_name and from create_marketplace.
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 states both use cases (label an unnamed marketplace, rename an existing one), the exclusion/clearing case (pass empty string), and the prerequisite flow for project_id (inferred for single-project customers, otherwise call list_projects).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_marketplace_order_modeAInspect
Start or stop ACTIVE order synchronization for a marketplace that ALREADY has order sync. enabled:true starts syncing, enabled:false stops it. This is the on/off switch, NOT the capability: if the marketplace does not have order sync yet (get_marketplace orderSync:false / canEnableOrderSync:true), this returns status 'prerequisite_not_met' (HTTP 409) — call enable_marketplace_order_sync first (and configure its order-settings step), then come back here to start it. Returns {integrationId, action:'set_order_mode', status, kind, editUrl, message}: status is 'updated' on success, 'prerequisite_not_met' when order sync is not enabled yet, or 'rejected' (HTTP 409) when the plan does not allow it (message explains — e.g. a feature is not included). marketplace_id is from list_marketplaces. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects). Enabling or disabling also registers or unregisters channel order webhooks. Repeating the call can repeat external registration work.
| Name | Required | Description | Default |
|---|---|---|---|
| enabled | Yes | true to enable order synchronization, false to disable it. | |
| project_id | No | ||
| marketplace_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false, openWorldHint=true). The description goes far beyond by disclosing side effects (registers/unregisters channel order webhooks), the exact status codes and their meaning ('prerequisite_not_met' HTTP 409, 'rejected' HTTP 409), and the non-idempotency caveat ('Repeating the call can repeat external registration work'). Rich behavioral context aligned with, not contradictory to, 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?
Front-loads the core purpose and the on/off vs capability distinction, then layers prerequisites, return shape, and caveats. Dense but every sentence carries information. Slightly information-heavy but justifiably so for a multi-pathway tool.
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?
Despite no output schema, the description documents the return object structure and status values. Given the tool's complexity (prerequisite chains, webhook side effects, non-idempotency, optional project_id), the description supplies everything an agent needs to call it correctly, including failure and recovery paths.
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 33%. The description clarifies where marketplace_id comes from (list_marketplaces) and explains project_id's optional/inferred behavior (inferred for a single-project customer; project_id_required otherwise, then call list_projects). enabled semantics are documented in schema. The description compensates for most of the low coverage gap.
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 verb+resource ('Start or stop ACTIVE order synchronization for a marketplace') and distinguishes itself explicitly from enable_marketplace_order_sync by framing this as 'the on/off switch, NOT the capability'. An agent can differentiate this tool from its closest siblings without opening schemas.
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?
Gives explicit when-to-use (marketplace already has order sync), when-not (get_marketplace orderSync:false / canEnableOrderSync:true), the alternative to call first (enable_marketplace_order_sync), and where marketplace_id and project_id come from. Also covers the sequential dependency (configure its order-settings step, then come back).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_marketplace_product_modeADestructiveInspect
Set how a marketplace synchronizes products to its channel. mode is 'auto' (products are synced automatically — publishes every matching product), 'manual' (NOTHING is auto-published; products go to the channel only when you trigger them, so this is the safe way to activate for a test) or 'pause' (product sync is paused). In MANUAL mode you push items yourself: run_marketplace_item_action (submit) forces a single item through, and run_marketplace_operation (submit_all / clean_resubmit_all) forces the whole set — even though auto-publish is off. Returns {integrationId, action:'set_product_mode', status, kind, editUrl, message} — status is 'updated' for auto/manual and 'paused' for pause; read marketplace_status or get_marketplace afterwards to confirm the applied mode. marketplace_id is from list_marketplaces. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects). Each auto call queues a submission again, even if the mode was already auto. Get user approval before enabling auto and do not retry blindly.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | Product sync mode: 'auto', 'manual' or 'pause'. | |
| project_id | No | ||
| marketplace_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses that each auto call re-queues a submission even when already in auto (reinforcing and explaining idempotentHint=false), warns against blind retries, and requires user approval before enabling auto. It also describes the response shape and how to verify the applied mode via marketplace_status/get_marketplace.
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?
Front-loaded with the core action and modes, and every clause carries information. It is dense and somewhat run-on with stacked parentheticals, but no sentence is filler; minor tightening only.
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 non-idempotent, destructive mutation with no output schema, the description covers modes, side effects, verification path, approval requirement, and the optional-parameter branch. An agent has everything needed to call it correctly.
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 only 33% schema coverage the description compensates fully: it explains marketplace_id comes from list_marketplaces, and that project_id is optional/inferred for single-project customers but required otherwise (then call list_projects). The mode enum values are given behavioral meaning the schema's one-line description lacks.
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 verb+resource (set product sync mode on a marketplace) and enumerates the three modes with their distinct effects, so it is separable from siblings like pause_marketplace or set_marketplace_order_mode. The scope ('how a marketplace synchronizes products to its channel') is unambiguous.
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?
Explicitly distinguishes when to use each mode, flags manual as 'the safe way to activate for a test', and names the alternatives for pushing items (run_marketplace_item_action, run_marketplace_operation) along with the auto-publish-off caveat. It also states the approval precondition for auto.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_feedADestructiveInspect
Submit a generated feed to its sales channel (only meaningful for API channels with a connection; file feeds that the channel pulls are not submitted). The feed must be generated first (status='generated' from get_feed_status) — otherwise returns error 'feed_not_generated'. Returns {feedId, action:'submit', status, feedStatus, message}. status is 'submitted' (ok), 'not_submittable' (channel doesn't accept submissions), or 'failed' (with message). feed_id from list_feeds / create_feed; project_id OPTIONAL. Recommended: run verify_feed_attributes before submitting. This sends product data to the live channel and can replace existing listings. Confirm the submission with the user; a later submission does not undo the original channel effects.
| Name | Required | Description | Default |
|---|---|---|---|
| feed_id | Yes | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true, idempotentHint=false and openWorldHint=true, but the description adds the substance behind them: it sends product data to the live channel, can replace existing listings, a later submission does not undo the original channel effects, and it enumerates failure modes ('feed_not_generated' error) and terminal statuses (submitted/not_submittable/failed). This is well beyond what the structured fields convey.
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?
Dense but front-loaded: purpose, applicability, prerequisite, and error behavior come before the return shape and the safety warning. A few clauses (return-value enumeration, the confirmation reminder) are long-winded, costing it a perfect score, but nearly every sentence earns its place.
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?
With no output schema, the description supplies the return contract (feedId, action, status, feedStatus, message) and the meaning of each status value, plus the prerequisite chain and the irreversibility warning. For a destructive, non-idempotent, open-world write, this is as complete as an agent needs.
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 0%, so the description must carry parameter meaning. It does explain the provenance of feed_id ('from list_feeds / create_feed') and marks project_id as OPTIONAL, but never says what project_id actually scopes or what happens if it is omitted, so the compensation is only partial.
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 verb and resource ('Submit a generated feed to its sales channel') and immediately bounds the scope ('only meaningful for API channels with a connection; file feeds ... are not submitted'). An agent can distinguish this from export_feed, get_feed_output, or pause_feed without opening any schema.
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?
Explicit when-to-use (API channels with a connection), when-not (file feeds the channel pulls), a hard prerequisite (must be status='generated' per get_feed_status), a recommended preceding step (verify_feed_attributes), and an operational rule ('Confirm the submission with the user'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_marketplace_ordersAInspect
Pull orders from the channel NOW — a manual, one-off order import (in addition to the automatic sync that runs on its own when order sync is enabled). Use it when the user wants to fetch fresh orders immediately. The import runs asynchronously; watch the counts in marketplace_status.orderStats. Requires the marketplace's connection to be active for orders — otherwise returns status 'prerequisite_not_met' (HTTP 409). Returns {integrationId, action:'sync_orders', status, kind, editUrl, message}; status is 'updated' when the import was started. marketplace_id is from list_marketplaces. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects). Marketplaces only — ads have no order sync.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | ||
| marketplace_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond annotations. It discloses that the import runs asynchronously and directs the agent to 'watch the counts in marketplace_status.orderStats'. It also explains the exact return object shape and the meaning of status 'updated'. It details the error handling (HTTP 409 with prerequisite_not_met). All of this enriches behavioral understanding beyond the annotation flags.
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 a compact paragraph that front-loads the core purpose, then progressively adds usage, behavior, error handling, and parameter sourcing. Every sentence earns its place; there is no filler. It is information-dense yet well-ordered, making it easy to parse.
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 no output schema, the description fully covers what the tool does, when to use it, how it runs, what it returns (including status semantics), error conditions, parameter sourcing, and scope. It even directs the agent to a dependent tool (marketplace_status) for monitoring results. Nothing essential is missing.
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 0%, so the description must carry the semantic burden, and it does. For marketplace_id it says 'is from list_marketplaces' (source of the value). For project_id it explains it's optional, inferred for single-project customers, but required otherwise, with a pointer to list_projects. This fully clarifies the parameters beyond their raw types.
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 clear verb and resource: 'Pull orders from the channel NOW' and explicitly distinguishes this manual one-off import from the automatic sync. It also states the scope ('Marketplaces only — ads have no order sync') which further differentiates it from sibling tools. This is a specific, unambiguous 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?
It explicitly says 'Use it when the user wants to fetch fresh orders immediately' and contrasts with the automatic sync. It also provides a prerequisite ('Requires the marketplace's connection to be active for orders') and explains the failure mode ('returns status prerequisite_not_met'). It further clarifies when project_id is needed and where to get it (list_projects). This gives clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_project_ordersAInspect
Start an order synchronization for the whole project now — ONE background process that pulls orders across ALL of the project's order connections at once (the same run as the Koongo 'Sync Now' button; it also overlaps with any marketplace order sync, since order sync runs once per project). Returns {action:'sync', status:'done', message}; if a sync is already running that run continues (status stays 'done'). This is heavy and project-wide: to check a SINGLE connection use test_order_connection instead. Order counts then move in get_order_overview. project_id is OPTIONAL (project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only declare the generic safety profile), the description discloses non-obvious traits: it is the same run as the Koongo 'Sync Now' button, it overlaps with marketplace order sync because order sync runs once per project, and a concurrent run simply continues rather than erroring. It also states the return payload, which is genuinely useful given no output schema exists.
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?
Front-loaded with the core purpose and scope, and every sentence carries distinct information (return shape, concurrency semantics, sibling routing, optional param). It is dense and slightly over-packed with parenthetical asides, but there is 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 1-param, no-output-schema tool the description covers purpose, scope, concurrency behavior, return shape, sibling alternatives, and the optional-parameter recovery path. Nothing an agent needs to invoke it correctly is missing.
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 0% for the sole project_id parameter, so the description must carry the burden, and it does: it declares project_id OPTIONAL, describes the project_id_required failure path, and points to list_projects as the recovery step. It stops short of full detail (e.g., no format guidance), but for a 1-param integer ID this is solid compensation.
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 verb+resource ('Start an order synchronization for the whole project') and immediately scopes it as ONE background process across ALL order connections. Explicitly distinguishes itself from siblings by naming test_order_connection for single-connection checks and get_order_overview for counts. An agent can route correctly without opening any schema.
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?
Gives explicit alternatives with the condition that selects them: use test_order_connection for a SINGLE connection, watch get_order_overview for order counts, and call list_projects when project_id_required. It also flags the tool as heavy and project-wide, which is the key when-not signal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_ad_connectionAIdempotentInspect
Verify that an ad integration's saved connection still works — runs a live connectivity/auth check against the ad channel right now. Each ad owns exactly ONE connection (never shared), so no separate handle is needed: the ad_id IS the connection. Use this when an ad looks connected but items fail, or after credentials/OAuth may have expired. Returns {integrationId, status ('ok' | 'error' | 'not_connected'), message}. 'not_connected' means the connection step was never completed; to move a connection to a different channel there is no transfer — clone the ad with clone_ad. Never returns secrets. This does not change any settings. Fixing or (re)establishing a connection (credentials / OAuth) is done by the USER in the browser / Koongo UI, NEVER via MCP: on 'error' / 'not_connected' route the user there, do not retry configure_ad_step to set credentials. ad_id is from list_ads. project_id is OPTIONAL (project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | integrationId of the ad (from list_ads). | |
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotent and non-destructive, but the description adds valuable behavioral details: this does not change settings, never returns secrets, reports a 'not_connected' status, and clarifies that credential/OAuth fixes happen only via the user in the UI. The readOnlyHint=false annotation is not contradicted because a live auth/connectivity check may still have side effects beyond settings.
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 purposeful, front-loading the core purpose before covering return shape, edge cases, and user-only repair flows. While lengthy, nearly every sentence carries operational guidance, so the length is justified rather than redundant.
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?
With no output schema, the description provides a full return contract including status values and their meaning. It also covers the not_connected edge case, the no-transfer constraint, the user-only credential repair path, and optional parameter handling—leaving no required decision ambiguous 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 only 50%, but the description compensates by explaining that ad_id is both the integration ID and the connection handle, sourced from list_ads. For project_id, it clarifies that it is optional, when it becomes required, and how to discover it via list_projects—though it could have described the parameter's purpose more explicitly.
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 opening sentence uses 'Verify' with a specific resource and action: checking whether an ad integration's saved connection still works via a live connectivity/auth check. It clearly ties the tool to ads specifically and explains that the ad_id is the connection, distinguishing it from related connection-testing tools for marketplaces and orders.
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 states when to use the tool ('when an ad looks connected but items fail, or after credentials/OAuth may have expired') and when not to: do not retry configure_ad_step for credential fixes, route the user to the browser/UI instead, and clone the ad if a connection needs to move to another channel. It also provides fallback guidance for project_id with list_projects.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_marketplace_connectionAIdempotentInspect
Verify that a marketplace's saved connection still works — runs a live connectivity/auth check against the channel right now. Each marketplace owns exactly ONE connection (never shared), so no separate handle is needed: the marketplace_id IS the connection. Use this when a marketplace looks connected but items fail, or after credentials/OAuth may have expired. Returns {integrationId, status ('ok' | 'error' | 'not_connected'), message}. 'not_connected' means the connection step was never completed; to move a connection to a different channel there is no transfer — clone the marketplace with clone_marketplace. Never returns secrets. This does not change any settings. Fixing or (re)establishing a connection (credentials / OAuth) is done by the USER in the browser / Koongo UI, NEVER via MCP: on 'error' / 'not_connected' route the user there, do not retry configure_marketplace_step to set credentials. marketplace_id is from list_marketplaces. project_id is OPTIONAL (project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | ||
| marketplace_id | Yes | integrationId of the marketplace (from list_marketplaces). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses key behaviors: the live check changes no settings, never returns secrets, and the 'not_connected' status means setup was never completed. It also explains the one-connection-per-marketplace model and that credential repair is always done by the user, not through MCP. This is substantial behavioral context that annotations alone do not provide.
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 front-loaded with the core purpose and then packs only high-value operational details: return shape, status semantics, negative guidance, and parameter sourcing. It is longer than average but each clause addresses a real decision an agent would otherwise get wrong.
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 no output schema, the description fully covers the return contract ({integrationId, status, message}), the statuses, and the action to take for error/not_connected. It also covers the connection model, non-destructiveness, secret handling, and parameter sourcing, leaving no critical gap 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?
With schema coverage only at 50%, the description compensates by giving marketplace_id's source (list_marketplaces) and clarifying that project_id is optional with a fallback to list_projects when a project is required. It could specify project_id's role more explicitly, but the added guidance meaningfully exceeds the 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 a specific verb ('Verify') and resource ('a marketplace's saved connection'), and explains exactly what the tool does: run a live connectivity/auth check against the channel. It also distinguishes this tool from related connection-test siblings by scoping it to marketplaces and explicitly noting the marketplace_id is the connection.
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 explicit when-to-use conditions ('looks connected but items fail' or 'after credentials/OAuth may have expired') and clear when-not-to-use guidance: do not retry configure_marketplace_step, route the user to the browser/UI for fixing credentials. It also points to clone_marketplace for transferring a connection and list_projects for the optional project_id case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
test_order_connectionAIdempotentInspect
Verify that a standalone order connection's saved credentials still work — a live connectivity/auth check right now. Returns {connectionId, status ('ok'|'error'|'not_connected'), message} — the message is masked and never contains secrets. 'not_connected' means authentication was never completed: route the USER to finish it in the Koongo UI (never via MCP), do not try to set credentials. Use this to confirm a connection is healthy before enabling it with configure_order_connection order_status:'active'. This is the right way to check a SINGLE connection — do not run sync_project_orders for that. connection_id is from get_order_overview. project_id is OPTIONAL (project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | No | ||
| connection_id | Yes | connectionId of the order connection (from get_order_overview). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already include idempotentHint=true and destructiveHint=false, and the description adds meaningful behavioral detail: it is a live check, returns a masked message that 'never contains secrets,' and precisely interprets 'not_connected' as never-completed authentication with the instruction not to try setting credentials. There is no contradiction with 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 dense but every sentence earns its place: purpose first, then return shape, edge-case behavior, usage timing, exclusions, and parameter sourcing. There is no filler or repetition of schema details.
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?
With no output schema, the description fully covers the return structure ({connectionId, status, message}), status vocabulary, user routing for unauthenticated connections, and the relationship to sibling operations. Nothing an agent needs to invoke this correctly is missing.
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 only 50% (connection_id documented, project_id not), but the description compensates fully. It states connection_id comes from get_order_overview and explains that project_id is optional unless project_id_required, in which case the agent should call list_projects. This is actionable meaning beyond the bare 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 'Verify that a standalone order connection's saved credentials still work — a live connectivity/auth check right now,' which names a specific verb, resource, and immediate intent. It is clearly distinguished from sibling tools like test_ad_connection and test_marketplace_connection by the 'order connection' scope.
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 explicit when-to-use guidance ('before enabling it with configure_order_connection order_status:"active"') and when-not-to-use guidance ('do not run sync_project_orders for that'). It also defines the 'not_connected' edge case and directs the user to the Koongo UI instead of attempting credential setup via MCP, plus names list_projects as the fallback when project_id is required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_feedADestructiveIdempotentInspect
Edit a feed's basic settings: rename (name) and/or enable/disable (enabled). Provide at least one. Returns {feedId, status, changed:[...], name, enabled, revisionBefore, revisionAfter}. status is 'updated' or 'no_changes'. feed_id from list_feeds / create_feed; project_id OPTIONAL. NOTE: attribute mapping and product-filter editing are NOT supported here yet — only name/enabled. For enable/disable only, pause_feed/resume_feed are equivalent; use update_feed when also renaming. Setting enabled:true can resume scheduled export/submission and change live listings. Confirm that effect before enabling; changing only the name does not publish.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| enabled | No | ||
| feed_id | Yes | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and idempotentHint=true, but the description goes well beyond them: enabling can resume scheduled export/submission and alter live listings, while a rename does not publish. It also documents the return payload (status, changed, revisionBefore/After) and the 'no_changes' outcome, which annotations cannot convey.
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?
Front-loaded with purpose and the return contract before the caveats, and nearly every sentence carries distinct information. It is dense and reads as a single block, but little is redundant.
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?
No output schema exists, yet the description supplies the return shape and status semantics, plus id sourcing, side effects, and unsupported operations. An agent has everything needed to call this correctly and safely.
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 0% schema description coverage the description must carry the load, and it does for name/enabled/feed_id (source is list_feeds/create_feed, and at least one of name/enabled is required). project_id is only labelled OPTIONAL without saying what scoping it applies, leaving a small gap.
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 verb+resource (edit a feed's basic settings) and enumerates exactly which fields are mutable (name, enabled). It explicitly disambiguates from siblings pause_feed/resume_feed and from other feed-editing operations by noting attribute mapping and product-filter editing are NOT supported here.
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?
Explicit routing rules: use pause_feed/resume_feed for enable/disable only, use update_feed when also renaming; 'Provide at least one' states the precondition; and it warns to confirm the side effects of enabling before doing so. Alternatives and exclusions are both named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_ruleAIdempotentInspect
Update an EXISTING product rule (Attribute Rule). ALWAYS validate_rule the new document first and fix every error. Identify the rule by rule_id (from list_rules / get_rule) and pass the full rule document as rule — {name, description, category, icon, rules:[{sortId, enabled, type, conditions, operationGroups: [{mode, parentMode, attributes, operations:[{name, arguments:{key:value}}]}]}]}. The safe pattern is: get_rule, edit the returned document, validate_rule, then update_rule with it. Only name, description, category, icon and rules are editable; usage/bookkeeping fields are preserved server-side. A get_rule document already carries map_attribute_value search/replace in the correct {value:''}-objects form (paired by index) — edit those entries verbatim, never flatten them to plain strings (plain strings save but map nothing). update_rule keeps ruleId + every attachment, so the edit updates all attributes using this rule; the value/options mapping is not run by validate_rule's dry-run — verify after a real export/build. scope selects the library: 'project' (default) or 'shared_template' (a template_read_only error means your access cannot write there). Returns {ruleId, scope, status, changed, reason, validation}; status 'updated' / 'no_changes' on success, or 'rejected' with the validation errors when invalid (HTTP 200, nothing written). SAVE-ONLY: the edit reaches a feed's output only after export_feed on the feeds that use this rule. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects).
| Name | Required | Description | Default |
|---|---|---|---|
| rule | Yes | ||
| scope | No | Which library the rule lives in: 'project' (default) = the project's own library; 'shared_template' = the reusable shared template library. | |
| rule_id | Yes | ||
| project_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only state readOnlyHint=false, idempotentHint=true, destructiveHint=false. The description adds substantial behavioral context: server-side preservation of bookkeeping fields, ruleId and attachments are kept, map_attribute_value objects must remain verbatim, validate_rule's dry-run does not execute value/options mapping, and updates only reach feed output after export_feed. It also discloses HTTP 200 behavior on rejected validation with nothing written.
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 every sentence carries necessary operational detail for a complex mutation with no output schema. It front-loads the core purpose and critical validation rule, then systematically covers identification, document structure, editable fields, return statuses, and post-update export requirements. There is 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?
Given the complex nested rule parameter, no output schema, and the nuanced relationship with validate_rule and export_feed, the description is complete. It covers required inputs, optional inputs, scoping, validation behavior, return contract, authentication-relevant scope errors, and downstream effects. An agent has enough information to call this tool correctly.
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 only 25% (only scope has a description). The description compensates fully: it explains rule_id identification, provides the complete nested rule document shape, clarifies scope values and the template_read_only failure mode, and explains project_id optionality with single-project inference versus project_id_required.
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 'Update an EXISTING product rule (Attribute Rule)', which states a specific verb, resource, and scope. It clearly differentiates from sibling tools like create_rule and delete_rule by emphasizing 'EXISTING' and describing the full update workflow.
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 prescribes the safe pattern: get_rule, edit the returned document, validate_rule, then update_rule. It also names where to get rule_id (list_rules / get_rule) and explains when scope selects 'project' vs 'shared_template'. It also addresses edge conditions like template_read_only errors and project_id_required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_ruleARead-onlyIdempotentInspect
Validate a product rule (Attribute Rule) WITHOUT saving it. ALWAYS call this before create_rule / update_rule and fix every error first. Pass the full rule document as rule — {name, description, category, icon, rules:[{sortId, enabled, type, conditions, operationGroups:[{mode, parentMode, attributes, operations: [{name, arguments:{key:value}}]}]}]} (see discover_rule_operations for the operation/condition/argument vocabulary). Returns {valid, errors:[{path, code, message}], warnings:[{path, code, message}], dryRun}. Errors are blocking — the rule will be rejected on save; warnings are advisory. If you also pass a sample_product (a flat {attributeCode:value} record, e.g. from preview_products) and the rule is structurally valid, the server dry-runs it and returns dryRun:{matchedRuleSortId, computedValue, usedAttributes} so you can confirm the output before saving. This tool NEVER writes. project_id is OPTIONAL (inferred for a single-project customer; project_id_required otherwise — then call list_projects). When you do NOT pass sample_product, the server auto-samples a real product to compute dryRun, so the computedValue is real data returned only after you set acknowledge_sensitive:true: the first such call (flag absent/false) returns {sensitiveGate:{confirmationRequired:true, itemCount, fields, kind}} with the computedValue EMPTY — present that gate to the USER, get their approval, then re-call with acknowledge_sensitive:true. (If you passed your own sample_product you already hold that data, so no gate applies and the computedValue is returned directly.) DRY-RUN LIMITATION: AI-group operations — notably map_attribute_value (value/options mapping) — are NOT executed by the dry-run. It returns valid:true with computedValue = the input UNCHANGED (passthrough) even when the mapping is correct; this is expected, not a bug, so do NOT treat the unchanged value as a failure. Verify a value/options mapping only AFTER a real build/export: feed → export_feed then verify_feed_attributes; marketplace/ad → repair_marketplace / run_marketplace_operation (or the ad equivalents) then get_*_report.
| Name | Required | Description | Default |
|---|---|---|---|
| rule | Yes | ||
| project_id | No | ||
| sample_product | No | A flat {attributeCode:value} record (e.g. from preview_products) to dry-run the rule against; when omitted the server auto-samples a real product. | |
| acknowledge_sensitive | No | Set true only AFTER the user approves seeing real data. Only relevant when the server auto-samples (no sample_product given): absent/false returns a sensitiveGate with computedValue empty; true returns it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly/idempotent/non-destructive, but the description adds critical behavior beyond them: the sensitive-data gate requiring user approval before real data is returned, the distinction between blocking errors and advisory warnings, the documented dry-run passthrough limitation for AI-group operations like map_attribute_value, and confirmation that the tool never writes. This is exactly the extra context annotations cannot convey.
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 front-loads the most important rule (validate before save) and the never-writes guarantee well. However, the mid-section around the sensitive gate and dry-run is a run-on that is hard to parse and repeats the sample_product/acknowledge_sensitive interaction already covered in the schema descriptions.
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 4-parameter tool with a nested required object, no output schema, and 50% schema coverage, the description covers the return shape ({valid, errors, warnings, dryRun} plus the sensitiveGate), the dry-run semantics, the sensitive-data flow, and the verification alternatives. Nothing an agent needs to call it correctly is missing.
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 50%, so the description must compensate. It does: it spells out the full nested rule document shape, clarifies project_id is OPTIONAL and when it becomes required (with the list_projects fallback), explains sample_product is a flat {attributeCode:value} record, and describes acknowledge_sensitive's exact effect. Only minor ambiguity remains about the rule object's inner properties.
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 and resource ('Validate a product rule (Attribute Rule) WITHOUT saving it') and explicitly positions the tool against siblings create_rule/update_rule, which it says never to call without validating first. An agent can distinguish it from get_rule, create_rule, and discover_rule_operations without opening any schema.
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 an explicit workflow rule ('ALWAYS call this before create_rule / update_rule and fix every error first') and routes the agent to discover_rule_operations for vocabulary and preview_products for sample data. It also specifies the post-build verification path via export_feed/verify_feed_attributes and the marketplace/ad repair tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_feed_attributesARead-onlyIdempotentInspect
File-level check of a feed's attribute mapping (reads the generated feed file). Inputs: feed_id (the feed's id from list_feeds / create_feed), project_id (OPTIONAL — inferred for a single-project customer; project_id_required if they have several, then call list_projects), sample_size (default 20, max 20), offset (default 0 — skip this many items to verify a deeper page of the feed; page by increasing offset in steps of sample_size). Returns deterministic findings against the generated feed file: missingSource (required attributes with no source in the config), emptyInOutput (required attributes empty in the sampled items), specViolations (values outside the channel's allowed set), plus the feed spec (required + allowedValues per attribute) and a sample of items {field: value}. After reading the deterministic findings, YOU do the semantic pass: over sample vs spec, judge whether open-ended values (titles, descriptions, urls, prices, categories) look correct/plausible for the channel, then summarise the problems and suggest concrete config fixes in the feed. status is ok | issues_found | file_missing (file_missing = the feed hasn't been generated yet). The sampled feed rows and violation values are real data returned only after you set acknowledge_sensitive:true. The first call (flag absent/false) returns {sensitiveGate:{confirmationRequired:true, itemCount, fields, kind}} with the sample rows / violation values EMPTY — present that gate to the USER, get their approval, then re-call with acknowledge_sensitive:true to receive the actual values. To fix findings: map_feed_attribute for each, then export_feed, then re-run this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| offset | No | Skip this many items to verify a deeper page of the feed; page by increasing offset in steps of sample_size (default 0). | |
| feed_id | Yes | ||
| project_id | No | ||
| sample_size | No | How many feed items to sample and verify (default 20, max 20). | |
| response_format | No | Verbosity of the result. 'full' (default) includes the sampled rows and the full spec; 'compact' asks for the findings + status only (omit sample and spec) to save context. | |
| acknowledge_sensitive | No | Set true only AFTER the user approves seeing real data. When absent/false the tool returns a sensitiveGate with empty sample rows / violation values; with true it returns the actual values. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnly, idempotent, non-destructive), so the description goes further and discloses the sensitive-data gate protocol — first call returns empty rows plus a sensitiveGate requiring user approval, second call with acknowledge_sensitive:true returns real values — as well as the meaning of each status value, including file_missing.
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?
Dense but well-ordered — literal inputs first, then return shape, then the agent's semantic duty, then the gate protocol, then the fix workflow. It is long, but nearly every sentence carries load-bearing information; only minor tightening is possible.
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?
With no output schema available, the description fully specifies the return contract: missingSource, emptyInOutput, specViolations, spec, sample, and status. Nothing required to call this tool correctly is missing.
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?
Adds substantial meaning beyond the 67% schema coverage: project_id's inference/error behavior, sample_size's default and hard cap of 20, offset's paging semantics ('step by sample_size'), and the two-phase acknowledge_sensitive contract. Only response_format is left to the schema, which documents it adequately.
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?
Opens with a precise verb+resource+scope: 'File-level check of a feed's attribute mapping (reads the generated feed file).' That single clause separates it from siblings like get_feed_status, get_feed_output, and validate_rule, which an agent otherwise might confuse it with.
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?
Explicitly states prerequisites (feed must be generated; project_id inferred for single-project customers, project_id_required otherwise with list_projects as the remedy) and gives the full remediation workflow: map_feed_attribute → export_feed → re-run this tool. It also instructs the agent on its own semantic-pass responsibility, which no sibling describes.
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.
2 tool updates
- Changed
delete_ai_source1 field changed- added
Input schema / properties / confirmAdded value: +{ + "type": "boolean" +}
- Changed
delete_api_source1 field changed- added
Input schema / properties / confirmAdded value: +{ + "type": "boolean" +}
105 tool updates
- First observed
ad_status - First observed
clone_ad - First observed
clone_marketplace - First observed
configure_ad_step - First observed
configure_marketplace_step - First observed
configure_order_connection - First observed
create_ad - First observed
create_feed - First observed
create_marketplace - First observed
create_order_connection - First observed
create_rule - First observed
delete_ad - First observed
delete_ai_source - First observed
delete_api_source - First observed
delete_feed - First observed
delete_marketplace - First observed
delete_rule - First observed
discover_rule_operations - First observed
enable_marketplace_order_sync - First observed
export_feed - First observed
get_ad - First observed
get_ad_attributes - First observed
get_ad_channel - First observed
get_ad_item_history - First observed
get_ad_item_report - First observed
get_ad_report - First observed
get_attribute_options - First observed
get_category_mapping - First observed
get_feed - First observed
get_feed_output - First observed
get_feed_status - First observed
get_import_status - First observed
get_marketplace - First observed
get_marketplace_attributes - First observed
get_marketplace_channel - First observed
get_marketplace_item_history - First observed
get_marketplace_item_report - First observed
get_marketplace_report - First observed
get_order_connection - First observed
get_order_overview - First observed
get_project_profile - First observed
get_rule - First observed
get_value_mapping_inputs - First observed
koongo_knowledge - First observed
list_ad_channels - First observed
list_ad_items - First observed
list_ads - First observed
list_ai_sources - First observed
list_api_sources - First observed
list_feed_templates - First observed
list_feeds - First observed
list_marketplace_channels - First observed
list_marketplace_items - First observed
list_marketplaces - First observed
list_order_channels - First observed
list_orders - First observed
list_projects - First observed
list_rules - First observed
list_source_attributes - First observed
list_store_categories - First observed
list_unmapped_categories - First observed
map_ad_attribute - First observed
map_feed_attribute - First observed
map_marketplace_attribute - First observed
marketplace_status - First observed
pause_ad - First observed
pause_feed - First observed
pause_marketplace - First observed
preview_products - First observed
refresh_ad_category_attributes - First observed
refresh_marketplace_category_attributes - First observed
repair_ad - First observed
repair_marketplace - First observed
report_mcp_issue - First observed
restore_feed - First observed
resume_ad - First observed
resume_feed - First observed
resume_marketplace - First observed
run_ad_item_action - First observed
run_ad_operation - First observed
run_import - First observed
run_marketplace_item_action - First observed
run_marketplace_operation - First observed
search_target_categories - First observed
set_ad_name - First observed
set_ad_product_mode - First observed
set_ai_source - First observed
set_api_source - First observed
set_category_mapping - First observed
set_feed_attribute_filter - First observed
set_feed_filter - First observed
set_feed_settings - First observed
set_marketplace_name - First observed
set_marketplace_order_mode - First observed
set_marketplace_product_mode - First observed
submit_feed - First observed
sync_marketplace_orders - First observed
sync_project_orders - First observed
test_ad_connection - First observed
test_marketplace_connection - First observed
test_order_connection - First observed
update_feed - First observed
update_rule - First observed
validate_rule - First observed
verify_feed_attributes
Related MCP Connectors
Run storefronts, listings, orders, content, fulfillment, and analytics through AI.
Manage your Jumpseller store with AI. Products, orders, customers, and more.
Run an eBay seller account from your AI assistant: orders, listings, stock, fees and payouts.
- skulayerOAuthcom.skulayer
Preview-first feed optimization for retailers and agencies: audit, fix and serve product feeds.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceConnects AI assistants to Wildberries and Ozon seller accounts for real-time access to sales, stocks, prices, finances, and reviews through official APIs.MIT
- AlicenseAqualityDmaintenanceEnables AI assistants to search products and generate affiliate links across European and global affiliate networks, automating product discovery and link creation for monetization.25MIT
- FlicenseAqualityDmaintenanceEnables AI assistants to browse Admitad affiliate programs, discover product feeds, and search products directly from chat.82-
- FlicenseNot gradedqualityCmaintenanceEnables AI to view and manage e-commerce data such as products, orders, and coupons, and perform actions like updating prices, stock, and generating sales reports.-
Glama MCP Gateway
Add one secure layer between your agents and this server.