get_last_quote
Retrieve the most recent NBBO bid and ask quote for any stock ticker. Obtain current market data to support trading decisions.
Instructions
Most recent NBBO (bid/ask) quote for a stock.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | Stock symbol (e.g. "AAPL"). |
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Implementation Reference
- src/massive_mcp/tools/quotes.py:12-18 (handler)The actual handler function for the get_last_quote tool. It calls the Massive REST API at /v2/last/nbbo/{ticker} to get the most recent NBBO quote for a stock.
async def get_last_quote(ticker: str) -> dict[str, Any]: """Most recent NBBO (bid/ask) quote for a stock. Args: ticker: Stock symbol (e.g. "AAPL"). """ return await client.get(f"/v2/last/nbbo/{ticker}") - src/massive_mcp/tools/quotes.py:11-18 (registration)The tool is registered via the @mcp.tool() decorator inside the register() function in quotes.py.
@mcp.tool() async def get_last_quote(ticker: str) -> dict[str, Any]: """Most recent NBBO (bid/ask) quote for a stock. Args: ticker: Stock symbol (e.g. "AAPL"). """ return await client.get(f"/v2/last/nbbo/{ticker}") - src/massive_mcp/server.py:37-48 (registration)The quotes module (containing get_last_quote) is registered via module.register(mcp, client) in server.py's build_server() function.
for module in ( aggregates, quotes, snapshots, tickers, news, reference, indicators, corporate, financials, ): module.register(mcp, client) - src/massive_mcp/client.py:47-89 (helper)MassiveClient.get() is the helper/utility that performs the actual HTTP GET request. get_last_quote calls this with the path /v2/last/nbbo/{ticker}.
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)