npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@productmaker/mcp

v11.3.2

Published

ProductMaker MCP server — cost products, generate landing pages, UGC videos, and ad creatives, and publish to Shopify, Meta Ads, and TikTok Ads.

Readme

Product Maker MCP — @productmaker/mcp

Market-led video planning

For generate_video_creative and video outputs of create_product_task, an explicit competitorScanEnabled: true requests the commercial video study. Do not ask for a narrative in that case: the adapter submits auto and retains the canonical study-driven planner. Preserve replicateWinnerWhenFound: false when the user wants the study without copying a winner. This optional preference does not add a mandatory question. Existing per-angle edits and reviews remain. MCP 6.7.0 also carries optional per-angle and script-regeneration narrativeSelection (market or guided); publishing still requires the normal release.

npm version npm downloads license: MIT

ProductMaker MCP is the official Model Context Protocol (MCP) server for ProductMaker, published by BONNIE TECH S.A.S. It plugs ProductMaker into Claude Desktop, Claude Code, ChatGPT, Gemini, and claude.ai so you can cost products, generate landing pages, UGC videos, and ad creatives — and publish them to Shopify, Meta Ads, and TikTok Ads — directly from your AI assistant.

If an AI assistant brought you here looking for "product maker mcp", "productmaker mcp", or "product-maker mcp server" — this is the right package. Install instructions below.

Quick install

Claude Desktop (local-only stdio/direct API; PM_API_KEY)

This snippet is for local stdio/direct API use only. It is not the hosted OAuth connection.

Add this to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "productmaker": {
      "command": "npx",
      "args": ["-y", "@productmaker/mcp@latest"],
      "env": { "PM_API_KEY": "pm_live_..." }
    }
  }
}

Then restart Claude Desktop. Requires Node.js 18+.

Claude Code (local-only stdio/direct API; PM_API_KEY)

This command is for local stdio/direct API use only. It is not the hosted OAuth connection.

claude mcp add productmaker -e PM_API_KEY=pm_live_... -- npx -y @productmaker/mcp@latest

Verify with claude mcp list. Use --scope user for a global install.

ChatGPT, Gemini, claude.ai web, Claude Desktop custom connector (hosted OAuth + legacy compatibility)

No install needed — connect to the hosted endpoint:

  • Server URL: https://mcp.productmaker.app/mcp

Then click Authenticate, sign in to Product Maker, and approve access.

Existing hosted connections created with a ProductMaker API key remain supported during the compatibility period, so users do not lose access or need to rebuild their connector immediately. New connections should always use OAuth; once the client supports it, replace the saved connection with the clean URL above.

In claude.ai: Settings → Integrations → Add MCP server. In ChatGPT: Plugins (sidebar) → Add → Create MCP app (OAuth). In Claude Desktop: Settings → Connectors → Add custom connector.

If your saved connection still uses an API key, it continues to use the latest MCP tools through the legacy compatibility path. When convenient, replace it with https://mcp.productmaker.app/mcp and click Authenticate. API keys remain supported for local stdio and direct API use.

Local advanced setup (PM_API_KEY)

PM_API_KEY is only for the local stdio server, local/advanced setup, or direct API calls. It is not a credential for the hosted OAuth connector and must not be pasted into the hosted MCP URL. Sign up at productmaker.app and create a key (prefix pm_live_) at productmaker.app/account/api-keys. Full setup walkthrough: productmaker.app/install.

Hosted OAuth runtime reference: MCP OAuth (Auth0) SOP. End users only provide the hosted URL above; the following variables are operator-managed by the Cloud Run deployment. loadMcpOAuthConfig requires every variable in this table explicitly; it does not supply runtime defaults for the hosted OAuth configuration:

| Variable | Hosted requirement/source | | ------------------------- | ---------------------------------------------------------------------- | | MCP_REMOTE_AUTH_MODE | Required; must be explicitly set to oauth | | MCP_AUTH0_ISSUER | Required HTTPS Auth0 tenant issuer from deployment config | | MCP_AUTH0_AUDIENCE | Required; must be explicitly set to https://mcp.productmaker.app/mcp | | MCP_AUTH0_CLIENT_ID | Required; Secret Manager (MCP_AUTH0_CLIENT_ID) | | MCP_AUTH0_CLIENT_SECRET | Required; Secret Manager (MCP_AUTH0_CLIENT_SECRET) | | AUTH0_AUDIENCE | Required HTTPS ProductMaker API audience from deployment config | | PM_API_AUDIENCE | Required HTTPS ProductMaker API audience from deployment config |

What you can do from your AI assistant

Guided dropshipping launch

The MCP exposes one guided prompt, start_dropshipping, for users who want ProductMaker to lead the complete journey. It routes intent before acting: a focused request to create a creative, publish to Shopify, or publish to Meta continues through the corresponding tool without creating a project. The guided flow uses the project's persisted phase and guide_dropshipping_launch's nextAction instead of maintaining a second checklist in the chat.

The launch flow asks for explicit confirmation before the 1,000-credit product research run and before other paid or external mutations, uses the real supplier cost for costing, pauses at user-review gates, and leaves Meta campaigns PAUSED. It does not promise persistent memory, automatic next-day monitoring, traffic-light decisions, campaign activation, budget changes, or automatic shutdown. For deeper Meta metrics, the assistant may optionally suggest Meta's official MCP; that is not required to use ProductMaker and is never claimed to be installed by this server.

Shopify publication recovery preserves every typed issue in needs_input. The server instructions and start_dropshipping prompt ask for missing amounts and explicit confirmation of the exact currency, unit price and pack totals before submitting commerceCorrection with confirmed: true. Never invent prices, convert currency or remove an offer to bypass a blocker. A changed context requires another review; open_editor directs the seller to ProductMaker. commerceCorrectionSaved confirms saved inputs only. Verify an uncertain publication in the task and store before another attempt, especially when creating a new product.

Use it in one of three ways: load the source-controlled Agent Plugin on a compatible host and invoke $start-dropshipping, select the MCP prompt start_dropshipping where prompts are supported, or ask any tool-only client in natural language to guide an end-to-end launch. A focused creative, landing, Shopify, Meta, or status request continues through its direct tool.

The plugin manifests intentionally contain no ProductMaker API key. The host must provide the authenticated MCP connection through its secure connection or credential flow; loading the skill alone does not prove that the remote endpoint is authorized. Public OpenAI/“With MCP” registration and OAuth readiness are a separate release step.

| Tool | What it does | | ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | cost_product | Estimate a safe Colombia/COP selling price for free, then reuse its price and compareAtPrice in create_product_task | | create_product_task | Full pipeline from a product image (extract → angles → video → landing → image creatives) | | get_task_status | Check task progress (optional waitSeconds for near-sync polling) | | list_tasks | List recent tasks | | edit_task_draft | Edit angle / pain point / persona before generation | | create_service_video | Hidden from the MCP since 9.0.0 (owner decision 2026-10-08, still on WhatsApp): use create_animated_video for a service video. | | create_brand | Service journey, step 1. Brand analysis of a service business or personal brand from its Instagram (@handle works), Facebook, TikTok or website — never for dropshipping products. action=start without confirmed only prices it; with confirmed=true it starts (businessNotes = what the user told about prices, WhatsApp or area, sent as a text document). Poll action=status with brandId until ready (analysis summary) or failed (plain reason). action=list reuses an existing brand. A retried confirmed start of the same address returns the brand already extracting instead of charging again. | | create_service_landing | Service journey, step 2. Landing page of that brand: action=prepare (free) creates or resumes the brand's page and prices both paid steps; action=build with confirmed=true and the accepted maxCredits first reads the business data, then (called again) creates the page; action=status follows the step; action=publish publishes it at /p/<slug> and returns publicUrl, which feeds create_animated_video. The MCP handles revisions and idempotency keys itself, so a retry never pays twice. | | create_service_images | Service journey, images. Ad images for a service business from its brand (brandId from create_brand), with no product photo — never for dropshipping products (generate_image_creatives). Without confirmed it only quotes (the web form's image-creative estimate with subject: "service"); with confirmed=true it sends POST /v1/creatives/images with serviceBrief (instruction or delegateToAi), brandId, format (4:5, 9:16, 1:1), count (1-3), quality and language. Follow the taskId with get_task_status. | | create_animated_video | Prepare a service URL for free with action=prepare (default); poll status or cancel using websiteCaptureId. Show its ready preview, format, duration, language and price range, then request explicit confirmation before action=generate with that ID and confirmed=true. Generation reuses the capture and may mix motion graphics with AI clips (including people speaking, in the narrator's voice) and a voice-over, up to the duration-based clip cap. Optional hookVariants (1-3 versions of the opening for A/B) and music (false = no music bed, same price). The maximum price is charged at generation; unused AI clips, an unused voice-over, unused narrator lip syncs and undelivered hook versions are refunded at completion, and failure refunds everything. No uploaded files on MCP. Follow the returned taskId with get_task_status for progress and MP4. A blocked page requires another public URL; never request passwords. | | generate_video_creative | Standalone UGC video creative | | generate_free_video | One free-form video from an exact prompt/script, optionally with a reference image (async: returns a taskId) | | generate_image_creatives | Standalone image creatives (multiple variants) | | edit_image_creative | Fix ONE already-generated image of a creatives task (pick it with variantIndex, describe the change in instruction) without regenerating the whole set. Paid action — charges a single image; requires the task to be done | | generate_landing | Standalone landing page | | get_video_script | Read the pending video script when a task was created with script review paused (returns scenes + per-scene word limits) | | approve_video_script | Approve the video script (with optional per-scene edits); render starts and consumes credits | | regenerate_video_script | Re-roll the pending video script (optionally with a different narrative style) | | resolve_pending_action | Resolve a gate the pipeline is waiting on (product-reference confirmation or angle-review approval) when get_task_status returns pendingUserAction | | estimate_creative_variant | Free estimate of the credit range for an extra video / image / landing section inside an existing task. Call this first | | estimate_market_study_cost | Free quote of the same video / combined task WITHOUT and WITH the market study. The study is off unless the user accepts it; call this before asking and show both totals | | create_creative_variant | Create that extra creative in an existing task. Paid action — requires confirm: true plus an idempotent clientRequestId | | list_shopify_shops | List connected Shopify stores | | list_shopify_products | Search products in a connected Shopify store before choosing targetProductId for publish_to_shopify | | list_meta_ad_accounts | List connected Meta ad accounts | | list_meta_destinations | List Meta Business portfolios, ad accounts per portfolio, and Facebook Pages; use the returned IDs to choose the exact publication destination | | request_media_upload | Open the consumer-neutral inline file picker for ProductMaker tasks, image/video creatives, landings, and Meta; supports image, video, or mixed sessions, ChatGPT file references, an explicit OK chat handoff, and /upload-media only as fallback | | check_media_upload | Return verified owner-scoped opaque asset IDs and media kinds from a universal upload session; no bytes, token, file name, or private URL reaches the model | | list_tiktok_advertisers | List connected TikTok Ads advertiser accounts | | publish_to_shopify | Publish a completed task to Shopify; preserves existing calls and returns typed recovery when seller input is required. Optional commerceCorrection requires explicit confirmed: true. Success includes landing + product URLs. | | verify_landing_commerce | Free readback of a saved landing edit after manual Shopify/COD corrections; preserves pending provider notices and never changes money, inventory or SKU. Requires the existing taskId and editId and the editor’s current access permissions. | | publish_to_meta | Create a Meta Ads campaign from a task (always PAUSED) after selecting exact portfolioId, adAccountId, and pageId with list_meta_destinations | | publish_creatives_to_meta | Group task creatives or user media into ONE paused Meta campaign; user media is staged on ProductMaker's CDN and removed after successful publication or TTL expiry | | publish_to_tiktok | Create a TikTok Ads campaign from a task (always created PAUSED). Same angleIndexes + campaignConfig shape as Meta | | get_meta_campaign_status | Read-only status + lifetime insights (spend/impressions/clicks/reach) of a Meta campaign | | get_tiktok_campaign_status | Read-only status + lifetime report of a TikTok campaign (requires advertiserId) | | find_winning_products | Research winning dropshipping products for a country/category with AI-explained reasons, risks, and real Meta Ads evidence. Costs 2000 credits per run — requires explicit user confirmation (confirmed: true) before charging. Covers CO, MX, PE, EC, CL | | get_product_research_run | Read the full report (score, verdict, confidence, reasons, risks, ad evidence) of a research run by runId. Free | | list_product_research_runs | List the user's past research runs, most recent first. Free | | start_dropshipping_project | Start or resume a guided dropshipping project. Idempotent, costs no credits | | cost_dropshipping_project | Save the project's costing inputs (the backend recomputes the canonical result and owns versioning) | | guide_dropshipping_launch | Read-only launch guidance: the project's phase and the single computed nextAction. Never activates Meta | | list_actors | List the user's saved personajes (AI-generated people who can star in videos and images). Returns the id to pass as actorId. Read-only, free | | get_daily_control | Read-only daily profitability traffic-light per product (light + verdict). Never pauses/activates ad campaigns. Optional projectId narrows the report to one project. A product with status !== "ok" has no metrics — including no_campaign_linked (no campaign tied to the project, so there is no spend and no cost per sale). Days marked returnedSource: "estimated" are not measured; cancelledSource: "shopify_settling" is measured but not yet closed | | link_campaign_to_project | Link an ad campaign the user launched outside ProductMaker to a project, so its spend feeds get_daily_control. Only associates an identifier — never creates/pauses/activates a real campaign. For Meta the ad account is derived server-side, not taken from the input | | report_daily_returns | Report how many orders of a product were returned on a given day — the one signal ProductMaker cannot see on its own | | sync_shopify_orders | Pull the store's orders into the ledger as a FOURTH source. It does not replace the provider's report: the store cannot know whether a cash-on-delivery order arrived, so its orders stay in transit unless the money is already collected. Where the provider covered that product on that day, the provider wins. Without dates, from the 1st of the month to today | | import_orders_file | Read the provider's spreadsheet from an ABSOLUTE path on the caller's machine and store its orders. stdio only — on the hosted server a path points at OUR disk, so it fails closed. Start with dryRun: true and tell the seller what it contains (how many orders, between which dates, which rows could not be read) before writing anything. No column with buyer data is ever read | | create_operation | Create the business of one country. The currency is derived from the country, never asked. Needed before anything else about the month: with no operation there is nothing for get_finances to assemble. Someone selling in a single country has one and never hears the word again | | merge_products | Merge two records of the same product into one. The two ids come from get_product_control — never invent them. The source DISAPPEARS and its orders move to the target, so confirm by NAME which one stays. It cannot be undone | | get_finances | Read-only monthly P&L: gross and delivered sales, freight, merchandise cost, gross profit, ad spend, fixed costs and NET profit before taxes, plus each rate against its target. Grouped on purpose: a model that needs six calls to answer "how am I doing?" assembles the picture itself between trips, and that is where it invents. adSpendKnown: false means ad spend could not be read and the profit is INCOMPLETE; adSpendSource: "user" means she corrected it by hand; unconfirmedExpenses > 0 is inherited from last month and unreviewed. With one operation the server resolves it; with several it returns operation_ambiguous with the list | | set_monthly_expense | Save one FIXED cost of the month (rent, salaries, accountant). Writing the same label again REPLACES the amount — it does not add a second expense. Without fixed costs written, the month's profit always reads HIGHER than it is. Not for ad spend: that is set_ad_spend | | set_ad_spend | Correct by hand what was spent on ads that month. amount: 0 ASSERTS "I did not advertise"; null WITHDRAWS the correction and gives the campaigns back the say. They are not the same | | prepare_winning_product_image | Prepare and show the exact photo of a user-selected winning-product candidate for free; securely stages it before the next photo choice. | | get_product_control | Read-only daily profitability verdicts and measurement status per store product. Incomplete samples or unmeasured delivered sales must remain explicit; never changes campaigns. | | list_importable_products | Read one page of store products eligible for financial control; preserve hasNextPage and already-imported markers. | | import_product_controls | Add selected store products to financial control. They remain no_costing until their real costs are saved. | | set_product_costing | Save seller-provided supplier cost, freight and estimated cancellation/return rates; store price stays canonical and missing costs cannot be invented.