Agents
One endpoint, one key, ten tools. An agent can read the market, fund a coin and check what it is holding without a browser. Nothing on this side of the wire signs.
The endpoint
- url
POST https://bidmeme.com/api/mcp- protocol
- JSON-RPC 2.0, the Model Context Protocol shape:
tools/listandtools/call. - auth
Authorization: Bearer bme_live_…- keys
- Minted at /account, shown once, revocable. A key answers only for the account that made it.
- money
- Integer cents, and every amount on chain is a whole cent. A coin is charged for the hours delivered to it and for nothing else.
- signing
- Nothing here signs. A tool returns typed data for your own wallet, and there is no tool that deposits, withdraws or claims.
Tools
| Tool | Arguments | Returns |
|---|---|---|
| now | {} | what is on the bar: the takeover holder and tier, bars per coin, the live price, hours delivered today |
| get_coin | { chain_id: string, token_address: string } | one coin's balance, pace, bars today, runway and the bar it cleared |
| list_listings | {} | every admitted coin with each check and the threshold it was measured against |
| get_prices | { tokens: Array<{ chain_id, token_address }> } | the feed's last word on up to fifty coins |
| scan_coin | { chain_id: string, token_address: string } | one token contract read on the chain: whether it could be bought and sold at the block it was read, what a sale costs, who can still change it |
| takeover_quote | { tier?: "split" | "full" } | the live quote by tier, the reserve, the holder, and the month's remaining days |
| prepare_contribution | { chain_id, token_address, amount_cents, spread_days? } | the typed data to sign in your own wallet. It does not pay and cannot |
| prepare_takeover | { tier: "split" | "full", days: number } | the typed data to buy a block. Same rule |
| my_contributions | {} | your own streams: remaining, pace, ceiling, runway |
| my_claims | {} | your cumulative leaf and the Claim to sign. No call data, and no tool that submits |
Every my_ tool is filtered on the account the key names, so no tool ever answers with somebody else's data.
Setup
For a client that reads a servers file. Any client that can POST JSON with a header works the same way.
mcp servers config
{
"mcpServers": {
"bidmeme": {
"url": "https://bidmeme.com/api/mcp",
"headers": { "Authorization": "Bearer bme_live_your_key" }
}
}
}A worked example
Putting money behind a coin at a speed, as three calls.
now, get_coin, prepare_contribution
// Goal: put $200 behind a coin, spent over a week.
// 1. Read what the market is doing.
→ { "jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": { "name": "now", "arguments": {} } }
← { "bars_today": 287, "price_cents_per_hour": 302, "reference_rate_cents_per_hour": 250,
"takeover": { "symbol": "NRTH", "tier": "split" },
"coins": [ { "symbol": "NRTH", "bars_today": 141, "pace_cents_per_day": 62400 }, ... ] }
// 2. Check the coin is admitted and see what is already behind it.
→ { "jsonrpc": "2.0", "id": 2, "method": "tools/call",
"params": { "name": "get_coin", "arguments": {
"chain_id": "eip155:8453", "token_address": "0x..." } } }
← { "balance_cents": 184000, "pace_cents_per_day": 62400, "bars_today": 141, "runway_days": 2.9 }
// 3. Ask for the typed data. Nothing here signs and there is no key on this
// side of the wire: the signature is your wallet's and the deposit is a
// transaction you send.
→ { "jsonrpc": "2.0", "id": 3, "method": "tools/call",
"params": { "name": "prepare_contribution", "arguments": {
"chain_id": "eip155:8453", "token_address": "0x...",
"amount_cents": 20000, "spread_days": 7 } } }
← { "domain": { "name": "BidMeme", "version": "1", "chainId": 8453, "verifyingContract": "0x..." },
"types": { ... }, "message": { "amount": "2000000", "pace_per_day": "285714", ... } }Keys are rate limited, counted per tool call so a batch cannot buy a discount. A coin that has not been admitted is refused with the reason, and so is one the killswitch has taken off every bar.