canli-mcp@0.21.0
CAUTIONPublisher claims: "Every Canli Capital MCP server in one: 442 finance tools (SEC filings and XBRL, statements as filed, figures checked against the filings, markets, ownership, options, the Fed and macro, dividends, quant, backtest validation, paper trading) behind five too" Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Server started and answered tools/list.- Tested
- MCP initialize and tools/list · every tool description, for hidden instructions · every file read, file written and host contacted by what ran
- Not tested
- what the tools do when called with real credentials
Before you give it your token
- It will ask for
ALPACA_API_KEY_IDALPACA_API_SECRET_KEYALPACA_PAPER_SECRET_KEYALPHAVANTAGE_API_KEYAPCA_API_KEY_IDAPCA_API_SECRET_KEYCANLI_SERVE_TOKENCMC_API_KEYDUNE_API_KEYFINANCIAL_DATASETS_API_KEYFMP_API_KEYQUIVER_API_KEYUW_API_KEYVALUEIN_TOKENConfiguration, not credentials: ALPACA_DATA_FEED, ALPACA_PAPER_KEY_ID, CANLI_AS_OF, CANLI_ASK, CANLI_FRONT, CANLI_HOME, CANLI_OFFLINE, CANLI_PACKS, CANLI_PLUGINS, CANLI_POLICY, CANLI_QUOTE_SECONDS, CANLI_UPSTREAMS- Where it talks to
- canlicapital.com (its own)Also sec.gov, coingecko.com, coinpaprika.com, dexpaprika.com, crypto.com, etherscan.io, blockscout.com, kalshi.com, gatemcp.ai, financialmodelingprep.com, alphavantage.co, financialdatasets.ai, unusualwhales.com, quiverquant.com, valuein.biz, coinmarketcap.com, dune.com — not the publisher's domain; check what for before connecting.
- What the honeypot saw
- no credential files read · no network
- What we could not test
- what the tools do when called with real credentials
Connect it with a scoped credential, under the guard, and read the third-party hosts first. The code names sec.gov, coingecko.com, coinpaprika.com, dexpaprika.com, crypto.com, etherscan.io, blockscout.com, kalshi.com, gatemcp.ai, financialmodelingprep.com, alphavantage.co, financialdatasets.ai, unusualwhales.com, quiverquant.com, valuein.biz, coinmarketcap.com, dune.com as well as its own vendor. The guard injects ALPACA_API_KEY_ID, ALPACA_API_SECRET_KEY, ALPACA_PAPER_SECRET_KEY, ALPHAVANTAGE_API_KEY, APCA_API_KEY_ID, APCA_API_SECRET_KEY, CANLI_SERVE_TOKEN, CMC_API_KEY, DUNE_API_KEY, FINANCIAL_DATASETS_API_KEY, FMP_API_KEY, QUIVER_API_KEY, UW_API_KEY, VALUEIN_TOKEN only into requests to canlicapital.com (and its subdomains) and refuses the rest.
Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (2 scenarios) on 2026-11-14 and scored it 72/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: Hidden zero-width characters detected; Access to sensitive file paths. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 25 s · 2 scenariosStatic findings
if (readOnly) throw new Error("The sentinel watches from your own machine. Run it locally: npx -y canli-mcp");Fix: Pin versions and sources; vendor anything fetched at install time.…19 by a key published at https://canlicapital.com/.well-known/canli-receipt-keys.json.","","id?: string, receipt?: object, include_receipt?: boolean"],["backtest_strategy","validation","validation","Backtest a rule over a parameter grid, v…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.… answers, and the hosted server keeps nothing between requests. Run it locally: npx -y canli-mcp"); const entry = await preregs.add(args); gov?.audit?.record?…Fix: Pin versions and sources; vendor anything fetched at install time.const lines = text.replace(/^/, "").split(/\r?\n/).filter((l) => l.trim());Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.… a model ("ignore all previous instructions", a chat template's system marker, "you are now an assistant"), the answer carries `caution` with where they are and a short excerp…Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.scope === "request" ? "Hosted: only this request is counted; run the search as one batch, or locally with npx canli-mcp." : "",Fix: Pin versions and sources; vendor anything fetched at install time.…onfig/Code/User"), file: "mcp.json", key: "servers", entry: { type: "stdio", ...NPX } }, { id: "gemini", name: "Gemini CLI", root: ".gemini", file: "settings.json"…Fix: Pin versions and sources; vendor anything fetched at install time.…er allowed to change things)` : ""}.` + " Any argument can be {\"$file\": \"path.csv\", \"column\": \"close\"} (or \"columns\": [...] / \"all\") instead of pasted numbers. {\"$result\": i, \"path\": \"close\"} passes batch call i's output …Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…ount: equity, cash, buying power, positions, open orders, the market clock, the kill switch and the local order log's verified head.","positions holdings balance cas…Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.…adOnly) throw new Error("The signed log is on your own machine. Run it locally: npx -y canli-mcp"); return signedTrialCount(args, { dir: join(canliHome(), "audit"), k…Fix: Pin versions and sources; vendor anything fetched at install time.…ce's text: when a result from any pack holds phrases written to steer a model ("ignore all previous instructions", a chat template's system marker, "you are now an assistant"), the answer carr…Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.const NPX = { command: "npx", args: ["-y", "canli-mcp"] };Fix: Pin versions and sources; vendor anything fetched at install time.…{String(bad[0].error).slice(0, 140)}). On the hosted server, run the local one: npx -y canli-mcp.`); const factors = prices.slice(0, FACTORS.length), own = prices.s…Fix: Pin versions and sources; vendor anything fetched at install time."Claude Code: claude mcp add canli -s user -- npx -y canli-mcp",Fix: Pin versions and sources; vendor anything fetched at install time.… session, and the hosted server keeps nothing between requests. Run it locally: npx -y canli-mcp"); return vault; }; tools.restatement_causes = (args) => { allowed(…Fix: Pin versions and sources; vendor anything fetched at install time.…y hold comments)", file, add_by_hand: { [client.key]: { [name]: client.entry ?? NPX } } }; } if (!json || typeof json !== "object" || Array.isArray(json)) return…Fix: Pin versions and sources; vendor anything fetched at install time.…l explains arguments in full). To save tokens: pass long data as {"$file": "path.csv", "column": "close"} instead of pasting numbers; put several calls in one run_tool, using {"$result": i, "path": "field"} to feed one call's output into t…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.if (readOnly) throw new Error("export_result writes to your own machine. Run it locally: npx -y canli-mcp");Fix: Pin versions and sources; vendor anything fetched at install time.return new StdioClientTransport({ command, args, env: { ...getDefaultEnvironment(), ...env }, stderr: "ignore" });Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.Cost to the agent
Tokens estimated at four characters each. The tool list is re-read by the agent on every turn, so it is the number to compare between servers that do the same job: ranked across the index.
Known vulnerabilities
No advisories in OSV for canli-mcp@0.21.0 as of 3 h ago. This is the package itself, not its dependencies.
What would make this Verified
8 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Unclaimed publisher≈ +8 on the totalClaim arhancanli: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Touches files outside the project≈ +7 on the totalKeep reads and writes inside the working directory, or declare the exact paths in `filesystem:` and explain why in the README.
- Hidden zero-width characters detected≈ +4 on the totalKeep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.
- Access to sensitive file paths≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- npx invocation of non-well-known package≈ +2 on the totalPin versions and sources; vendor anything fetched at install time.
- File type combined with upload action≈ +2 on the totalRemove the call, or declare the host in frontmatter and explain in the README what is sent and why.