Model Context Protocol

Serwer MCP z danymi polskiej giełdy

93 narzędzi, przez które Twój agent czyta Giełdę Papierów Wartościowych w Warszawie: notowania i świece śróddzienne, raporty ESPI i EBI, dane kwartalne wyciągnięte z dokumentów spółek, prognozy wyników z rozliczeniem trafności oraz analitykę portfela w złotych. Działa z Claude, z Claude Code i z każdym klientem, który mówi protokołem MCP.

Adres serwera: https://agentrynku.pl/api/mcp

Dane, nie zeskrobana strona

Raporty ESPI i EBI z kanału GPW, dane kwartalne wyciągnięte z dokumentów spółek, notowania z własnego potoku. Każda liczba niesie datę i źródło, a narzędzie ODMAWIA odpowiedzi zamiast zgadywać, gdy danych brakuje.

Transport HTTP, bez instalacji

Serwer stoi pod jednym adresem i mówi protokołem MCP przez HTTP. Nie ma paczki do zainstalowania ani procesu do utrzymania po Twojej stronie - wystarczy adres i klucz.

Klucz per agent, zakresy uprawnień

Każdy klucz ma własny zakres. Agent do czytania rynku nie dostaje prawa zapisu do portfela, a operacje zapisujące są w osobnym zakresie niż odczyt.

Jak podłączyć

Klucz API wygenerujesz w ustawieniach konta. Poniżej konfiguracja dla klienta czytającego mcpServers.

{
  "mcpServers": {
    "gieldownik": {
      "type": "http",
      "url": "https://agentrynku.pl/api/mcp",
      "headers": {
        "Authorization": "Bearer TWOJ_KLUCZ"
      }
    }
  }
}

O co zapytać agenta

  • „Co dziś raportuje KGHM i jaka jest prognoza?"
  • „Pokaż spółki z WIG20 po ostatnich wynikach"
  • „Które moje pozycje mają koncentrację powyżej 20%?"
  • „Ile zapłacę podatku od sprzedaży w tym roku?"

Czego serwer NIE robi

  • Nie składa zleceń i nie łączy się z rachunkiem maklerskim.
  • Nie daje porady inwestycyjnej - oddaje dane i wyliczenia.
  • Nie zgaduje: przy brakujących danych zwraca odmowę z powodem, a nie liczbę zastępczą.

Wszystkie narzędzia (93)

Opisy są w oryginale, po angielsku - to ten sam tekst, który dostaje model przy wyborze narzędzia, więc odpowiada dokładnie temu, co serwer robi.

Notowania i rynek

9

Kursy bieżące, świece dzienne i śróddzienne, ruchy sesji, puls sektorów i anomalie wolumenu na GPW.

  • compare_symbols

    Cross-symbol metrics table for fast head-to-head comparison (2-10 symbols). Pulls per-symbol metrics from assets / asset_forecasts / evaluations / priceHistoryDaily in one round-trip. Includes a composite ranking score so you can answer 'which of these 3 banks is best positioned right now?' without a series of get_forecast calls. Symbols canonicalized server-side (XTB-style 'KGH.PL' → 'KGHM'). Cross-universe ready: every row carries `universe` + `reportingCurrency` (PLN for polish-stocks, USD for us-stocks) so mixed PL+US batches stay self-describing. ⛔ POLE `missing` JEST ZAWSZE OBECNE, także puste: wymienia symbole z wejścia, które nie mają własnego wiersza, wraz z powodem. [merged_into] plus `resolvedTo` znaczy alias scalony z kodem kanonicznym (ASBIS do ASB), [duplicate] ten sam symbol podany dwa razy, [no_data] kanoniczny symbol bez wiersza. Bez tego pola redukcja 5 symboli do 3 wygląda identycznie jak brak pokrycia.

  • get_cross_market_peers

    Returns US peers for a PL holding (or PL peers for a US holding) with 90d rolling correlation, relative-valuation delta, and 30d sector momentum diff. Use for PL->US migration sequencing ('sell KGHM into copper rally, buy FCX into copper rally', or 'KGHM trades 30% below copper-implied while FCX at parity -> KGHM undervalued'). Peers tagged source in {auto-seeded, curated, user-pinned}; auto-seeded are heuristic and should be flagged as such in chat copy. (US w trybie tracking-only — tylko wycena posiadanych).

  • get_intraday_candles

    Read stored hourly OHLCV candles from price_history_intraday for a symbol, with a live-quote merge for the in-progress (unclosed) hour during market sessions. Returns up to N candles within a configurable window. Use for short-horizon trend / momentum reads; for 30d+/daily granularity prefer get_price_series interval=1d. Coverage: portfolio + watchlist tickers harvested by the ingest-eodhd-hourly worker; symbols not in the harvest set will return candles=[]. Live merge fires only during session hours (WSE for polish-stocks, NYSE for us-stocks) and is suppressed when the latest stored candle already covers the current hour.

  • get_intraday_quote

    Current intraday quote per symbol: price, open, intraday high/low, volume, previous close, change% vs open, change% vs previous close. Sourced from EODHD's quote feed (the same delayed feed powering whats_moving_now — typically ~15min behind, NOT a licensed real-time stream). Use as a single source of truth for 'current cena' / intraday-move detection (|change%| triggers) instead of scraping stooq. Pass 1-10 symbols. Symbols with no quote (unreachable / off-coverage) come back with quote=null. `delayed:true` flags the latency.

  • get_market_anomalies

    Detect anomalous intraday price moves on watched/owned symbols and classify each as whole-market or stock-specific. For each anomaly returns: today's move pct, sigma-move (vs 30d realized vol), market context (WIG / WIG20 same-day change), recent newsflow count + last-30d sentiment avg, and an optional Polish hypothesis from Sonnet (set `withSynthesis: true`). Use to answer 'co się stało dziś z X?' / 'rynek mocno rośnie — dlaczego' — particularly when no news_item triggered an alert. Anti-slop: hypotheses LABELED as such; cites are mandatory; user makes the call.

  • get_price_series

    Get OHLC candles + realized volatility for a symbol. Supports daily bars (interval 1d, periods 30d/90d/1y) and EODHD intraday bars (interval 1h/15min/5min, periods 1d/1w). `days` is an exact rolling lookback and takes precedence over `period`. Use for position sizing, stop-loss calibration, hedge ratios, and intraday stop checks.

  • get_spot_price

    Lekki tool — bieżąca cena dla 1 spółki. Używaj gdy companion potrzebuje SPOT price (NIE używaj OHLC get_price_series jeśli wystarczy 1 number). Zwracaj DOKŁADNIE jedną cenę i konsystentnie w całej odpowiedzi (FR 3bb3bb). CENĘ BIERZ Z POLA `price` — to najlepsza dostępna wartość, a `priceBasis` mówi czy pochodzi z zamknięcia dziennego czy z kwotowania śróddziennego (~15 min opóźnienia). `lastClose` to zawsze zamknięcie OSTATNIEJ sesji — podczas trwającej sesji (`sessionInProgress=true`) NIE jest ceną bieżącą. `isStale` liczy ZAMKNIĘTE sesje danego rynku (`sessionsMissed`), nie dni kalendarzowe, więc weekend go nie zapala.

  • sector_pulse_pl

    Sector-level pulse of the Polish stock market: groups covered symbols by sector, computes today's median/mean change pct, gainers/losers count, and top movers per sector. Use to answer 'co rośnie/spada na GPW dziś?', 'czy to ruch sektorowy czy szeroki rynek?', 'gdzie zaszła rotacja?'. Anti-slop: medians (not means) lead the ranking, sectors with too few symbols are skipped, sentiment/news context is optional context not a verdict.

  • whats_moving_now

    One-call synthesis of 'co się dzieje na rynku teraz?' — combines sector_pulse_pl + get_market_anomalies + recent material alerts (last 24h) into a unified picture. Use as the TOP entry point when user asks 'co się dzieje?', 'gdzie ruch?', 'rynek mocno spada — dlaczego?'. NOTE: during the WSE session, all_covered sector/mover %s use a worker-refreshed EODHD intraday snapshot delayed ~15min when fresh; off-session or when the snapshot is stale they fall back to previous daily close. The `dataFreshness` field carries basis, intradayAsOf, isStale, plus marketIndexAsOf/marketIndexStalenessMinutes for the WIG header. Top-level `marketStatus` ('open'|'closed'|'pre_open'|'after_hours') + `dataAsOfTradingSession` (YYYY-MM-DD of the session the %s come from) + `stalenessNote` (Polish, only when not open) let a client badge 'Rynek zamknięty — dane z pt' so weekend/holiday last-close moves aren't read as live. Anti-slop: numeric facts come from underlying tools (cite-able), 'narrative' field is OPT-IN Sonnet hypothesis (LABELED, ≤4 sentences). Cheap by default (~$0); narrative adds ~$0.05.

Raporty i komunikaty spółek

12

Raporty ESPI i EBI, dane kwartalne wyciągnięte z dokumentów, kalendarz publikacji, konferencje wynikowe i walne zgromadzenia.

  • get_company_analysis

    Get AI-generated fundamental analysis markdown for a user-owned or watched Polish stock.

  • get_company_dossier

    Multi-year persistent memory per spółka — categorized findings (issue / strength / red_flag / pattern / context) accumulated across evaluations and analyses. Use to ground 'co tam słychać u KGHM?' questions in historical context and to surface recurring themes (chronic guidance miss, dividend cadence, regulatory risk profile). Returns most recent N entries per category. New issuers may have an empty dossier — totalEntries=0.

  • get_conference_reminders

    Upcoming results-call / earnings conferences for tracked tickers. Reads evaluations classified as 'earnings_conference' with a future scheduledFor in conferenceMeta. Default scope: user's portfolio + targets + watchlist. Returns soonest-first with daysUntil, accessUrl, language. Useful for sequencing analysis around conference dates.

  • get_conference_summary

    Latest AI-extracted conference summary (results call / analyst meeting / strategy day) for a symbol. Pulls from conference_summaries collection — Sonnet 4.6 extraction of post-event PAP wire / Strefa / IR press release writeups. Returns: managementHighlights[] (3-7 quotes with speaker + topic), guidanceUpdates[] (forward-looking with measurable component), sectorOutlook[], qaInsights[], plus aspirational-vs-testable flags + redFlags. Use to answer 'co prezes powiedział na konferencji?' / 'jakie guidance dostaliśmy?' Pass `conferenceDate` (YYYY-MM-DD) for a specific past event; default returns the latest.

  • get_earnings_calendar

    List upcoming earnings dates for a set of symbols. Defaults to user's portfolio + targets + watchlist; pass `symbols` to filter further. Returns nearest-first by daysUntil (negative for already-passed when includePast=true). Source: strefainwestorow.pl earnings calendar (refreshed daily by worker). Each row also carries `lastEarnings` (or null): the most recent REPORTED quarter's actuals (quarter, reportedAt, revenuePLN, netIncomePLN, epsPLN), QoQ deltas (revenueQoQPct/netIncomeQoQPct vs prior quarter), and marketReactionPct1d (first close after the report vs last close before) — computed on the fly from quarterly KPIs + price history. hitConsensus is NOT provided (no analyst-consensus feed); use the QoQ deltas as the objective directional read. UWAGA na `dateConfidence`: 'confirmed' = termin z feedu, 'unverified' = feed podał datę, której nie da się obronić (np. publikacja w weekend — udowodniony błąd źródła przesuwający miesiąc), więc `upcomingEarningsDate` może być null albo wskazywać DALSZY termin, a surowa odrzucona data siedzi w `suspectEarningsDate` wraz z `suspectEarningsReason`. Takiej spółki NIE traktuj jak 'brak raportu w tym okresie' — termin jest niepewny, nie nieobecny. ⚠️⚠️ JEDNOSTKI I WALUTA w `lastEarnings`: `revenuePLN` i `netIncomePLN` są w MILIONACH (pochodzą wprost z quarterly KPI), a `epsPLN` to wartość na akcję w jednostkach. Mimo końcówki `PLN` kwoty są w WALUCIE SPRAWOZDANIA emitenta — czytaj pole `currency` z tego samego obiektu, bo dla części spółek to EUR albo USD. Nie zestawiaj tych kwot z `get_forecast`, gdzie `baseline.ttm*PLN` jest w jednostkach — różnica to dokładnie 1e6. ⛔ KAŻDY SYMBOL PODANY W `symbols` WRACA W ODPOWIEDZI. Gdy nie ma terminu w oknie, wraca wiersz-zaślepka z polem `excludedReason`: [out_of_window] gdy mamy dokument kalendarza i termin PRZYSZŁY, ale leży poza `daysAhead` (poszerz okno), [past_only] gdy wszystkie znane terminy tej spółki JUŻ MINĘŁY (poszerzanie `daysAhead` nic nie da - użyj `includePast: true`), [no_calendar_date] gdy mamy dokument spółki, ale źródło nie podało dla niej ŻADNEJ daty (ani przyszłej, ani przeszłej), [not_in_user_scope] gdy symbol jest poprawny, lecz nie ma go w Twoim portfelu, celach ani na watchliście - to narzędzie liczy tylko Twoje spółki, [unknown_symbol] gdy nie mamy tej spółki w kalendarzu w ogóle albo wejście nie jest symbolem, [merged_into] wraz z `resolvedTo` gdy podałeś alias, a dane wróciły pod kodem kanonicznym. Taki wiersz ma wszystkie pola dat na null i stoi NA KOŃCU listy, za posortowanymi terminami. Wiersz z prawdziwym terminem NIE MA pola `excludedReason`.

  • get_earnings_deepdive

    Sonnet-generated deep-dive analysis of a quarterly report. Auto-triggered after the quarterly KPI parser persists a fresh row. Returns: verdict (strong_beat/beat/in_line/miss/strong_miss), trend (improving/stable/deteriorating/mixed), structured QoQ/YoY deltas (revenue/ebit/ni/eps/margins), margin commentary, one-offs commentary, vs-forecast commentary, surprises[], concerns[], takeaways[], plus aspirational-vs-testable management claims (KILLER feature). Use when the agent needs a synthesised quarterly view without re-doing the math from get_quarterly_kpis. Pass `quarter` (YYYY-Qn) for a specific report; default returns the latest.

  • get_news_history

    Get all evaluated news_items for a symbol regardless of whether an alert was delivered. Different from get_alerts (delivery log of alerts the user received) — this exposes the full eval history so an agent can see material context that fell below alert threshold (low sentiment, narrow impact range). Returned source values can include gpw-espi, gpw-espi-archive, pap:biznes, strefa-inwestorow, bankier:gielda, comparic:feed, stockwatch:forum, eodhd-news. Use when get_alerts returns empty for a holding/watchlist symbol but you want full situational awareness. Server canonicalizes XTB-style 'KGH.PL' → 'KGHM'. **Every row carries `subjectMatch`: `subject` = the headline names this company (ticker or company name), `mention` = the company only appears on the provider's ticker list for an article about something else. This matters: news providers tag every ticker referenced in an article, so a market wrap-up about SK Hynix arrives tagged with ten symbols. Measured on 169 US symbols / 3291 rows: 60.3% were `mention` (AVGO 18/20, BAC 20/20). Rows are NOT dropped — filter or weight them yourself.**

  • get_quarterly_kpis

    Quarterly financial KPIs for a symbol (revenue, EBITDA, net income, EPS, balance sheet, cash flow, adjusted vs reported). Foundation data for predictive scanner / earnings bridge / forecast calibration. MVP: WIG20 manually seeded; harvester for full coverage deferred. Symbols canonicalized server-side. ⚠️⚠️ UNITS: monetary `...PLN` fields here are in MILLIONS — `revenuePLN: 11872` for KGHM means 11.87 BILLION, not 11872. This differs from `get_forecast`, where `baseline.ttm*PLN` is in BARE units (KGHM 39296000000); the two scales differ by exactly 1e6 (verified 2026-08-05 on 6 companies), so never compare or divide a value from this tool by one from get_forecast without converting first. ⚠️⚠️ CURRENCY: despite the `PLN` suffix, these amounts are in the issuer's REPORTING currency — always read the row's `currency` field, which may be EUR or USD. The suffix is a legacy field name, not a currency assertion. EXCEPTIONS to the million rule: `epsPLN` and `adjustedEpsPLN` are per-share and therefore in bare currency units. ⚠️⚠️ DATA QUALITY: every row carries `dataQuality` with `flagRule` (our detector's rule, null when clean), `manualVerdict` (`legit` = a human confirmed the number at the source, `confirmed_bad` = a human rejected it) and `blocksComputation` (the SHARED predicate the forecast pipeline itself applies). A row with `blocksComputation: true` is one WE do not trust: quote it only with that caveat, and never feed it into a TTM sum or a growth rate. Measured 2026-08-09: of 4665 polish-stocks rows, 257 carry a detector flag and 257 have `blocksComputation: true` - the two counts match by coincidence, not by definition: the blocked set drops one flagged row a human confirmed as `legit` and adds one row a human rejected as `confirmed_bad` without any detector flag. Always read `blocksComputation`, never infer it from `flagRule`.

  • get_stale_dossiers

    Surface dossiers across the user's portfolio + watchlist that haven't been verified for >180 days (or never). Use when the user asks 'co mam zaniedbane?' / 'które spółki przejrzeć?' / 'dossier — co najpilniej zweryfikować?'. Returns top N stale dossiers ordered by oldest-entry age first; empty array when nothing is stale or the user has no portfolio/watchlist scope.

  • get_wza_summary

    Latest AI-extracted WZA (Walne Zgromadzenie / shareholder meeting) summary for a symbol. Pulls from wza_summaries collection — Sonnet 4.6 extraction of post-WZA ESPI 'Treść uchwał podjętych'. Returns structured: dividend amount + ex/payment dates, board changes (elected/dismissed/reelected), buyback approvals, capital changes, statute amendments, plus aspirational-vs-testable management claims (KILLER feature: separates marketing from concrete commitments). recent=true returns the latest WZA; pass `wzaDate` (YYYY-MM-DD) for a specific past meeting.

  • mark_dossier_reviewed

    Confirm the user has reviewed the dossier and its findings still hold. Bumps lastReviewedAt to now, clearing the staleness flag for ~180d. Use when the user indicates 'sprawdziłem dossier KGHM' / 'dossier KGHM jest aktualny' or after the agent has narrated current entries to the user. Empty dossiers (totalEntries=0) reject — there is nothing to confirm.

  • update_company_dossier

    Add a manual observation to a user-owned or watched stock's dossier. Categories: issue (recurring problem) / strength (recurring positive) / red_flag (severe concern) / pattern (behavioural regularity) / context (neutral background). Source is tagged as 'manual' so the entry is distinguishable from auto-generated evaluation findings.

Oceny i rankingi

8

Sygnal Score na sześciu wymiarach, rankingi całego rynku i skanery szukające konkretnych układów.

  • find_dip_candidates

    Composite dip detector for long-term DCA entry. NOT classic RSI/MACD. Scans watchlist + portfolio (or universe) ACROSS both polish-stocks AND us-stocks (default 'all'). Combines 4 signals: drawdown >=15% from 52w high + Sygnal Score >=55 + price above SMA200 + realized vol in normal range. Live intraday overlay applied during WSE sessions (15-min delayed quote from EODHD) for accurate dip detection during volatile intraday moves. Returns sorted list with verdict (dip_candidate / wait / value_trap_risk / no_dip) + reason per symbol. (US w trybie tracking-only — tylko wycena posiadanych).

  • find_opportunities

    Screener: rank covered GPW symbols by composite opportunity score. Pulls from asset_forecasts (templated forecasts maintained by the worker), recent evaluations (sentiment), and price_history. Score blends forecast upside vs spot, recent positive sentiment, and alert recency. Use when the agent needs to suggest entry candidates outside the user's current scope. Output is RANKED (highest score first) so a small `limit` is enough for top picks. Different from get_forecast (single-symbol detail) — this is a discovery tool.

  • find_overheat_candidates

    Composite overheat detector (NOT classic RSI): scans watchlist + portfolio (or universe) for stretched/overbought holdings to flag trim/exit opportunities. Mirror of find_dip_candidates. Gating, stated precisely because it is easy to misread: run-up >=25% from the 52w low is a PREREQUISITE (below it the verdict is always `hold`). Beyond that there are three CONFIRMATIONS — Sygnal Score below `maxScore`, price >=125% SMA200, realized vol high — and `trim_candidate` needs at least ONE of them, `overheated` needs all three. The only hard exclusion is separate and NOT tied to `maxScore`: Sygnal Score >=55 together with vol that is not high yields `trend_continuation`, whatever `maxScore` you pass. Returns a sorted list with verdict (overheated / trim_candidate / trend_continuation / hold) + reason per symbol. Live intraday overlay applied during sessions. Universe-aware (default 'all' = PL + US). (US w trybie tracking-only — tylko wycena posiadanych).

  • get_stock_rankings

    GPW stock rankings from public Sygnal Score snapshots. The applied liquidity threshold is always declared in filters.minAdvPLN, including when the caller omits it or the result is empty. Growth rows also expose fundamentalsAsOf: the latest reported quarter used by the fundamental-growth component, or null when that component has no usable KPI pair. Optionally pass dateKey to read the stored snapshot for that exact day; an empty list never falls back to the current day. ⛔ An empty list has TWO distinct causes and the message says which: either no snapshot is stored at all, or snapshots ARE stored but every one of them belongs to a company that is not a currently listed, active GPW company, so all were filtered out. The second case is a coverage state, not missing data; do not report it as a pipeline gap. ⛔ There is also a degraded mode in the other direction: if the list of active GPW companies cannot be read, the de-listing filter is skipped rather than emptying the ranking, so the list may then contain a delisted or renamed ghost symbol. That mode is logged server-side and is expected to raise the ranking_price_staleness health check to warn, but the coupling is not mechanical: this tool and that check read the active-company list separately, so a transient failure can hit one and not the other. It is not visible in this response. Score (0-100) is the Sygnal Score, returned as both score and sygnalScore; this tool replays a stored public snapshot and never recomputes. ⛔ The returned dateKey is the FRESHEST date present in the result, NOT a per-row guarantee: called without dateKey, this tool takes the latest snapshot PER SYMBOL (deliberately, so a partial rollover cannot produce a 1-of-N ranking), so an individual row may carry an older snapshot if that company was not refreshed. Pass dateKey explicitly when every row must come from one day. ⛔ score is NOT the same measurement as get_sygnal_score, and the difference is the INPUTS, not freshness: that tool scores per CALLER, using the caller's own theses, events and portfolio concentration, and WITHOUT the valuation cohort this ranking uses, so two users can legitimately get different numbers for the same company at the same moment. Treat it as a different measurement, never as a corrected version of this list. Scores are whole points spread across the entire market, so ties are the norm and a one-point gap can be worth many positions; whenever you cite a number, say which surface produced it. The overall category sorts directly by Sygnal Score. Persona categories (growth, dividend, defensive) sort by their category fit, returned separately as categoryFit, while score remains the company's Sygnal Score. Default category: overall. This is a screening aid, not investment advice.

  • get_sygnal_score

    Explainable 0-100 Sygnal Score for one recognized GPW symbol. Unknown symbols return an error and no score. Uses the same 7 core dimensions as /asset/[symbol]: valuation, quality, momentum, sentiment, catalysts, risk control, and liquidity (avg daily turnover), plus an MCP-only riskReward dimension for position sizing context. A dimension without evidence has score=null, so numeric 50 always means a measured neutral score. Includes opportunities/risks, evidence coverage and persisted score history; user-specific risk uses active theses and portfolio concentration.

  • rank_revenue_growth

    Ranking spółek GPW po fundamentalnym wzroście przychodów z quarterly_kpis — preferuje YoY (ten sam kwartał rok wcześniej; ta para wystarcza nawet bez bezpośrednio poprzedniego kwartału), z fallbackiem do QoQ dla bezpośrednio poprzedniego kwartału; growthBasis pokazuje użyty wariant. Domyślnie wymaga ADV >= 1 mln PLN/d i bazy przychodów >= 5 mln PLN. Każdy wiersz zwraca advPLN, microBase i lowBaseUnreliable; procent zysku z bazy poniżej 1 mln PLN jest zwracany jako null. quarterAgeDays pokazuje liczbę pełnych dni od publikacji raportu użytego w rankingu (null, gdy brak daty). Uzupełnia get_stock_rankings(growth) (które jest oparte na momentum cenowym) i run_predictive_scan (ograniczony do spółek z forecastem). Uwaga: liczone na NAJNOWSZYCH dostępnych raportach kwartalnych per spółka — pokrycie/świeżość rośnie wraz z pracą harvestera KPI. ⚠️ To narzędzie NIE ZWRACA surowych kwot. Wielkości obserwowane są procentowe (revenueQoQPct, revenueYoYPct, netIncomeQoQPct) albo w punktach procentowych (revenueAccelerationPp). ⚠️ WYJĄTEK: `score` to BEZWYMIAROWA miara rankingowa — służy wyłącznie do porządkowania listy i NIE jest obserwowanym wzrostem w procentach; nie cytuj jej userowi jako wzrostu procentowego. WZÓR JEST JAWNY I ODTWARZALNY: score = wzrost przychodu w wybranej podstawie + 0,25 * clamp(zmiana zysku netto, -100, +100). Rozkład na składniki wraca w polu `scoreComponents` (primaryGrowthPct, netIncomeContribution, accelerationContribution). `revenueAccelerationPp` jest RAPORTOWANE, ale NIE punktowane w żadnej ze ścieżek — wcześniej dokładało 0,5 * przyspieszenie wyłącznie wierszom o podstawie QoQ, czyli bonus nieosiągalny dla wiersza YoY w tej samej liście. ⚠️ Pozostaje asymetria, której to nie usuwa: wiersz o podstawie `qoq` jest punktowany zmianą kwartał do kwartału, a wiersz `yoy` zmianą rok do roku; pole `growthBasis` mówi, która to. Po kwoty sięgaj do get_quarterly_kpis — tam wartości są w MILIONACH waluty sprawozdania emitenta, którą podaje pole `currency` (nie zawsze PLN, mimo końcówki nazwy pola).

  • rank_thematic

    Ranking GPW po temacie inwestycyjnym; bez argumentu zwraca listę dostępnych tematów, a z theme zwraca spółki w wybranym temacie.

  • run_predictive_scan

    Pre-earnings predictive scanner for covered GPW symbols. Prefers published next-quarter forecasts: expected YoY net income (revenue fallback) and revenue acceleration vs trailing 4-quarter YoY average. Symbols without a usable quarterly forecast retain the annualized run-rate fallback. Applies the forward P/E gate and 30d price × sentiment pricing-in penalty. Use for proactive 'co kupić przed wynikami?' discovery.

Prognozy wyników

5

Prognozy przychodu i zysku na następny kwartał wraz z ich rozliczeniem po publikacji raportu oraz drivery makro.

  • get_drivers

    Get current macroeconomic drivers: commodities, FX, rates, US macro/sentiment (VIX, DXY, US10Y, CNN Fear & Greed, AAII, Cboe put/call), and other harvested driver values. Optional forumSentyment rows can be added per symbol from persisted StockWatch forum sentiment, with live fallback from existing forum ingestion/evaluations.

  • get_evaluation_outcomes

    Historical accuracy of past alerts — fetched from evaluation_outcomes (price-based, populated by the record-evaluation-outcomes worker). The time window filters `evaluatedAt` (market evaluation time), never `recordedAt` (settlement time). Use to grade your own predictions, calibrate confidence, or feed RAG retrieval. Returns both individual outcomes and aggregate hit-rate stats. In the `adjusted` block the market benchmark is `benchmarkReturnPct` (renamed from `wigReturnPct` on 2026-08-02): it holds the index matched to the asset's universe - WIG for polish-stocks, S&P 500 for us-stocks - so never call it WIG. Scoped to the user's portfolio + watchlist by default.

  • get_forecast

    Get forecast-models output for a user-owned or watched symbol. Forecast includes both vs-spot implied price AND vs-user-avg-cost upside (when user has a position), plus the latest next-quarter revenue/EBITDA/net-income/EPS estimate snapshot when available. ⛔ ZANIM UŻYJESZ `baseline.ttmRevenuePLN` DO WYCENY, przeczytaj `ttmIntegrity` z tej samej odpowiedzi. To pole odpowiada na pytanie [czy zapisana kotwica TTM nadal odtwarza się z dzisiejszych kwartałów] i liczy je TĄ SAMĄ funkcją, co kontrola `baseline_ttm_drift` z get_pipeline_health. `status`: [matches] kotwica zgadza się z sumą kwartałów okna; [drift] NIE zgadza się - `storedPLN` kontra `quarterlySumPLN` i `driftPct` podają obie liczby i rozmiar rozbieżności, ale to NIE rozstrzyga, która jest poprawna (kwartał mógł zostać skorygowany albo być nadal zepsuty), a kotwica odświeża się dopiero przy nowszym raporcie ROCZNYM; [window_incomplete] któregoś kwartału dziś brakuje albo jest odrzucony regułą jakości, więc porównania nie orzekamy; [not_applicable] kotwica nie deklaruje się jako suma kwartałów, więc nie ma obowiązku się z nimi zgadzać. `flaggedQuarters` wymienia kwartały tego okna oznaczone przez kontrolę jakości albo wyprowadzone z oflagowanego sprawozdania narastającego - obecność wpisu nie unieważnia liczby, ale zdejmuje z niej domniemanie poprawności. ⚠️⚠️ UNITS: this response carries TWO SCALES and declares them in its own `units` field — read it before doing arithmetic. `baseline.*PLN` amounts are in BARE units (KGHM `ttmRevenuePLN` 39296000000 = 39.3 billion); `nextQuarter.estimates.*PLN` amounts are in MILLIONS (the same company, same moment, `revenuePLN.base` 10477.55). The two differ by exactly 1e6 — measured 2026-08-05 on all 13 symbols that carry both, zero exceptions. Never compare, divide or sum across the two groups without converting first. `epsPLN`, `lastClose` and the implied prices are per-share, so they are in bare units in both groups. Each `nextQuarter.estimates.*` entry is an object `{low, base, high}`, and `units.fields` keys those numeric leaves, not the container. ⚠️ CURRENCY: the `PLN` suffix is a legacy field name, not a currency assertion, and the response mixes several bases declared per field in `units.currencyBasis` — `baseline.*`, the estimates and the implied prices come from the issuer's statements (`baseline.reportingCurrency`, may be EUR or USD); `lastClose` and `userPosition.currentValuePLN` come from the price feed in the LISTING's quote currency; `userPosition.blendedAvgCostPLN`/`breakEvenPLN` are in that position's own cost currency (USD for a US holding); and `userPosition.lossUntilBEPLN`/`lossUntilBETotalPLN` are a cost-minus-quote difference with no single currency. An issuer reporting in EUR while trading in PLN puts two currencies in one response, so read `currencyBasis` before subtracting an implied price from the quote. ⚠️⚠️ CONFIDENCE SCOPE: `nextQuarter.confidenceTier` is computed from the REVENUE error ONLY — `nextQuarter.confidenceScope` states this explicitly. It does NOT describe the net-income estimate, which can be far worse. Measured 2026-08-17 on KGHM: `confidenceTier: "high"` (revenue median error 6%) stood next to a net-income band whose mean error was 164%. Read `accuracySummary.netIncome` before using the profit figure. It carries BOTH `meanAbsErrorPct` (the number `get_forecast_accuracy` reports) and `medianAbsErrorPct` (the number the publication gate checks, threshold 100%). On KGHM those are 164% and 70% computed from the SAME 12 backtest errors — two outliers from near-zero-profit quarters pull the mean up. Neither is wrong; they answer different questions, so both are returned under explicit names instead of one that would mislead somebody. `accuracySummary.netIncome.bandSuppressed` is true when the model produced a profit band and the gate withheld it, with the measured `bandSuppressedReason`. `lowSample: true` (also `revenueLowSample`) flags fewer than 20 backtest evaluations, where a hit rate is not distinguishable from chance — the raw `evaluations` count sits beside it so you can judge for yourself.

  • get_forecast_accuracy

    Inspect Tier B quarterly-model historical accuracy and publication-gate status. With symbol, returns MAPE/range/direction metrics and recent grades; without symbol, returns the active-model leaderboard and status counts.

  • macro_attribution

    Rank likely macro/breadth drivers behind the latest WIG20 daily move. Uses driver_value_history deltas for FX, commodities, rates and GPW breadth. Anti-slop: returns a heuristic checklist, not a causal regression.

Portfel i alokacja

18

Pozycje z wielu rachunków, stopa zwrotu, zmienność, koncentracja i rozjazd wobec docelowych wag.

  • analyze_thesis_exposure

    Map user's portfolio across the AI value-chain (GPU / memory / foundry / equipment / IP / servers / networking / interconnect / storage / power / hyperscaler / ai_software / data / security / neo_cloud). Returns per-tier breakdown with equity, pctOfPortfolio (holdings + cash basis), and pctOfHoldings (holdings-only basis), plus uncovered symbols (no thesis mapping), explicit totalPortfolioValuePLN / totalHoldingsEquityPLN / cashPLN totals, and a diversificationScore (0-100 — non-empty tier count / 17). Helps the founder answer 'czy mam dziurę w wartości łańcuchowej AI?' without mental tracking. Currently scoped to us-stocks; polish-stocks holdings land in `uncoveredSymbols` until a separate Polish thesis taxonomy is curated.

  • compare_portfolio_risk_reward

    Compare risk/reward ratio across user's holdings + watchlist. Returns ranked list with suggested position size (R/R-weighted).

  • get_allocation_diff

    Allocation 'ideal vs current' diff per sector or universe. Returns rows with target/current/diff in pp + severity tier (critical ≥10pp, high ≥5pp). Use to surface portfolio rebalance signals.

  • get_concentration_risk

    Concentration risk scanner across 3 axes: per-symbol, per-sector, per-driver (macro factor). Each row carries status (ok|warning|critical) vs threshold tied to user.profile.riskTolerance — aggressive 70%/85%, moderate 50%/65%, conservative 30%/45%. Use to answer 'czy mam za dużo w X?', 'jakie ryzyko sektorowe?', 'czy moje pozycje to ten sam driver makro?'. Surfaces correlated risk that single-position-% misses (e.g. KGHM + JSW + BOGDANKA wszystkie copperPriceUSD-driven). Pure read.

  • get_portfolio_analytics

    Portfolio analytics MVP: reconstructs a daily PLN equity curve from broker_transactions and daily closes (US closes use historical USD/PLN), then returns total/annualized return, max drawdown, annualized volatility, Sharpe, Sortino, and optional benchmark comparison vs WIG / SPY / QQQ with alpha and beta. IMPORTANT: transaction history can be incomplete, so inspect `meta.equityCoveragePct`, `meta.uncoveredEquityPLN`, `meta.incompleteHistorySymbols`, and `meta.warnings[]` before presenting any metric as portfolio-wide; returns/risk/benchmark describe only covered capital. Recommended periods: 30d for weekly review, 90d for recent regime, 1y/YTD for strategy review. On short windows (<90 days), prefer `returns.totalPct` + `benchmark.returnPct` because annualized fields extrapolate dramatically. Cash is excluded from the market-equity return curve. For mixed PL/US portfolios, `currencyBreakdown` separates PLN and US equity. `sectorBreakdown` aggregates end-of-window equity by sector.

  • get_portfolio_context

    ⚠️ TA ODPOWIEDŹ JEST DUŻA (rzędu 140 tys. znaków przy 29 pozycjach i 56 migawkach). Jeśli pytanie dotyczy tylko pozycji, PODAJ `include`: `["holdings"]` zwraca pozycje, gotówkę i uzgodnienie transakcji, i waży ~20 tys. znaków, czyli 7x mniej (pomiar 18.08 na realnym portfelu). Dozwolone sekcje: holdings, profile, watchlist, alerts, snapshots, drivers, risk. Sekcja `snapshots` to 56,9% ładunku - bierz ją tylko wtedy, gdy naprawdę potrzebujesz analiz i prognoz per spółka. Bez `include` odpowiedź jest pełna, dokładnie jak dotąd. Odpowiedź przycięta niesie `includedSections` i `availableSections`, żeby dało się odróżnić [nie prosiłem o tę sekcję] od [ta sekcja jest pusta]. ⛔ PRZED ODPOWIEDZIĄ O LICZBIE SZTUK sprawdź `positionReconciliation`. Ta tablica wymienia pozycje, dla których przyjęliśmy transakcje PO dacie ostatniej migawki rachunku, wraz z `snapshotQty` (liczba, którą podaje TO narzędzie i cała rodzina czytająca STAN: get_total_portfolio_view, get_concentration_risk, recommend_position_size), `txDeltaSinceSnapshot` i `impliedQty` (liczba, którą widzą narzędzia czytające TRANSAKCJE: get_portfolio_analytics, get_portfolio_stats, get_realized_pnl). Niepusta tablica znaczy, że te dwie rodziny podadzą RÓŻNE liczby dla wymienionych symboli - to normalny stan przejściowy, znikający po `submit_portfolio_snapshot`, a nie błąd danych. Pole NIE przelicza średniej ceny nabycia. Pusta tablica znaczy, że rachunki z migawką są uzgodnione. Get user's portfolio holdings, cash balances with PLN total, watchlist, recent alerts, forecast snapshots, analyses, macro drivers, and concentration risk flags. Returns top-level `holdings` (consolidated per canonical symbol — primary read for 'ile mam X' queries) plus `profile.holdings` (raw broker rows — one per broker/account, e.g. KGH.PL xtb + KGHM bossa as separate entries, kept for edit/remove fidelity) and `profile.consolidatedHoldings` (same shape as top-level `holdings`, kept for backwards compat).

  • get_portfolio_stats

    Compute portfolio risk/performance stats from broker_transactions and daily closes: invested equity curve, total return, annualized return, annualized volatility, max drawdown, Sharpe ratio, and per broker/account breakdown. Buys are treated as external inflows and sells as outflows until historical cash balances are tracked.

  • get_portfolio_value_history

    Daily PLN portfolio value history. Returns equity, cash, and total value points sorted from oldest to newest, plus first/last date metadata. ⚠️⚠️ THIS IS NOT A RATE OF RETURN AND MUST NEVER BE PRESENTED AS ONE. `totalPLN` is a balance, so its change between two points mixes market moves with money crossing the account boundary: deposits, withdrawals and newly connected broker accounts. External flows are NOT recorded anywhere, so they cannot be subtracted — a time-weighted return is not computable from this data. The failure is not a rounding issue: on a measured sample of consecutive-business-day transitions, roughly a quarter had `equityPLN` moving in the OPPOSITE direction to `totalPLN`, i.e. the balance grew on a day the holdings lost value. Before saying anything about performance, compare the `equityPLN` and `cashPLN` deltas. When the cash balance moved materially, report the change in PLN, never a percentage — and describe what you actually observed ("the cash balance changed by X"), NOT a transfer: a buy, a sell, a dividend or a broker fee moves cash without anything crossing the account boundary, and we cannot tell those apart.

  • get_total_portfolio_view

    Cross-broker total portfolio view: aggregates ALL portfolio_snapshots (latest per broker/account combo), FX-normalizes to chosen baseCurrency. The top-level asOf is the oldest source date represented in the total. Returns total equity + per-universe breakdown + concentration risk z proper denominator + per-broker source list. totals includes oldestSourceAsOf, oldestSourceSessionDays, and sourceFreshness (every source with sessionDaysSinceUpdate, oldest first). Use case: AI adviser drift tracking dla long-term strategy (np. 95% PL -> 70% US migration). IMPORTANT: sourceFreshness is neutral INFORMATION, never a problem to report. A snapshot age only says when the user last uploaded — it says nothing about whether anything changed, and someone who hasn't traded for three weeks has a three-week-old snapshot that is perfectly current. Never tell the user to upload a fresh file because of age alone; mention the age only if they ask, or if a number you are quoting actually depends on it. `warnings` is reserved for real defects: missing FX rate, missing price, holdings/totalEquity mismatch >5%.

  • modify_holdings

    Edit user holdings (add / remove / update). Without broker details, update/remove keeps the existing manual-only behavior. An update or object-form remove with broker and account may modify a broker-synced position; the next broker snapshot will overwrite those manual changes. Adds remain manual and idempotent on (symbol, manual).

  • modify_targets

    Add or remove price targets / watchlist-with-trigger entries on the user's profile. Idempotent on (symbol, universe). Use to record price levels you'd want the user notified about ("if KGHM dips below 110 PLN, accumulate").

  • modify_watchlist

    Add or remove symbols from the user's watchlist + set per-asset notification thresholds (alert fatigue solver). Idempotent: re-adding existing symbol is a no-op (but `setThreshold` still applies). Use when spotting a catalyst for a new symbol, OR when the user wants stricter/looser alerts on a specific holding (e.g. 'don't alert me on KGHM unless impact >5pp' = `setThreshold: [{symbol: 'KGHM', minImpactPct: 5}]`). Set or clear a one-shot price alarm with e.g. `setAlarm: [{symbol: 'KGHM', price: 130, direction: 'below'}]` (`price: null` clears it; direction is inferred when omitted).

  • recommend_diversification

    Portfolio-aware diversification suggestions. Computes the user's current sector concentration, identifies under-represented sectors vs a balanced target, and proposes entry candidates from those sectors via the find_opportunities scoring pipeline. Use when concentration risk is flagged, after a big position close, or when the user asks 'what should I add?' Distinct from find_opportunities (sector-agnostic ranking) — this one gates on the user's existing tilt.

  • recommend_position_size

    Quantitative position-sizing helper. Combines R/R ratio × conviction × volatility × portfolio concentration × user risk tolerance into a recommended share count + notional + reasoning. R/R is the primary add/trim filter: >=2.5 overweight, 1.5-2.5 maintain, 1.0-1.5 underweight, <1.0 trim. Optional stopLossPct switches to R-multiple sizing (risk per trade budget). Returns alternatives + binding factor so the agent can explain the trade-off. Reuses get_total_portfolio_view for the canonical totalEquityPLN denominator (manual snapshots dropped when broker imports exist, polish-stocks canonicalized, us-stocks FX-converted to PLN).

  • set_cash_balance

    Ustaw bezwzględny stan gotówki dla konta brokera i waluty. Zapis jest ręczny, idempotentny dla niezmienionej kwoty i trafia do audytowego cash ledger.

  • submit_portfolio_snapshot

    Push a portfolio snapshot from external broker (XTB, Bossa, mBank, etc.) to Giełdownik. Replaces user's holdings tagged with this broker+account combo; manual-entry holdings are untouched. Use this when you have authoritative position data from broker API and want Giełdownik to reflect reality. Cash: prefer `cashByCurrency` ({PLN, USD, EUR, ...}) for multi-currency accounts so balances stay in native currency — `cashPLN` remains as a legacy single-currency alias.

  • suggest_order_size

    Commission-aware order chunking suggester for Polish brokers. Computes optimal qty split per order so commissions don't overpay vs broker tier (Bossa min 5 PLN per order; XTB free up to 100k EUR/mo monthly turnover, then 0.2%). Returns chunks[] + totalCommission + effectiveRatePct. Use when planning manual rebalancing — tool agnostic of execution. Closes the gap where agent split a 100-share Bossa order into 49×5 chunks, paying 245 PLN vs 67 PLN single-order (2.6x overhead). Anti-slop: this is COMMISSION OPTIMIZATION, not order routing — agent decides actual broker.

  • update_allocation_targets

    Set target portfolio weights for buckets within a dimension. Sum must be ≤100; rest is unallocated. Replaces existing targets for the dimension; other dimensions preserved. Pass empty buckets array to clear.

Transakcje i podatki

5

Historia realizacji, zysk zrealizowany, jakość egzekucji wobec VWAP i wyszukiwanie strat do rozliczenia podatkowego.

  • analyze_trade_outcome

    Post-trade attribution: pulls broker_transactions matching filters, computes VWAP slippage from EODHD 5min intraday bars (±30min window around fill ts), commission rate, time-of-day bucket. Returns per-trade outcomes + summary stats. Use for trade journaling: 'were today's KGHM fills good?', 'how much commission overhead this week?', 'when am I trading best (open/midday/close)?'. Anti-slop: VWAP comparison flagged as HEURISTIC (limited bar window, not full session VWAP).

  • find_tlh_opportunities

    Tax-Loss Harvesting scanner for Polish equity portfolios (PIT 19%). Konta osłonięte podatkowo IKE/IKZE/OKI są wykluczone, bo TLH nie ma tam zastosowania. Returns user's underwater positions ≥ minLossPLN with potentialTaxShieldPLN = |loss| × 0.19, plus an optional same-sector replacement candidate to preserve thesis exposure. Use to answer 'gdzie mam straty do zharvestowania?', 'jaką pozycję wymienić bez tracenia ekspozycji?'. Pure read; agent picks 0.19 PIT-PL because user is taxed PL — for offshore brokers user must clarify residency. Anti-slop: replacement is HEURISTIC (same sector + active liquidity), NOT a recommendation.

  • get_realized_pnl

    Compute realized P&L YTD from broker transactions (FIFO). Identifies tax-loss-harvesting opportunities (positions with unrealized losses that could offset realized gains; PL 19% PIT compensation w obrebie roku podatkowego).

  • get_transaction_history

    List the user's broker transaction history, newest first, with optional symbol, broker, side, and date filters. `pricePLN` is a legacy field name: for us-stocks it contains the transaction price in the native currency (USD), matching the `avgCostPLN` holding convention.

  • submit_broker_transactions

    Push broker transaction history (buys/sells with fees) for realized P&L tracking and tax-loss harvesting. Idempotent: dedup by (userId, externalId).

Sygnały, alerty i zdarzenia

19

Sygnały na spółkach z rozliczeniem trafności, alerty, zdarzenia wyceniane przez rynek i własne reguły decyzyjne.

  • cancel_priced_event

    Cancel a pending priced-in event the user no longer wants tracked (misclassified, thesis reframed, or simply changed mind). Writes status='cancelled' + resolvedAt + optional reason note. Only works on status='pending' events; resolved/cancelled events return reason='not_pending'. Atomic, race-safe — userId predicate enforced at the write boundary.

  • create_decision_rule

    Create an MVP decision rule: if trigger X matches, Giełdownik either alerts the agent/user or creates a pending trade proposal. SAFETY DEFAULT: action.kind='auto_execute' is accepted by the schema for forward compatibility, but the worker REFUSES to execute it and records blocked_auto_execute until a future founder-locked auth model, broker write scope, budget caps, audit log, and kill switch exist.

  • delete_decision_rule

    Delete one of the caller's decision rules. Proposals already created by prior fires are left intact for auditability.

  • get_activity_feed

    Cross-domain feed of automated changes — thesis status transitions (from evidenceLog evaluator_job entries) + priced-event resolutions. Use to answer 'co się ostatnio zmieniło?' without round-tripping list_theses + get_priced_events. Each entry has kind, ts, symbol, summary plus kind-specific fields (thesisId/eventId, status transitions or outcome/verdict). Sorted DESC by ts.

  • get_alert_delivery_stats

    Latency audit: how fast do my Telegram alerts arrive? Computes percentiles (p50/p95/p99) over the user's last N days of successfully-delivered alerts for the E2E publish→Telegram window plus per-stage breakdown (ingest poll lag, LLM eval, queue, send). Ingest poll lag includes all-source, PL real-time (trusted PL sources excluding eodhd-news), per-source, and per-source-tier splits so the US EODHD firehose does not mask PAP/Strefa latency. Use to verify the marketing claim and spot regressions. Filters out backfill replays where publishedAt is > 24h before sentAt.

  • get_alerts

    Get evaluated news alerts delivered to this user. Filterable by symbol, classification, universe (market) and since date.

  • get_asset_signals

    Pobierz SYSTEMOWO wygenerowane sygnały szans i ryzyk dla spółki. To NIE są user theses z attach_thesis: każdy sygnał jest związany z weryfikowalnym bindingiem danych (driver/news/web_supply). Weryfikacja to Phase 2, więc status 'active' może oznaczać sygnał jeszcze niesprawdzony. Zwraca osobno opportunities i risks.

  • get_my_alert_performance

    Per-user portfolio backtest aggregate. Pulls all alerts the user received in the last N days (default 90, max 365), collapses multi-channel deliveries of the same event into one alert (app + Telegram produce two rows; channelDuplicatesCollapsed reports how many were merged, so totalAlerts answers 'how many alerts did I get', not 'how many sends did we make'), joins each with its evaluation_outcomes row (price-based outcome populated daily by the worker), and computes hitRate, abnormal return vs each alert's OWN market index (NOT 'vs WIG' - that phrasing contradicted the warning further down and was corrected 2026-08-02), region-adjusted + sector-adjusted returns, first/second-half error breakdowns, and per-symbol + per-classification breakdowns. ⚠️ There is NO WIG20 comparison in the response - this description promised one for months and the handler never computed it (verified 2026-08-02: zero references to wig20 in my-alert-performance.ts or the handler). Do not report a WIG20 figure from this tool. Headline metric for a mixed PL+US alert set is alphaBenchmarkMatched (mean abnormal return, where each alert is benchmarked against its OWN market's index: SPX for us-stocks, WIG for polish-stocks). ⚠️ avgBenchmarkReturnPct (formerly avgWigReturnPct) is NOT WIG — it is a blend of both indices, measured 2026-08-02 at 1621 US vs 347 PL outcomes behind sent alerts; benchmarkMix reports the split, so never call it 'WIG'. Plain `alpha` is derived from that blend over a slightly different row set than alphaBenchmarkMatched; prefer the latter. avgRegionAdjustedReturnPct is a STOXX Europe 600 noise strip, not a market benchmark. modelDriftIndicator is hit-rate-based (first vs second half of the window), independent of any benchmark. Quote hitRateExcludingNoisy alongside overallHitRate whenever it is present: it counts only settlement windows NOT contaminated by other news about the same company (threshold calibrated per symbol, so intermediateNewsCount > 0 with isNoisy=false is NOT an inconsistency). noisyOutcomes says how many scorable rows were dropped from it. Measured 2026-08-02 on 1985 outcomes behind sent alerts: 81.8% on 1250 clean windows vs 71.6% on 735 contaminated ones, 78.0% blended - so the headline number mixes forecast quality with how much else was happening around the event. NEVER quote hitRate without bandSharpness: it reports how many times wider the predicted band is than the symbol's typical move, and hitRateIsInformative=false means the hit rate describes band width and the tail of the return distribution, not skill. ⚠️ Do NOT repeat the audit c41dd8af figure of a 92% hit rate — it was an artifact of a 100-alert sample and was disproven on 2026-08-02: on 1985 outcomes behind sent alerts the hit rate is 78.0% with a band 4.3x wider than the median move. Do NOT claim the band is mis-centered either — that was measured and refuted (deviation of the move from the band midpoint has a median of +0.17pp, and re-centering the band on zero would yield 80.1% vs 78.0%); misses come from heavy tails, not from a displaced center. When hitRateIsInformative is false, lead with alphaBenchmarkMatched. Use this to answer 'is Giełdownik worth my subscription' / 'how have my alerts performed YTD'. Different from get_evaluation_outcomes (system-wide outcomes) — this is scoped to alerts the USER actually received.

  • get_priced_events

    Fetch user's tracked priced-events with live-computed driftPct + pricedInScore + daysToEvent. **Only returns events the user explicitly attached via `track_priced_event` (or via a thesis with `expectedDate`). Empty result for a watchlist symbol (e.g. NVDA) does NOT mean 'no newsflow' — it means 'no thesis-attached event'. For the news/evaluation history of any symbol (PAP, GPW ESPI, EODHD news, forum), call `get_news_history` instead.** Default returns pending only - pass status='all' or status='resolved' to expand. Server canonicalises symbol filter. Sorted by expectedDate ascending. Each pending event also carries `delayHint`: `null` when on track, or `{kind, daysOverdue, expectedKey, message}` when expectedDate is past Warsaw close without resolution. Universe-aware: optional `universe` (alias `universeFilter`) restricts results to one market.

  • get_signal_prediction_performance

    Agregat kalibracji numerycznych predykcji sygnałów (asset_signals.movePrediction): ile predykcji w locie / gradowanych / ungradeable, hit-rate. ⛔ CO DOKŁADNIE ZNACZY [hit] (zgłoszenie 6a836c6c, doprecyzowane pomiarem 18.08): ten sam KIERUNEK ruchu ORAZ |zrealizowany| >= 50% |przewidywanego|. Słowo [strict] odnosi się WYŁĄCZNIE do tego, że kubełek `partial` (dobry kierunek, ruch mniejszy niż połowa) NIE wlicza się do trafień. WYJĄTEK dla predykcji PŁASKIEJ (|przewidywany| <= 0,1 pp): wtedy trafieniem jest sam brak ruchu (|zrealizowany| <= 0,1 pp), a jakikolwiek ruch to pudło - kierunek i skala nie mają wtedy zastosowania. ⚠️ REGUŁA NIE MA GÓRNEGO OGRANICZENIA: prognoza +6,5% przy realizacji +18,8% jest pełnym trafieniem. Skalę tego zjawiska sprawdzisz W TEJ SAMEJ ODPOWIEDZI - porównaj `hitRatePct` z `avgAbsErrorPct`; wpisanie tu liczby z bazy zamroziłoby pomiar z jednego dnia. Dlatego `hitRatePct` czytaj RAZEM z `avgAbsErrorPct` z tego samego wiersza: pierwsza liczba mówi [czy kierunek i skala minimalna się zgadzały], druga [o ile pomyliliśmy się co do wielkości]. Sam hit-rate NIE jest miarą celności co do wielkości ruchu, directional accuracy (zgodność znaku predykcji z realizacją), średni |błąd| w pp, breakdown per kind (opportunity/risk/commodity), per horyzont (<=21d / 22-45d / >45d) i top symbole. Filtry opcjonalne: symbol, kind, universe. Odpowiednik get_my_alert_performance dla predykcji sygnałów — użyj do oceny 'czy movePrediction jest już wiarygodny'. Przy <20 gradowanych zwraca ostrzeżenie o małej próbce.

  • historical_event_hit_rate

    Backtest avg reactions for a (symbol, eventType) pair from existing data + price_history_daily. earnings_beat / earnings_miss source from earnings_deepdives (hitRate computed from beat/miss verdict). dividend and news-derived event types (regulatory, ma_close, guidance_raise, product_launch, capacity_addition, contract_award) source from news_items + evaluations; their hitRate means share of usable events with positive T+5 reaction. Returns sample + hitRate + avg T+1/T+5/T+30 reactions + 10d pre-event drift + evidence. Anti-slop: HEURISTIC, meaningful when sample >= 4. The market is resolved from the assets collection; when the same ticker trades on more than one exchange (PEP is both Polenergia and PepsiCo) the tool REFUSES with ok:false instead of mixing both companies' history.

  • list_decision_rule_proposals

    List pending (or filter status) trade proposals generated by decision rules with `action.kind = propose_trade`. The agent surfaces these in chat so the user can confirm or reject; without this tool the proposals would only be visible via direct Mongo access (codex review P2 FR d6ae0572).

  • list_decision_rules

    List the caller's decision rules with computed nextEvalEligibleAt. Optional statusFilter: active | paused | expired.

  • list_webhook_events

    List recent webhook events received for the user. Use to investigate why an alert fired or whether TradingView webhook is reaching Giełdownik. Returns events newest-first.

  • resolve_priced_event_now

    Manually trigger resolution of a single pending event without waiting for the 6h cron tick. Same logic as the resolve-events-tick worker: detects outcome via earnings_deepdive (for earnings types) or defaults to 'match', computes T+1/T+5/T+30 reactions from price_history_daily, persists status='resolved' + verdict. Returns reason='not_due' when expectedDate is too recent (1d buffer), 'no_price_history' when EODHD has no candles for symbol, or 'race' when concurrent cancel/resolve already happened.

  • submit_alert_feedback

    Record a verdict on an alert — same calibration signal that 👍/👎/🚫 buttons in Telegram produce. Use after observing the outcome (price moved as expected? alert was actionable? was it routine spam?) to feed the quality loop. Idempotent on (userId, evaluationId): re-submitting just overwrites the latest verdict. Supply EITHER alertId OR evaluationId; alertId is the friendlier choice because it's surfaced directly by get_alerts.

  • track_priced_event

    Flag a forward-looking event with expected market impact (earnings beat, dividend, M&A close, etc.). Snapshots priceAtAttachment from price_history_daily so future GETs can compute drift + pricedInScore. Optional thesisRef cross-links to a PositionThesis (FR A). Anti-slop: warns when expectedDate is in past or magnitude is implausibly high. No automatic resolution in Phase 1 - Phase 2 adds post-event verdict.

  • update_decision_rule

    Update safe decision-rule metadata: status, cooldownMinutes, expiresAt. Does not mutate trigger/action in MVP.

  • update_priced_event

    Mutate a pending priced-in event's user-supplied fields (expectedDate, direction, magnitude, probability, thesisRef, note). Refuses to touch resolved/cancelled events — use cancel_priced_event + track_priced_event for a fresh take. thesisRef re-validated to belong to the user. Atomic, race-safe. Returns the list of changed field names.

Ryzyko rynkowe

4

Reżim rynkowy, tematy ryzyka i zdarzenia mogące uderzyć w portfel.

  • get_event_risks

    Forward-looking hardcoded macro event risk calendar for 2026. Returns upcoming CPI/NFP/FOMC/ECB/NBP/OPEC/PCE events within daysAhead (default 30), sorted chronologically, with severity 1-10 and daysUntil. No DB, no external API.

  • get_risk_dashboard

    Composite risk dashboard: synthesizes current risk regime (calm/elevated/stress/crisis), top 3 active geopolitical themes by severity, and a pure-logic recommendation (maintain / reduce_risk_10pct / reduce_risk_25pct / hedge / cash_up) with affected sectors + suggested hedges. Pure synthesis — no new data fetches beyond get_risk_regime + get_risk_themes.

  • get_risk_regime

    Compute composite global risk regime (calm/elevated/stress/crisis) z 6 wymiarów: volatility (VIX lub spxClose realized vol), liquidity (Cboe put/call + AAII spread), fx_rates (DXY/US10Y/EUR-PLN), commodities (Brent/copper/gold), sentiment (CNN Fear&Greed + AAII), breadth (mWIG40/sWIG80 vs SPX). Returns 0-100 score + per-component breakdown + delta vs 7d/30d. Brak nowej kolekcji — pure composition z driver_values + driver_value_history.

  • get_risk_themes

    Geopolitical risk theme tracker: classifies last 30d news_items into themes (Middle East, US-China trade, Russia-Ukraine, China property, OPEC oil, US politics, EU politics) via keyword heuristic; returns per-theme severity score (0-10), 7d/30d headline counts, average sentiment, last 5 headlines. NO LLM call.

Obligacje Catalyst

3

Serie obligacji, arkusz zleceń i kalkulator wcześniejszego wykupu.

  • calculate_early_redemption

    Calculate the basic premium-vs-forgone-coupon math for a Catalyst early redemption decision. Uses bond_series face value, maturity, current coupon, and stale last price when no redemptionPricePct is provided.

  • get_bond_orderbook

    STUB for Catalyst order book lookup. Returns a deferred status because Catalyst does not expose a clean public order book API and known public sources are blocked/unreliable.

  • get_bond_series

    Search Giełdownik's GPW Catalyst bond_series collection. Filter by issuer, listed issuer equity ticker, sector, margin/coupon floor, and maturity window. MVP data is a manual Catalyst snapshot pending scraper refresh.

Konto, odprawa i diagnostyka

10

Dzienna odprawa rynkowa, rozmowa z asystentem, ustawienia agenta oraz stan potoku danych.

  • get_codex_pipeline_stats

    Codex CLI batch LLM pipeline health snapshot — queue depth, success rate, p50/p95 latency per taskType (extract_conference_summary, extract_wza_summary, extract_earnings_deepdive, extract_company_analysis, extract_analysis_findings). `completed` = TOTAL tasks that finished successfully at the codex layer (consumed + awaiting); `consumed` = drained/handled by resolve-tick — NOTE this includes parse-rejected and low-confidence-skipped outputs (resolve sets consumedAt even when it does NOT persist a summary), so `consumed` is NOT a persisted-results count; `awaitingConsumption` = transient not-yet-resolved depth (normally ~0). `completed`==`consumed` means everything was drained (no backlog) but does NOT by itself prove results persisted — cross-check the target collection / quality if a regression is suspected. Use to verify Phase 2 migrations + spot stuck tasks or quality regressions. No params.

  • get_daily_brief

    Odprawa Giełdownika — krótka notatka na dziś o portfelu i watchliście tego użytkownika (to samo, co widzi na górze pulpitu). Powstaje wsadowo w trzech porach czasu warszawskiego (około 6:45 codziennie oraz 12:45 i 18:50 w dni sesyjne) i jest cache'owana, więc wywołania między porami są darmowe i oddają tę samą treść. Zanim powstanie pierwsza odprawa danego dnia, narzędzie zwraca pustkę — to nie błąd. Użyj, gdy user pyta 'co nowego', 'co dziś ważnego', 'podsumuj mi dzień'.

  • get_outcome_settlement_health

    Outcome settlement diagnostic — per-region (PL/US/OTHER) pending vs settled counts, oldest pending eval timestamp, newest settled outcome timestamp, sample stuck symbols. pendingDueCount counts ONLY evaluations the worker could still settle; evaluations whose symbol has no candle at/after the horizon end (delisted, renamed, never quoted) are reported separately as unsettleableCount and are NOT a backlog — the worker abandons them by design. Use to spot when a region's settlement worker silently stops (e.g. PL settles but US is days stale). No params.

  • get_pipeline_health

    Health snapshot of the ingest → eval → notify pipeline + key MCP tools. Returns checks[] with status (ok/warn/incident), value vs threshold, and a one-line Polish message. Use as a single call to verify the system is functional, before/after deploys, or when something feels off. Each check has a short name (alerts_recent, eval_dropoff, latency_p50_24h, forecast_coverage, quote_freshness, ...) so an agent can filter to just the checks it cares about.

  • list_feature_requests

    List your previously-submitted feature requests + founder responses. Returns founder notes plus auto-impl loop telemetry (autoImplAttempts, autoImplLastError, autoImplCommitSha, autoImplDiffStat) so you can see whether the loop tried, what it touched, and why it failed if it did.

  • modify_chat_settings

    Update notification preferences (impactThresholdPct, alertWeighting, notificationEmail, channels, mutedAlertClassifications). Partial — only provided fields touched. Webhook URL / secret rotation is intentionally NOT exposed here (auth-adjacent surface — change via /webhook in the web UI).

  • modify_profile

    Update user profile fields (partial — only provided fields are touched). Use this to align Giełdownik's understanding of who the user is (style, risk, horizon, free-form context) when you observe a drift between profile and actual behavior. Returns the resulting profile snapshot. Existing holdings + targets + watchlist are NOT touched by this tool — use modify_watchlist / modify_targets / submit_portfolio_snapshot for those.

  • query_companion

    Ask Giełdownik companion in Polish. Returns a personalized takeaway based on user's profile, holdings, alerts, broker fees, realized P&L YTD, and tax-loss harvesting opportunities. By default the call is logged into the user's chat history (visible in Telegram bot, fed to RAG). Use `silent: true` for ephemeral agent-internal queries (no persistence, no RAG pollution) or `agentLabel: "X"` to persist with a tag — kept for context continuity but excluded from summarizer + RAG note extraction.

  • set_agent_prefs

    Ustaw preferencje STYLU rozmowy agenta (partial — tylko podane pola). Użyj gdy user prosi żebyś mówił inaczej: krócej/dłużej, formalniej/luźniej, bez emoji, z żargonem lub bez, albo żebyś skupił się na wybranych obszarach. Zmienia JAK agent mówi, NIGDY zakres tematyczny. NIE używaj do jednorazowej prośby ('tym razem krótko') — tylko do trwałej zmiany preferencji.

  • submit_feature_request

    Submit a feature request, bug report, improvement suggestion, or question to the Giełdownik team. Use this when you (the agent) need a tool/data Giełdownik doesn't currently expose, find a bug in tool responses, or have a suggestion to improve the API. Founder will review.

Brakuje narzędzia?

Serwer ma narzędzie submit_feature_request, więc Twój agent może zgłosić brak sam, w trakcie pracy, bez wychodzenia z rozmowy. Zgłoszenia trafiają na tę samą tablicę, z której powstaje kolejka wdrożeń.