Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
{
"name": "synter",
"source": "./",
"description": "Connect every ad platform, build audiences from signals, generate on-brand creative, launch cross-platform campaigns, and reallocate spend by ROAS — one conversation, every platform. You direct, the agents execute."
"description": "Plan and operate advertising campaigns through Synter’s hosted MCP server over OAuth. Review performance, write ad copy, and approve campaign changes before execution."
}
]
}
18 changes: 15 additions & 3 deletions .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
"name": "synter",
"displayName": "Synter",
"description": "The AI Agent Operator for Ads. Connect every ad platform, build audiences from signals and first-party data, generate on-brand creative, launch cross-platform campaigns, and reallocate spend by ROAS — all in one conversation. You direct, the agents execute. Nothing ships without your approval.",
"version": "1.1.2",
"description": "Plan and operate advertising campaigns through Synter’s hosted MCP server over OAuth. Review performance, write ad copy, and approve campaign changes before execution.",
"version": "1.2.0",
"license": "MIT",
"author": {
"name": "Synter",
Expand All @@ -25,5 +25,17 @@
"linkedin-ads",
"mcp",
"synter"
]
],
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "\"${CLAUDE_PLUGIN_ROOT}\"/scripts/session-context.sh"
}
]
}
]
}
}
4 changes: 2 additions & 2 deletions .cursor-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,14 @@
},
"metadata": {
"description": "Synter's official plugin marketplace. The AI Agent Operator for Ads.",
"version": "1.1.2"
"version": "1.2.0"
},
"plugins": [
{
"name": "synter",
"source": ".",
"logo": "assets/logo.png",
"description": "The AI Agent Operator for Ads. Connect 21 ad platforms, build audiences, generate on-brand creative, launch cross-platform campaigns, and reallocate spend by ROAS — one conversation, every platform. You direct, the agents execute. Nothing that spends money ships without your approval."
"description": "Plan and operate advertising campaigns through Synter’s hosted MCP server over OAuth. Review performance, write ad copy, and approve campaign changes before execution."
}
]
}
16 changes: 3 additions & 13 deletions .cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
"$schema": "https://cursor.com/schemas/cursor-plugin/plugin.json",
"name": "synter",
"displayName": "Synter",
"version": "1.1.2",
"description": "The AI Agent Operator for Ads. Connect 21 ad platforms, build audiences, generate on-brand creative, launch cross-platform campaigns, and reallocate spend by ROAS — one conversation, every platform. You direct, the agents execute. Nothing that spends money ships without your approval.",
"version": "1.2.0",
"description": "Plan and operate advertising campaigns through Synter’s hosted MCP server over OAuth. Review performance, write ad copy, and approve campaign changes before execution.",
"author": {
"name": "Synter",
"email": "joel@synterai.com"
Expand All @@ -29,15 +29,5 @@
"skills": "./skills/",
"agents": "./agents/",
"rules": "./rules/",
"mcpServers": "./mcp.json",
"variables": {
"type": "object",
"properties": {
"SYNTER_API_KEY": {
"type": "string",
"title": "Synter API key",
"description": "Optional for onboarding. Paste your syn_... key from syntermedia.ai/developer to use connected ad accounts. Leave blank to run /synter:quickstart and the GA4 tools."
}
}
}
"mcpServers": "./mcp.json"
}
23 changes: 23 additions & 0 deletions .github/workflows/directory-tools.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: Directory tools

on:
pull_request:
push:
branches:
- main

permissions:
contents: read

jobs:
directory-tools:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- name: Check instruction tool references
run: node scripts/check-directory-tools.js
- name: Test repository validators
run: node --test scripts/*.test.js
6 changes: 6 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,12 @@ jobs:
- name: Run manifest validation
run: node scripts/validate-manifests.js

- name: Validate directory tool references
run: node scripts/check-directory-tools.js

- name: Test repository validators
run: node --test scripts/*.test.js

- name: Run strict Claude plugin validation
run: npx -y @anthropic-ai/claude-code@2.1.263 plugin validate . --strict

Expand Down
2 changes: 0 additions & 2 deletions .github/workflows/validate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ name: Validate

on:
pull_request:
branches:
- main

jobs:
validate-manifests:
Expand Down
38 changes: 13 additions & 25 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@

All notable changes to the Synter plugin are documented here. This project follows [semantic versioning](https://semver.org).

## [1.2.0] - 2026-10-02

- Cursor connects to `https://mcp.synterai.com`; Claude retains `https://mcp.syntermedia.ai` to match the connector under review. Both use browser OAuth.
- Setup and support documentation now describe the hosted connection, shipped skills, and local hook accurately.
- Removed unsupported workflows and limited instruction tool references to the approved 34-tool directory. Ad-copy writing and existing-asset selection remain supported.
- Added offline directory validation and an optional OAuth-authenticated live MCP comparison.

## [1.1.2] — 2026-09-06

### Fixed
Expand All @@ -26,22 +33,16 @@ All notable changes to the Synter plugin are documented here. This project follo
## [1.0.0] — 2026-08-27

### Changed
- **Approval gating is universal again.** The Solo/Scale tier carve-out that allowed direct single-turn execution has been reverted — every tier now requires explicit approval before any create/enable/budget/launch/pause call that spends money. Reads (`list_*`, `get_*`, `pull_*`, `verify_*`, reports) remain free to run without asking. The session-start hook, output style, and brand-and-safety context all describe the same universal gate again.
- Account mutations and spend changes require explicit user approval. Read-only reports and account lookups run without asking.
- Version canonicalized to **1.0.0** across `.claude-plugin/plugin.json`, `.cursor-plugin/plugin.json`, and `.cursor-plugin/marketplace.json`, closing the skew between the Claude and Cursor packaging surfaces.

### Added
- **Packaging and release automation** — a zip build produces `dist/synter-plugin-<version>.zip` with the plugin at the archive root, matching Claude Desktop's zip-upload layout. CI validates every PR (manifest JSON, marketplace/plugin name match, skill frontmatter, `.mcp.json`/`mcp.json` interpolation guards) and a release workflow attaches the built zip to the GitHub Release on each `synter--v*` tag push.

### Fixed
- README no longer tells Claude Code installers they can "leave it blank" — `userConfig.synter_api_key` is `required: true` and a blank key yields zero Synter tools (see 0.1.1 below). The install steps now point straight at [syntermedia.ai/developer](https://syntermedia.ai/developer) and clarify that `.mcp.json` (Claude) and `mcp.json` (Cursor) use different key-interpolation syntax and must not be cross-wired.

## [0.4.1] — 2026-08-19

### Added
- **Cursor Plugin packaging** — `.cursor-plugin/plugin.json`, `.cursor-plugin/marketplace.json`, and `mcp.json` so the same repo can be imported as a Cursor Team Marketplace and submitted to the [Cursor Marketplace](https://cursor.com/marketplace/publish). The hosted Synter MCP (`https://mcp.syntermedia.ai`) takes `SYNTER_API_KEY` via Cursor plugin variables. Listing metadata includes the Synter mark (`assets/logo.png`, 1024×1024) and the marketplace description on both the plugin manifest and the marketplace index.

### Fixed
- Cursor install no longer requires `SYNTER_API_KEY` up front (onboarding and free GA4 tools work without one). HTTP MCP declares `type: "http"`. Logo uses an absolute GitHub URL so the marketplace crawler does not 404. Cursor hooks use `sessionStart` instead of Claude's `SessionStart`.
- Cursor plugin manifest, marketplace index, and remote MCP configuration.

## [0.4.0] — 2026-08-04

Expand All @@ -60,7 +61,6 @@ Fourteen new skills deepening diagnostics, measurement, and creative coverage
- **Platform depth** — `meta-ads-diagnostics` (Learning Phase, fatigue, overlap, Advantage+), `google-ads-quality-score`, `google-shopping-optimizer` (feeds, disapprovals, Shopping vs PMax), `performance-max-optimizer` (asset groups, brand cannibalization), `linkedin-ads-targeting` (ABM, lead gen forms).
- **Measurement & data** — `pixel-capi-auditor` (dedup, Event Match Quality), `first-party-data-strategy` (Enhanced Conversions, server-side tagging, Consent Mode v2), `incrementality-testing` (geo holdouts, lift studies), `attribution` companions via `measure_incrementality` and `get_attribution`.
- **Strategy** — `retargeting-sequence-designer` (staged funnels, recency windows, exclusions), `seasonal-budget-planner` (build your own seasonality index from your account data), `audience-expansion-strategy` (lookalike ladders, seed quality, layering), `geo-integrity-audit` (location-criteria and click-geography verification).
- **Creative** — `video-ad-scriptwriter` (platform-specific scripts with timing marks), `ugc-creative-brief` (briefs, hooks, usage-rights structure).

## [0.2.0] — 2026-07-22

Expand All @@ -73,33 +73,21 @@ Broadened skill and agent coverage so the operator can plan, port, and run campa
- Agents `media-buyer` and `campaign-strategist` now point at the `replicate` workflow and the platform playbooks.

### Changed
- **`campaign-preflight`** rewritten to use only public MCP tools. The prior version referenced internal backend scripts (`*_validate_campaign_structure`, `run_gaql`, `verify_website_tracking`, `POST /tools/run` blocks) that the public MCP does not expose, and carried a hardcoded country blocklist. Now grounded in `run_gaql_query`, `ga4_list_conversions`, `get_gtm_tag`, and `verify_pixel_ownership`.
- **`mmm-budget-planner`** rewritten around the public `optimize_budget`, `get_attribution`, and `measure_incrementality` tools instead of internal `mmm_*` training scripts that are not available through the MCP.
- **`campaign-preflight`** moved from internal backend scripts to public MCP checks.
- **`mmm-budget-planner`** rewritten around the public `optimize_budget`, `get_attribution`, and `measure_incrementality` tools instead of internal scripts that are not available through the MCP.

### Note on exclusions
The new `kill-scale-rules`, `platform-benchmarks`, and `pre-pause-analysis` skills ship **generic methodology only**. Synter's proprietary numeric thresholds and cost-benchmark tables remain withheld — these skills teach the approach and defer to the account's own data, they do not carry the internal numbers. Internal runbooks and infrastructure-coupled skills are still not shipped.

## 0.1.1 — 2026-07-20

### Fixed
- **API key is now required at plugin enable time.** The previous config invited users to
"leave blank to onboard," but the hosted Synter MCP server (mcp.syntermedia.ai) rejects
unauthenticated connections with a 401 — so a blank key meant the MCP server silently
failed to load and Claude had skill files but zero Synter tools. Requiring the key up
front prevents the broken skills-without-tools state. Get a key at syntermedia.ai/developer.


## [0.1.0] — 2026-06-16

Initial release. The AI Agent Operator for Ads, packaged for Claude Code / Claude Desktop.

### Added
- **MCP server** — Synter Advertising Platform (`https://mcp.syntermedia.ai`), cross-platform ad read/write. Free GA4 + onboarding tools work without a key.
- **Workflow skills** (`/synter:*`) — quickstart, connect, audience, creative, launch, optimize, report, help.
- **Craft skills** — 9 generic advertising-methodology skills: ad-policy-compliance, anomaly-detector, campaign-preflight, campaign-structure-auditor, creative-fatigue-detector, executive-reporting, landing-page-creation, mmm-budget-planner, roas-calculator. Deliberately excluded from the public package: internal-execution runbooks (Doppler/DB-coupled), Synter's proprietary operating playbooks (kill/scale thresholds, cost-benchmark + budget-split logic), and skills referencing internal infrastructure (pixel pipeline, table names, non-public tools).
- **Workflow skills** (`/synter:*`) — quickstart, connect, audience, launch, optimize, report, help.
- **Craft skills** — 9 generic advertising-methodology skills: ad-policy-compliance, anomaly-detector, campaign-preflight, campaign-structure-auditor, creative-fatigue-detector, executive-reporting, mmm-budget-planner, roas-calculator. Deliberately excluded from the public package: internal-execution runbooks (Doppler/DB-coupled), Synter's proprietary operating playbooks (kill/scale thresholds, cost-benchmark + budget-split logic), and skills referencing internal infrastructure (pixel pipeline, table names, non-public tools).
- **Agents** — campaign-strategist, media-buyer, audience-builder, creative-director, budget-optimizer, performance-analyst.
- **Hook** — SessionStart primer enforcing the money-safety rules and brand voice.
- **Output style** — `synter` agent voice.
- **Context** — bundled brand-voice and safety rules referenced by skills and agents.
- `userConfig.synter_api_key` for turnkey, secure key entry at enable time.
- **SDK runner** (`sdk/synter-agent.mjs`) — headless [`@anthropic-ai/claude-agent-sdk`](https://www.npmjs.com/package/@anthropic-ai/claude-agent-sdk) harness that loads the plugin and runs the operator unattended. Read-only by default (spend/mutation auto-denied via `canUseTool`); `--allow-writes` to lift. Verified: SDK loads all 23 skills + 6 agents.
21 changes: 8 additions & 13 deletions CLAUDE_COMMUNITY_SUBMISSION.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ complementary catalogs. Do not treat connector review as plugin publication.
| Category | Marketing and advertising |
| Short description | Operate cross-channel advertising with approval-gated Synter agents, skills, and MCP tools. |
| Brand icon | `assets/logo.png` — canonical transparent 1024×1024 Synter mark |
| Support | `https://syntermedia.ai/contact` |
| Support | `https://syntermedia.ai/support` |
| Privacy policy | `https://syntermedia.ai/privacy` |
| Terms | `https://syntermedia.ai/terms` |

Expand Down Expand Up @@ -91,11 +91,8 @@ Direct installation is not public-directory discovery.
- [x] Production OAuth protected-resource and authorization-server metadata
return `200`; a protected tool call returns `401` with a
`WWW-Authenticate` resource-metadata challenge.
- [x] The production MCP tool surface has 195 tools; every tool supplies a
title plus boolean `readOnlyHint` and `destructiveHint` annotations.
- [x] Clean Claude Code configuration can add `Synter-Media-AI/plugin`, install
`synter@synter`, and inventory all 57 skills, 7 agents, 1 hook, and 1 MCP
server.
- [ ] Run the optional live directory check with reviewer-authorized OAuth before submission; the checked-in directory contains 34 tools.
- [ ] Re-inventory the updated package: 52 skills, 6 agents, one Claude session hook, and one remote MCP server per client.
- [ ] Provider reviewer exercises `/synter:quickstart`, one read-only report,
and one write preview without approving the write.
- [ ] Provider reviewer uses a Synter-owned test workspace with sample data;
Expand All @@ -107,9 +104,8 @@ Direct installation is not public-directory discovery.

## Security and data-use evidence

- The plugin declares no local executable dependency or install script.
- The only remote MCP destination is `https://mcp.syntermedia.ai`, which uses
OAuth 2.1 with PKCE for Claude clients.
- Claude invokes a Bash session hook that prints static guidance through `cat`. Cursor declares no hook. The repository also contains a manually invoked Node SDK runner and development scripts; no compiled binaries are bundled.
- Claude uses `https://mcp.syntermedia.ai` to match the connector under review. Cursor separately uses `https://mcp.synterai.com`. Both plugin configurations use browser OAuth without static credentials or headers.
- The session hook prints a static operating and approval-safety primer into
session context; it does not read or transmit credentials.
- Advertising writes are approval-gated. The bundled guidance does not turn a
Expand Down Expand Up @@ -138,14 +134,13 @@ boundary before any external spend-changing action.
| --- | --- |
| Public source and license | Public GitHub repository; MIT `LICENSE` |
| OAuth for authenticated remote MCP | OAuth metadata, DCR, PKCE, and protected-tool `401` challenge at `https://mcp.syntermedia.ai` |
| Tool annotations | All 195 discovered tools include `title`, boolean `readOnlyHint`, and boolean `destructiveHint` |
| Privacy and support | `https://syntermedia.ai/privacy`; `https://syntermedia.ai/contact` |
| Tool directory | 34 checked-in tool names; live annotations require a fresh authenticated review |
| Privacy and support | `https://syntermedia.ai/privacy`; `https://syntermedia.ai/support` |
| Narrow, visible instructions | Human-readable skills and agents in this repository; no encoded or remotely loaded behavioral instructions |
| Approval boundary | Spend-changing operations require explicit approval; a model response is not approval |
| Test account | Must be supplied privately by Synter in the submission form |

The plugin manages advertising workflows and can invoke creative tools, so the
submission must describe those capabilities accurately. Anthropic retains
The plugin manages advertising workflows, writes text ads, and selects existing assets. The submission must describe those capabilities accurately. Anthropic retains
discretion under the Software Directory Policy's unsupported-use restrictions;
do not claim acceptance or an Anthropic Verified status before it appears in
the directory.
Expand Down
Loading
Loading