Skip to main content
Glama
Sofiia7

actually-mcp-server

Actually - What Markets Really Think

A Chrome extension and an MCP server that put prediction-market odds on top of the news you are already reading.

News tells you that "experts are concerned" or that "odds are rising". It rarely tells you a number. The number exists - on a prediction market, where people are betting their own money on the outcome. It just lives in another tab, and finding it means knowing such a market exists in the first place.

Actually closes that gap. Open an article, click the toolbar icon, and the extension matches the text against live Polymarket markets and shows the market's own probability. No account, no wallet, no signup.

A news article matched to a live Polymarket market

What it does

  • Matches an article to a market. A local embedding model (Xenova/all-MiniLM-L12-v2, ~33 MB) scores the article text against the cached market set, boosted by keyword and number overlap - numbers matter because the encoder is nearly blind to them, and "dip to $57,500" embeds almost identically to "reach $120,000".

  • Runs on your device. Model and WASM runtime are bundled at build time - nothing is fetched from a CDN at install or runtime, and on the default settings the article text never leaves the machine.

  • Reads non-English pages. They are translated to English before matching, using Chrome's own built-in Translator API (local, no network). Every Polymarket question is written in English, and the local model holds 86 Cyrillic tokens out of 30522 - an untranslated Russian headline embeds to noise. Translated, the same headline scores 0.53-0.71 against the market it is actually about, against a 0.35 floor.

    A German article matched to a Berlin election market

  • Trades, optionally. Connect any WalletConnect v2 wallet for limit and market orders, selling, cancelling resting orders, and a positions panel with cost basis and P&L. Keys and funds are never held by us.

  • Serves agents too. The same capabilities are exposed over the Model Context Protocol: check_news, get_market, place_order, sell_order, cancel_order, get_positions.

Related MCP server: Polymarket Predictions MCP

Using the MCP server

The MCP server is published, so it needs no clone and no build. Add it to any MCP client (Claude Desktop, Cursor, and anything else that speaks the protocol):

{
  "mcpServers": {
    "actually": {
      "command": "npx",
      "args": ["actually-mcp-server"]
    }
  }
}

That gives an agent the signal tools - check_news and get_market - with no key and no wallet. Ask it "what do markets think about this?" with a headline and it answers with the market's own price.

Trading tools appear only if you supply a key of your own:

"env": {
  "POLYMARKET_PRIVATE_KEY": "0x...",
  "ACTUALLY_MAX_ORDER_USD": "100",
  "ACTUALLY_DAILY_LIMIT_USD": "500"
}

Both caps are enforced server-side against a persisted spend ledger, so an agent cannot talk its way past them by claiming a different price. redeem_position needs a further explicit opt-in (ACTUALLY_ENABLE_REDEEM=true) because it submits a real on-chain transaction and is still in testing.

Full documentation, including every environment variable and the reasoning behind the guards: packages/mcp-server/README.md.

Listed in the official MCP registry as io.github.Sofiia7/actually, on mcpservers.org, and on Glama:

Listed on mcpservers.org

actually MCP server

How it fits together

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 embeddings

The heavy work lives in an offscreen document because MV3 service workers cannot run WASM, hold a WebSocket, or survive long enough to sign an order.

The market cache is 2000 open markets with precomputed embeddings, rebuilt every two hours. Selection blends three orderings - 24h volume, lifetime volume, and recency - because ranking by lifetime volume alone is the wrong shelf for a news tool: a market opened this morning under today's headline has no history and loses to a year-old election market every time.

The Worker exists so no client has to hold a credential. It proxies Polymarket's APIs, serves the precomputed cache, and acts as a remote signer for the relayer, so the builder credential stays on the server and never ships inside an extension.

Running it

npm install
npm run models:fetch -w extension   # bundle the embedding model
npm run build -w extension          # type-check + build to extension/dist

Load extension/dist as an unpacked extension in Chrome. Copy extension/.env.example to .env.local and fill it in first - the build bakes the Worker URL, the WalletConnect project id and the builder code.

npm test --workspaces               # 686 tests across four workspaces

Privacy

Discovery is free and needs no account. There are no content scripts: the page is read only when you click, and only the active tab. On the default settings (local embeddings, translation off-device) the article text does not leave your machine. Telemetry is opt-in and off by default.

Full policy: https://actually-api.sofiaseremeteva.workers.dev/privacy

Status

The extension is built and passing its release gates; the Chrome Web Store submission is in progress. actually-mcp-server is published on npm and listed in the official MCP registry.

Redeeming a resolved position is in testing: builder authentication, neg-risk contract selection and the zero-balance guard are each verified against live services, but no redeem has yet been observed collecting funds end to end.

Trading is unavailable in several jurisdictions (US, GB, FR, BE, AU, SG, TH, TW, PL, and sanctioned countries), enforced Worker-side. Viewing odds works everywhere.

Actually does not provide financial advice.

License

See LICENSE.

Available Tools

2 tools
check_newsA

Map a piece of news text to the relevant Polymarket market and return its objective YES probability. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It discloses that the probability comes from a precomputed cache on a cron cadence and may be up to ~2 hours stale, and it explicitly says the tool does not classify whether news is dramatized. These are non-obvious behaviors an agent must know. It could add error behavior for unmatched news, but the key operational traits are transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two focused sentences: the first states the core function, and the second adds necessary limitations and the routing alternative. Every sentence contributes value, and the key behavior is front-loaded. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter tool with no output schema, the description covers the main return values (YES probability and marketId), the data freshness caveat, and the alternative for live prices. It does not specify the exact response structure or behavior when no relevant market is found, but the essentials for correct invocation are present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does by clarifying that 'text' is a piece of news text used as the input for market mapping. This adds meaningful semantic context beyond the raw schema constraints of minLength and maxLength. Still, it could be more explicit about input shape expectations, but for a single free-text parameter it is adequate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Map a piece of news text to the relevant Polymarket market and return its objective YES probability.' It clearly distinguishes this tool from get_market by stating that the returned probability is an objective market anchor backed by news text, not a live price.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit context: this tool maps news to a market and returns a cached probability. It names the alternative get_market for live pricing before trading, which is a clear conditional routing. However, it does not explicitly state scenarios where check_news should not be used beyond the live-price case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_marketA

Look up a specific Polymarket market by id: details, live price, and an orderbook snapshot. Falls back to a direct Gamma lookup when the id is outside the precomputed cache's top markets by volume.

ParametersJSON Schema
NameRequiredDescriptionDefault
marketIdYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it delivers a genuinely non-obvious behavioral trait: lookups resolve through a precomputed cache and fall back to a direct Gamma lookup for ids outside the top markets by volume. It also previews return contents. It stops short of covering error behavior for unknown ids or latency differences between the two paths, but the most important behavioral disclosure is present.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero filler. The main purpose is front-loaded in the first sentence, and the fallback nuance earns the second. The jargon ('precomputed cache's top markets by volume', 'direct Gamma lookup') is dense but conveys precise information efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter tool with no output schema and no annotations, the description covers the essentials: purpose, expected return contents, and the one notable behavioral twist. The main gap is failure behavior — what happens when a market id is unknown even after the Gamma fallback — which is not addressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. 'By id' ties the sole parameter to the concept of a Polymarket market identifier, adding domain meaning the schema ('string', 'minLength 1') lacks. It doesn't specify id format or how to obtain one, but for a single parameter whose name is already self-explanatory, the compensation is adequate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('look up'), a specific resource (a Polymarket market by id), and the returned content (details, live price, orderbook snapshot). The market-data domain clearly separates it from the sibling check_news without needing an explicit comparison.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: when an agent has a market id and wants market details, this is the tool. However, there is no explicit when-to-use/when-not-to-use statement, no named alternative, and the fallback sentence describes internal resolution behavior rather than guiding tool selection relative to check_news.

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. Dates show when Glama detected each change.

  1. 2 tool updatesv0.1.7
    • First observedcheck_news
    • First observedget_market

TDQS

A4.4/5.0
Disambiguation5/5

check_news takes natural language news text and returns a market anchor with a cached YES probability, while get_market requires a specific marketId and returns live market and orderbook data. The input types and outputs are distinct, and the description explicitly frames them as complementary rather than overlapping.

Naming Consistency5/5

Both tool names follow the same snake_case verb_noun pattern: check_news and get_market. The verbs are simple and descriptive, with no mixed conventions or inconsistent styling.

Tool Count4/5

Two tools is lean, but the server appears intentionally narrow: it maps news to a Polymarket market and provides live market data. Both tools are necessary for that workflow, making the count slightly small but still reasonable.

Completeness5/5

For the stated purpose, the tool surface is complete: check_news handles the news-to-market mapping, and get_market provides the live price and orderbook follow-up referenced by check_news. The primary workflow has no obvious dead ends.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables 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
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables LLM agents to interact with Polymarket prediction markets, including market discovery, real-time pricing, analytics, account management, and trading with built-in safety guards.
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Sofiia7/actually'

If you have feedback or need assistance with the MCP directory API, please join our Discord server