actually-mcp-server
Actually - 市场真正在想什么
一个 Chrome 扩展和一个 MCP 服务器,将预测市场的赔率叠加在 你正在阅读的新闻之上。
新闻会告诉你“专家感到担忧”或“赔率正在上升”。它 很少告诉你一个数字。这个数字是存在的——在预测市场上,人们 正用自己的钱押注结果。它只是活在另一个标签页里,而找到它意味着 你首先得知道有这样的市场存在。
Actually 弥合了这一差距。打开一篇文章,点击工具栏图标,扩展 就会将文本与实时的 Polymarket 市场进行匹配,并显示市场自身的 概率。无需账户、无需钱包、无需注册。

它的功能
将文章匹配到市场。 本地嵌入模型 (
Xenova/all-MiniLM-L12-v2,~33 MB)对文章文本与缓存的 市场集合进行评分,并通过关键词和数字的重叠进行增强——数字很重要, 因为编码器对它们几乎视而不见,“跌至 57,500 美元”的嵌入与 “达到 120,000 美元”几乎完全相同。在你的设备上运行。 模型和 WASM 运行时在构建时打包—— 安装或运行时不会从 CDN 获取任何内容,并且在默认设置下, 文章文本永远不会离开你的设备。
读取非英语页面。 它们会在匹配前被翻译成英语,使用 Chrome 自身内置的
TranslatorAPI(本地,无网络)。每个 Polymarket 问题都是用英语写的, 而本地模型在 30522 个 token 中仅包含 86 个西里尔字母 token——一条未翻译的 俄语标题嵌入后只会变成噪音。翻译后,同一标题针对它实际对应的市场 得分 0.53-0.71,而下限为 0.35。
可选交易。 连接任何 WalletConnect v2 钱包,即可进行限价单和 市价单、卖出、取消挂单,以及带有成本基础和盈亏(P&L)的持仓面板。 密钥和资金绝不由我们持有。
同样服务于智能体。 相同的能力通过 Model Context Protocol 暴露:
check_news、get_market、place_order、sell_order、cancel_order、get_positions。
Related MCP server: Polymarket Predictions MCP
使用 MCP 服务器
MCP 服务器已发布,因此无需克隆也无需构建。将它添加到任何 MCP 客户端(Claude Desktop、Cursor 以及其他任何支持该协议的 客户端):
{
"mcpServers": {
"actually": {
"command": "npx",
"args": ["actually-mcp-server"]
}
}
}这为智能体提供了信号工具——check_news 和 get_market——无需
密钥、无需钱包。用一个标题问它“市场对此怎么看?”,它就会用市场自身的
价格来回答。
只有在你提供自己的密钥时,交易工具才会出现:
"env": {
"POLYMARKET_PRIVATE_KEY": "0x...",
"ACTUALLY_MAX_ORDER_USD": "100",
"ACTUALLY_DAILY_LIMIT_USD": "500"
}这两个上限都会在服务器端依据持久化的支出账本强制执行,
因此智能体无法通过声称不同的价格来绕过它们。
redeem_position 需要进一步的显式选择加入
(ACTUALLY_ENABLE_REDEEM=true),因为它会提交真实的链上交易,
并且仍在测试中。
完整文档,包括每一个环境变量以及这些防护措施
背后的理由:packages/mcp-server/README.md。
已列入官方 MCP 注册表
名称为 io.github.Sofiia7/actually,同时收录于 Glama:
它是如何组合在一起的
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繁重的工作位于离屏文档中,因为 MV3 Service Worker 无法运行 WASM、无法保持 WebSocket,也无法存活足够长的时间来签署订单。
市场缓存包含 2000 个开放市场及其预计算的嵌入,每两小时 重建一次。市场选择混合了三种排序——24 小时成交量、累计成交量 和最近上线时间——因为仅按累计成交量排名对新闻工具来说是摆错了 货架:一个今天早上随今日头条开设的市场没有任何历史,每次都会 输给一年前的选举市场。
Worker 的存在是为了让任何客户端都无需持有凭证。 它代理 Polymarket 的 API、提供预计算的缓存,并充当中继器的 远程签名者,因此构建者凭证保留在服务器上,绝不会被打包进扩展里。
运行它
npm install
npm run models:fetch -w extension # bundle the embedding model
npm run build -w extension # type-check + build to extension/dist在 Chrome 中把 extension/dist 作为已解压的扩展加载。
先把 extension/.env.example 复制为 .env.local 并填写——
构建时会把 Worker URL、WalletConnect 项目 ID 和构建者代码打包进去。
npm test --workspaces # 686 tests across four workspaces隐私
发现功能是免费的,无需账户。没有任何内容脚本:只有当你点击时 才会读取页面,且只读取当前活动的标签页。在默认设置(本地嵌入、 设备端离线翻译)下,文章文本不会离开你的设备。遥测为自愿加入, 默认关闭。
完整政策:https://actually-api.sofiaseremeteva.workers.dev/privacy
状态
扩展已构建完成并通过其发布门槛;Chrome Web Store 的提交正在进行中。
actually-mcp-server 已发布到 npm,并列入官方 MCP 注册表。
赎回已结算持仓的功能正在测试中:构建者认证、负风险合约选择 和零余额防护都已对照线上服务逐一验证,但尚未观察到任何赎回在 端到端流程中成功归集资金。
交易在多个司法管辖区不可用(US、GB、FR、BE、AU、SG、TH、TW、PL 以及受制裁国家),由 Worker 端强制执行。查看赔率在任何地方都可以使用。
Actually 不提供财务建议。
许可证
参见 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