Ask Bruno

Ask me any questions from your agent.

Install

Two steps: give your agent a way to pay, then give it the skill.

1. Give your agent a wallet

Asking costs 0.25 USD, charged over HTTP 402. Your agent needs to be able to pay that. The shortest route is Coinbase's payments connector:

npx @coinbase/payments-mcp

Sign in with an email, top it up with USDC, and set a spending limit — per call and per session. After that your agent pays small charges on its own without asking you each time. No seed phrase, no API key.

Any x402-capable client works. There is no account with us, and nothing to configure on this end.

2. Install the skill

For Claude Code, or any harness that loads Agent Skills:

curl --create-dirs -o .claude/skills/ask-bruno/SKILL.md \
  https://ask.brunocalza.me/skill/SKILL.md

It is plain markdown and depends on nothing. Note that it is a copy on your disk: re-run the command occasionally to pick up changes.

While payment is switched on, the MCP connector at https://ask.brunocalza.me/mcp can read answers but cannot ask questions — there is no way to settle a payment inside an MCP tool call. Asking goes over HTTP.

Either way, there is no account, no API key, no OAuth and no SDK.

Using it

Tell your agent to ask Bruno. It will also reach for the skill on its own when a human read on the problem would help more than another inference pass.

ask Bruno whether this architecture is overengineered

Answers come from a person, so they take minutes or hours, not milliseconds. The skill tells your agent to keep working and check back rather than sit and block. Bruno can also decline a question, and your agent is told why.

Payment

A question costs 0.25 USD, charged over HTTP 402. Nothing is configured here. Payment belongs to your agent's own payment environment.

POST /api/ask            -> 402, with price and payment method
   pay, then retry       -> 201, question accepted

If your harness supports the offered payment method and is authorized to spend, it settles and retries on its own. If it cannot pay, it reports the price to you and stops. It will not ask you to paste a card number, because there is nowhere here to paste one.

The live price and whether payment is required are always served from GET /api. Read that rather than trusting this page.

The protocol

Only needed if you are writing your own client instead of using the skill.

GET  https://ask.brunocalza.me/api              discovery: price, availability, public key
POST https://ask.brunocalza.me/api/ask          {"question": "...", "context": "..."}
GET  https://ask.brunocalza.me/api/asks/:id     pending | completed | declined

POST /api/ask returns an id and a status URL. Poll the status URL no faster than the poll_after_seconds it gives you. A question ends in exactly one of three states, and there are no others planned.

Verifying an answer

A completed answer carries an Ed25519 signature over the question hash, the answer hash, and the timestamp. Verify it against this key and you know the answer you are holding is the answer that was given, unaltered.

GQVbNbNXXqVBEFZyJ2UvL4eJSWphMjZtCEJZLf18_8M

The exact payload construction is documented in GET /api.

Limits

Privacy

Do not send secrets, credentials, keys, or personal data you do not need to send. Summarize sensitive material instead of pasting it. The skill tells your agent the same thing.

Questions are not published. Status URLs carry high-entropy ids, are not indexed, and anyone holding one can read that question, so treat the URL as the secret it is.