You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A minimal Model Context Protocol (MCP) server that exposes a single tool, generate, which creates an image from a text prompt and returns it as a base64-encoded PNG MCP resource. The server demonstrates how to make a paid MCP tool using paymcp with Stripe or Walleot.
What this repo shows
How to wire paymcp into an MCP server and set a price for a tool.
A minimal shape for a paid, single-purpose MCP tool you can extend.
How to serve an MCP server over Streamable HTTP with Express (POST/GET/DELETE to /mcp).
Requirements
Node.js 18+
OpenAI API key: set OPENAI_API_KEY
Stripe secret key (optional): set STRIPE_SECRET_KEY if you want to enable Stripe payments (test keys are fine for development)
Walleot API key (optional): set WALLEOT_API_KEY and uncomment the provider in code if you want to try Walleot instead of Stripe
Installation
# clone the repo
pnpm install
This project is TypeScript. Use your preferred runner (e.g., tsx, ts-node) when bootstrapping the server process if you create a custom entry point.
Configuration
Set environment variables (for example via a .env that your runner loads, or via your shell):
export OPENAI_API_KEY="sk-..."# Optional, if using Stripeexport STRIPE_SECRET_KEY="sk_test_..."# Optional, if using Walleot (then uncomment provider in the server code)export WALLEOT_API_KEY="..."
Payment providers are configured in installPayMCP within the server code:
Payment notes: Stripe has a minimum charge per transaction. If your tool price is below $2.00, prefer Walleot; small Stripe payments may fail or be uneconomical.
How it works
The server registers a single tool generate:
Input: { prompt: string }
Price: $2.00 per call (configured in the code; change as you like)
Output: MCP resource of type image with base64-encoded PNG data
Internally it calls generateImage(prompt) from src/services/openai.ts, which uses the official OpenAI SDK, requests an image, and returns a base64 string.
Change price: in server.registerTool update price: { amount: 2, currency: "USD" }. If you use Stripe, set the price above Stripe’s minimum; for prices below $2.00, prefer Walleot.
Change output: adjust src/services/openai.ts if you want URLs instead of base64, larger sizes, different formats, etc. The current function is intentionally minimal and always returns a base64 PNG string.
Swap payment provider: switch from Stripe to Walleot by toggling the provider block and keys.
License
MIT
Notes on package manager: this repo declares packageManager: pnpm. Examples above use pnpm. If you prefer others, use: npm run dev|build|start or yarn dev|build|start.
About
Minimal MCP server demo with paymcp (Stripe/Walleot) that generates images via OpenAI and exposes a paid generate tool over Streamable HTTP.
{ "content": [ { "type": "image", "data": "<base64>", "mimeType": "image/png", "annotations": { "audience": ["user"], "priority": 0.9 } } ] }