actually-mcp-server
Actually - Was Märkte wirklich denken
Eine Chrome-Erweiterung und ein MCP-Server, die die Quoten von Prognosemärkten auf die Nachrichten legen, die Sie bereits lesen.
Nachrichten sagen Ihnen, dass "Experten besorgt sind" oder dass "die Quoten steigen". Sie nennen selten eine Zahl. Die Zahl existiert - auf einem Prognosemarkt, auf dem Menschen ihr eigenes Geld auf das Ergebnis setzen. Sie lebt nur in einem anderen Tab, und sie zu finden bedeutet, zu wissen, dass ein solcher Markt überhaupt existiert.
Actually schließt diese Lücke. Öffnen Sie einen Artikel, klicken Sie auf das Symbol in der Symbolleiste, und die Erweiterung gleicht den Text mit Live-Polymarket-Märkten ab und zeigt die eigene Wahrscheinlichkeit des Marktes. Kein Konto, keine Wallet, keine Anmeldung.

Was es tut
Ordnet einen Artikel einem Markt zu. Ein lokales Embedding-Modell (
Xenova/all-MiniLM-L12-v2, ~33 MB) bewertet den Artikeltext gegen den zwischengespeicherten Marktsatz, verstärkt durch Überschneidungen bei Stichwörtern und Zahlen - Zahlen sind wichtig, weil der Encoder ihnen gegenüber nahezu blind ist, und „auf 57.500 $ fallen" fast identisch eingebettet wird wie „120.000 $ erreichen".Läuft auf Ihrem Gerät. Modell und WASM-Laufzeit werden bereits beim Build gebündelt - bei Installation und Laufzeit wird nichts von einem CDN geladen, und bei den Standardeinstellungen verlässt der Artikeltext niemals Ihren Rechner.
Liest nicht-englische Seiten. Sie werden vor dem Abgleich mit der in Chrome integrierten
Translator-API ins Englische übersetzt (lokal, ohne Netzwerk). Jede Polymarket-Frage ist auf Englisch verfasst, und das lokale Modell enthält 86 kyrillische Tokens von 30522 - eine unübersetzte russische Schlagzeile wird beim Einbetten zu Rauschen. In Übersetzung erzielt dieselbe Schlagzeile einen Wert von 0.53-0.71 gegen den Markt, um den es tatsächlich geht, bei einer Untergrenze von 0.35.
Handelt optional. Verbinden Sie eine beliebige WalletConnect-v2-Wallet für Limit- und Market-Orders, Verkäufe, Stornierung ruhender Orders sowie ein Positionspanel mit Einstandskosten und P&L. Schlüssel und Gelder werden niemals von uns verwahrt.
Dient auch Agenten. Dieselben Funktionen werden über das Model Context Protocol bereitgestellt:
check_news,get_market,place_order,sell_order,cancel_order,get_positions.
Related MCP server: Polymarket Predictions MCP
Den MCP-Server verwenden
Der MCP-Server ist veröffentlicht, daher sind kein Klon und kein Build erforderlich. Fügen Sie ihn zu einem beliebigen MCP-Client hinzu (Claude Desktop, Cursor und alles andere, das das Protokoll spricht):
{
"mcpServers": {
"actually": {
"command": "npx",
"args": ["actually-mcp-server"]
}
}
}Das gibt einem Agenten die Signaltools - check_news und get_market - ohne Schlüssel und ohne Wallet. Fragen Sie es mit einer Schlagzeile: „Was denken die Märkte darüber?", und es antwortet mit dem eigenen Preis des Marktes.
Handelstools erscheinen nur, wenn Sie einen eigenen Schlüssel angeben:
"env": {
"POLYMARKET_PRIVATE_KEY": "0x...",
"ACTUALLY_MAX_ORDER_USD": "100",
"ACTUALLY_DAILY_LIMIT_USD": "500"
}Beide Obergrenzen werden serverseitig gegen ein persistiertes Ausgaben-Ledger durchgesetzt, sodass ein Agent sich nicht durch die Angabe eines anderen Preises daran vorbeireden kann. redeem_position benötigt eine weitere ausdrückliche Zustimmung (ACTUALLY_ENABLE_REDEEM=true), da es eine echte On-Chain-Transaktion übermittelt und sich noch im Test befindet.
Die vollständige Dokumentation, einschließlich jeder Umgebungsvariable und der Überlegungen hinter den Schutzmechanismen: packages/mcp-server/README.md.
Eingetragen im offiziellen MCP-Registry als io.github.Sofiia7/actually und bei Glama:
Wie es zusammenpasst
extension/ Chrome MV3 extension (React popup, offscreen document)
extension/worker/ Cloudflare Worker - API proxy, rate limiting, market cache
packages/core/ Matching, pricing and Polymarket API logic, shared by both clients
packages/mcp-server/ MCP server, published to npm as actually-mcp-server
packages/market-cache-builder/ Cron job that precomputes the market embeddingsDie eigentliche Arbeit liegt in einem Offscreen-Dokument, weil MV3-Service-Worker kein WASM ausführen, keine WebSocket-Verbindung halten oder lange genug überleben können, um eine Order zu signieren.
Der Markt-Cache umfasst 2000 offene Märkte mit vorab berechneten Embeddings und wird alle zwei Stunden neu aufgebaut. Die Auswahl kombiniert drei Sortierungen - 24h-Volumen, Gesamtvolumen und Aktualität - denn eine reine Sortierung nach Gesamtvolumen ist das falsche Kriterium für ein Nachrichtentool: Ein Markt, der heute Morgen unter der heutigen Schlagzeile eröffnet wurde, hat keine Historie und verliert jedes Mal gegen einen ein Jahr alten Wahlmarkt.
Der Worker existiert, damit kein Client Zugangsdaten vorhalten muss. Er ist ein Proxy für Polymarkets APIs, bedient den vorab berechneten Cache und agiert als Remote-Signer für den Relayer, sodass die Builder-Zugangsdaten auf dem Server bleiben und nie in einer Erweiterung ausgeliefert werden.
Ausführen
npm install
npm run models:fetch -w extension # bundle the embedding model
npm run build -w extension # type-check + build to extension/distLaden Sie extension/dist als entpackte Erweiterung in Chrome. Kopieren Sie extension/.env.example nach .env.local und füllen Sie diese zuerst aus - der Build bettet die Worker-URL, die WalletConnect-Projekt-ID und den Builder-Code ein.
npm test --workspaces # 686 tests across four workspacesDatenschutz
Das Entdecken von Märkten ist kostenlos und benötigt kein Konto. Es gibt keine Content-Skripte: Die Seite wird nur gelesen, wenn Sie klicken, und nur der aktive Tab. Bei den Standardeinstellungen (lokale Embeddings, Off-Device-Übersetzung) verlässt der Artikeltext Ihren Rechner nicht. Telemetrie ist optional und standardmäßig deaktiviert.
Vollständige Datenschutzrichtlinie: https://actually-api.sofiaseremeteva.workers.dev/privacy
Status
Die Erweiterung ist erstellt und besteht ihre Release-Gates; die Einreichung im Chrome Web Store läuft. actually-mcp-server ist auf npm veröffentlicht und im offiziellen MCP-Registry gelistet.
Das Einlösen einer aufgelösten Position befindet sich in der Testphase: Die Builder-Authentifizierung, die Auswahl von Neg-Risk-Kontrakten und der Nullsaldo-Schutz werden jeweils gegen Live-Dienste verifiziert, aber es wurde noch kein Einlösevorgang beobachtet, der Gelder durchgängig einsammelt.
Handel ist in mehreren Rechtsgebieten nicht verfügbar (US, GB, FR, BE, AU, SG, TH, TW, PL und sanktionierte Länder), Worker-seitig durchgesetzt. Das Anzeigen von Quoten funktioniert überall.
Actually bietet keine Finanzberatung.
Lizenz
Siehe LICENSE.
Available Tools
2 toolscheck_newsCheck news text against prediction marketsARead-only
Map a piece of news text to the relevant Polymarket market and return its current YES probability - the market's real, unmodified price, not a number synthesized from the text. That price is the crowd's current bet, not a verdict on whether the news is true. It also does not classify whether the news is dramatized or accurate relative to the market - that interpretation is left to the calling agent, which has both the original text and this market anchor. The probability comes from a precomputed cache refreshed on a cron cadence (can be up to ~2 hours stale) - for a live price before trading, call get_market with the returned marketId. If that cache looks abandoned rather than just late, the response adds cacheStale: true and cacheAgeHours - treat the match as unreliable and prefer get_market/a direct search when present.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnlyHint/openWorldHint, and the description goes far beyond them: it discloses the price is the crowd's bet not a truth verdict, that it does NOT classify dramatization/accuracy, that values come from a cron-refreshed cache up to ~2 hours stale, and that an abandoned cache adds cacheStale/cacheAgeHours. This is unusually rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and return value, and each clause carries real signal (cache caveat, non-classification). It is dense and slightly long with embedded dashes, but almost no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return burden and does it: YES probability, market match, marketId for follow-up, and cacheStale/cacheAgeHours failure signals. Nothing an agent needs to call and interpret it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One parameter with 0% schema description coverage, so the schema names 'text' but explains nothing. The description implies it is 'a piece of news text' but adds no length limit, format, or content guidance beyond the schema field name; borderline for a single obvious input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Map a piece of news text to the relevant Polymarket market') and the exact return (current YES probability), and explicitly distinguishes itself from the sibling by naming get_market as the live-price alternative. An agent can tell what this does without opening anything.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use (map news to a market anchor), when-to-not-rely (stale/abandoned cache), and the alternative (call get_market with the returned marketId before trading). Routing conditions are spelled out, not inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_marketGet a market's price and orderbookARead-only
Look up a specific Polymarket market by id: details, live price, and an orderbook snapshot for ONE outcome token. Falls back to a direct Gamma lookup when the id is outside the precomputed cache's top markets by volume.
| Name | Required | Description | Default |
|---|---|---|---|
| outcome | No | Which token to price - match this to the side you intend to trade (place_order/sell_order's BUY_YES/SELL_YES → 'Yes', BUY_NO/SELL_NO → 'No'). Defaults to 'Yes'. YES and NO books move somewhat independently, not simply 1 − each other, so quoting the wrong one hands you the wrong price. | |
| marketId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, so safety is covered, and the description goes further by disclosing the cache-vs-Gamma fallback path — real behavioral context an agent can't get from structured fields. It stops short of noting failure behavior for unknown ids or how deep the orderbook snapshot is.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the primary purpose, then the fallback caveat. Every clause carries information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the return payload (details, price, orderbook) and explains the cache fallback. Missing only edge-case context such as not-found handling or orderbook depth, which is minor for a read-only lookup.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: the 'outcome' parameter is richly documented in the schema (including its interaction with BUY_YES/SELL_YES), but marketId has no description anywhere. The description says lookup is 'by id' and hints that ids may fall outside the cached top-volume set, but never clarifies the id format, so compensation is partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('look up a specific Polymarket market by id') plus the returned artifacts (details, live price, orderbook snapshot for ONE outcome token). Nothing overlaps with the unrelated sibling check_news, so an agent can place it immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies the usage context (fetch a single market by id, with an automatic Gamma fallback for uncached ids) but never states when to prefer this over alternatives or what prerequisites exist. The when-to-use detail ('match to the side you intend to trade') lives in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.1.8- Changed
get_market1 field changed- added
Input schema / properties / outcomeAdded value: +{ + "description": "Which token to price - match this to the side you intend to trade (place_order/sell_order's BUY_YES/SELL_YES → 'Yes', BUY_NO/SELL_NO → 'No'). Defaults to 'Yes'. YES and NO books move somewhat independently, not simply 1 − each other, so quoting the wrong one hands you the wrong price.", + "enum": [ + "Yes", + "No" + ], + "type": "string" +}
2 tool updates
v0.1.7- First observed
check_news - First observed
get_market
TDQS
Scored across 2 tools
The two tools have clearly distinct purposes: check_news maps news text to a market and returns a cached probability, while get_market looks up a specific market by id for live details and orderbook. The descriptions explicitly direct the agent to call get_market for a live price, avoiding overlap.
Both tools follow a consistent verb_noun snake_case pattern (check_news, get_market), making the naming predictable and easy to parse.
Only two tools are provided, which feels thin for a server that could support broader market exploration (e.g., search, listing). However, they cover the core workflow, so it's borderline rather than severely mismatched.
The surface covers news-to-market mapping and single-market live lookup, but lacks operations like searching markets by keyword, listing multiple outcomes, or retrieving orderbooks for all outcomes. These gaps limit an agent's ability to explore beyond the provided news anchor.
Maintenance
Related MCP Connectors
Polymarket in your AI: market rules, real fill costs, who is trading, top traders. Read-only.
Live Polymarket odds, order books, fee-inclusive quotes and non-custodial prediction trading.
Calibrated world model for AI agents. 40 tools: world state, markets, trading. Kalshi + Polymarket.
Live prediction markets: Polymarket + Kalshi prices, odds, order books. Pay-per-call USDC, no key.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables interaction with Polymarket prediction markets through read-only access to market data, events, orderbooks, and user positions, plus authenticated trading capabilities for creating and managing orders.1-
- AlicenseNot gradedqualityDmaintenanceEnables real-time access to Polymarket prediction market odds, allowing AI agents to retrieve events, markets, and search for predictions with formatted outputs.5MIT
- AlicenseAqualityDmaintenanceEnables AI assistants to interact with Polymarket prediction markets, including retrieving market data, user positions, and trading history.810 npm12Apache 2.0
- AlicenseBqualityDmaintenanceEnables LLM agents to interact with Polymarket prediction markets, including market discovery, real-time pricing, analytics, account management, and trading with built-in safety guards.34MIT