{"slug": "alphadesk-market-terminal-your-own-ai-agent-reads-over-mcp", "title": "AlphaDesk – market terminal your own AI agent reads over MCP", "summary": "AlphaDesk launched a market-research terminal that lets users query market data, SEC filings and US Treasury records through their own AI agent via 37 read-only MCP tools, with the code released under the GNU AGPL-3.0 and a commercial licence alternative. The service is free during early access, with planned pricing of $19 a month or $190 a year after a 14-day trial, and is offered either as a managed cloud service or self-hosted, requiring users' own vendor keys from providers including Alpaca, FMP, Finnhub, Polygon, CoinGecko and Tiingo. AlphaDesk states it does not trade, route orders, hold positions, score ideas or write summaries, and that the server holds no vendor keys.", "body_md": "**A dense, fast market-research terminal and integration platform.** Readers\nconnect their own market-data and news providers; AlphaDesk is the workspace\nthat connects, checks and presents what those providers — and the public\nrecord at SEC EDGAR and the US Treasury — actually say. Questions are asked\nin the reader's **own AI agent** (Claude, ChatGPT, Codex, Cursor, opencode),\nwhich reads the same records through **37 read-only agent tools** (MCP).\n\nAlphaDesk **reads**: quotes and charts, news, SEC filings, financial\nstatements, ownership and insider activity, earnings and corporate\ncalendars, options, crypto. It **does not** trade, route orders, hold\npositions, score ideas or write summaries.\n\nTwo ways to use it — the [managed cloud](#option-a--managed-cloud) or\n[your own server](#option-b--self-hosted-agpl-30). The code is open source\nunder the **GNU AGPL-3.0**, with a **commercial licence** for anyone who\ncannot meet its terms. See [Licence](#licence).\n\n| AlphaDesk is | AlphaDesk is not | \n|---|---|\n| A **consumption terminal** : it fetches, checks and presents market information | A trading system — there is no order routing, position state or broker integration | \n| An **integration platform** : every vendor figure runs on the reader's own key | An aggregator — the server holds no vendor keys and never shares one reader's data with another | \n| A **presenter of records** : filings, statements, stories and prices, shown whole with their source | A summariser — no model writes, paraphrases or scores anything here | \n| **Pluggable** : news feeds, market data, transcripts and dashboard tiles are swappable providers | A black box — every list is chronological, alphabetical or ordered by the figure it shows | \n\nIt is offered **free** at present (payments are designed but switched off;\nsee [Accounts](#accounts-security-and-privacy)).\n\n|  | Option A — Managed cloud | Option B — Self-hosted | \n|---|---|---|\n| Price | **Free during early access.** Planned: $19 a month or $190 a year, announced before it starts | Free | \n| Licence | Commercial terms of service — no AGPL obligations for you | GNU AGPL-3.0 | \n| You run | Nothing: sign in with GitHub | One container or one Python process, and a database | \n| Search by meaning | Included (the embedding model runs on our servers) | Runs on your CPU (~1.2 GB model, 2 vCPU / 4 GiB recommended) or switched off | \n| Vendor keys | Your own, connected on the Account page | Your own, in `.env` or the Account page | \n| Updates | Continuous | `git pull` and restart | \n\n1. Open the [hosted terminal](https://alphadesk-764298799571.us-east4.run.app) and sign in with GitHub — the account is created on first sign-in. (Google\nsign-in admits invited accounts only until Google approves the app.)\n2. On the **Account** page, connect the market-data and news providers you\nalready use (Alpaca, FMP, Finnhub, Polygon, CoinGecko, Tiingo, …). SEC\nEDGAR and the US Treasury need no key.\n3. **It is free during early access** — there is no plan to choose and no\ncard to enter. Paid plans ($19 a month or $190 a year, each after a\n14-day trial) will be announced to account holders before they start;\nnobody is charged without subscribing.\n4. Optional: connect your own agent from the Account page — a token for Claude Code, Codex, Cursor or opencode, or add the server URL as a connector in Claude.ai or ChatGPT.\n\n**You need** a SEC User-Agent with real contact details (SEC blocks\nrequests without one), Python 3.11+ or Docker, and — for anything beyond\nEDGAR and Treasury data — your own vendor keys.\n\n**1. Configure.** Copy the template and fill in the two required values:\n\n```\ncp alphadesk/deploy/env.example .env\n```\n\n| Setting in `.env` | Required | What to put | \n|---|---|---|\n| `ALPHADESK_VAULT_KEY` | yes | 32 random bytes, base64 — seals stored vendor keys; keep a copy, losing it makes them unreadable | \n| `SEC_USER_AGENT` | yes | `AlphaDesk (you@example.com)` — a name and a real email | \n| `ALPHADESK_AUTH` | for one person | `off` : a single local account with no sign-in | \n| `ALPHADESK_DATABASE_URL` | no | a `postgres://` URL; unset, SQLite in`ALPHADESK_DATA` (`~/.alphadesk` ) | \n| `ALPACA_API_KEY` ,`ALPACA_SECRET_KEY` ,`FMP_API_KEY` ,`FINNHUB_API_KEY` ,`POLYGON_API_KEY` ,`ALPHAVANTAGE_API_KEY` ,`COINGECKO_API_KEY` | no | your own keys; sealed into the local account with `python -m alphadesk.main keys import-env` (or connect them on the Account page instead) | \n| `ALPHADESK_SEMANTIC_SEARCH` | no | `off` skips the ~1.2 GB embedding model; search then matches words only | \n| `GOOGLE_CLIENT_ID` /`GITHUB_CLIENT_ID` (+ secrets),`ALPHADESK_BASE_URL` | for several people | single sign-on for a shared instance | \n\nGenerate the vault key with:\n\n``` python\npython -c \"import os, base64; print(base64.b64encode(os.urandom(32)).decode())\"\n```\n\n**2a. Run with Python.**\n\n```\npip install -r requirements.txt\npython -m alphadesk.main keys import-env\npython -m alphadesk.main dashboard\n```\n\nThe terminal is at [http://127.0.0.1:8000](http://127.0.0.1:8000). The first start downloads the\nembedding model into the Hugging Face cache.\n\n**2b. Or run with Docker.** The image bakes the embedding model in, so a\ncontainer downloads nothing at start:\n\n```\ndocker build -t alphadesk .\ndocker run -d --name alphadesk -p 8000:8000 --env-file .env -e ALPHADESK_DATA=/data -v alphadesk-data:/data alphadesk\n```\n\nWith `ALPHADESK_AUTH` left on and no sign-on provider configured, create a\npassword account inside the container:\n\n```\ndocker exec -it alphadesk python -m alphadesk.main user add you@example.com\n```\n\n**3. Keep it private or publish your changes.** Under the AGPL, if you let\nother people use a modified copy over a network, you must offer them the\nsource of your version. Using it yourself, unmodified, or keeping your\nchanges to yourself on your own machine carries no such obligation. Billing\nstays off (`ALPHADESK_BILLING_ENFORCE` is off by default), so every account\non your instance has full access.\n\nThese are the product. Much of what might look missing was built,\nmeasured and removed on purpose — **[DECISIONS.md](https://github.com/vigneshv1cky/alphadesk-terminal/blob/main/DECISIONS.md)** says what\nand why. Bring evidence and open an issue.\n\n1. **Nothing is paraphrased.** Every panel and agent tool returns what a\nvendor or EDGAR actually said — a filing in pages, a statement series, a\nstory's own text. If a figure cannot be shown with its source, it is not\nshown.\n2. **Indicators hide when the data cannot support them.** Bar coverage and\ngap size are measured per series; below the floor RSI and MACD are hidden\nrather than drawn over sparse prints that would render identically to a\nliquid name's chart.\n3. **Nothing is ranked for you.** The screener window is alphabetical;\ncalendars and agent tools order only by the figure on each row. Search\nresults are newest first — a model may decide what is*related* , never\nwhat comes first.\n4. **An idle terminal spends nothing.** Background loops fetch only public\ndata and each reader's own news; everything else is fetched on request,\non the requesting reader's keys.\n5. **Untrusted text stays untrusted.** Headlines, articles, filings and\ntranscripts are data. Nothing here acts on them, and the agent tools that\nreturn them say so.\n6. **Not an aggregator.** Merging several news feeds is the reader's act, on\ntheir own credentials, for their own window.\n7. **The agent surface is read-only and per reader.** Every agent call runs\nas exactly the reader whose token or grant it carries.\n8. **Vendor data is the reader's.** No vendor key on the server; no keyless\nroute to a commercial vendor or unofficial endpoint; every vendor cache\nkeyed by reader; vendor data kept only as long as a feature reads it.\n\n| Page | What it shows | \n|---|---|\n| **Landing** (`/` ) | Product overview with blurred screenshots; sign-in and sign-up | \n| **Markets** | A composable board: chart, equity overview, funds built on the stock, stock/ETF/crypto/currency/option movers, Treasury yields, heatmap, news | \n| **Chart** | Full workspace: candles, line, area, step and other styles; 1-minute to multi-year intervals; indicators and templates; drawing tools (desktop, per visit); multi-chart layouts; overnight, pre-market, after-hours and weekend session shading | \n| **Analysis** | One name end to end: chart, filings, price performance, key statistics, earnings history and consensus, analysts, rating changes, financials as filed, splits, dividends, institutional and insider ownership, news. Funds add holdings and breakdown; coins get their CoinGecko record instead of stock-only panels | \n| **Profile** | Who a company is: EDGAR registrant facts, the latest 10-K/20-F business and properties sections verbatim, locations, officers; a coin's CoinGecko record | \n| **News** | Each reader's merged feeds, three days deep, newest first; filter by words, source or board; search by words and by meaning; an in-page reader with full text where the feed carries it | \n| **Earnings** | The week's reporters, dated by the company's own release and joined to its SEC results filing; sessions predicted from history; estimates, actuals, surprise, market cap, volatility, liquidity | \n| **Calendars** | Economic releases, dividends, corroborated splits and IPOs | \n| **Options** | Chains with implied volatility, calls green and puts red; options flow seen live | \n| **Sectors** | Sector funds by weight and dollars traded, with breadth | \n| **Baskets** | 36 curated baskets grouped by the *news* that moves them (rates, oil, tariffs, chip export rules, bitcoin, …), plus the reader's own | \n| **Portfolio / custom views** | The reader's saved boards | \n| **Account** | Coverage matrix of connected vendors and feeds, agent access (tokens and connected apps), sign-in methods and sessions | \n| **Admin** | Owners only: accounts, last seen, sign-in methods, sign-out-everywhere, disable, delete | \n| **Terms, Privacy, Disclaimer** | Public drafts pending legal review | \n\n- **The symbol strip** scopes every page; picking a row adds and selects the\nsymbol without moving the page.\n- **Composable boards** : show, hide, reorder, size and place tiles; the\nlayout lives in the URL, so a link restores the exact board.\n- **Live data** where the reader's plan streams it (Alpaca stock, crypto and\nnews sockets), polling elsewhere; a 428 prompt names the vendors and plans\nthat would fill any panel the reader's keys cannot.\n- **Phones** : every page is laid out for a 375-pixel screen as well as a\ndesktop.\n- **Light and dark themes** , a hand-rolled design system on a 4-pixel grid\nwith six type roles, and full keyboard focus handling in every overlay.\n\n| Vendor | Carries (plan-dependent) | \n|---|---|\n| **Alpaca** | Consolidated (SIP) and IEX bars, overnight (Blue Ocean) session, quotes, movers, crypto, option chains with IV, options flow, corporate actions | \n| **Financial Modeling Prep** | Calendars (earnings, economic, dividends, splits, IPOs), key statistics, profiles, analysts, market caps, currencies, press releases, fund data | \n| **Polygon (Massive)** | Bars, quotes, movers, currencies, options | \n| **Finnhub** | Company metrics, profiles, earnings calendar and sessions | \n| **Alpha Vantage** | Company overview, bars | \n| **CoinGecko** | Worldwide crypto prices, volume, market caps and coin records | \n\nFor each panel the reader's connected vendors are asked in a fixed,\ndocumented order; the first that carries the figure answers. Charts and\noption chains are pinned to **one** vendor, never stitched across tapes.\n\nAlpaca (Benzinga), Polygon, Finnhub, Benzinga, Tiingo, Alpha Vantage, Marketaux and FMP. Several feeds merge into one window per reader, de-duplicated by URL. Alpaca's news streams live; the rest poll every five minutes.\n\n- **SEC EDGAR** : filings and their text, XBRL financial statements, Form 4\ninsider trades, 8-K Item 2.02 and 6-K results releases (release day read\nfrom the filing itself), ticker and company lists.\n- **US Treasury** : the daily par yield curve.\n\nEvery source, how it is collected and its terms are listed in\n**[docs/data-sources.md](https://github.com/vigneshv1cky/alphadesk-terminal/blob/main/docs/data-sources.md)**. Vendor terms are separate\nfrom the code licence; see [Known limitations](#known-limitations).\n\nNews search works two ways at once, everywhere a reader searches — the News\nfilter box, \"Search all\" and the agent's `news_search` tool:\n\n- \n**By words** — one rule shared by the server and the browser: whole words\nin order, plurals matched to singulars, a capitalised ticker matched\nexactly, and a query that names a company also finds stories tagged with\nit (\"robinhood\" finds stories tagged HOOD).\n- \n**By meaning** — stories whose headline is close in meaning to the query\nare added and marked**related** , so \"AI data center spending\" finds\n\"Equinix plans $5B–$7B annual data center buildout\" without a shared\nphrase. This uses**Qwen3-Embedding-0.6B** (Apache 2.0),**self-hosted\ninside the server** : no text leaves AlphaDesk and there is no model key.\nHeadlines are embedded once as they arrive; the threshold (cosine 0.50)\nwas calibrated so that only on-topic stories are added. Results remain\nnewest first.The embedding work never competes with the site: the model runs on a single CPU thread, the background worker runs at the lowest operating system priority, and it embeds only while no request is being served. Searches take about a third of a second.\n\nA **coin's** news panel reads all crypto and what moves it — any coin's\nstories, crypto stocks, stories naming crypto, and Fed and rates headlines —\neach marked with the reason it is there.\n\nAlphaDesk exposes the same records the interface shows as **37 read-only\ntools** over the [Model Context Protocol](https://modelcontextprotocol.io),\nat `/api/agent/tools/mcp`. Every call runs **as the reader**, on their keys,\nrate-limited to 120 requests a minute per token.\n\n**Connecting**\n\n- **Claude.ai, ChatGPT** — add a custom connector with the server address and\nsign in when asked (OAuth 2.1 with PKCE; one live grant per registered app).\n- **Claude Code, Codex, Cursor, opencode** — create a token on the Account\npage under Agent access (shown once, stored hashed, revocable at once); the\npage gives each client's exact setup.\n\n**Tools**\n\n| For | Tools | \n|---|---|\n| Today | `market_today` ,`market_tape` ,`movers` ,`sector_performance` ,`sector_breadth` | \n| The reader's names | `my_board` ,`quotes` ,`screener_window` ,`baskets` ,`find_symbol` | \n| One company | `quote` ,`key_stats` ,`company_profile` ,`fund_profile` ,`analyst_view` ,`financial_statements` ,`earnings_history` ,`ownership` ,`insider_activity` ,`peers` ,`compare_metrics` | \n| Prices | `price_history` ,`price_chart` | \n| News | `symbol_news` ,`news_search` ,`news_story` | \n| Filings and calls | `list_filings` ,`filing_text` ,`transcripts` ,`transcript_text` | \n| Calendars | `earnings_calendar` ,`recently_reported` ,`economic_calendar` ,`corporate_calendar` | \n| Options | `option_expirations` ,`option_chain` ,`options_flow` | \n\nThe tools are written for an agent that cannot see the screen: `find_symbol`\nresolves a name to a ticker from the SEC list rather than letting an agent\nguess; `price_chart` returns a thinned series carrying each point's RSI and\nMACD; `filing_text` and `transcript_text` return whole documents in pages;\n`news_search` marks each story as a word or meaning match. Tools that return\npublisher or filer text say that it is untrusted input.\n\n- **Sign-in** : single sign-on is the only door and is also sign-up — Google\nand GitHub are live, Microsoft is a configuration slot. The email address\nis the account key across providers; each sign-in's method is recorded.\n- **Sessions** : HMAC-signed cookie, 14-day lifetime, sign-out everywhere.\n- **Vendor keys** : sealed per reader with AES-256-GCM under a master key held\noutside the database; never logged, never shown after entry.\n- **Agent credentials** : tokens and OAuth codes stored as SHA-256 hashes;\nOAuth clients sealed; consent page signed, same-site and unframeable.\n- **Owners** (configured by email) reach the Admin page; everyone else is a\nreader.**Access is free** : a trial is recorded but the access gate is off\nand no payment processor is configured.\n- **Retention — vendor data is kept only as long as a feature reads it** :\nstories 7 days, full article text 72 hours, meaning vectors with their\nstories, company announcements 30 days past the report, the forecast log\n120 days, release habits 3 days, press-release checks 24 hours. Removing a\nkey deletes what that key fetched.\n- **Deletion** : a reader can delete their account, confirmed by typing its\nemail; every row keyed to it is removed in one transaction. The table\nlist is checked against the schema by the test suite.\n- **No analytics, advertising or tracking.**\n\nThe full account, session, key-vault and agent-credential design is in\n**[docs/hosted-mode.md](https://github.com/vigneshv1cky/alphadesk-terminal/blob/main/docs/hosted-mode.md)**.\n\n```\n                       ┌──────────────────────────────────────────────┐\n  Browser (React SPA) ─┤  FastAPI · one process · one port            │\n  Reader's agent (MCP) ┤                                              │\n                       │  /api/*  ── panels, composed per request     │\n                       │  /api/agent/tools/mcp ── 37 read-only tools  │\n                       │  OAuth 2.1 at the root (/authorize, /token…) │\n                       │                                              │\n                       │  Per-reader DataRouter ──► reader's vendors  │──► Alpaca · FMP · Polygon\n                       │    (ordered per panel; 428 when none carry)  │    Finnhub · Alpha Vantage\n                       │                                              │    CoinGecko\n                       │  Background:                                 │\n                       │    news poll (5 min) + held news sockets     │──► each reader's feeds\n                       │    EDGAR results sweep (15 min, weekdays)    │──► SEC EDGAR\n                       │    daily earnings forecast capture           │──► Treasury\n                       │    embedding worker (search by meaning)      │\n                       └──────────────┬───────────────────────────────┘\n                                      │\n                         Postgres (Cloud SQL) in production\n                         SQLite (WAL) in development\n```\n\n**Backend** — Python 3.11+. FastAPI with synchronous handlers on a\n40-worker thread pool and explicit socket deadlines for every upstream.\nProviders are structural Protocols (`NewsProvider`, `PriceProvider`,\n`TranscriptProvider`), built per reader from their sealed keys and\ndiscoverable through entry points. The request's reader identity travels in\na context variable; background threads deliberately do not inherit it. The\nstore speaks SQLite locally and Postgres through the pure-Python `pg8000`\ndriver in production. The embedding model runs in process on CPU via\nsentence-transformers and PyTorch's CPU build.\n\n**Frontend** — TypeScript, React 19 and Vite, built to static files the\nPython process serves. Tailwind CSS v4 carries the design tokens (14-pixel\nroot, 4-pixel spacing grid, six type roles, light and dark). TanStack Query\nshares one query per endpoint. There is **no component library and no chart\nlibrary**: primitives are hand-rolled, and the chart is AlphaDesk's own SVG\nrenderer, with candles batched into four paths so the node count is\nconstant in bar count.\n\n```\nalphadesk/\n  main.py            entry point: web server + background loops, and the CLI\n  app/               FastAPI app, auth, admin, agent access (tokens, OAuth, MCP mount)\n  providers/         the plugin seams, vendor implementations, catalogue, per-reader router\n  ingest/            EDGAR, news polling, calendars, movers, prices and indicator math\n  desk/              screener window, filings, transcripts, market-today\n  ledger/            store (SQLite / Postgres), database adapter, key vault\n  mcp_server.py      the agent tools\n  semantic.py        search by meaning (self-hosted embedding model)\n  cryptonews.py      a coin's news selection\n  newsquery.py       the word-search rule\n  billing.py         owners, trial, the (off) access gate and payment seam\n  config.py          settings, retention, curated baskets\n  ui/                React 19 + Vite frontend (built into app/static)\n  deploy/            deployment guide and the configuration template\ndocs/                data sources, providers, widgets, hosted mode\nscripts/deploy.sh    build on Cloud Build and roll the Cloud Run service\ntests/               pytest suite\n```\n\n- Python **3.11+** , Node with**pnpm**\n- A **SEC User-Agent** string with real contact details (SEC requires one)\n- Your own vendor keys for anything beyond EDGAR and Treasury\n- About 1.5 GB of disk for the embedding model, downloaded on first use (or\nset `ALPHADESK_SEMANTIC_SEARCH=off` )\n\n```\npip install -r requirements.txt\ncp alphadesk/deploy/env.example .env        # then edit: vault key, SEC user agent\npython -m alphadesk.main dashboard          # API + built SPA on http://127.0.0.1:8000\n```\n\nGenerate a vault key (32 random bytes, base64):\n\n``` python\npython -c \"import os, base64; print(base64.b64encode(os.urandom(32)).decode())\"\n```\n\nFor local work without sign-in, set `ALPHADESK_AUTH=off` (one local\naccount), put your own vendor keys in `.env`, and seal them into that\naccount:\n\n```\npython -m alphadesk.main keys import-env\n```\n\nFrontend with hot reload (proxies `/api` to the running server):\n\n```\ncd alphadesk/ui && pnpm install && pnpm dev\n```\n\n| Command | Purpose | \n|---|---|\n| `python -m alphadesk.main dashboard` | The web server and background loops | \n| `python -m alphadesk.main keys import-env` | Development: seal `.env` vendor keys into the local account | \n| `python -m alphadesk.main earnings` | Stamp today's EDGAR results releases and list the last three days | \n| `python -m alphadesk.main backfill --hours 72` | Backfill EDGAR results releases | \n| `python -m alphadesk.main calendar-accuracy --days 30` | Score calendar vendors against EDGAR release days | \n| `python -m alphadesk.main mcp [--http]` | The agent tools standalone (EDGAR only — no reader identity) | \n| `python -m alphadesk.main user …` | Manage password accounts for instances without SSO | \n\n- **Providers** : implement a Protocol and register it through a local module\n(`ALPHADESK_PLUGINS` ) or the`alphadesk.providers` entry point —**[docs/providers.md](https://github.com/vigneshv1cky/alphadesk-terminal/blob/main/docs/providers.md)** .\n- **Dashboard tiles** : register a widget in`ui/src/widgets/` , or serve tiles\nfrom an external JSON backend (`ALPHADESK_WIDGET_BACKENDS` ) —**[docs/widgets.md](https://github.com/vigneshv1cky/alphadesk-terminal/blob/main/docs/widgets.md)** .\n- Conventions and checks: **[CONTRIBUTING.md](https://github.com/vigneshv1cky/alphadesk-terminal/blob/main/CONTRIBUTING.md)** ; the rules\nand what was tried and undone:**[DECISIONS.md](https://github.com/vigneshv1cky/alphadesk-terminal/blob/main/DECISIONS.md)** ; reporting\na vulnerability:**[SECURITY.md](https://github.com/vigneshv1cky/alphadesk-terminal/blob/main/SECURITY.md)** .\n\nEnvironment variables (also read from `.env`). Only the first two are\nrequired.\n\n| Variable | Purpose | \n|---|---|\n| `ALPHADESK_VAULT_KEY` | **Required.** 32 bytes, base64: seals every reader's keys. Losing it makes them unreadable | \n| `SEC_USER_AGENT` | **Required.** Descriptive User-Agent with contact details, as SEC asks | \n| `ALPHADESK_DATABASE_URL` | Postgres connection string; unset uses SQLite in `ALPHADESK_DATA` | \n| `ALPHADESK_DATA` | Data directory for SQLite (default `~/.alphadesk` ) | \n| `ALPHADESK_AUTH` | `off` for a single local account without sign-in | \n| `GOOGLE_CLIENT_ID` /`GOOGLE_CLIENT_SECRET` | Google sign-in (likewise `GITHUB_…` ,`MICROSOFT_…` ) | \n| `ALPHADESK_BASE_URL` | Public URL; OAuth redirects and the agent host allowlist depend on it | \n| `ALPHADESK_SECRET` | Session signing secret | \n| `ALPHADESK_COOKIE_SECURE` | Secure cookies (on behind HTTPS) | \n| `ALPHADESK_OWNER_EMAILS` | Owner accounts (Admin page, never gated) | \n| `ALPHADESK_TRIAL_DAYS` /`ALPHADESK_BILLING_ENFORCE` /`ALPHADESK_BILLING_PROVIDER` | Trial length, access gate ( `on` for the managed service; off by default), payment processor (`stripe` when a Stripe key is set) | \n| `STRIPE_SECRET_KEY` /`STRIPE_WEBHOOK_SECRET` | Managed service only: Stripe checkout and signed webhooks at `/api/billing/webhook` . Unset, checkout answers 503 and nothing is charged | \n| `STRIPE_PRICE_ID_MONTHLY` /`STRIPE_PRICE_ID_YEARLY` | The two plans' Stripe price IDs ($19 a month, $190 a year) | \n| `ALPHADESK_SEMANTIC_SEARCH` | `off` disables search by meaning | \n| `ALPHADESK_EMBED_MODEL` /`ALPHADESK_SEMANTIC_THRESHOLD` | Embedding model (default Qwen/Qwen3-Embedding-0.6B) and similarity cutoff (0.50) | \n| `ALPHADESK_PLUGINS` /`ALPHADESK_WIDGET_BACKENDS` | Provider plugins; external tile backends | \n| `NEWS_REFRESH_MINUTES` /`NEWS_LOOKBACK_HOURS` /`NEWS_KEEP_DAYS` | News poll interval (5), window (72 h), retention (7 days) | \n| `CHART_MIN_COVERAGE` /`CHART_MAX_MEDIAN_GAP_MIN` | The indicator coverage gate | \n| `DASHBOARD_HOST` /`DASHBOARD_PORT` | Web server bind (Cloud Run injects `PORT` ) | \n| `MCP_HOST` /`MCP_PORT` | Standalone agent server bind (default port 8010) | \n\nThe full annotated template is `alphadesk/deploy/env.example`; every\nsetting's default lives in `alphadesk/config.py`.\n\nThe reference service runs on **Google Cloud Run** (`alphadesk`, us-east4)\nwith **Cloud SQL for Postgres**.\n\n| Setting | Value | Why | \n|---|---|---|\n| Size | 2 vCPU, 4 GiB | The embedding model and the web server share the instance | \n| Instances | exactly 1 (min = max = 1) | One writer for the background loops and live sockets | \n| CPU | always allocated, startup boost | Background loops run between requests | \n| Image | Python 3.12 slim, PyTorch CPU build, model baked in (~1.2 GB) | Nothing is downloaded at start; model loads in seconds | \n\n**Deploying** — continuous integration runs the tests, lint and build on\nevery pull request; deploying stays a maintainer's step. After a merge to\n`main`:\n\n```\nscripts/deploy.sh\n```\n\nThe script refuses unless the checkout is a clean `main` matching the\nremote, builds the image on Cloud Build, rolls the service with the new\nimage only (environment, database mount and scaling untouched), and checks\nthat the live page serves the new build. The frontend bundle is committed\nunder `alphadesk/app/static`, so the image needs no Node build step.\n\n**Operations**\n\n- \nLogs: Cloud Logging for the `alphadesk` service; the ingest loops,\npruning and the embedding worker log their progress there.\n- \nAlways-on is required as built; approximate cost at this size is $110–120 a month for the service (plus Cloud SQL). The lever for cost is a smaller embedding model, not scaling to zero.\n- \nGraceful shutdown is bounded: a revision stops within seconds.\n- \n**Kill switch for search by meaning.** If the service ever slows or\nrefuses requests, turn it off without a rebuild — search falls back to\nwords alone:\n\n```\ngcloud run services update alphadesk --region us-east4 --update-env-vars ALPHADESK_SEMANTIC_SEARCH=off\n```\n\n Always use `--update-env-vars` (adds or changes one variable), never`--set-env-vars` (replaces every variable). The worker's start-up log line\nreports the cores the machine claims and the thread the model uses\n(expected: one).\n- \n**Background work is shipped switched off, then enabled and watched.** A\n2-vCPU container reports more cores than it has, so behaviour on a\nmany-core laptop does not predict production: sizing threads from the\nreported core count once starved the web server of a live instance.\n\n| Check | Command | Scope | \n|---|---|---|\n| Backend tests | `python -m pytest -q` | ~720 tests: providers, calendars, EDGAR parsing, news rules, search, agent tools, auth, accounts, retention | \n| Frontend tests | `cd alphadesk/ui && pnpm test` | Pure logic under `src/lib/__tests__` (chart scales, sessions, news matching, layouts) | \n| Type-check and build | `cd alphadesk/ui && pnpm build` | `tsc -b` (project references —`tsc --noEmit` checks nothing here) then Vite | \n| Lint | `python -m ruff check alphadesk` | Python | \n\n- **Vendor terms.** Market data is fetched on your own key, under your own\nagreement with each vendor, and those terms govern how you may use it.\nPlans differ — some are personal, some restrict display to others or\nstorage — so check your plan before using AlphaDesk in a hosted or shared\nsetting. Each vendor's terms are linked in[docs/data-sources.md](https://github.com/vigneshv1cky/alphadesk-terminal/blob/main/docs/data-sources.md) .\n- **Untested paths.** Some paid-plan surfaces (Alpha Vantage, Finnhub\npremium, Polygon paid) were built from documentation and have not been\nexercised against a live key.\n- **Search by meaning** reads headlines only (summaries would cost several\nCPU-hours a day per reader), and a new deployment embeds the stored\nbacklog before older stories can match by meaning.\n- **Legal pages** are drafts awaiting counsel.\n\nAlphaDesk became a consumption terminal by subtraction. Screener ranking,\noperator-held data and unofficial sources, the in-app agent and the in-app\nlanguage model were each removed in turn, every one for a measured or stated\nreason — see [DECISIONS.md](https://github.com/vigneshv1cky/alphadesk-terminal/blob/main/DECISIONS.md). The one model that remains is the\nself-hosted embedding model used for search.\n\nAlphaDesk is **dual-licensed**. Copyright © 2026 Vignesh Murugan.\n\n**Open source — GNU AGPL-3.0** ([LICENSE](https://github.com/vigneshv1cky/alphadesk-terminal/blob/main/LICENSE)). You may use, study,\nmodify and redistribute AlphaDesk. The AGPL is a strong copyleft licence with\none clause beyond the GPL: if you run a **modified** copy and let others use\nit **over a network**, you must offer those users the complete source of\nyour version under the same licence. Distributing copies, modified or not,\nlikewise carries the source with it. Running it for yourself imposes\nnothing.\n\n**Commercial licence.** For organisations that want to embed AlphaDesk in a\nproprietary product, run a modified hosted service without publishing their\nchanges, or need an enterprise exception, a commercial licence is available\n— contact **[muruganvignesh0810@gmail.com](mailto:muruganvignesh0810@gmail.com)**. The **managed cloud** is offered under its\nown terms of service; subscribers take on no AGPL obligations.\n\n**Contributions** are accepted under a [contributor licence agreement](https://github.com/vigneshv1cky/alphadesk-terminal/blob/main/CLA.md),\nso the project can continue to offer both licences; contributors keep the\ncopyright in their work.\n\n**Dependencies** are all under permissive licences (MIT, ISC, BSD, Apache\n2.0), and no copyleft dependency may be added — it would prevent the\ncommercial licence. The web interface ships its third-party notices at\n`/third-party-notices.txt`, written by every build from the packages the\nbundle actually contains (the fonts are under the SIL Open Font License). The embedding model, Qwen3-Embedding-0.6B, is Apache 2.0.\n\n**Data is not code.** The code licence grants nothing over market data. Each\nvendor's terms govern the data fetched on your key; see\n[docs/data-sources.md](https://github.com/vigneshv1cky/alphadesk-terminal/blob/main/docs/data-sources.md).", "url": "https://wpnews.pro/news/alphadesk-market-terminal-your-own-ai-agent-reads-over-mcp", "canonical_source": "https://github.com/vigneshv1cky/alphadesk-terminal", "published_at": "2026-09-20 02:45:39+00:00", "updated_at": "2026-09-20 02:52:49.465989+00:00", "lang": "en", "topics": ["ai-agents", "agent-protocols", "ai-tools", "ai-products"], "entities": ["AlphaDesk", "Claude", "ChatGPT", "Codex", "Cursor", "opencode", "SEC EDGAR", "US Treasury"], "alternates": {"html": "https://wpnews.pro/news/alphadesk-market-terminal-your-own-ai-agent-reads-over-mcp", "markdown": "https://wpnews.pro/news/alphadesk-market-terminal-your-own-ai-agent-reads-over-mcp.md", "text": "https://wpnews.pro/news/alphadesk-market-terminal-your-own-ai-agent-reads-over-mcp.txt", "jsonld": "https://wpnews.pro/news/alphadesk-market-terminal-your-own-ai-agent-reads-over-mcp.jsonld"}}