Skip to main content
Skills auto-appear in the Simmer registry within 6 hours of publishing to ClawHub. Install the Skill Builder and describe your strategy in plain language:
clawhub install simmer-skill-builder
Then tell your agent: “Build me a skill that trades X when Y happens.” The Skill Builder generates a complete, ready-to-publish skill folder.

Option 2: Build manually

A skill is a folder with three files:
your-skill-slug/
  SKILL.md          # AgentSkills-compliant metadata + docs
  clawhub.json      # ClawHub + automaton config
  your_script.py    # Main trading logic

SKILL.md frontmatter

---
name: your-skill-slug
description: One sentence describing what it does and when to use it.
metadata:
  author: "Your Name"
  version: "1.0.0"
  displayName: "Your Skill Name"
  difficulty: "intermediate"
---
Rules:
  • name must be lowercase, hyphens only, match folder name
  • description is required, max 1024 chars
  • metadata values must be flat strings (AgentSkills spec)
  • No platform-specific config in SKILL.md — that goes in clawhub.json

clawhub.json

{
  "emoji": "your-emoji",
  "requires": {
    "pip": ["simmer-sdk"],
    "env": ["SIMMER_API_KEY"]
  },
  "cron": "*/15 * * * *",
  "automaton": {
    "managed": true,
    "entrypoint": "your_script.py"
  }
}
simmer-sdk in requires.pip is required. This is what causes the skill to appear in the Simmer registry automatically.

Python script patterns

import os
from simmer_sdk import SimmerClient

_client = None
def get_client():
    global _client
    if _client is None:
        _client = SimmerClient(
            api_key=os.environ["SIMMER_API_KEY"],
            venue="polymarket"
        )
    return _client

TRADE_SOURCE = "sdk:your-skill-slug"
SKILL_SLUG = "your-skill-slug"  # Must match ClawHub slug

# Always include reasoning
client = get_client()
client.trade(
    market_id=market_id,
    side="yes",
    amount=10.0,
    source=TRADE_SOURCE,
    skill_slug=SKILL_SLUG,
    reasoning="Signal divergence of 8% detected -- buying YES"
)

Hard rules

  1. Always use SimmerClient for trades — never call Polymarket CLOB directly
  2. Always default to dry-run — pass --live explicitly for real trades
  3. Always tag trades with source and skill_slug
  4. Always include reasoning — it’s shown publicly
  5. Read API keys from env — never hardcode credentials
  6. skill_slug must match your ClawHub slug — this tracks per-skill volume
  7. Frame as a remixable template — your SKILL.md should explain what the default signal is and how to remix it (see below)

Remixable template pattern

Skills are templates, not black boxes. Your SKILL.md should include a callout like:
> **This is a template.** The default signal is [your signal source] —
> remix it with [alternative signals, different models, etc.].
> The skill handles all the plumbing (market discovery, trade execution,
> safeguards). Your agent provides the alpha.
The skill handles plumbing: market discovery, order execution, position management, and safeguards. The user’s agent swaps in their own signal — a different API, a custom model, additional data sources. Make it clear what’s swappable and what’s structural. The /context endpoint provides trading discipline data — flip-flop detection, slippage estimates, and edge analysis. We strongly recommend checking it before executing trades:
def get_market_context(market_id, my_probability=None):
    """Fetch context with safeguards and optional edge analysis."""
    params = {}
    if my_probability is not None:
        params["my_probability"] = my_probability
    return get_client().get_market_context(market_id, **params)

# Before buying
context = get_market_context(market_id, my_probability=0.85)

# Check warnings
trading = context.get("trading", {})
flip_flop = trading.get("flip_flop_warning")
if flip_flop and "SEVERE" in flip_flop:
    print(f"Skipping: {flip_flop}")
    # Don't trade -- you've been reversing too much

slippage = context.get("slippage", {})
if slippage.get("slippage_pct", 0) > 0.15:
    print("Skipping: slippage too high")
    # Market is too illiquid for this size

# Check edge (requires my_probability)
edge = context.get("edge_analysis", {})
if edge.get("recommendation") == "HOLD":
    print("Skipping: edge below threshold")
This isn’t a hard rule — some high-frequency skills skip context checks for speed. But for most strategies, checking context prevents costly mistakes like flip-flopping or trading into illiquid books.

Publishing

# From inside your skill folder
npx clawhub@latest publish . --slug your-skill-slug --version 1.0.0

# Or auto-bump version
npx clawhub@latest publish . --slug your-skill-slug --bump patch
Within 6 hours, the Simmer sync job will:
  1. Discover your skill via ClawHub search
  2. Verify it has simmer-sdk as a dependency
  3. Add it to the registry at simmer.markets/skills
No approval process. No submission form.

Naming conventions

TypeSlug patternExample
Polymarket-specificpolymarket-<strategy>polymarket-weather-trader
Kalshi-specifickalshi-<strategy>kalshi-election-sniper
Platform-agnostic<strategy>prediction-trade-journal
Simmer utilitysimmer-<tool>simmer-skill-builder

Updating skills

npx clawhub@latest publish . --slug your-skill-slug --bump patch
The registry syncs every 6 hours and updates install_count and version info automatically.

MCP Server

For agents that use MCP, see Agent Support for the simmer-mcp server setup.