Koskamo

Quantic Finance MCP

An MCP server for Quantic Finance that enables AI agents to track dividend portfolios across US and EU markets. It provides tools for searching stocks, viewing dividend calendars, analyzing income history, and generating tax reports. Anonymous access is available for reference tools, while authenticated access unlocks portfolio-specific features like holdings and performance tracking.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Quantic Finance MCP logo, by QuanticVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-07Operated by Quantic
MCP endpoint (Streamable HTTP)
https://quantic.finance/mcp
Vendor documentation

What its tools do

24 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

24 of 24 have a description · 24 of 24 declare behavior hints · 0 of 22 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to quantic.finance ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Search for stocks and retrieve detailed stock information
  • View dividend and earnings calendars
  • Track dividend portfolio income and safety
  • Generate FIFO tax reports for Spain-aware taxes

Source and maintenance

Vendor evidenceRegistry 1.0.0

Protocol and capabilities

Server
Quantic Finance 1.0.0
MCP protocol negotiated in check
2025-11-25
Tools
24 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {}
}

Tools

24 advertised

compare_stocks — Compare stocks
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Compare 2–4 stocks side by side (the /compare view): snapshot, dividend growth, Quantic reads, valuation, momentum, financial health, schedule and community metrics — with the winning column flagged per row (`best`). Pass a list of tickers, e.g. ["KO","PEP","MO"].

compare_stocks input schema
{
  "type": "object",
  "required": [
    "symbols"
  ],
  "properties": {
    "symbols": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  }
}
compare_stocks annotations
{
  "title": "Compare stocks",
  "readOnlyHint": true,
  "openWorldHint": true
}
dividend_calendar — Upcoming ex-dividend dates
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Upcoming ex-dividend dates across the dividend universe over the next `days` days (default 45, max 120), soonest first. Public — buy before the ex-date to receive the next dividend. Each row also carries the forward annual dividend rate (`dividend_rate`, in `currency`: the provider's declared rate, or for a steady payer its last payment times payments per year — never the coming payment's own amount), the current yield as a percentage (`dividend_yield`, 2.84 = 2.84%), and the payment date (`pay_date`). Any of them is null when unknown, as the rate is for payers with an uneven interim and final.

dividend_calendar input schema
{
  "type": "object",
  "properties": {
    "days": {
      "type": "integer"
    }
  }
}
dividend_calendar annotations
{
  "title": "Upcoming ex-dividend dates",
  "readOnlyHint": true,
  "openWorldHint": true
}
dividend_changes — Recent dividend raises and cuts
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Dividend raises and cuts Quantic saw over the last `days` days (default 7, max 90), newest first. Public. Each row is a change in the forward annual dividend rate: `old_rate` → `new_rate`, in `currency`, with `kind` "raise" or "cut" and `basis` "annual". A semi-annual payer's row has `basis` "payment" instead: its new payment against the same payment a year earlier (interim against interim, final against final), since its two payments a year are rarely the same size. `detected_on` is the day Quantic first saw the new rate: near the declaration when the provider declares it, within a week of the first changed payment's ex-date when it comes from the payments. Never the company's declaration date. The log starts on 2026-10-14; nothing before that is in it.

dividend_changes input schema
{
  "type": "object",
  "properties": {
    "days": {
      "type": "integer"
    }
  }
}
dividend_changes annotations
{
  "title": "Recent dividend raises and cuts",
  "readOnlyHint": true,
  "openWorldHint": true
}
earnings_calendar — Upcoming earnings reports
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Upcoming earnings reports across the universe over the next `days` days (default 14, max 60), soonest first. Public — the same dates the stock pages show logged out. `estimated` is true when the date is the provider's projection from the previous cycle rather than one the company confirmed; word the two differently. `earnings_date_end` is set when only a window is known.

earnings_calendar input schema
{
  "type": "object",
  "properties": {
    "days": {
      "type": "integer"
    }
  }
}
earnings_calendar annotations
{
  "title": "Upcoming earnings reports",
  "readOnlyHint": true,
  "openWorldHint": true
}
get_dividends — Your received dividends
Advertised by the server during the last successful anonymous check.
Advertised read-only

The signed-in user's received (paid) dividends, newest first. Each row carries the symbol, pay date, shares, per-share and gross amount, withholding tax, net amount and currency. Optionally filter by `symbol` (e.g. "AAPL") and a `from`/`to` date window (ISO-8601, e.g. "2024-01-01"), and/or pass `portfolio` (one of your portfolio names or slugs, case-insensitive — see `list_portfolios`) to narrow to that portfolio; omitted, dividends aggregate across all your portfolios (rows then carry a `portfolio` name when you have more than one). Private to the caller.

get_dividends input schema
{
  "type": "object",
  "properties": {
    "to": {
      "type": "string"
    },
    "from": {
      "type": "string"
    },
    "symbol": {
      "type": "string"
    },
    "portfolio": {
      "type": "string"
    }
  }
}
get_dividends annotations
{
  "title": "Your received dividends",
  "readOnlyHint": true
}
get_holdings — Your holdings
Advertised by the server during the last successful anonymous check.
Advertised read-only

The signed-in user's current holdings: each position's symbol, name, shares held, average cost per share, trading currency and sector. This is cost-basis data from the ledger (no live prices) — use `get_valuation` for current market value, gain/loss and yield. Optionally pass `portfolio` (one of your portfolio names or slugs, case-insensitive — see `list_portfolios`) to narrow to that portfolio; omitted, holdings aggregate across all your portfolios (rows then carry a `portfolio` name when you have more than one). Private to the caller.

get_holdings input schema
{
  "type": "object",
  "properties": {
    "portfolio": {
      "type": "string"
    }
  }
}
get_holdings annotations
{
  "title": "Your holdings",
  "readOnlyHint": true
}
get_income_attribution — Why your income changed
Advertised by the server during the last successful anonymous check.
Advertised read-only

Why the signed-in user's dividend income changed: the trailing 12 months against the 12 before them, split into what the companies did, what the user did, what the tax office took and what the exchange rate moved. The four components sum to the headline change by construction, so they can be quoted together without reconciling them yourself. Each is in the user's preferred currency and **net of the withholding their broker recorded**, the same basis `get_income_outlook` reports. `organic` is the part that came from raises alone — income the companies added without the user putting in another cent. That is the number worth leading with: a year where income grew because savings went in is a different achievement from one where it grew because dividends were raised, and only the second compounds on its own. Returns `null` when the ledger doesn't reach back far enough to cover both windows. That is a refusal, not an error: comparing a part-year against a full one shows a collapse that never happened, so say the history is too short rather than reporting a change. Two honesty flags worth relaying when non-zero: * `withholding_newly_reported` — holdings whose earlier window recorded no withholding and whose later one did. Their withholding line reflects the broker starting to report the tax, not the tax changing. * `unresolved_fx` — payments whose historical rate couldn't be resolved. Those fall back to today's rate and so contribute nothing to the currency line, rather than inventing a move. Optionally pass `portfolio` (one of your portfolio names or slugs, case-insensitive — see `list_portfolios`); omitted, it aggregates across all your portfolios. Private to the caller.

get_income_attribution input schema
{
  "type": "object",
  "properties": {
    "portfolio": {
      "type": "string"
    }
  }
}
get_income_attribution annotations
{
  "title": "Why your income changed",
  "readOnlyHint": true
}
get_income_outlook — Your dividend income outlook
Advertised by the server during the last successful anonymous check.
Advertised read-only

The signed-in user's forward dividend income outlook, in their preferred currency: projected annual income at the current rate (gross and net of estimated foreign withholding tax), the income-weighted trailing dividend growth, the current yield, the top income-contributing holdings (gross and net per holding, ranked on the net basis when withholding applies; with each one's growth, 5-year CAGR and consecutive-increase streak), and a year-by-year income projection (gross and net). Also `income_year` — the shape of a typical year: projected income per calendar month, which months sit below the monthly average ("thin") or collect nothing at all, and the share of the year landing in its three biggest months (0.25 would be perfectly even; higher is lumpier). Most companies pay quarterly on one of three cycles, so portfolios drift towards collecting heavily in March/June/September/December, which matters to anyone spending the income rather than reinvesting it. Absent for portfolios too small for the shape to mean anything. Set `years` for the projection horizon (default 10, max 50) and `drip: true` to compound reinvested dividends. Optionally pass `portfolio` (one of your portfolio names or slugs, case-insensitive — see `list_portfolios`) to project just that portfolio; omitted, the outlook aggregates across all your portfolios. Private to the caller.

get_income_outlook input schema
{
  "type": "object",
  "properties": {
    "drip": {
      "type": "boolean"
    },
    "years": {
      "type": "integer"
    },
    "portfolio": {
      "type": "string"
    }
  }
}
get_income_outlook annotations
{
  "title": "Your dividend income outlook",
  "readOnlyHint": true
}
get_movements — Your trades & cash movements
Advertised by the server during the last successful anonymous check.
Advertised read-only

The signed-in user's trades / cash movements (buys, sells, …), newest first. Each row carries the symbol, date, type, quantity, price, total amount, fee and currency. Optionally filter by `symbol` (e.g. "AAPL") and a `from`/`to` date window (ISO-8601, e.g. "2024-01-01"), and/or pass `portfolio` (one of your portfolio names or slugs, case-insensitive — see `list_portfolios`) to narrow to that portfolio; omitted, movements aggregate across all your portfolios (rows then carry a `portfolio` name when you have more than one). Private to the caller.

get_movements input schema
{
  "type": "object",
  "properties": {
    "to": {
      "type": "string"
    },
    "from": {
      "type": "string"
    },
    "symbol": {
      "type": "string"
    },
    "portfolio": {
      "type": "string"
    }
  }
}
get_movements annotations
{
  "title": "Your trades & cash movements",
  "readOnlyHint": true
}
get_options — Your options positions
Advertised by the server during the last successful anonymous check.
Advertised read-only

The signed-in user's options positions — the income "wheel" of sold puts and calls — newest first. Each row carries the symbol, put/call type, strike, expiry, contracts, premium collected, fees, status (open/expired/assigned/ closed), net premium, break-even price, annualized premium yield (ratio) and currency. Optionally filter by `symbol` (e.g. "AAPL") and `status` ("open", "history" for everything resolved, or "all"), and/or pass `portfolio` (one of your portfolio names or slugs, case-insensitive — see `list_portfolios`) to narrow to that portfolio; omitted, positions aggregate across all your portfolios (rows then carry a `portfolio` name when you have more than one). Premium is received income alongside dividends. Private to the caller.

get_options input schema
{
  "type": "object",
  "properties": {
    "status": {
      "type": "string"
    },
    "symbol": {
      "type": "string"
    },
    "portfolio": {
      "type": "string"
    }
  }
}
get_options annotations
{
  "title": "Your options positions",
  "readOnlyHint": true
}
get_performance — How your portfolio has done
Advertised by the server during the last successful anonymous check.
Advertised read-only

How the signed-in user's portfolio has actually done — an annualized **money-weighted** return (XIRR) in their preferred currency, including dividends received and any sales, next to what the same money moved on the same days would have made in broad index funds. Money-weighted, not time-weighted: it counts *when* each amount went in, so money invested before a good year earns more of the credit than money added at the end. Every flow is converted at the exchange rate published on its own date, so currency movement is part of the answer — unlike `get_realized`, which deliberately never converts because it measures a position rather than a portfolio. `status` says whether a number was produced: * `"ok"` — `rate_pct` and the comparison are present. * `"insufficient_ledger"` — no holding has any trades behind it, so there is nothing to measure a return on. Ask the user to import their broker's trades. * `"awaiting_rates"` — historical exchange rates for the years the ledger spans are still being fetched; they arrive shortly. **`coverage` matters when reporting this.** Holdings whose shares were typed in by hand have no purchase behind them, so they are excluded from both the flows and the value: the rate describes only the part with trade history, and `coverage.value_pct` says how much of the portfolio that is. Say so rather than presenting the figure as the whole portfolio's. Benchmarks are accumulating funds, whose price already includes reinvested dividends, so both sides are total return. They are priced monthly, so treat the comparison as a direction rather than a decimal. Private to the caller.

get_performance input schema
{
  "type": "object",
  "properties": {
    "portfolio": {
      "type": "string"
    }
  }
}
get_performance annotations
{
  "title": "How your portfolio has done",
  "readOnlyHint": true
}
get_portfolio — Your full portfolio snapshot
Advertised by the server during the last successful anonymous check.
Advertised read-only

The signed-in user's complete portfolio snapshot in one call: current holdings (shares + average cost), dividends received, trades (movements) and radar watchlist with target prices. Their own private data, including amounts. Use this for a full overview/backup; for a specific slice (filtered dividends or movements, current market value, income projection) prefer the focused tools (`get_dividends`, `get_movements`, `get_valuation`, `get_income_outlook`). Optionally pass `portfolio` (one of your portfolio names or slugs, case-insensitive — see `list_portfolios`) to narrow to that portfolio; omitted, the snapshot aggregates across all your portfolios (ledger rows then carry a `portfolio` name when you have more than one).

get_portfolio input schema
{
  "type": "object",
  "properties": {
    "portfolio": {
      "type": "string"
    }
  }
}
get_portfolio annotations
{
  "title": "Your full portfolio snapshot",
  "readOnlyHint": true
}
get_radar — Your radar watchlist
Advertised by the server during the last successful anonymous check.
Advertised read-only

The signed-in user's radar (watchlist): stocks they're tracking to buy or sell, with their target buy/sell prices, notes and currency. Private to the caller. Use `get_stock` to fetch the current price for any of these symbols.

get_radar input schema
{
  "type": "object",
  "properties": {}
}
get_radar annotations
{
  "title": "Your radar watchlist",
  "readOnlyHint": true
}
get_realized — What your sales realized
Advertised by the server during the last successful anonymous check.
Advertised read-only

What the signed-in user's sales actually realized — the positions they've sold out of, and the partial sales of positions they still hold. Each row carries proceeds, the cost basis those proceeds consumed, and the **signed** `result` (negative when sold below the average cost), plus the holding window, trade count and dividends collected while held. Pass `status: "closed"` for only the positions that were fully sold out, or `portfolio` (a portfolio name or slug — see `list_portfolios`) to narrow to one; omitted, it covers every portfolio. Also returns per-currency totals. Results use **average cost** and are never converted between currencies: each figure stays in the currency the shares traded in. This is a measure of how a position performed, not a tax calculation — most European tax rules match each sale to specific purchases (FIFO) instead. Private to the caller.

get_realized input schema
{
  "type": "object",
  "properties": {
    "status": {
      "type": "string"
    },
    "portfolio": {
      "type": "string"
    }
  }
}
get_realized annotations
{
  "title": "What your sales realized",
  "readOnlyHint": true
}
get_stock — Look up a stock
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Look up a stock or ETF by ticker (e.g. "KO", "SCHD"): its dividend profile, live quote, two annual dividends with their yields (`dividend_rates`: `trailing`, paid in the last 12 months, and `forward`, the latest payment times payments a year; `headline` says which of them the quote's `dividend_yield` is), dividend safety, balance-sheet leverage, the momentum & value scores and the snowflake radar — and, for a signed-in caller, the full "Valuation & strategy" read (fair value, two-stage DDM, margin of safety, sector-relative rank, dividend doubling time, max drawdown).

get_stock input schema
{
  "type": "object",
  "required": [
    "symbol"
  ],
  "properties": {
    "symbol": {
      "type": "string"
    }
  }
}
get_stock annotations
{
  "title": "Look up a stock",
  "readOnlyHint": true,
  "openWorldHint": true
}
get_stock_research — Stock research brief
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Fetch Quantic's AI-generated research deep-dive for a stock — the narrative brief (overview, dividend history, safety, risks, watch items). Optional `locale` (falls back to English). Returns `found: false` when no article has been generated for the stock yet.

get_stock_research input schema
{
  "type": "object",
  "required": [
    "symbol"
  ],
  "properties": {
    "locale": {
      "type": "string"
    },
    "symbol": {
      "type": "string"
    }
  }
}
get_stock_research annotations
{
  "title": "Stock research brief",
  "readOnlyHint": true,
  "openWorldHint": true
}
get_tax_report — Your tax year, assembled
Advertised by the server during the last successful anonymous check.
Advertised read-only

A tax year assembled from the signed-in user's own ledger: the dividends received (gross, withheld at source, net — per payment and per source country) and the disposals made (matched first-in first-out, with Spain's two-month rule applied to losses). Foreign currency is converted to euros at the ECB's official daily reference rate for each date — a dividend at its pay date, and a sale's cost and proceeds at their own separate dates, so the currency movement between buying and selling is part of the result. Pass `year` (defaults to the last completed one). Private to the caller. **Beta, and unevenly scoped.** The dividends section works for any tax residence. The disposals section is modelled for **Spain only** so far and returns `supported: false` for anyone else — say so rather than implying the user has no sales. `other_income` is cash that is income but not a dividend — today only payments in lieu of a dividend, paid by the borrower of a lent share instead of the company. It is reported and deliberately **not classified**: no casilla, and it must never be added to the dividend totals or described as dividend income. `other_costs` is what the broker charged the account — today only margin interest. It is **not deductible** in a Spanish declaration, and that is a rule rather than an open question: say so plainly if asked, and never suggest subtracting it from income or folding it into a cost basis. **This is the input to a declaration, not a declaration.** No tax is computed. Every figure carries flags where the data is incomplete — a missing exchange rate, a broker that never reports withholding, a position that sold more shares than its recorded purchases account for. Those flags are the point: relay them, and relay the disclaimer, whenever you relay a number from here.

get_tax_report input schema
{
  "type": "object",
  "properties": {
    "year": {
      "type": "integer"
    },
    "portfolio": {
      "type": "string"
    }
  }
}
get_tax_report annotations
{
  "title": "Your tax year, assembled",
  "readOnlyHint": true
}
get_upcoming_dividends — Your next dividends
Advertised by the server during the last successful anonymous check.
Advertised read-only

The signed-in user's next dividends: each holding, and each stock on their radar, whose ex-dividend date or payment date falls in the next `days` days (default 45, max 120), soonest first. Each item carries `ex_dividend_date` and `pay_date` (either can be null; an ex-date already past with the payment still to come means the dividend is already theirs), `per_share` (this payment per share: the forward annual rate over the payments a year, an estimate until declared) and `currency`. A holding (`held: true`) also carries its `shares` and `expected`, what it should pay gross, and `expected_net`, net of estimated foreign withholding, both in the stock's currency. A radar stock has no amount. Optionally pass `portfolio` (one of your portfolio names or slugs, case-insensitive — see `list_portfolios`) for that portfolio's holdings only, without the radar; omitted, every portfolio and the radar, and each holding says which portfolio it is in when there is more than one. Private to the caller.

get_upcoming_dividends input schema
{
  "type": "object",
  "properties": {
    "days": {
      "type": "integer"
    },
    "portfolio": {
      "type": "string"
    }
  }
}
get_upcoming_dividends annotations
{
  "title": "Your next dividends",
  "readOnlyHint": true
}
get_valuation — Your portfolio valuation
Advertised by the server during the last successful anonymous check.
Advertised read-only

The signed-in user's portfolio valued at current market prices, in their preferred display currency. Returns the total market value and cost basis (so total − cost is the unrealised gain/loss), the yield on cost and current yield, a sector breakdown, and a per-position list with each holding's market value, cost and forward annual dividend income. Income is reported both gross and net of estimated foreign withholding tax (from the user's tax residence), and the health block includes a per-country geography breakdown. Uses live quotes; positions whose price can't be resolved have null value/income. Optionally pass `portfolio` (one of your portfolio names or slugs, case-insensitive — see `list_portfolios`) to value just that portfolio; omitted, the valuation aggregates across all your portfolios. Private to the caller.

get_valuation input schema
{
  "type": "object",
  "properties": {
    "portfolio": {
      "type": "string"
    }
  }
}
get_valuation annotations
{
  "title": "Your portfolio valuation",
  "readOnlyHint": true
}
list_portfolios — Your portfolios
Advertised by the server during the last successful anonymous check.
Advertised read-only

The signed-in user's portfolios: each one's name and whether it is the default; publicly shared portfolios also carry their URL `slug`. Pass a name (or slug) as the `portfolio` param of the ledger tools (`get_holdings`, `get_portfolio`, `get_movements`, `get_dividends`, `get_options`, `get_valuation`, `get_income_outlook`) to narrow them to one portfolio; without it they aggregate across all portfolios. Private to the caller.

list_portfolios input schema
{
  "type": "object",
  "properties": {}
}
list_portfolios annotations
{
  "title": "Your portfolios",
  "readOnlyHint": true
}
list_stocks — Curated dividend list
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Fetch a curated dividend list by `slug`. Slugs: dividend-aristocrats, dividend-kings, monthly-dividend-stocks, highest-yield-dividend-stocks, safest-reits, dividend-growth-stocks, low-debt-dividend-stocks, large-cap-safe-dividend-stocks, utility-dividend-stocks, healthcare-dividend-stocks, consumer-staples-dividend-stocks, energy-dividend-stocks, european-dividend-stocks, best-dividend-etfs, monthly-dividend-etfs, best-momentum-dividend-stocks, undervalued-dividend-stocks. Returns the list's title, intro and ranked stocks (compact rows — call get_stock for a full read). Set `eu_only` to keep only holdings listed on a European exchange. This matters most on the two fund lists: a US-listed ETF has no key information document under European rules, so a European broker refuses the order — most of the funds in `best-dividend-etfs` are US-listed and unbuyable from Europe. Use it whenever the person asking is investing from Europe.

list_stocks input schema
{
  "type": "object",
  "required": [
    "slug"
  ],
  "properties": {
    "slug": {
      "type": "string"
    },
    "eu_only": {
      "type": "boolean"
    }
  }
}
list_stocks annotations
{
  "title": "Curated dividend list",
  "readOnlyHint": true,
  "openWorldHint": true
}
screen_stocks — Screen stocks
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Find dividend stocks & ETFs matching criteria — the screener behind quantic.finance. Filter by `sector`, `currency`, yield range (`min_yield`/`max_yield`, on the 5-year average), `min_cagr5y`, `min_streak`, `frequency`, leverage (`max_de`), `min_current` ratio, `min_market_cap`, dividend-`safety` ("safe"/"watch"/"at_risk"), `min_rating` (Quantic's composite 0–10 read on the company), `type` ("equity"/"etf"), or the `aristocrat`/`reit`/`has_ffo`/`exclude_traps` toggles; `sort` by "quality" (the default — the 0–10 rating), "yield", "cagr5y", "streak", "ffo_payout_asc", "momentum" or "value". Returns up to 100 compact rows — call `get_stock` for a full read of any match. Two notes worth passing on to whoever asked. **Sorting by yield alone is how people find yield traps**, which is why quality leads by default. And `exclude_traps` drops what Quantic has already judged at risk while KEEPING stocks it has never assessed — unassessed is not the same as dangerous, so a result set is never quietly narrowed to only what happens to have been scanned.

screen_stocks input schema
{
  "type": "object",
  "properties": {
    "reit": {
      "type": "boolean"
    },
    "sort": {
      "type": "string"
    },
    "type": {
      "type": "string"
    },
    "max_de": {
      "type": "number"
    },
    "safety": {
      "type": "string"
    },
    "sector": {
      "type": "string"
    },
    "has_ffo": {
      "type": "boolean"
    },
    "currency": {
      "type": "string"
    },
    "frequency": {
      "type": "string"
    },
    "max_yield": {
      "type": "number"
    },
    "min_yield": {
      "type": "number"
    },
    "aristocrat": {
      "type": "boolean"
    },
    "min_cagr5y": {
      "type": "number"
    },
    "min_rating": {
      "type": "number"
    },
    "min_streak": {
      "type": "integer"
    },
    "min_current": {
      "type": "number"
    },
    "exclude_traps": {
      "type": "boolean"
    },
    "min_market_cap": {
      "type": "number"
    }
  }
}
screen_stocks annotations
{
  "title": "Screen stocks",
  "readOnlyHint": true,
  "openWorldHint": true
}
screen_wheel — Wheel screener
Advertised by the server during the last successful anonymous check.
Advertised read-only

Options worth selling on the wheel, ranked by company quality first and premium second — the same order the `/options/wheel` screen uses. Two lenses via `side`: `"put"` (the default) lists quality dividend payers the caller does **not** hold, where a cash-secured put gets paid to wait for a price they'd accept; `"call"` lists holdings large enough to cover a contract once shares already pledged to open calls are set aside. Rows are **not priced** unless `price: true`. Listing costs nothing; pricing fetches a live option chain per symbol, so it is capped by `limit` (default 5, max 10) and should be asked for only when the caller actually wants numbers. Securities with no listed options come back `chain_status: "no_chain"` — a fact about the security, not a failure, and most European listings land there. Priced put rows carry the period and annualized return, the downside buffer, the effective cost basis if assigned, the yield on cost that basis would give, and the maximum loss. Priced call rows carry the return if called away, the upside forfeited, whether the strike clears the holding's cost basis, and whether a dividend goes ex inside the contract — the usual reason a covered call is exercised early. **This is not investment advice.** Every response carries a `disclaimer`, verbatim rather than paraphrased, and it must be relayed rather than summarized away — as must the maximum loss beside any return quoted. Private to the caller.

screen_wheel input schema
{
  "type": "object",
  "properties": {
    "side": {
      "type": "string"
    },
    "limit": {
      "type": "integer"
    },
    "price": {
      "type": "boolean"
    },
    "portfolio": {
      "type": "string"
    }
  }
}
screen_wheel annotations
{
  "title": "Wheel screener",
  "readOnlyHint": true
}
search_stocks — Search dividend stocks
Advertised by the server during the last successful anonymous check.
Advertised read-onlyOpen-world

Search dividend stocks by ticker or company name (e.g. "coca", "AAPL"). Public — returns up to ~10 matches with their symbols.

search_stocks input schema
{
  "type": "object",
  "required": [
    "query"
  ],
  "properties": {
    "query": {
      "type": "string"
    }
  }
}
search_stocks annotations
{
  "title": "Search dividend stocks",
  "readOnlyHint": true,
  "openWorldHint": true
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
835 ms
95th percentile latency
835 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 835 ms · metadata changed · 24 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http quantic-finance-mcp https://quantic.finance/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add quantic-finance-mcp --url https://quantic.finance/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable quantic-finance-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "quantic-finance-mcp": {
      "url": "https://quantic.finance/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "quantic-finance-mcp": {
      "type": "streamableHttp",
      "url": "https://quantic.finance/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start quantic-finance-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "quantic-finance-mcp": {
      "type": "http",
      "url": "https://quantic.finance/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http quantic-finance-mcp https://quantic.finance/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://quantic.finance/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "quantic-finance-mcp": {
      "serverUrl": "https://quantic.finance/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Quantic Finance MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Quantic Finance MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing