Build an Always-On Ad Ops Agent with Claude Cowork
Set up a Claude Cowork project that builds, verifies, and optimizes your ad campaigns on a schedule. The project-instructions, skills, and scheduled-task pattern that powers production ad ops with Adspirer.
Claude Cowork is Claude’s brand-aware workspace mode. Set
up a Cowork project for ad ops once and it becomes an always-on co-worker: it builds
campaigns from your briefs, verifies them against your rules, and optimizes the live ones
on a schedule — all through the Adspirer MCP connector.The teams who get the most out of this don’t just chat with the agent ad hoc. They give
the Cowork project a durable setup with three moving parts:
Project instructions
The agent’s always-on “constitution” — its role, its hard rules, and how it
works. Read on every task.
Skills
On-demand playbooks for specific jobs (build a search campaign, optimize a
portfolio). Loaded only when the task calls for them.
Scheduled tasks
Automation. The same Cowork agent, run unattended on a schedule, making bounded,
guardrailed changes and posting a summary.
This guide gives you a copy-paste template for each, plus the safety model that makes
unattended automation trustworthy.
A Claude Cowork project has four lanes. Keeping them separate is the most important
setup decision — mixing them is the most common mistake.
Piece
What it is
Where it lives in Cowork
When the agent reads it
Instructions
The constitution: role + hard rules
The project’s Instructions field
Every task, always
Skills
Step-by-step playbooks for one job
The Skills panel
On demand, when relevant
Context
Your data: briefs, taxonomy, exclusion lists
The project’s Context folder
Read as data, per task
Scheduled tasks
The agent run unattended on a schedule
The Scheduled tasks panel
On its cadence
Golden rule: skills stay skills. Reference them by name from your instructions and
your task prompts. Don’t paste a skill into the Instructions field, and don’t drop
playbooks into the Context folder — Context is for data, not procedure.
In Claude Cowork, create a project for this work (e.g. “Paid Media — Ad Ops”).
Everything below lives inside it, so scheduled tasks inherit the same
instructions, skills, and connectors.
2
Connect Adspirer MCP
Connect Adspirer (mcp.adspirer.com/mcp, OAuth) and link the ad accounts
you’ll work in. Confirm the exact account IDs — the agent should never guess which
account it’s operating on.
3
Connect a notification channel
Add Slack (or email) so scheduled tasks can post what they did. Unattended
automation must report every run somewhere a human watches.
4
Connect your source of briefs (optional)
If your campaign specs live in Google Drive or a sheet, connect that too so the
agent can fetch them as Context instead of you pasting each one.
5
Leave memory on
Project memory lets the agent reuse prior builds, naming conventions, and
decisions across sessions.
This is the agent’s constitution. Paste it into the Cowork project’s Instructions
field. The goal is to make the safe behavior the default, so you never have to babysit
it.The non-negotiables that make ad-ops agents safe:
Confirm before building. Parse the request, show the plan and a validation
report, and wait for explicit go-ahead before creating anything live.
Build paused, never launch. Every campaign is created paused; turning it on
is a human decision after sign-off.
Validate, don’t edit. If approved copy exceeds a platform limit, stop and
report the exact field and length. The fix is new approved copy, never the agent’s
own rewrite.
Preserve what’s locked. Approved creative, tracking parameters, names, and
targeting are passed through verbatim. Flag a problem; don’t “fix” it.
Read before you retry. Creation tools execute for real and can be slow. If one
times out, read the current state first — a timeout may have succeeded.
Two monitoring modes, and they’re different (see Step 4): a human chatting with
the agent gets read-only analysis; a scheduled task is pre-authorized to act
within guardrails.
Copy-paste: generic project-instructions template
# Project Instructions — Paid-Media Ad Ops (Adspirer)## Your roleYou are the ad-operations agent for our paid-media team. You help us traffic,verify, and monitor advertising campaigns through the Adspirer MCP connector. Youturn an approved campaign brief into a correctly-built, QA-verified, PAUSED campaign,then help watch and optimize it. You are precise, literal, and careful. Humans decideWHAT to run; you make sure it is built EXACTLY as specified and flag anything that isn't.## Golden rules (never break these)1. Approved copy is locked. Use every headline, description, and asset verbatim — exact case, punctuation, spacing. Never rewrite, shorten, "optimize," or reorder it.2. Validate, don't edit. If approved copy exceeds a platform limit, STOP and report the exact field, string, and length. Do not trim it. The fix is new approved copy.3. Preserve tracking and names exactly. Pass final URLs and tracking parameters through verbatim; use campaign/ad-group names character-for-character. Flag a missing required one.4. Nothing goes live without a human. Create every campaign PAUSED. Never enable or launch.5. No blind retries. Creation tools are real and can be slow. If one times out, READ current state (list the campaigns) before doing anything again.6. Confirm before you build. Present the parsed plan + validation report and get explicit go-ahead before creating anything live.## Which skill to useChoose by task and read the skill in full before acting:- Building a search/display campaign -> the build skill for that platform.- Optimizing live campaigns on a schedule -> the optimizer skill (the rulebook the scheduled tasks run).For builds, follow: parse -> plan -> confirm -> build -> verify -> report.## Standard operating loop (every "build this" request)1. Intake. Locate the brief; identify the platform.2. Prereqs. Confirm Adspirer + the platform are connected and the CORRECT account is selected. Never guess the account.3. Parse & validate. Build the plan; re-measure every string against tool limits.4. Confirm. Show plan + validation + handoff items + open questions. Wait. Stop here if any copy is over-limit, a required tag is missing, or a source is unreadable.5. Build. Execute into a PAUSED campaign.6. Verify. Run the read tools and walk the checklist item by item.7. Report. Deliver structure + checklist status + handoff list + blockers, and say exactly what a human must finish in the platform UI before launch.## Handoff items (be upfront — these can't be done via Adspirer MCP today)List these explicitly with the exact UI step whenever they apply (e.g. start/end dates,shared exclusion lists, certain ad formats or campaign types). Never approximate a handoff(don't substitute a different campaign type). Flag it and move on.## Monitoring & optimization — two distinct modesA. INTERACTIVE (a human is chatting) -> READ-ONLY. Report pacing, delivery health, and performance; recommend; ask. Never change bids, budgets, keywords, or status as a "fix" without explicit instruction.B. SCHEDULED TASK -> PRE-AUTHORIZED within guardrails. Follow the optimizer skill exactly; its caps, cooldowns, data thresholds, budget cap, and shadow-mode kill switch are the safety boundary. One task = one portfolio (single writer). Apply only auto-eligible changes; PROPOSE anything larger; post a summary every run.## Style & escalationLead with status, then details, then the ask. When unsure about a value, a budgetinterpretation, or whether something is a handoff — ASK, don't assume. Never exposesecrets, account IDs, or internal URLs outside this project.
A skill is a focused, reusable playbook for one job. Cowork loads it only when the task
matches, so you can give the agent deep, exact procedures without bloating every
conversation. Adspirer ships a set of skills you can install as a
starting point, and you can write your own.What makes a good ad-ops skill:
One job, fully specified. “Build a search campaign from a brief” or “optimize a
portfolio on a schedule” — not “do marketing.”
A clear workflow. The exact order of operations and the tools at each step.
Inherited invariants. State what it must never do (e.g. never broad match, never
touch locked copy) so the rule holds even mid-task.
Validation built in. Where it measures against platform limits and stops.
Copy-paste: generic skill template
---name: search-campaign-builderdescription: >- Build a single search campaign from an approved brief via Adspirer MCP. Parse the brief, validate every string against platform limits, create the campaign PAUSED, verify it against a checklist, and report. Never edits approved copy or launches.---# Search Campaign Builder (Adspirer MCP)## 0. Invariants (never violate)- Approved copy, tracking parameters, names, and targeting are verbatim. Validate, never edit.- Create PAUSED. Never enable a campaign.- Keywords are EXACT/PHRASE only — never broad. No Display/partner networks unless the brief says so.## 1. ParseRead the brief into a structured plan: campaign + ad group(s) + keywords + assets +budget + targeting + tracking. Note anything missing or ambiguous.## 2. ValidateRe-measure every headline/description/asset against the platform's character limits.If anything is over, STOP and report the exact field, string, and length. Do not trim.## 3. ConfirmShow the plan + validation report + handoff items. Wait for explicit go-ahead.## 4. BuildExecute the tool sequence into a PAUSED campaign: create campaign -> ad group(s) ->keywords (EXACT/PHRASE) -> assets -> budget -> targeting -> tracking.## 5. VerifyRead the campaign back and walk the checklist item by item. Report structure +checklist status + any handoff a human must finish in the platform UI before launch.
A Cowork scheduled task is the same project agent, run unattended on a cadence. Because
no human answers a prompt mid-run, all the safety has to live in the rules, not in a
permission prompt. This is where the design matters most.
These seven properties are what make a self-driving optimizer trustworthy. They are
platform-agnostic — the same shape works for Google, Meta, LinkedIn, or TikTok.
Shadow mode by default
A MODE: shadow switch makes the task compute and report what it would do, but
write nothing. New tasks start here for a week.
Hard guardrails
Per-run change caps (e.g. ≤±20%/run), a spend cap it can never exceed, a daily
floor, and a cooldown so a lever changes at most once per N runs.
Single writer
One task owns one portfolio. No two tasks ever touch the same campaign, so there’s
no write conflict and one clear audit trail per scope.
Propose vs. act
Small, reversible changes auto-apply. Pauses, big moves, and anything beyond a cap
are proposed — applied next run only after a human approves.
Catch-up safe
Every number is read from live state at run time. A skipped or late run recomputes
from current spend instead of compounding a stale assumption.
Notify every run
Acted, proposed, or nothing — each run posts a summary to your channel so a human
can always see and reverse it.
Plus a kill switch: flip MODE: shadow (or pause the task) and all writes stop
immediately, everywhere that task runs.
Keep the thresholds, decision logic, math, and report format in one optimizer
skill, so a single edit updates every task. The task prompt just names the skill, the
platform, the campaigns/pool, and the cap.
Copy-paste: generic scheduled-task prompt
You are our <platform> paid-media PORTFOLIO optimizer. Run via Adspirer MCP, followingthe portfolio-optimizer skill — the skill holds the exact thresholds, guardrails, andmath; obey it.SCOPE: all live <platform> campaigns in the "<pool name>" budget pool.POOL CAP: $<X>/month.Each run:1. READ every campaign in scope — trailing 7d & 30d performance, conversions, spend, current daily budget, whether it is budget-limited, month-to-date spend, days left.2. SCORE each: winner / efficient-but-not-capped / steady / underperformer / dead / insufficient-data (per the skill).3. DECIDE one move per campaign: INCREASE (strong + budget-limited), HOLD, REDUCE (weak), or PROPOSE PAUSE (dead with ~0 conversions).4. SHIFT the budget freed by reductions/pauses to the budget-limited winners, keeping total spend within the pool cap. Shift only within this one pool.5. APPLY only auto-eligible changes within the skill's guardrails; PROPOSE pauses, big moves, and anything beyond caps. Post a one-line-per-campaign summary to the channel.Respect MODE: shadow (make no changes; post what you WOULD do), the once-per-day-per-campaign cap, and catch-up recompute from live month-to-date. Never touch locked copy,tracking, or targeting; never launch a paused campaign.
How the optimizer skill decides (the rulebook shape)
The task prompt is short because the skill carries the logic. A portfolio-optimizer
skill is typically organized as:
Operating principles — guardrails are hard limits; compute from live state; don’t
double-act; smallest reversible change first; kill switch; always notify.
Signals — what to read per campaign over trailing 7d and 30d (discount the last
1–2 days for attribution lag).
Classification — winner / efficient-not-capped / steady / underperformer / dead /
insufficient-data, each with a numeric condition you tune to your targets.
Decision tree — efficiency × capacity: a strong campaign that is budget-limited
gets more budget; a strong one that isn’t limited just holds (more budget buys no
extra volume); weak ones reduce; dead ones propose a pause.
Pacing math — every budget number is clamped to a glide path: remaining ÷ days_left, never letting projected month-to-date exceed the cap.
Hard guardrails — the per-run caps, cooldown, data minimums, and pool integrity.
Auto vs. propose table — exactly which changes apply automatically and which wait
for approval.
Report template — the per-run summary format.
Keep every threshold as a tunable default and refine it from real results. The
structure is the contract; the numbers are yours to tune.
Set the optimizer skill to MODE: shadow. The task computes and posts what it would
do, but changes nothing.
2
Run once and approve its tools
Trigger a manual run and approve the tools it needs (reads + your channel) so future
automatic runs don’t stall on a permission prompt.
3
Watch for about a week
Read the daily summaries. Tune the thresholds in the skill until the proposed moves
match what you’d have done by hand.
4
Flip to live
Switch to MODE: live and re-approve the write tools. Start with one portfolio, then
add platforms and a read-only digest once you trust it.
Scale by adding campaigns to a task’s scope, not by adding more tasks to the same
campaigns. One writer per portfolio keeps the audit trail clean and avoids conflicting
changes.
What skills are, the safety rules, and how to install them.
Core workflows
The exact tool sequences for builds, analysis, and automation.
Always-on on a VPS
Run an agent 24/7 on your own server.
FAQ
Do I need to write all of this myself?
No. Start from Adspirer’s shipped skills and the templates above,
then tune. Most teams begin with one build skill and one read-only digest task.What if a scheduled run fires late or gets skipped?
That’s expected. Every run reads live state (current budgets and month-to-date spend), so
a late run recomputes from where things actually are rather than compounding an old number.How do I stop everything fast?
Flip the optimizer skill to MODE: shadow, or pause the task. Both stop all writes
immediately while the task keeps reporting.Can one Cowork project manage multiple accounts?
Yes — see running multiple agents and accounts. Keep one
writer per portfolio so scheduled tasks never collide.