financial-research-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@financial-research-mcpAssess NVDA AI infrastructure risk and research"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Multi-Agent Financial Research System with MCP
An auditable financial-research workflow that autonomously plans a bounded investigation, routes a query across specialist agents, invokes typed tools through local or real MCP transport, critiques the evidence, and produces a traceable research brief.
The system combines multi-agent orchestration, typed tool calling, MCP transport, retrieval, live-provider adapters, evaluation, and deterministic fallbacks. It produces research briefs and does not place trades or provide investment advice.
Architecture
CLI / FastAPI / Streamlit
|
v
Supervisor Agent ---- optional Ollama planner
|
+-- Market Agent ------ market bars, returns, volatility
+-- News Agent -------- headlines and lightweight sentiment
+-- Fundamentals Agent SEC company facts and reported metrics
+-- Comparison Agent --- aligned multi-symbol risk comparison
+-- Research Agent ---- arXiv papers
+-- Document Agent ---- semantic/vector RAG over local notes
+-- Risk Agent -------- volatility and maximum drawdown
|
v
Critic Agent ------ evidence and coverage checks
|
v
Synthesis Agent ------ optional Ollama synthesis
|
v
Report + evaluation + trace + optional saved artifacts
Tool path in the recommended runtime:
Agent -> ToolGateway -> MCP stdio client -> MCP server -> tool adapter -> providerRelated MCP server: otto
What Is Agentic Here?
The tools fetch or calculate data. The agents decide how that evidence is used:
The supervisor selects specialist agents from the query.
The supervisor records a research plan, executes it, inspects coverage, and may request one evidence-recovery pass before stopping.
Specialists call tools, transform raw results into findings, and state limitations.
The critic checks fallback usage and missing evidence categories.
The synthesis agent combines findings into one risk-aware thesis.
Optional Ollama reasoning can replace deterministic planning and prose while retaining a free fallback.
This is bounded agent autonomy: the workflow can plan and execute research, but it cannot place trades or modify external systems.
Quick Start
Python 3.10 or newer is required.
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install -e ".[api,ui,market]"Run a reproducible offline analysis through the real MCP client/server path:
FIN_RESEARCH_LIVE=0 \
FIN_RESEARCH_TOOL_RUNTIME=mcp-stdio \
financial-research-agent "Assess NVDA AI infrastructure risk and research" --saveInspect machine-readable output and the execution trace:
FIN_RESEARCH_LIVE=0 \
FIN_RESEARCH_TOOL_RUNTIME=mcp-stdio \
financial-research-agent "Assess NVDA AI infrastructure risk and research" --json --traceSaved runs contain report.md, report.json, and trace.json under runs/<run_id>/. The directory is intentionally ignored by Git.
Interfaces
CLI:
financial-research-agent "Assess AMD competition and downside risk"API:
financial-research-apiThen use GET /health, GET /tools, or POST /research with:
{"query": "Assess NVDA AI infrastructure risk"}Streamlit UI:
set -a
source .env
set +a
financial-research-uiOpen the printed local URL, usually http://localhost:8501. Enter a question in the
Research question field and select Run full investigation. The desk shows the thesis and
agent findings first, then Evidence & sources, Quality checks, and Execution trace tabs.
The sidebar controls live versus offline data, offline fallback, and optional Ollama reasoning.
Standalone MCP server:
financial-research-mcpTool Runtime Modes
local: direct Python calls through the gateway; fastest for unit tests.mcp: an in-process compatibility shim with the same gateway shape. It does not cross an MCP transport.mcp-stdio: a real MCP client and server subprocess with one persistent session per research run.
Use mcp-stdio when demonstrating MCP. The server returns provider and fallback provenance with live-source results, so traces remain truthful across the protocol boundary.
Data Sources
Default auto behavior attempts free live sources and falls back to bundled deterministic fixtures when enabled:
Market: yfinance; optional Alpha Vantage, Polygon, or Financial Modeling Prep keys.
News: Yahoo Finance RSS; optional Finnhub or NewsAPI key.
Papers: arXiv Atom API.
Documents: bundled research notes searched by lexical, token-vector, or optional semantic FAISS retrieval.
Risk: locally calculated log returns, annualized volatility, and maximum drawdown.
Fundamentals: SEC Company Facts API when live mode is enabled; bundled demo facts offline.
set -a
source .env
set +a
FIN_RESEARCH_MARKET_PROVIDER=alpha_vantage \
financial-research-agent "Assess PLTR earnings risk"To prevent fallback and fail loudly when a live source is unavailable:
FIN_RESEARCH_OFFLINE_FALLBACK=0 financial-research-agent "Assess NVDA risk"Optional Local LLM
Deterministic planning and synthesis work without an API or model bill. For free local reasoning, install Ollama separately and run:
ollama pull llama3.2:3b
FIN_RESEARCH_LLM=ollama \
FIN_RESEARCH_OLLAMA_MODEL=llama3.2:3b \
financial-research-agent "Assess NVDA AI infrastructure risk and research"Ollama can assist supervisor planning, specialist explanations, critique, synthesis, and an optional LLM judge. If it is unavailable, each operation falls back to deterministic logic.
Semantic RAG
The default document tool uses a dependency-free token-vector cosine retriever. Install the larger optional stack to use sentence-transformer embeddings with FAISS nearest-neighbor search:
python3 -m pip install -e ".[rag]"The bundled documents and evaluation cases are Python package data, so they remain available after wheel installation rather than only from a source checkout.
Evaluation and Verification
python3 -m pip install -e ".[dev,api,market]"
ruff check src tests
python3 -m unittest discover -s tests -v
FIN_RESEARCH_LIVE=0 financial-research-eval
financial-research-eval --ablation --limit 6The 30-case labelled benchmark reports routing and tool precision/recall, provider success and fallback rates, citation coverage, claim support, contradiction/critic recall, report completeness, MCP failures, and stage-level latency. The ablation command compares deterministic orchestration with the local Ollama model on a stratified sample. See EVALUATION.md for methodology, measured results, and limitations.
The benchmark does not prove investment correctness or alpha. Those require time-aligned datasets, independent expert labels, source-entailment evaluation, and out-of-sample financial validation.
GitHub Actions runs linting, tests, and the offline benchmark on Python 3.10 and 3.12. A Dockerfile packages the FastAPI service.
Project Layout
src/financial_research_agent/
agents/ supervisor, specialists, comparison, fundamentals, critic, synthesis
mcp/ MCP tool contracts and stdio server
tools/ providers, document retrieval, risk calculations
data/ packaged offline fixtures and benchmark cases
tool_gateway.py local/shim/real-MCP runtime boundary
reasoning.py deterministic and optional Ollama reasoning
evaluation.py report, freshness, contradiction, and grounding diagnostics
grounding.py evidence IDs, registry, and thesis citations
observability.py provider/transport/LLM/stage latency, evidence, failures, fallbacks
cli.py api.py ui.py
tests/ unit, routing, benchmark, and MCP integration testsCurrent Scope
This is an autonomous research-assistance prototype, not investment advice or execution infrastructure.
Free sources are delayed, rate-limited, and not exchange-grade.
Headline sentiment is rule-based; it is not a validated finance-language model.
The deterministic supervisor uses keyword routing; optional Ollama planning is not guaranteed to be correct.
Multi-ticker comparison is supported for basic return and volatility context; portfolio optimization is not implemented.
SEC Company Facts are summarized as reported fundamentals; full filing retrieval and claim-level excerpts are future work.
The critic detects configured fallback, coverage, and market/news contradiction classes; open-ended claim resolution remains future work.
Confidence values are engineering heuristics, not calibrated probabilities.
Offline market/news/paper records are synthetic fixtures and are visibly marked as such.
“Autonomous” is deliberately bounded: there is no open-ended self-modification, trade execution, or unreviewed external action.
See PRODUCT_READINESS.md for the self-audit and LEARNING_NOTES.md for concept explanations.
License
MIT. See LICENSE.
Available Tools
10 toolscalculate_max_drawdownA
Calculate maximum drawdown from prices.
| Name | Required | Description | Default |
|---|---|---|---|
| prices | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The tool appears to be a pure calculation with no side effects, but the description does not disclose output format, edge cases, or assumptions about input ordering. Without annotations, more detail about behavior would be helpful.
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 a single, concise sentence with no superfluous words. It directly conveys the tool's purpose.
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?
The description is adequate for a simple calculation, but it does not explain the expected output (e.g., number, ratio, percentage) or any relevant calculation conventions. Since the tool appears to be part of a larger finance toolkit, additional context would improve completeness.
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?
The schema provides the parameter type and required status, and the description mentions prices, but it does not explain ordering, time series requirements, or whether values should be adjusted. Basic semantics are implied but not explicit.
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?
Description clearly states the operation: calculate maximum drawdown from prices. It is specific enough to distinguish from sibling tools like calculate_returns and calculate_volatility.
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?
No guidance is given about when to use this tool versus alternatives, nor any conditions or prerequisites. The description only states what it does, not when it should be chosen.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_returnsB
Calculate log returns from a price series.
| Name | Required | Description | Default |
|---|---|---|---|
| prices | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries full responsibility for disclosing behavior. It does not mention assumptions, edge cases (e.g., zero prices, ordering), or side effects, leaving the agent unaware of potential pitfalls.
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 a single sentence, highly concise and to the point. No unnecessary words or redundant information.
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 simple calculation tool, the description gives the core function, but it lacks important context such as output format (even though an output schema exists, it's not shown) and potential numerical issues. It is minimally sufficient but not fully complete.
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?
The schema has 0% description coverage for the 'prices' parameter. The description does not explain what the prices represent (e.g., chronological order, currency) or expected format, failing to compensate for the missing schema documentation.
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 clearly states the tool's function: calculating log returns from a price series. This is specific and distinguishes it from sibling tools like calculate_volatility and calculate_max_drawdown.
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 usage is implied by the name and description (use when log returns are needed), but there is no explicit guidance on when to use this tool versus alternatives. No comparison to siblings is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_volatilityA
Calculate rolling volatility from prices.
| Name | Required | Description | Default |
|---|---|---|---|
| prices | Yes | ||
| window | No | ||
| annualize | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden for behavioral transparency. It states the action but does not disclose any underlying assumptions (e.g., method of volatility calculation, handling of insufficient data, or whether annualization uses square-root-of-time rule). It is transparent about the lack of side effects but omits edge-case 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 description is a single, concise sentence that immediately conveys the core functionality. It avoids unnecessary words and is well-structured for quick comprehension.
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?
The description is complete for triggering a basic volatility calculation but lacks details about the output format or expected result (despite the tool having an output schema, it is not shown). It also does not specify any constraints like minimum number of prices required, which could affect proper invocation.
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?
The schema provides names and types but no descriptions. The description only says 'from prices' and does not explain the meaning of 'window' or 'annualize'. For example, it is unclear whether 'window' is the rolling window length in periods or something else. This leaves significant room for misinterpretation.
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 clearly states the verb 'Calculate' and the target resource 'volatility' from prices, and explicitly mentions 'rolling' which differentiates it from sibling tools like calculate_returns and calculate_max_drawdown. This makes the tool's purpose immediately identifiable.
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 implies usage for volatility calculations but does not explicitly state when to prefer this tool over siblings, such as when to choose volatility over returns or drawdown. No exclusion criteria or context are provided, leaving some ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_company_fundamentalsC
Get reported company facts with provider provenance.
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | ||
| provider | No | auto |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of disclosing side effects, permissions, or data access. It simply says 'Get' without mentioning whether this is a read-only operation, any rate limits, or dependencies on provider availability.
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 a single, concise sentence that directly states the tool's purpose with no unnecessary words or fluff.
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 tool with only two parameters and no output schema, the description is minimally adequate but lacks key details such as what output format to expect, what 'company facts' encompass, and how provider provenance is reflected in the result. This could lead to confusion in edge 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?
The schema has 0% description coverage, and the tool description does not explain the purpose or expected format of the 'ticker' or 'provider' parameters. While 'ticker' may be self-explanatory, 'provider' is ambiguous, and the description fails to compensate for the lack of schema descriptions.
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 clearly states a specific action ('Get') and a resource ('reported company facts'), with 'provider provenance' hinting at a differentiator from sibling tools like get_market_data. However, 'company facts' is somewhat vague without elaboration on what types of facts (e.g., financials, fundamentals).
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?
No guidance is provided on when to use this tool versus alternatives such as get_market_data or search_news. The description only states what the tool does, leaving the choice of tool to the agent's inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_market_dataC
Get recent market bars together with provider provenance.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| ticker | Yes | ||
| provider | No | auto |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It implies a read-only operation ('Get') but does not explicitly state that it is non-destructive, nor does it mention any side effects, rate limits, or response structure beyond provenance. The description is too thin to give confidence about 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 description is a single, front-loaded sentence with no wasted words. It is appropriately short, though it sacrifices necessary detail for brevity, which is a trade-off rather than a flaw in 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?
Given no output schema, no annotations, and three parameters, the description is incomplete. It fails to clarify the meaning of 'recent' (tied to the days parameter), the behavior of the provider 'auto' default, or what 'provider provenance' entails. An agent would need to inspect the schema or guess to call this correctly.
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 0%, so the description must compensate by explaining the parameters. It does not mention ticker, days, or provider at all, leaving the agent to infer their meaning from names and defaults alone. This is a critical gap for a tool with three parameters.
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 clearly states the action ('Get') and the resource ('market bars'), with a specific qualifier ('recent') and a distinguishing feature ('provider provenance'). It does not explicitly differentiate from siblings like get_company_fundamentals, but the resource is distinct enough to be clear.
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?
There is no guidance on when to use this tool versus alternatives, nor any prerequisites or exclusions. The description simply states what it does, leaving the agent to infer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_arxivC
Search research papers together with provider provenance.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| provider | No | auto |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided. The description implies a read-only search but does not state side effects, rate limits, or whether it returns cached or live data. The behavior is only partially transparent.
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 a single compact sentence without redundancy. It directly states the core function and a distinguishing detail, achieving high information density in minimal 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?
The description conveys the general purpose and mentions provider provenance, but lacks details on parameter behaviors, result format, and when to prefer this over sibling search tools. It is adequate for a basic understanding but not fully complete.
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?
The input schema provides no descriptions for query, limit, or provider, and the description does not explain any of them. With 0% schema coverage and no compensating text, the parameters remain completely undefined.
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 names the action (search) and resource (research papers), and adds 'provider provenance' to indicate result attributes. It is distinct from sibling search tools (e.g., search_news, search_documents) but the provenance phrase is slightly ambiguous.
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?
No explicit guidance on when to use this tool versus alternatives like search_news or search_documents. It does not mention any conditions that would favor this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_documentsC
Search local research documents.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It only states the action without explaining how the search works, what it returns, or any constraints. This is a significant gap.
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 a single short sentence, which is concise, but it is under-specified. It lacks the structure and detail needed to be useful, making it more of an under-specification than a concise description.
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?
The tool has two parameters and no annotations, yet the description provides no detail about return values, search behavior, or edge cases. An agent cannot confidently call this tool correctly based on the description alone.
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 0%, and the description does not mention the parameters (query and limit) at all. The agent receives no guidance on how to format the query or what the limit controls.
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 clearly states the action (search) and the resource (local research documents). It is not a tautology. However, it does not differentiate from sibling tools like search_documents_vector and search_documents_semantic, which likely also search local research documents.
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?
There is no guidance on when to use this tool versus the other search tools (search_news, search_arxiv, search_documents_vector, etc.). The description gives no context or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_documents_semanticB
Search local research documents with FAISS embeddings when available.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, and the description only mentions 'when available' without disclosing what happens if FAISS embeddings are not available (e.g., error, fallback, empty results). It also does not mention any auth, side effects, or output format.
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 concise and to the point, with no unnecessary words or fluff. It fits in a single sentence and effectively communicates the core functionality.
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?
The tool lacks crucial context such as return format, error handling, and how it differs from sibling search tools. Given the existence of multiple search tools in the sibling list, a brief note on when to prefer semantic search would significantly improve completeness.
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?
The schema defines 'query' as a required string and 'limit' as an integer with a default of 5, but the description provides no additional meaning. Parameters like 'query' are obvious, but 'limit' could have implications (e.g., max results) that are not explained.
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 clearly states the action ('Search'), the specific resource ('local research documents'), and the method ('FAISS embeddings'), which distinguishes it from a plain full-text search sibling like 'search_documents'.
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 does not provide any guidance on when to use this semantic search versus the sibling 'search_documents' or 'search_documents_vector'. The phrase 'when available' hints at a conditional behavior but does not explain fallback or selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_documents_vectorB
Search local research documents with vector-space ranking.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description gives no details about side effects, permissions, or return behavior. Since the tool is a search operation, it is reasonable to assume it is read-only, but this is not explicitly stated. The description also does not mention any edge cases (e.g., empty results, handling of malformed queries) which could affect the agent's expectations.
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 a single, concise sentence that captures the essential functionality. There is no unnecessary verbosity, and every word adds value. It is well-structured and easy to parse.
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?
The description lacks crucial context about the tool's scope and expectations. It does not clarify what 'local research documents' refers to (e.g., a specific corpus, file types, or directory). It also does not hint at the output format, though an output schema exists. The missing parameter semantics and limited usage guidance leave the description incomplete for a robust agent decision.
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?
The schema provides no descriptions for the parameters (query and limit), and the tool description also fails to explain them. The description does not mention what constitutes a valid query (e.g., natural language vs. keywords) or what the limit parameter controls (e.g., maximum number of results). With 0% schema coverage and no description, the agent has no guidance on parameter semantics.
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 clearly states the tool's function: searching local research documents using vector-space ranking. This directly distinguishes it from sibling tools like search_documents (which likely uses keyword matching) and search_documents_semantic (which may use a different semantic approach). The verb 'search' and the specific ranking method make the purpose unambiguous.
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 does not explicitly state when to use this tool versus the alternatives. It implies that vector-space ranking is the differentiator, but there is no explicit guidance such as 'use this when you need semantic similarity' or 'use this instead of search_documents for fuzzy queries.' The sibling context provides some inference, but the tool description alone lacks clear usage instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_newsB
Search financial news together with provider provenance.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| ticker | No | ||
| provider | No | auto |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, and the description only states the action without detailing side effects, return format, or whether it's read-only. The description does not go beyond what the tool name alone suggests.
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 a single concise sentence that directly states the tool's purpose. No unnecessary words or redundancy.
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 simple search tool with no output schema, the description is adequate. It implies results include news and provider info. Minor gap: does not specify whether it returns full articles or just metadata, but this is not critical for basic invocation.
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?
The input schema fully covers parameter names, types, defaults, and required status, so the baseline is 3. The description adds no additional meaning to the parameters (e.g., what 'provider' or 'ticker' entail).
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 clearly states the tool searches financial news and includes provider provenance, distinguishing it from other search tools like arxiv or document searches. The verb 'search' and resource 'financial news' are specific.
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?
No explicit guidance on when to use this tool versus siblings like search_arxiv or search_documents. The name and description imply news-specific use, but no criteria or conditions are provided.
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.
10 tool updates
v0.3.0- First observed
calculate_max_drawdown - First observed
calculate_returns - First observed
calculate_volatility - First observed
get_company_fundamentals - First observed
get_market_data - First observed
search_arxiv - First observed
search_documents - First observed
search_documents_semantic - First observed
search_documents_vector - First observed
search_news
TDQS
Scored across 10 tools
Most tools map cleanly to distinct resources or calculations, but the three search_documents variants overlap considerably and an agent may struggle to choose between plain, vector, and semantic search. Descriptions help somewhat, but the boundaries remain unclear.
All tools follow a consistent snake_case verb_noun pattern: get_*, search_*, and calculate_*. This makes tool selection predictable and reinforces the purpose of each tool.
Ten tools is a reasonable size for a financial research server covering data retrieval, document search, and analytics. The three document search variants add mild redundancy but do not make the count excessive.
The tool surface covers core research workflows: retrieving market data and fundamentals, searching news/papers/local documents, and computing common return and risk statistics. Minor gaps exist, such as no explicit save/annotate workflow or more advanced analytics, but these are not critical for the apparent scope.
Maintenance
Related MCP Connectors
Real SEC, 13F, insider, congress & macro data your AI agent can cite. Hosted MCP, 24 tools.
Research-only MCP server: your AI as a quant research desk. 90 tools, no trades, no brokers.
Finance research agent for thesis, trade note, and market-state review.
Trade across 22+ exchanges and brokers from any MCP-capable AI agent, no install required.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA multi-agent MCP server for comprehensive stock research and analysis using natural language queries, backed by SEC filings and real-time market data.-
- AlicenseAqualityAmaintenanceEnables AI agents to operate a local financial terminal, including market data, backtesting, paper portfolio management, and news digest, through safe, gated tools over MCP.6MIT
- AlicenseAqualityAmaintenanceProvides live financial data for any LLM agent, including stock quotes, crypto prices, SEC filings, XBRL financials, FX rates, and macro indicators, through ten MCP tools.1175 npm1MIT
- FlicenseNot gradedqualityCmaintenanceA multi-agent financial portfolio risk analyzer that provides MCP tools for fetching market news and storing compliance-reviewed assessment reports in a local database.-