Skip to content

Developer docs

Build with MCP

Add one URL to your assistant, sign in with Google, and it can run your marketing — products, strategy, calendar, contents, approvals, reports, resources, automations — and generate media, all through Model Context Protocol tools.

  • Claude Code
  • Claude
  • Cursor
  • ChatGPT
  • OAuth
  1. 1

    Run this in your terminal

    claude mcp add --transport http poremu https://api.poremu.ai/mcp
  2. 2

    When Claude Code opens the browser, sign in with Google and press Allow.

  3. 3

    Done. Try “use poremu to make a 9:16 image of…”. Type /mcp inside Claude Code to check the connection.

Docs server (no sign-in)

Lets the assistant read this developer guide so it can write the integration for you.

claude mcp add --transport http poremu-docs https://api.poremu.ai/mcp/docs

No key to paste

Your client discovers Poremu’s OAuth 2.1 server, opens a Google sign-in, and gets a short-lived token that refreshes itself. Everything runs as you — your credits, your plan, your adult-verification status. Disconnect anytime under Connected apps.

The whole Poremu API is exposed as Model Context Protocol tools over Streamable HTTP. Connect once, then say "use poremu to…".

ServerURLAuthWhat it does
poremuhttps://api.poremu.ai/mcpSign in with Google (OAuth) or API keyMarketing (products → strategy → calendar → contents → approvals → reports), resources, automations, image & video generation, LLM chat, library, apps
poremu-docshttps://api.poremu.ai/mcp/docsnoneSearch and read this developer guide — so your assistant can write integrations against the REST API

Connect

Claude Code — one command, then sign in with Google when the browser opens:

bash
claude mcp add --transport http poremu https://api.poremu.ai/mcp

Add --scope user to make it available in every project. Ask anything that needs Poremu — or type /mcp, pick poremu, choose Authenticate, sign in and press Allow. To disconnect: claude mcp remove poremu or Settings → Developer → Connected apps.

Claude.ai / Claude Desktop — Settings → Connectors → Add custom connector → URL https://api.poremu.ai/mcp → Connect, finish the Google login.

Cursor (.cursor/mcp.json) — Cursor shows a Needs login button after you save:

json
{
  "mcpServers": {
    "poremu": { "url": "https://api.poremu.ai/mcp" },
    "poremu-docs": { "url": "https://api.poremu.ai/mcp/docs" }
  }
}

ChatGPT — Settings → Connectors → Advanced → Developer mode → Create connector → MCP server URL https://api.poremu.ai/mcp → authentication OAuth → Create, then sign in.

Servers · CI · headless — any client that cannot open a browser sends an API key from Settings → Developer → API keys:

bash
claude mcp add --transport http poremu https://api.poremu.ai/mcp --header "Authorization: Bearer pk_live_…"
json
{ "mcpServers": { "poremu": { "type": "http", "url": "https://api.poremu.ai/mcp", "headers": { "Authorization": "Bearer pk_live_…" } } } }

Both ways act as you: tools use your workspaces, credits, plan limits and adult-verification status. Under the hood OAuth is standard 2.1 with PKCE and dynamic registration — see Authentication.

First session

text
use poremu: list my products
→ use the one called Lumo
→ compare the last 7 days with the week before and tell me the bottleneck
→ fill the next two weeks of the calendar from the recommended template
→ write three Instagram post variants for the launch and save them as drafts
→ if CPA is above ₩9,000 on Meta, request a 20% budget cut (I'll approve it in the inbox)
→ build a report for last week and give me the share link

Every marketing tool takes an optional workspaceId (default: your personal / only workspace) and productId (default: the product set with use_product, else the most recent one). Call marketing_help for the suggested order.

Tools

Reads are free. Writes cost the platform credits shown; media is charged at the model's price. External actions — budgets, publishing, sending, campaign creation — are never executed by a tool: they become approval requests in the workspace inbox.

Products & strategy

ToolWhat it doesCredits
marketing_helpThe recommended order and billing summaryfree
list_products · get_product · use_productProducts of the workspace; full detail (brand kit, audiences, latest strategy per section, funnel, channels); set the default product for this sessionfree
list_strategy_templates · recommend_templates100 strategy templates (product kind × goal × category, no fixed duration); recommendations scored on kind, goals, budget, channels, lifecycle and recent metricsfree
analysis_briefEverything needed to analyse a product: site, store listings and GitHub as text, brand kit, existing strategy, recommended template scaffold, writing instructions and the JSON schema save_strategy accepts1
save_strategyStore the seven sections you wrote (positioning, messaging, audience, channel_mix, kpi, budget, plan) as new strategy-doc versions, replace AI audiences, fill empty brand tone / forbidden words1
update_strategy_section · add_noteNew version of one section (markdown or structured data); a product note1 · free
analyze_productIn MCP mode returns the same brief as analysis_brief (the server-side analyser runs only in CREDITS / own-key mode)1

Metrics

ToolWhat it does
get_metricsPeriod totals per channel scope — spend, impressions, clicks, conversions, installs, revenue… with ctr / cpc / cpa / cpi / roas recomputed; groupBy day / channel / scope
compare_periodsLast N days vs the N before, with deltas
get_funnelFunnel stage values, conversion rates and the bottleneck
top_creativesCreatives / campaigns / ad sets ranked by a metric
record_metricsUpsert daily metrics for a manual channel

Calendar, contents & media

ToolWhat it doesCredits
list_events · create_event · move_eventRead, add and move calendar events (campaigns, publishes, tasks, milestones)free
fill_calendarDraft events from the product's strategy template (one week per stage, routines as rrule), starting next Monday by defaultfree
generate_copyCopy variants for a channel spec (meta_feed_1x1, instagram_post, google_rsa, hook_set, newsletter, naver_blog, …) that follow the brand kit; saved as DRAFT contentsLLM tokens + 1
generate_image · generate_videoImage / video attached to a DRAFT content itemmodel price
list_contents · update_content_statusContent list; move between IDEA · DRAFT · REVIEW · APPROVED · SCHEDULED · REJECTED (publishing goes through approvals)free
create_contentRegister content you already have (copy, articles, images, videos) without generating: title, spec, body, assetIds, channelId, campaignId, scheduledAt (→ SCHEDULED + calendar slot). Author shows as AIfree
get_contentOne item in full: body, media URLs, the spec's fields and limits (fields), over-limit fields (limitIssues), policy warnings, webUrl of the web editorfree
update_contentEdit anything: body (replace) or bodyPatch (merge, null removes a key), assetIds (replace + order) or addAssetIds / removeAssetIds, spec, channel, campaign, status, scheduledAt (null unschedules). Pass expectedUpdatedAt from get_content to get CONFLICT instead of overwriting someone's editfree
import_media · upload_mediaMedia for contents: import_media(url) copies a public image / video (≤ 50 MB, optionally straight onto contentId); upload_media returns a presigned PUT for a local file (images ≤ 20 MB, videos ≤ 500 MB)free

Resources (자산)

ToolWhat it does
list_resourcesKnowledge, links, accounts, integrations and data sources plugged into a product (or the whole workspace)
get_resourceOne resource with its full text (≤ 12,000 chars). Secrets are never returned
add_resourceRegister a text or link as knowledge and plug it into the product. Do not send keys or passwords — the user registers those in the app

See Resources for the REST side.

Automations

ToolWhat it does
automation_catalogNode types with config and outputs, condition operators, cron presets, limits, templates — read it before building
create_automationCreate from a node graph (trigger → data → condition → action → email) or a templateId (weekly-report-email, spend-spike-alert, daily-ai-checkup)
update_automation · delete_automationChange the graph or settings, turn it on (enabled: true requires zero issues), delete
run_automationRun now (manual runs use your credits)
list_automations · get_automation · list_automation_runs · get_automation_runInventory, detail, run history with per-node steps

Example: "Create an automation that every weekday at 09:00 pulls yesterday's metrics, and if spend rose more than 30% emails me the numbers." See Automations.

Approvals & reports

ToolWhat it doesCredits
request_approvalAsk for an external change (BUDGET_CHANGE, PAUSE_RESUME, PUBLISH_POST, SEND_EMAIL, …) with evidence; an admin decides in the inbox, then it executesfree
create_proposalA suggestion for review (strategy, budget, creative, schedule) with optional suggested actionsfree
list_pending_approvalsWhat is waitingfree
build_reportPeriod report (numbers, channels, trend, your summary) with a share link5

Connected channels

When a workspace has connected ad accounts, their tools appear too: meta_list_campaigns, meta_get_insights, google_ads_list_campaigns, google_ads_get_report, ga4_run_report, sheet_read, naver_ads_list_campaigns, naver_ads_get_report (reads) and meta_update_budget, meta_pause, google_ads_update_budget, google_ads_pause, naver_ads_update_budget, naver_ads_pause (approval requests).

Media, chat & apps

ToolWhat it doesCredits
list_models · estimate_cost · prompt_improveModels with parameters and prices; quote before running; sharpen a promptfree · free · ~1–2
generate_image · generate_video · get_generation · wait_for_generation · list_generations · delete_generationGenerate and track media (outputs are CDN URLs)model price
list_library · search_library · get_asset · favorite_asset · unfavorite_assetYour libraryfree
publish_generation · unpublish_generation · explore_feedExplore community feedfree
chat · list_chat_sessions · get_chat_sessionLLM chat with sessions (default gpt-5.4-mini)per token
list_apps · get_app · run_app · get_app_run · wait_for_app_runMulti-step apps (chat → image → video)step prices
get_balanceCredits and planfree

Product analysis over MCP

Over MCP the thinking happens in your client, so analysis is a two-step loop instead of one server call:

  1. list_products → use_product(productId)
  2. analysis_brief(urls?, notes?) — sources as text (≤ 20k chars each, up to 6), brand kit, existing strategy, recommended template scaffold, instructions and the outputSchema
  3. Write the seven sections per the instructions — channel kind values from the catalog only, numbers only when a source backs them
  4. save_strategy(sections, audiences?, brandKit?, facts?, summary?) — sections last written by a person are skipped unless overwriteHuman: true

"Read my product with analysis_brief, write the seven strategy sections and store them with save_strategy."

Docs server

https://api.poremu.ai/mcp/docs needs no authentication and exposes this guide as tools — list_docs, search_docs(query), get_doc(slug) — and as poremu://docs/<slug> resources. Add it next to poremu and ask "read the Poremu docs and write a Python client that creates a product, fills the calendar and listens for approval webhooks".

bash
claude mcp add --transport http poremu-docs https://api.poremu.ai/mcp/docs

Billing

An MCP connection runs the workspace in "my subscription" mode: your client does the reasoning, Poremu charges a small platform fee per marketing tool call — reads free, analysis / strategy / content writes 1, reports 5 — plus model prices for images and videos. API calls are free up to 1,000 per day, then 1 credit per 100. The web agent (POST /v1/agent/chat) and the server-side analyser also bill LLM tokens; see Credits & pricing.

Troubleshooting

  • 401 with WWW-Authenticate: Bearer resource_metadata=… — the client sent no credentials; it should start the OAuth flow. Older clients that cannot: use an API key.
  • VALIDATION_ERROR: productId가 필요해요 — call list_products then use_product, or pass productId.
  • PENDING from a write tool — that tool is an external action; it created an approval. Point the user to the inbox.
  • ADULT_VERIFICATION_REQUIRED / NSFW_DISABLED — the account has not enabled unfiltered models; fix it in Settings on the web.
  • Disconnecting — Settings → Developer → Connected apps → Disconnect, or DELETE /v1/me/connections/{id}. Revoking an API key disconnects clients using that key.