Updated September 16, 2026
MCP server
Give Claude Code, Codex, Cursor, or any MCP client Gloom's research tools, without a terminal running.
What it is
Gloom Cloud hosts a Model Context Protocol server at https://api.gloom.sh/mcp. It exposes the research tools Gloom's own assistant uses: quotes, history, financials, holders, analyst research, options, SEC filings and insiders, macro, congressional trades, short interest, options flow, the news wire, and the equity diagnostic. With the right access it also reaches your notes, your teams, and team watchlists and portfolios.
Nothing runs on your machine. It is part of Gloom Pro.
Use it when an agent needs Gloom's data. Use the remote API to drive a running desktop or TUI, and the CLI for one-off reports from a shell.
Connect
Sign in from the client. OAuth clients (Claude Code, claude.ai, Cursor, most recent MCP clients) only need the endpoint. The first call opens a browser tab where you sign in and choose what the client may reach.
claude mcp add --transport http gloom https://api.gloom.sh/mcpUse a key. For scripts, cron jobs, and clients that cannot open a browser, create a key in Cloud settings, Agents and send it as a bearer token (x-api-key also works). Keys are shown once; make one per agent, up to 10.
claude mcp add --transport http gloom https://api.gloom.sh/mcp \
--header "Authorization: Bearer gloom_mcp_..."export GLOOM_MCP_KEY=gloom_mcp_...
codex mcp add gloom --url https://api.gloom.sh/mcp --bearer-token-env-var GLOOM_MCP_KEY{
"mcpServers": {
"gloom": {
"url": "https://api.gloom.sh/mcp",
"headers": { "Authorization": "Bearer gloom_mcp_..." }
}
}
}Transport is Streamable HTTP, stateless: one JSON reply per POST, GET and DELETE answer 405. The authorization server is https://api.gloom.sh/auth with standard discovery, dynamic client registration, and PKCE; clients that request offline_access get a refresh token. Access tokens live two hours.
Access
| Access | Reaches |
|---|---|
| Market data | Market, company, filing, macro, and news tools |
| Read | Plus teams.list, notes.list, notes.get, collections.list, collections.get |
| Read and write | Plus notes.save, collections.add_symbol, collections.remove_symbol |
Keys carry their access and an optional team pin; a pinned key sees one team and can omit teamId. Signed-in clients get the same levels through the mcp:read and mcp:write scopes, which you can untick on the consent screen. tools/list only returns what the caller may call. Personal notes are always the account owner's own.
Tools
Every tool is read-only unless listed under write, validates its arguments, and caps its result at 256 KB. limit bounds source rows before the cap.
| Tool | Arguments |
|---|---|
market.search | query, limit |
market.quotes | symbols, exchange?, limit |
market.history | symbol, exchange?, interval, startDate?, endDate?, limit |
market.screener | category, limit |
market.options_chain | symbol, exchange?, expiration?, limit |
market.short_interest | symbol, years, limit |
market.options_flow | limit |
company.profile, company.financials, company.holders, company.analyst_research, company.corporate_actions | symbol, exchange?, limit |
company.statements | symbol, exchange?, period, limit |
sec.filings | ticker, offset, limit |
sec.insider_transactions | ticker, limit |
macro.calendar, macro.yield_curve | limit |
macro.series | seriesId, startDate?, endDate?, limit |
congress.house_trades | year?, member?, ticker?, limit |
news.stories | query?, feed, tickers, topics, limit |
equity.diagnostic | symbol, exchange?, mode, limit |
teams.list | limit |
notes.list | scope (user or team), teamId?, kind? (ticker or quick), limit |
notes.get | id |
notes.save (write) | scope, teamId?, kind, key, title?, content, expectedRevision? |
collections.list | teamId?, limit |
collections.get | teamId?, collectionId, limit |
collections.add_symbol (write) | teamId?, collectionId, symbol, exchange?, quantity?, note? |
collections.remove_symbol (write) | teamId?, collectionId, symbol, exchange? |
tools/list carries the full JSON schema with enums and defaults. Start with market.search when a ticker is ambiguous.
Notes are keyed: a ticker note by symbol, a quick note by any short name. notes.save replaces the whole note, so read first and pass expectedRevision; a newer edit returns revision_conflict instead of overwriting. Writes reach every team member's terminal immediately. quantity applies to portfolios only.
Results
Each call returns text plus structuredContent with the same fields:
| Field | Meaning |
|---|---|
status | ok, partial (a limit or the cap removed rows), or error |
shape | rows, bundle, series, or snapshot, naming the collection key in data |
rowCount, truncated, asOf | Size, whether rows were dropped, latest source timestamp |
data | rows, sections[].rows, series[].points, or items |
A failed source returns status: "error" with data.error = { code, source, reason }, marked as a tool error.
Plans and limits
Creating keys needs Pro. Any valid key or token can initialize and tools/list; tool calls need Pro and get realtime quotes and the live news wire. Keys allow 120 requests a minute and 5,000 a day; signed-in accounts share the per-minute limit. Every POST counts. Over the limit means 429 with Retry-After. If Pro lapses, keys and connections stay but tool calls are refused until it is back.
Security
Keys are hashed at rest and shown once; access and team pin are fixed at creation. Revoking a key applies on the next request. Disconnecting a client revokes its refresh token at once; a token it already holds expires within two hours. Tokens are bound to the MCP server as audience. A market data key cannot see notes, teams, layouts, or portfolios; write access changes notes and collection items and nothing else.