MCP App Store
by KeenEthics

Overview

Use your connected MNTN account to inspect advertisers, campaigns, flights, creatives, audiences, and reporting data. Build and update campaign resources, control budgets and delivery, and submit product feedback. Account access and write availability depend on the permissions granted to the connected user.

Tools

check_launch_readiness

ChatGPT
Report every launch precondition on an MNTN campaign, each with its own status, so you can tell the user what is still outstanding without attempting a launch. Read this before launch_campaign, and whenever a campaign comes back incomplete. Branch on each precondition’s code, never on its detail — the codes are stable, the prose is not. unmet is blocking the launch and detail says why; satisfied is met; skipped means MNTN did not evaluate it for this campaign — a live campaign’s pixels are not re-validated and an archived one is not evaluated at all — so treat skipped as unknown, never as a pass. A blocker this API version has no name for arrives as other, so ready: false carrying an unfamiliar code still means the launch will be refused. Two preconditions cannot be cleared through this API: pixel needs the tracking and conversion pixels installed on the advertiser’s site, and creatives needs an approved creative attached — approval is MNTN’s own review, which list_creatives reports per creative. Report both to the user as MNTN app work rather than offering to clear them here: https://auth.mountain.com. Reading this needs full campaign visibility, since it reports payment, email-verification and website-review state; a caller who only sees campaign IDs and names is refused.

clone_campaign

ChatGPT
Duplicate a MNTN campaign into a new, independent one. The clone is created in the build state — it does not deliver or spend until a budget is opened and it is launched, so this is a safe way to reuse a campaign’s setup. Carried over: attached creatives with their click URLs and weights, and the linked audience. Not carried over: budget — the clone opens with none, exactly like create_campaign; unless set_campaign_budget is among your tools, tell the user to set the budget in the MNTN app (https://auth.mountain.com) rather than assuming the clone is ready to launch. An experiment cannot be cloned, nor can a campaign that is part of a split test — both are rejected. Omit name to let MNTN derive one from the original; MNTN enforces unique campaign names per advertiser, so an explicit name already in use — yours or an auto-derived one — is rejected rather than silently suffixed. This tool is not idempotent — calling it twice creates two clones, so do not retry a call whose outcome you are unsure of.

create_audience

ChatGPT
Create a new MNTN audience — the targetable set of households a campaign can be pointed at. This spends nothing and changes no delivery: an audience does nothing until a campaign targets it, and this tool does not attach one. Targeting comes from two places. Keywords are contextual audience signals, not search-advertising keywords — call search_keywords first and pass back the parent keywords it returns, because MNTN expands those into the audience server-side and a term it does not recognise contributes nothing. Geography comes from saved geo-lists; an audience with none covers the whole United States. An audience with no keywords and no geo-lists is therefore valid but untargeted, which is rarely what the user meant — say so rather than creating one silently. This tool is not idempotent: calling it twice creates two audiences, so do not retry a call whose outcome you are unsure of; check list_audiences first.

create_campaign

ChatGPT
Create a new MNTN campaign. The campaign is created in the incomplete state: it does not deliver and does not spend until it is launched, so this is the safe way to draft one. It needs an active budget, a goal, an audience, installed pixels and approved creatives before it can launch. Attach creatives here from the advertiser’s library — call list_creatives for the IDs; this API cannot upload a new video. Pixel installation is a change to the user’s website and MNTN reviews creatives itself, so expect both of those to finish outside this API. This tool never sets a budget: the campaign is always created with none, so what it returns is a draft, not a campaign that can launch. Opening the first budget window is normally not available here — unless set_campaign_budget is among your tools, tell the user to set the budget in the MNTN app (https://auth.mountain.com), and report it as outstanding rather than offering to set it yourself. The objective is permanent and cannot be changed later; confirm it with the user before calling. This tool is not idempotent — calling it twice creates two campaigns, so do not retry a call whose outcome you are unsure of; list_campaigns first to check whether it already exists.

create_geo_list

ChatGPT
Create a reusable geo-list for an MNTN advertiser: a saved set of locations that audiences include or exclude to narrow where a campaign delivers. This spends nothing and changes no delivery — a geo-list does nothing until an audience references it, which create_audience does. MNTN's Media Market is a US regional television market — a geographic area whose households share the same local TV programming — not a metro area or a city. Locations can be named or given as IDs; a name MNTN cannot resolve fails the whole call and names the value, so nothing is half-created. This tool is not idempotent: calling it twice creates two lists, so check list_geo_lists before retrying a call whose outcome you are unsure of.

evaluate_campaign_recommendations

ChatGPT
Evaluate an MNTN campaign against the MNTN Recommendation Policy and return one deterministic verdict per rule — fixed logic over the campaign, its flights and its reporting, so the same data always gives the same answer. Use this before suggesting optimizations, and base advice on its verdicts rather than on your own reading of the reports. Each verdict has a decision: recommend (enough evidence to act), observe (wait for more data), withhold (context the rule needs is unavailable — say so, do not guess), escalate (route to MNTN for internal review, e.g. a tracking problem), guardrail (a standing constraint: never suggest CPM, recency, frequency caps, bids or other controls the customer does not have), or not_applicable. Every verdict also carries a one-line summary, the evidence it rests on, and policy caveats that limit how it may be used. dataAvailability shows which sources were missing. A campaign in an A/B test (Campaign Split Testing) gets a guardrail: do not give normal optimization advice; tell the user to evaluate the test in the MNTN platform. Windows default to the last 30 complete days versus the 30 days before; pass currentWindow/priorWindow to override. Reading this needs advertiser read access to the campaign’s owner.

get_advertiser

ChatGPT
Get a single advertiser by ID. Returns only what the authenticated caller is authorized to see.

get_audience

ChatGPT
Get a single audience by ID.

get_campaign

ChatGPT
Get a single campaign by ID. Use expand to inline the current flight, the audience and/or the attached creatives. Attached creative IDs come back as creativeIds either way; expand=creatives adds each one’s click-through URL and serving weight, which is what tells you whether a creative can be approved.

get_campaign_audience

ChatGPT
Get the audience linked to a given campaign. Returns 404 if the campaign has no linked audience.

get_flight

ChatGPT
Get a flight nested under a campaign. In MNTN a flight is a budget window (a dated budget entity with its own ID), NOT a scheduling pattern or the period an ad airs. Pass "current" as the flight ID to resolve the campaign's active flight.

get_geo_list_locations

ChatGPT
List the locations contained in a geo-list. advertiserId is required for authorization.

get_reporting_metadata

ChatGPT
Discover the live AI reporting catalog for run_report (per advertiser). Each column has a Table.Column token, friendly name, format, help, whenToUse, isMetric, and isSum; each table has family and incompatibleWith, and compatibility states the table-mixing rules. Prefer Graph for totals; Segment metrics are bloated / not additive (group by SegmentInfo.Interest). Fact tables are mutually exclusive; see each table's incompatibleWith. Column whenToUse is authoritative — never derive a metric with arithmetic (subtract, divide, recompute); use the matching catalog token. Token-selection only: do not say modeled, last-touch, or raw in answers unless the user asked about attribution, last-touch, or site-wide. Call this BEFORE run_report; only listed tokens are accepted.

launch_campaign

ChatGPT
Launch an MNTN campaign so it begins delivering ads and spending real money. This is the only tool here that starts spend, and there is no undo beyond pause_campaign — money already spent is not recoverable. Before calling: read the campaign with get_campaign, tell the user its budget, budget type and schedule in your own message, and get an explicit yes to launching that specific campaign. A general instruction like "get my campaigns running" is not a confirmation. If the budget schedule has already started, elapsed budget periods are not recovered and the launch still proceeds — calling this is the confirmation. Only a launchable campaign can be launched; an incomplete one is rejected, and the refusal names the preconditions still outstanding. check_launch_readiness reports the same set without attempting a launch — read it first rather than launching to find out what is missing.

list_advertisers

ChatGPT
List advertisers the authenticated caller is authorized to see. Optionally filter by name — pass query for a fuzzy cross-field match (a numeric value also matches the advertiser ID) or companyName for a case-insensitive substring; this is the advertiser name→ID lookup. Omit all filters to list every advertiser the caller can access. Results are field-scoped to the caller's advertiser view tier; a filter the caller may not use returns a 400.

list_audience_campaigns

ChatGPT
List campaigns linked to a given audience.

list_audiences

ChatGPT
List audiences for an advertiser the authenticated caller is authorized to see.

list_campaigns

ChatGPT
List campaigns for a given advertiser that the authenticated caller is authorized to see. advertiserId is required — PAPI rejects an unscoped campaign list with a 400 (enforced at runtime but not reflected in the OpenAPI spec).

list_creatives

ChatGPT
List an advertiser’s creative library — the uploaded videos a campaign can serve — newest first. Read each entry’s status before offering one: ready has finished processing and can serve, processing is still being ingested, in_review is awaiting MNTN approval, and rejected cannot be used (see rejectionReasons). Treat any other value as not yet usable. Attaching a creative that is not ready is allowed and it serves once approved, but it will not deliver in the meantime. The id returned here is what create_campaign’s creatives takes. Uploading a video is not possible through this API — it needs the file itself — so when the library has nothing suitable, ask the user to upload it in the MNTN app rather than offering to do it here: https://auth.mountain.com

list_flights

ChatGPT
List the flights on an MNTN campaign, oldest first by default. In MNTN a flight is a budget window — a dated budget entity with its own ID — NOT a scheduling pattern or the period an ad airs. Every window is returned, ended and archived ones included, so filter on status when you only want what is running or queued. This is how to read a campaign’s budget history and the windows scheduled ahead of the live one; get_flight reads a single window, or "current" for the active one. MNTN may return windows outside the filter you asked for, so read each window’s own status rather than assuming the filter was applied.

list_geo_lists

ChatGPT
List saved geo-lists for an advertiser.

list_reference_data

ChatGPT
List a canonical reference enum accepted by MNTN campaign, budget, and audience APIs. Pick the enum via kind. budget_types returns the allowed budget types (distinct from budget_goals, which returns budget goal types).

pause_campaign

ChatGPT
Pause a live MNTN campaign, halting its delivery and spend. Confirm the exact campaign — by ID, and by the name returned from get_campaign — with the user before calling this; a general instruction like "stop wasting money" or "fix this campaign" is not a confirmation of which campaign to pause. A paused campaign can be restarted with launch_campaign, which starts spend again. Only a live campaign can be paused; PAPI rejects anything else.

run_report

ChatGPT
Run a synchronous custom report. Read-only; uses HTTP POST only because the report specification is too large for a query string. Call get_reporting_metadata FIRST and follow its compatibility rules. Prefer Graph. for account totals; Segment. only to compare segments (bloated / not additive; sum ["SegmentInfo.Interest"], or Name then Interest). Fact tables cannot be mixed. Column whenToUse is authoritative — never derive a metric with arithmetic (subtract, divide, recompute); use the catalog token instead. Token-selection only: do not say modeled, last-touch, or raw in answers unless the user asked about attribution, last-touch, or site-wide. Row keys always use Table.Column names (fullName is always true). Supply a date range as EITHER preset OR begin+end (mutually exclusive).

search_geo_locations

ChatGPT
Search the US geo-location catalog. Provide at most one of geoTypeId or geoTypeName (they are mutually exclusive); when neither is given, results default to Media Market — a US regional television market (a geographic area whose households share the same local TV programming).

search_keywords

ChatGPT
Search the keyword catalog for an advertiser. In MNTN a keyword is an audience/contextual targeting signal used to build CTV audiences — NOT a search-advertising keyword, so there are no match types, bids, or search-query semantics.

set_campaign_budget

ChatGPT
Preview or commit a dated budget window on an MNTN campaign. This opens the first budget on a campaign that has none, or schedules alongside existing windows when conflictAction is BOOST or REPLACE. To change only one existing window’s amount, use update_flight_budget. The safe default is dryRun=true: MNTN persists nothing and this tool returns every window the campaign would end up with, including unchanged, new, superseded and $0 gap windows, plus its most serious delivery consequence. Always preview first, show the complete schedule and consequence to the user, and get explicit confirmation. To commit, repeat exactly the same inputs with dryRun=false and acknowledgePlan set to the token from that preview. The tool previews again immediately before writing and refuses if the resulting schedule changed. Consequence-token dates are UTC and can be one date away from the advertiser’s local calendar. REPLACE substitutes the requested budget across overlapping dates; BOOST adds it on top. Both preserve the budget on either side. Because either can redirect committed spend, this tool is destructive. A MONTHLY budget that does not start on the advertiser-local first moment of a month can split into a prorated FLIGHTED lead window plus the recurring MONTHLY window. Report every window, never only the first. A first budget has no daily cap, so a large amount also requires acknowledgeLargeBudget after the user confirms that exact figure.

submit_feedback

ChatGPT
Send structured feedback about this MCP server to MNTN's engineering team. Use it when a tool returned wrong data, when the user needed something no tool here can do, when the user is stuck, or when something worked notably well. CONFIRM BEFORE SENDING. This publishes every field you supply to an internal MNTN channel. Show the user the exact report you intend to send and get an explicit yes first. Use elicitation if this client supports it, otherwise ask in chat. Submitting silently is a defect. What makes a report useful: set tool_name, put the arguments you passed to that tool in failing_arguments, and state in detail what you expected versus what came back. session_summary is one line stating the user's goal, in words the user approved — not a recap of the conversation. Send nothing from the conversation beyond what these fields ask for. Do not file for your own mistake that you already recovered from, do not file twice in one session (consolidate into one report), and never file instead of answering the user's question. Never put credentials, tokens or personal data in any field.

update_audience

ChatGPT
Change an existing MNTN audience’s keywords or geo-lists. This spends nothing, but an audience is shared: MNTN campaigns point at one rather than each holding a copy, so changing it re-targets every campaign using it, immediately and with no undo through this API. Two things do not work the way the words suggest. Keywords are a replacement, not an addition — whatever you send becomes the whole set, and MNTN rebuilds the audience from it, which also resets its geographic expression to the whole United States (geo-list associations are left alone). What the audience targeted before cannot be restored — this API can neither read nor rewrite the previous targeting, so an audience built anywhere else loses it for good. Geo-lists are the opposite: they are only ever added, and this API cannot remove one, so undoing an attachment means the MNTN app: https://auth.mountain.com. Read the audience with get_audience first and send the full keyword set you want, not just the new ones. If any live campaign targets the audience, this tool refuses the first time and tells you how many — show the user that number and what will change, and only then call again with acknowledgeLiveCampaigns set to it.

update_campaign

ChatGPT
Change an existing MNTN campaign's name, audience or goal. Every field is a replacement, not an addition, and MNTN keeps no history this API can restore. Read the campaign with get_campaign first, so you know the current values before proposing new ones. Only the fields you send are touched. Changing the audience re-points who sees the ads, so if the campaign is delivering — live, scheduled, or of a status this connection cannot read — this tool refuses once and lists what would change. Show the user, and call again with acknowledgeLiveCampaign set to the campaign ID only once they agree. Renames and goal changes apply straight away whatever the status. A campaign's objective cannot be changed — MNTN rejects it, so it is not offered here. Creatives cannot be changed here either, though create_campaign attaches them: on this route the array is declarative, so one that omits an attached creative detaches it. Use the MNTN app for that: https://auth.mountain.com. Nor is the budget: use update_flight_budget to change the active window, or set_campaign_budget to preview and open or schedule a window. If neither is among your tools, budget changes are an MNTN app job (https://auth.mountain.com); tell the user rather than offering to make them.

update_flight_budget

ChatGPT
Change the budget on an MNTN campaign's active flight — the dated budget window money is actually spent from. This changes real spend, in either direction. Before calling: read the flight with get_flight, tell the user the current budget and the exact new figure in your own message, and get an explicit yes to that number. An instruction like "increase the budget" or "spend more" is not a confirmation of an amount. MNTN accepts one change per campaign per day, so a second call for the same campaign is refused until the next UTC day — do not plan a sequence of adjustments, and do not retry a refused call with a different figure. MNTN also caps a single day’s move at ±25% of the flight’s start-of-day budget, and only the active flight can be changed. budgetType has no effect here: an active flight's billing cadence cannot be changed through this tool, so it always keeps its current cadence regardless of what you pass. Read the current cadence with get_flight; do not use budgetType to try to switch it.

Capabilities

Writes

Example Prompts

Click any prompt to copy it.

Similar Apps