Skip to main content

MCP Server Access

Let your AI assistant use Bitcoin-powered AI tools

Give Your AI Superpowers

Connect Claude, Cursor, or any MCP-compatible AI to 33+ tools — images, video, music, text, speech, and more.

No signupNo subscriptionPay only when you use itFull privacy

Not a developer? You can use all of these tools directly on the web — browse available tools and pay with any Lightning wallet, no setup needed.

Looking for the full L402 / MCP / WebLN reference? — see /docs for error codes, async jobs, dedup, auto-routing, CORS and macaroon caveats.

Which Integration Method?

Pick the one that fits how you work. All three access the same tools and pricing.

MethodBest for
MCP (HTTP)Claude Desktop, Cursor, Windsurf, any MCP client
MCP (stdio / npm)Local agents, CI pipelines, Node.js projects
L402 (HTTP API)Direct HTTP callers, autonomous agents with wallets, curl

MCP (HTTP) is the fastest path — paste the URL, your AI discovers all tools automatically. L402 is for agents that manage their own Lightning wallet and want stateless pay-per-call with no session. Full API reference: /docs | /llms.txt (machine-readable)

Connect in 30 Seconds

Copy this into your MCP settings and you're done.

Add to your MCP settings JSON:
{
  "mcpServers": {
    "sats4ai": {
      "url": "https://sats4ai.com/api/mcp"
    }
  }
}
Claude Desktop: claude_desktop_config.json
Claude Code: .claude/settings.json
Cursor: .cursor/mcp.json

Also on the Official MCP Registry as com.sats4ai/bitcoin-ai-tools.

How Payments Work

Your AI handles steps 1, 3, and 4 automatically. You just pay the invoice.

Why MCP instead of raw HTTP? See the side-by-side comparison.

1

Create Payment

AI calls create_payment and gets a Lightning invoice

You Pay

Pay the Lightning invoice with your wallet. Agents: CLW

3

Verify (optional)

AI checks payment status

4

Get Result

AI calls the tool and returns your result

Available Services & Pricing

All prices in Satoshis. Model ID is optional — omit it to use the best default. Use list_models to discover all options.

IDServicePrice (Satoshis)
26generate_text (Standard)1,000 characters/Sat
1generate_text (Better)333 characters/Sat
6generate_text (Best)100 characters/Sat
2generate_image100
8generate_image150
16generate_image200
25generate_video300-550/sec
24animate_image100/sec
23generate_music300
3text_to_speech10-100 chars/sat
10transcribe_audio10/minute
5analyze_image21
17generate_3d_model350
27extract_document10/page
convert_file100
20send_smsvaries
place_callvaries
send_email200
translate_text1 per 1,000 chars
edit_image200-450
clone_voice7,500
convert_html_to_pdf50
merge_pdfs100
extract_receipt50/page
remove_background5
upscale_image5
restore_face5
detect_nsfw2
detect_objects5
remove_object15
colorize_image5
deblur_image20
ai_call~150-250
epub_to_audiobook~1 per ~33 chars

Text and SMS use dynamic pricing. Call create_payment to get an exact quote. Free tools: list_models, get_model_pricing.

Model IDs are stable numeric database keys — they never change. The table above is for human reference. Agents should call list_models at runtime to discover current IDs and pick up new models automatically.

Media URLs returned by image, video, audio, and file conversion tools are hosted on our servers and expire after 2 hours. Download or display them promptly.

Step-by-Step: Manual Usage

If your AI client doesn't auto-handle MCP, or you want to call it directly with curl:

1Initialize Connection

curl -X POST https://sats4ai.com/api/mcp \
-H "Content-Type: application/json" \
-d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "initialize",
  "params": {
    "protocolVersion": "2024-11-05",
    "capabilities": {},
    "clientInfo": { "name": "my-client", "version": "1.0.0" }
  }
}'

2Create Payment (get Lightning invoice)

curl -X POST https://sats4ai.com/api/mcp \
-H "Content-Type: application/json" \
-d '{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "create_payment",
    "arguments": {
      "toolName": "generate_image"
    }
  }
}'

Response:

{
  "result": {
    "content": [{
      "type": "text",
      "text": "{
        \"paymentId\": \"abc123\",
        \"lightningInvoice\": \"lnbc...<LIGHTNING_INVOICE>\",
        \"amountSats\": 100
      }"
    }]
  }
}

Copy the lightningInvoice and pay it with your Lightning wallet. Save the paymentId.

3Call the Service

After payment, pass the paymentId to the tool you want to use:

curl -X POST https://sats4ai.com/api/mcp \
-H "Content-Type: application/json" \
-d '{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "tools/call",
  "params": {
    "name": "generate_image",
    "arguments": {
      "paymentId": "abc123",
      "prompt": "A futuristic Bitcoin-powered robot"
    }
  }
}'

Copy-Paste Examples

Complete, runnable code for each integration method. Each generates an image end-to-end.

PythonOpenAI Agents SDK + MCP

Works with any agent framework that supports MCP (OpenAI Agents SDK, LangChain, etc.).

# pip install openai-agents httpx
from agents import Agent, Runner
from agents.mcp import MCPServerStreamableHttp

async def main():
    # Connect to Sats4AI MCP server
    async with MCPServerStreamableHttp(
        name="sats4ai",
        params={"url": "https://sats4ai.com/api/mcp"},
    ) as server:
        # Create an agent with Sats4AI tools
        agent = Agent(
            name="assistant",
            instructions="""You have access to Sats4AI tools.
To use a paid tool: call create_payment first, then tell the user
to pay the Lightning invoice, then call the tool with the paymentId.""",
            mcp_servers=[server],
        )

        result = await Runner.run(agent, "Generate an image of a sunset over Tokyo")
        print(result.final_output)

import asyncio
asyncio.run(main())
TypeScriptDirect HTTP (no framework needed)

Raw JSON-RPC calls. Works from any language — Node.js, Deno, browser, or your own agent loop.

// npm install sats4ai-mcp
// Add to your MCP settings (Claude Code, Cursor, etc.):
// { "mcpServers": { "sats4ai": { "url": "https://sats4ai.com/api/mcp" } } }

// Or call directly via HTTP:
const endpoint = "https://sats4ai.com/api/mcp";

// 1. Create payment
const payRes = await fetch(endpoint, {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    jsonrpc: "2.0", id: 1,
    method: "tools/call",
    params: { name: "create_payment", arguments: { toolName: "generate_image" } }
  })
});
const { result: payResult } = await payRes.json();
const { paymentId, invoice } = JSON.parse(payResult.content[0].text);
console.log("Pay this invoice:", invoice);

// 2. Wait for payment... (poll check_payment_status or use a wallet SDK)

// 3. Call the tool
const imgRes = await fetch(endpoint, {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    jsonrpc: "2.0", id: 2,
    method: "tools/call",
    params: { name: "generate_image", arguments: { paymentId, prompt: "A sunset over Tokyo" } }
  })
});
const { result: imgResult } = await imgRes.json();
console.log("Image URL:", JSON.parse(imgResult.content[0].text).imageUrl);
curlL402 API (stateless, no MCP)

For autonomous agents with their own Lightning wallet. No session, no MCP — just HTTP + payment proof.

# L402 (stateless, no MCP needed)
# Step 1: Get schema + 402 challenge
curl https://sats4ai.com/api/l402/image

# Step 2: Pay the Lightning invoice from the WWW-Authenticate header

# Step 3: Call with proof of payment
curl -X POST https://sats4ai.com/api/l402/image \
  -H "Authorization: L402 <macaroon>:<preimage>" \
  -H "Content-Type: application/json" \
  -d '{"prompt": "A sunset over Tokyo"}'

All Available Tools

Free Tools (no payment needed)

create_payment

Get a Lightning invoice for any service

check_payment_status

Check if your payment was received

list_models

List all available AI models

get_model_pricing

Get pricing for a specific model

check_job_status

Check progress of async jobs

get_job_result

Get result of completed jobs

Paid Tools (instant result)

generate_image

Generate images from text. Grok Imagine, Seedream 4, Nano Banana 2. 100-200 sats.

edit_image

Edit images with natural language. Object add/remove, style transfer, inpainting. 200-450 sats.

generate_text

Frontier LLMs: Kimi K2.5, GPT-OSS-120B, Qwen3-32B. Per-character pricing.

translate_text

Translate text across 119 languages. Qwen3-32B. 1 sat per 1000 chars.

generate_music

Full songs (up to 6 min) with natural AI vocals, BPM/key control, 14+ section tags. Music-2.6. 300 sats.

text_to_speech

Natural speech. 3 tiers: OmniVoice Global (602+ langs, 100 chars/sat), Inworld Max Premium (#1 ELO, 50 chars/sat), Minimax Studio (voice cloning, 10 chars/sat). Emotion control, voice design.

analyze_image

Image analysis and visual Q&A. Qwen VL. 21 sats.

extract_document

OCR from PDFs/images to Markdown. Mistral OCR. 10 sats/page.

extract_receipt

Structured JSON from receipts/invoices. 50 sats/page.

convert_file

Convert between 200+ file formats. 100 sats.

merge_pdfs

Merge multiple PDFs into one. 100 sats.

convert_html_to_pdf

HTML/Markdown to PDF. Great for invoices/reports. 50 sats.

send_sms

Reach a human via SMS worldwide. Price varies by destination.

send_email

Send email — reports, notifications, formal comms. 200 sats.

place_call

Deliver spoken messages to any phone. Price varies.

remove_background

Background removal. BiRefNet (SOTA). Transparent PNG. 5 sats.

upscale_image

2x/4x super-resolution. Real-ESRGAN. 5 sats.

restore_face

Restore blurry/damaged faces. CodeFormer. 5 sats.

detect_nsfw

Classify image safety. Falcons.ai NSFW detection — 100x cheaper than an LLM. 2 sats.

detect_objects

Detect and locate objects with bounding boxes. Grounding DINO (ECCV 2024). 5 sats.

remove_object

Remove unwanted objects by describing what to remove — no mask needed. Grounding DINO + Bria Eraser. 15 sats.

colorize_image

Colorize B&W or grayscale photos. DDColor (ICCV 2023). 5 sats.

deblur_image

Fix blurry or out-of-focus photos. NAFNet (ECCV 2022). 20 sats.

Paid Tools (async — requires polling)

generate_videoasync

Text to video. Kling v3, standard/pro, optional audio. 300-550 sats/sec.

animate_imageasync

Animate images into video. Grok Imagine Video. 100 sats/sec.

generate_3d_modelasync

Photo to 3D GLB model. Seed3D. 350 sats.

clone_voiceasync

Clone a voice from audio sample. Returns reusable voice_id for TTS. 7,500 sats.

transcribe_audioasync

Audio to text with timestamps. Mistral Transcription. 13 languages. 10 sats/min.

ai_callasync

AI voice agent for two-way calls — booking, IVR, negotiation. ~150-250 sats.

epub_to_audiobookasync

Book to Audiobook — EPUB, PDF, or TXT to AI-narrated M4B with chapters. Same 3 TTS tiers. Min 500 sats.

Async tools return a requestId. Use check_job_status to poll, then get_job_result to retrieve the output.

Tool Reference

Copy-paste JSON for each tool. These go inside params.arguments.

create_payment — get a Lightning invoice

For most services. modelId is optional — omit to use the best default:

{
  "toolName": "generate_image"  // Tool to pay for. modelId optional (defaults to best).
}

With a specific model (optional):

{
  "toolName": "generate_image",
  "modelId": 8              // Optional: pick a specific model from list_models
}

For generate_text (prompt required — price is based on character count and locked to the exact prompt):

{
  "toolName": "generate_text",
  "prompt": "Review this code for bugs",         // Required: used to calculate and lock the price
  "modelId": 6,                                  // Optional: 1 = Standard, 6 = Best (default)
  "systemPrompt": "You are a helpful assistant", // Optional
  "fileContext": "function add(a, b) { ... }"    // Optional: extracted file text
}

For generate_video (duration/mode/audio determine price):

{
  "toolName": "generate_video",
  "duration": 5,               // 3-15 seconds (required)
  "mode": "pro",               // "standard" or "pro" (default: "pro")
  "generate_audio": false      // Include audio track (default: false)
}
// Pricing: standard 300/400 sats/sec, pro 450/550 sats/sec (no audio/audio)
// animate_image: just provide "duration" (100 sats/sec)

For send_sms (destination-aware pricing):

{
  "toolName": "send_sms",
  "phoneNumber": "+14155550100",    // Required: used for rate lookup
  "message": "Hello from Sats4AI!" // Required: validated here (max 120 chars)
}
generate_image — generate images from text. Returns base64 image.
{
  "paymentId": "abc123",
  "prompt": "A futuristic city at sunset",
  "modelId": 2,                          // Optional: defaults to best
  "imageBase64": "..."                   // Optional: base64 image for img2img
}
generate_text — AI chat, code review, file analysis. Returns generated text.

Supports file attachments (send extracted text as fileContext) and image analysis (send base64 as imageBase64).

{
  "paymentId": "abc123",
  "prompt": "Review this code for bugs",
  "modelId": 6,                                  // Optional: defaults to best
  "systemPrompt": "You are a helpful assistant",  // Optional
  "fileContext": "function add(a, b) { ... }",   // Optional: extracted file text
  "fileName": "utils.js",                         // Optional: file name
  "imageBase64": "data:image/png;base64,..."      // Optional: vision-capable models only
}
generate_video — text to video. Returns requestId, poll for video URL. async
{
  "paymentId": "abc123",
  "prompt": "A rocket launching into space",
  "modelId": 25,           // Optional: defaults to best
  "duration": 5,           // 3-15 seconds
  "mode": "pro",           // "standard" or "pro"
  "generate_audio": false  // Include audio track
}
// Pricing (per second): standard 300 (no audio) / 400 (audio), pro 450 / 550
// Must provide duration, mode, generate_audio at create_payment time
animate_image — animate an image into video. Returns requestId. async
{
  "paymentId": "abc123",
  "imageBase64": "<base64 encoded image>",
  "prompt": "The scene comes to life",    // Optional motion guidance
  "modelId": 24,                           // Optional: defaults to best
  "duration": 5                            // 3-15 seconds, 100 sats/sec
}
// Must provide duration at create_payment time
generate_music — create full songs with AI vocals, BPM/key control. Returns audio URL.
{
  "paymentId": "abc123",
  "prompt": "E minor, 90 BPM, acoustic guitar ballad, male vocal",
  "lyrics": "[Verse]\nYour lyrics here...\n[Chorus]\nThe hook...",
  "is_instrumental": false,   // true for instrumental-only
  "lyrics_optimizer": false,  // true to auto-generate lyrics
  "sample_rate": 44100,
  "bitrate": 256000,
  "audio_format": "mp3"
}
text_to_speech — text to speech. Returns audio URL.
{
  "paymentId": "abc123",
  "text": "Hello, this is a test of the speech synthesis.",
  "modelId": 3,       // Optional: defaults to best
  "voice": "default"  // Optional: voice ID
}
transcribe_audio — audio to text with timestamps. Returns requestId, poll for result. async
{
  "paymentId": "abc123",
  "audioBase64": "<base64-encoded-audio>",  // mp3, wav, flac, ogg, webm, mp4, m4a, aac, wma
  "language": "en",              // Optional: "detect", "en", "es", "fr", "de", "it", "pt", "nl", "ja", "ko", "zh", "ar", "hi"
  "timestamps": "segment",      // Optional: "none" (default), "segment", or "word"
  "diarize": true                // Optional: identify different speakers (default: false)
}

Returns requestId. Poll with check_job_status(jobType="transcription"), then get_job_result. 10 sats/minute.

analyze_image — analyze images with AI. Returns description text.
{
  "paymentId": "abc123",
  "imageUrl": "https://example.com/image.jpg",
  "prompt": "What objects are in this image?",
  "modelId": 5    // Optional: defaults to best
}
generate_3d_model — image to 3D model. Returns requestId, poll for model URL. async
{
  "paymentId": "abc123",
  "imageUrl": "https://example.com/object.jpg",
  "modelId": 17    // Optional: defaults to best
}
send_sms — reach a human via SMS worldwide. Returns delivery status.
{
  "paymentId": "abc123",
  "phoneNumber": "+14155550100",    // Same as in create_payment
  "message": "Hello from Sats4AI!" // Max 120 chars
}

A 40-character disclaimer is auto-appended to every SMS.

place_call — deliver spoken messages to any phone. Returns call status.
// Option A: Text-to-Speech
{
  "paymentId": "abc123",
  "phoneNumber": "+14155550100",
  "message": "Hello, this is your reminder for tomorrow at 3 PM."
}

// Option B: Play audio file
{
  "paymentId": "abc123",
  "phoneNumber": "+14155550100",
  "audioUrl": "https://example.com/my-audio.mp3",
  "durationMinutes": 2
}

Provide message (max 500 chars) OR audioUrl + durationMinutes (1–30). Pricing scales with duration and destination. Generate audio with text_to_speech first for custom voices.

ai_call — send an AI voice agent to make a two-way phone call. Returns transcript + analysis. async
{
  "paymentId": "abc123",
  "phoneNumber": "+14155550100",
  "task": "Call this restaurant and book a table for 2 at 7pm tonight",
  "durationMinutes": 3,            // Optional: 1-10 (default: 3)
  "voice": "Myra",                  // Optional: Adrian, Myra, Paola, Chris, Marissa, Nathan, Cimo, Drew, Olivia
  "language": "en-US",              // Optional: en-US, en-GB, es-ES, fr-FR, de-DE, ja-JP, zh-CN, multi
  "beginMessage": "Hi, I'd like..." // Optional: opening line for the agent
}

Returns call_id and poll_url. Poll with check_job_status(jobType="ai-call") for transcript + analysis. ~150-250 sats for a 3-min US call.

remove_background — remove background, returns transparent PNG. 5 sats.
{
  "paymentId": "abc123",
  "imageBase64": "<base64-encoded-image>"
}
upscale_image — upscale images 2x/4x with neural super-resolution. 5 sats.
{
  "paymentId": "abc123",
  "imageBase64": "<base64-encoded-image>",
  "scale": 4,              // Optional: 2 or 4 (default: 4)
  "face_enhance": false    // Optional: enhance faces during upscale
}
restore_face — restore blurry or damaged faces. 5 sats.
{
  "paymentId": "abc123",
  "imageBase64": "<base64-encoded-image>",
  "fidelity": 0.5,              // Optional: 0.0 (max quality) to 1.0 (max identity), default 0.5
  "background_enhance": false,  // Optional: also enhance background
  "face_upsample": false,       // Optional: upsample restored faces
  "upscale": 1                  // Optional: overall upscale factor
}
detect_nsfw — classify image safety (normal/suggestive/explicit). 2 sats.
{
  "paymentId": "abc123",
  "imageBase64": "<base64-encoded-image>"
}

Returns { classification, is_nsfw }. 2 Sats.

detect_objects — detect objects by name with bounding boxes. 5 sats.
{
  "paymentId": "abc123",
  "imageBase64": "<base64-encoded-image>",
  "query": "cat, dog, person",
  "box_threshold": 0.25,    // Optional: detection confidence (0-1)
  "text_threshold": 0.25    // Optional: text matching confidence (0-1)
}

Returns { detections: [{ label, confidence, bbox }] }. 5 Sats.

remove_object — remove objects by describing what to remove. 15 sats.
{
  "paymentId": "abc123",
  "imageBase64": "<base64-encoded-image>",
  "query": "person"
}

Describe what to remove (e.g. "person", "car", "watermark"). Returns cleaned image as base64. 15 Sats.

colorize_image — colorize B&W photos with DDColor. 5 sats.
{
  "paymentId": "abc123",
  "imageBase64": "<base64-grayscale-image>",
  "model_size": "large"   // Optional: "large" (best) or "tiny" (faster)
}

Returns colorized image as base64. 5 Sats.

deblur_image — fix blurry photos with NAFNet. 20 sats.
{
  "paymentId": "abc123",
  "imageBase64": "<base64-blurry-image>",
  "task_type": "Image Debluring"   // Optional: or "Image Denoising"
}

Returns restored image as base64. ~2 min processing. 20 Sats.

extract_document — extract text from PDFs and images. Returns Markdown.
{
  "paymentId": "abc123",
  "document": "data:application/pdf;base64,...",  // PDF or image as data URI
  "model": "OCR"
}

Returns Markdown with tables, headers, and formatting preserved. 10 Sats/page.

convert_file — convert between 200+ file formats. Returns converted file URL.
{
  "paymentId": "abc123",
  "fileBase64": "...",            // Base64-encoded file
  "fileName": "document.docx",
  "extensionFrom": "docx",
  "extensionTo": "pdf"
}
list_models / get_model_pricing — free lookup tools
// list_models — filter by category (optional)
{
  "category": "generate_image"  // matches tool names: generate_image, generate_text, generate_video, etc.
}

// get_model_pricing — look up a specific model
{
  "modelId": 2
}
check_job_status / get_job_result — async job helpers
// check_job_status
{
  "requestId": "xyz789",
  "jobType": "video"      // "video", "video-image", "image-3d", "transcription", "epub-audiobook", or "ai-call"
}

// get_job_result
{
  "requestId": "xyz789",
  "jobType": "video"      // same job types as above
}

Async Operations (Video, 3D, Transcription, Audiobook, AI Call)

Video generation, image animation, 3D models, transcription, audiobook conversion, and AI calls take time. They return a requestId immediately — poll until complete:

// Step 1: Generate video (returns requestId)
const videoJob = await mcpRequest('tools/call', {
  name: 'generate_video',
  arguments: {
    paymentId: 'abc123',
    prompt: 'A rocket launching into space',
    duration: 5,
    mode: 'pro',
    generate_audio: false
  }
});
// Returns: { requestId: 'xyz789', status: 'IN_PROGRESS' }

// Step 2: Poll status until complete
let status;
do {
  await sleep(5000);
  status = await mcpRequest('tools/call', {
    name: 'check_job_status',
    arguments: { requestId: 'xyz789', jobType: 'video' }
  });
} while (status.status === 'IN_PROGRESS');

// Step 3: Get the result
const result = await mcpRequest('tools/call', {
  name: 'get_job_result',
  arguments: { requestId: 'xyz789', jobType: 'video' }
});
// Returns: { videoUrl: 'https://...' }

Error Handling

Errors come back in standard JSON-RPC format:

{
  "jsonrpc": "2.0",
  "id": 1,
  "error": {
    "code": -32603,
    "message": "Payment has not been received yet"
  }
}
CodeMeaning
-32700Invalid JSON
-32600Missing required fields
-32601Method not found
-32602Wrong parameter types
-32603Internal error (service failure or unpaid invoice)

Automatic Refunds (LNURL-withdraw)

When a paid tool fails after payment (e.g. upstream timeout, model error), the error response includes an error_code for programmatic handling and an LNURL-withdraw link so you can claim your sats back instantly:

{
  "jsonrpc": "2.0",
  "id": 3,
  "error": {
    "code": -32603,
    "message": "Image generation timed out",
    "data": {
      "error_code": "TIMEOUT",
      "refund": {
        "charge_id": 12345,
        "refund_amount": 200,
        "lnurl_withdraw": "lnurl1dp68gurn8ghj7...",
        "status": "pending"
      }
    }
  }
}

Error codes:

error_codeMeaningAgent action
TIMEOUTUpstream service timed outRetry later or try a different model
CONTENT_FILTEREDSafety filter triggeredRephrase the prompt
RATE_LIMITEDToo many requestsWait and retry
INVALID_INPUTBad or missing parametersFix parameters and retry
SERVICE_ERRORUpstream service failureTry a different model or contact support

Refund fields:

  • charge_id — the original charge ID for reference
  • refund_amount — amount in sats being refunded
  • lnurl_withdraw — LNURL-withdraw link to claim the refund
  • status — refund status (e.g. pending, claimed)

How to claim:

  • Any Lightning wallet: paste the lnurl_withdraw value into a wallet that supports LNURL-withdraw (Phoenix, Zeus, Alby, etc.)
  • Programmatically: decode the LNURL (bech32), call the returned URL to get the callback + k1, then hit the callback with your own Lightning invoice to receive the refund
  • MCP agents with a Lightning wallet: use the claim_lnurl_withdraw tool if your wallet MCP supports it

Rate limiting

The first 2 failures per 15-minute window are refunded in full. After that, a 2-sat routing fee is deducted from each refund to discourage abuse.

MCP Resources

MCP clients can also read these resources directly:

URIDescription
sats4ai://modelsAll AI models with specs and pricing
sats4ai://pricingPricing for all services
/api/models/routingModel routing transparency — which models power each service, tiers, defaults, and resolution strategy

OpenClaw Integration

OpenClaw agents can use Sats4AI tools directly:

Option 1: MCP Skill (Recommended)

// Add to openclaw.json
{
  "mcpServers": {
    "sats4ai": { "url": "https://sats4ai.com/api/mcp" }
  }
}

Option 2: L402 with lnget

# Agent pays automatically — no API key needed
lnget -X POST https://sats4ai.com/api/l402/generate-image \
  -d '{"input":{"prompt":"A Viking visiting Constantinople"},"model":"Best"}'

Service Discovery

curl https://sats4ai.com/.well-known/mcp          # MCP manifest
curl https://sats4ai.com/.well-known/l402-services  # L402 catalog + pricing
curl https://sats4ai.com/api/models/routing        # Model routing transparency
curl "https://sats4ai.com/api/discover?q=translate" # Semantic tool search (with performance metadata)

What is MCP?

MCP (Model Context Protocol) is an open standard by Anthropic that lets AI assistants connect to external tools and services. Think of it as a universal plug — any AI that supports MCP can use any MCP-compatible service.

Sats4AI's MCP server adds Bitcoin Lightning payments on top. Your AI assistant can generate images, write text, create videos, and more — paying per use with Sats instead of monthly subscriptions. No account needed, no personal data collected, no recurring charges. You only pay when you actually use a tool.

Learn more about MCP

Need Help?

Found a bug or have a feature request? Open an issue on GitHub:

AI agents can also report issues programmatically via the GitHub API. See the official MCP docs for protocol details.