← MCP servers · jerbouma

Finance Toolkit

BLOCKgrade F · trust 55/100

Transparent and Efficient Financial Analysis

algorithmic tradingequitiesfactor analysisfinancefinancial analysisfinancial datafinancial statementsfundamental analysis

Overview

From the repository's own README, as read at the audited commit.

<!-- mcp-name: io.github.JerBouma/financetoolkit -->[![FinanceToolkit](https://github.com/JerBouma/FinanceToolkit/assets/46355364/198d47bd-e1b3-492d-acc4-5d9f02d1d009)](https://github.com/JerBouma/FinanceToolkit)[![GitHub Sponsors](https://img.shields.io/badge/Sponsor_this_Project-grey?logo=github)](https://github.com/sponsors/JerBouma)[![Buy Me a Coffee](https://img.shields.io/badge/Buy_Me_a_Coffee-grey?logo=buymeacoffee)](https://www.buymeacoffee.com/jerbouma)[![LinkedIn](https://img.shields.io/badge/LinkedIn-grey?logo=Linkedin&logoColor=white)](https://www.linkedin.com/in/boumajeroen/)[![MCP Server](https://img.shields.io/badge/MCP_Server-grey?logo=modelcontextprotocol)](https://www.jeroenbouma.com/projects/financetoolkit/mcp)[![Download MCP Bundle](https://img.shields.io/badge/Download_MCP_Bundle-grey?logo=anthropic)](https://github.com/JerBouma/FinanceToolkit/releases/latest/download/financetoolkit.mcpb)[![Smithery](https://img.shields.io/badge/Smithery-grey?logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjE1OSIgdmlld0JveD0iMCAwIDEzNSAxNTkiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggZD0iTTMxLjM1MDggNTguNDA1M0gwVjc4Ljk0OTJDMCA5MC44ODcyIDkuNjc1NzggMTAwLjU2MyAyMS42MTM4IDEwMC41NjNINDIuMTU3N1Y2OS4yMTIyQzQyLjE1NzcgNjMuMjQzMiAzNy4zMTk4IDU4LjQwNTMgMzEuMzUwOCA1OC40MDUzWiIgZmlsbD0id2hpdGUiLz48cGF0aCBkPSJNNDYuMjMyNyA2OS4yMTIyVjEwMC41NjNINzcuNTgzNUM4My41NTI1IDEwMC41NjMgODguMzkwNCA5NS43MjUxIDg4LjM5MDQgODkuNzU2MVY1OC40MDUzSDU3LjAzOTZDNTEuMDcwNiA1OC40MDUzIDQ2LjIzMjcgNjMuMjQzMiA0Ni4yMzI3IDY5LjIxMjJaIiBmaWxsPSJ3aGl0ZSIvPjxwYXRoIGQ9Ik0xMTMuMDEzIDU4LjQwNTNIOTIuNDY5NVY4OS43NTYxQzkyLjQ2OTUgOTUuNzI1MSA5Ny4zMDc0IDEwMC41NjMgMTAzLjI3NiAxMDAuNTYzSDEzNC42MjdWODAuMDE5MUMxMzQuNjI3IDY4LjA4MTEgMTI0Ljk1MSA1OC40MDUzIDExMy4wMTMgNTguNDA1M1oiIGZpbGw9IndoaXRlIi8+PHBhdGggZD0iTTAuMDAwMjQ0MTQxIDM3LjU1MzVWNTQuMzUxSDMxLjM1MTFDMzcuMzIwMSA1NC4zNTEgNDIuMTU4IDQ5LjUxMzEgNDIuMTU4IDQzLjU0NDFWNi4wMTUzNEM0MC45MzMyIDUuOTc1NzIgMzkuNjYxNiA1Ljk1NDEgMzguMzMyMyA1Ljk1NDFDMTc

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code (pypi)
claude mcp add financetoolkit --env FINANCIAL_MODELING_PREP_API_KEY=${FINANCIAL_MODELING_PREP_API_KEY} --env FRED_API_KEY=${FRED_API_KEY} -- None financetoolkit==2.1.5

Details

Source
jerbouma/financetoolkit
PyPI
financetoolkit
Transports
stdio · streamable-http
Credentials it reads
FINANCIAL_MODELING_PREP_API_KEYFRED_API_KEYFT_MCP_SECRET_KEY
Tools
Registered at runtime; the list could not be read from source.
License
MIT
Stars
5,327 · pushed 2d ago

Trust audit

Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryWARN
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (1 observation(s))
Network
declared (4 observation(s))
Shell
declared (4 observation(s))
Dependencies
pinned
Secrets in source
found

Findings (25)

HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
financetoolkit/cache/serialization_model.py:50
return pickle.loads(zlib.decompress(payload))  # noqa: S301
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
financetoolkit/cache/serialization_model.py:78
return pickle.loads(zlib.decompress(payload))  # noqa: S301
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
financetoolkit/ratios/ratios_controller.py:495
calculation = eval(formula_adjusted)  # noqa
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHNetwork egress · net.tls_off · CWE-200, CWE-319
financetoolkit/utilities/requests_model.py:59
url, headers=headers, timeout=timeout, verify=False  # noqa
Why it matters. certificate verification is disabled
Fix. leave verification on
MEDIUMInventory / provenance · inv.binary · CWE-1104
financetoolkit/portfolio/example_datasets/example_portfolio.xlsx
example_portfolio.xlsx
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
financetoolkit/mcp_server/registry_controller.py:386
module = importlib.import_module(module_path)
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
README.md:118
discovery = Discovery(api_key="FINANCIAL_MODELING_PREP_KEY")
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
financetoolkit/discovery/discovery_controller.py:56
discovery = Discovery(api_key="FINANCIAL_MODELING_PREP_KEY")
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
financetoolkit/discovery/discovery_controller.py:124
discovery = Discovery(api_key="FINANCIAL_MODELING_PREP_KEY")
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
financetoolkit/discovery/discovery_controller.py:229
discovery = Discovery(api_key="FINANCIAL_MODELING_PREP_KEY")
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
financetoolkit/discovery/discovery_controller.py:292
discovery = Discovery(api_key="FINANCIAL_MODELING_PREP_KEY")
LOWInventory / provenance · inv.binary · CWE-1104
tests/datasets/balance_dataset.pickle
balance_dataset.pickle
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.binary · CWE-1104
tests/datasets/cash_dataset.pickle
cash_dataset.pickle
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.binary · CWE-1104
tests/datasets/historical_dataset.pickle
historical_dataset.pickle
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.binary · CWE-1104
tests/datasets/income_dataset.pickle
income_dataset.pickle
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.hidden_file · CWE-1104
.pre-commit-config.yaml
.pre-commit-config.yaml
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
financetoolkit/mcp_server/mcpb/.mcpbignore
.mcpbignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
financetoolkit/mcp_server/mcpb/build-mcpb.sh:18
REPO_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/mcp_server/test_mcp_oauth.py:104
client = TestClient(app, base_url="http://127.0.0.1:8000")
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/mcp_server/test_mcp_oauth.py:236
client = TestClient(app, base_url="http://127.0.0.1:8000")
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/mcp_server/test_mcp_oauth.py:291
client = TestClient(app, base_url="http://127.0.0.1:8000")
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/mcp_server/test_mcp_oauth.py:334
client = TestClient(app, base_url="http://127.0.0.1:8000")
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
README.md:9
[![Smithery](https://img.shields.io/badge/Smithery-grey?logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjE1OSIgdmlld0JveD0iMCAwIDEzNSAxNTkiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczL
LOWObfuscation / stealth · obf.base64_blob · CWE-506, CWE-94
README.md:10
[![Glama](https://img.shields.io/badge/Glama-grey?logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzMwIiBoZWlnaHQ9IjMzMCIgdmlld0JveD0iMCAwIDMzMCAzMzAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8
LOWInventory / provenance · mcp.no_tools_extracted · CWE-1104
server.json
Why it matters. the tool list is enumerated at runtime by tools/list, not declared in source
Fix. the page says so rather than showing an empty table

Gates applied: no_behavioural_pass.

Audited 2026-09-13 · audit v0.4.0 · source sha ffd971075709 · full audit: observations/trust-audit/mcp-server/jerbouma__finance-toolkit.json · Report an issue or request a re-scan

Audit history

DateSourceVerdictGradeScoreChange
2026-09-13ffd971075709BLOCKF55first audit

Also audited

Servers with a similar trust profile.

Questions

What is the Finance Toolkit MCP server?

Transparent and Efficient Financial Analysis

Is Finance Toolkit safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (55/100) and found 4 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does Finance Toolkit need?

It reads FINANCIAL_MODELING_PREP_API_KEY, FRED_API_KEY and FT_MCP_SECRET_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does Finance Toolkit run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on PyPI as financetoolkit.

How current is this page?

The grade is for one exact copy of the source (ffd971075709), read on 2026-09-13. The repository is watched and re-audited when it changes.

Provenance: OBSERVED · read 2026-09-13 · job trust-audit-2026-09-13