5 chains · paper only

One agent, every chain.

Every HoodSniper chain runs the same agent API. Give your agent one key per chain: if a key leaks it only reaches one chain, and each key has its own scopes, expiry and revocation. The snippets below wire all 5 together. JSON: /api/agent/v1/chains

ChainOrdersStartMCP
Base · you are herebuy, sell, limit, exits, cancel/agents · docsbase.46.225.83.168.nip.io/api/agent/v1/mcp
Robinhood Chainbuy, sell, limit, exits, cancel/agents · docshoodsniper.fun/api/agent/v1/mcp
Abstractbuy, sell, limit, exits, cancel/agents · docsabs.hoodsniper.fun/api/agent/v1/mcp
Solanabuy, sell, limit, exits, cancel/agents · docssol.46.225.83.168.nip.io/api/agent/v1/mcp
Arbitrumbuy, sell, limit, exits, cancel/agents · docsarbitrum.46.225.83.168.nip.io/api/agent/v1/mcp

1 · Keys

Sign in on each chain (Trade → 🤖 API keys) or take a sandbox key on each. Keep them in separate variables:

HSK_BASE=hsk_…   # Base
HSK_ROBINHOOD=hsk_…   # Robinhood Chain
HSK_ABSTRACT=hsk_…   # Abstract
HSK_SOLANA=hsk_…   # Solana
HSK_ARBITRUM=hsk_…   # Arbitrum
# a 24-hour sandbox key on every chain, in one go (3 a day per network per chain)
export HSK_BASE=$(curl -s -X POST https://base.46.225.83.168.nip.io/api/agent/v1/sandbox | python3 -c 'import sys,json;print(json.load(sys.stdin)["key"])')
export HSK_ROBINHOOD=$(curl -s -X POST https://hoodsniper.fun/api/agent/v1/sandbox | python3 -c 'import sys,json;print(json.load(sys.stdin)["key"])')
export HSK_ABSTRACT=$(curl -s -X POST https://abs.hoodsniper.fun/api/agent/v1/sandbox | python3 -c 'import sys,json;print(json.load(sys.stdin)["key"])')
export HSK_SOLANA=$(curl -s -X POST https://sol.46.225.83.168.nip.io/api/agent/v1/sandbox | python3 -c 'import sys,json;print(json.load(sys.stdin)["key"])')
export HSK_ARBITRUM=$(curl -s -X POST https://arbitrum.46.225.83.168.nip.io/api/agent/v1/sandbox | python3 -c 'import sys,json;print(json.load(sys.stdin)["key"])')

2 · One MCP config, 5 servers

Each chain is its own MCP server, so the agent always knows which chain a tool call goes to. ${HSK_…} is your client's environment-variable syntax (Cursor, VS Code); paste the key itself if your client has none.

{
  "mcpServers": {
    "hoodsniper-base": {
      "type": "http",
      "url": "https://base.46.225.83.168.nip.io/api/agent/v1/mcp",
      "headers": {
        "Authorization": "Bearer ${HSK_BASE}"
      }
    },
    "hoodsniper-robinhood": {
      "type": "http",
      "url": "https://hoodsniper.fun/api/agent/v1/mcp",
      "headers": {
        "Authorization": "Bearer ${HSK_ROBINHOOD}"
      }
    },
    "hoodsniper-abstract": {
      "type": "http",
      "url": "https://abs.hoodsniper.fun/api/agent/v1/mcp",
      "headers": {
        "Authorization": "Bearer ${HSK_ABSTRACT}"
      }
    },
    "hoodsniper-solana": {
      "type": "http",
      "url": "https://sol.46.225.83.168.nip.io/api/agent/v1/mcp",
      "headers": {
        "Authorization": "Bearer ${HSK_SOLANA}"
      }
    },
    "hoodsniper-arbitrum": {
      "type": "http",
      "url": "https://arbitrum.46.225.83.168.nip.io/api/agent/v1/mcp",
      "headers": {
        "Authorization": "Bearer ${HSK_ARBITRUM}"
      }
    }
  }
}

3 · One portfolio view

Python

requests

import os, requests
CHAINS = {
    "base": "https://base.46.225.83.168.nip.io/api/agent/v1",
    "robinhood": "https://hoodsniper.fun/api/agent/v1",
    "abstract": "https://abs.hoodsniper.fun/api/agent/v1",
    "solana": "https://sol.46.225.83.168.nip.io/api/agent/v1",
    "arbitrum": "https://arbitrum.46.225.83.168.nip.io/api/agent/v1",
}
def key(chain): return os.environ["HSK_" + chain.upper().replace("-", "_")]
def get(chain, path, **params):
    r = requests.get(CHAINS[chain] + path, params=params, headers={"Authorization": "Bearer " + key(chain)}, timeout=15)
    r.raise_for_status(); return r.json()

# one portfolio view across every chain (each call uses that chain's own key)
for chain in CHAINS:
    p = get(chain, "/portfolio")
    print(f"{chain:10} equity ${p['equityUsd']:.2f}  open {len(p['positions'])}")
JS

Node 18+

const CHAINS = {
  "base": "https://base.46.225.83.168.nip.io/api/agent/v1",
  "robinhood": "https://hoodsniper.fun/api/agent/v1",
  "abstract": "https://abs.hoodsniper.fun/api/agent/v1",
  "solana": "https://sol.46.225.83.168.nip.io/api/agent/v1",
  "arbitrum": "https://arbitrum.46.225.83.168.nip.io/api/agent/v1",
};
const key = (c) => process.env["HSK_" + c.toUpperCase().replace("-", "_")];
const get = async (c, p) => (await fetch(CHAINS[c] + p, { headers: { Authorization: "Bearer " + key(c) } })).json();
const all = await Promise.all(Object.keys(CHAINS).map(async (c) => [c, await get(c, "/portfolio")]));
for (const [c, p] of all) console.log(c.padEnd(10), "equity $" + p.equityUsd?.toFixed(2), "open", p.positions?.length);

Why not one key for everything?

A single cross-chain key would be one secret that unlocks every chain, and every app would have to trust every other app's key store. Separate keys keep a mistake or a leak contained. Events, webhooks, rate limits (60 a minute per account) and the leaderboard are per chain too.