HPSILab - Quant Finance MCP Server for Stock Analysis and Options Analytics
You can run US-equity/ETF quant research through one MCP server, from stock signals and options analytics to reports, charts, and portfolio risk checks.
Run full ticker analysis with bull/bear signal, confidence, factors, and summary.
Inspect implied volatility: ATM IV, IV rank/percentile, risk reversal, and vol regime.
Map options positioning: max pain, gamma wall, expected move, squeeze target, and pressure zones.
Run 30-day Monte Carlo simulations with price ranges and probabilities.
Get next-session AI/ML directional predictions with ensemble votes and regime.
Backtest strategies with Sharpe/Sortino, drawdown, win rate, and equity curves.
Generate six-section markdown stock research reports.
Generate 24-hour chart image URLs for price, IV surface, and options flow.
Run pre-trade portfolio risk scans covering risk deltas, sizing checks, exposure, and correlation.
Use validated ticker inputs and structured JSON outputs; some premium tools require sign-in or x402 payment.
Enables quantitative analysis of US stocks and options within GitHub Copilot, offering tools for stock signals, volatility analysis, options positioning, scenario simulations, risk checks, and structured research reports.
HPSILab Quant Finance MCP Server for Stock & Options Analytics
Stock and options risk analytics for AI agents. Connect one remote MCP
endpoint, https://hpsilab.com/mcp, sign in with OAuth (no API key to paste),
and your agent can call:
a pre-trade risk scan: volatility, beta, drawdown and VaR against SPY with fixed pass/warn/fail limits, plus sizing, sector exposure and correlation checks;
options structure: IV level, rank and skew, gamma wall, call/put walls, max pain;
a 10-trading-day Monte Carlo price range and odds of finishing higher;
analyze_stockfor a one-call overview, plus AI prediction and backtests.
Results are structured JSON with machine-readable errors, for US-listed equities, ETFs and supported options. This repository is the open-source Python server (MIT); the hosted endpoint runs the same tool surface.
Research and educational use only. HPSILab does not provide investment advice and does not execute trades.
Get a Free API Key · Pricing · Tool reference · Client setup · Python SDK
Registry name |
|
Version | 0.11.1 — a source checkout reports |
Transports | Streamable HTTP (hosted) · stdio (PyPI package) |
Remote endpoint |
|
Package |
|
Authentication | OAuth sign-in or Bearer API key (hosted), |
Tools | 10 — nine financial research tools plus |
Connect: hosted Streamable HTTP
Recommended, and requires no local installation.
With OAuth sign-in
Clients that support MCP OAuth (Claude Code, Claude.ai and ChatGPT connectors, and others) only need the URL; they open the HPSILab sign-in page on first use.
claude mcp add --transport http hpsilab https://hpsilab.com/mcpIn a connector UI, add a custom connector with the URL https://hpsilab.com/mcp.
With an API key
For clients without OAuth support, or for scripts:
Register a free account, sign in, and generate an API key from Settings.
Add the server to your client's private configuration, replacing
hpsi_your_key. Never commit a real key or paste one into chat.
The example below is Claude Code's .mcp.json; other clients use different
configuration schemas, all covered in
client setup.
{
"mcpServers": {
"hpsilab": {
"type": "http",
"url": "https://hpsilab.com/mcp",
"headers": {
"Authorization": "Bearer hpsi_your_key"
}
}
}
}Verify the connection:
Use HPSILab to analyze AAPL. Separate observed metrics from interpretation,
identify conflicting signals, and finish with a concise risk summary.All financial research tools require a signed-in account: OAuth or a valid API key. See authentication for key handling and rotation.
Building an agent? examples/agents has one-file risk-check agents for the OpenAI Agents SDK, the Claude Agent SDK and LangGraph. Walkthrough: docs/guide-risk-gate-for-trading-agents.md.
Related MCP server: yahoo-finance-mcp-server
Connect: local stdio
For clients that require a local process:
pip install -U hpsilab-quant-finance-mcpThis example uses the mcpServers schema supported by Claude and Cursor; VS
Code and GitHub Copilot use a servers schema instead.
{
"mcpServers": {
"hpsilab": {
"command": "hpsilab-quant-finance-mcp",
"env": {
"HPSILAB_API_KEY": "hpsi_your_key"
}
}
}
}Then verify it through the MCP client:
Use HPSILab to get the AI prediction for NVDA and summarize the model consensus.The client discovers tools with MCP tools/list and invokes them with
tools/call. See
local setup
and
Python usage,
which also covers calling the tool functions directly from Python.
Tools
Nine financial research tools, plus register_account. Tool names and parameter
meanings are part of the public compatibility contract.
Tool | What it returns | Behavior |
| Aggregate directional and quantitative stock analysis | Read-only |
| Next-session prediction, confidence, and model consensus | Read-only |
| IV level, rank, percentile, skew, and regime | Read-only |
| Max pain, gamma walls, expected move, and pressure zones | Read-only |
| 10-trading-day simulated distribution and probabilities | Read-only |
| Strategy backtests and risk-adjusted performance | Read-only |
| Position, exposure, correlation, and risk checks | Read-only |
| Hosted stock and options chart artifacts | Creates an artifact; not idempotent |
| Structured Markdown research report and timestamp | Creates an artifact; not idempotent |
| Signing up from the client with no API key yet, or a fresh key for an existing account | Creates an account and sends email; not idempotent |
Research tools accept one exchange ticker such as NVDA, SPY, or BRK.B;
company names are not accepted. Live results can change between calls. Artifact
tools can consume quota and should not be retried automatically.
Full inputs, outputs, side effects, and tool-selection guidance are in docs/tools.md.
Monte Carlo research example

Example visualization of scenario-based Monte Carlo research output. Results
depend on the selected inputs and model assumptions. See
get_monte_carlo
for tool details.
Copy-ready prompts
Claude
Use HPSILab to analyze NVDA. Summarize the directional signal, AI model
consensus, IV regime, options pressure, 10-day Monte Carlo range, and the
three most important risks. Distinguish tool data from interpretation.Cursor
Use HPSILab's IV radar and option-pressure tools for SPY. Compare IV rank,
percentile, skew, expected move, max pain, gamma wall, and pressure zones.
Return a compact table and do not recommend a trade.ChatGPT
Run the HPSILab pre-trade risk scan for TSLA. Explain every warning or failed
check, preserve unavailable fields as unavailable, and quote the returned
reason instead of guessing. Do not execute or recommend a trade.Setup guidance covers ChatGPT, Claude, Cursor, VS Code, GitHub Copilot, Continue, and Kimi. See the client setup guide for each client's transport and configuration format.
Errors, retries, and limits
Every failure is a structured object with a stable error_code, never prose an
agent has to pattern-match. Five refusals matter, because each has a different
remedy:
| Meaning | What resolves it |
| No key is configured | Registering. Nothing is sent downstream |
| Calling too fast (429) | Waiting — |
| The Credit balance is empty (402) | Adding Credits, or registering for trial Credits |
| The free evaluation ceiling is spent (402) | Registering, or verifying an email. Money does not lift it |
| A payment whose outcome is unconfirmed | Reconciliation. Do not retry it and do not pay again |
Without a key the package stops locally, before constructing the downstream client or sending a request:
{
"error": "api_key_required",
"message": "A free API key is required.",
"register_url": "https://hpsilab.com/register",
"docs_url": "https://hpsilab.com/developer/v2"
}401 and 402 responses are never retried. A 429 is retried only when it carries a
valid Retry-After. Read-only calls use a finite retry budget for timeouts and
recoverable 500/502/503/504 responses; artifact-producing calls are not retried
automatically. The package also applies one process-local safeguard of 10
requests per rolling minute per API key — burst protection, not a quota, since
only the hosted service knows the balance and the plan.
Field-by-field payloads, the Credits circuit breaker, and the reasoning behind each remedy are in docs/authentication.md and docs/python-sdk.md.
Why HPSILab
HPSILab gives assistants typed inputs, structured outputs, ticker validation, machine-readable errors, and dedicated tools instead of invented metrics. It supports US-listed equities, ETFs, and supported options data; coverage and limits depend on the hosted service and plan.
Safety and license
HPSILab is for research and education only. Outputs may be incomplete, delayed, or wrong and are not investment, financial, or trading advice. The MCP server has no brokerage connectivity, order entry, or trade-execution capability.
Licensed under the MIT License. Contributions are welcome; read AGENTS.md and CONTRIBUTING.md before proposing public schema changes.
Available Tools
10 toolsanalyze_stockARead-onlyIdempotentInspect
Run a full institutional-grade quantitative analysis for a single stock.
This is the primary tool for a complete market view. It aggregates results from AI prediction, implied-volatility radar, options-pressure map, Monte Carlo simulation, and strategy backtesting into one unified signal.
Use this tool when:
You need a holistic bull/bear verdict with supporting evidence.
You want to compare multiple signal sources in a single call.
A user asks for a "stock analysis", "market view", or "trading signal".
Prefer the dedicated sub-tools (get_iv_radar, get_monte_carlo, etc.) when you need only a specific data dimension, to reduce latency and token usage.
Returns
dict with keys: symbol : str — normalized ticker signal : str — "Bullish" | "Bearish" | "Neutral" confidence_score: int — 0–100 directional confidence bullish_factors : list — evidence supporting an upward move bearish_factors : list — evidence supporting a downward move summary : str — one-sentence synthesis
Notes
Requires a valid HPSILAB_API_KEY.
API access, quota, and ticker coverage are governed by the HPSILab account.
Response latency is ~5–15 s due to multi-model aggregation.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Exchange ticker in uppercase, e.g. 'NVDA', 'AAPL', 'SPY', 'QQQ'. Do NOT pass company names ('Nvidia') — use official tickers only. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the HPSILAB_API_KEY requirement, account-governed quota and ticker coverage, and a 5–15 s latency from multi-model aggregation — all decision-relevant for an agent planning a call. Annotations already declare readOnly/idempotent/non-destructive, and nothing here contradicts them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the one-line purpose, then when-to-use, then the alternative — a good order with no filler prose. The full 'Returns' key listing duplicates the existing output schema and is the one block that does not earn its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-symbol aggregator, everything an agent needs is present: what it computes, when to call it, what it costs in latency/quota, and confirmation of the auth prerequisite. Return values are independently covered by the output schema, so the duplicated listing is excess rather than a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With a single parameter at 100% schema description coverage, the schema already carries the uppercase-ticker format, pattern and examples. The description adds no parameter-level guidance of its own (e.g. market/exchange limitations), so the baseline 3 for schema-driven parameters applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run a full institutional-grade quantitative analysis for a single stock') and explicitly positions itself as the aggregator of AI prediction, IV radar, options pressure, Monte Carlo and backtesting. It names the dedicated sub-tools it supersedes, so an agent can distinguish it from get_iv_radar, get_monte_carlo, etc. without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit 'Use this tool when' list tied to user phrasings ('stock analysis', 'market view', 'trading signal') plus the inverse rule: prefer the dedicated sub-tools when only one data dimension is needed, to reduce latency and token usage. Both the when and the when-not are stated with named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_stock_imagesAInspect
Generate chart image URLs for a stock: price chart, IV surface, and options flow heatmap.
Use this tool when:
A user explicitly asks to "see", "show", or "visualize" a chart.
You want to accompany a written analysis with supporting visuals.
You need to share chart links in a report or message.
Parameters
force: Regenerate images instead of reusing cached artifacts. Defaults to True. types: Optional subset of chart types. Allowed values: ai_prediction, iv_radar, option_pressure, monte_carlo, equity_curves. Omit to generate every chart type.
Note: Images are served as public URLs. They expire after 24 hours. If images do not render in your client, copy the URL and open it in a browser directly.
Returns
dict with keys: symbol : str — normalized ticker price_chart_url : str — URL to candlestick + volume chart (PNG) iv_surface_url : str — URL to 3-D IV surface chart (PNG) options_flow_url: str — URL to options flow heatmap (PNG) expires_at : str — ISO 8601 expiry timestamp for the URLs
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Regenerate hosted images instead of reusing cached artifacts. | |
| types | No | Optional chart types to generate. Omit or use null to generate every type. | |
| symbol | Yes | Exchange ticker in uppercase, e.g. 'NVDA', 'AAPL'. Do NOT pass company names — use official tickers only. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, it discloses that images are served as public URLs, expire after 24 hours, and may need to be opened directly in a browser if client rendering fails. This adds useful operational context consistent with openWorldHint=true and readOnlyHint=false, though it does not mention generation cost or latency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose, then structured into usage guidance, parameters, notes, and returns. It is generally efficient, though the Returns section is somewhat redundant because an output schema exists, and the parameter section largely repeats schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the moderate complexity, rich schema, annotations, and existing output schema, the description provides enough context to invoke the tool: chart types, public URL behavior, expiry, caching/force, and return keys. Its main gap is the lack of explicit sibling routing and clarification of how the types enum maps to the returned chart URLs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so force, types, and symbol are already well documented. The description repeats the allowed types and default behavior for force/omit, but it does not resolve the naming mismatch between the types enum (ai_prediction, iv_radar, option_pressure, monte_carlo, equity_curves) and the returned chart URL keys (price_chart_url, iv_surface_url, options_flow_url).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: generating hosted chart image URLs for a stock, including price chart, IV surface, and options flow heatmap images. It clearly differentiates the tool from siblings that retrieve chart data (e.g. get_iv_radar, get_option_pressure) by focusing on image URL generation, though it does not explicitly name those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage bullets: when a user asks to 'see', 'show', or 'visualize' a chart, when adding visuals to analysis, and when sharing chart links. It does not state when NOT to use it or when a sibling data-retrieval tool is preferable, so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_stock_research_reportAInspect
Generate a structured, institutional-style markdown research report for a single stock, covering all major quantitative signal sources.
The report is divided into six sections:
Executive Summary — bull/bear verdict, confidence score, one-line thesis
AI Prediction — ensemble model votes, up-probability, regime
Volatility Analysis — ATM IV, IV rank, vol regime, risk reversal
Options Positioning — max pain, gamma wall, expected move, squeeze targets
Monte Carlo Outlook — 10-trading-day price distribution and 90 % range
Strategy Backtests — Sharpe, max drawdown, win rate across quant strategies
Output is a complete markdown string (~800–1200 words) ready to render or share. Response latency is ~10–20 s due to full multi-model data aggregation.
Use this tool when:
A user asks for a "report", "write-up", "research note", or "deep dive".
You want a pre-formatted narrative combining all signal sources in one document.
You need output suitable for archiving, PDF export, or investor communication.
Do NOT use this tool when:
You only need a quick directional verdict → use analyze_stock instead.
You need a specific data dimension (IV, Monte Carlo, etc.) → use the dedicated sub-tool (get_iv_radar, get_monte_carlo, etc.) for lower latency.
Returns
dict with keys: symbol : str — normalized ticker report : str — full markdown report (~800–1200 words, 6 sections) generated_at : str — ISO 8601 generation timestamp
Notes
Requires a valid HPSILAB_API_KEY.
API access, quota, and ticker coverage are governed by the HPSILab account.
For programmatic use, prefer analyze_stock which returns structured JSON.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Exchange ticker in uppercase, e.g. 'NVDA', 'TSLA', 'SPY'. Do NOT pass company names — use official tickers only. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (destructiveHint=false, openWorldHint=true, readOnlyHint=false), so the bar is lower, yet the description still adds material context: ~10–20 s latency, HPSILAB_API_KEY requirement, and that quota/coverage are governed by the account. It also flags that analyze_stock is preferable for programmatic use. The one gap is that it never explains why the tool is non-read-only (the report generation consumes quota/API access), leaving readOnlyHint=false only loosely reconciled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the one-sentence purpose, then organized under labeled headings, so an agent can skim to what it needs. The Returns section largely restates the output schema, which is minor redundancy, but the section list and latency figure both earn their lines.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, high-latency aggregation tool, the description supplies everything an agent needs: what comes back, how long it takes, auth requirements, quota caveats, and when to prefer siblings. Because an output schema exists, it need not spell out return values, and the brief Returns block is sufficient corroboration rather than a substitute.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is exactly one parameter and schema description coverage is 100%, including the pattern, examples, and an explicit 'Do NOT pass company names' warning, so the schema already does all the work. The description only implies a single-ticker scope and refers to 'normalized ticker' in the Returns block; it adds no format or validation detail beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('generate a structured, institutional-style markdown research report for a single stock') and then enumerates the six sections it contains, which is a level of detail no sibling provides. The output artifact (markdown string, ~800–1200 words) is unambiguous, so an agent can distinguish this from analyze_stock or the individual data tools 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Contains explicit 'Use this tool when' and 'Do NOT use this tool when' blocks, and routes to named alternatives with the condition that selects them (analyze_stock for a quick verdict, get_iv_radar / get_monte_carlo for a single dimension, citing lower latency). This is exactly the when/when-not/alternative structure that earns a top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ai_predictionARead-onlyIdempotentInspect
Get an AI/ML directional prediction for a stock's next-session move.
Use this tool when:
You want a data-driven probability estimate for the next trading day's direction (up vs. down).
You need the individual model votes (ensemble breakdown) to assess consensus strength.
You want to compare model confidence against current IV pricing.
The prediction engine uses an ensemble of gradient-boosted trees, an LSTM, and a VQC (quantum-classical hybrid) model. Features include VIX, relative strength, Treasury rates, and options flow signals.
Returns
dict with keys: symbol : str — normalized ticker prediction : str — "Up" | "Down" | "Neutral" up_probability : float — 0.0–1.0 probability of upward close confidence : float — 0.0–1.0 ensemble agreement score model_votes : dict — per-model predictions and probabilities regime : str — "Bull" | "Bear" | "Chop" market regime signal_strength : str — "Strong" | "Moderate" | "Weak"
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Exchange ticker in uppercase, e.g. 'NVDA', 'META', 'QQQ'. Do NOT pass company names — use official tickers only. Per-ticker model accuracy varies; META and QQQ have shown above-baseline hit rates in backtests. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the tool as read-only, idempotent, open-world, and non-destructive. Beyond that, the description discloses the ensemble composition (gradient-boosted trees, LSTM, VQC), feature inputs, and returned fields like confidence and regime, which is useful behavioral context. It does not cover latency, data freshness, or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a clear purpose sentence, followed by well-structured use-case bullets and a labeled returns section. It is somewhat verbose in listing return keys even though an output schema exists, but the content remains relevant and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only prediction tool with annotations and an output schema, the description covers purpose, use cases, model basis, and output semantics thoroughly enough to invoke it correctly. It lacks explicit sibling routing and operational caveats like data freshness or limitations, which keeps it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter and the schema description coverage is 100%; the schema already documents the ticker format, pattern, examples, and per-ticker accuracy caveats. The description adds no parameter-specific guidance beyond implying a stock ticker, so the high-coverage baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: get an AI/ML directional prediction for a stock's next-session move. The use-case bullets further scope it to next-day direction, ensemble votes, and IV comparison, which distinguishes it functionally from broader siblings like analyze_stock. It does not explicitly name sibling tools, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides an explicit 'Use this tool when' section with three concrete conditions: wanting a probability estimate, needing ensemble votes, or comparing confidence to IV pricing. It gives clear use context but does not state when not to use it or explicitly name alternatives such as get_iv_radar or get_monte_carlo.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_equity_curveARead-onlyIdempotentInspect
Retrieve backtested equity curves and performance metrics for standard quantitative strategies applied to a single stock.
Use this tool when:
You want to evaluate how well rule-based strategies (momentum, mean- reversion, vol-targeting) have performed on this specific ticker.
You need risk-adjusted return metrics (Sharpe, Sortino, max drawdown) to compare strategy quality.
You are building a multi-leg options strategy and want historical context for the underlying's trending vs. mean-reverting behavior.
Returns
dict with keys: symbol : str — normalized ticker strategies : list — each item is a dict with: name : str — strategy name total_return : float — cumulative return (e.g., 0.45 = +45 %) sharpe_ratio : float — annualized Sharpe ratio sortino_ratio : float — annualized Sortino ratio max_drawdown : float — maximum peak-to-trough loss (negative) win_rate : float — fraction of winning trades (0–1) pl_ratio : float — average win / average loss equity_curve : list — daily portfolio value series
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Exchange ticker in uppercase, e.g. 'NVDA', 'AAPL', 'SPY', 'QQQ'. Do NOT pass company names ('Nvidia') — use official tickers only. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety bar is largely covered. The description adds one piece of genuine context not in the annotations — that the data is backtested/simulated rather than live — but nothing about data history depth, rate limits, or freshness. The lengthy Returns block restates the output schema rather than adding behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The when-to-use list is well front-loaded, but roughly half the text is a field-by-field Returns breakdown that duplicates the already-present output schema. That section is padding the agent does not need, diluting an otherwise tight definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a single required param, full schema coverage, an output schema, and rich annotations, the description covers the essential selection question: what the tool yields and why you'd call it. The only notable omission is any pointer to a contrasting sibling tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and its schema description is fully covered (uppercase ticker, no company names, with examples). The description adds no format or normalization detail beyond that, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: retrieve backtested equity curves and performance metrics for rule-based strategies on a single stock. That scope is clearly distinct from prediction- or options-oriented siblings, though no sibling tool is named to sharpen the contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
A dedicated 'Use this tool when:' block gives three concrete scenarios (strategy evaluation, risk-adjusted metrics comparison, historical context for a multi-leg options position). It gives strong positive guidance but never states when not to use it or points to an alternative like analyze_stock or get_monte_carlo.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_iv_radarARead-onlyIdempotentInspect
Retrieve implied-volatility (IV) metrics for a single stock.
Use this tool when:
You need to assess whether options are cheap or expensive relative to historical norms (IV rank / IV percentile).
You want the current volatility regime ("Low", "Normal", "Elevated", "Extreme") to frame risk sizing or strategy selection.
You are analyzing skew or risk-reversal direction (put-heavy vs call-heavy market).
Do NOT use this tool if you already called analyze_stock — the IV data is included in that response.
Returns
dict with keys: symbol : str — normalized ticker atm_iv : float — at-the-money implied volatility (annualized %) iv_rank : float — 0–100; ≥80 = expensive, ≤20 = cheap iv_percentile : float — historical percentile (0–100) risk_reversal : float — 25-delta risk reversal (positive = call-skew) volatility_regime: str — "Low" | "Normal" | "Elevated" | "Extreme"
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Exchange ticker in uppercase, e.g. 'NVDA', 'AAPL', 'SPY', 'QQQ'. Do NOT pass company names ('Nvidia') — use official tickers only. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so the safety profile is covered. The description adds meaningful interpretation beyond that: IV rank thresholds ('≥80 = expensive, ≤20 = cheap'), regime categories, and the sign convention for risk reversal. It does not mention data staleness, source, or rate limits, so it stops short of full behavioral disclosure, but it is substantially richer than the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose, then use cases, then an exclusion, then returns—a logical structure. It is somewhat long because the 'Returns' section repeats keys that likely appear in the output schema, though the added interpretation thresholds justify most of that length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the single-parameter schema, the existing output schema, and the fully populated annotations, the description covers purpose, when/when-not to use it, and how to interpret the returned metrics. An agent has everything needed to call the tool correctly and understand its output semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the schema itself specifies uppercase ticker format, a regex pattern, and examples while explicitly forbidding company names. The description only adds 'for a single stock,' which clarifies that one symbol is accepted but is marginal against the fully documented schema. Baseline 3 is correct when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Retrieve implied-volatility (IV) metrics for a single stock.' It explicitly distinguishes itself from a sibling by warning 'Do NOT use this tool if you already called analyze_stock.' An agent can identify the tool's exact scope 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Three explicit 'Use this tool when' bullets cover cheap/expensive assessment, volatility regime framing, and skew analysis. The 'Do NOT use' clause names the alternative (analyze_stock) and the precise condition that selects it, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_monte_carloARead-onlyIdempotentInspect
Run a Monte Carlo price-path simulation for a stock over the next 10 trading days.
Use this tool when:
You need a probabilistic price range rather than a single point estimate.
You want the odds of finishing above recent resistance or below support.
You are sizing a position using a volatility-adjusted scenario.
The simulation uses a GBM (Geometric Brownian Motion) model calibrated with the stock's historical daily log-return drift and volatility (not implied volatility). 5,000 paths are run.
Returns
dict with keys:
ticker : str — normalized ticker
horizon_days : int — simulation horizon in trading days (10)
ci : float — confidence level of lower/upper_bound (0.90)
lower_bound : float — lower edge of the central ci price range
upper_bound : float — upper edge of the central ci price range
mean_price : float — mean simulated price at horizon
median_price : float — median simulated price at horizon
support : float — 20-day rolling low
resistance : float — 20-day rolling high (also returned as threshold)
prob_above : float — probability (0–1) the horizon price exceeds resistance
prob_below : float — 1 - prob_above
volatility : float — daily log-return standard deviation
std_tomorrow : float — one-day price standard deviation (spot × volatility)
final_prices : list — every simulated horizon price
msg : str — one-line plain-English summary
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Exchange ticker in uppercase, e.g. 'NVDA', 'AAPL', 'SPY', 'QQQ'. Do NOT pass company names ('Nvidia') — use official tickers only. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive and open-world, so the description's added value is the model disclosure: GBM calibrated on historical log-return drift and volatility, explicitly *not* implied volatility, with 5,000 paths. That is genuinely useful context (and quietly explains why this differs from get_iv_radar), but it omits cost/latency, data requirements (e.g. how much history is needed), and behavior on an unknown or thinly traded ticker.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and usage bullets are well front-loaded, but the description then embeds a full 15-line 'Returns' section that duplicates field-by-field what the existing output schema already declares. That block consumes more than half the text without adding information an agent can't get from structured data, so the otherwise clean structure is diluted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single required parameter, full schema coverage and an output schema, the definition covers everything needed to invoke it correctly: model assumptions, fixed horizon, path count, and when to choose it. Missing only secondary details such as error behavior for invalid symbols and whether repeated calls return identical paths, which the idempotentHint implies but doesn't confirm.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter and schema coverage is 100%, with the schema itself spelling out uppercase ticker format, a regex pattern, examples, and the 'no company names' rule. The description adds nothing about `symbol`, so this sits at the baseline where the schema does all the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Run a Monte Carlo price-path simulation') plus the scope ('next 10 trading days') in the first line. The three 'Use this tool when' bullets distinguish it from point-estimate siblings like get_ai_prediction and analyze_stock by explicitly framing it as a probabilistic range rather than a single number.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Use this tool when' block gives three concrete selection conditions, including the key contrast 'a probabilistic price range rather than a single point estimate', which implicitly routes point-estimate requests elsewhere. It stops short of naming a concrete alternative sibling or a 'do not use when' case, so it is clear context but not full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_option_pressureARead-onlyIdempotentInspect
Retrieve options-market positioning and dealer-hedging pressure zones.
Use this tool when:
You want to identify max-pain price (where option sellers face least loss at expiry) as a gravitational target near expiration.
You need to locate gamma walls (strike clusters with large open interest) that act as price magnets or resistance/support levels.
You want the expected-move range implied by the options market for the current weekly/monthly expiry cycle.
Returns
dict with keys: symbol : str — normalized ticker max_pain : float — max-pain strike price gamma_wall : float — largest gamma concentration strike expected_move : float — ±expected move in dollars for nearest expiry squeeze_target: float — upside squeeze price target expiry_date : str — target expiry date (YYYY-MM-DD) pressure_zones: list — list of significant strike/OI concentration dicts
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Exchange ticker in uppercase, e.g. 'NVDA', 'AAPL', 'SPY', 'QQQ'. Do NOT pass company names ('Nvidia') — use official tickers only. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it as read-only, idempotent, open-world, and non-destructive, so the safety profile is covered. The description adds domain meaning to the returned fields, but it does not disclose operational traits such as data freshness, market-hours behavior, or rate limits beyond what the annotations and output schema provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and use cases, then structured return-value details. The returns section largely duplicates the existing output schema, so it is not maximally concise, but the overall structure is clear and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a single required parameter, full schema coverage, rich annotations, and an output schema, the description is more than sufficient for correct invocation. It covers purpose, use cases, and return semantics without leaving material gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is only one parameter, and the input schema covers it at 100% with a pattern, examples, and a clear warning against using company names. The description does not add any symbol-format guidance beyond the schema, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: retrieving options-market positioning and dealer-hedging pressure zones. It explains the concrete outputs (max pain, gamma walls, expected move), making the tool clearly distinct in practice. However, it does not explicitly differentiate itself from sibling tools such as get_iv_radar or analyze_stock.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'Use this tool when' bullets give clear triggering conditions for max-pain, gamma walls, and expected-move analysis. It does not mention when not to use the tool or name a sibling alternative, so it falls short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pretrade_risk_scanARead-onlyIdempotentInspect
Run a pre-trade risk scan for a single stock: the stock's own volatility/beta/VaR/drawdown set against the SPY benchmark, market regime, a forward return distribution for the stock, position-sizing checks on the stock's own metrics, and — against the user's tracked watchlist — the sector/symbol exposure impact of adding it and its correlation to existing holdings.
riskDeltas compare SPY with the stock on its own. They are NOT the risk of
the user's portfolio before and after the trade; only exposure and
correlation use the portfolio.
Use this tool when:
You need a risk-first check before evaluating or placing a trade.
You want position-sizing guardrails (volatility, drawdown, beta, liquidity) evaluated against warn/fail thresholds, not just raw numbers.
You need to see how adding this symbol would shift sector or per-symbol concentration in the existing portfolio.
You want the new symbol's correlation to current holdings, to judge diversification benefit vs. redundant exposure.
Do NOT use this tool for:
A standalone price-distribution simulation with no portfolio context → use get_monte_carlo instead.
A general bullish/bearish read on the stock → use analyze_stock.
Example
get_pretrade_risk_scan("NVDA")
Returns
dict with keys: symbol : str — normalized ticker asOf : str — ISO 8601 date the scan was computed regime : str — "bull" | "bear" | "chop" market regime regimeConfidence: float — 0–1 confidence in the regime classification riskDeltas : list — the stock's own risk metrics next to the SPY benchmark's (field names are historical; neither side is a portfolio), each a dict: label : str — e.g. "Annualized Volatility", "Beta (vs SPY)", "1-Day VaR (95%)", "Max Drawdown (1Y)" beforeValue : float — the SPY benchmark's value (beta is 1.0) afterValue : float — the scanned stock's own value unit : str — "%" or "" (unitless, e.g. beta) higherIsRiskier : bool — whether an increase in this metric is worse distribution : dict — the stock's simulated forward return distribution over methodology.monteCarlo .horizonDays trading days (10): {"bins": list, "frequencies": list, "kde_x": list, "kde_y": list} range_90 : dict — {"lower": float, "upper": float} 5th-95th percentile of that forward return (%) mean : float — mean simulated forward return (%) threshold : float — break-even line of the distribution (0.0) sizingChecks : list — pass/warn/fail guardrail checks on the stock's own metrics, each a dict: label : str — "Volatility" | "Drawdown Risk" | "Market Exposure" | "Liquidity" status : str — "pass" | "warn" | "fail" detail : str — human-readable explanation with the thresholds used. Liquidity is the 20-day average of close x volume in the ticker's quote currency (no FX conversion); the service warns below 5,000,000 and fails below 500,000, and the detail text states those limits. Services deployed before 2026-10-12 print $50M / $5M in the text; the limits applied were 5,000,000 / 500,000 throughout. exposure : dict — portfolio concentration impact: available : bool — false if the user has no watchlist symbols to compare against bySector : list of {sector, currentPct, postTradePct, deltaPct} — empty list when available is false bySymbol : list of {symbol, currentPct, postTradePct, deltaPct} — empty list when available is false concentrationFlag : str — "pass" | "warn" | "fail" | "unknown" ("unknown" when available is false) assumedPositionWeight: float | None — None when available is false weightingMethod : str — e.g. "equal_weight_proxy" reason : str — present only when available is false; human-readable explanation (e.g. "No watchlist symbols to compare against. Add symbols to your watchlist to see portfolio exposure.") — surface this to the user instead of guessing why the section is empty correlation : dict — correlation of the new symbol to holdings: available : bool — false if the user has no watchlist symbols to compare against aggregate : dict | None — None when available is false; otherwise {avgCorrelationWithPortfolio, level, mostCorrelated: {symbol, correlation}, leastCorrelated: {symbol, correlation}} matrix : dict | None — None when available is false; otherwise {"symbols": list, "values": list[list[float]]} full pairwise correlation matrix reason : str — present only when available is false; human-readable explanation (e.g. "No watchlist symbols to compare against. Add symbols to your watchlist to see correlation.") — surface this to the user instead of guessing why the section is empty methodology : dict — how the scan was computed, read from the constants the computation uses. Absent from services deployed before 2026-10-12. Includes: monteCarlo : dict — {"model": "gbm", "horizonDays": int (10), "paths": int, "seeded": bool}; horizonDays is the horizon of distribution / range_90 / mean var : dict — {"method": "historical", "confidence": 0.95, "horizonDays": 1} thresholds : dict — warn/fail limits for every check, e.g. "turnoverBelow": {"warn": 5000000, "fail": 500000} windowStart, windowEnd, lookbackCalendarDays, observations, benchmark, benchmarkFallback, returns, annualizationDays, beta, maxDrawdownDays
Notes
Requires a valid HPSILAB_API_KEY.
Requires a paid plan (Developer, Team, Enterprise, Pro, or Pro Lifetime). A Free account is refused with HTTP 403 (
http_error, status_code 403) and is not charged.Each call deducts Credits from the account (
x-creditsin this tool's metadata). The Credits check runs first, so an empty balance isinsufficient_credits(402) even on a Free account. Confirm with the user before calling it.Exposure and correlation sections assume the user has an existing tracked watchlist/portfolio. If none exists, "available" is false in both sections, their data fields are null/empty, and each includes a "reason" string explaining why — relay that reason to the user (e.g. suggest adding symbols to their watchlist) rather than treating the missing data as an error.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Exchange ticker in uppercase, e.g. 'NVDA', 'AAPL', 'SPY'. Do NOT pass company names — use official tickers only. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent/non-destructive annotations: discloses the HPSILAB_API_KEY requirement, that a paid plan is needed and Free accounts get a 403 without being charged, that each call deducts Credits and an empty balance yields 402, and instructs the agent to confirm with the user before spending credits. It also pre-explains degraded behavior when the user has no watchlist (available=false, null fields, relay the reason rather than treat as an error).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose, usage rules, and the exclusions are front-loaded and earn their place, as do the two important caveats (riskDeltas are not portfolio deltas; liquidity threshold text drift in pre-2026-10-12 deployments). However, the Returns block reproduces an output schema that already exists, at great length — nearly half the description restates field-by-field output structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter but behaviorally complex tool, everything an agent needs is present: cost/auth gating, failure modes, the version-drift caveat on liquidity thresholds, and the explicit handling of unavailable exposure/correlation sections. The output schema carries return shapes, yet the description's clarifications about historically-named fields add real value rather than redundant detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter and schema coverage is 100%, so the schema already states the uppercase ticker pattern and forbids company names. The description adds little beyond the example call get_pretrade_risk_scan("NVDA") — no further semantics about normalization or symbol resolution, which is the baseline case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and scope ("pre-trade risk scan for a single stock") and enumerates its components: volatility/beta/VaR/drawdown vs SPY, regime, forward return distribution, sizing checks, and watchlist-based exposure/correlation. It also makes the scope boundary explicit — riskDeltas compare SPY vs stock, and only exposure/correlation use the portfolio — which an agent could not infer from the name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides an explicit "Use this tool when" list of four scenarios and a "Do NOT use this tool for" list that routes to named siblings: get_monte_carlo for standalone price simulation and analyze_stock for a general directional read. Both the positive and negative conditions are stated, not implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
register_accountAInspect
Register a free HPSILab account from the client and receive an API key.
Use this tool when:
The user has no API key yet and asks to sign up from here, with their own email address. This is the only tool that works without HPSILAB_API_KEY; the user can also register at https://hpsilab.com/register.
The user already has a key and asks for a fresh one for the same account.
It creates an account and sends a verification email, so call it only when the user asks, never to get around another tool's error on your own.
After it succeeds, set HPSILAB_API_KEY to the returned api_key so the
other tools authenticate as this account. The account is also bound to this
caller server-side, so calls from here are recognised even before the
environment variable is updated.
The account is created unverified, with only a capped evaluation allowance and no trial Credits, until the emailed link is confirmed; confirming it grants the one-time 100-Credit Registered Trial (14 days). Tell the operator to click that link.
Calling again returns the same account and a fresh key rather than creating a second one, so it is safe to retry if a key was lost. An address that already belongs to a different account is refused — you cannot attach yourself to someone else's account.
Returns
dict email : str — the registered address tier : str — plan name, "free" on registration email_verified : bool — false until the emailed link is clicked api_key : str — set this as HPSILAB_API_KEY already_registered: bool — true when this caller already had an account message : str — next step, in plain language
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | A real email address to own the account. Use the operator's address if you have one — the verification link is sent there, and an address nobody reads leaves the account permanently at the anonymous allowance. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses key side effects and lifecycle details: a verification email is sent, the account starts unverified with no trial Credits, confirmation grants a one-time 100-Credit trial, and the account is bound server-side. It also explains retry behavior and refusal when an email belongs to another account.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded and organized into clear sections, but it is longer than strictly necessary. The returns block repeats information that an output schema likely already contains, and some verification-email details appear in multiple places.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the auth-related complexity, side effects, and the presence of an output schema, the description is complete. It covers prerequisites, post-success API key handling, account verification state, retry semantics, and failure cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the single `email` parameter is already well documented. The description reinforces that the user's own address should be used, but it does not add substantial syntax or constraint detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: registering a free HPSILab account and receiving an API key. It also distinguishes this tool from all sibling stock-analysis tools by noting it is the only tool that works without HPSILAB_API_KEY.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use bullets, including the no-key signup case and the fresh-key-for-existing-account case. It also states when not to use it: never to work around another tool's error, and only when the user asks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
v0.11.1- Changed
analyze_stock1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "analyze_stockDictOutput", + "type": "object" +}
- Changed
generate_stock_images3 fields changed- added
Input schema / properties / forceAdded value: +{ + "default": true, + "description": "Regenerate hosted images instead of reusing cached artifacts.", + "title": "Force", + "type": "boolean" +} - added
Input schema / properties / typesAdded value: +{ + "anyOf": [ + { + "items": { + "enum": [ + "ai_prediction", + "iv_radar", + "option_pressure", + "monte_carlo", + "equity_curves" + ], + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional chart types to generate. Omit or use null to generate every type.", + "title": "Types" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "generate_stock_imagesDictOutput", + "type": "object" +}
- Changed
generate_stock_research_report1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "generate_stock_research_reportDictOutput", + "type": "object" +}
- Changed
get_ai_prediction1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "get_ai_predictionDictOutput", + "type": "object" +}
- Added
get_equity_curve - Removed
get_equity_curves - Changed
get_iv_radar3 fields changed- changed
Input schema / properties / symbol / descriptionPrevious value: -"Exchange ticker in uppercase, e.g. 'TSLA', 'NVDA', 'IWM'. Do NOT pass company names — use official tickers only."New value: +"Exchange ticker in uppercase, e.g. 'NVDA', 'AAPL', 'SPY', 'QQQ'. Do NOT pass company names ('Nvidia') — use official tickers only." - changed
Input schema / properties / symbol / examplesPrevious value: -[ - "TSLA", - "NVDA", - "IWM" -]New value: +[ + "NVDA", + "AAPL", + "SPY", + "QQQ" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "get_iv_radarDictOutput", + "type": "object" +}
- Changed
get_monte_carlo3 fields changed- changed
Input schema / properties / symbol / descriptionPrevious value: -"Exchange ticker in uppercase, e.g. 'MSFT', 'NVDA', 'SPY'. Do NOT pass company names — use official tickers only."New value: +"Exchange ticker in uppercase, e.g. 'NVDA', 'AAPL', 'SPY', 'QQQ'. Do NOT pass company names ('Nvidia') — use official tickers only." - changed
Input schema / properties / symbol / examplesPrevious value: -[ - "MSFT", - "NVDA", - "SPY" -]New value: +[ + "NVDA", + "AAPL", + "SPY", + "QQQ" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "get_monte_carloDictOutput", + "type": "object" +}
- Changed
get_option_pressure3 fields changed- changed
Input schema / properties / symbol / descriptionPrevious value: -"Exchange ticker in uppercase, e.g. 'AAPL', 'SPY', 'NVDA'. Do NOT pass company names — use official tickers only."New value: +"Exchange ticker in uppercase, e.g. 'NVDA', 'AAPL', 'SPY', 'QQQ'. Do NOT pass company names ('Nvidia') — use official tickers only." - changed
Input schema / properties / symbol / examplesPrevious value: -[ - "AAPL", - "SPY", - "NVDA" -]New value: +[ + "NVDA", + "AAPL", + "SPY", + "QQQ" +] - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "get_option_pressureDictOutput", + "type": "object" +}
- Changed
get_pretrade_risk_scan1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": true, + "title": "get_pretrade_risk_scanDictOutput", + "type": "object" +}
- Added
register_account
9 tool updates
v0.3.1- Changed
analyze_stock3 fields changed- added
Input schema / properties / symbol / descriptionAdded value: +"Exchange ticker in uppercase, e.g. 'NVDA', 'AAPL', 'SPY', 'QQQ'. Do NOT pass company names ('Nvidia') — use official tickers only." - added
Input schema / properties / symbol / examplesAdded value: +[ + "NVDA", + "AAPL", + "SPY", + "QQQ" +] - added
Input schema / properties / symbol / patternAdded value: +"^[A-Z][A-Z0-9.-]{0,15}$"
- Changed
generate_stock_images3 fields changed- added
Input schema / properties / symbol / descriptionAdded value: +"Exchange ticker in uppercase, e.g. 'NVDA', 'AAPL'. Do NOT pass company names — use official tickers only." - added
Input schema / properties / symbol / examplesAdded value: +[ + "NVDA", + "AAPL" +] - added
Input schema / properties / symbol / patternAdded value: +"^[A-Z][A-Z0-9.-]{0,15}$"
- Changed
generate_stock_research_report3 fields changed- added
Input schema / properties / symbol / descriptionAdded value: +"Exchange ticker in uppercase, e.g. 'NVDA', 'TSLA', 'SPY'. Do NOT pass company names — use official tickers only." - added
Input schema / properties / symbol / examplesAdded value: +[ + "NVDA", + "TSLA", + "SPY" +] - added
Input schema / properties / symbol / patternAdded value: +"^[A-Z][A-Z0-9.-]{0,15}$"
- Changed
get_ai_prediction3 fields changed- added
Input schema / properties / symbol / descriptionAdded value: +"Exchange ticker in uppercase, e.g. 'NVDA', 'META', 'QQQ'. Do NOT pass company names — use official tickers only. Per-ticker model accuracy varies; META and QQQ have shown above-baseline hit rates in backtests." - added
Input schema / properties / symbol / examplesAdded value: +[ + "NVDA", + "META", + "QQQ" +] - added
Input schema / properties / symbol / patternAdded value: +"^[A-Z][A-Z0-9.-]{0,15}$"
- Changed
get_equity_curves3 fields changed- added
Input schema / properties / symbol / descriptionAdded value: +"Exchange ticker in uppercase, e.g. 'NVDA', 'AAPL', 'SPY'. Do NOT pass company names — use official tickers only." - added
Input schema / properties / symbol / examplesAdded value: +[ + "NVDA", + "AAPL", + "SPY" +] - added
Input schema / properties / symbol / patternAdded value: +"^[A-Z][A-Z0-9.-]{0,15}$"
- Changed
get_iv_radar3 fields changed- added
Input schema / properties / symbol / descriptionAdded value: +"Exchange ticker in uppercase, e.g. 'TSLA', 'NVDA', 'IWM'. Do NOT pass company names — use official tickers only." - added
Input schema / properties / symbol / examplesAdded value: +[ + "TSLA", + "NVDA", + "IWM" +] - added
Input schema / properties / symbol / patternAdded value: +"^[A-Z][A-Z0-9.-]{0,15}$"
- Changed
get_monte_carlo3 fields changed- added
Input schema / properties / symbol / descriptionAdded value: +"Exchange ticker in uppercase, e.g. 'MSFT', 'NVDA', 'SPY'. Do NOT pass company names — use official tickers only." - added
Input schema / properties / symbol / examplesAdded value: +[ + "MSFT", + "NVDA", + "SPY" +] - added
Input schema / properties / symbol / patternAdded value: +"^[A-Z][A-Z0-9.-]{0,15}$"
- Changed
get_option_pressure3 fields changed- added
Input schema / properties / symbol / descriptionAdded value: +"Exchange ticker in uppercase, e.g. 'AAPL', 'SPY', 'NVDA'. Do NOT pass company names — use official tickers only." - added
Input schema / properties / symbol / examplesAdded value: +[ + "AAPL", + "SPY", + "NVDA" +] - added
Input schema / properties / symbol / patternAdded value: +"^[A-Z][A-Z0-9.-]{0,15}$"
- Added
get_pretrade_risk_scan
8 tool updates
v0.1.0- First observed
analyze_stock - First observed
generate_stock_images - First observed
generate_stock_research_report - First observed
get_ai_prediction - First observed
get_equity_curves - First observed
get_iv_radar - First observed
get_monte_carlo - First observed
get_option_pressure
TDQS
Scored across 10 tools
Most tools target a clear distinct dimension (IV, options pressure, Monte Carlo, AI prediction, equity curve). The only real ambiguity is between the composite tools analyze_stock and generate_stock_research_report and their sub-tools, but descriptions explicitly tell the agent when to prefer which (and even warn against calling sub-tools after analyze_stock).
All names follow a predictable snake_case verb_noun pattern: get_* for data retrievals, analyze_*, generate_*, and register_account. No mixed conventions or vague verbs.
Ten tools is well-scoped for a quant analysis suite: one per data dimension plus composites, a report, images, risk scan, and registration. Each tool earns its place without redundancy.
Core analysis surfaces are well covered, but the pretrade risk scan depends on a user watchlist/portfolio that has no create/update/delete tool in this set, and there is no account-status/quota-check tool even though credits govern usage. These gaps will force agents to hit dead ends in portfolio-aware workflows.
Maintenance
Related MCP Connectors
Quant intelligence over MCP: backtest, signals, screens, scores & portfolios for US & TSX stocks.
Real SEC, 13F, insider, congress & macro data your AI agent can cite. Hosted MCP, 24 tools.
Point-in-time, survivorship-free SEC EDGAR fundamentals + smart-money signals for AI agents.
Portfolio analytics + US-equity market research for AI clients. ChatGPT deep-research compat.
Related MCP Servers
- AlicenseAqualityBmaintenancePre-computed financial market intelligence for AI agents. Stocks, crypto, and ETFs.976 npm5MIT
- AlicenseAqualityCmaintenanceAn MCP server that exposes comprehensive Yahoo Finance data (quotes, financials, options, news, and more) to AI agents via the yfinance library, requiring no API key.24MIT
- AlicenseAqualityCmaintenanceProvides institutional-grade equity analysis for any LLM via MCP, aggregating insider trading, superinvestor holdings, analyst consensus, options data, and valuation into a confidence-weighted verdict.745 PyPIMIT
- AlicenseAqualityAmaintenanceThe Finance Toolkit gives AI assistants access to 500+ financial metrics, all calculated transparently from raw financial statements, not pulled from third-party endpoints.275,484MIT