Skip to main content
Glama
Sofiia7

actually-mcp-server

Actually - 시장이 실제로 생각하는 것

이미 읽고 있는 뉴스 위에 예측 시장의 확률을 얹어 주는 Chrome 확장 프로그램이자 MCP 서버입니다.

뉴스는 "전문가들이 우려하고 있다"거나 "확률이 높아지고 있다"고 말합니다. 숫자를 알려 주는 경우는 드뭅니다. 그 숫자는 존재합니다. 예측 시장에 말이죠. 사람들이 결과에 자신의 돈을 거는 곳입니다. 다만 그 숫자는 다른 탭에 있고, 그 숫자를 찾으려면 먼저 그런 시장이 존재한다는 사실을 알아야 합니다.

Actually가 그 간극을 메웁니다. 기사를 열고 툴바 아이콘을 클릭하면, 확장 프로그램이 텍스트를 실시간 Polymarket 시장과 대조해 그 시장 자체의 확률을 보여 줍니다. 계정도, 지갑도, 가입도 필요 없습니다.

뉴스 기사가 실시간 Polymarket 시장과 매칭된 모습

기능

  • 기사를 시장에 매칭합니다. 로컬 임베딩 모델(Xenova/all-MiniLM-L12-v2, 약 33MB)이 캐시된 시장 집합을 기준으로 기사 텍스트에 점수를 매기고, 키워드와 숫자 중복으로 가중치를 높입니다. 숫자가 중요한 이유는 인코더가 숫자를 거의 인식하지 못하기 때문입니다. "dip to $57,500"은 "reach $120,000"과 거의 동일하게 임베딩됩니다.

  • 사용자 기기에서 실행됩니다. 모델과 WASM 런타임은 빌드 시점에 번들로 포함되며, 설치 시나 실행 시 CDN에서 아무것도 가져오지 않습니다. 기본 설정에서는 기사 텍스트가 기기를 벗어나지 않습니다.

  • 비영어 페이지를 읽습니다. 매칭 전에 Chrome에 내장된 Translator API(로컬, 네트워크 없음)를 사용해 영어로 번역합니다. 모든 Polymarket 질문은 영어로 작성되며, 로컬 모델은 30522개의 토큰 중 86개의 키릴 문자 토큰만 보유합니다. 번역되지 않은 러시아어 헤드라인은 노이즈로 임베딩됩니다. 번역하면 같은 헤드라인이 실제로 관련된 시장에 대해 0.35의 하한선 대비 0.53-0.71의 점수를 얻습니다.

    베를린 선거 시장에 매칭된 독일어 기사

  • 선택적으로 거래합니다. 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"
}

두 상한 모두 영속적인 지출 원장(spend ledger)을 기준으로 서버 측에서 적용되므로, 에이전트가 다른 가격을 주장하며 우회할 수 없습니다. redeem_position은 실제 온체인 트랜잭션을 제출하고 아직 테스트 중이므로 추가로 명시적인 옵트인(ACTUALLY_ENABLE_REDEEM=true)이 필요합니다.

모든 환경 변수와 가드의 근거를 포함한 전체 문서: packages/mcp-server/README.md.

공식 MCP 레지스트리에 io.github.Sofiia7/actually로 등재되어 있으며, Glama에도 있습니다:

actually MCP server

구성이 맞물리는 방식

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

무거운 작업은 **오프스크린 문서(offscreen document)**에서 이루어집니다. MV3 서비스 워커는 WASM을 실행할 수 없고, WebSocket을 유지할 수 없으며, 주문에 서명할 만큼 오래 유지되지 않기 때문입니다.

시장 캐시는 사전 계산된 임베딩을 가진 2000개의 개설 시장으로, 두 시간마다 다시 구축됩니다. 선택 기준은 24시간 거래량, 누적 거래량, 최신성이라는 세 가지 순서를 혼합합니다. 누적 거래량만으로 순위를 매기는 것은 뉴스 도구에 맞지 않는 기준이기 때문입니다. 오늘 아침 오늘의 헤드라인 아래 개설된 시장은 이력이 없어서 항상 1년 된 선거 시장에 밀립니다.

Worker는 어떤 클라이언트도 자격 증명을 보관할 필요가 없도록 존재합니다. Polymarket의 API를 프록시하고, 사전 계산된 캐시를 제공하며, 릴레이어(relayer)의 원격 서명자 역할을 합니다. 따라서 빌더 자격 증명은 서버에 남고 확장 프로그램 안에 포함되어 배포되지 않습니다.

실행하기

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 레지스트리에 등재되어 있습니다.

해결된 포지션의 상환은 테스트 중입니다. 빌더 인증, 네거티브 리스크(neg-risk) 계약 선택, 제로 잔액 가드는 각각 라이브 서비스로 검증되었지만, 아직 종단 간 자금을 수령하는 상환은 관찰되지 않았습니다.

거래는 여러 국가/지역(US, GB, FR, BE, AU, SG, TH, TW, PL, 제재 대상 국가)에서 이용할 수 없으며, Worker 측에서 적용됩니다. 확률 보기는 모든 곳에서 작동합니다.

Actually는 금융 조언을 제공하지 않습니다.

라이선스

LICENSE를 참조하세요.

Available Tools

2 tools
check_newsCheck news text against prediction marketsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 orderbookA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
outcomeNoWhich 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.
marketIdYes

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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. 1 tool updatev0.1.8
    • Changedget_market1 field changed
      • addedInput schema / properties / outcome
        Added 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. 2 tool updatesv0.1.7
    • First observedcheck_news
    • First observedget_market

TDQS

A4.1/5.0

Scored across 2 tools

Disambiguation5/5

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.

Naming Consistency5/5

Both tools follow a consistent verb_noun snake_case pattern (check_news, get_market), making the naming predictable and easy to parse.

Tool Count3/5

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.

Completeness3/5

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

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
    B
    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.
    34
    MIT