One MCP server and API for a business's whole marketing
Point Claude Code, Codex, a ChatGPT-style agent or your own code at SimplyAI and it can read the business profile, build growth plans, review and publish campaigns to the owner's Meta, Google, TikTok and Microsoft ad accounts, fill the content calendar, work leads, edit websites and read measured results — through the same rules the app enforces: controls, approvals, credits and an audit trail.
Connect in two minutes
- In SimplyAI open Settings → Developers & AI agents and create a key for the business (read-only or read-and-change). It's shown once.
- Add SimplyAI as an MCP server with the key as a Bearer token:
# Claude Code claude mcp add --transport http simplyai https://simplyai.one/api/mcp --header "Authorization: Bearer sa_live_…"
# Codex CLI — ~/.codex/config.toml
[mcp_servers.simplyai]
url = "https://simplyai.one/api/mcp"
http_headers = { Authorization = "Bearer sa_live_…" }// Any MCP client that takes a JSON config
{ "mcpServers": { "simplyai": { "type": "http", "url": "https://simplyai.one/api/mcp", "headers": { "Authorization": "Bearer sa_live_…" } } } }Transport: Streamable HTTP, JSON responses (POST only, no SSE stream needed). Protocol versions 2025-06-18, 2025-03-26 and 2024-11-05 are accepted. The server lists its tools with `tools/list`; nothing is hidden.
REST, if you'd rather
Every tool is also an HTTPS endpoint with JSON in and out. Send the key as Authorization: Bearer sa_live_…. The full description is in the OpenAPI 3.1 file at https://simplyai.one/api/public/openapi.json.
curl https://simplyai.one/api/campaigns -H "Authorization: Bearer sa_live_…"
curl -X POST https://simplyai.one/api/campaigns/CAMPAIGN_ID/publish \
-H "Authorization: Bearer sa_live_…" -H "Content-Type: application/json" \
-d '{"channel":"google","dailyBudget":"10","totalBudget":"70","startDate":"2026-11-01","endDate":"2026-11-08","countries":["US"],"billingMode":"direct","idempotencyKey":"my-unique-key-1"}'Long work (plans, creatives, websites, publishing) returns HTTP 202 with a jobId; poll GET /api/jobs/{jobId}. Amounts are strings in the business's currency. Rate limit: 300 requests per minute per key.
Tools and endpoints
Generated from the server's own tool table, so this list is always what the server does. “read” tools never change anything; “write” tools change the business and some use credits.
Business & controls
| Tool | REST | What it does |
|---|---|---|
| get_workspaceread | GET /api/workspace | The business (workspace) this key belongs to: name, currency, timezone, control mode (review | assisted | autopilot) and whether all advertising is paused. |
| get_business_profileread | GET /api/profile | The confirmed business profile every plan and creative is built from: name, description, industry, products, audience, geography, languages, brand rules, approved and forbidden claims, primary goal and monthly budget. Includes `confirmedAt` (null = the owner has not confirmed discovered details yet). |
| update_business_profilewrite | PUT /api/profile | Update parts of the business profile (only the fields you send change). Use `confirmed: true` to mark discovered details as checked by the owner — required before plans are generated from a discovery. |
| discover_businesswrite | POST /api/profile/extract | Build or refresh the business profile from a website, a social handle, a plain description, or (source "discover") the business name + town + public links. Runs as a job: poll get_job with the returned jobId, then read get_business_profile and have the owner confirm it (update_business_profile with confirmed: true). |
| get_controlsread | GET /api/workspace/policy | The owner's controls: allowed channels, total and daily spend limits, dates, geography, max budget change %, auto-publish and control mode. Publishing is refused outside these limits. |
| update_controlswrite | PUT /api/workspace/policy | Replace the owner's controls (send every field). Spend limits cap what any campaign may use; control mode decides whether Autopilot proposes (review), acts within limits (assisted) or runs (autopilot). |
| pause_all_advertisingwrite | POST /api/workspace/pause | Pause (or resume) every live campaign on every ad platform for this business. Pausing is never refused. |
| get_integrationsread | GET /api/integrations | Every channel (Meta, Google Ads, TikTok, Microsoft Ads, Telegram, YouTube Shorts, email): whether SimplyAI can publish there today, whether this business has connected its account, the chosen account and the last readiness check. Connecting an account is done by the owner in Settings → Integrations (OAuth), not through the API. |
Plans & campaigns
| Tool | REST | What it does |
|---|---|---|
| list_growth_plansread | GET /api/plans | The last 20 growth plans (30-day marketing plans) with status (generating | ready | …). |
| create_growth_planwrite | POST /api/plans | Generate a 30-day growth plan with campaigns, creatives and a content calendar from the confirmed profile. Uses one of the plan allowances of the owner's subscription. Returns planId + jobId; poll get_job, then list_campaigns with the planId. |
| list_campaignsread | GET /api/campaigns | Campaigns (ad packages) in this business, newest first, with approval status, channel, budget and dates. |
| get_campaignread | GET /api/campaigns/{campaignId} | One campaign in full: the package (name, offer, audience, hooks, keywords), its current creatives (images, copy, video scripts), landing pages and deliveries (what is on which ad platform, status, spend). |
| update_campaignwrite | PATCH /api/campaigns/{campaignId} | Edit a campaign's name, offer, landing link, budget, dates or audience. Any edit sends it back for approval (material change). |
| approve_campaignwrite | POST /api/campaigns/{campaignId}/approve | Approve a campaign (its current creatives become approved) or request changes with a note. Owner/admin only. |
| get_publish_checklistread | GET /api/campaigns/{campaignId}/publish | Dry run of publish_campaign: the blockers that would stop it (approval, creatives, controls, connection, billing) with plain-language reasons, plus the account currency and funds. Creates nothing. |
| publish_campaignwrite | POST /api/campaigns/{campaignId}/publish | Create the campaign in the owner's connected ad account on one channel. Always created PAUSED unless `activate` is true; refused outside the owner's controls or when a blocker exists (run get_publish_checklist first). Returns adCampaignId + jobId; poll get_job. Direct billing: the ad platform charges the owner's own account. |
| control_ad_deliverywrite | POST /api/ads/{adCampaignId} | Pause, switch on, or change the daily budget of a delivery that is on an ad platform (adCampaignId from get_campaign.deliveries). Pause is always allowed; resume and budget changes must fit the owner's controls. Runs as a job. |
| regenerate_creativewrite | POST /api/creatives/{creativeId}/regenerate | Make a new version of one creative (image + copy) with an optional instruction. Costs image credits from the owner's wallet. Runs as a job. |
Content, leads, results
| Tool | REST | What it does |
|---|---|---|
| list_contentread | GET /api/content | Content calendar items (posts, stories, emails, videos) between two dates with channel, status (draft | approved | scheduled | published) and text. |
| create_content_itemwrite | POST /api/content | Add a draft post to the content calendar. |
| update_content_itemwrite | PATCH /api/content/{itemId} | Edit a calendar item or move it through its life: approve, schedule (connected channels post it at the date), unschedule, skip, mark_published. |
| plan_content_monthwrite | POST /api/content/month | Write a month of platform-specific posts into the calendar as drafts. Costs credits (quoted before the job starts; refused without enough). Runs as a job. |
| list_leadsread | GET /api/leads | Leads captured by landing pages and websites (newest 200) with stage counts. |
| update_leadwrite | PATCH /api/leads/{leadId} | Move a lead to a stage, record a sale value, or add a note. |
| get_resultsread | GET /api/results | Measured results only: platform-reported spend, impressions, clicks and conversions per day and per campaign (per currency, never summed across currencies), plus SimplyAI's own lead and confirmed-sale records. |
| get_opportunitiesread | GET /api/opportunities | Marketing opportunities SimplyAI found from real signals (gaps in the calendar, unused channels, website steps) with what it found, why it matters and the recommended action. |
| run_opportunitywrite | POST /api/opportunities/run | Run an opportunity's paid action (content month, newsletter draft, landing page). Never changes ad spend. Costs credits. |
Shop & marketplaces
| Tool | REST | What it does |
|---|---|---|
| get_shopread | GET /api/commerce | Where the business sells (countries) and the marketplaces open there (TikTok Shop, Amazon, eBay, Etsy, Walmart, regional ones, Google Shopping, Meta catalog) with each site's domain, currency, languages, how listings get there (feed | pack | direct API status), listing counts per status, seller connections and product feeds. |
| list_productsread | GET /api/products | The product catalog (prices in minor units with currency, stock, barcode, brand, pictures) and, per product, which facts marketplaces need are missing (gaps). |
| create_productwrite | POST /api/products | Add a product to the catalog. Prices are decimal strings in the product currency ("18.00"). Pictures are https URLs. Only facts the owner gave — never invent sizes, materials or certifications. |
| update_productwrite | PATCH /api/products/{productId} | Change fields of a product (the merge is re-validated). |
| list_listingsread | GET /api/commerce/listings | Marketplace listings (one per product × marketplace site) with title, bullets, description, search terms/tags, rule checks (issues), status (ready = waiting for approval | approved | published) and the marketplace's own id/URL. |
| write_listingswrite | POST /api/commerce/listings | Write listings for products on marketplace sites (only sites that operate in that country are accepted), in each site's language and to its rules. Costs 1 image credit per two listings (refused without enough). Runs as a job; results wait for the owner's approval. |
| update_listingwrite | PATCH /api/commerce/listings/{listingId} | Edit a listing's text (re-checked against the marketplace's rules) or approve / unapprove it. Approving is the owner's decision — only approve when the owner asked for it. |
| publish_listingwrite | POST /api/commerce/listings/{listingId}/publish | Publish (or update) an approved listing from the owner's connected seller account (eBay; Amazon and TikTok Shop once each marketplace approves SimplyAI). Runs as a job. |
Websites & jobs
| Tool | REST | What it does |
|---|---|---|
| list_websitesread | GET /api/websites | The business's websites built by SimplyAI, with status (preview | published), tier (free one-page | extended), public URL and domain; plus the plan's allowance. |
| get_websiteread | GET /api/websites/{websiteId} | One website: pages and sections, details, look, SEO, pictures and the last 30 revisions. |
| create_websitewrite | POST /api/websites | Generate a website from the confirmed profile. tier "free" = short one-page site (free on the Agency plan, otherwise one credit); "extended" = every page and section for credits. Runs as a job; the site appears as a preview the owner can publish. |
| edit_websitewrite | POST /api/websites/{websiteId}/edit | Change a website with a plain-language instruction ("make the hero about the autumn offer"). Every change is a revision that can be restored. Runs as a job. |
| publish_websitewrite | POST /api/websites/{websiteId}/publish | Publish a website at its simplyai.one address (or unpublish it). |
| get_jobread | GET /api/jobs/{jobId} | Progress of a background job returned by another tool: status (queued | running | succeeded | failed), stage, progress %, result or a plain-language error. Poll every few seconds. |
What a key can never do
- Reach another business, or do more than the person who created the key may do.
- Pay, change the subscription, top up, invite people, or create other keys.
- Switch ads on or raise budgets beyond the owner's controls; campaigns are created paused.
- Connect ad accounts: OAuth connections are made by the owner in Settings → Integrations.
Questions
- What is the SimplyAI MCP server?
- An MCP (Model Context Protocol) endpoint at /api/mcp. Any MCP client — Claude Code, Codex, Cursor and others — connects to it with an API key and gets tools to read and manage one business: profile, plans, campaigns, publishing, content calendar, leads, websites, products and marketplace listings, results and integrations. Instead of wiring Meta, Google, TikTok and Microsoft separately, the agent uses SimplyAI, which already holds the owner's connected accounts, controls and approvals.
- How do I get an API key?
- In SimplyAI → Settings → Developers & AI agents, an owner or admin creates a key for one business. It is shown once. Keys can be read-only or read-and-change, and can be revoked at any time.
- Can an agent spend money or switch ads on?
- Only within what the owner allows. Campaigns are created paused unless the call explicitly asks to activate; publishing is refused outside the owner's spend limits, dates, countries and allowed channels; approvals stay with the owner; and keys can never pay, change plans or create other keys. Some actions (generating creatives, content months, websites) use the owner's credits and say so.
- Is there a REST API too?
- Yes — the same operations are plain HTTPS endpoints with JSON, described by an OpenAPI 3.1 file. Authenticate with the API key as a Bearer token.
- Does the key give access to other businesses?
- No. A key belongs to one business (workspace) and acts as the member who created it, never with more rights than that person.
No account yet? Create a free one — the key lives under Settings once the business profile exists.