Skip to main content
Glama

Macro & Commodities Desk

Calculate EV Edge

calculate_ev
Read-only

Use for "is this contract mispriced" and "what is my edge". Give a Kalshi, Polymarket US or Novig price in cents and your own probability; returns the % expected-value edge and a BUY / SELL / SKIP read, with that venue's fee.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "calculate_ev"
  }
}

Input Schema

NameRequiredDescriptionDefault
venueNoWhere you would trade it: kalshi, polymarket-us or novig. Default kalshi. One of: kalshi · polymarket-us · novig.
marketPriceNoCurrent contract price in cents (1–99), equal to the implied probability in %. Required for a real answer. Accepts 55, "55%", "55¢", "$0.55", 0.55 or American odds (+120 / -150) — all read as 55%.
novigMarketNoWith venue novig: pregame (default), live or futures. Sets the fee. One of: pregame · live · futures.
venuePricesNoThe same contract's price on each venue, in cents. Adds EV after each venue's fee and best_venue.
yourProbabilityNoYour own estimate of the true probability the contract resolves YES, in % (0–100). Required for a real answer. Accepts 55, "55%", "55¢", "$0.55", 0.55 or American odds (+120 / -150) — all read as 55%.

Output Schema

NameRequiredDescriptionDefault
signalNoBUY / SELL / SKIP.
edge_ppNoYour probability minus the price, pp.
sourcesNo
edge_pctNoExpected-value edge, %.
tell_userNoShow this sentence to the user first.
timestampNo
needs_inputNo
example_callNo
data_freshnessNo
interpretationNoPlain-English read.
market_price_centsNoPrice used, cents.
your_probability_pctNoProbability used, %.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • addedInput schema / properties / novigMarket
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "enum": [
      +        "pregame",
      +        "live",
      +        "futures"
      +      ],
      +      "type": "string"
      +    }
      +  ],
      +  "description": "With venue novig: pregame (default), live or futures. Sets the fee. One of: pregame · live · futures."
      +}
    • addedInput schema / properties / venue
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "enum": [
      +        "kalshi",
      +        "polymarket-us",
      +        "novig"
      +      ],
      +      "type": "string"
      +    }
      +  ],
      +  "description": "Where you would trade it: kalshi, polymarket-us or novig. Default kalshi. One of: kalshi · polymarket-us · novig."
      +}
    • addedInput schema / properties / venuePrices
      Added value: +{
      +  "description": "The same contract's price on each venue, in cents. Adds EV after each venue's fee and best_venue.",
      +  "properties": {
      +    "kalshi": {
      +      "maximum": 99,
      +      "minimum": 1,
      +      "type": "number"
      +    },
      +    "novig": {
      +      "maximum": 99,
      +      "minimum": 1,
      +      "type": "number"
      +    },
      +    "polymarket-us": {
      +      "maximum": 99,
      +      "minimum": 1,
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
  2. Changed2 schema fields changed
    • removedInput schema / $schema
      Removed value: -"https://json-schema.org/draft/2020-12/schema"
    • removedOutput schema / $schema
      Removed value: -"https://json-schema.org/draft/2020-12/schema"
  3. Changed4 schema fields changed
    • removedInput schema / properties / marketPrice / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "string"
      -  }
      -]
    • addedInput schema / properties / marketPrice / type
      Added value: +[
      +  "number",
      +  "string"
      +]
    • removedInput schema / properties / yourProbability / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "string"
      -  }
      -]
    • addedInput schema / properties / yourProbability / type
      Added value: +[
      +  "number",
      +  "string"
      +]
  4. Changed3 schema fields changed
    • changedInput schema / properties / marketPrice / description
      Previous value: -"Current contract price in cents (1–99), equal to the implied probability in %. Accepts 55, \"55%\", \"55¢\", \"$0.55\", 0.55 or American odds (+120 / -150) — all read as 55%."New value: +"Current contract price in cents (1–99), equal to the implied probability in %. Required for a real answer. Accepts 55, \"55%\", \"55¢\", \"$0.55\", 0.55 or American odds (+120 / -150) — all read as 55%."
    • changedInput schema / properties / yourProbability / description
      Previous value: -"Your own estimate of the true probability the contract resolves YES, in % (0–100). Accepts 55, \"55%\", \"55¢\", \"$0.55\", 0.55 or American odds (+120 / -150) — all read as 55%."New value: +"Your own estimate of the true probability the contract resolves YES, in % (0–100). Required for a real answer. Accepts 55, \"55%\", \"55¢\", \"$0.55\", 0.55 or American odds (+120 / -150) — all read as 55%."
    • removedInput schema / required
      Removed value: -[
      -  "marketPrice",
      -  "yourProbability"
      -]
  5. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "https://json-schema.org/draft/2020-12/schema",
      +  "additionalProperties": {},
      +  "properties": {
      +    "data_freshness": {},
      +    "edge_pct": {
      +      "description": "Expected-value edge, %."
      +    },
      +    "edge_pp": {
      +      "description": "Your probability minus the price, pp."
      +    },
      +    "example_call": {},
      +    "interpretation": {
      +      "description": "Plain-English read."
      +    },
      +    "market_price_cents": {
      +      "description": "Price used, cents."
      +    },
      +    "needs_input": {},
      +    "signal": {
      +      "description": "BUY / SELL / SKIP."
      +    },
      +    "sources": {},
      +    "tell_user": {
      +      "description": "Show this sentence to the user first.",
      +      "type": "string"
      +    },
      +    "timestamp": {
      +      "type": "string"
      +    },
      +    "your_probability_pct": {
      +      "description": "Probability used, %."
      +    }
      +  },
      +  "type": "object"
      +}
  6. First observed

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish a safe, closed read-only operation, and the description adds real behavior on top: the fee for the chosen venue is baked into the edge, and the output is a three-way action read rather than a bare number. The "Required for a real answer" phrasing implicitly discloses a degraded path when inputs are omitted, though it doesn't spell out what that degraded response looks like.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that leads with the decision framing an agent would actually be asked, then packs inputs and outputs into the same clause. No filler, no restatement of the name, nothing to cut.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the decision context, the required inputs, and the shape of the answer for a five-parameter tool with a nested venuePrices object, and the output schema handles return-value detail. The one gap is the behavior of venuePrices (multi-venue comparison producing best_venue) and the no-input fallback, which the description only gestures at.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, including detailed accepted-format notes on marketPrice and yourProbability, so the schema carries the burden and baseline 3 applies. The description only adds the linkage that venue selection determines the applicable fee, which the schema already states for novigMarket; no new syntax or semantics beyond that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific transformation: given a venue price in cents plus the user's own probability, it returns the % expected-value edge, a BUY/SELL/SKIP verdict, and the venue's fee. That verb+resource+output triple is unmistakable against siblings like kelly_size (position sizing) or convert_probability (units), so an agent can route without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Opens with concrete trigger questions ("is this contract mispriced", "what is my edge"), which is stronger than generic context. It never states when not to use it or names an alternative tool, so it falls short of the explicit when/when-not/alternatives bar.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.