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.
paymcp
into an MCP server and set a price for a tool./mcp
).OPENAI_API_KEY
STRIPE_SECRET_KEY
if you want to enable Stripe payments (test keys are fine for development)WALLEOT_API_KEY
and uncomment the provider in code if you want to try Walleot instead of Stripe# 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.
Set environment variables (for example via a .env
that your runner loads, or via your shell):
export OPENAI_API_KEY="sk-..." # Optional, if using Stripe export 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:
installPayMCP(server, { providers: { // "walleot": { apiKey: process.env.WALLEOT_API_KEY ?? "" }, // Uncomment to enable Walleot "stripe": { apiKey: process.env.STRIPE_SECRET_KEY ?? "" }, }, paymentFlow: PaymentFlow.ELICITATION, });
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.
generate
:
{ prompt: string }
$2.00
per call (configured in the code; change as you like)image
with base64-encoded PNG datagenerateImage(prompt)
from src/services/openai.ts
, which uses the official OpenAI SDK, requests an image, and returns a base64 string.The tool returns a response like:
Running the server (HTTP / Streamable HTTP)This server is already wired to run over HTTP using Express and the StreamableHTTPServerTransport.
# dev with tsx watch pnpm dev # build TypeScript -> build/ pnpm build # start compiled server from build/ pnpm start
By default it listens on PORT
(defaults to 5004):
http://localhost:5004/mcp
MCP Inspector:
pnpm dev
) so it listens on http://localhost:5004/mcp
.npx @modelcontextprotocol/inspector@latest
http://localhost:5173
).http://localhost:5004/mcp
→ Connect.prompt
, and run it to receive a base64 PNG.Demo client: Try the companion chat client here: https://github.com/blustAI/walleot-demo-chat
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.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.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
.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4