Paying with a Tempo wallet

Machine payments let an agent pay per call and keep working without a human. This page covers the wallet side, which the MPP docs assume you already have.

You probably do not need this

Most people should stop here. MPP exists for one case: an autonomous agent that must pay mid-task with nobody watching. If a person is in the loop, every row above the last one is faster and cheaper.

What you wantUseCost
Just to see the dataKeyless trial: search_funds, get_fundFree, 10 calls/day, no signup
To build on the free toolsFree API keyFree, 100 calls/month
Signals (GP profiles and matching on Pro)Pro subscription€29/mo, card
An agent paying per call, unattendedThis page€0.10 per signals call

1. What the challenge asks for

Call a paid tool with no credential and you receive a challenge that decodes to:

method:     tempo
intent:     charge
chainId:    4217                                        (Tempo mainnet)
currency:   0x20C000000000000000000000b9537d11c60E8b50   (USDC / USDC.e)
amount:     115375                                       (example: 6 decimals = $0.115375)
expires:    5 minutes

The amount is an example. It is the EUR price converted to USDC at the ECB daily reference rate plus a 1.5% buffer, so it moves a little every day. Current EUR prices are in the tools reference.

The token, because this has already confused someone

The currency address above is USDC (USDC.e) on Tempo mainnet. It is not pathUSD. pathUSD lives at 0x20c0000000000000000000000000000000000000 and is a different thing entirely: the quote token for Tempo's native exchange and the fallback gas token. If you compared against the pathUSD address in Tempo's own docs, that is why it did not match.

TIP-20 tokens use 6 decimals, so 115375 is $0.115375, not 115,375 of anything.

2. A wallet on Tempo mainnet

Any EVM wallet works. Add the network manually:

Network name:  Tempo
RPC URL:       https://rpc.tempo.xyz
Chain ID:      4217
Explorer:      https://explore.tempo.xyz

Two things that look broken and are not:

  • Your native balance shows a nonsense number. Tempo has no native gas token, so wallets display a placeholder.
  • Gas is paid in stablecoins. Fees come out of a TIP-20 balance rather than a separate gas asset, and cost well under a cent.

Add USDC as a custom token using the address above, or your balance will not appear at all.

3. Funding it

This is the step we cannot yet document honestly.

What we know: you need USDC on Tempo mainnet, chain 4217, at the token address above. The Tempo CLI exposes tempo wallet fund, and the MPP docs cover the CLI well.

What we will not guess at:

  • the practical onramp routes into Tempo mainnet USDC from EUR or a card
  • the minimum top-up. Our first tester estimated $5 to $20 and that was his main hesitation. We will fund a wallet ourselves and publish the real number here.

If you get there before we do, tell us what it cost and your route goes on this page.

On MPP Credits

Asked for, and the honest answer is no. The mppx version this server runs has no credits concept at all: its intents are charge, session and subscription, and nothing in its surface mentions credits. tempo wallet fund --credits is a wallet-side onramp rather than something a server advertises. If credits become part of the protocol we will support them and say so here, because card-payable credits would remove most of this page.

4. Paying a challenge

With a funded wallet, an MPP-aware client handles the round trip: it calls, receives the challenge, signs, retries with the credential, and gets the data plus a receipt. Two details specific to this endpoint:

  • MCP clients get the challenge on a 200, not a 402. The JSON-RPC error carries code -32042 with the challenge in error.data.challenges. Plain HTTP callers get a real 402 with WWW-Authenticate instead. That is mppx's convention, not ours.
  • Return the credential in params._meta. MCP clients cannot set an HTTP header on a tool call, so the server bridges it.

Challenges expire after five minutes. Request a fresh one rather than reusing.

5. Timeouts and retries

Retrying never costs twice

The same call returns the same challenge, never a new one. Once that challenge is paid, the same call returns the stored result free. A timeout followed by a retry cannot produce two payments.

The boundary is derived from the payer, the tool and the canonical arguments, so you do not have to set anything. Argument order does not matter: keys are sorted before comparison. To choose the boundary yourself:

{ "params": { "_meta": { "vc.fundmomentum/idempotency-key": "your-id" } } }

An agent does not need this page to find that out: every challenge carries the same guarantee in error.data.idempotency, with guaranteed, meta_key, meta_key_optional and a note.

Set your timeout generously for match_startup. It takes three to ten seconds because it reasons over the whole database. That is normal, not a hang. The retry guard exists as a safety net, not as a substitute for a sensible timeout.

6. If something goes wrong

What you seeWhat it means
-32042Normal. Challenge attached in error.data.challenges, nothing charged.
-32043Your credential did not verify. You may have paid. Send us the transaction hash and we will credit it by hand.
-32000, error_reason: "not_found", with checked_before_payment: trueThe slug does not exist, or that fund has no published signals. You were not charged, and the message names the closest real slugs.
-32602, error_reason: "invalid_args", with checked_before_payment: trueAn unknown, missing or malformed parameter. Checked before any challenge, so you were not charged. The message names what it expected.

A -32043 is the one to report immediately. It means money may have moved without data coming back, and we would rather hear about it than have you absorb it.

What we would rather you did

Tell us where you stopped. A failed run explains more than a successful one, and this page exists because someone did exactly that.

michael@fundmomentum.vc · Agent overview · MCP setup