From 0096d94aa6b2e8e8d76f3c097e59be997d926e5b Mon Sep 17 00:00:00 2001 From: Liam Ilan Date: Fri, 16 Oct 2026 16:07:58 -0700 Subject: [PATCH] feat(third_party): add TikTok for Business plugin --- .cursor-plugin/marketplace.json | 5 ++ README.md | 1 + .../.cursor-plugin/plugin.json | 37 ++++++++++ third_party/tiktok-for-business/CHANGELOG.md | 9 +++ third_party/tiktok-for-business/LICENSE | 21 ++++++ third_party/tiktok-for-business/README.md | 64 ++++++++++++++++++ .../tiktok-for-business/assets/logo.png | Bin 0 -> 14712 bytes third_party/tiktok-for-business/mcp.json | 8 +++ 8 files changed, 145 insertions(+) create mode 100644 third_party/tiktok-for-business/.cursor-plugin/plugin.json create mode 100644 third_party/tiktok-for-business/CHANGELOG.md create mode 100644 third_party/tiktok-for-business/LICENSE create mode 100644 third_party/tiktok-for-business/README.md create mode 100644 third_party/tiktok-for-business/assets/logo.png create mode 100644 third_party/tiktok-for-business/mcp.json diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index c8f97804d..782df3851 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -547,6 +547,11 @@ "name": "finary", "source": "third_party/finary", "description": "Read your net worth, accounts, holdings, spending, and budgets." + }, + { + "name": "tiktok-for-business", + "source": "third_party/tiktok-for-business", + "description": "Manage TikTok ad campaigns, ad groups, ads, audiences, creatives, and reports." } ] } diff --git a/README.md b/README.md index 12be2f47a..91299b145 100644 --- a/README.md +++ b/README.md @@ -100,6 +100,7 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc | `tailscale` | [Tailscale](third_party/tailscale/) | Cursor | Integrations | Let Grok Bot reach MCP servers on your private Tailscale network. Sign in to Tailscale to connect your tailnet; Grok Bot joins it as one tagged device and only reaches the hosts you grant to tag:grokbot. | | `highlevel` | [HighLevel](third_party/highlevel/) | Cursor | Integrations | Work with contacts, conversations, opportunities, calendars, and payments. | | `finary` | [Finary](third_party/finary/) | Cursor | Integrations | Read your net worth, accounts, holdings, spending, and budgets. | +| `tiktok-for-business` | [TikTok for Business](third_party/tiktok-for-business/) | Cursor | Integrations | Manage TikTok ad campaigns, ad groups, ads, audiences, creatives, and reports. | Author values match each plugin’s `plugin.json` `author.name` (Cursor lists `plugins@cursor.com` in the manifest). ## Repository structure diff --git a/third_party/tiktok-for-business/.cursor-plugin/plugin.json b/third_party/tiktok-for-business/.cursor-plugin/plugin.json new file mode 100644 index 000000000..c5eef8d14 --- /dev/null +++ b/third_party/tiktok-for-business/.cursor-plugin/plugin.json @@ -0,0 +1,37 @@ +{ + "name": "tiktok-for-business", + "displayName": "TikTok for Business", + "version": "1.0.0", + "minClientVersions": { + "cursor": "3.13.0" + }, + "description": "Manage TikTok ad campaigns, ad groups, ads, audiences, creatives, and reports.", + "author": { + "name": "Cursor", + "email": "plugins@cursor.com" + }, + "homepage": "https://business-api.tiktok.com/portal/docs/tiktok-ads-mcp-server/v1.3", + "repository": "https://github.com/cursor/plugins", + "license": "MIT", + "logo": "assets/logo.png", + "keywords": [ + "tiktok", + "tiktok ads", + "tiktok for business", + "advertising", + "ads", + "campaigns", + "smart+", + "reporting", + "audiences", + "mcp" + ], + "category": "integrations", + "tags": [ + "tiktok", + "advertising", + "marketing", + "mcp" + ], + "mcpServers": "./mcp.json" +} diff --git a/third_party/tiktok-for-business/CHANGELOG.md b/third_party/tiktok-for-business/CHANGELOG.md new file mode 100644 index 000000000..ed15c0a79 --- /dev/null +++ b/third_party/tiktok-for-business/CHANGELOG.md @@ -0,0 +1,9 @@ +# Changelog + +All notable changes to this plugin will be documented here. + +## 1.0.0 — initial release + +- Added the `tiktok-for-business` MCP server pointing at TikTok's hosted Progressive Disclosure endpoint (`https://business-api.tiktok.com/open_mcp/tt-ads-mcp-layer`), which loads about 40 core tools up front and the rest on demand. +- Auth uses OAuth with TikTok for Business sign-in — no API key, developer app, or client ID to configure. +- Logo: TikTok's official app icon. diff --git a/third_party/tiktok-for-business/LICENSE b/third_party/tiktok-for-business/LICENSE new file mode 100644 index 000000000..ca2bba771 --- /dev/null +++ b/third_party/tiktok-for-business/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Cursor + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/third_party/tiktok-for-business/README.md b/third_party/tiktok-for-business/README.md new file mode 100644 index 000000000..9d3756161 --- /dev/null +++ b/third_party/tiktok-for-business/README.md @@ -0,0 +1,64 @@ +# TikTok for Business + +Cursor plugin that connects agents to [TikTok for Business](https://ads.tiktok.com) through TikTok's official remote [Model Context Protocol](https://modelcontextprotocol.io/) server. + +Manage TikTok ad campaigns, ad groups, ads, audiences, creatives, and reports. + +## Install + +1. Open **Cursor Settings → Plugins**. +2. Search for **TikTok for Business**. +3. Click **Install**, then complete the TikTok for Business sign-in prompt. + +Or run `/add-plugin tiktok-for-business` in chat. + +## MCP + +```json +{ + "mcpServers": { + "tiktok-for-business": { + "type": "http", + "url": "https://business-api.tiktok.com/open_mcp/tt-ads-mcp-layer" + } + } +} +``` + +This is TikTok's Progressive Disclosure server. It loads about 40 core tools when it connects and loads the rest of its roughly 400 tools when the agent needs them, which keeps the tool list small. TikTok also runs a Full Disclosure server at `https://business-api.tiktok.com/open_mcp/tt-ads-mcp-flat` that loads every tool at once. + +Auth is OAuth with Dynamic Client Registration and PKCE. Cursor registers itself and opens TikTok's sign-in when the plugin connects: sign in with your TikTok for Business account (Ads Manager), review the permissions, and click **Authorize**. There is no API key, developer app, or client ID to configure. Authorization lasts 30 days, after which you sign in again. + +## What agents can do + +Tools wrap TikTok Business API v1.3 endpoints: + +| Area | Examples | +| --- | --- | +| Accounts | Authorized advertisers, advertiser info, Business Center | +| Campaigns and ads | Campaigns, ad groups, and ads, including Upgraded Smart+ | +| Reporting | Performance reports by dimension and metric | +| Audiences | Custom and saved audiences, pixels, custom conversions | +| Creatives | Images, videos, music, identities, creative portfolios | +| Catalogs | Catalogs, product sets, feeds, and products | + +The hosted runtime is the source of truth for tool names and schemas. + +## Notes + +- Some tools create, update, and change the status of campaigns, ad groups, and ads, which can spend ad budget. Review every tool call before you approve it. +- Each tool is limited to 6 requests per second per user. +- To revoke access, remove the plugin. + +## Docs + +- TikTok for Business MCP Server: https://business-api.tiktok.com/portal/docs/tiktok-ads-mcp-server/v1.3 +- Connection guide: https://business-api.tiktok.com/portal/docs/how-to-connect-to-tiktok-for-business-mcp-server/v1.3 +- Available tools: https://business-api.tiktok.com/portal/docs/available-tools-in-tiktok-for-business-mcp-server/v1.3 +- Server URL: https://business-api.tiktok.com/open_mcp/tt-ads-mcp-layer + +Logo is TikTok's official app icon. + +## License + +MIT diff --git a/third_party/tiktok-for-business/assets/logo.png b/third_party/tiktok-for-business/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4d0320a9d826c2fde94c11225e70bd962505c3db GIT binary patch literal 14712 zcmV-;IfurHP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0000) zWmrjOO-%qQ0000800D<-00aO40096102%-Q00003paB2_0000100961paK8{00001 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