nostr-merchant
The AI that runs your NOSTR business. A local-first Python agent that holds the whole merchant toolkit — it checks its Lightning wallet, publishes notes and listings, runs a Shopstr storefront, answers encrypted DMs, triages its NOSTR inbox to draft and post replies, and pays for paywalled MCP tools over NWC — all under sats budget caps it can't exceed. Built on five MCP servers (nwc-mcp, nostr-ops-mcp, marketplace-mcp, albyhub-admin-mcp, paywall-mcp) — 37 tools the agent picks from.
Ollama-first, API-pluggable. Built on pydantic-ai — no LangChain. MIT.
v0.3 — engagement inbox. Seven CLI commands.
nostr-merchant inboxtriages replies/mentions on your recent posts and drafts responses in your voice (read-only, language-matched);inbox --postwalks each draft (approve / edit / skip), confirms, and publishes the approved ones as NIP-10 replies. The agent layer enforces a budget-and-audit safety pipeline on top of every MCP server's own safety stack; the self-paying-for-tools loop holds end to end given a working LLM backend (Ollama / Anthropic / OpenAI). (Renamed fromllmops-agentin v0.2.)
Install
pipx install nostr-merchant # recommended: isolated CLI
# or: uvx --from nostr-merchant nostr-merchant --help
# or: pip install nostr-merchant
The five MCP servers it drives are launched on demand via npx -y — no separate install. You need Python 3.11+, an NWC-compatible wallet (e.g. Alby Hub), and an LLM backend (see Usage).
Status
| Layer | State |
|---|---|
| Design doc | ✅ Done — ../03-python-reference-agent-design.md |
Package scaffold (uv init, pyproject.toml, ruff/mypy/pytest config) |
✅ Done |
config.py — env-driven Pydantic Settings |
✅ Done |
budget.py — persistent rolling-window tracker |
✅ Done |
audit.py — NDJSON writer |
✅ Done |
mcp_servers.py — MCPServerStdio launch + doctor probe |
✅ Done |
agent.py — Pydantic AI agent + process_tool_call middleware |
✅ Done |
workflows/research.py — self-paying research workflow |
✅ Done |
cli.py — typer entry-point with ask / doctor / budget / audit / config-print / version |
✅ Done |
| Live LLM smoke test (Anthropic Haiku) | ✅ Done — end-to-end ask returns a real nwc_get_balance receipt with all 37 substrate tools loaded |
Usage
# from this directory, with uv-installed venv
uv run nostr-merchant --help
uv run nostr-merchant version
uv run nostr-merchant budget # snapshot, no LLM needed
uv run nostr-merchant config-print # effective config, secrets masked
uv run nostr-merchant doctor # ping each configured MCP server
uv run nostr-merchant ask "What's my Lightning wallet balance?" # the main demo loop
uv run nostr-merchant audit --tail 20 # recent audit entries
Or run the whole sequence with the bundled script: ./smoke.sh (full run — the ask is read-only, so it can never move sats) or ./smoke.sh --no-ask (skip the LLM call entirely).
ask requires a working LLM backend, set via NOSTR_MERCHANT_MODEL:
anthropic:claude-haiku-4-5-20251001(or any Anthropic/OpenAI model) — fast, reliable tool-calling. SetANTHROPIC_API_KEY(orOPENAI_API_KEY) in~/.nostr-merchant/.env. Recommended for most setups.ollama:<model>— fully local, no KYC, no phone-home (the sovereignty default). Needs Ollama atlocalhost:11434. Reality check: a 37-tool agent loop wants real hardware — a small model on a CPU-only box is too slow to be practical. Run Ollama on a GPU, or use a hosted model and keep your wallet + keys local (the trust boundary that actually matters).
Provider creds in ~/.nostr-merchant/.env are loaded automatically — no need to export them.
Dev loop
uv sync # install deps + dev deps into .venv
uv run ruff check # lint
uv run mypy # type check
uv run pytest # tests
Build wheel for distribution:
uv build
License
MIT — see LICENSE.
Contact
Built by LLMOps.Pro.
- NOSTR:
npub1hdg932jvwc3jdvkqywgqv0ue4nn60exrf92asy8mtazt3hjg7d2s2yw0nw - Lightning Address:
sovereigncitizens@getalby.com - Shopstr: shopstr.store/marketplace/SOVEREIGN_CITIZENS
Metadata
Release files for nostr-merchant 0.5.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| nostr_merchant-0.5.1.tar.gz | 34.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| nostr_merchant-0.5.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 74.8 kB
Release files / nostr_merchant-0.5.1.tar.gz
| Download URL | nostr_merchant-0.5.1.tar.gz |
|---|---|
| Size | 34.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bec29b358618a8d124625048d6e8c10c1abceb9c98e3e10dbcf8061d3fc419d6
|
|
BLAKE2b-256 checksum How to use checksums |
1924b0bba4e579dd16d6c8fa01fddc5fcf5937552d84629af69c6549caf3e4e4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.14
|
Release files / nostr_merchant-0.5.1-py3-none-any.whl
| Download URL | nostr_merchant-0.5.1-py3-none-any.whl |
|---|---|
| Size | 40.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
033f3a9b728e6f08af7085c914689e4877597125a2169fc684554bf5e295eae0
|
|
BLAKE2b-256 checksum How to use checksums |
bc9c152ca5ce6b4baf34f84b54d169653eb0f6c5f1ee2e8cb6c818918ebecd5b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.14
|