actually-mcp-server
Actually - Lo que realmente piensan los mercados
Una extensión de Chrome y un servidor MCP que colocan las probabilidades de los mercados de predicción sobre las noticias que ya estás leyendo.
Las noticias te dicen que «los expertos están preocupados» o que «las probabilidades están subiendo». Rara vez te dan un número. El número existe - en un mercado de predicción, donde la gente apuesta su propio dinero por el resultado. Lo que pasa es que vive en otra pestaña, y encontrarlo implica saber que ese mercado existe en primer lugar.
Actually cierra esa brecha. Abre un artículo, haz clic en el icono de la barra de herramientas y la extensión compara el texto con los mercados en directo de Polymarket y muestra la probabilidad del propio mercado. Sin cuenta, sin cartera, sin registro.

Qué hace
Empareja un artículo con un mercado. Un modelo de incrustación local (
Xenova/all-MiniLM-L12-v2, ~33 MB) puntúa el texto del artículo frente al conjunto de mercados en caché, potenciado por la coincidencia de palabras clave y números - los números importan porque el codificador es casi ciego a ellos, y «dip to $57,500» se incrusta casi igual que «reach $120,000».Se ejecuta en tu dispositivo. El modelo y el runtime de WASM se empaquetan en el momento de la compilación - no se descarga nada de una CDN ni al instalar ni en tiempo de ejecución, y con la configuración predeterminada el texto del artículo nunca sale de tu equipo.
Lee páginas en otros idiomas. Se traducen al inglés antes de la comparación, usando la API
Translatorintegrada de Chrome (local, sin red). Todas las preguntas de Polymarket están escritas en inglés, y el modelo local tiene 86 tokens cirílicos de 30522 - un titular ruso sin traducir se incrusta como ruido. Traducido, ese mismo titular obtiene una puntuación de 0.53-0.71 frente al mercado del que realmente trata, con un mínimo de 0.35.
Permite operar, opcionalmente. Conecta cualquier cartera WalletConnect v2 para hacer órdenes limitadas y de mercado, vender, cancelar órdenes pendientes y ver un panel de posiciones con el coste base y el P&L. Las claves y los fondos nunca los custodianos nosotros.
También sirve a agentes. Las mismas capacidades se exponen a través del Model Context Protocol:
check_news,get_market,place_order,sell_order,cancel_order,get_positions.
Related MCP server: Polymarket Predictions MCP
Uso del servidor MCP
El servidor MCP está publicado, así que no requiere clonar ni compilar. Añádelo a cualquier cliente MCP (Claude Desktop, Cursor o cualquier otra cosa que hable el protocolo):
{
"mcpServers": {
"actually": {
"command": "npx",
"args": ["actually-mcp-server"]
}
}
}Eso le da al agente las herramientas de señal - check_news y get_market - sin
clave y sin cartera. Pregúntale «¿qué piensan los mercados sobre esto?» con un
titular y te responde con el precio del propio mercado.
Las herramientas de trading solo aparecen si aportas una clave propia:
"env": {
"POLYMARKET_PRIVATE_KEY": "0x...",
"ACTUALLY_MAX_ORDER_USD": "100",
"ACTUALLY_DAILY_LIMIT_USD": "500"
}Ambos límites se aplican en el servidor mediante un registro de gasto
persistente, así que un agente no puede esquivarlos alegando otro precio.
redeem_position requiere además una aceptación explícita
(ACTUALLY_ENABLE_REDEEM=true) porque envía una transacción on-chain real y
sigue en pruebas.
Documentación completa, incluidas todas las variables de entorno y el
razonamiento detrás de las salvaguardas:
packages/mcp-server/README.md.
Listado en el registro oficial de MCP
como io.github.Sofiia7/actually, y en Glama:
Cómo encaja todo
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 embeddingsEl trabajo pesado vive en un documento offscreen porque los service workers de MV3 no pueden ejecutar WASM, mantener un WebSocket ni sobrevivir el tiempo suficiente para firmar una orden.
La caché de mercados contiene 2000 mercados abiertos con incrustaciones precalculadas y se reconstruye cada dos horas. La selección combina tres ordenaciones - volumen en 24 h, volumen histórico y actualidad - porque ordenar solo por volumen histórico es la estantería equivocada para una herramienta de noticias: un mercado abierto esta mañana bajo el titular de hoy no tiene historial y pierde siempre contra un mercado electoral de hace un año.
El Worker existe para que ningún cliente tenga que custodiar una credencial. Actúa de proxy ante las API de Polymarket, sirve la caché precalculada y actúa como firmante remoto para el relayer, de modo que la credencial del builder permanece en el servidor y nunca viaja dentro de una extensión.
Cómo ejecutarlo
npm install
npm run models:fetch -w extension # bundle the embedding model
npm run build -w extension # type-check + build to extension/distCarga extension/dist como extensión sin empaquetar en Chrome. Copia
extension/.env.example a .env.local y complétalo primero - la compilación
incorpora la URL del Worker, el id de proyecto de WalletConnect y el código del
builder.
npm test --workspaces # 686 tests across four workspacesPrivacidad
El descubrimiento es gratuito y no requiere cuenta. No hay content scripts: la página solo se lee cuando haces clic, y solo la pestaña activa. Con la configuración predeterminada (incrustaciones locales, traducción fuera del dispositivo), el texto del artículo no sale de tu equipo. La telemetría es opt-in y está desactivada por defecto.
Política completa: https://actually-api.sofiaseremeteva.workers.dev/privacy
Estado
La extensión está construida y superando sus controles de lanzamiento; el envío
a Chrome Web Store está en curso. actually-mcp-server está publicado en npm y
listado en el registro oficial de MCP.
El reembolso de una posición resuelta está en fase de pruebas: la autenticación del builder, la selección del contrato neg-risk y la protección de saldo cero se verifican por separado contra servicios en vivo, pero todavía no se ha observado un reembolso que recoja fondos de principio a fin.
El trading no está disponible en varias jurisdicciones (US, GB, FR, BE, AU, SG, TH, TW, PL y países sancionados); la restricción se aplica del lado del Worker. Ver las probabilidades funciona en todas partes.
Actually no ofrece asesoramiento financiero.
Licencia
Ver 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