# Layers Growth MCP (/docs/mcp)



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 [#install]

```text
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 [#manual-setup]

If you would rather run the commands in a shell:

```bash
npm install -g @layers/cli
layers setup
```

## What setup writes [#what-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 [#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 [#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 [#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 [#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 [#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 [#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 [#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 [#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 [#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_landscape` charges 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_opportunities` reads 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. `quoteOnly` returns the same cards and that price without producing anything.
* `generate_influencer` is free. `layers://influencers` is where the persona is read back once its portrait lands, and `slateUrl` on both surfaces opens a page of the project's portraits for a person to look at.
* `render_content` renders one output a call. A remix reads video or slideshow off the post it adapts and charges the matching rate; `layers://brand-assets` and `layers://music` are 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_sounds` and `layers://music` answer different questions: the chart is what TikTok is playing, and the resource is what a render may legally be scored with.
* `review_growth_results` reads stored evidence for nothing and pays one credit only for a forced provider sync.
* `halt` covers 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](/docs/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 [#support]

Ask in the in-app chat at [app.layers.com](https://app.layers.com), or email
[support@layers.com](mailto:support@layers.com). For a security report, email
[security@layers.com](mailto:security@layers.com).

Layers also has a public REST API for building against the platform directly.
See [API](/docs/api).
