get_short_interest
Retrieve bi-monthly short interest reports for a stock ticker. Filter by settlement date and paginate results.
Instructions
Bi-monthly short interest reports for a ticker.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | Stock symbol. | |
| settlement_date_gte | No | Inclusive lower bound on settlement date. | |
| limit | No | Max rows. Default 12. | |
| cursor | No | Pagination cursor. |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Implementation Reference
- The handler function for the 'get_short_interest' tool. It makes an HTTP GET request to '/stocks/v1/short-interest' with ticker, settlement_date_gte, limit, and cursor parameters. Registered via the @mcp.tool() decorator in the register() function.
async def get_short_interest( ticker: str, settlement_date_gte: str | None = None, limit: int = 12, cursor: str | None = None, ) -> dict[str, Any]: """Bi-monthly short interest reports for a ticker. Args: ticker: Stock symbol. settlement_date_gte: Inclusive lower bound on settlement date. limit: Max rows. Default 12. cursor: Pagination cursor. """ return await client.get( "/stocks/v1/short-interest", { "ticker": ticker, "settlement_date.gte": settlement_date_gte, "limit": limit, "cursor": cursor, "order": "desc", }, ) - src/massive_mcp/tools/financials.py:12-13 (registration)The register() function that receives the FastMCP server and client. The @mcp.tool() decorator on line 39 registers 'get_short_interest' as an MCP tool. registration is invoked from server.py line 48: module.register(mcp, client).
def register(mcp: FastMCP, client: MassiveClient) -> None: @mcp.tool() - src/massive_mcp/server.py:37-48 (registration)build_server() iterates over tool modules (including 'financials') and calls module.register(mcp, client). This is where the financials module (containing get_short_interest) gets registered with the FastMCP server.
for module in ( aggregates, quotes, snapshots, tickers, news, reference, indicators, corporate, financials, ): module.register(mcp, client) - src/massive_mcp/client.py:47-89 (helper)The MassiveClient.get() helper called by get_short_interest. Handles HTTP GET requests with retry logic, auth (bearer or query param), error handling, and response trimming.
async def get( self, path: str, params: dict[str, Any] | None = None, *, trim: bool = True ) -> dict[str, Any]: merged: dict[str, Any] = {k: v for k, v in (params or {}).items() if v is not None} if self._settings.auth_mode == "query": merged["apiKey"] = self._settings.api_key last_exc: Exception | None = None for attempt in range(MAX_RETRIES): try: resp = await self._http.get(path, params=merged) except httpx.HTTPError as exc: last_exc = exc await asyncio.sleep(2**attempt) continue if resp.status_code == 429: retry_after = float(resp.headers.get("Retry-After", 2**attempt)) await asyncio.sleep(min(retry_after, 30)) continue if 500 <= resp.status_code < 600 and attempt < MAX_RETRIES - 1: await asyncio.sleep(2**attempt) continue if resp.status_code == 401: hint = ( "auth rejected — verify MASSIVE_API_KEY; " "if you used MASSIVE_AUTH_MODE=bearer, try 'query' (or vice versa)" ) raise MassiveAPIError(401, hint, _strip_secrets(str(resp.request.url))) try: data = resp.json() except ValueError: data = {"raw": resp.text} if not resp.is_success: msg = data.get("error") or data.get("message") or resp.reason_phrase or "request failed" raise MassiveAPIError(resp.status_code, str(msg), _strip_secrets(str(resp.request.url))) return _trim(data) if trim else data raise MassiveAPIError(0, f"network error after {MAX_RETRIES} retries: {last_exc}", path) - The function signature defines the input schema: ticker (str, required), settlement_date_gte (str|None), limit (int, default 12), cursor (str|None). The return type is dict[str, Any]. These are the type annotations and defaults that serve as the tool's parameter schema.
async def get_short_interest( ticker: str, settlement_date_gte: str | None = None, limit: int = 12, cursor: str | None = None, ) -> dict[str, Any]: