Real Monte Carlo simulation of a compound event/conditional probability. Paid via x402.
Remote MCP server (Cloudflare Workers) with one tool that estimates a compound event or conditional probability by actually running a Monte Carlo simulation:
simulate_monte_carlo — declare named random variables (uniform, normal, bernoulli, binomial, poisson, exponential, discrete), an event boolean expression over those names (e.g. "a > 0.5 && b == 1"), and an optional condition expression to get a conditional probability P(event | condition) via rejection sampling. Real random sampling and real counting — not a model guess about what the probability should be.No database, no persistent state: each call builds a fresh McpServer (see createServer() in src/index.ts) and is self-contained. The PRNG is seedable (mulberry32): pass the seed returned in a previous response to reproduce the exact same result.
evalevent/condition are arbitrary caller-supplied strings. Running them through eval/Function would mean executing untrusted code inside the Worker. Instead, src/tools/monteCarlo.ts includes a small tokenizer + recursive-descent parser + AST interpreter that only understands numbers, declared variable names, arithmetic (+ - * /), comparisons (< <= > >= == !=), boolean logic (&& || !), parentheses, and a three-function whitelist (min, max, abs). There is no code execution path — the interpreter can't do anything beyond evaluate that narrow grammar.
Charges per call via x402 — real USDC payment on Base mainnet, against the Coinbase Developer Platform (CDP) facilitator. The payment travels inside the MCP JSON-RPC itself (_meta), not as an HTTP header; see src/payments.ts.
| Tool | Price |
|---|---|
simulate_monte_carlo | $0.03 USDC |
An unpaid tools/call returns isError: true with the accepts (network, amount, payTo) the client needs to pay and retry — not an unexplained exception.
src/
index.ts # registers the tool in the McpServer and exposes the MCP HTTP handler
payments.ts # x402 billing on Base mainnet via the CDP facilitator
tools/
monteCarlo.ts # distributions, expression parser/interpreter, simulation loop (testable without Workers)
monteCarlo.test.ts
scripts/
dev-node.ts # dev server that runs the handler in plain Node, no wrangler
Set from the start, not bolted on after: max 10 variables, 100–100,000 trials (default 10,000), 500-character expressions, binomial n ≤ 1,000, poisson lambda ≤ 1,000, and a discrete-outcome cap of 20. On top of the individual caps, a combined sampling-budget check (trials × sum(per-variable cost) ≤ 5,000,000) rejects combinations that would be individually within limits but jointly too expensive — e.g. 100,000 trials against a binomial(n=1000) variable.
⚠️ Note on wrangler dev: the real Cloudflare Workers runtime (workerd) requires macOS 13.5+. If your Mac has an older version, wrangler dev (and npm run dev) will fail. This project includes a plain-Node shim that runs the exact same fetch() handler without needing workerd.
npm install
npm test
npm run dev
wrangler dev fails because of the macOS versionnpm run dev:node
Starts at http://localhost:8787/mcp, reading CDP credentials from ~/.mcp-tools-factory-credentials.env (shared across all tools in this factory).
# 1) initialize
curl -s -X POST http://localhost:8787/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl-test","version":"0.0.1"}}}'
# 2) tools/list
curl -s -X POST http://localhost:8787/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}'
# 3) tools/call — simulate_monte_carlo (two dice, P(sum > 9 | first die == 6))
curl -s -X POST http://localhost:8787/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"simulate_monte_carlo","arguments":{"variables":[{"name":"d1","distribution":{"type":"discrete","values":[1,2,3,4,5,6],"weights":[1,1,1,1,1,1]}},{"name":"d2","distribution":{"type":"discrete","values":[1,2,3,4,5,6],"weights":[1,1,1,1,1,1]}}],"event":"d1 + d2 > 9","condition":"d1 == 6","trials":40000,"seed":3}}}'
Responses come as Server-Sent Events (event: message + data: {...}); the data: line is the usual JSON-RPC response.
Deployed at https://simulate-monte-carlo.encodari.workers.dev/mcp (Cloudflare Workers). Published on the official MCP registry, Smithery, mcp.so, and with an open PR to awesome-mcp-servers.
eip155:84532) during development, change NETWORK in src/payments.ts.src/payments.ts).This listing does not have a supported local package template. Use the maintainer’s documentation for its hosted endpoint, authentication, and client-specific setup. No install command has been inferred.