tools/list is authoritative for the active account. Enrollment, account
kind, permissions, feature rollout, and host support can narrow the catalog.
This page explains the complete registered families and intended use.Navigation and shared tools
Open Media Buys
open_media_buys_page opens the Seller Media Buys Page. It accepts an optional
positive-integer-string accountRelationshipId and optional view of
media_buys or creatives. With no relationship ID, it opens the Seller’s
unfiltered Media Buys Page.
When a relationship ID is supplied, the tool first proves that the relationship
belongs to the authenticated Seller Account. An unknown or another seller’s
relationship fails closed: it returns no Page directive and opens nothing. The
Page then shows only that buyer relationship’s activity with the Seller — its
media buys and synced creatives — never the buyer’s own campaigns.
Every search call must provide query, kind, or both. An empty call is
invalid. Use query for a match term or documentation question and kind to
list account objects. For example, a Seller asking what it currently offers
uses:
sourceId to narrow that list to one ad-server-backed source, or
filter.productStatus to select draft, active, or archived products.
For Buyer seller reads, filter.ids accepts up to 50 exact Storefront ids in
one call, preserves requested order, and reports unavailable ids as
objects.missingIds.
To read wholesale products from one of those Sellers, call get with
kind: "seller", that exact Seller id, the current account’s
advertiserId, and include: ["products"]. Preserve the returned
productQueryId and catalog revision when polling the same request to a
terminal result; do not reuse a Product from an older catalog.
Buyer search(kind:"seller") also accepts these filter fields to narrow results:
seller and connection are intentionally separate buyer nouns. A seller is
one exact Storefront commercial counterparty and can exist before authorization.
A connection is one authorization grant to that seller, joined by sellerId.
One seller can have zero, one, or multiple connections, and each connection can
contain multiple discovered provider accounts. Use search(kind:"connection")
for questions such as “who am I connected to?” and join the returned sellerId
to the seller catalog when names or marketplace policy are needed.
A get(kind:"seller") call for a single seller also returns
connectionState.directedCampaignSubscription when an active directed campaign
subscription exists between the buyer and that seller. The field is absent on
search results and null when no subscription exists.
Internal Marketplace administration
Directly authenticated Scope3 SuperAdmins may also receive two internal tools:
These tools are omitted from every non-SuperAdmin catalog and re-check staff
authorization at execution. Apply performs a whole-batch stale-state preflight,
then commits each Storefront independently. Its response labels this behavior
BEST_EFFORT_WITH_BATCH_PREFLIGHT; callers must inspect every item before
retrying failures.
Plan and billing
save_billing is the model-visible shared settings tool. It accepts exactly one
intent per call: terms or paymentAuthority. Terms acceptance requires the
current version shown in Plan & Billing or the required-terms response, plus
direct organization-admin authority:
action: "terms_not_required" with
terms.accepted: false and terms.governedByExistingContract: true so the
agent does not report a legal acceptance that did not occur.
Card setup keeps all card data outside MCP. Call paymentAuthority with
action: "request", then repeat with action: "confirm" and the returned
confirmationToken. The confirm response has
action: "human_action_required" and a one-time
paymentAuthority.url for the organization’s cardholder. Poll with
action: "status" every 15–30 seconds until the nested status is verified
or expired. The only supported method today is capture_link; branch on the
returned method so future methods remain additive.
Legal acceptance and payout changes remain authorization-sensitive. The three
other tools in this table are private Plan & Billing Page capabilities and may
be omitted from model context. Follow the tool response and Page requirements;
never pass card or bank details through free text.
Buyer tools
Buyer
search and get kinds include the account’s advertisers, campaigns,
creatives, creative collections, proposals, media buys, sellers, asks, and
organization-owned Agents, plus other kinds advertised by the live schema. Follow the
Buyer workflows page for sequencing.
Replay an uncertain advertiser create
When creating an advertiser, you may supply anidempotencyKey of 16–255
letters, numbers, underscores, periods, colons, or hyphens. Use one key for one
logical create and reuse that exact key with the unchanged create payload if the
response is lost or uncertain. The replay returns the originally created
advertiser; changing the payload with the same key returns a conflict. The key
is create-only and optional, so a create without it retains ordinary create
behavior. Keep correlationId unique for each transport attempt: it is a
diagnostic handle, not the replay key.
Create and verify a campaign creative
Callsave_creative with a campaignId, name, and optional assets to add a
creative directly to a campaign. Each asset supplies exactly one public url
or base64 dataUrl, plus its assetType. The direct tool accepts image, video,
audio, HTML, VAST XML, and text media; ZIP bundles continue through the inspected
HTML5 upload flow. Add clickUrl
when the creative has a click-through destination. makePrimary is available
for image, video, audio, HTML, and VAST assets; text can be attached only as a
subsidiary asset.
After the campaign executes, call get with kind: "creative", sourceId set
to the campaign ID, and id set to the returned creative ID. When a legacy
Sales Agent library receives the creative through sync_creatives,
platformLinks rows show the
downstream ad-platform sync status, platform ID, approval status, and last sync
time. Inline package delivery does not create a platformLinks row. Each agent
has one authoritative row: the most recently updated account lineage wins
after a credential or account rotation. A platform ID confirms that the
destination created its creative object; the status and approval fields still
determine whether it is ready to deliver. Existing metadata-only
save_creative calls require no changes.
Start with get_status. Its operatorIdentity.usableForBuying field is false
when the operator is missing or still uses a platform-owned legacy fallback.
In that state, an account administrator must call save_buyer_operator with
the buyer’s real non-platform domain and choose whole_operator or a stable
specific_unit before new discovery or buying work. When the domain is usable,
scopeStatus is unclassified, and locked is false, reuse that domain and
choose its scope before new AdCP 3.2 provisioning. If the identity is locked,
follow the support action from get_status instead. This confirms the
commercial operator identity used with sellers; it does not add users, change
account membership, or change the login organization.
Launch a campaign with explicit confirmation
Launching withsave_campaign is a two-call operation. First request a
preview without changing the campaign:
action: "pending_confirmation" with campaign.revision and a
summary of the budget, flight, and staged media buys. It does not launch the
campaign. Do not combine this preview with campaign field changes; save those
changes in a separate call before requesting the preview.
After reviewing the preview, send that campaign.revision as
expectedRevision with explicit confirmation:
confirmLaunch: true requires the expectedRevision returned by the preview.
The server checks that revision again while holding the campaign mutation lock,
before any provider dispatch. If the campaign changed after the preview, the
call returns REVISION_CONFLICT; re-read the campaign, request a new preview,
and confirm that new revision instead of reusing the earlier confirmation.
Advertiser and campaign tracking
Tracking is a typed field on the existingadvertiser and campaign nouns;
it is not a separate V3 noun or tool family. V3 uses the same tracking services
as the V2 REST compatibility surface.
Set advertiser defaults with save_advertiser. This HappyDemics example keeps
the raw vendor tag, identifies its documented dialect, and lets the server
compile it to AdCP universal macros:
tracking.trackers[] returns a stable trackerId, the
retained rawUrl, the translated canonicalUrl, and the auditable mapping
metadata. In the example, documented HappyDemics tokens canonicalize as
{{USER_ID}} → {DEVICE_ID} and {{GDPR_CONSENT_STRING}} →
{GDPR_CONSENT}. Other double-brace spellings are not inferred without their
own vendor evidence.
V3 returns bounded mapping, diagnostic, and documentation summaries with their
total counts; the V2 tracking-config response retains the complete stored
mapping artifact for non-model audit clients. Long URL values use bounded
previews with their original length and a truncation flag, and effective
campaign entries do not duplicate the source tracker’s mapping artifact. When
updating an existing tracker, send its trackerId and omit url to preserve
the complete stored URL; a returned truncated preview is also recognized and
will not overwrite that stored value. Send the returned advertiser revision
or campaign campaignRevision as tracking.expectedRevision to make any
tracking update an atomic compare-and-set; URL-preserving updates add that
guard automatically.
Tracker URLs are limited to 8,192 characters and 64 macro tokens. For a custom
event, set trackerType to custom and supply customEventName; that field is
invalid for impression or click trackers. Stored free-form tracking values
returned by V3 are bounded and fenced as untrusted external data. Tracker
labels, custom event names, and custom-macro descriptions can be passed back
unchanged on an update; the server restores their exact stored values. New or
changed custom-macro descriptions are limited to 240 characters.
Before saving or trafficking a tracker, call test_creative_macros. The tool
does not fetch the URL or change a creative. Standard request auditing retains
only statuses and counts, never tracker URLs or binding values. The tool
returns four independently
copyable stages—exact raw input, canonical AdCP form, recipient form, and final
synthetic substitution—plus mapping evidence, bindings, and diagnostics.
{{USER_ID}} → {DEVICE_ID} →
%%ADVERTISING_IDENTIFIER_PLAIN%%, while the final stage uses a visibly
synthetic advertising identifier.
For consent syntax inspection, gvlVendorId can show the corresponding GAM
${GDPR_CONSENT_<id>} form, but a caller-supplied number is not verification:
the report remains failed and not preview-ready. Without the number, the
consent parameter is removed and the report also fails closed. A production
consent mapping needs separate evidence that the ID belongs to the measurement
vendor; the tester never infers that relationship from a pixel URL.
Available scenarios are device_id_present, device_id_unavailable,
gdpr_applies_with_consent, gdpr_does_not_apply, and
missing_required_value. The unavailable-device scenario deliberately shows
an empty device value and labels it privacy_suppressed. Change scenarioKey
to obtain a different deterministic cachebuster. Explicit values must be raw
synthetic test values, never real user identifiers and never pre-encoded; a
value that already contains percent-encoded octets is flagged as possible
double encoding. Binding values and stage templates in the report are bounded
by UTF-8 bytes, and projection reports any truncation or omitted detail. The
whole Murph result stays within a 96 KiB budget. Inspect the substituted stage
for placement and encoding. Explicitly required macros that are absent, missing
required values, unknown or wrong-case tokens, ambiguous vendor syntax, unsafe
nesting, and missing recipient mappings keep passed and readyForPreview
false.
Campaigns inherit advertiser trackers dynamically. Add a campaign-local
tracker or disable one inherited default with save_campaign:
include: ["tracking"] when reading a campaign. Its tracking field
contains the local trackers, inherited overrides, and effectiveTrackers
with sourceScope, inherited, effectiveEnabled, and statusReason.
Within tracking, each supplied array is the complete desired array for that
scope; omit an array to leave that part unchanged.
Seller tools
Seller
search and get kinds include the Seller singleton, inventory sources,
material, RFPs and RFP turns, library requests, coverage, wholesale products, playbook, business rules, media buys,
work items, signals, asks, organization-owned Agents, and other kinds advertised by the live schema. Follow the
Seller workflows page for sequencing.
search({"kind":"library_request"}) and
get({"kind":"library_request","id":"LIBRARY_REQUEST_ID"}) are gated by
the sales-library rollout. Search accepts filter.status (open or
closed) and filter.originRfpTurnId; get returns the request’s gap, status,
origin turn, and closing Material evidence.
Organization-owned Agents
search({"kind":"agent"}) lists the software Agents the active account’s
organization owns. Add query to match an Agent ID, Agent display name, or
operator display name. This explicit-only kind does not appear in unrelated
broad object searches and does not turn a buyer counterparty Storefront into an
Agent.
Read one result with get({"kind":"agent","id":"AGENT_ID"}). Add
include:["certification"] for the complete customer-safe certification
summary, include:["validationRuns"] for up to five server-bound run summaries,
or include:["diagnostics"] for observed implementation health and the current
production-revision label. A returned run’s diagnosticRead shows the exact
follow-up: pass its validationRunId with include:["diagnostics"] to receive
the bounded Activity graph. Sales Agent detail also names its immutable
versioned public validationSkill. These reads intentionally omit
credentials, private evidence, operator identifiers, relationship identities,
and owner-only action URLs.
Interactive seller Pages that run inside a host use the account-resolved v3
surface for these reads and writes. In Scope3’s hosted bridge, the nested
/mcp/:toolName proxy accepts surface: "v3" and forwards the call to
/mcp/v3; callers still use the tool’s canonical arguments, not REST paths.
The Seller RFP lifecycle guide defines the
save_rfp action union, polling states, complete response requirements, and
clarification/failure behavior.
The RFP performance guide defines aggregate
metric formulas, valid dimensions, disclosure thresholds, and immutable
pagination. Individual RFP facts remain on get({ kind: "rfp" }).
Material is evidence and teaching input. It does not replace inventory sources,
products, pricing, Playbook instructions, business rules, signals, formats, or
Seller identity. Use
get({ "kind": "material", "id": "MATERIAL_ID" }) to inspect the current
source revision, ingestion state, diagnostics, typed candidates, confirmation
receipts, bounded rendition summaries, and source artifact references. Explicit
includes expose independently paginated rendition blocks, reusable visual
assets, extraction diagnostics, composition receipts, and expiring source
access; originals and derived binaries are never embedded in the response.
Confirm a candidate by
calling the exact proposedMutation.tool with its arguments: only
Material-owned selling points and stories use save_material; every other
candidate uses the save tool named in the suggestion. Review, reject, and
correct do not change Seller configuration. Source records may carry supplied original and
derived structure references such as page or slide order, geometry,
table/image/chart assets, OCR/caption artifacts, digests, provenance,
confidentiality, and reuse rights. Completeness is reported per extraction
facet, and unsupported or degraded parsing is never presented as ready. See
Seller workflows for upload finalization,
selection, retention, and access behavior.
MCP App and resource-bound tools
These tools support interactive Pages or resources. A compliant host may keep some of them out of model context and invoke them only through the associated app contract. The Product Marketing Page receives a session-bound capability fromopen_page. It uses the host-only teach_search_materials,
teach_get_material, teach_save_material, and teach_renew_capability
aliases for Material listing and exact reads, seller-private URL and file
additions, upload finalization, Material-owned candidate decisions, and
capability renewal. MCP clients continue to use the public search, get, and
save_material tools. The bridge does not permit generic Material writes or
return source-access or visual-preview URLs. Expiring upload credentials are
returned only for the transient browser PUT step.
These tools are app-only and are not part of the model-visible buyer catalog.
Current Sellers Page bundles use public V3
search, get, save_connection,
and save_ask; the two closed Sellers Page facades remain only for a rolling
deploy window. Current Campaigns bundles instead use the resource-bound
app-only buyer_campaigns_page_search and buyer_campaigns_page_get tools,
backed by canonical V3 projections; Advertisers uses its closed
landing-projection read. None of these Pages receives the generic api_call
surface.
The Branding & distribution tools above are also app-only — they back
the Branding & distribution Page (see Seller Pages)
and are not part of the model-visible seller tool catalog either. The printable
listing download produces a PDF only; print fulfillment and provider
orders remain outside this tool.
Core read examples
List objects:proposals, recentActivity, deliverySummary, and sourceIdentity
are accepted include names so the API can return a precise
unavailableIncludes explanation, but they are not populated in the preview.
Search documentation:
document path:
Read structured results
Every tool returns MCPcontent for a person or model to read. Integrations
should make decisions from structuredContent. tools/list is authoritative
for inputs and publishes an output schema where the current tool declares one;
the patterns below cover the remaining preview tools.
Do not parse IDs, revisions, actions, or recovery guidance out of rendered
prose. A write may return
action: "unchanged"; that is a successful
idempotent outcome. On partial work, preserve partialWrite, warnings,
errors, per-seller or per-source outcomes, and any returned current revision.
request_proposals.status is normally running while durable background work
contacts the cohort; retry that same key until it becomes complete,
partial, or failed. A buyer can have only one running proposal execution
across campaigns. Terminal result cursors can continue a product-heavy outcome
for the same seller, and detailsTruncated marks byte-bounded product fields.
When a seller cannot execute an exact age range, its proposal remains available
as a counter-pitch and its semantic document names the limitation and the
seller’s supported ranges. A direct get_products response carries the same
information in its additive limitations array: code, buyer-readable
message, requested min/max/include_unknown, and supported_ranges.
For example, a successful advertiser creation returns the new identity under
the noun rather than as an unlabelled string:
request_proposals returns enough state to continue each seller branch:
page.nextCursor before treating the review as complete.
Errors and result handling
Tool errors use bounded structured codes and explanatory text. Common classes include validation errors, access denial, not found, revision conflict, unsupported preview behavior, external failure, and partial results.- Treat
isError: trueas a failed tool result even when the MCP transport itself returned successfully. - Preserve structured IDs and recovery fields; do not parse prose to recover an
identifier already present in
structuredContent. - A partial result is not an empty result. Read its warnings, coverage, and per-source or per-seller outcomes.
- Re-read after any response that reports a partial write.