Openfloor documentation
Turn any AI agent into a trading desk for tokenized stocks on Robinhood Chain. Ask it for prices, test ideas on three months of real history, trade on paper at live prices. No signup. No API keys.
Install
Nothing to install. Add the hosted endpoint to your agent. Add an API key from your account to unlock paper trading and history.
Read https://openfloor.trade/agents.md and set yourself up with Openfloor so you can read, backtest and paper trade tokenized stocks on Robinhood Chain.
| Client | Command |
|---|---|
| Any agent | Read https://openfloor.trade/agents.md and set yourself up with Openfloor so you can read, backtest and paper trade tokenized stocks on Robinhood Chain. |
| Claude Code | claude mcp add --transport http openfloor https://openfloor.trade/api/mcp |
| Cursor · JSON | {
"mcpServers": {
"openfloor": { "url": "https://openfloor.trade/api/mcp" }
}
} |
| Endpoint | https://openfloor.trade/api/mcp |
Recommended workflow
aboutgives the agent the map: data sources, caveats, tool order.list_assetswithhasFeed: truelists the 38 tokens that have history.market_statusandget_priceestablish the session and the current oracle price.get_historythenbacktest, iterate on params or write custom code.find_poolsandquotecheck that the size you want actually fills at a sane price.- With an API key:
paper_orderfor a few days, thenpaper_portfolioto read the PnL.
Tools
aboutWhat the server does, data sources, caveats and the recommended workflow. Agents call it first.
list_assetsEvery Robinhood stock token and ETF with address, decimals, multiplier and whether it has an oracle feed.
{ "hasFeed": true }market_statusRegular, extended, overnight or closed, plus the next open and close in ET.
get_priceLatest Chainlink price with age and staleness. Token price and implied share price.
{ "symbols": ["NVDA", "AAPL"] }get_historyOHLC bars built from every oracle update since launch. 15m to 1d.
{ "symbol": "NVDA", "interval": "1h" }list_presetsBuilt-in strategies and the full ctx API for writing your own.
backtestRun a preset or your own JavaScript on real bars. Return, drawdown, Sharpe, trades, equity curve.
{ "symbol": "NVDA", "preset": "sma_cross", "params": { "fast": 8, "slow": 34 } }find_poolsUniswap v4 and v3 pools for an asset with liquidity and 24h volume, plus the on-chain spot.
{ "symbol": "TSLA" }quoteExact-input quote on the deepest pool with price impact and premium versus the oracle.
{ "symbol": "NVDA", "side": "buy", "amount": 1000 }paper_orderSimulated fill at live oracle or pool price with fees. Kept in your account between sessions.
{ "symbol": "SPY", "side": "buy", "usd": 500 }paper_portfolioCash, positions marked to market, PnL and recent fills.
paper_resetFresh paper book with a chosen starting cash.
Strategy API
A strategy is plain JavaScript with an onBar(ctx) function. It runs in a sandbox with a CPU budget, no network and no filesystem. The agent usually writes it in one shot from the description below.
Your code runs in a sandbox with no network or filesystem. Define:
function onBar(ctx) { ... } // called once per bar, oldest to newest
function onStart(ctx) { ... } // optional, called once before the first bar
ctx fields:
bar current bar {time, t, open, high, low, close, updates, session}
bars all bars up to and including the current one (array)
i index of the current bar
close(n) array of the last n closes (oldest first)
position quantity held (0 when flat)
cash cash in USD
equity cash + position * bar.close
entryPrice average entry price of the open position (0 when flat)
params the params object you passed to backtest
session 'regular' | 'extended' | 'overnight' | 'closed' at bar time
dow, hourET day of week (0=Sunday) and hour in New York time
buy(fraction=1, reason?) spend this fraction of cash at the bar close (after costs)
sell(fraction=1, reason?) sell this fraction of the position
closeAll(reason?) flatten
log(...args) collect debug output (max 200 lines)
sma(n), ema(n), rsi(n), stdev(n), highest(n), lowest(n), change(n) indicators on closes up to now
Fills happen at the current bar close, minus fee and slippage. Shorting is not supported.Example, a crossover restricted to the regular session:
function onBar(ctx) {
if (ctx.session !== 'regular') return
if (ctx.i < 40) return
const fast = ctx.sma(10), slow = ctx.sma(40)
if (fast > slow && !ctx.position) ctx.buy(1, 'cross up')
if (fast < slow && ctx.position) ctx.sell(1, 'cross down')
}Presets
buy_holdno paramsBuy on the first bar and hold.
function onBar(ctx){ if(ctx.i===0) ctx.buy(1,'initial') }sma_cross{"fast":10,"slow":40}Long when the fast SMA is above the slow SMA, flat otherwise.
function onBar(ctx){
const {fast, slow} = ctx.params
if (ctx.i < slow) return
const f = ctx.sma(fast), s = ctx.sma(slow)
if (f > s && !ctx.position) ctx.buy(1, 'fast>slow')
else if (f < s && ctx.position) ctx.sell(1, 'fast<slow')
}rsi_meanrev{"period":14,"low":30,"high":60}Buy when RSI drops under the low threshold, exit above the high one.
function onBar(ctx){
const {period, low, high} = ctx.params
if (ctx.i < period + 1) return
const r = ctx.rsi(period)
if (r < low && !ctx.position) ctx.buy(1, 'rsi ' + r.toFixed(1))
else if (r > high && ctx.position) ctx.sell(1, 'rsi ' + r.toFixed(1))
}weekend_gapno paramsHold through the weekend: buy in the last regular hour on Friday, sell in the first regular hour on Monday. Meant for 1h or 15m bars.
function onBar(ctx){
if (ctx.dow === 5 && ctx.session === 'regular' && ctx.hourET >= 15 && !ctx.position) ctx.buy(1,'friday close')
if (ctx.dow === 1 && ctx.session === 'regular' && ctx.position) ctx.sell(1,'monday open')
}breakout{"entry":20,"exit":10}Buy a close above the N-bar high, sell a close below the M-bar low.
function onBar(ctx){
const {entry, exit} = ctx.params
if (ctx.i < entry) return
const hi = ctx.highest(entry, 1), lo = ctx.lowest(exit, 1)
if (ctx.bar.close > hi && !ctx.position) ctx.buy(1,'breakout')
else if (ctx.bar.close < lo && ctx.position) ctx.sell(1,'breakdown')
}regular_hours_only{"lookback":6}Momentum that only trades during the regular NYSE session and is flat overnight.
function onBar(ctx){
if (ctx.session !== 'regular') { if (ctx.position) ctx.sell(1,'session end'); return }
if (ctx.i < ctx.params.lookback) return
const ch = ctx.change(ctx.params.lookback)
if (ch > 0 && !ctx.position) ctx.buy(1,'momentum up')
else if (ch < 0 && ctx.position) ctx.sell(1,'momentum down')
}Account and API keys
Sign in at openfloor.trade/account with your wallet. One signature, no gas, no email. Create a key and give it to your agent:
claude mcp add --transport http openfloor https://openfloor.trade/api/mcp --header "Authorization: Bearer of_..."
With a key, the paper trading tools are enabled, the paper book is kept in your account, and every call shows up in your history. 500 hosted calls a day are free. Beyond that, 1 dollar of ETH on Robinhood Chain buys 1,000 calls. Without a key, the endpoint is anonymous and limited to 60 calls a minute.
Data and caveats
- Token addresses and ERC-8056 multipliers come from the Robinhood asset registry. Token price equals share price times multiplier. Dividends and splits move the multiplier, not your balance.
- Prices come from Chainlink Data Feeds on Robinhood Chain. Feeds update on every 0.5% move or once a day, 24/5. On weekends and holidays they hold the last value while pools keep trading.
- History is rebuilt from every AnswerUpdated event since 2026-07-01, so bars are exact, not sampled. Bars with no update are carried forward and flagged.
- Backtests fill at the bar close with the fee and slippage you choose. They use oracle prices, not pool fills. Use quote to see what a real size costs.
- Pool discovery uses a public search endpoint. Quotes and spot prices read the Uniswap contracts directly.
- The hosted RPC proxy only allows read methods and has per-instance rate limits.
FAQ
Do I need an account or an API key?
No. Add the server and it works. A free account adds paper trading and a history of everything your agent did.
Where does the data come from?
Robinhood Chain itself: the asset registry, Chainlink feeds, Uniswap contracts. Nothing modelled.
What does a backtest run on?
Every Chainlink update since July 1, 2026, as bars. Fills at the close, with fee and slippage.
Can my agent trade real money?
Not from Openfloor yet. It gets the real Uniswap price for any size and paper trades at live prices.
Can an agent run up a bill?
No. There is no account. On chain it can only spend what you sent it.
Do you keep my prompts?
No. Without a key nothing is stored. With a key, only your agent's tool calls, for your history.
Which assets are covered?
194 stock tokens and ETFs plus USDG and WETH. 38 have a feed for history and backtests.
Is this investment advice?
No. Openfloor is tooling. Every order is your responsibility. Stock tokens are for eligible users outside the United States.
Back to the landing page.