Install
openclaw skills install simmer-skill-builderGenerate complete, installable OpenClaw trading skills from natural language strategy descriptions. Use when your human wants to create a new trading strategy, build a bot, generate a skill, automate a trade idea, turn a tweet into a strategy, or asks "build me a skill that...". Produces a full skill folder (SKILL.md + Python script + config) ready to install and run.
openclaw skills install simmer-skill-builderGenerate complete, runnable Simmer trading skills from a strategy description.
You are building an OpenClaw skill that trades prediction markets through the Simmer SDK. The skill you generate will be installed into your skill library and run by you — it must be a complete, self-contained folder that works out of the box.
Ask your human what their strategy does. They might:
Clarify until you understand:
Read these files to understand the patterns:
references/skill-template.md — The canonical skill skeleton. Copy the boilerplate blocks verbatim (config system, get_client, safeguards, execute_trade, CLI args).references/simmer-api.md — Simmer SDK API surface. All available methods, field names, return types.If the Simmer MCP server is available (simmer://docs/skill-reference resource), prefer reading that for the most up-to-date API docs. Otherwise use references/simmer-api.md.
For real examples of working skills, read:
references/example-weather-trader.md — Pattern: external API signal + Simmer SDK tradingreferences/example-mert-sniper.md — Pattern: Simmer API only, filter-and-tradeIf the strategy uses an external data source:
GET https://clob.polymarket.com/book?token_id=<token_id> — orderbookGET https://clob.polymarket.com/midpoint?token_id=<token_id> — midpoint priceGET https://clob.polymarket.com/prices-history?market=<token_id>&interval=1w&fidelity=60 — price historypolymarket_token_id from the Simmer market response.Create a complete folder on disk:
<skill-slug>/
├── SKILL.md # AgentSkills-compliant metadata + documentation
├── clawhub.json # ClawHub + automaton config
├── <script>.py # Main trading script
└── scripts/
└── status.py # Portfolio viewer (copy from references)
Simmer skills follow the AgentSkills open standard, making them compatible with Claude Code, Cursor, Gemini CLI, VS Code, and other skills-compatible agents.
---
name: <skill-slug>
description: <What it does + when to trigger. Max 1024 chars.>
metadata:
author: "<author>"
version: "1.0.0"
displayName: "<Human Readable Name>"
difficulty: "intermediate"
---
Rules:
name must be lowercase, hyphens only, match folder namedescription is required, max 1024 charsmetadata values must be flat strings (AgentSkills spec)clawdbot, requires, tunables, or automaton in SKILL.md — those go in clawhub.json{
"emoji": "<emoji>",
"requires": {
"env": ["SIMMER_API_KEY"],
"pip": ["simmer-sdk"]
},
"cron": null,
"autostart": false,
"automaton": {
"managed": true,
"entrypoint": "<script>.py"
}
}
simmer-sdk in requires.pip is required — this is what causes the skill to appear in the Simmer registry automaticallyrequires.env must include SIMMER_API_KEYautomaton.entrypoint must point to the main Python scripttunables — declare every configurable env var here so autotune and the dashboard can surface them. This is the source of truth for tunable ranges and defaults — clawhub_sync propagates them to the skills registry automatically.Example tunables:
{
"tunables": [
{"env": "MY_SKILL_THRESHOLD", "type": "number", "default": 0.15, "range": [0.01, 1.0], "step": 0.01, "label": "Entry threshold"},
{"env": "MY_SKILL_LOCATIONS", "type": "string", "default": "NYC", "label": "Target cities (comma-separated)"},
{"env": "MY_SKILL_ENABLED", "type": "boolean", "default": true, "label": "Feature toggle"}
]
}
Supported types: number (with range and step), string, boolean. Keep defaults in sync with CONFIG_SCHEMA in your Python script.
Copy these verbatim from references/skill-template.md:
from simmer_sdk.skill import load_config, update_config, get_config_path) — merge SIZING_CONFIG_SCHEMA from simmer_sdk.sizing into your CONFIG_SCHEMA for free position sizing knobsget_client() singletoncheck_context_safeguards()execute_trade()simmer_sdk.sizing.size_position() (Kelly + EV gate, called inline in the loop — do not roll your own)--live, --positions, --config, --set, --no-safeguards, --quiet)Customize:
CONFIG_SCHEMA — skill-specific params with SIMMER_<SKILLNAME>_<PARAM> env varsTRADE_SOURCE — unique tag like "sdk:<skillname>"SKILL_SLUG — must match the ClawHub slug exactly (e.g., "polymarket-weather-trader")Run the validator against the generated skill:
python /path/to/simmer-skill-builder/scripts/validate_skill.py /path/to/generated-skill/
Fix any FAIL results before delivering to your human.
Once validated, publish the skill so it appears in the Simmer registry automatically:
npx clawhub@latest publish /path/to/generated-skill/ --slug <skill-slug> --version 1.0.0
After publishing, the Simmer sync job picks it up within 6 hours and lists it at simmer.markets/skills. No submission or approval needed — publishing to ClawHub with simmer-sdk as a dependency is all it takes.
Tell your human:
✅ Skill published to ClawHub. It will appear in the Simmer Skills Registry within 6 hours at simmer.markets/skills.
For full publishing details: simmer.markets/skillregistry.md
SimmerClient for trades. Never import py_clob_client, polymarket, or call the CLOB API directly for order placement. Simmer handles wallet signing, safety rails, and trade tracking.--live flag must be explicitly passed for real trades.source=TRADE_SOURCE and skill_slug=SKILL_SLUG. SKILL_SLUG must match the ClawHub slug exactly — Simmer uses it to track per-skill volume.check_context_safeguards() function, skippable with --no-safeguards.execute_trade() — it's displayed publicly and builds your reputation.requests, httpx, or aiohttp as dependencies unless your human specifically needs them. The only pip dependency should be simmer-sdk.sys.stdout.reconfigure(line_buffering=True) — required for cron/Docker/OpenClaw visibility.get_positions() returns dataclasses — always convert with from dataclasses import asdict.SIMMER_API_KEY env var via get_client().polymarket-<strategy> for Polymarket-specific, simmer-<strategy> for platform-agnosticsdk:<shortname> (e.g. sdk:synthvol, sdk:rssniper, sdk:momentum) — used for rebuy/conflict detectionSKILL_SLUG = "polymarket-synth-volatility") — used for volume attributionSIMMER_<SHORTNAME>_<PARAM> (e.g. SIMMER_SYNTHVOL_ENTRY)<descriptive_name>.py (e.g. synth_volatility.py, rss_sniper.py)Your human pastes:
"Build a bot that uses Synth volatility forecasts to trade Polymarket crypto hourly contracts. Buy YES when Synth probability > market price by 7%+ and Kelly size based on edge."
You would:
references/skill-template.md for the skeleton.references/simmer-api.md for SDK methods.references/example-weather-trader.md — closest pattern (external API signal).polymarket-synth-volatility/ with:
synth_volatility.py (fetch Synth forecast, compare to market price, Kelly size, trade)scripts/status.py (copied)scripts/validate_skill.py.npx clawhub@latest publish polymarket-synth-volatility/ --slug polymarket-synth-volatility --version 1.0.0