PopNow

Generate and edit images, videos, music, and voiceovers from MCP-compatible AI assistants with PopNow.

Hosted MCP Server

npx add-mcp 'https://api.popnow.ai/mcp'

Installs into Claude Code, Codex, Cursor and more

Documentation

PopNow

PopNow MCP Server — AI image, video & music generation for ChatGPT, Claude, Cursor and any MCP client

MIT License MCP Streamable HTTP TypeScript popnow.ai

The PopNow MCP Server is a hosted Model Context Protocol server at https://api.popnow.ai/mcp that lets ChatGPT, Claude, Cursor, VS Code and any other MCP client create AI images, videos, songs and voiceovers on PopNow, using your PopNow credits.

Ask in plain words ("turn this photo into a 5-second video", "make an upbeat synth-pop track") and the assistant picks the right PopNow tool, tells you the price, and returns the result in the chat. There is nothing to host: the server is remote, signs you in with OAuth 2.1, and uses the same models, prices and library as popnow.ai. It is also the home of PopNow's free Agent Skills: ask for a style for your launch video, deck or landing page and the assistant shows you presets to pick from. Make it pop.

This repository contains the public setup guide, copy-paste client configs in examples/, an MCP registry manifest, and @popnow/mcp, a tiny optional stdio bridge for clients that only run local servers.

Contents

Quickstart

  1. Copy the server URL: https://api.popnow.ai/mcp
  2. Add it to your client as a remote (Streamable HTTP) MCP server. For example, in Claude Code:
    claude mcp add --transport http popnow https://api.popnow.ai/mcp
    
  3. Sign in and ask. Your client opens a PopNow sign-in page the first time; press Allow, then ask for a picture, a video or a song.

No PopNow account yet? Sign up at popnow.ai and pick a credit pack when you need more credits.

Server URLhttps://api.popnow.ai/mcp
TransportStreamable HTTP, stateless (POST only; GET and DELETE return 405)
Sign-inOAuth 2.1 with PKCE and dynamic client registration, or Authorization: Bearer sk-popnow-...
Scopesgenerate (create with your credits) and read (balance, creations, model list)
ToolsGeneration, account and style-preset tools (listed below)
PriceSame credits as popnow.ai (1 credit = $0.001). Up to 300 credits starts at once; anything above waits for your yes. Style presets are free

Tools

ToolWhat it doesKey parametersTypical cost
create_imageMake a new picture from a descriptionprompt, aspect_ratio (default 1:1), model, max_creditsabout 48 credits (default Nano Banana 2.1)
edit_imageChange a photo with words: new style, outfit, background, add or remove thingsprompt, image_url / image, more_image_urls, aspect_ratio, model, max_creditsabout 48 credits
create_videoMake a short video from a description, or bring a photo to life (text-to-video and image-to-video)prompt, image_url / image, duration_seconds (default 5), aspect_ratio (default 16:9), model, max_creditsabout 185 credits for 5 s (default MiniMax H3); 1 to 3 minutes
create_musicMake an original song or instrumental trackprompt, lyrics, instrumental, voice (female / male), title, max_creditsabout 72 credits per song (Suno v6)
create_speechTurn text into natural speech in many voices and languagestext, voice (Kore, Puck, Charon, Aoede, Fenrir, Leda ...), style (whisper, empathetic, vocal_smile, newscaster, promo_hype, deadpan), max_creditspriced by length, about 20 credits per minute of audio
apply_effectTurn a photo into a trending effect video (Zombie Turn, Flying Car, Tiny Planet, Molten Gold, Hyperdrive ...) or a photo makeover (Clay Figure, Pixel Art ...)effect (name or id), image_url / image, max_creditsabout 125 to 340 credits per video, 30 to 50 per photo makeover; quoted first
remove_backgroundCut out the subject and make the background transparentimage_url / image, max_creditsabout 5 credits
upscaleMake a photo or video sharper and biggerimage_url / image or video_url, size (photos 2k, 4k, 8k; videos 720p, 1080p, 2k, 4k), max_creditsabout 12 credits for a photo; videos by length
get_jobCheck on a creation that is still running and return it when readyjob_id, wait_seconds (0 to 50, default 30)free
list_my_creationsShow your recent PopNow creations with linkskind (image, video, audio), limit (1 to 20, default 10)free
check_balanceShow how many credits you have left (and how many are held for running jobs)nonefree
list_modelsList the image, video and audio models, or every effect, with pricescategory (image, video, audio, effects)free
find_skillsFind ready-made style presets (Agent Skills) for what you want to make: product launch videos, slide decks, landing pages and websites, editorial images. Each option has a name, a one-line look, a preview video or picture, the PopNow generation it uses and what it needs locallyintent (your words), type (video, image, slides, web), limit (1 to 6, default 4)free
use_skillGet the preset you picked: its full playbook (SKILL.md), a short-lived signed download link for the whole package with install commands for your coding agent, and which PopNow tools run its generation stepsslug (from find_skills), agent (claude-code, codex, cursor, gemini-cli, github-copilot, opencode, or chat without a file system)free; each generation it runs is quoted first
  • Models. Every generation tool that takes model accepts a PopNow model id from list_models, so "use Seedance" or "make it with Wan" just works. Models include Kling, Seedance, Wan, Vidu, MiniMax, Nano Banana, GPT Image, Flux, Suno and more; the live list is always list_models (or GET /api/v1/models on the REST API).
  • Photos in. image_url takes a public https link or a popnow:// link from an earlier result. In ChatGPT, an attached photo arrives as the image file object.
  • Results out. Images come back inline as a preview plus a download link; videos and audio come back as links. Each result also has a permanent popnow:// link you can pass to another tool ("now animate that picture"). Everything is saved in your PopNow library.
  • Annotations. All tools carry the standard MCP hints. get_job, list_my_creations, check_balance, list_models, find_skills and use_skill are read-only, and no tool deletes anything.
  • Effects cover the same set as the Effects page. Two-person effects need two placed photos and are website-only.

Style presets: find_skills and use_skill

PopNow keeps a catalog of free Agent Skills: named styles for product launch videos, slide decks, landing pages and websites, editorial images and more, each with a preview and a full playbook that an AI agent follows to build the result. Two free tools bring the catalog into any MCP client:

  1. Find. The assistant calls find_skills with what you want to make, in your words (optionally type: video, image, slides or web). It gets up to 6 options (4 by default), best first, each with a name, a one-line description of the look, a preview link, the PopNow generation it uses and its local requirements.
  2. Pick. The assistant shows you the options with their previews and asks which one you want.
  3. Use. The assistant calls use_skill with the chosen slug and agent (claude-code, codex, cursor, gemini-cli, github-copilot, opencode, or chat in apps without a file system). The reply holds the full SKILL.md playbook, a short-lived signed download link to the complete package with the install commands for that agent, and which PopNow tools (create_image, create_video, create_music, create_speech ...) replace the playbook's own generation scripts.

Finding, downloading and using a preset is free. Only the images, video, music or voice it generates cost credits, quoted and confirmed like every other PopNow tool. Presets are licensed for your own and client work; please don't republish the packages. In a chat app without a file system the assistant can still follow the playbook's look and make the pictures with create_image; steps that run local scripts need a coding agent.

You:        I need a launch video for our note-taking app.
Assistant:  (calls find_skills with intent "launch video for a note-taking app", type "video")
            Here are three styles:
            1. <Preset A> - <its one-line look>. Preview: <link>. Uses PopNow video; needs Node.js.
            2. <Preset B> - ...
            3. <Preset C> - ...
            Which one do you like? The preset is free; only the clips it makes cost credits.
You:        The first one.
Assistant:  (calls use_skill with that slug and agent "claude-code", installs the package from the
            signed link, then follows the playbook)
            Installed. The first clip will cost 185 credits. Go ahead?
You:        Yes.
Assistant:  (calls create_video with max_credits: 185, then get_job, and keeps building the video)

Outside MCP, the same catalog is available through the open API (GET /api/v1/agent-skills, GET /api/v1/agent-skills/{slug}, and GET /api/v1/agent-skills/{slug}/download, which redirects to a signed link; an API key is required), the popnow-skill-finder skill in popnow-skills, and the website.

Connect your client

Every client below talks to the same remote server. OAuth sign-in is the default; each section also shows the API key alternative (see Authentication). Ready-made files are in examples/.

Claude (web, desktop and mobile)

Custom connectors are available on Claude plans and workspaces that allow them.

  1. Open Settings → Connectors (claude.ai/settings/connectors) in Claude on the web or in the desktop app.
  2. Click Add custom connector, name it PopNow and paste https://api.popnow.ai/mcp. Leave the advanced OAuth fields empty: Claude registers itself automatically.
  3. Click Connect, sign in to PopNow (Google, GitHub or an email code) and press Allow.

A connector added on the web also works in the Claude mobile apps. If you do not see Connectors, ask your workspace admin.

Claude Desktop (local config)

Prefer the connector above. If you want PopNow in claude_desktop_config.json instead (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json, Windows: %APPDATA%\Claude\claude_desktop_config.json), use the generic mcp-remote stdio bridge.

With OAuth (examples/claude-desktop-mcp-remote.json):

{
  "mcpServers": {
    "popnow": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://api.popnow.ai/mcp"]
    }
  }
}

With an API key (examples/claude-desktop.json):

{
  "mcpServers": {
    "popnow": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://api.popnow.ai/mcp", "--header", "Authorization:${POPNOW_AUTH}"],
      "env": { "POPNOW_AUTH": "Bearer sk-popnow-..." }
    }
  }
}

Keep Authorization:${POPNOW_AUTH} without spaces and put Bearer ... in the env block: some clients (Claude Desktop on Windows among them) do not escape spaces inside args. Restart Claude Desktop after editing the file. Both options need Node.js 18 or newer.

Claude Code

# OAuth: run /mcp inside Claude Code afterwards and choose PopNow to sign in
claude mcp add --transport http popnow https://api.popnow.ai/mcp

# Or with an API key
claude mcp add --transport http popnow https://api.popnow.ai/mcp \
  --header "Authorization: Bearer $POPNOW_API_KEY"

Add --scope user to make PopNow available in every project, or --scope project to share it through .mcp.json.

ChatGPT

Custom MCP servers depend on your ChatGPT plan and workspace settings, and menu names change as ChatGPT updates. The current path:

  1. Go to chatgpt.com/plugins, press + and choose Add custom MCP server.
  2. Name it PopNow, paste https://api.popnow.ai/mcp under Connection and pick OAuth as the sign-in method. Accept the warning, then choose Create as a plugin.
  3. Sign in to PopNow and press Allow.
  4. In a new chat, type @, pick PopNow and ask. Photos you attach are passed to PopNow directly.

Cursor

Add to .cursor/mcp.json in your project, or ~/.cursor/mcp.json for all projects (examples/cursor.mcp.json):

{
  "mcpServers": {
    "popnow": { "url": "https://api.popnow.ai/mcp" }
  }
}

Cursor starts the OAuth sign-in when it connects. With an API key instead (examples/cursor-api-key.mcp.json):

{
  "mcpServers": {
    "popnow": {
      "url": "https://api.popnow.ai/mcp",
      "headers": { "Authorization": "Bearer ${env:POPNOW_API_KEY}" }
    }
  }
}

The PopNow MCP page also has a one-click Add to Cursor button.

VS Code

Add to .vscode/mcp.json (note the top-level key is servers) (examples/vscode.mcp.json):

{
  "servers": {
    "popnow": { "type": "http", "url": "https://api.popnow.ai/mcp" }
  }
}

VS Code opens the sign-in page the first time the server starts. With an API key, let VS Code prompt for it and store it securely (examples/vscode-api-key.mcp.json):

{
  "inputs": [
    { "type": "promptString", "id": "popnow-api-key", "description": "PopNow API key (sk-popnow-...)", "password": true }
  ],
  "servers": {
    "popnow": {
      "type": "http",
      "url": "https://api.popnow.ai/mcp",
      "headers": { "Authorization": "Bearer ${input:popnow-api-key}" }
    }
  }
}

Windsurf

Open the MCP settings in Windsurf and edit the raw mcp_config.json (its location is in the official Windsurf MCP docs). Remote servers use serverUrl (examples/windsurf.mcp_config.json):

{
  "mcpServers": {
    "popnow": {
      "serverUrl": "https://api.popnow.ai/mcp",
      "headers": { "Authorization": "Bearer ${env:POPNOW_API_KEY}" }
    }
  }
}

Drop the headers block to sign in with OAuth instead. Press Refresh in the MCP panel after saving.

Cline

Open MCP Servers → Configure and add PopNow to cline_mcp_settings.json. Set type to streamableHttp explicitly; without it Cline falls back to the legacy SSE transport (examples/cline_mcp_settings.json):

{
  "mcpServers": {
    "popnow": {
      "type": "streamableHttp",
      "url": "https://api.popnow.ai/mcp",
      "headers": { "Authorization": "Bearer sk-popnow-..." },
      "disabled": false,
      "autoApprove": []
    }
  }
}

The Cline CLI can also sign in with OAuth: remove headers and use Authorize OAuth in the cline mcp wizard.

Codex CLI

# OAuth
codex mcp add popnow --url https://api.popnow.ai/mcp
codex mcp login popnow

Or edit ~/.codex/config.toml (examples/codex.config.toml); bearer_token_env_var reads an API key from your environment:

[mcp_servers.popnow]
url = "https://api.popnow.ai/mcp"
bearer_token_env_var = "POPNOW_API_KEY"

Other clients and your own code

Any client that speaks Streamable HTTP can use the same URL (examples/generic.json, examples/generic-api-key.json). Clients that only run local stdio servers can use mcp-remote (as in the Claude Desktop configs) or build @popnow/mcp from source.

From code, with the official TypeScript SDK (npm install @modelcontextprotocol/sdk):

import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';

const transport = new StreamableHTTPClientTransport(new URL('https://api.popnow.ai/mcp'), {
  requestInit: { headers: { Authorization: `Bearer ${process.env.POPNOW_API_KEY}` } },
});
const client = new Client({ name: 'my-app', version: '1.0.0' });
await client.connect(transport);

const result = await client.callTool({ name: 'check_balance', arguments: {} });
console.log(result.content[0].text);
await client.close();

With the Python SDK (pip install mcp):

import asyncio, os

from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client

async def main():
    headers = {"Authorization": f"Bearer {os.environ['POPNOW_API_KEY']}"}
    async with streamablehttp_client("https://api.popnow.ai/mcp", headers=headers) as (read, write, _):
        async with ClientSession(read, write) as session:
            await session.initialize()
            result = await session.call_tool(
                "create_image",
                {"prompt": "A paper boat on a rainy window sill, soft morning light", "aspect_ratio": "4:5"},
            )
            for part in result.content:
                print(part.type, getattr(part, "text", ""))

asyncio.run(main())

Or with curl. The server is stateless, so every request stands alone; send both media types in Accept:

curl -X POST "https://api.popnow.ai/mcp" \
  -H "Authorization: Bearer $POPNOW_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": {"name": "check_balance", "arguments": {}}}'

For production code that calls models directly, the PopNow REST API gives you every model parameter, webhooks, idempotency keys and per-task retention.

Authentication

OAuth 2.1 (default). PopNow is a standard OAuth 2.1 authorization server: authorization code with PKCE (S256), refresh tokens, dynamic client registration (RFC 7591) and client ID metadata documents. Discovery starts from the 401 on /mcp, whose WWW-Authenticate header points to /.well-known/oauth-protected-resource/mcp; server metadata is at /.well-known/oauth-authorization-server. The consent page shows the app's name and the two scopes, generate and read. Access tokens last one hour and refresh automatically; a connection stays signed in until it goes unused for 90 days. The AI app never sees your password or payment details.

API key (alternative). Scripts, CI jobs and agents without a browser can send a key from the API console as Authorization: Bearer sk-popnow-.... The key's model allow-list, IP allow-list and daily, monthly and lifetime spend caps apply, exactly as on the REST API. Give each agent its own key with a low daily cap, and keep keys out of files you commit: use your client's environment variable or secure input support.

Disconnect at any time in Account settings → Devices → Connected AI apps on popnow.ai. For key-based clients, revoke the key in the API console.

Credits, prices and confirmation

Connecting is free, and so are find_skills and use_skill. Every creation spends the same credits as on popnow.ai, at the same prices, from the same balance: 1 credit = $0.001. PopNow sells credit packs with no subscription, from Starter ($9, 9,000 credits) to Pro ($99, 120,000 credits including bonus), or any amount from $10 to $2,000 at 1,000 credits per $1; see pricing.

Every generation tool quotes first:

  • Up to 300 credits (an image, a song, a 5-second video on the default model): the job starts right away and the reply states what it cost.
  • Over 300 credits (longer or higher-resolution video, some effects): nothing starts. The tool answers Needs confirmation with the price and your balance, the assistant asks you, and when you agree it calls the tool again with max_credits set to the price you accepted.
  • Price moved between quote and start: nothing is charged and the reply gives the new price to confirm.
  • A creation fails: its credits are refunded automatically.

Identical calls from the same account within ten seconds create one job, so an assistant that retries does not pay twice. A tool waits up to about 40 seconds for the result; longer jobs (most videos) return a job_id and the assistant collects the result with get_job.

Rate limitValue
Tool calls per account (including get_job polling)240 per minute
New creations per account20 per minute

A creation over the limit is not charged; the tool says how many seconds to wait.

Example prompts

  • "Make a 4:5 picture of a paper boat on a rainy window sill, soft morning light."
  • "Edit this photo: put her in a red jacket and make the background a snowy street."
  • "Turn this product photo into a 5-second video with a slow camera push-in."
  • "Make a 9:16 video of a vintage car cruising along the coast at golden hour, 10 seconds." (over 300 credits, so the assistant asks first)
  • "Apply the Zombie Turn effect to my selfie."
  • "Write and produce an upbeat synth-pop song about a summer road trip, female vocals."
  • "Read this paragraph aloud in the Puck voice, newscaster style."
  • "Remove the background from this logo, then upscale it to 4K."
  • "What video models can you use, and how much does each cost?"
  • "How many PopNow credits do I have left? Show my last five videos."
  • "Find me a style for a pitch deck for our seed round." (find_skills, then use_skill; free)

A typical exchange:

You:        Make a 9:16 video of a vintage car cruising along the coast at golden hour, 10 seconds.
Assistant:  (calls create_video → "Needs confirmation … costs 370 credits (the user has 8450)")
            That's 370 credits from your PopNow balance. Want me to go ahead?
You:        Yes.
Assistant:  (calls create_video again with max_credits: 370 → job_id, then get_job)
            Here it is. It's saved in your PopNow library too.
You:        Now give me an upbeat synth-pop track for it.
Assistant:  (calls create_music → about 72 credits, under 300, starts at once)

The stdio bridge (@popnow/mcp)

packages/popnow-mcp is a minimal TypeScript package (bin popnow-mcp) for MCP clients that can only launch local stdio servers. It connects a StdioServerTransport to a StreamableHTTPClientTransport from the official MCP SDK and forwards every message unchanged, so tools and prices always match the live server.

It is published on npm as @popnow/mcp, so npx runs it with no install step:

{
  "mcpServers": {
    "popnow": {
      "command": "npx",
      "args": ["-y", "@popnow/mcp"],
      "env": { "POPNOW_API_KEY": "sk-popnow-..." }
    }
  }
}
Environment variableRequiredDescription
POPNOW_API_KEYyesPopNow API key (sk-popnow-...), sent as a Bearer token
POPNOW_MCP_URLnoRemote endpoint, default https://api.popnow.ai/mcp

To build and run it from source instead (Node.js 18 or newer):

git clone https://github.com/popnow-ai/popnow-mcp.git
cd popnow-mcp
npm --prefix packages/popnow-mcp install
npm --prefix packages/popnow-mcp test    # builds with tsc, then runs an end-to-end test against a local fake server
node packages/popnow-mcp/dist/cli.js --help

Then point your client at the built file:

{
  "mcpServers": {
    "popnow": {
      "command": "node",
      "args": ["/absolute/path/to/popnow-mcp/packages/popnow-mcp/dist/cli.js"],
      "env": { "POPNOW_API_KEY": "sk-popnow-..." }
    }
  }
}

MCP registry manifest

server.json describes the server in the MCP registry format (schema 2025-12-11): the remote Streamable HTTP endpoint with an optional Authorization header.

Troubleshooting

You seeWhyFix
No Connectors / Add custom MCP server optionYour plan or workspace does not allow custom connectorsAsk the workspace admin
"Please connect your PopNow account first."The client called a tool before sign-in finishedReconnect from the client's MCP or connector settings
"This connection wasn't given permission to do that."The connection was approved without the generate scopeDisconnect, connect again and press Allow
Needs confirmation, nothing started yetThe job costs more than 300 creditsSay yes; the assistant repeats the call with max_credits
"Not enough credits ... Nothing was charged."Balance too lowBuy a credit pack, or pick a cheaper model or a shorter video
"Too many creations at once. Nothing was charged."More than 20 new creations in a minuteWait the number of seconds in the message
401 with a WWW-Authenticate headerNo token, or the API key is wrong or revokedSend Authorization: Bearer with an active sk-popnow- key, or sign in again
405 Method Not AllowedGET or DELETE to /mcp; the server is statelessUse POST (any MCP client does this for you)
Cline connects but nothing workstype missing, so Cline used legacy SSESet "type": "streamableHttp"

FAQ

How do I generate AI images and videos from Claude or ChatGPT?

Add https://api.popnow.ai/mcp as a custom connector (Claude) or custom MCP server (ChatGPT), sign in to PopNow, and ask in plain words. The assistant calls create_image, create_video or another PopNow tool and returns the result in the chat.

How do I generate a video from an image with an MCP server?

Give the assistant a photo (attach it in ChatGPT, or paste a public https link elsewhere) and describe the motion. It calls create_video with image_url, which switches to image-to-video. About 185 credits for 5 seconds on the default model.

Is there an MCP server for AI music and text-to-speech?

Yes. PopNow's create_music makes original songs or instrumentals (Suno v6) and create_speech reads text aloud in many voices, languages and delivery styles.

Does it cost extra to use PopNow in ChatGPT, Claude or Cursor?

No. Connecting is free, and each creation costs the same credits as on popnow.ai. Failed creations are refunded automatically, and anything over 300 credits waits for your confirmation.

Do I need to install anything?

No. PopNow is a hosted remote MCP server; you only add its URL. Clients that cannot connect to remote servers can use mcp-remote, or run the optional @popnow/mcp bridge with npx -y @popnow/mcp.

Can I use an API key instead of OAuth?

Yes. Send Authorization: Bearer sk-popnow-... with a key from the API console. Spend caps and allow-lists on the key apply.

Which AI models does the PopNow MCP server support?

Image, video and audio models including Kling, Seedance, Wan, Vidu, MiniMax, Nano Banana, GPT Image, Flux and Suno, plus one-tap video effects. Ask the assistant to call list_models for the current list with prices, then name a model in your request.

How do I find a ready-made style for a launch video, slide deck or landing page?

Ask the assistant, for example "find a style for our product launch video". It calls find_skills, shows you a few presets with preview links, and after you pick one calls use_skill to get its playbook and install link. Presets are free; only the generations they run cost credits. You can also browse the catalog at popnow.ai/skills/agent-skills.

Where do my creations go?

You get a link in the chat, and everything is saved in your PopNow library, just like creations made on the website.

Links

Contributing

Issues and pull requests are welcome. See CONTRIBUTING.md. For security issues, see SECURITY.md.

License

MIT © PopNow