mcp-tool-patterns

mcp-tool-patterns is a cursor rule for Cursor from 0xChron/polymarket-mcp. It costs 0 tokens per session (513 once invoked), scanned A, original, MIT.

A set of coding rules for adding MCP tools, which let an AI agent call external services through defined functions. It covers where formatters and tool handlers belong, how tools are registered, and how their descriptions should be written.

In plain words
What is it for?
Use it when adding or changing market, user, or similar MCP tools that call an API and return formatted text.
Why use it?
It gives contributors a consistent structure for new tools and helps prevent tools from being left unregistered or poorly documented.

Cursor rule for Cursor

Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

agentmods
npx agentmods add rules/0xchron/polymarket-mcp/mcp-tool-patterns
Clone the repo
git clone --depth 1 https://github.com/0xChron/polymarket-mcp

Made for: Cursor.

Per session 0 Nothing until a file matches its globs; then the whole rule loads.
When invoked 513 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. Scan, not verified.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5 $0.00000 $0.00513
Opus 5 $0.00000 $0.00257
Sonnet 5 $0.00000 $0.00103
Haiku 4.5 $0.00000 $0.00051

Measured 2d ago against content hash d58f6e038922, method: parsed. Prices are Anthropic first-party input rates as of 2026-08-30, from the pricing page.

Security

Grade A, and why

mcp-tool-patterns scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

.cursor/rules/mcp-tool-patterns.mdc · 57 lines

What it actually says

MCP Tool Patterns

Adding a Tool

  1. Formatter in utils/formatters.py — pure function, no I/O, returns markdown string
  2. Tool in tools/markets.py or tools/users.py@mcp.tool() async handler that calls API and returns text(formatter(data))
from polymarket_mcp.config import READ_ONLY_ANNOTATIONS, gamma_url
from polymarket_mcp.server import mcp
from polymarket_mcp.utils.helpers import get, text
from polymarket_mcp.utils.formatters import format_search_markets

@mcp.tool(annotations=READ_ONLY_ANNOTATIONS)
async def search_markets(query: str, limit: int = 5, active_only: bool = True):
    """Search Polymarket markets by title or description.
    Returns matching markets with: current price, liquidity, volume,
    end date, and active status."""
    params = {"q": query, "limit_per_type": limit, "events_status": "active" if active_only else None}
    data = await get(f"{gamma_url}/public-search", params=params)
    return text(format_search_markets(data))

New tool modules must be imported from tools/__init__.py so registration runs at startup.

Tool Docstrings

  • Become the agent-facing tool description — describe what is returned, not just parameters
  • Use multi-line docstrings for complex tools

Response Format

  • Formatters produce markdown (# / ## headers, key-value lines)
  • Always return via text() — wraps markdown in JSON-encoded MCP TextContent
  • Errors: err("message") for API failures; plain strings for input validation

Multi-API Tools

Use asyncio.gather(..., return_exceptions=True) and check each result:

portfolio_data, rank_data = await asyncio.gather(portfolio_task, rank_task, return_exceptions=True)
if isinstance(portfolio_data, Exception):
    return err(str(portfolio_data))

API Selection

  • Market discovery/details → gamma_url (from config.py)
  • User positions/portfolio/leaderboard → data_url (from config.py)
Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 2d ago First seen · 57 lines · 0 tokens per session scan A d58f6e038922

Subscribe to this mod's changes

mcp-tool-patterns is a cursor rule published in the GitHub repository 0xChron/polymarket-mcp (0 stars, last pushed 2mo ago), licensed MIT. It costs nothing until one of its globs matches a file; then it loads 513 tokens. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.