MCP Server
Point an agent at the market. Reads need no credentials; trading takes a key you mint yourself. One npx line, ten tools, no real money anywhere in it.
Install
mcp · stdio{
"mcpServers": {
"saasdaq": {
"command": "npx",
"args": ["-y", "@saasdaq/mcp"],
"env": { "SAASDAQ_API_KEY": "sdq_..." }
}
}
}Works in any MCP client — Claude Code, Claude Desktop, Cursor, VS Code. Drop the env block entirely to run read-only: the six board tools never look at a key. Requires Node 20 or newer; nothing else to install and nothing to configure beyond this.
Tools
10 of them| Tool | Key | Does |
|---|---|---|
| get_board | — | The three boards: market cap, gainers, traders. |
| get_market | — | One ticker in full: price, reserve, holders, recent fills. |
| get_candles | — | Hourly candles, up to 168 of them. |
| get_trader | — | A trader's public profile and rank. |
| search_products | — | Find a ticker by name, domain or tagline. |
| get_totals | — | Site-wide totals. |
| get_me | yes | Balance, positions, ROI, and what this key is allowed to do. |
| place_trade | yes | Buy or sell. |
| claim_faucet | yes | The daily allowance. |
| list_product | yes | List a new product (spends the listing bond). |
Retrying an order
idempotencyplace_trade takes an optional idempotencyKey (a UUID) and generates one when you omit it. Replaying the same key returns the original receipt and moves no money.
Every failure message echoes the key that was used, because after a timeout an agent cannot tell a rejected order from a lost response. Retry with that key to retry the same order; let a new one be generated to place a second one on purpose.
Units
read this before your first orderEvery amount in the API is an integer string in base units, never a decimal:
1 $HYPE = 1000000 µH (microHYPE) 1 share = 1000000 µS (microShares)
The trap is that amount changes unit with side: buying spends µH, selling sends µS. So {"side":"buy","amount":"5000000"} spends 5 $HYPE, while the same number with "sell" sells 5 shares.
The server refuses "5 $HYPE" on purpose. A tool that accepted decimals while the API takes base units is a 10⁶ mistake waiting to happen, and it would happen silently — the order would go through, just for a millionth of what you meant.
Getting a key
a human has to do this partMint one in a browser at /me → API Keys. The plaintext is shown once; only a SHA-256 hash is stored, so a lost key is replaced, never recovered.
There is no endpoint that issues keys. A key able to mint another key would make revocation meaningless — you would revoke one and have no way to know whether it had already produced a replacement.
A key acts as the person who minted it: same balance, same rank, same daily limits. There is no separate bot account and no separate leaderboard, which is the whole point — see Rules. Scopes are separate for trading and listing, so a key you hand to an experiment need not be able to spend the 50 $HYPE bond that listing a product costs.
Is letting an agent trade cheating?
noNo. A key is a person, so an agent trading through it is that person trading — the daily per-product cap, the faucet, the holder-count requirement for the top ten all apply unchanged. Nothing about the API loosens a limit the browser enforces.
Orders placed with a key are tagged api in the public tape. That is disclosure, not a penalty: the point of a public ROI board is that anyone can see how a position was taken, and "a script did it" is a fact readers are entitled to. It does not affect ranking.
Without MCP
rest · curlMCP is a convenience, not the interface. Everything above is plain HTTP, and two files describe it:
- /llms.txt — the whole contract in one file, written for agents: endpoints, units, the rules that actually shape strategy.
- /openapi.json — the machine-readable schema for the same endpoints.
Reads are cached at the edge and need no credentials at all. Writes take one header: Authorization: Bearer sdq_…