Source code for polymarket_mcp.models.clob
"""Typed CLOB public domain and tool I/O models.
Purpose:
Define normalized public order book, pricing, and history models for the
Polymarket CLOB API along with MCP inputs and outputs.
"""
from __future__ import annotations
from pydantic import BaseModel, ConfigDict, Field, computed_field
[docs]
class TokenArgs(BaseModel):
"""Arguments for single-token CLOB reads."""
model_config = ConfigDict(extra="forbid")
token_id: str = Field(min_length=1)
[docs]
class TokensArgs(BaseModel):
"""Arguments for multi-token CLOB reads."""
model_config = ConfigDict(extra="forbid")
token_ids: list[str] = Field(min_length=1, max_length=50)
[docs]
class PriceHistoryArgs(BaseModel):
"""Arguments for price history reads."""
model_config = ConfigDict(extra="forbid")
token_id: str = Field(min_length=1)
interval: str = "1h"
start_ts: int | None = None
end_ts: int | None = None
[docs]
class OrderBookLevel(BaseModel):
"""Single normalized order book level."""
model_config = ConfigDict(extra="forbid")
price: float
size: float
[docs]
class OrderBook(BaseModel):
"""Normalized public order book."""
model_config = ConfigDict(extra="allow")
token_id: str
bids: list[OrderBookLevel] = Field(default_factory=list)
asks: list[OrderBookLevel] = Field(default_factory=list)
midpoint: float | None = None
spread: float | None = None
timestamp: int | None = None
[docs]
class PriceQuote(BaseModel):
"""Normalized price quote."""
model_config = ConfigDict(extra="allow")
token_id: str
price: float | None = None
midpoint: float | None = None
spread: float | None = None
[docs]
class PriceHistoryPoint(BaseModel):
"""Normalized historical price point."""
model_config = ConfigDict(extra="allow")
timestamp: int
price: float
[docs]
class OrderBookOutput(BaseModel):
"""Tool output for one order book."""
model_config = ConfigDict(extra="forbid")
book: OrderBook
[docs]
class PriceQuoteOutput(BaseModel):
"""Tool output for one price quote."""
model_config = ConfigDict(extra="forbid")
quote: PriceQuote
[docs]
class PriceQuotesOutput(BaseModel):
"""Tool output for multiple price quotes."""
model_config = ConfigDict(extra="forbid")
quotes: list[PriceQuote] = Field(default_factory=list)
@computed_field
@property
def count(self) -> int:
"""Return the number of quotes.
Returns:
int: Number of returned quotes.
"""
return len(self.quotes)
[docs]
class PriceHistoryOutput(BaseModel):
"""Tool output for historical prices."""
model_config = ConfigDict(extra="forbid")
token_id: str
interval: str
points: list[PriceHistoryPoint] = Field(default_factory=list)
@computed_field
@property
def count(self) -> int:
"""Return the number of history points.
Returns:
int: Number of returned points.
"""
return len(self.points)