marketing-scope-mcp
Campaign pre-flight for AI agents. Plan the campaign, score the offersexplainably, build a registry-backed plan, then verify every tactic cites ascored offer and names a success metric — before any money is spent.
The sibling of research-scope-mcp(sources → citations) applied to marketing: tactics → scored offers.
The discipline
plan_campaign → score_offer → build_plan → check_plan
(strategy) (0–100) (shell) (gate)
plan_campaign(objective)— decompose a marketing goal into offertargets, channel targets, anti-targets (budget black holes), and killcriteria. Kill criteria are hard stops, not suggestions.score_offer(offer)— one offer statement graded on an explainable0–100 scale: clarity 20 / audience specificity 24 / differentiation 20 /proof & risk reversal 20 / call to action 16. Grades: A ≥ 80, B ≥ 65,C ≥ 45, D < 45. Every dimension returns with its evidence, so thenumber is auditable, not a vibe.build_plan(goal, offers[])— writes a campaign-plan shell (strategy,channel briefs, numbered offer registry, scoring appendix) and rejectsany offer that was never scored, naming them.check_plan(plan_id | plan_path)— every tactic must cite a registryoffer ([O1]-style) and name a success metric. Violations come back as anerror list — never a silent pass.
Install
Node ≥ 20.
npm install -g marketing-scope-mcp
# or run from source:
git clone https://github.com/AxelVerneBooks/marketing-scope-mcp
cd marketing-scope-mcp && npm install && npm run build
Claude Code
claude mcp add marketing-scope -- node /path/to/dist/index.js
Cursor (.cursor/mcp.json)
{ "mcpServers": { "marketing-scope": { "command": "node", "args": ["/path/to/dist/index.js"] } } }
Streamable HTTP
node dist/index.js --http --port 3002 # serves MCP at http://127.0.0.1:3002/mcp
Data dir (plans on disk) defaults to ./data; override withMARKETING_SCOPE_DATA_DIR.
Example session
> plan_campaign(objective: "sell 30 copies of the build manual in 30 days")
→ offer targets, channel targets, kill criteria incl.
"Every scored offer below 45/100 → STOP; rework before spending"
> score_offer(offer: "...12 print-ready farm ledgers only $19, includes
wall chart — unlike generic ledgers it strips to 40 records a season.
Start today.")
→ 88/100 (A), breakdown with per-dimension evidence
> build_plan(goal: ..., offers: [that exact text]) # unscored → hard error
> check_plan(...) # orphan tactics → error list; metric-less → flagged
License
MIT — see LICENSE.