Content Engine
AI-powered content creation as a service. Generate scripts, images, and videos from any topic.
This is an MCP server accessible via Streamable HTTP transport. Any MCP-compatible client can connect to it directly — no proprietary CLI or binary required. Public tools (pricing, quotes) work without credentials. Brand-scoped reads require an API key. Paid tools use the x402 protocol for per-request USDC payments, or an API key with prepaid tokens.
Connection
Content Engine is a standard MCP server. Connect using any MCP client that supports Streamable HTTP transport.
MCP endpoint: https://content-engine-x402.fly.dev/mcp
Server discovery: https://content-engine-x402.fly.dev/.well-known/mcp.json
No special binary, CLI tool, or SDK is required. The server follows the MCP specification and works with any compliant client.
Required Environment Variables
| Variable | Required | Description |
|---|---|---|
CONTENT_ENGINE_URL | Yes | MCP server URL. Default: https://content-engine-x402.fly.dev |
CONTENT_ENGINE_API_KEY | For brand-scoped reads and token-based paid calls | API key (ce_...) tied to a brand. Pass as Authorization: Bearer ${CONTENT_ENGINE_API_KEY} on the MCP connection. Needed for get_queue_status, get_content, get_content_status, and for spending prepaid tokens on paid tools without per-call USDC signing. Create one in the dashboard under Settings → API Keys. |
WALLET_PRIVATE_KEY | For x402 per-call payments | Private key for an EVM wallet holding USDC on Base. Used by the x402 client library to sign payment authorizations. Only needed if paying with USDC per call. Not needed if you use an API key with prepaid tokens. |
Important: WALLET_PRIVATE_KEY gives the x402 client library the ability to sign USDC transfer authorizations. This key should be for a dedicated agent wallet with limited funds — not a primary wallet. See the Payment section for details on how funds are protected.
Payment — How It Works
Paid tools use the x402 payment protocol for USDC payments on the Base network (EIP-155 chain 8453).
The agent controls every payment
No funds are ever auto-debited. The payment flow is:
- Agent calls a paid tool (e.g.
create_script) - Server responds with HTTP 402 Payment Required containing the exact USDC amount, recipient wallet, and network
- The agent's x402 client library reads the 402 response and presents the payment for authorization — the agent decides whether to sign
- If the agent authorizes, the client signs a USDC transfer for the exact amount specified and retries the request with the signed payment proof
- Server verifies the payment, settles the transaction on-chain, and processes the request
Each payment is explicit, per-request, and for an exact amount. The server cannot withdraw funds, charge more than the stated amount, or initiate payments. The agent (or its x402 client) must actively sign each transaction.
What the agent needs
To make paid calls, the agent's HTTP client must support x402. The recommended approach:
import { wrapFetch } from "@x402/fetch";
import { createWalletClient, http } from "viem";
import { privateKeyToAccount } from "viem/accounts";
import { base } from "viem/chains";
// Create wallet from the dedicated agent wallet key
const account = privateKeyToAccount(process.env.WALLET_PRIVATE_KEY);
const wallet = createWalletClient({ account, chain: base, transport: http() });
// Wrap fetch — paid requests are handled via 402 → sign → retry
const x402fetch = wrapFetch(fetch, wallet, "eip155:8453");
The wrapped fetch handles the 402 challenge-response cycle. Public tools (pricing, quotes) work with plain fetch — no wallet needed. Brand-scoped reads use an API key with plain fetch — also no wallet needed.
Cost control
- Call
get_quote(public, no auth) before any paid tool to see the exact USDC price and per-stage breakdown - Call
get_pricing(public, no auth) to see all current rates - Call
get_queue_status(requires API key) to check daily budget remaining for your brand - Use a dedicated wallet with limited USDC to cap total exposure
- Use sandbox mode to test without any payment (see below)
Typical Pricing
Pricing is dynamic — costs vary based on video duration, narration, and effects.
| Operation | Typical Cost (USDC) | Varies By |
|---|---|---|
| Script generation | $0.10–$0.20 | Prompt complexity |
| Image generation | $0.15 | Fixed per image |
| Video generation | $0.50–$2.00 | Duration, shots, talking heads |
| Full pipeline (60s) | $1.50–$2.00 | Duration, narration, effects |
| Publishing | $0.10–$0.15 | Fixed |
Always call get_quote with your parameters for the exact price.
Sandbox Mode (Free Testing)
Test the full API flow without payment, wallet, or USDC. Send Authorization: Bearer sandbox with any paid request to receive a mock response with the real cost quote attached.
# Get a quote (always free, no auth needed)
curl -X POST https://content-engine-x402.fly.dev/agent/quote \
-H "Content-Type: application/json" \
-d '{"operation":"script","duration_seconds":60}'
# Test a paid endpoint in sandbox mode (no payment, no wallet needed)
curl -X POST https://content-engine-x402.fly.dev/agent/script \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sandbox" \
-d '{"topic":"How AI is changing music production"}'
Sandbox mode returns:
- The exact USDC price you would pay
- A per-stage cost breakdown showing which AI services are used
- The response structure your agent should expect from real calls
- Mock IDs (
content_id,jobId,transactionId) matching the real format
Sandbox mode does not create content, charge USDC, require a wallet, or count toward rate limits.
Available Tools
Public (no auth — call anonymously)
| Tool | Description |
|---|---|
get_pricing | Live USDC pricing for all operations |
get_quote | Exact cost quote with per-stage breakdown for specific parameters |
Brand-scoped reads (no USDC charge, but require API key)
These tools return data tied to a specific brand, so the server needs to know which brand is asking. Pass Authorization: Bearer ce_... on the MCP connection. Called without an API key, they return a structured auth_required message pointing at the dashboard.
| Tool | Description |
|---|---|
get_queue_status | Queue position, active jobs, daily budget remaining |
get_content | Full content item details including video URL and metadata |
get_content_status | Lightweight status poll (pipeline stage + completion %) |
Paid (x402 USDC per call, OR API key with prepaid tokens)
| Tool | Description |
|---|---|
create_script | Generate AI video script from topic. Returns content_id for tracking. |
create_image | Generate image from text prompt via Runway ML. Supports style and aspect ratio. |
create_video | Generate video from a completed script. Requires content_id from create_script. |
run_full_pipeline | End-to-end: script + video from a single topic. Fastest path to finished video. |
publish_content | Publish to YouTube, X, TikTok, Instagram, LinkedIn. |
purchase_tokens | Buy 1000–10000 content tokens at $0.03 each. Returns x402 payment instructions — pay USDC to credit tokens to a brand, then use the brand's API key to spend them on paid calls. |
Two ways to pay
- x402 USDC (per-call) — No account needed. The x402 client library handles HTTP 402 → sign USDC transfer → retry. See the Payment section above. Called with no auth, paid tools return a
payment_requiredresponse with the exact price and the x402 REST endpoint. - API key + prepaid tokens — Buy tokens via
purchase_tokens, credited to a brand. Use the brand's API key (Authorization: Bearer ce_...) on the MCP connection to spend tokens on paid calls without per-call wallet signing.
Typical Workflow
Quick path
get_quote(operation="full_pipeline") → run_full_pipeline → poll get_content_status → get_content
Step-by-step path
get_quote operation="script"— See exact pricecreate_script topic="..."— Generate script, save returnedcontent_idget_content_status content_id="..."— Poll until completeget_quote operation="video"— See exact price for videocreate_video content_id="..."— Generate videoget_content_status content_id="..."— Poll until ready (1–5 min)get_content content_id="..."— Retrieve video URL and metadata
Important Notes
- Video generation takes 1–5 minutes. Always poll
get_content_statusrather than assuming instant completion. Polling requires an API key (it's brand-scoped). - The
content_id(UUID) returned by creation tools is the key for all subsequent operations. - Pricing is dynamic — always call
get_quotebefore paid operations to see the exact cost. - Use sandbox mode (
Authorization: Bearer sandbox) against the x402 REST endpoints to test without spending USDC. - Use a dedicated agent wallet with limited funds — do not use a primary wallet.