Skip to content
Draft
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
3 changes: 2 additions & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
{
"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."
"version": "1.1.3",
"description": "Operate connected ad platforms with Synter agents, skills, and approval-gated MCP tools."
}
]
}
6 changes: 3 additions & 3 deletions .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@
"$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": "The AI Agent Operator for Ads. Operate connected ad platforms, build audiences, generate on-brand creative, launch campaigns, and optimize spend — all with explicit approval before spend-changing actions.",
"version": "1.1.3",
"license": "MIT",
"author": {
"name": "Synter",
"email": "joel@synterai.com",
"email": "support@synterai.com",
"url": "https://syntermedia.ai"
},
"homepage": "https://syntermedia.ai",
Expand Down
6 changes: 3 additions & 3 deletions .cursor-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,18 @@
"name": "synter",
"owner": {
"name": "Synter",
"email": "joel@synterai.com"
"email": "support@synterai.com"
},
"metadata": {
"description": "Synter's official plugin marketplace. The AI Agent Operator for Ads.",
"version": "1.1.2"
"version": "1.1.3"
},
"plugins": [
{
"name": "synter",
"source": ".",
"logo": "https://raw.githubusercontent.com/Synter-Media-AI/plugin/main/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": "Operate connected ad platforms with Synter agents, skills, and approval-gated MCP tools."
}
]
}
6 changes: 3 additions & 3 deletions .cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@
"$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.1.3",
"description": "The AI Agent Operator for Ads. Operate connected ad platforms, build audiences, generate on-brand creative, launch campaigns, and optimize spend — all with explicit approval before spend-changing actions.",
"author": {
"name": "Synter",
"email": "joel@synterai.com"
"email": "support@synterai.com"
},
"homepage": "https://syntermedia.ai",
"repository": "https://github.com/Synter-Media-AI/plugin",
Expand Down
18 changes: 15 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,20 @@ jobs:
- name: Run strict Claude plugin validation
run: npx -y @anthropic-ai/claude-code@2.1.263 plugin validate . --strict

- name: Ensure release tag matches manifest version
run: |
version=$(node -p "require('./.claude-plugin/plugin.json').version")
test "$GITHUB_REF_NAME" = "synter--v$version" || {
echo "Tag $GITHUB_REF_NAME does not match manifest version $version" >&2
exit 1
}

- name: Ensure zip/rsync are available
run: |
command -v zip >/dev/null || sudo apt-get update -qq && sudo apt-get install -y -qq zip
command -v rsync >/dev/null || sudo apt-get update -qq && sudo apt-get install -y -qq rsync
if ! command -v zip >/dev/null || ! command -v rsync >/dev/null; then
sudo apt-get update -qq
sudo apt-get install -y -qq zip rsync
fi

- name: Build plugin zip
run: bash scripts/build-zip.sh
Expand All @@ -42,5 +52,7 @@ jobs:
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
files: dist/synter-plugin-${{ steps.version.outputs.version }}.zip
files: |
dist/synter-plugin-${{ steps.version.outputs.version }}.zip
dist/synter-plugin-${{ steps.version.outputs.version }}.zip.sha256
generate_release_notes: true
3 changes: 3 additions & 0 deletions .github/workflows/validate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,6 @@ jobs:

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

- name: Build and validate Desktop package
run: bash scripts/build-zip.sh
14 changes: 14 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,20 @@

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

## [1.1.3] — 2026-09-09

### Fixed
- Separated Claude Code marketplace installation from Claude Desktop/Cowork custom ZIP upload, including explicit update steps for an existing uploaded 1.0.0 plugin and duplicate marketplace-name troubleshooting.
- Kept `.claude-plugin/plugin.json` authoritative through the root manifest symlink, aligned version 1.1.3 across Claude and Cursor marketplace metadata, removed stale fixed platform-count claims, and standardized publisher contact metadata.
- Replaced broad “every platform” coverage claims with capability wording tied to connected accounts and the current hosted MCP catalog.

### Added
- A clean, allowlisted Desktop/Cowork ZIP build with a SHA-256 checksum and archive-level validation for one-folder layout, version, 57 skills, 7 agents, the SessionStart hook, OAuth connector, and 1024×1024 Synter logo.
- Dedicated installation, update, OAuth, and troubleshooting guidance in `INSTALL.md`.

### Verification limits
- Source manifests, the generated ZIP, component inventory, hook syntax, logo file, and strict Claude plugin schema are locally verifiable. Fresh Desktop upload and OAuth authorization remain client-side flows and are not claimed by these package checks.

## [1.1.2] — 2026-09-06

### Fixed
Expand Down
22 changes: 15 additions & 7 deletions CLAUDE_COMMUNITY_SUBMISSION.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Claude plugin directory submission

Prepared: 2026-09-06
Prepared: 2026-09-09

This is the reviewer-ready package for the public Synter plugin repository.
Synter's separate remote MCP connector submission is in review; that does not
Expand Down Expand Up @@ -69,6 +69,11 @@ Cowork: **Customize → Plugins → Personal plugins → + → Add marketplace
from a repository**, then enter `Synter-Media-AI/plugin` and install `synter`.
Direct installation is not public-directory discovery.

Desktop custom ZIP upload is a separate source. Use the versioned archive from
the latest GitHub release and replace an older same-name `synter` upload in its
existing personal/manual marketplace; do not add a duplicate marketplace as an
update workaround. See `INSTALL.md` for the complete update flow.

## Validation and reviewer checklist

- [x] Repository is public and contains an MIT license.
Expand All @@ -91,11 +96,14 @@ 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.
- [x] The production MCP tool surface had 196 tools in the September 9 QA run;
every discovered tool supplied a title plus boolean `readOnlyHint` and
`destructiveHint` annotations. The hosted catalog is dynamic and this is not
a package invariant.
- [x] A clean Claude Code configuration installed release 1.1.2 from
`Synter-Media-AI/plugin` and inventoried all 57 skills, 7 agents, 1 hook, and
1 MCP server. Release 1.1.3 source and archive checks are local; a fresh
Desktop upload is still unverified.
- [ ] 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 Down Expand Up @@ -138,7 +146,7 @@ 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` |
| Tool annotations | All 196 tools discovered in the September 9 QA run included `title`, boolean `readOnlyHint`, and boolean `destructiveHint`; hosted count may change |
| Privacy and support | `https://syntermedia.ai/privacy`; `https://syntermedia.ai/contact` |
| 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 |
Expand Down
96 changes: 96 additions & 0 deletions INSTALL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
# Install and update Synter

Synter has two Claude installation flows. They share the same plugin identity
(`synter`) and OAuth connector, but they do not update each other.

## Claude Code marketplace

Run these inside Claude Code:

```text
/plugin marketplace add Synter-Media-AI/plugin
/plugin install synter@synter
```

For an existing installation, refresh rather than adding a duplicate:

```text
/plugin marketplace update synter
/plugin update synter@synter
```

Third-party marketplaces do not auto-update unless the user enables that
setting. Restart the session after an update so hooks and the MCP connection use
the new cached plugin version.

If **Add marketplace** reports that the name already exists, the marketplace is
already configured. Open the existing `synter` marketplace or run `/plugin
marketplace list`; do not create a second marketplace with the same name.

## Claude Desktop and Cowork custom upload

1. Download `synter-plugin-<version>.zip` and
`synter-plugin-<version>.zip.sha256` from the [latest release](https://github.com/Synter-Media-AI/plugin/releases/latest).
2. Optionally verify the download:

```bash
shasum -a 256 -c synter-plugin-<version>.zip.sha256
```

3. Open **Customize → Plugins → Personal plugins → + → Upload plugin** and
select the ZIP. Do not unzip it or put it inside another ZIP.
4. Start a new conversation and inspect Synter's plugin details. The current
package reports version 1.1.3 and contains 57 skills, 7 agents, one
SessionStart hook, and one Synter connector.
5. Use a protected Synter tool and complete the browser OAuth prompt. No API key
belongs in Claude plugin settings or chat.

The package's authoritative identity and version come from
`.claude-plugin/plugin.json`. The bundled `assets/logo.png` is the canonical
Synter artwork, but Claude's current plugin manifest does not accept a `logo` or
`icon` field. A generic fallback avatar in a Claude surface is therefore not
evidence that the asset is missing, and adding an unsupported field would make
strict package validation fail.

To update an uploaded Synter 1.0.0, upload the current ZIP to the same
personal/manual marketplace. Claude identifies the plugin by the stable name
`synter`; the supported manual-marketplace flow overwrites a same-name plugin.
If your personal-plugin UI only offers **Remove** rather than replacement,
remove the old upload and upload the current ZIP. Do not add the GitHub
marketplace as an update workaround: that creates a second installation source
and can trigger a duplicate marketplace-name failure.

## Claude Desktop repository marketplace

Instead of a custom ZIP, Desktop can sync this repository:

1. Open **Customize → Plugins → Personal plugins → + → Add marketplace → Add
from a repository**.
2. Enter `Synter-Media-AI/plugin` and install `synter` from the resulting
marketplace.
3. If `synter` already appears under Personal plugins, use that existing source
rather than adding it again.

Repository-marketplace updates and custom-upload replacements are different
operations. Keep one source for Synter unless intentionally testing both.

## Authentication and troubleshooting

- Installation adds the remote connector from `.mcp.json`. Authentication
happens later through Synter's browser OAuth flow on the first protected tool
call.
- The Claude connector has no static API-key header. Never paste an API key,
access token, or authorization code into chat.
- A generic Desktop **Failed to add marketplace** message can hide a duplicate
marketplace name. Check whether `synter` already exists before retrying.
- A generic upload failure is emitted by Claude Desktop, not this repository.
Confirm that the file is the release ZIP, is under 50 MB, has the published
checksum, and was not re-zipped. If those checks pass, use Claude's displayed
diagnostics or contact Claude support; repeatedly adding marketplaces will
not repair an upload failure.
- After an update, start a new conversation. Existing sessions can retain the
previous plugin files and connector process.

The local npm package `@synterai/mcp-server` is a separate, MCP-only stdio
client. Installing it does not install the branded Claude plugin or update a
Desktop custom upload.
Loading
Loading