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/list and tools/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

ToolArgumentsReturns
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", ... } }
limits

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.