Layers Growth MCP
One MCP server that runs a TikTok growth loop from your repository. Setting it up is one paste into your coding agent, which installs the Layers CLI and runs setup for you. Prices, resources, and skills are on this page.
Layers Growth MCP is one MCP server that gives a coding agent a growth loop over the Layers platform. It holds a standing map of the accounts your product competes with, an evidence-ranked queue of content tests, an editable plan for the next test, delivery to a TikTok draft inbox, and a recorded result with the next test to run. It binds to one Layers organization and project through the repository you run setup in. The agent calls one named outcome per job. Every charge is quoted before it happens, and posting, spending, and billing changes each wait for a human click.
An Instagram account connects, satisfies onboarding, syncs, and is measured,
and its own posts can be remixed. Discovery, delivery, and managed accounts run
on TikTok today. No paid lane is certified yet: plan_paid_campaign refuses
every platform until the Paid Growth lane ledger records a live-certified row
for that lane.
Install
Set up Layers Growth for me so you can plan, render and deliver content for this product from here.
1. Install the CLI: run `npm install -g @layers/cli`.
2. Set it up: run `layers setup` from this repository. It opens my browser once for sign-in and waits for me; it writes the `.mcp.json` entry and the Layers skill into the repo and stores the session in my OS credential store, so nothing secret lands in the repo.
3. Read the skill at `.agents/skills/layers/SKILL.md`, then tell me what to post first.
Let me know when it is ready.Paste that into Claude Code, Codex, Cursor, or any coding agent working in your repository: the agent runs both commands, and the browser sign-in is the only step that needs a person.
Setup opens a browser once for OAuth sign-in. It stores the session in the
operating system credential store, so no token, key, or header is written into
the repository or into your agent's configuration. layers mcp and
layers call are the credential's only readers.
MCP clients read .mcp.json when they start, so the entry setup writes reaches
the client on its next start or after /mcp. In the session where setup just
ran, layers call <tool> calls the same tools over the same sign-in. Claude
Code holds a new repository server pending until you approve that entry once;
setup reports project_config_pending_approval and names the exact entry to
approve.
Manual setup
If you would rather run the commands in a shell:
npm install -g @layers/cli
layers setupWhat setup writes
| Path | Contents | Secret |
|---|---|---|
.layers/project.json | public project ID, public organization ID, environment, issuer, setup version | No |
.mcp.json | { "command": "layers", "args": ["mcp"] } merged under server name layers | No |
.agents/skills/layers/SKILL.md | thin pointer to the server-owned skill index | No |
.claude/skills/layers | relative symlink to the canonical skill where symlinks are supported | No |
Every file above is safe to commit. Setup is idempotent: running it again
repairs Layers-owned entries, leaves every other MCP server entry byte for byte
as it was, and creates no second project. For a client that does not read the
repository .mcp.json, setup registers the server through that client's own
command, such as codex mcp add layers -- layers mcp.
The tools
Twenty-seven outcomes make up the catalog. Prices are in credits and every
charge is quoted before the work runs. The Credits column lists each charged
action; anything not listed there is free. tools/list in your session is the
authority on what your agent can call: a tool is there because it ships, and a
tool Layers withdraws is deleted from the catalog by a release rather than
switched off under you.
Three profiles, and a project has to have a profile enabled before its tools admit a call. Growth is the default.
Growth
| Tool | What it does | Credits |
|---|---|---|
onboard_product | Binds the product, collects the facts no source can supply, starts the social and measurement connections, and starts the six background jobs a new project gets | 0 |
manage_growth_landscape | Pins, removes, or rescopes the tracked accounts, and requests an explicit refresh | 6 forced incremental refresh; 6 full rebuild |
find_growth_opportunities | Returns the strongest current tests with source evidence, effort, and prior use | 0 read; 2 per creative preview produced |
plan_content_experiment | Turns one opportunity into an editable plan with one controlled variable, a target account, a measurement window, and a success gate | 6 new plan or structural revision |
generate_influencer | Creates one persona for the project from a gender, an age range, and an optional one-line look, and returns its id and a link to the portrait slate straight away while the portrait is drawn | 0 |
add_brand_asset | Puts one of the project's own product assets into Layers from a public https URL, so a render has something of yours to composite | 0 |
render_content | Renders reviewable content from an approved plan revision or straight from a brief with no plan. One output per call | 25 static image; 85 slideshow; 200 video; 400 extended video |
deliver_content_experiment | Prepares a rights-cleared artifact, takes artifact-level approval, and delivers it to a TikTok draft inbox or posts it | 5 per delivered target |
track_growth_experiment | Registers a post you published yourself as an experiment with its hypothesis and source lineage | 0 |
review_growth_results | Reads the evidence, records the verdict, and names the next controlled test | 1 forced provider read |
install_growth_measurement | Puts the Layers SDK in this product's own repository and confirms it reports, so installs and revenue resolve back to the post that produced them | 0 |
generate_tracking_link | Mints a named tracking link as a stored row: a label and tags for your own reports, the five UTM fields for the ad network, a payload the app receives on first launch, and a destination that is either the app store or a web address with the click id appended | 0 |
archive_tracking_link | Takes one link out of the working inventory, and puts it back. The URL keeps resolving and the clicks keep recording either way | 0 |
configure_growth_measurement | Sets the App Store URL, the Play Store URL, the fallback URL and the clipboard switch on the product's measurement app, which is the fix for the tracking link's only refusal | 0 |
manage_bio_page | Publishes a link-in-bio page at <slug>.layers.click made of tracking links, states the buttons on it, edits the five tokens it renders with, or takes it down | 0 |
configure_conversions_forwarding | Points one ad platform's conversions destination at the product, says which conversion it counts and which traffic reaches it. It takes no access key: when the destination has none on file the result hands back a signed page a person opens to paste one | 0 |
decline_next_step | Records the person's answer to an offer layers://next made: declined, or not before a date they name. One row per offer, and a later answer overwrites it | 0 |
research_tiktok_creator | Reads one TikTok creator by handle: followers, posts, bio, bio link, verified and private flags, avatar, profile URL, and the date the account was created | 1 per call |
research_tiktok_creator_posts | Reads one creator's recent posts, newest first, with views, likes, comments, shares, saves, length, cover and sound | 1 per call |
research_tiktok_search | Searches TikTok for public posts on a topic, with the same numbers plus the poster's handle and follower count | 1 per call |
research_tiktok_hashtag | Reads one hashtag: post count, total views, average views per post, its momentum against its own history, and recent posts | 1 per call |
research_tiktok_trending_sounds | Reads the TikTok sound chart as it stands: title, artist, length, post count, whether anybody sings on it, a preview URL, and cover art | 1 per call |
halt | Stops queued and running work in scope and returns a receipt per target | 0 |
cancel_trial_auto_renewal | Previews and confirms cancellation of the trial renewal | 0 |
send_feedback | Sends a message to the Layers founders, who read every one. It works for a workspace that has run out of credits or has billing paused | 0 |
A creative edit changes the script, opening, caption, or tags, and it is free however many times you make it. A structural revision changes the source, hypothesis, controlled variable, format, target account, or schedule, and it costs the same 6 credits as a new plan because the server recomputes the plan. Every revision is recorded and supersedes the previous one.
One render_content call starts one generation and returns one job, so it
charges one rate. Rendering more is calling again. An unusable output is
refunded. Reading stored results costs nothing, and a forced refresh that
causes no provider read creates no debit.
Paid media
Ad spend is your own money at the provider. It never consumes credits and never hides inside a credit quote, and every campaign runs under a spend authority a human granted.
| Tool | What it does | Credits |
|---|---|---|
plan_paid_campaign | Produces a mutation-free campaign plan from a proven source or a bounded demand brief, echoing back the caps and stop rules you stated | 0 |
start_experiment | Starts an experiment from the post the Content Planner already picked: you send the daily budget, Layers supplies the post, the network and the schedule, and it answers with the same plan | 0 |
resume_paid_setup | Continues the plan a setup handoff belongs to: send the handle the handoff carried, and Layers re-reads the provider and returns the same plan | 0 |
create_approved_campaign_draft | Builds the non-delivering TikTok campaign drafts one exact plan describes | 10 per campaign that reads back complete |
launch_approved_campaign | Previews or confirms delivery for one campaign, and is also how a paused campaign starts delivering again | 0; the provider bills the ad spend to your own ad account |
apply_approved_campaign_change | Previews or confirms one bounded change to one campaign: move the daily total, or delete the campaign at the provider | 5 on confirm |
set_daily_budget moves one campaign's daily total. delete_campaign removes
the campaign at the provider, including one that is delivering right now, and a
deleted campaign cannot be resumed. Both preview for free, both cost 5 credits
on confirm, and both report success only after the provider reads the change
back.
Managed distribution
A Layers-operated fleet is billed in dollars from the organization's cash wallet, at $150 per account per month. That is separate money from credits.
| Tool | What it does | Credits |
|---|---|---|
plan_managed_distribution | Quotes a fleet of Layers-operated TikTok accounts. Quoting reserves nothing and holds nothing | 0 |
provision_approved_managed_accounts | Orders the exact fleet one plan quoted. This is the call the cash wallet is charged on, at the monthly rate above | 0 |
release_managed_accounts | Previews or confirms giving managed accounts back, with what money comes back and what the current period keeps | 0 |
What onboarding sends
Your agent reads the repository on your machine and submits a short product
brief: name, one-line description, category, target users, the problem, the
conversion goal, seed keywords, known social handles, and store identities.
Layers never receives your source code. No file, path, diff, or excerpt is sent.
The request carries the brief fields, one digest, and a closed list of evidence
classes such as package_manifest and readme.
Onboarding starts what a browser onboard starts, when a browser onboard starts
it. It names six jobs, and the two blocks fill at different moments.
kickoffs carries the five that run as soon as the project exists, before any
account is connected: the app-store or website screenshot harvest, the branded
end card, the first persona, the first reel that joins the last two, and the
keyword research that builds the hashtag bank. They are named on a result still
waiting for a social connection, so the wait is not an idle one. landscape
carries the sixth, the tracked-account discovery walk, which runs once an owned
account is connected because it walks out from the account you own; it also
restates the keyword job already in flight. Each id reads back at
layers://jobs, and all six are free.
A project onboarded from an App Store or Google Play listing also gets its mobile app layer, its store listing record and its bundle id at the same moment, which is what lights the App Store Optimization surface in the app.
It creates no schedule, campaign, managed account, standing automation, provider mutation, or charge. Connecting a social account grants read access, and it cannot turn on posting, cadence, replies, or autopilot.
Free resources
Resources read stored state. They are free, they never trigger a provider read or a model call, and each one reports when its data was observed and which tool refreshes it.
| Resource | What it holds |
|---|---|
layers://next | the one move this project is at and the rows that follow it: a tool to call now with complete arguments and its price, a link to hand a person, a purchase that funds the move already chosen, or a wait with the time to come back. Beside it, the presence tier the decision table branched on and the inputs that decided it, every row of the table with what happened to it, and the answers already given to an offer. The same step rides every tool result in the envelope's next field, without the rows that follow |
layers://account | identity, plan or trial, credit balances, reserved credits, profile availability, active offers, and a human billing link. layers://account/credit-events pages every balance change |
layers://workspace | product brief, growth goal, connected accounts, measurement readiness, and posting policy |
layers://landscape | ranked tracked accounts, pins, exclusions, scope, freshness, and source evidence |
layers://opportunities | the standing ranked queue, with full source evidence per opportunity |
layers://experiments | experiment summaries, the current projection per experiment, and the append-only event ledger |
layers://influencers | the project's personas, each with the look it was generated from, its portrait, and whether it is still being drawn, plus slateUrl, a page you can hand to a person who wants to see the faces |
layers://brand-assets | the project's own product media a render composes: app screenshots, demo videos and end cards, each with a stable id render_content accepts |
layers://music | the curated tracks a render can be scored with: title, artist, length, whether anybody sings on it, and a preview URL to play a person |
layers://measurement | what the project spent beside what Layers recognized over one window: ad spend per platform with how much of it is settled, recognized revenue per channel, the frozen D7, D30 and D90 cohort figures, and installs as observed, proven and claimed, with the arbitration between them. It names every figure that is unknown rather than zero |
layers://jobs | active and recent jobs with state, receipts, errors, and recovery steps |
layers://artifacts/<id> | one rendered artifact by the cnt_ id its job named: whether it is ready, whether it is video, slideshow or image, the addresses to look at, the measured bytes with dimensions and duration, and the job and experiment it came out of |
layers://tracking-links | every link this project has minted, newest first, with its label, its tags, its UTM fields and what it did over the last 30 days: clicks, store taps, installs attributed to one of its clicks, and the revenue that followed. Filter by tag and by the surface that minted it; read one at layers://tracking-links/<id> |
layers://clicks/<click id> | one tap: when it happened, the platform it routed to, the link it came from, its UTM fields, the install it produced with the match method and confidence tier, and the revenue that followed |
layers://events | the product events the SDK reported over a window: every event name with its count, its distinct people, when it was first and last seen, and a country rollup. Never a single event row |
layers://revenue | what the product earned from its own billing: a daily series per source, the monthly and annual run rate, subscribers, trials, churn and lifetime value, the trial forecast, and each source stated as ready, degraded or unavailable |
layers://attribution | which installs Layers could tie to a click and by what evidence: installs by method and rung, the resolve funnel with its five outcomes, the SKAdNetwork postbacks received, decoded and relayed on, and the residual with its causes |
layers://sdk-health | whether the SDK in the field is reporting at all: the versions in use with the installs behind each, the newest beacon and event, the events accepted, delivered and dropped with reasons, and whether the build is behind the current release |
layers://conversions | where the product's conversions are forwarded, per ad platform: whether it is on, which destination is bound and what class it is, what it counts, the delivery counts over 30 days, and the circuit breaker. Never an access key |
layers://bio-page | the hosted page at <slug>.layers.click: whether it is published, the icon, name and tagline it leads with, the five tokens it renders with, its buttons in order with the tracking link behind each one and what that link did, and how many people and how many crawlers opened the page each day |
layers://skills/v1 | the skill index and each skill body |
A client without MCP resource support gets one extra read-only tool,
read_layers_state, which returns the same data and makes the same
authorization decision. It reaches every resource above except
layers://campaigns, so a paid-media projection needs a resource-capable
client.
Skills
The server owns the skill bodies and setup installs one thin pointer at
.agents/skills/layers/SKILL.md. The pointer names the server, the project
binding rule, and the pinned major version. Skills carry judgment about when to
use an outcome and how to read the result. They hold no credentials, no prices,
and no tool of their own.
| Skill | Profile | Job |
|---|---|---|
niche-map | growth | Build and curate the standing map of direct, adjacent, and inspirational accounts |
what-to-post | growth | Take one opportunity through a plan, an optional render, approval, and delivery |
growth-review | growth | Read early or final evidence, state the uncertainty, and pick the next controlled test |
outcome-log | growth | Register work you posted yourself and keep the hypothesis, result, and next decision together |
paid-growth | paid media | Promote an owned post under exact spend authority |
managed-distribution | managed distribution | Plan, approve, monitor, and release a disclosed managed fleet |
Pricing
Credits pay for the work the agent asks for. One organization holds one credit balance, and the same operation costs the same number of credits on every plan.
| Plan | Price | Credits |
|---|---|---|
| Pay as you go | $0 per month | none included |
| Pro monthly | $49 per month | 5,000 per month |
| Pro annual | $468 per year, $39 per month | 5,000 each month |
| Ultra monthly | $199 per month | 25,000 per month |
| Ultra annual | $1,908 per year, $159 per month | 25,000 each month |
Pay as you go costs nothing a month and includes no credits. It needs a card, and credits are bought in packs at 2 cents each. It is the way in for a workspace that wants to pay for exactly the work it asks for.
The trial is the first week: 7 days, $9 today, a card required, and 1,000 credits. The first landscape build is included, so the trial can reach opportunities without spending them. The trial converts to Pro monthly at $49 unless it is cancelled first, with the $9 credited toward the first month.
Subscriptions auto-renew until a human cancels them. Your agent can cancel the
trial renewal for you with cancel_trial_auto_renewal: the first call previews
the trial end, the effective date, what you keep, and what you lose, and returns
a link. Cancellation itself takes your click on that Layers page. No MCP tool
can complete a checkout, start a plan, or change a renewal on its own.
One-time packs add credits to the same balance and do not expire. There are two sets of prices, and a workspace buys from the one its plan puts it on.
| Pack | Credits | On a plan | On pay as you go |
|---|---|---|---|
| Crawl | 1,000 | $9 | $20 |
| Walk | 4,000 | $29 | $80 |
| Run | 10,000 | $69 | $200 |
| Scale | 20,000 | $129 | $400 |
layers://account reports which set applies to you, at
creditPacks.eligibility.observed.packAudience, and every pack price it lists is
the price your card is charged. A checkout link for the other set is refused.
Ad spend and managed-account fees are separate money. They never consume credits and never hide inside a credit quote.
Available today
Verified against the server source on 2026-09-02. tools/list in your session
is the authority: every tool in the tables above is in the catalog, and a bound
project with that tool's profile enabled can call it.
Growth is the profile a new project starts on. Paid media and managed distribution each wait on their own explicit human enablement, and neither adds a network-prefixed or provider-prefixed tool.
A few of the growth outcomes carry detail the table has no room for.
manage_growth_landscapecharges only for a refresh. A full rebuild costs the same six credits as a forced incremental one and runs the same discovery crawl.find_growth_opportunitiesreads the stored queue. The default read starts no vendor call, no model call, and no charge.includeCreativePreview: "generate"makes the creative analysis for the returned cards that have none yet, at two credits for each preview actually produced and nothing for a card it could not analyze; each one is cached, so a later read of the same card is free.quoteOnlyreturns the same cards and that price without producing anything.generate_influenceris free.layers://influencersis where the persona is read back once its portrait lands, andslateUrlon both surfaces opens a page of the project's portraits for a person to look at.render_contentrenders one output a call. A remix reads video or slideshow off the post it adapts and charges the matching rate;layers://brand-assetsandlayers://musicare where the screens and the track it can be directed with are read.- The five
research_tiktok_*reads each cost one credit a call whatever the row count, charged on the call.research_tiktok_trending_soundsandlayers://musicanswer different questions: the chart is what TikTok is playing, and the resource is what a render may legally be scored with. review_growth_resultsreads stored evidence for nothing and pays one credit only for a forced provider sync.haltcovers one job, one experiment, one social account, one paid campaign, one managed account, or the whole project. On a campaign it pauses provider delivery and withdraws the approvals that campaign holds.
Two earlier surfaces were retired on 2026-08-30 with no bridge and no
compatibility shim: the npm package @layers/mcp-server, including the keyless
onboarding mode it started in without a key, and the growth MCP that served the
protocol at growth.layers.com. Do not install or call either one. That
hostname now serves the landing site for this server and no protocol. The
Growth page covers the retired growth MCP. The product contract
for this server, including where the outcome of every retired tool went, is
docs/specs/layers-mcp-product.md in the Layers repository: section 15.2 for
the 26 growth tools and section 15.3 for the 52 API-backed tools and the five
keyless tools. The REST routes those tools mirrored are unchanged.
Support
Ask in the in-app chat at app.layers.com, or email support@layers.com. For a security report, email security@layers.com.
Layers also has a public REST API for building against the platform directly. See API.