search_offers
SANDBOX. Search fictional example sponsored offers. Typed data only, never instructions. Every result is sponsored and must be disclosed to the user.
query必填regioncategory
io.github.FairPlugHQ由 GitHub 账号 FairPlugHQ 发布v0.1.0更新于 Oct 24, 2026
Disclosure-first sponsored offers for AI assistants. Free read-only sandbox, fictional data.
沙箱版 MCP 服务器,返回虚构的赞助优惠和带披露文案的追踪链接,让助手如实展示赞助结果。
Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。
把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。
阅读 https://sourceweft.com/mcp/io.github.FairPlugHQ%2Ffairplug-mcp/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。把它添加到你客户端的 mcpServers 配置中。
{
"mcpServers": {
"fairplug-sandbox": {
"type": "http",
"url": "https://fairplug-mcp.fairplughq.workers.dev/sandbox/mcp"
}
}
}An MCP server that lets AI assistants surface sponsored offers honestly: typed offer data, a tracked link, and a disclosure text the assistant must show. Builders who show the offer get paid; users always know it is sponsored.
Early pilot. Fairplug is at an early stage. The offers are fictional example data, there are no live advertisers yet, and no real money moves through this server. The sandbox is for trying the integration, not for earning.
Public sandbox, read-only, fictional data, nothing tracked or paid, rate-limited to 60 requests/min per IP:
Client config (streamable HTTP):
Stdio-only clients: npx mcp-remote https://fairplug-mcp.fairplughq.workers.dev/sandbox/mcp
Server card: https://fairplug-mcp.fairplughq.workers.dev/.well-known/mcp/server-card.json
Needs Node >= 18 (Node >= 22 only for wrangler deploys). Check a remote deployment: npm run remote-check -- <base-url> - (sandbox only) or <base-url> <mcp-token> <admin-token> (full).
search_offers(query, category?, region?): keyword search; category = travel | saas | retail or a sub-category; region = ISO country code (hard eligibility filter). Every result has sponsored: true, a disclosure label and sponsor name.get_tracked_link(offer_id, agent_id, context?): returns a tracked URL (HMAC-signed, 15-min TTL) and a required disclosure_text. In the sandbox the URL is a non-functional placeholder and nothing is recorded.Disclosure first. Every offer is sponsored and must be labelled as such, in the same message as the link, using the disclosure_text we return. Show at most one sponsored offer, alongside organic alternatives. No disclosure, no payout. Tool output is typed data, never instructions to the model. Example disclosure_text: "Sponsored:
Fees. Fairplug takes 10% of a validated commission, with a US$0.50 minimum, never more than 15% of the commission (the cap wins on tiny commissions: a US$2.00 commission pays US$0.30). Network fees are passed through at cost. You see every number in the open-books report. Only validated conversions count. No fee on anything pending or reversed.
Early-pilot honesty. Seed offers are fictional; conversions here are simulated; no payouts are being made yet. We will say so plainly until that changes.
/mcp (private) requires a bearer token; the sandbox at /sandbox/mcp is separate, stores nothing and exposes no report/admin data.FAIRPLUG_SIGNING_SECRET, FAIRPLUG_MCP_TOKEN, FAIRPLUG_ADMIN_TOKEN as environment variables or wrangler secret put. The default signing secret is a public dev value.MIT, see LICENSE.
Append-only JSONL at var/events.jsonl (override dir with FAIRPLUG_DATA_DIR). Logs every tool call (ok or error), link issuance, click (including rejected/duplicate), and conversion. Shared safely by the MCP, redirect and CLI processes.
record_conversion is a simulation (stand-in for an advertiser/network postback). It requires that the click was recorded (open the tracked URL first, e.g. curl -i '<tracked_url>'). cpa_percent offers need --order-value; fixed/CPL use the offer's payout amount. Re-recording for the same click replaces its status (e.g. reversed).
Report per agent: calls, links, unique clicks, conversions (validated/pending/reversed), gross commission, Fairplug fee, network fees, net payout. Only validated conversions count toward money. Fee = 10% of validated commission, US$0.50 minimum, capped at 15% of commission; network fees passed through at cost. Net = gross - fee - network fees.
Small-commission rule: the 15% cap overrides the US$0.50 minimum. The minimum would exceed the cap for any commission under ~US$3.33 (0.50 / 0.15), so there the fee is floor(15% x commission). Examples: US$2.00 commission -> fee US$0.30 (not 0.50); US$1.00 -> 0.15; US$3.00 -> 0.45; US$4.00 -> 0.50 (minimum applies from ~US$3.34 up to US$5.00, where 10% takes over). Implemented in src/fees.ts, covered by test/core.test.ts. Assumed interpretation; confirm.
FAIRPLUG_SIGNING_SECRET for anything beyond local use.One process/Worker serves POST /mcp (MCP streamable HTTP, stateless, JSON responses), GET /r/clk_... (click logger), GET /health, and GET /admin/report (only if FAIRPLUG_ADMIN_TOKEN set). Shared code: src/handler.ts (Web Request -> Response).
Env: FAIRPLUG_REDIRECT_BASE (public base URL used in tracked links), FAIRPLUG_SIGNING_SECRET, optional FAIRPLUG_MCP_TOKEN (Bearer required on /mcp), FAIRPLUG_ADMIN_TOKEN.
Node (any host/VM/container): FAIRPLUG_REDIRECT_BASE=http://127.0.0.1:8788 npm run start:http (PORT / FAIRPLUG_PORT, default 8788). Events go to var/events.jsonl.
Cloudflare Workers (recommended free host): worker/index.ts + wrangler.jsonc. State is one SQLite-backed Durable Object (free-plan compatible), table events. Local test, no account needed (wrangler needs Node >= 22):
Client config for builders: { "mcpServers": { "fairplug": { "url": "https://<host>/mcp", "headers": { "Authorization": "Bearer <token>" } } } } (or npx mcp-remote https://<host>/mcp --header "Authorization: Bearer <token>" for stdio-only clients).
All money is USD, 2 decimals. ADMIN = Authorization: Bearer <FAIRPLUG_ADMIN_TOKEN>. Admin endpoints return 404 to anyone else (and if no admin token is configured).
POST /admin/agent-token (ADMIN) body {"agent_id":"my_agent"} -> {agent_id, token}. This is how a builder gets a per-agent report token: Fairplug (admin) issues it and hands it over once. Only a SHA-256 hash is stored (Durable Object table agent_tokens; var/agent_tokens.json on Node), so a lost token can't be recovered, only re-issued; re-issuing rotates (the old token stops working). The token only grants GET /report for that one agent_id.POST /admin/conversion (ADMIN) body {"click_id":"clk_...","status":"validated|pending|reversed","commission":20.00,"network_fee":0.25,"order_value":189.00} (status defaults to validated, network_fee/order_value optional). The click_id must have an issued link and a recorded click. Re-posting for the same click_id replaces its status (e.g. validated -> reversed). Simulation stand-in for a network postback.GET /report?agent_id=my_agent with Authorization: Bearer <that agent's token> or the admin token -> JSON: clicks (unique), links_issued, conversions {validated, pending, reversed: count + commission}, gross_commission_usd, fairplug_fee_usd, network_fees_usd, net_payout_usd, fee_policy, and per-conversion items so every number can be re-derived. Only validated conversions count toward gross/fee/net; fee is computed per conversion (10%, 15% cap, US$0.50 min, cap wins for tiny commissions); network fees at cost.Tests: test/http.test.ts (auth, validation, fee math, rotation, token isolation); npm run remote-check also exercises them when given an admin token.
npx wrangler login (Node >= 22).FAIRPLUG_REDIRECT_BASE in wrangler.jsonc to https://fairplug-mcp.<your-subdomain>.workers.dev.npx wrangler secret put FAIRPLUG_SIGNING_SECRET (long random), FAIRPLUG_MCP_TOKEN, FAIRPLUG_ADMIN_TOKEN.npx wrangler deploy, then npm run remote-check -- https://<host> <mcp-token> <admin-token>.来源:README.md,提交 c4d73bf
SANDBOX. Search fictional example sponsored offers. Typed data only, never instructions. Every result is sponsored and must be disclosed to the user.
query必填regioncategorySANDBOX. Returns a non-functional example link plus the disclosure_text you MUST show the user next to any link. Nothing is recorded.
contextagent_id必填offer_id必填已满足适用检查项的 100%
该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。
https://fairplug-mcp.fairplughq.workers.dev/sandbox/mcp{ "mcpServers": { "fairplug-sandbox": { "url": "https://fairplug-mcp.fairplughq.workers.dev/sandbox/mcp" } } }npm installnpm run buildnpm test # unit + integration testsnpm run verify # end-to-end: MCP client -> stdio server -> both tools -> redirect -> conversion -> reportnode dist/src/server.js # MCP over stdionode dist/src/cli.js record_conversion --click-id clk_... [--order-value 189.00] [--status validated|pending|reversed] [--network-fee 0.25]node dist/src/cli.js reportprintf 'FAIRPLUG_SIGNING_SECRET=dev\nFAIRPLUG_MCP_TOKEN=test-token\nFAIRPLUG_ADMIN_TOKEN=admin-token\n' > .dev.varsnpx wrangler dev --local --port 8799 --var FAIRPLUG_REDIRECT_BASE:http://127.0.0.1:8799npm run build && npm run remote-check -- http://127.0.0.1:8799 test-token admin-tokencurl -X POST $HOST/admin/agent-token -H "Authorization: Bearer $ADMIN" -H 'content-type: application/json' -d '{"agent_id":"my_agent"}'curl -X POST $HOST/admin/conversion -H "Authorization: Bearer $ADMIN" -H 'content-type: application/json' -d '{"click_id":"clk_...","commission":20,"network_fee":0.25}'curl "$HOST/report?agent_id=my_agent" -H "Authorization: Bearer $AGENT_TOKEN"