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 inside

list_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: null you may report that a campaign returned 2.4x. You may not say it is good, bad, profitable, or worth scaling.
  • With targetCpaCents and targetCplCents both null, 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_guardrails returns maxSpendDataAgeHours (default 26 — the hourly sync plus room for one missed run). If a money rule refuses a call with the stale_spend_data guardrail, the sync is behind; say so rather than re-proposing.
  • google_connection_status reports 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.

TierWhat happens
readNothing changes.
lowThe write happens immediately. It is reversible, stays inside Marketing OS, and is written to the audit log.
highThe 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 endmarketing-audit
know why a number moved, or what is brokenmarketing-diagnose
start something new — a campaign, a post, a piece of contentmarketing-launch
put more money behind a winner, or cut a losermarketing-scale
decide what creative to run next, and prove what workedcreative-testing
show up in local search and in ChatGPT / Gemini / AI Overviews / Grokai-search-visibility
do something that crosses channels in one runcross-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

  1. Load the context first. list_businesses → get_business_context → get_guardrails, before any judgement.
  2. Source every number. Quote only thresholds from references/thresholds.md and metrics the tools returned. If you cannot source it, say you cannot.
  3. Read before you write. update_brand_profile replaces the whole profile — anything you omit is cleared. get_brand_profile first, every time.
  4. Cite the business's own facts. search_knowledge before you assert anything about their policies, pricing, results or customers.
  5. Never claim a high-tier change happened. It is waiting for approval.
  6. 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.