Ora
All documentation Overview

Get started

IntroductionQuickstartHow ora-fin decidesHow to build with OraUse-case map

Rule language

OverviewGrammarOperators and beliefsPrices and offsetsWindowsIndicatorsSignals and eventsPattern functionsFunction referenceValues and = formulasBring your own barsRule libraryCommon mistakesError messagesEarnings, dividends and splits

Questions & answers

Questionsyes_no (noul)choicescoreConfidenceThresholds and calibrationStateAsk by symbol

Patterns

Patterns

Actions & workflows

OverviewRules and templatesDestinationsWebhooks and signaturesWorkflows

AI agents & SDKs

Use Ora from AI agents (MCP)SDKs: Python and JavaScriptOra Rules v1 (open spec)

API reference

POST /v1/systemonePOST /v1/automateGET /v1/models

Errors & limits

ErrorsRate limitsKnown limitations

Pricing

Pricing

Resources

FAQWhat's newModels & versionsCode in 8 languages

Docs / AI agents & SDKs

Use Ora from AI agents (MCP)

Ora is a remote Model Context Protocol server. Any MCP client (Claude, Cursor, the OpenAI Agents SDK, your own) can check a rule, compute a value, ask what is true now or get a forecast on a symbol, in about 100 ms, with exact answers an LLM cannot make up.

URLhttps://oramodel.com/mcp
TransportStreamable HTTP (JSON responses; no sessions to keep)
AuthYour Ora API key: Authorization: Bearer jev_sk_… (API Keys)
BillingEach tool call that asks the model is one POST /v1/systemone request: same price, rate limits and usage page as the API. list_functions is free.

Tools

ToolArgumentsWhat it returns
evaluate_rulesymbol, ruleBelief 0.05-0.95 that a rule holds on the latest session.
evaluate_rule("NVDA", "C > sma(C, 50)")
asksymbol, questionAn English question about what is true now; compiled to a rule when Ora recognises it.
ask("AAPL", "Is it above its 200-day average?")
valuesymbol, expressionThe number an expression has on the latest session.
value("SPY", "rsi(C, 14)")
forecastsymbol, questionThe forecast model's probability of yes for a question about the future.
forecast("TSLA", "Will it be higher in a week?")
list_functionsquery?, group?Search the rule language: 322 functions, patterns and facts. Free.
list_functions(query="bollinger")
decidestate, questions, model?A full POST /v1/systemone request: several typed questions in one call.
decide({"symbol": "NVDA"}, {"trend": {"type": "yes_no", "ask": "C > sma(C, 50)"}})

Rule answers are beliefs: how clearly the condition holds, from 0.05 to 0.95, not probabilities (Operators and beliefs). Each result has a readable line for the agent and the full API response as structuredContent. A bad rule comes back as a tool error naming the problem, so the agent can fix it and retry.

Claude Code

claude mcp add --transport http ora https://oramodel.com/mcp \
  --header "Authorization: Bearer $ORA_API_KEY"

Then ask, for example: "Use ora to check whether NVDA, AMD and AVGO are above their 50-day averages."

Claude Desktop

Claude Desktop reaches remote servers that use an API key through the mcp-remote bridge. In claude_desktop_config.json (Settings → Developer → Edit config):

{
  "mcpServers": {
    "ora": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://oramodel.com/mcp",
        "--header",
        "Authorization:${ORA_AUTH}"
      ],
      "env": {
        "ORA_AUTH": "Bearer jev_sk_your_key"
      }
    }
  }
}

Cursor

In ~/.cursor/mcp.json (or .cursor/mcp.json in a project):

{
  "mcpServers": {
    "ora": {
      "url": "https://oramodel.com/mcp",
      "headers": {
        "Authorization": "Bearer ${env:ORA_API_KEY}"
      }
    }
  }
}

OpenAI Agents SDK (Python)

import asyncio, os
from agents import Agent, Runner
from agents.mcp import MCPServerStreamableHttp

async def main():
    async with MCPServerStreamableHttp(name="ora", params={
        "url": "https://oramodel.com/mcp",
        "headers": {"Authorization": f"Bearer {os.environ['ORA_API_KEY']}"},
    }) as ora:
        agent = Agent(name="Analyst", instructions="Check market conditions with Ora before answering.", mcp_servers=[ora])
        result = await Runner.run(agent, "Is TSLA oversold, and is it above its 200-day average?")
        print(result.final_output)

asyncio.run(main())

With the OpenAI Responses API, add Ora as a hosted MCP tool:

{
  "type": "mcp",
  "server_label": "ora",
  "server_url": "https://oramodel.com/mcp",
  "headers": {
    "Authorization": "Bearer jev_sk_your_key"
  },
  "require_approval": "never"
}

Any MCP client (Python)

# pip install mcp   (2.x; with mcp 1.x use streamablehttp_client(url, headers=...))
from mcp import ClientSession
from mcp.client.streamable_http import streamable_http_client, create_mcp_http_client

async with create_mcp_http_client(headers={"Authorization": "Bearer jev_sk_..."}) as http:
    async with streamable_http_client("https://oramodel.com/mcp", http_client=http) as (read, write, *_):
        async with ClientSession(read, write) as s:
            await s.initialize()
            r = await s.call_tool("evaluate_rule", {"symbol": "NVDA", "rule": "C > sma(C, 50)"})
            print(r.content[0].text)   # NVDA (session of 2026-10-30) · ora-fin-0.1.1
                                       # rule `C > sma(C, 50)` → belief 0.0746 (clearly does not hold; ...)

Under the hood

Plain JSON-RPC over HTTPS POST, so you can test it with curl:

curl -s https://oramodel.com/mcp -H "Authorization: Bearer $ORA_API_KEY" -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"value","arguments":{"symbol":"SPY","expression":"sma(C, 50)"}}}'

Prefer code? The Python and JavaScript SDKs wrap the same calls. The rule language is an open standard: Ora Rules v1.

Create an account Open the Playground Everything here also lives in the console, next to your keys and usage.