Lightning Enable MCP Server

io.github.refined-element由 GitHub 账号 refined-element 发布v2.2.0更新于 Nov 4, 2026

AI agent Lightning payments: L402, invoices, wallets, API discovery, budgets, self-serve signup.

概览

AI 生成的概览

让 AI 助手通过已连接的钱包支付 Lightning 发票和 L402 挑战,并提供预算、收据、API 发现和卖家工具。

可以做什么
  • 配置并查看支付钱包、查询余额、自测 L402 支付流程
  • 支付 BOLT11 发票和 L402 挑战,或抓取 URL 时自动支付其 L402 挑战
  • 创建发票、查询发票是否已付款,并执行 BTC 价格、货币兑换、链上转账等钱包操作
  • 查看消费限额、在会话内收紧限额,并列出持久或会话收据
  • 搜索 L402 API 注册表、阅读产品文档、自助开通 API 密钥
  • 凭 API 密钥通过 L402 出售访问权限,并处理基于 Nostr 的代理服务协议
适用场景
适合需要让助手用 Lightning 为按次计费或付费墙资源(例如受 L402 保护的 API)付款的场景,或需要带消费上限和审计记录的代理间商务。从不花钱的助手无需安装。
运行要求
通过 dnx、uvx 或 Docker 以 stdio 在本地运行。需要一个有余额的 Lightning 钱包:Strike(STRIKE_API_KEY)、NWC(NWC_CONNECTION_STRING)或自建 LND 节点(LND_REST_HOST 加 LND_MACAROON_HEX);OpenNode 仅支持开票。卖家与代理服务工具需要 LIGHTNING_ENABLE_API_KEY,可付费自助开通。需能访问钱包和 Lightning Enable 服务的网络。
安装前请注意
会动用真实资金:付款、链上转账和订阅续费都会从钱包扣款,账户工具还会收取激活费。钱包凭据和 API 密钥属于机密,保存在本地配置文件中。超过自动批准阈值的付款需要人工确认码;在托管或共享主机上助手可能读到该确认码,应谨慎选择 refuse、webhook 或 file 通道。助手可下调预算上限,但无法上调。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Lightning Enable MCP Server,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

Part of Lightning Enable — infrastructure for agent commerce over Lightning.

Lightning Enable MCP Server

[Discord] [PyPI downloads] [NuGet downloads] [Docker pulls]

Monetize your own API — 30-day free trial

Agents pay your API per request over Lightning — flat subscription at $49/mo, and you keep 100% of every sat.

Or sign up without leaving your agent: call the create_lightning_enable_account tool.

An open-source MCP (Model Context Protocol) server that enables AI agents to make Lightning Network payments and participate in agent-to-agent commerce. Wallet, invoice, L402, budget, and API-discovery tools work out of the box with just a wallet. Producer tools (sell access via L402) and Agent Service Agreement (ASA) tools (agent-to-agent discovery, request, settlement, and attestation over Nostr) unlock with an Agentic Commerce subscription. See the full tool list.

Available in .NET and Python.

What It Does

Give your AI agent a Lightning wallet and it can:

  • Pay invoices — Send Bitcoin via Lightning to any BOLT11 invoice
  • Access L402 APIs — Automatically pay L402 challenges for seamless API access
  • Discover APIs — Search the L402 API registry to find paid APIs by keyword or category, or fetch a specific API's manifest for full endpoint details and pricing
  • Track spending — Budget limits, a durable receipt log, and balance checks
  • Create invoices — Generate invoices to receive payments
  • Run wallet operations — BTC price, currency exchange, and on-chain sends (Strike; on-chain also LND)
  • Self-bootstrap a Lightning Enable account — create_lightning_enable_account pays a ~100-sat activation fee over L402 and returns a merchant API key: the free→paid signup form that is the protocol, unlocking the producer + ASA tools with no browser or checkout page.
  • Sell services (L402 Producer) — Set up the seller account, put an API behind L402, price its routes, list it publicly, mint payment challenges and verify payer tokens — all from one tool, so an agent can go from an API key to a paid endpoint without touching REST
  • Agent commerce (ASA) — Discover, request, settle, and review agent-to-agent services on Nostr

Quick Start

1. Install

bash
# .NETdotnet tool install -g LightningEnable.Mcp
# Pythonpip install lightning-enable-mcp
# Python (no install)uvx lightning-enable-mcp
# Dockerdocker pull refinedelement/lightning-enable-mcp:latest

2. First run — setup_wallet

Nothing else works without a wallet, so start there. Ask your agent:

Run setup_wallet

With no arguments it reports which wallet is configured and where the credential came from — the provider and the source, never the credential itself. If there is no wallet, it hands back the setup steps.

The shortest path is NWC. In your wallet app (Alby Hub, CoinOS, or any NIP-47 wallet) create a Nostr Wallet Connect connection, copy the nostr+walletconnect:// string, and give it to the agent:

Run setup_wallet with this connection string: nostr+walletconnect://...

setup_wallet validates the string, connects to the wallet to prove it answers, then writes it to ~/.lightning-enable/config.json with the file's permissions restricted to your user. It reports the wallet's declared methods and balance. Restart the server afterwards so it picks up the new wallet.

Or set an environment variable (in the Claude Desktop config below, say). L402 — the whole point of this server — needs a wallet that returns the payment preimage:

  • Strike — STRIKE_API_KEY, from https://dashboard.strike.me
  • NWC — NWC_CONNECTION_STRING, from CoinOS / CLINK / Alby Hub
  • LND (your own node — always returns a preimage) — LND_REST_HOST + LND_MACAROON_HEX
    • Self-signed node cert? Set LND_TLS_CERT_PATH to the node's tls.cert (pins TLS to that cert). LND_SKIP_TLS_VERIFY=true is the escape hatch, not the recommendation. Optional: LND_FEE_LIMIT_SATS, LND_PAYMENT_TIMEOUT_SECONDS.

⚠️ OpenNode (OPENNODE_API_KEY) works for invoicing / direct payments only — it never returns a preimage, so it cannot pay L402 challenges. Don't make it your only wallet if you want L402 (the core use case).

If several are set, priority is: LND > NWC > Strike > OpenNode, and environment variables win over the config file — setup_wallet refuses to write a connection string that an env var would override, and tells you which variable to unset. See Supported Wallets for the full compatibility matrix.

3. Prove the whole loop works — test_l402_payment

Ask your agent:

Run test_l402_payment

This pays a public 1-sat L402 endpoint end to end, proving your wallet is connected, returns a preimage, and can complete a real L402 payment. It's the one-line answer to "is my wallet actually working?" — and it costs about 1 satoshi.

4. Then have some fun — buy a t-shirt

Once the loop works, try the Lightning Enable Store, a live L402-powered web store. Ask Claude:

Buy me a Lightning Enable t-shirt from store.lightningenable.com

(This one needs a funded wallet and a shipping address, which is why test_l402_payment — one sat, no shipping — is the faster first proof.)

Claude Desktop manual install (MCPB bundle)

For a one-click install with no config-file editing, grab the packaged MCPB bundle from the mcpb/ directory instead of hand-editing JSON: build it locally with npx -y @anthropic-ai/mcpb pack mcpb lightning-enable-mcp.mcpb (or download the .mcpb artifact from a mcpb.yml CI run), then double-click the resulting .mcpb file or drag it into Claude Desktop's Settings → Extensions — Claude Desktop prompts for your wallet credentials (Strike, NWC, or LND) and optional Lightning Enable API key through its own settings UI instead of a text config file. See mcpb/README.md for what's in the bundle and mcpb/SUBMISSION.md for its Anthropic MCP Directory submission status.

Claude Desktop Config

Add to your claude_desktop_config.json:

.NET:

json
{  "mcpServers": {    "lightning-enable": {      "command": "lightning-enable-mcp",      "env": {        "STRIKE_API_KEY": "your-strike-api-key"      }    }  }}

dotnet tool install -g LightningEnable.Mcp puts the lightning-enable-mcp command on your PATH. If Claude Desktop can't find it, set command to the full path: "C:\\Users\\<you>\\.dotnet\\tools\\lightning-enable-mcp.exe" on Windows (JSON needs the doubled backslashes), /Users/<you>/.dotnet/tools/lightning-enable-mcp on macOS, or /home/<you>/.dotnet/tools/lightning-enable-mcp on Linux. The config file doesn't expand environment variables such as %USERPROFILE% or $HOME.

Python:

json
{  "mcpServers": {    "lightning-enable": {      "command": "uvx",      "args": ["lightning-enable-mcp"],      "env": {        "STRIKE_API_KEY": "your-strike-api-key"      }    }  }}

Config file locations:

  • Windows: %APPDATA%\Claude\claude_desktop_config.json
  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Linux: ~/.config/claude/claude_desktop_config.json

Deploying hosted

A payment above your auto-approve threshold needs a human's approval: the server mints a short confirmation code, sends it to you, and the agent can only proceed once you read it back. The code never appears in a tool result, so a prompt-injected agent can't approve its own spending by reading the result.

Treat this as an operator confirmation aid on a trusted local host, not as an independent approval boundary: if the agent's host can read the server's console, log stream, approval file, or webhook destination, it can read the code too.

That only works if the code reaches a human. On your laptop it goes to the server's console (stderr) and you read it there. On a hosted server — a claude.ai connector, a Docker container, a fleet — nobody is watching stderr, and on a shared host the agent might read it itself. So you choose the approval channel.

ChannelWhat happens above the thresholdUse it when
stderr (default)The code is printed to the server console.You run the server locally and watch its output.
refuseThe payment is refused. No code is minted at all.You run it hosted and no one can receive a code.
webhookThe pending confirmation is POSTed to your URL, HMAC signed. You relay the code to the agent.You have an ops channel — chat, pager, an approval app.
fileThe same JSON line is appended to a file you tail.You collect approvals from logs.

Whatever the channel, two rules hold: the code is never returned to the agent, and a payment is never approved because its notification failed to send — a delivery failure refuses the payment and withdraws the code.

Codes are 6 characters, one-time use, and bound to the exact amount, tool, and destination. At most 3 codes can be outstanding at once, and 5 invalid code attempts in a row revoke every pending code. A code lives 120 seconds by default; set confirmation.ttlSeconds (or LIGHTNING_ENABLE_CONFIRMATION_TTL_SECONDS) to change it, clamped to 30-900. For the asynchronous webhook and file channels, 300-600 is a practical value.

Choosing a channel

Precedence: environment variable, then config file, then automatic.

json
{  "confirmation": {    "channel": "webhook",    "webhookUrl": "https://ops.example.com/lightning-approvals",    "webhookSecret": "<shared secret>",    "filePath": "/var/log/lightning-enable/confirmations.jsonl",    "ttlSeconds": 600  }}
Environment variableOverrides
LIGHTNING_ENABLE_CONFIRMATION_CHANNELconfirmation.channel (stderr | refuse | webhook | file)
LIGHTNING_ENABLE_CONFIRMATION_WEBHOOK_URLconfirmation.webhookUrl
LIGHTNING_ENABLE_CONFIRMATION_WEBHOOK_SECRETconfirmation.webhookSecret
LIGHTNING_ENABLE_CONFIRMATION_FILEconfirmation.filePath (default ~/.lightning-enable/confirmations.jsonl)
LIGHTNING_ENABLE_HOSTEDSet to 1 to declare a hosted deployment (see below)

With no channel set, the server decides:

stdinLIGHTNING_ENABLE_HOSTEDChannelStartup warning
A TTYanythingstderrnone
Not a TTYunset or 0stderryes — nobody may be reading it
Not a TTY1refuseyes — over-threshold payments are refused

An stdio MCP server always has a piped stdin, so the warning is a nudge, not a diagnosis: if a human really is watching the console, ignore it. LIGHTNING_ENABLE_HOSTED=1 is the explicit opt-in that turns the safe posture on — nothing flips your behavior automatically.

A channel name the server can't parse fails closed to refuse and says so at startup, so a typo never silently restores a code nobody reads.

The webhook payload

POST with Content-Type: application/json and an HMAC-SHA256 signature over {timestamp}.{body}, the same scheme the Lightning Enable API signs merchant webhooks with:

X-LightningEnable-Signature: t=1757203200,v1=9f86d081...
json
{  "type": "payment.confirmation_required",  "nonce": "AB12CD",  "tool": "pay_invoice",  "amountSats": 50000,  "amountUsd": 12.34,  "destination": "lnbc500u1pj9npjpp5abcdefghijklmnopqr...",  "description": "lnbc500u1pj9npjpp5...",  "summary": "pay_invoice — $12.34 (50,000 sats), invoice lnbc500u1pj9npjpp5...",  "createdAt": "2026-09-07T12:00:00Z",  "expiresAt": "2026-09-07T12:02:00Z",  "expiresInSeconds": 120}

The file channel writes this exact object, one JSON line per confirmation, and pins the file to 0600 on POSIX — it holds live approval codes.

Two things to know about the webhook:

  • The URL must be public. It goes through the same connect-time SSRF guard as agent-supplied URLs, so a private, loopback, or metadata address is refused at startup.
  • Redirects are never followed. A 3xx answer is a delivery failure, so a signed approval only ever reaches the URL you configured.

Codes expire after 120 seconds and are bound to the exact amount, tool, and destination they were approved for.

Supported Wallets

WalletSetupL402 Support
StrikeAPI keyYes
LNDREST + macaroonYes (guaranteed)
NWC (CoinOS)Connection stringYes
NWC (CLINK)Connection stringYes
NWC (Alby Hub)Connection stringYes
OpenNodeAPI keyNo (no preimage)

Spending limits

Limits live in ~/.lightning-enable/config.json and are read-only at runtime — an agent can tighten its own caps but never raise them. You can set them in USD, in satoshis, or both.

json
{  "limits": {    "maxPerPayment": 500.00,    "maxPerSession": 100.00,    "maxPerPaymentSats": 5000,    "maxPerSessionSats": 50000,    "autoApproveSats": 100  }}
KeyEnv varMeaning
maxPerPayment—Max USD per payment
maxPerSession—Max USD per session
maxPerPaymentSatsLIGHTNING_ENABLE_MAX_PER_PAYMENT_SATSMax satoshis per payment
maxPerSessionSatsLIGHTNING_ENABLE_MAX_PER_SESSION_SATSMax satoshis per session
autoApproveSatsLIGHTNING_ENABLE_AUTO_APPROVE_SATSSatoshis a payment may spend without confirmation while the BTC price is unavailable

Defaults. On first run both ports write the same file: approval tiers autoApprove $0.10, logAndApprove $1.00, formConfirm $10.00 and urlConfirm $100.00; maxPerPayment $500.00 and maxPerSession $100.00; requireApprovalForFirstPayment: true; cooldownSeconds 2. A key you leave out of an existing file takes the same default.

An omitted USD limit is not "no limit". If you set only the sats limits, maxPerPayment and maxPerSession still apply at $500.00 and $100.00. To rely on the sats limits alone, set the USD keys to null:

json
{ "limits": { "maxPerPayment": null, "maxPerSession": null, "maxPerSessionSats": 50000 } }

Tiers must ascend. If a tier is above the tier over it, it is lowered to that tier's value, never raised: {"tiers": {"autoApprove": 2}} with the default logAndApprove of $1.00 auto-approves up to $1.00, not $2.00. Set the tiers above it too to raise it.

Why set the sats ones. A USD limit has to be converted at the current BTC price, so when every price source is down the payment cannot be checked and is refused — correct, but it stops the agent. A satoshi limit needs no conversion, so a sats-budgeted agent keeps working through a price outage. Set both maxPer…Sats keys to close every gap.

When both denominations are set, the stricter cap wins on every check. budget(action="status") reports which one is binding (bindingDenomination), the effective cap in sats, whether a price was available, and whether outage mode is active.

What happens during a price outage

The satoshi ceilings still bound the spend. But a ceiling says "never more than this" — it does not say "this much is fine unattended", and the USD tier ladder that normally says the second thing cannot be evaluated without a price. So approval fails closed:

  • autoApproveSats set — payments at or below it are auto-approved; anything above takes the normal confirmation flow (the agent asks the human for the code printed to the server console).
  • autoApproveSats not set — every payment needs confirmation until a price source recovers.

autoApproveSats is a tier, not a ceiling: it can never widen maxPerPaymentSats or maxPerSessionSats, which are checked first. It is ignored entirely while a price is available — then the USD tiers decide as usual.

The auto-pay paths (L402 auto-payment, send_onchain, agent_services action=settle) refuse anything that needs confirmation rather than prompting. During an outage that means they only proceed under autoApproveSats.

Tools

Canonical inventory: the table below. Tools marked Free work out of the box with just a wallet (docs needs nothing at all); tools marked Agentic Commerce require LIGHTNING_ENABLE_API_KEY (an Agentic Commerce subscription). The table is pinned to the code by the tool-inventory guard tests in both ports (ToolInventoryTests.cs, test_server.py), so drift fails CI; quote counts from those tests, never from prose.

Some of these are action tools: pass action (or source for receipts) to pick the operation. All but docs replace a family of single-purpose tools whose schemas used to be loaded into the agent's context on every session — see Tool profiles and old tool names. Every old name still works.

ASA availability note. Against the hosted Lightning Enable API, agent_services actions discover, request, settle, publish, unpublish, and reputation work. attest is refused, because the hosted API has no route that accepts attestations, so you can't leave a review through it. See Agent Service Agreements.

ToolAccessWhat it does
setup_walletFreeReport the configured wallet, or connect one by pasting an NWC connection string
pay_invoiceFreePay a BOLT11 Lightning invoice directly, get the preimage
pay_l402_challengeFreePay an L402 challenge (invoice + macaroon), get the token
access_l402_resourceFreeFetch a URL, auto-paying any L402 challenge
test_l402_paymentFreeSelf-test the wallet against a public 1-sat L402 endpoint
discover_apiFreeSearch the L402 API registry / fetch an API manifest
docsFreeaction: search (ranked sections for a query) or read (a page or one section by path). Reads the Lightning Enable docs without web access; no wallet or API key
create_invoiceFreeCreate a BOLT11 invoice to receive payment
check_invoice_statusFreeCheck whether a created invoice was paid
get_balanceFreeWallet balance: sats, all currencies (Strike), and wallet info
budgetFreeaction: status (read limits and session spend) or tighten (lower the runtime caps)
receiptsFreesource: durable (the append-only receipt log) or session (this session's payments)
wallet_opsFreeaction: price, exchange, or send_onchain (Strike; send_onchain also LND). send_onchain takes address, amountSats, confirmationNonce, and an optional intentId (supply a new one only to pay the same address the same amount again; a repeat is reported as status, never re-sent)
verify_confirmation_codeFreeVerify an out-of-band payment confirmation code (verification only — never pays)
create_lightning_enable_accountFreeSelf-bootstrap signup: pay ~100 sats, get a merchant API key
l402_producerAgentic Commerceaction: configure_receive, status, create_proxy, add_endpoint, publish, list_challenges, create, verify — the whole seller side
agent_servicesAgentic Commerceaction: discover, request, settle, publish, unpublish, attest, reputation
renew_lightning_enable_subscriptionAgentic CommercePay the server-priced L402 invoice that buys or extends 30 days of Agentic Commerce for the configured API key (maxSats defaults to 50,000)

create_lightning_enable_account is free and self-provisions the API key the Agentic Commerce tools need — an agent with a wallet pays a ~100-sat activation fee and unlocks them on the spot.

docs reads llms-full.txt, the whole docs site in one file, and keeps it in memory for an hour. If a refresh fails it serves the cached copy and marks the result stale. Set LIGHTNING_ENABLE_DOCS_URL to read another copy (https://, http:// on localhost, or a local file:// path; network shares are refused). Redirects are not followed: point the variable at the final URL.

Every tool carries MCP annotations: a human-readable title and an explicit readOnlyHint, plus destructiveHint on anything that can spend the wallet. Action tools are annotated for their widest action, so budget is not read-only (because tighten writes) and wallet_ops is destructive (because send_onchain is).

Resources

The durable receipt log is also exposed as MCP resources, so a client can attach or display it without the model spending a turn on a tool call:

URIContents
lightning-enable://receiptsThe most recent 200 receipts as JSONL (application/x-ndjson), oldest first
lightning-enable://receipts/{paymentHash}Every receipt recorded for one payment hash

Both read through the same path as the receipts tool, which redacts credential-shaped fields at the read boundary — a preimage never leaves the process. The payment hash is the safe reference; the preimage is the proof of payment and is not a receipt field. Resources are unaffected by the tool profile: they cost no schema bytes in the model's context.

Tool profiles and old tool names

Every advertised tool's JSON schema is loaded into the agent's context at the start of each session, so the tool surface is a token cost on every turn. Pick how much of it to advertise with LIGHTNING_ENABLE_TOOL_PROFILE:

ProfileToolsUse it when
litesetup_wallet, pay_invoice, access_l402_resource, get_balance, budget, receiptsThe agent only needs to get a wallet, spend, and stay inside its budget
standard (default)The table aboveEverything, with less schema than the old one-tool-per-operation surface
fullstandard plus every pre-consolidation nameYou have prompts or scripts written against the old tool names
json
{  "mcpServers": {    "lightning-enable": {      "command": "uvx",      "args": ["lightning-enable-mcp"],      "env": {        "STRIKE_API_KEY": "your-strike-api-key",        "LIGHTNING_ENABLE_TOOL_PROFILE": "lite"      }    }  }}

Profiles are listing-only. A tool the profile does not advertise is still callable by name, and every old name still dispatches, under every profile. Narrowing the profile trims the schemas pushed into the model's context; it never removes capability.

Old name → new call

Old names are accepted but unadvertised (except under full). Each forwards to the new tool and its result carries a deprecated marker naming the replacement. Removed in v3.0.0 — move to the new names.

Old toolNew call
get_budget_statusbudget(action="status")
configure_budgetbudget(action="tighten")
get_receiptsreceipts(source="durable")
get_payment_historyreceipts(source="session")
get_btc_pricewallet_ops(action="price")
exchange_currencywallet_ops(action="exchange")
send_onchainwallet_ops(action="send_onchain")
create_l402_challengel402_producer(action="create")
verify_l402_paymentl402_producer(action="verify")
discover_agent_servicesagent_services(action="discover")
request_agent_serviceagent_services(action="request")
settle_agent_serviceagent_services(action="settle")
publish_agent_capabilityagent_services(action="publish")
unpublish_agent_capabilityagent_services(action="unpublish")
publish_agent_attestationagent_services(action="attest")
get_agent_reputationagent_services(action="reputation")
confirm_paymentverify_confirmation_code
check_wallet_balanceget_balance
get_all_balancesget_balance

The last three predate this consolidation and stay hidden in every profile, full included.

Documentation

Repository Structure

lightning-enable-mcp/├── dotnet/│   ├── src/LightningEnable.Mcp/         # .NET MCP server│   ├── tests/LightningEnable.Mcp.Tests/  # .NET tests│   └── LightningEnable.Mcp.sln          # Solution file├── python/│   └── lightning-enable-mcp/             # Python MCP server├── .github/workflows/publish-mcp.yml     # CI/CD├── LICENSE                               # MIT└── README.md                             # This file

Selling with L402 (the l402_producer tool)

The whole seller side behind one tool. Pass action to pick the operation. Every action needs LIGHTNING_ENABLE_API_KEY (an Agentic Commerce subscription); no action can spend your wallet.

API version. create, verify, create_proxy, add_endpoint and publish work against every Lightning Enable API build. configure_receive needs the NWC receiving lane and list_challenges needs the challenge-listing route, both of which ship with the API release this version targets. Run l402_producer(action="status") first — it degrades gracefully and tells you what the deployment you are pointed at supports.

ActionArgumentsWhat it does
configure_receivenwc_connection_string (optional)Point L402 payouts at a wallet you control
statuslimitPlan, receiving wallet, onboarding checklist, recent mints (read-only)
create_proxyname, target_base_url, description, default_price_satsPut an existing API behind L402
add_endpointproxy_id, endpoint_id, path, http_method, summary, price_satsPrice one route
publishproxy_id, service_name, service_description, categoriesList the service so other agents can find it
list_challengeschallenge_status, limit, offsetRead back what you minted (read-only)
createresource, price_sats, descriptionMint a one-off invoice + macaroon challenge
verifymacaroon, preimageCheck a payer's token before granting access

From an API key to a paid endpoint

No dashboard, no REST client, no human in the loop. Each step is one tool call:

  1. Get an API key. create_lightning_enable_account — pays a ~100-sat activation fee from your wallet and writes the key to ~/.lightning-enable/config.json. Restart the server so the gated tools unlock. (Skip if you already have a key.)
  2. Point payouts at your own wallet. l402_producer(action="configure_receive") — with no argument it reuses the NWC wallet this server already pays with; pass nwc_connection_string to use a different one. The string is never echoed back, only <set>.
  3. Check where you stand. l402_producer(action="status") — plan, receiving wallet, and the onboarding checklist, so the agent can see what is still missing.
  4. Put your API behind L402. l402_producer(action="create_proxy", name="Weather API", target_base_url="https://api.example.com", default_price_sats=25) — returns a proxy_id and the public base URL. Every request under it now answers 402 until it is paid.
  5. Price each route. l402_producer(action="add_endpoint", proxy_id="weather-api", endpoint_id="forecast", path="/forecast", http_method="GET", price_sats=10) — repeat per route.
  6. List it. l402_producer(action="publish", proxy_id="weather-api", service_description="Five-day forecasts for agents", categories=["weather"]) — returns the OpenAPI and manifest URLs. Other agents find it through discover_api.
  7. Watch the money arrive. l402_producer(action="list_challenges", challenge_status="paid") — payment hash, resource, amount and status. Never a macaroon, never a preimage.

For a resource you are not proxying — a file, a report, a one-off answer — skip steps 4-6 and use create / verify directly.

Payouts settle on your wallet. Lightning Enable does not hold the funds.

Agent Service Agreements (the agent_services tool)

Agent-to-agent commerce on Nostr, behind one tool. Pass action to pick the operation. agent_services requires LIGHTNING_ENABLE_API_KEY (an Agentic Commerce subscription); action="settle" additionally spends your wallet balance, subject to budget limits.

The hosted Lightning Enable API refuses attest, because it has no route that accepts attestations, so you can't leave a review through it; discover, request, settle, publish, unpublish, and reputation work.

ActionDescription
discoverSearch for agent capabilities by category, hashtag, or keyword
publishPublish your agent's services to the Nostr network (kind 38400). Publish once: each call creates a new listing and L402 proxy. To change a listing, unpublish it and publish again, or edit it in the Lightning Enable dashboard
unpublishTake a published listing down: retire the L402 proxy and emit a NIP-09 removal
requestRequest a service from another agent (kind 38401)
settlePay for an agent service via L402 Lightning settlement
attestLeave a review/rating for an agent after service completion (kind 38403)
reputationCheck an agent's reputation score from on-protocol attestations

How Agent Commerce Works

  1. Discover — agent_services(action="discover", category="translation") finds agents offering translation
  2. Request — agent_services(action="request", capability_event_id=..., budget_sats=100) sends a service request
  3. Settle — agent_services(action="settle", l402_endpoint=...) pays via Lightning and receives the result
  4. Review — agent_services(action="attest", subject_pubkey=..., agreement_id=..., rating=5) builds on-protocol reputation (the hosted API refuses this action)

For dynamic pricing, providers use l402_producer(action="create") to generate invoices at the agreed price. Requesters pay and providers verify with l402_producer(action="verify").

The seven old tool names (discover_agent_services, settle_agent_service, …) still work — see Old name → new call.

Related Projects

Privacy

Lightning Enable does not hold funds — the connected wallet or payment provider (Strike, OpenNode, LND, or an NWC wallet) does. The MCP server runs locally and talks to the wallet/provider you configure and, for L402 discovery, the L402 API registry. Wallet credentials you supply stay on your machine (or, for the hosted API, are encrypted at rest). See the full Privacy Policy for what data is collected, third parties involved, retention, and contact ([email protected]).

Support

If something's broken or not working, email [email protected] — a real person reads it. For general questions, join the Discord: https://discord.gg/rX7NxHY8vx. Bug reports and feature requests: open an issue on this repo.

License

MIT — see LICENSE.

Links

来源:README.md,提交 397c677

工具

18

setup_wallet

Set up wallet

Report the wallet this server pays from, or connect one. Call with no arguments first - it also returns the setup steps when no wallet is configured.

输入参数nwc_connection_string

access_l402_resource

Fetch paid resource

Fetch a URL with GET or HEAD, automatically paying any L402 challenge and retrying. Read-only: other HTTP methods are refused. Returns the response plus what was paid.

输入参数url必填bodymethodheadersmax_satsconfirmation_nonce

pay_invoice

Pay Lightning invoice

Pay a BOLT11 Lightning invoice directly and get the preimage as proof.

输入参数invoice必填max_satsconfirmation_nonce

pay_l402_challenge

Pay L402 challenge

Pay an L402 or MPP invoice yourself and get the authorization token. Omit macaroon for MPP; pass challenge_header for a draft-00 Payment challenge.

输入参数invoicemacaroonmax_satschallenge_headerconfirmation_nonce

test_l402_payment

Wallet self-test

Self-test the wallet by paying the public 1-sat L402 test endpoint end to end. A 'needs_confirmation' verdict means the server printed a code to its console; re-run with confirmation_nonce.

输入参数confirmation_nonce

get_balance

Wallet balance

Get the connected wallet's balance in sats, plus all currency balances and wallet info where the wallet reports them.

无需输入参数。

budget

Budget

View or tighten this session's spending limits. Tightening is one-way - an agent can lower its caps but never raise the operator's config limits.

输入参数action必填per_requestper_session

receipts

Payment receipts

List payments this wallet made. The durable log persists across restarts and says how to revoke the wallet; the session list is in-memory only.

输入参数limitsincesource必填

create_invoice

Create invoice

Create a BOLT11 Lightning invoice to receive a payment.

输入参数memoamount_sats必填expiry_secs

check_invoice_status

Invoice status

Check whether an invoice from create_invoice has been paid.

输入参数invoice_id必填

verify_confirmation_code

Verify confirmation code

Check whether a payment confirmation code is still valid and what it authorizes. Verification ONLY - it never pays; to pay, re-call the payment tool with confirmation_nonce.

输入参数nonce必填

discover_api

Discover L402 APIs

Discover L402 APIs: search the registry with query/category, or fetch one API's manifest with url.

输入参数urlquerycategorybudget_aware

docs

Lightning Enable docs

Search or read the Lightning Enable docs. search: query -> sections. read: path, optional section -> text.

输入参数pathlimitqueryaction必填section

create_lightning_enable_account

Create Lightning Enable account

Self-bootstrapping signup: pay a ~100-sat activation fee for a Lightning Enable merchant API key. Needs only a wallet; the key is saved to ~/.lightning-enable/config.json.

输入参数email必填max_satsconfirmation_nonce

wallet_ops

Wallet operations

Wallet operations beyond invoices: BTC price, currency exchange, on-chain sends. Strike only (send_onchain also works on LND).

输入参数action必填amountaddressintent_idamount_satssource_currencytarget_currencyconfirmation_nonce

l402_producer

L402 producer

Sell access with L402: set up the seller account, monetize an API, mint challenges and verify payer tokens. Requires LIGHTNING_ENABLE_API_KEY.

输入参数namepathlimitaction必填offsetsummarymacaroonpreimageproxy_idresourcecategoriesprice_sats另有 9 个

agent_services

Agent services

Agent Service Agreements over Nostr: discover, request, settle, publish and review agent services. Requires LIGHTNING_ENABLE_API_KEY.

输入参数bodylimitproofqueryaction必填methodpubkeyratingreasoncontentcategoryhashtags另有 12 个

renew_lightning_enable_subscription

Renew Lightning Enable subscription

Pay the L402 invoice that buys or extends 30 days of Lightning Enable Agentic Commerce for the configured API key. Needs a preimage-capable wallet.

输入参数max_satsconfirmation_nonce

版本历史

7
  1. v2.2.0最新Nov 4, 2026
  2. v2.1.1Oct 22, 2026
  3. v2.1.0Oct 12, 2026
  4. v2.0.5Sep 25, 2026
  5. v2.0.3Sep 25, 2026
  6. v2.0.2Sep 23, 2026
  7. v2.0.1Sep 16, 2026

评分

已满足适用检查项的 90%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分
  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分