{"surface":"operator","title":"Network operator MCP","description":"Manage hosted offers, advertisers, publisher access, conversion reviews, and network reports.","endpoint":"https:\/\/lp.thriftler.com\/mcp\/network","transport":"streamable-http","authentication":{"type":"bearer","instructions":"In Settings > API Tokens > Connect an agent, choose Network operator. Use a team token for a team with the network plan feature.","abilities":{"netops:read":"Connect and read hosted offers, advertisers, publishers, held conversions, and network reports.","netops:write":"Create and update network records, import offers, generate guidelines, attach creatives, and retrieve advertiser handouts.","netops:money":"Release or reject held conversions. Preview the change first, then execute with confirm: true."}},"tools":[{"name":"apply_network_operations","title":"Apply Network Operations Tool","description":"Apply a batch of network-inventory operations atomically (all-or-nothing). Ops: create_advertiser, create_hosted_offer, update_hosted_offer, set_guidelines, attach_creatives, grant_access. A create op may carry `as` to alias its result for a later op (`advertiser_ref`\/`hosted_offer_ref`); create_hosted_offer may carry `template_hosted_offer_id` to clone an existing offer's structure (never its status, is_listed, or description\/vertical\/guidelines unless `inherit_copy: true`) with the op's own fields as overrides; blank copy is generated from destination_url after the batch commits. Returns per-op results or the failing op index.","inputSchema":{"properties":{"operations":{"description":"Ordered list of network operations; each item is an object with an `op` key plus that op's parameters.","items":{"type":"object"},"type":"array"}},"type":"object","required":["operations"]},"annotations":{}},{"name":"attach_creatives","title":"Attach Creatives Tool","description":"Attach one or more team-owned creatives to a hosted offer, appending to its existing creative sort order.","inputSchema":{"properties":{"hosted_offer_id":{"description":"The hosted offer to attach creatives to.","type":"integer"},"creative_ids":{"description":"Creative ids to attach (team-owned only).","type":"array"}},"type":"object","required":["hosted_offer_id","creative_ids"]},"annotations":{}},{"name":"create_advertiser","title":"Create Advertiser Tool","description":"Create an advertiser. Returns its id, postback_token (returned only here \u2014 store it), and the absolute \/api\/npb\/{slug} postback URL.","inputSchema":{"properties":{"name":{"description":"Advertiser display name.","type":"string"},"contact_name":{"description":"Optional contact name.","type":"string"},"contact_email":{"description":"Optional contact email.","type":"string"},"credit_limit_cents":{"description":"Optional credit limit in cents.","type":"integer"}},"type":"object","required":["name"]},"annotations":{}},{"name":"create_hosted_offer","title":"Create Hosted Offer Tool","description":"Create a hosted offer (network inventory). Defaults to Draft status. Requires a demand_type-matching ref: lead_buyers needs funnel_id, upstream needs source_offer_id, advertiser_postback needs advertiser_id (or advertiser_ref from an earlier batch op) plus destination_url. Pass template_hosted_offer_id to clone an existing offer's structure (demand config, payout, caps, targeting, schedule) and override only the fields you send. A clone is always draft and unlisted unless you send status \/ is_listed, and it does not copy the template's description, vertical or guidelines unless you send inherit_copy: true. Description, vertical and guidelines left blank are generated from destination_url in the background.","inputSchema":{"properties":{"name":{"description":"Offer display name.","type":"string"},"demand_type":{"description":"lead_buyers | upstream | advertiser_postback. Required unless template_hosted_offer_id is given.","type":"string"},"template_hosted_offer_id":{"description":"Existing hosted offer to clone as the starting structure (demand config, advertiser, payout, caps, targeting, schedule, traffic flags). Never copied: status (defaults to draft), is_listed (defaults to false), and description\/vertical\/guidelines unless inherit_copy is true. Any other field you pass overrides the copied value.","type":"integer"},"inherit_copy":{"description":"With template_hosted_offer_id: also copy the template's description, vertical and guidelines. Leave false when the clone is about a different topic; blank copy is generated from destination_url.","type":"boolean"},"description":{"description":"Optional offer description.","type":"string"},"vertical":{"description":"Optional vertical label.","type":"string"},"geo_allowed":{"description":"Optional list of allowed geo codes.","type":"array"},"funnel_id":{"description":"Required when demand_type is lead_buyers.","type":"integer"},"source_offer_id":{"description":"Required when demand_type is upstream.","type":"integer"},"advertiser_id":{"description":"Required when demand_type is advertiser_postback (or use advertiser_ref).","type":"integer"},"advertiser_ref":{"description":"Batch alias of an advertiser created earlier in the same apply_network_operations call.","type":"string"},"destination_url":{"description":"Required when demand_type is advertiser_postback.","type":"string"},"payout_type":{"description":"cpl | cpa | revshare_percent","type":"string"},"payout_amount":{"description":"Flat payout amount (for cpl\/cpa).","type":"number"},"payout_percent":{"description":"Payout percent 0-100 (for revshare_percent).","type":"number"},"event_payouts":{"description":"Optional per-event payout config.","type":"object"},"guidelines":{"description":"Optional compliance guidelines payload.","type":"object"},"daily_conversion_cap":{"description":"Optional daily conversion cap.","type":"integer"},"weekly_conversion_cap":{"description":"Optional weekly conversion cap.","type":"integer"},"monthly_conversion_cap":{"description":"Optional monthly conversion cap.","type":"integer"},"daily_click_cap":{"description":"Optional daily click cap.","type":"integer"},"monthly_click_cap":{"description":"Optional monthly click cap.","type":"integer"},"schedule_mode":{"description":"off | hard | soft","type":"string"},"schedule":{"description":"Optional schedule config.","type":"object"},"requires_approval":{"description":"Whether publisher access requires manual approval.","type":"boolean"},"is_listed":{"description":"Whether the offer is listed for publishers to discover.","type":"boolean"},"auto_approve_conversions":{"description":"Whether conversions auto-approve.","type":"boolean"},"status":{"description":"draft | active | paused | archived \u2014 defaults to draft.","type":"string"},"fail_traffic_url":{"description":"Optional fail-traffic redirect URL.","type":"string"}},"type":"object","required":["name"]},"annotations":{}},{"name":"generate_offer_guidelines","title":"Generate Offer Guidelines Tool","description":"Generate publisher compliance guidelines (banned claims, required disclosures, allowed\/blocked traffic as canonical tokens) for a hosted offer from raw content, a URL, or an existing hosted offer. Mirrors the network's house style from an existing offer's guidelines automatically (override with style_hosted_offer_id). Optionally persist onto the hosted offer with write:true.","inputSchema":{"properties":{"hosted_offer_id":{"description":"Existing hosted offer to source content from and\/or persist guidelines onto.","type":"integer"},"url":{"description":"An advertiser offer\/landing page URL to fetch source content from.","type":"string"},"content":{"description":"Raw source content (offer description, landing page copy, etc.) to generate guidelines from.","type":"string"},"write":{"description":"When true and hosted_offer_id is present, persist the generated guidelines onto the hosted offer. Default false.","type":"boolean"},"style_hosted_offer_id":{"description":"Existing hosted offer whose guidelines act as the house-style reference (standing traffic policy, boilerplate disclosures, notes structure). Defaults to the team's most recently updated offer that has guidelines.","type":"integer"}},"type":"object"},"annotations":{}},{"name":"get_advertiser_handout","title":"Get Advertiser Handout Tool","description":"Return the ready-to-send advertiser postback handout (markdown) for one advertiser, with the network slug and the advertiser postback token filled in.","inputSchema":{"properties":{"advertiser_id":{"description":"The advertiser to render the handout for.","type":"integer"}},"type":"object","required":["advertiser_id"]},"annotations":{}},{"name":"get_hosted_offer","title":"Get Hosted Offer Tool","description":"Get one hosted offer's full detail (demand config, caps, schedule, guidelines, targeting) by id.","inputSchema":{"properties":{"hosted_offer_id":{"description":"The id of the hosted offer to fetch.","type":"integer"}},"type":"object","required":["hosted_offer_id"]},"annotations":{}},{"name":"get_publisher","title":"Get Publisher Tool","description":"Get one publisher's detail, including traffic-quality rollups (recent daily snapshots + a summary average), by id.","inputSchema":{"properties":{"publisher_id":{"description":"The id of the publisher to fetch.","type":"integer"}},"type":"object","required":["publisher_id"]},"annotations":{}},{"name":"import_offer_from_url","title":"Import Offer From Url Tool","description":"Fetch an advertiser offer URL and LLM-parse it into a structured summary (name, description, vertical, geo\/payout hints, claims found, excerpt). Optionally create a consumer Offer under a team network account for upstream wrapping.","inputSchema":{"properties":{"url":{"description":"The advertiser offer\/landing page URL to import.","type":"string"},"create_consumer_offer":{"description":"Also create a consumer Offer (upstream wrapping).","type":"boolean"},"network_account_id":{"description":"Team NetworkAccount to attach the consumer Offer to (required when create_consumer_offer is true).","type":"integer"}},"type":"object","required":["url"]},"annotations":{}},{"name":"list_advertisers","title":"List Advertisers Tool","description":"List the current team's advertisers (id, name, contacts, credit standing, hosted-offer count) so intake can reference an advertiser_id. Never includes the postback token \u2014 use get_advertiser_handout for that.","inputSchema":{"properties":{"is_active":{"description":"Optional filter: true = active advertisers only, false = inactive only.","type":"boolean"}},"type":"object"},"annotations":{}},{"name":"list_held_conversions","title":"List Held Conversions Tool","description":"List the current team Held conversions (the fraud\/cap review queue) with fraud signals, revenue, and payout. Optionally filter by publisher or offer.","inputSchema":{"properties":{"publisher_id":{"description":"Optional publisher filter.","type":"integer"},"hosted_offer_id":{"description":"Optional hosted offer filter.","type":"integer"},"limit":{"description":"Max rows to return (default 50, max 200).","type":"integer"}},"type":"object"},"annotations":{}},{"name":"list_hosted_offers","title":"List Hosted Offers Tool","description":"List the current team's hosted offers (id, name, status, vertical, demand type, payout terms). Optionally filter by status or vertical.","inputSchema":{"properties":{"status":{"description":"Optional status filter: draft, active, paused, or archived.","type":"string"},"vertical":{"description":"Optional vertical filter (exact match).","type":"string"}},"type":"object"},"annotations":{}},{"name":"list_publishers","title":"List Publishers Tool","description":"List the current team's publishers (id, name, company, status, payout method). Optionally filter by status.","inputSchema":{"properties":{"status":{"description":"Optional status filter: invited, active, or paused.","type":"string"}},"type":"object"},"annotations":{}},{"name":"network_report","title":"Network Report Tool","description":"Run a group-by breakdown + window totals over the team's network (publisher, hosted_offer, advertiser, sub1, or geo dimension) for a date range, mirroring the Network Reports page.","inputSchema":{"properties":{"from":{"description":"Start date (Y-m-d).","type":"string"},"to":{"description":"End date (Y-m-d), inclusive.","type":"string"},"dimension":{"description":"Group-by dimension: publisher (default), hosted_offer, advertiser, sub1, or geo.","type":"string"},"publisher_id":{"description":"Optional publisher filter.","type":"integer"},"hosted_offer_id":{"description":"Optional hosted offer filter.","type":"integer"},"advertiser_id":{"description":"Optional advertiser filter.","type":"integer"},"sub1":{"description":"Optional sub1 filter.","type":"string"},"geo":{"description":"Optional geo\/country filter.","type":"string"},"status":{"description":"Optional conversion status filter (pending, approved, held, rejected, reversed).","items":{"type":"string"},"type":"array"}},"type":"object","required":["from","to"]},"annotations":{}},{"name":"reject_held_conversion","title":"Reject Held Conversion Tool","description":"Reject a Held conversion as fraud (terminal). Without confirm:true, returns a preview only. With confirm:true, requires the netops:money ability and executes.","inputSchema":{"properties":{"conversion_id":{"description":"The Held conversion to reject.","type":"integer"},"reason":{"description":"Rejection reason (fraud), max 120 chars.","type":"string"},"confirm":{"description":"Set true to execute; omit\/false to preview only.","type":"boolean"}},"type":"object","required":["conversion_id","reason"]},"annotations":{}},{"name":"release_held_conversion","title":"Release Held Conversion Tool","description":"Release a Held conversion to Approved. Without confirm:true, returns a preview only. With confirm:true, requires the netops:money ability and executes.","inputSchema":{"properties":{"conversion_id":{"description":"The Held conversion to release.","type":"integer"},"confirm":{"description":"Set true to execute; omit\/false to preview only.","type":"boolean"}},"type":"object","required":["conversion_id"]},"annotations":{}},{"name":"set_offer_availability","title":"Set Offer Availability Tool","description":"Set a hosted offer available (Active) or unavailable (Paused). Rejects Archived offers (terminal state, not a runtime toggle).","inputSchema":{"properties":{"hosted_offer_id":{"description":"The hosted offer to toggle.","type":"integer"},"available":{"description":"true = Active, false = Paused.","type":"boolean"}},"type":"object","required":["hosted_offer_id","available"]},"annotations":{}},{"name":"update_hosted_offer","title":"Update Hosted Offer Tool","description":"Update a hosted offer's fields (partial patch). Only the fields you pass are changed. Requires netops:write.","inputSchema":{"properties":{"hosted_offer_id":{"description":"The hosted offer to update.","type":"integer"},"name":{"description":"Offer display name.","type":"string"},"demand_type":{"description":"lead_buyers | upstream | advertiser_postback","type":"string"},"description":{"description":"Offer description.","type":"string"},"vertical":{"description":"Vertical label.","type":"string"},"geo_allowed":{"description":"List of allowed geo codes.","type":"array"},"funnel_id":{"description":"Required when demand_type is lead_buyers.","type":"integer"},"source_offer_id":{"description":"Required when demand_type is upstream.","type":"integer"},"advertiser_id":{"description":"Required when demand_type is advertiser_postback (or use advertiser_ref).","type":"integer"},"advertiser_ref":{"description":"Batch alias of an advertiser created earlier in the same apply_network_operations call.","type":"string"},"destination_url":{"description":"Required when demand_type is advertiser_postback.","type":"string"},"payout_type":{"description":"cpl | cpa | revshare_percent","type":"string"},"payout_amount":{"description":"Flat payout amount (for cpl\/cpa).","type":"number"},"payout_percent":{"description":"Payout percent 0-100 (for revshare_percent).","type":"number"},"event_payouts":{"description":"Per-event payout config.","type":"object"},"guidelines":{"description":"Compliance guidelines payload.","type":"object"},"daily_conversion_cap":{"description":"Daily conversion cap.","type":"integer"},"weekly_conversion_cap":{"description":"Weekly conversion cap.","type":"integer"},"monthly_conversion_cap":{"description":"Monthly conversion cap.","type":"integer"},"daily_click_cap":{"description":"Daily click cap.","type":"integer"},"monthly_click_cap":{"description":"Monthly click cap.","type":"integer"},"schedule_mode":{"description":"off | hard | soft","type":"string"},"schedule":{"description":"Schedule config.","type":"object"},"requires_approval":{"description":"Whether publisher access requires manual approval.","type":"boolean"},"is_listed":{"description":"Whether the offer is listed for publishers to discover.","type":"boolean"},"auto_approve_conversions":{"description":"Whether conversions auto-approve.","type":"boolean"},"status":{"description":"draft | active | paused | archived","type":"string"},"fail_traffic_url":{"description":"Fail-traffic redirect URL.","type":"string"}},"type":"object","required":["hosted_offer_id"]},"annotations":{}},{"name":"update_publisher","title":"Update Publisher Tool","description":"Set or clear a publisher's default payout: default_payout_percent (revshare offers) and\/or default_payout_amount (flat cpl\/cpa\/cpc offers). It applies to future conversions when the publisher has no access override and no tier payout on the offer, ahead of payout rules and the offer base. Only the fields you send change; send null to clear.","inputSchema":{"properties":{"publisher_id":{"description":"The publisher to update.","type":"integer"},"default_payout_percent":{"description":"Default revshare percent 0-100 for revshare offers, or null to clear.","type":"number"},"default_payout_amount":{"description":"Default flat payout in USD for cpl\/cpa\/cpc offers, or null to clear.","type":"number"}},"type":"object","required":["publisher_id"]},"annotations":{}},{"name":"upsert_hosted_offer_access","title":"Upsert Hosted Offer Access Tool","description":"Grant (or edit) a publisher access to a hosted offer: optionally transition status (approved\/rejected\/revoked) and\/or set per-publisher payout\/cap overrides. Creates the access row on first touch.","inputSchema":{"properties":{"hosted_offer_id":{"description":"The hosted offer to grant\/edit access to.","type":"integer"},"publisher_id":{"description":"The publisher receiving\/holding access.","type":"integer"},"status":{"description":"Optional status transition: approved (from pending), rejected (from pending), or revoked (from approved).","type":"string"},"payout_amount_override":{"description":"Optional flat payout override for this publisher on this offer.","type":"number"},"payout_percent_override":{"description":"Optional revshare percent override (0-100) for this publisher on this offer.","type":"number"},"daily_conversion_cap_override":{"description":"Optional daily conversion cap override.","type":"integer"},"monthly_conversion_cap_override":{"description":"Optional monthly conversion cap override.","type":"integer"},"daily_click_cap_override":{"description":"Optional daily click cap override.","type":"integer"}},"type":"object","required":["hosted_offer_id","publisher_id"]},"annotations":{}}]}