Guide

Ad accounts over MCP: connect Claude to your Apple, Google, Meta and TikTok campaigns

Loop runs a remote MCP endpoint in front of the ad networks it manages. Point Claude, or any MCP client, at it and the agent can see what each campaign spent, how many installs it brought and at what cost, which proposals are waiting in the inbox, and why the last change failed.

With a propose key the agent can also draft a new campaign or a change to a running one. The draft goes through the same checks as the Loop form and lands in the inbox. Nothing reaches the ad platform until a person approves it there.

Connect it in two minutes

Create a workspace and connect an ad account. Then open Settings › Team › API keys, pick a scope (read or propose) and create a key. The key starts with lmk_ and is shown once.

The server speaks Streamable HTTP and keeps no session state. Authenticate with the key as a Bearer token.

Claude Code

claude mcp add --transport http loop https://loopmarket.ing/api/mcp \
  --header "Authorization: Bearer $LOOP_API_KEY"

.mcp.json (any MCP client)

{
  "mcpServers": {
    "loop": {
      "type": "http",
      "url": "https://loopmarket.ing/api/mcp",
      "headers": {
        "Authorization": "Bearer ${LOOP_API_KEY}"
      }
    }
  }
}

The tools

Every tool works on the one workspace the key belongs to. A read key sees the read tools; a propose key sees both.

ToolKey scopeWhat it does
list_workspacesreadThe workspace the key belongs to, its currency and the key's scope.
get_overviewreadSpend, paid installs and cost per install against the previous period, the headline, measurement caveats and how many proposals wait.
list_campaignsreadEvery campaign Loop manages, with state, budget, and the spend and installs each network reported.
get_campaignreadOne campaign: its numbers, daily spend, pending proposals and what was executed on it.
list_proposalsreadThe inbox: proposals waiting for a person, ones a guardrail holds, and recent executions with each failure's message.
create_launch_draftproposeDraft a new campaign. Same checks as the Loop form; it waits in the inbox for approval.
prepare_campaign_changeproposeDraft a change to a running campaign: a budget move, a total cap, a max CPC, a new ad group, new ad copy, languages or an end date.
list_app_eventsreadThe Meta in-app events the app sends, usable as the optimisation event of a draft.
list_budget_testsreadBudget tests running inside guardrails, each with its window, the conditions that end it and where it stands now.

What an agent cannot do

Approve, reject or execute. Moving ad spend is a person's decision, so the agent stops at the draft and the approval stays in the Loop inbox.

Change guardrails, billing, connections or members. A key that could raise its own limits would make the limits meaningless. Keys cannot create keys.

Every draft and every refused call is written to the audit log under the key's name. One key can make 60 calls a minute.

Why go through Loop instead of the ad APIs directly

One shape for every network. The agent asks for campaigns and gets the same fields from Apple, Google, Meta and TikTok, in the workspace currency, instead of learning four APIs and their authentication.

Numbers that say when they are not decidable. get_overview carries the measurement caveats Loop shows people, so an agent does not read a two-day-old campaign as a failure.

A person in the loop by construction. Drafts wait for approval with budget caps already checked, so letting an agent propose changes does not mean letting it spend.

Point your agent at your own campaigns

Create a workspace, connect one ad account and make a read key. Your agent can ask about your own campaigns the same day.

14 days free. No card to create a workspace.