Marketing OS — foundation
Start here for any Marketing OS work, and load this before any other marketing-os skill — it is the prerequisite that fetches the account context every other one grades against.
The prerequisite skill. It does three things and then hands off: it loads the account context, it states what you are and are not allowed to do with it, and it routes to the skill that does the actual work.
Every other skill in this pack assumes this one has already run. If you have not loaded the account context in this session, do it now — nothing below is safe without it.
1. Load the account context — always, in this order
list_businesses # org-level. No businessId. ALWAYS first.
get_business_context # the economics for the one business you picked
get_guardrails # the hard ceilings you must propose insidelist_businesses is the only tool that does not take a businessId; every
other tool in the registry requires one and you must take it from here. Never
guess or invent a businessId. If more than one business comes back and the
user did not name one, ask which — do not pick for them.
Marketing OS exposes tools only; there is no MCP resources capability to
read. The account context is list_businesses + get_business_context +
get_guardrails, and those three calls are what "load the account context"
means everywhere in this pack.
The refusal rule — no benchmarks without economics
get_business_context returns breakEvenRoas, avgOrderValueCents,
targetCpaCents, targetCplCents, monthlyBudgetCents and
dailyBudgetCapCents. Any of them may be null.
If the number a judgement needs is null, say so and stop. Do not substitute
an industry benchmark, a category average, or a figure you remember.
- A ROAS is meaningless without the break-even ROAS it is measured against. With
breakEvenRoas: nullyou may report that a campaign returned 2.4x. You may not say it is good, bad, profitable, or worth scaling. - With
targetCpaCentsandtargetCplCentsbothnull, a CPA is a number, not a verdict. - The fix is one sentence to the user: "Marketing OS has no break-even ROAS for Northwind Supply, so I can't tell you whether 2.4x is profitable. Set it under the business's economics and I'll grade every campaign against it."
This is not caution for its own sake. A borrowed benchmark is the single most expensive thing an assistant can say here: it reads as a fact about the user's business, and it decides how their money gets spent.
Check the data is fresh before quoting it
Meta spend is synced, not live. Two checks, both cheap:
get_guardrailsreturnsmaxSpendDataAgeHours(default 26 — the hourly sync plus room for one missed run). If a money rule refuses a call with thestale_spend_dataguardrail, the sync is behind; say so rather than re-proposing.google_connection_statusreports whether Search Console is connected and how current it is.
Same-day numbers are always partial. When the user asks "how did today go", say the window is incomplete and offer yesterday.
Degrade honestly when a channel is not connected
social_list_accounts returns an empty list when no Facebook Page, Instagram
account, TikTok creator or YouTube channel is connected. localfalcon_* fails
when Local Falcon has no API key. google_connection_status reports the Search
Console state.
Say the channel is not connected. Never improvise around a missing integration — do not describe what the user "probably" posts, do not estimate local rank from general knowledge, do not fill a gap with a plausible number. "TikTok is not connected to this business, so I can't include it" is a complete and correct answer.
2. What you are allowed to do — the risk tier is the whole gate
Every tool declares a tier, and the tier decides everything. The tool description tells you which one it is; read it before you call.
| Tier | What happens |
|---|---|
| read | Nothing changes. |
| low | The write happens immediately. It is reversible, stays inside Marketing OS, and is written to the audit log. |
| high | The change does NOT happen. The call files the exact change in the user's approvals inbox and returns straight away. |
The high tier is the rule you are most likely to break. A high call
returns successfully, having changed nothing. Report it as waiting for
approval — never as done.
✅ "I've filed the budget change for Site Visitors 30d — $100/day to $150/day. It's in your approvals inbox and nothing has changed on Meta yet."
❌ "I've raised the budget to $150/day."
Under the tiers sit the money guardrails: daily and monthly spend caps, a minimum ROAS before delivery may be increased, a maximum single budget step, country allow/block lists and blocked creative angles. They are a floor — no approval, autonomy setting or API call can cross one. A refusal comes back with the rule's name, the limit and the actual value, so re-propose inside the limit rather than retrying the same call. Full list and refusal handling: references/guardrails.md.
If a tool answers "Only an organization admin can run this tool", the user's credential reads but cannot propose. Tell them; do not look for another route.
3. Route to the skill that does the work
| The user wants to… | Load |
|---|---|
| know what state the account is in, end to end | marketing-audit |
| know why a number moved, or what is broken | marketing-diagnose |
| start something new — a campaign, a post, a piece of content | marketing-launch |
| put more money behind a winner, or cut a loser | marketing-scale |
| decide what creative to run next, and prove what worked | creative-testing |
| show up in local search and in ChatGPT / Gemini / AI Overviews / Grok | ai-search-visibility |
| do something that crosses channels in one run | cross-channel-playbooks |
When the request spans channels — "we're launching the spring promo" — go to
cross-channel-playbooks first. It sequences the others.
References
Load these on demand; they are not needed for every request.
- references/tool-catalog.md — every tool, its tier and its arguments. Read it before calling anything you have not called before in this session.
- references/thresholds.md — every number this pack is allowed to quote, each with the file it comes from. If a threshold is not in that file, this pack does not have one.
- references/guardrails.md — the ten guardrail rules and what to do when one refuses you.
Working rules
- Load the context first.
list_businesses→get_business_context→get_guardrails, before any judgement. - Source every number. Quote only thresholds from
references/thresholds.mdand metrics the tools returned. If you cannot source it, say you cannot. - Read before you write.
update_brand_profilereplaces the whole profile — anything you omit is cleared.get_brand_profilefirst, every time. - Cite the business's own facts.
search_knowledgebefore you assert anything about their policies, pricing, results or customers. - Never claim a
high-tier change happened. It is waiting for approval. - Say what is not connected. An honest gap beats a confident guess.
Something wrong or missing on this page? Tell us and we will fix it.