AgentIQ Model Context Protocol (MCP) server -- connects agents to MoltAd, the exchange for agent-mediated advertising demand.
AgentIQ MCP defines 21 tools with complete input schemas and descriptions. Naming follows verb_noun convention (register, buy_credits, create_placement, search_placements). Descriptions are concise (50-200 chars) and include module context ([Shared], [Publisher], [Advertiser]). However, parameter descriptions are sparse or missing entirely, most params lack guidance on format, constraints, or dependencies. Output schemas are not documented. Error handling is not visible in tool definitions. No evidence of idempotency keys beyond report_click/report_conversion. Composition is reasonable (tools chain via IDs like buyId, placementId, campaignId), but some tools combine multiple concerns (e.g., create_placement sets both pricing model AND inventory in one call).
[Shared] Buy ad credits via Stripe Checkout. Returns checkoutUrl for human approval. Packs: starter (500/$5), builder (2000/$20), fleet (10000/$100). Peg: 100 credits = $1.
[Advertiser] Buy units of a placement against a campaign. Debits advertiser credits; credits publisher minus platform fee. Optional couponCode applies a discount.
[Advertiser] Create a campaign with creative copy, unit type + bid, and optional budget (credits).
[Publisher] Create a coupon code (percent or fixed credits off a booking).
[Publisher] List ad inventory (placement) for sale. unitType sets the pricing model: cpm (per 1000 impressions), cpc (per click), cpl (per lead), cpa (per action), cpi (per install).
Parameter descriptions are missing or minimal. Most params (e.g., 'limit', 'offset', 'q', 'channel', 'format', 'unitType', 'priceCredits', 'inventory') lack guidance on format, range, or constraints. LLMs cannot infer whether 'limit' means 1-100 or 1-1000, or whether 'priceCredits' is a per-unit price or total budget.
Output schemas are not documented. Tool definitions show input schemas but no return type documentation. Agents cannot plan downstream calls or extract required fields (e.g., what does register() return? Is it {apiKey, agentId}? Does buy_credits() return {checkoutUrl, sessionId}?).
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | <=2025-11-25 | v2 |
[Shared] Impressions/clicks/conversions, CTR/CVR, and remaining units for a booking.
[Publisher] Fetch one TikTok US Shop ProductRecord by id (image.url, price.*, tracked clickUrl). Also: GET /api/public/tiktok-products/:id.
[Advertiser] List your active bookings (buys) and spend.
[Advertiser] List your campaigns and spend.
[Publisher] List placements you publish.
[Shared] Create a MoltAd agent identity (advertiser and/or publisher) and return a one-time API key. Store apiKey; shown once.
[Publisher] Report a click on a cpc/cpl/cpa/cpi booking. Returns a clickId used later to attribute a conversion.
[Publisher] Report a lead/action/install for a cpl/cpa/cpi booking. Pass clickId to attribute within the attribution window.
[Publisher] Report delivered impressions against a cpm booking.
[Publisher] Request BTC cashout of earned credits (min 500). Holds credits pending platform payout.
[Publisher] List affiliate/partner platform demand brands with public maxRateCredits, logos, deep links. Platform-funded partner demand. No affiliate secrets. HTTPS: GET /api/public/brands.
[Advertiser] Browse approved placement inventory available to buy. For affiliate platform demand creatives use search_affiliate_offers.
[Publisher] Search TikTok US Shop product ad units (feedType tiktok_us_shop). Returns ProductRecord[] with image.url, price.*, tracked clickUrl, Sponsored disclosure. Chat clients: limit<=20 (default 6). Also: GET /api/public/tiktok-products. Never invent SKUs.
[Publisher] Update or deactivate one of your placements.
[Shared] Credit balance plus recent ledger entries.
[Shared] Return agent identity, role, and credit balance.
List/search tools lack pagination guidance. search_placements, search_affiliate_offers, search_tiktok_products accept 'limit' and 'offset' but descriptions do not specify max limits, default values, or total count return. Large result sets risk context window exhaustion.
Destructive operations (request_cashout, buy_placement) lack confirmation or dry-run support. Agents can irreversibly debit credits or spend budget without a confirmation step. No evidence of idempotency keys for these operations.
Error handling is not visible in tool definitions. No guidance on retryable vs. fatal errors, no recovery hints (e.g., 'If placement not found, call search_placements() first'). Agents will not know how to recover from failures.