{"id":"c56ffe1d-634b-4517-a9ce-063f985d6e3c","entityType":"agent","slug":"clawhub-psyb0t-wickworks","name":"wickworks","canonicalUrl":"https://www.xpersona.co/agent/clawhub-psyb0t-wickworks","canonicalPath":"/agent/clawhub-psyb0t-wickworks","generatedAt":"2026-10-12T08:44:11.294Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T20:08:48.831Z","emptyReason":null},"description":"Stateless OHLC primitives service — candlestick bars in, technical indicators + Smart-Money-Concepts objects out. Single POST / takes a bars array + an indicators selection map and returns computed primitives; GET /metadata is the output-path catalog; GET /health. 67 primitives across trend (SMA/EMA + 15 more MAs, slope, Donchian, Ichimoku), momentum (RSI, MACD, Stoch, StochRSI, ADX, MFI, CCI, Williams %R, ROC, MOM, TSI, TRIX, UO, Fisher), volatility (ATR, NATR, Bollinger, Keltner, Squeeze), volume (VWAP, VWMA, OBV, AD, ADOSC, CMF, KVO), and SMC (order blocks, fair-value gaps, BOS/CHoCH, swing structure, S/R levels, liquidity, retracements, sessions, previous-period H/L) plus pre-baked summaries. camelCase, NaN-safe JSON. Unified REST + MCP (streamable-HTTP at /mcp — tools health / list_indicators / metadata / compute). Auth-less by default. Use when the user wants technical indicators or Smart-Money-Concepts primitives computed from OHLC candlestick bars.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 999 downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s17fq93tmpky791n7516jcn08n83sfn2:wickworks","sourceUrl":"https://clawhub.ai/psyb0t/wickworks","homepage":"https://clawhub.ai/psyb0t/skills/wickworks","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/psyb0t/wickworks","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/psyb0t/skills/wickworks","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"wickworks technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T20:08:48.831Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T20:08:48.831Z","emptyReason":null},"stars":null,"forks":null,"downloads":999,"likes":null,"task":null,"library":null,"packageName":null,"latestVersion":"0.7.0","tractionLabel":"999 downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T20:08:48.769Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T20:08:48.831Z","lastCrawledAt":"2026-10-11T20:08:48.769Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T20:08:48.769Z","lastVerifiedAt":null,"highlights":[{"version":"0.7.0","createdAt":"2026-09-05T19:28:17.080Z","changelog":"- Updated SKILL.md with clearer and more precise API contract details, input requirements, and documentation examples. - The format of the bars array in POST payloads is now clarified: volume is required, finite, and non-negative, and its source is caller-controlled. - Cleaned up and simplified endpoint examples, removing ambiguity and making argument expectations explicit. - MCP endpoint documentation updated to reflect the latest supported arguments (notably removal of recent_bars). - Removed skill-card.md to streamline documentation set.","fileCount":4,"zipByteSize":7444},{"version":"0.6.8","createdAt":"2026-08-01T20:26:45.637Z","changelog":"# wickworks 0.6.8 Changelog - Removed the file: `skill-card.md` - No user-facing features or behavior changed.","fileCount":4,"zipByteSize":7342},{"version":"0.6.7","createdAt":"2026-07-27T23:38:52.897Z","changelog":"## wickworks 0.6.7 - Removed the file: skill-card.md - No changes to service functionality or API. - Documentation and usage details remain unchanged.","fileCount":4,"zipByteSize":7391},{"version":"0.6.6","createdAt":"2026-07-27T23:08:52.272Z","changelog":"## wickworks 0.6.6 - Removed the file `skill-card.md` to clean up the repository and eliminate redundancy. - No changes to core functionality, APIs, or indicator support.","fileCount":4,"zipByteSize":7317},{"version":"0.6.5","createdAt":"2026-07-27T15:21:49.761Z","changelog":"## wickworks 0.6.5 - Removed the sample file skill-card.md. - No changes to functionality or endpoints. - Documentation and usage remain unchanged.","fileCount":4,"zipByteSize":7356},{"version":"0.6.4","createdAt":"2026-07-27T13:28:17.116Z","changelog":"## wickworks 0.6.4 - Removed the file `skill-card.md`. - No changes to functionality or documentation content.","fileCount":4,"zipByteSize":7466},{"version":"0.6.3","createdAt":"2026-07-26T11:43:41.095Z","changelog":"Version 0.6.3 (no file changes detected) - No code or documentation updates in this release. - Behavior, functionality, and API remain unchanged from the previous version.","fileCount":4,"zipByteSize":7411},{"version":"0.6.2","createdAt":"2026-07-26T11:32:05.069Z","changelog":"### wickworks 0.6.2 - Removed the sample file `skill-card.md` from the skill package. - No changes to core functionality or interfaces.","fileCount":4,"zipByteSize":7449}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17fq93tmpky791n7516jcn08n83sfn2:wickworks","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17fq93tmpky791n7516jcn08n83sfn2:wickworks` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/psyb0t/wickworks before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-psyb0t-wickworks/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-psyb0t-wickworks/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-psyb0t-wickworks/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-psyb0t-wickworks/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-psyb0t-wickworks/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-psyb0t-wickworks/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-12T08:44:11.291Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-psyb0t-wickworks/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-psyb0t-wickworks/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-psyb0t-wickworks/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-psyb0t-wickworks/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T20:08:48.831Z","emptyReason":null},"readme":"Skill: wickworks\n\nOwner: psyb0t\n\nSummary: Stateless OHLC primitives service — candlestick bars in, technical indicators + Smart-Money-Concepts objects out. Single POST / takes a bars array + an indicators selection map and returns computed primitives; GET /metadata is the output-path catalog; GET /health. 67 primitives across trend (SMA/EMA + 15 more MAs, slope, Donchian, Ichimoku), momentum (RSI, MACD, Stoch, StochRSI, ADX, MFI, CCI, Williams %R, ROC, MOM, TSI, TRIX, UO, Fisher), volatility (ATR, NATR, Bollinger, Keltner, Squeeze), volume (VWAP, VWMA, OBV, AD, ADOSC, CMF, KVO), and SMC (order blocks, fair-value gaps, BOS/CHoCH, swing structure, S/R levels, liquidity, retracements, sessions, previous-period H/L) plus pre-baked summaries. camelCase, NaN-safe JSON. Unified REST + MCP (streamable-HTTP at /mcp — tools health / list_indicators / metadata / compute). Auth-less by default. Use when the user wants technical indicators or Smart-Money-Concepts primitives computed from OHLC candlestick bars.\n\nTags: latest:0.7.0\n\nVersion history:\n\nv0.7.0 | 2026-09-05T19:28:17.080Z | auto\n\n- Updated SKILL.md with clearer and more precise API contract details, input requirements, and documentation examples.\n- The format of the bars array in POST payloads is now clarified: volume is required, finite, and non-negative, and its source is caller-controlled.\n- Cleaned up and simplified endpoint examples, removing ambiguity and making argument expectations explicit.\n- MCP endpoint documentation updated to reflect the latest supported arguments (notably removal of recent_bars).\n- Removed skill-card.md to streamline documentation set.\n\nv0.6.8 | 2026-08-01T20:26:45.637Z | auto\n\n# wickworks 0.6.8 Changelog\n\n- Removed the file: `skill-card.md`\n- No user-facing features or behavior changed.\n\nv0.6.7 | 2026-07-27T23:38:52.897Z | auto\n\n## wickworks 0.6.7\n\n- Removed the file: skill-card.md\n- No changes to service functionality or API.\n- Documentation and usage details remain unchanged.\n\nv0.6.6 | 2026-07-27T23:08:52.272Z | auto\n\n## wickworks 0.6.6\n\n- Removed the file `skill-card.md` to clean up the repository and eliminate redundancy.\n- No changes to core functionality, APIs, or indicator support.\n\nv0.6.5 | 2026-07-27T15:21:49.761Z | auto\n\n## wickworks 0.6.5\n\n- Removed the sample file skill-card.md.\n- No changes to functionality or endpoints.\n- Documentation and usage remain unchanged.\n\nv0.6.4 | 2026-07-27T13:28:17.116Z | auto\n\n## wickworks 0.6.4\n\n- Removed the file `skill-card.md`.\n- No changes to functionality or documentation content.\n\nv0.6.3 | 2026-07-26T11:43:41.095Z | auto\n\nVersion 0.6.3 (no file changes detected)\n\n- No code or documentation updates in this release.\n- Behavior, functionality, and API remain unchanged from the previous version.\n\nv0.6.2 | 2026-07-26T11:32:05.069Z | auto\n\n### wickworks 0.6.2\n\n- Removed the sample file `skill-card.md` from the skill package.\n- No changes to core functionality or interfaces.\n\nv0.6.1 | 2026-07-26T09:25:01.128Z | auto\n\n- Removed the sample file skill-card.md.\n- No functional or API changes; this is a documentation cleanup release.\n\nv0.6.0 | 2026-07-25T23:00:25.662Z | auto\n\nVersion 0.6.0 of wickworks adds enhanced documentation and detailed usage instructions, strengthening clarity and ease-of-use.\n\n- Expanded SKILL.md with comprehensive endpoint, indicator, and security descriptions.\n- Clear guidance on input formats, output structures, and error handling.\n- Explicit listing of all available indicator names.\n- Thorough explanation of both HTTP REST and MCP streamable endpoints.\n- Documented recommended usage scenarios and important security considerations.\n\nArchive index:\n\nArchive v0.7.0: 4 files, 7444 bytes\n\nFiles: references/setup.md (2535b), skill-card.md (2388b), SKILL.md (9215b), _meta.json (128b)\n\nFile v0.7.0:SKILL.md\n\n---\nname: wickworks\ndescription: Stateless OHLC primitives service — candlestick bars in, technical indicators + Smart-Money-Concepts objects out. Single POST / takes a bars array + an indicators selection map and returns computed primitives; GET /metadata is the output-path catalog; GET /health. 67 primitives across trend (SMA/EMA + 15 more MAs, slope, Donchian, Ichimoku), momentum (RSI, MACD, Stoch, StochRSI, ADX, MFI, CCI, Williams %R, ROC, MOM, TSI, TRIX, UO, Fisher), volatility (ATR, NATR, Bollinger, Keltner, Squeeze), volume (VWAP, VWMA, OBV, AD, ADOSC, CMF, KVO), and SMC (order blocks, fair-value gaps, BOS/CHoCH, swing structure, S/R levels, liquidity, retracements, sessions, previous-period H/L) plus pre-baked summaries. camelCase, NaN-safe JSON. Unified REST + MCP (streamable-HTTP at /mcp — tools health / list_indicators / metadata / compute). Auth-less by default. Use when the user wants technical indicators or Smart-Money-Concepts primitives computed from OHLC candlestick bars.\nhomepage: https://github.com/psyb0t/docker-wickworks\nuser-invocable: true\nmetadata:\n  { \"openclaw\": { \"emoji\": \"🕯️\", \"primaryEnv\": \"WICKWORKS_URL\", \"requires\": { \"bins\": [\"docker\", \"curl\"] } } }\n---\n\n# wickworks\n\nStateless OHLC primitives service — bars in, indicators + Smart-Money-Concepts objects out. No scoring, no opinions, no state.\n\n- **Trend** — SMA/EMA + 15 other moving averages (`dema`, `tema`, `hma`, `kama`, `zlma`, `t3`, `alma`, `jma`, …), `slope`, `linreg`, Donchian channels, Ichimoku.\n- **Momentum** — RSI, MACD, Stochastic, StochRSI, ADX, MFI, CCI, Williams %R, ROC, MOM, TSI, TRIX, Ultimate Oscillator, Fisher.\n- **Volatility** — ATR, NATR, Bollinger Bands, Keltner Channels, Squeeze.\n- **Volume** — VWAP (anchored), VWMA, OBV, AD, ADOSC, CMF, KVO.\n- **SMC** — order blocks, fair-value gaps (`fvg`/`fvgs`), BOS/CHoCH (`bosChoch`), swing structure (`swingLevels`), S/R levels (`srLevels`), `liquidity`, `retracements`, `sessions`, previous-period H/L, `levels`.\n- **Summaries** — `position`, `slope`, `momentum`, `volume`, `recentRange`, `price` — pre-baked projections over the raw series.\n- **Two ways to drive it** — the REST API (`POST /`) and an MCP server (streamable-HTTP at `/mcp`). Same compute, same output envelope.\n\nAll JSON field names are **camelCase**; output is **NaN-safe** (`NaN` → `null`). Bars are UTC unix seconds; the container runs `TZ=UTC`.\n\nFor installation, configuration, and container setup, see [references/setup.md](references/setup.md).\n\n## Security & safety\n\n- **Stateless + read-only** — every call is self-contained: bars in, primitives out. wickworks stores nothing, writes no files, mutates nothing, and has **no destructive operations**. There is no state to corrupt and nothing to confirm before calling.\n- **Auth-less by default, network-exposed** — wickworks ships with no built-in auth; anyone who can reach the port can call it. Bind it to loopback (`-p 127.0.0.1:8000:8000`) and only expose it behind your own reverse proxy / VPN with auth if it needs to be reachable off-host. The MCP bridge's optional `WICKWORKS_TOKEN` is for a bearer your *proxy* enforces, not wickworks itself.\n- **Consumer of the data you send** — you hand it OHLC bars; it computes on them and returns numbers. It does not fetch, phone home, or transmit your bars anywhere. Point the skill only at a wickworks instance you (or a trusted operator) run.\n- **Bounded input** — the request is capped at `MAX_BARS` bars (default 5000); oversized requests get `413`. Some indicators need a minimum warm-up (`MIN_BARS`, default 50) or they return an `insufficient_bars` error listing the deficits.\n\n## When To Use\n\n- The user has OHLC candlestick bars and wants technical indicators computed (RSI, MACD, Bollinger, Ichimoku, Supertrend, …).\n- The user wants Smart-Money-Concepts structure: order blocks, fair-value gaps, BOS/CHoCH, swing highs/lows, support/resistance, liquidity pools.\n- You're enriching a trading/market dataset server-side and want one call to return many primitives at once.\n\n## When NOT To Use\n\n- The user wants a *forecast*, a *signal*, or a buy/sell *opinion* — wickworks emits primitives only, no scoring. (Forecasting is a different service.)\n- You don't have OHLC bars (wickworks computes on bars you supply; it has no market-data feed of its own).\n- You need indicators over more than `MAX_BARS` bars in one call — window it down or raise `MAX_BARS` on the server.\n\n## Setup\n\n```bash\nexport WICKWORKS_URL=\"http://localhost:8000\"   # your running instance\n```\n\nSee [references/setup.md](references/setup.md) to stand one up (docker compose or `uv`).\n\n## The compute contract — `POST /`\n\nOne endpoint does the work. Body:\n\n```json\n{\n  \"symbol\": \"SYMBOL_X\",\n  \"timeframe\": \"H1\",\n  \"bars\": [\n    { \"time\": 1700000000, \"open\": 100, \"high\": 102, \"low\": 99, \"close\": 101, \"volume\": 1200 }\n  ],\n  \"indicators\": { \"rsi\": true, \"macd\": true }\n}\n```\n\n- **`bars`:** array of `{ time (UTC unix seconds), open, high, low, close, volume }`. `volume` is required, finite, and non-negative. The caller chooses the activity or volume series before calling Wickworks.\n- **`indicators`** — a map of **output-name → spec**. This is the whole point:\n  - `\"rsi\": true` → run `rsi` with defaults, output under key `rsi`.\n  - `\"rsi14\": { \"type\": \"rsi\", \"length\": 14 }` → run `rsi` with `length=14`, output under key `rsi14` (the key is the output name, `type` picks the indicator).\n  - `\"rsi\": { \"length\": 21 }` → key doubles as the type when no `type` is given.\n- **`symbol` / `timeframe`:** echoed back in the response. `timeframe` is an opaque chart interval label, not a resampling instruction.\n\nResponse envelope: `{ symbol, timeframe, candles, <outputName>: <series-or-object>, ... }` — one entry per requested output, each a series the same length as `bars` (or a structured object for multi-line indicators like `macd` / `bbands` / `ichimoku`, or an array of objects for SMC like `orderBlocks` / `fvgs`).\n\n```bash\n# Health\ncurl -s \"$WICKWORKS_URL/health\"\n\n# The output-path catalog (labels + descriptions; static per version — cache it)\ncurl -s \"$WICKWORKS_URL/metadata\"\n\n# Compute RSI + MACD + order blocks in one call\ncurl -s -X POST \"$WICKWORKS_URL/\" -H 'Content-Type: application/json' -d '{\n  \"symbol\": \"SYMBOL_X\", \"timeframe\": \"H1\",\n  \"bars\": [ /* ...OHLC bars... */ ],\n  \"indicators\": { \"rsi\": true, \"macd\": true, \"orderBlocks\": true }\n}'\n```\n\n## Indicator names\n\nPass any of these as `indicators` keys (also available at runtime via the MCP `list_indicators` tool):\n\n```\nad, adosc, adx, alma, aroon, atr, bbands, bosChoch, cci, chandelierExit, cmf,\ndema, donchian, ema, fisher, fvg, fvgs, fwma, hma, ichimoku, jma, kama, kc, kvo,\nlevels, linreg, liquidity, macd, mfi, mom, momentum, natr, obv, orderBlocks,\nposition, previousHighLow, price, psar, recentRange, retracements, rma, roc, rsi,\nsessions, sinwma, slope, sma, squeeze, srLevels, stoch, stochrsi, supertrend,\nswingLevels, swma, t3, tema, trima, trix, tsi, uo, volume, vortex, vwap, vwma,\nwillr, wma, zlma\n```\n\nFetch `GET /metadata` (or the MCP `metadata` tool) for the human-readable label + description of every output path each of these produces.\n\n## MCP Endpoint (`/mcp`)\n\nwickworks mounts a [Model Context Protocol](https://modelcontextprotocol.io) server over Streamable HTTP at `/mcp`, in the same process — so an agent can drive it over JSON-RPC without the REST client. It's **stateless** (no initialize handshake needed) and returns JSON. Tools:\n\n| Tool | Args | Returns |\n|---|---|---|\n| `health` | — | `{ ok, version }` |\n| `list_indicators` | — | `{ indicators: [...] }` — the registered indicator types |\n| `metadata` | — | the output-path catalog (`{ version, count, entries }`) |\n| `compute` | `bars`, `indicators`, `timeframe?`, `symbol?` | the same envelope as `POST /` |\n\nPoint an MCP client straight at the endpoint:\n\n```bash\n# Claude Code (native remote MCP — no bridge needed)\nclaude mcp add --transport http wickworks \"$WICKWORKS_URL/mcp\"\n\n# Raw JSON-RPC (stateless — call tools/call directly)\ncurl -s \"$WICKWORKS_URL/mcp/\" \\\n  -H 'Content-Type: application/json' \\\n  -H 'Accept: application/json, text/event-stream' \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\n       \"params\":{\"name\":\"compute\",\"arguments\":{\n         \"bars\":[/* ...OHLC... */],\"indicators\":{\"rsi\":true},\"symbol\":\"SYMBOL_X\",\"timeframe\":\"H1\"}}}'\n```\n\nThe [`@psyb0t/wickworks`](https://github.com/psyb0t/docker-wickworks/tree/main/.agents/plugins/wickworks) OpenClaw plugin is a thin stdio↔HTTP bridge to this endpoint for MCP clients that only speak local stdio servers.\n\n## Errors\n\n- `400 bars must not be empty` / `400 indicators must not be empty` — empty request pieces.\n- `400 { error: \"insufficient_bars\", available, deficits }` — a requested indicator needs more warm-up bars than supplied; `deficits` lists which and how many.\n- `400` unknown indicator — the requested `type`/key isn't in the registry (see the indicator-names list above).\n- `413 too many bars` — more than `MAX_BARS` bars in one request.\n\nOver MCP the same failures come back as an `isError` tool result carrying the message, not an HTTP status.\n\nFile v0.7.0:_meta.json\n\n{\n  \"ownerId\": \"kn79dhvmpjng4rp2jjk8k0v5xx80ccbk\",\n  \"slug\": \"wickworks\",\n  \"version\": \"0.7.0\",\n  \"publishedAt\": 1788636497080\n}\n\nFile v0.7.0:references/setup.md\n\n# wickworks setup\n\nwickworks is a single stateless HTTP container — no DB, no queues, no external\ncalls. Stand one up, point `WICKWORKS_URL` at it, done.\n\n## Requirements\n\n- `docker` (to run the image) and `curl` (to call it), or Python 3.12 + `uv`\n  for a local run.\n- OHLC bars to feed it — wickworks has no market-data feed of its own.\n\n## Security & safety\n\nwickworks ships **auth-less** and **stateless** — bars in, primitives out, no\nwrites, no destructive ops. But anyone who can reach the port can call it, so:\n\n- **Bind to loopback by default** — `-p 127.0.0.1:8000:8000`. Only expose it\n  off-host behind your own reverse proxy / VPN with auth in front.\n- It never fetches or transmits your bars anywhere; it only computes on what you\n  POST. Still, only run an instance you (or a trusted operator) control.\n\n## Quick Install\n\n### docker run\n\n```bash\ndocker run --rm -p 127.0.0.1:8000:8000 psyb0t/wickworks:latest\n# listens on :8000; GET /health to check\n```\n\n### docker compose\n\n```yaml\nservices:\n  wickworks:\n    image: psyb0t/wickworks:latest\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:8000:8000\"\n    environment:\n      LOG_LEVEL: INFO\n      MAX_BARS: \"5000\"\n      MIN_BARS: \"50\"\n      WORKERS: \"2\"\n```\n\n### Local (uv-based)\n\n```bash\nmake install   # uv sync from the pinned lockfile\nmake run       # uvicorn on :8000\n```\n\n## Point the skill at it\n\n```bash\nexport WICKWORKS_URL=\"http://localhost:8000\"\ncurl -s \"$WICKWORKS_URL/health\"     # {\"ok\":true,\"version\":\"...\"}\n```\n\nFor the MCP bridge plugin, the same base URL: `WICKWORKS_URL` (the bridge\nappends `/mcp/`), plus optional `WICKWORKS_TOKEN` if a reverse proxy in front\nrequires a bearer.\n\n## Environment Variables\n\nAll env-driven; sensible defaults, nothing to tune for a first run.\n\n| Variable    | Default | Description |\n| ----------- | ------- | ----------- |\n| `LOG_LEVEL` | `INFO`  | Python logging level. |\n| `MAX_BARS`  | `5000`  | Reject requests with more bars than this (HTTP 413). |\n| `MIN_BARS`  | `50`    | Baseline warm-up floor for SMC outputs / summaries and the fallback for indicators without an explicit requirement. Series indicators (`sma`, `rsi`, `macd`, …) compute their own minimum from params. |\n| `WORKERS`   | `2`     | uvicorn worker count. |\n\nwickworks has **no auth env var** — connection-level access control is the\noperator's responsibility (loopback bind + reverse proxy). The MCP transport's\nDNS-rebinding Host check is disabled so real-hostname deployments work; gate\naccess at your proxy, not the app.\n\nFile v0.7.0:skill-card.md\n\n## Description:\n\nwickworks lets agents compute technical indicators and Smart-Money-Concepts primitives from caller-supplied OHLC candlestick bars through REST or MCP endpoints.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[psyb0t](https://clawhub.ai/user/psyb0t)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and agents use wickworks to enrich market or trading datasets by computing indicator series, market-structure objects, and prebuilt summaries from OHLC bars. It is for primitives and analysis support, not forecasts, trade signals, or buy/sell opinions.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The setup uses a mutable third-party Docker image tag.\n\nMitigation: Use a reviewed image digest or build from reviewed local source before deployment.\n\nRisk: The Wickworks service is unauthenticated by default and may be reachable by anyone with network access to its port.\n\nMitigation: Bind it to localhost by default and expose it only behind an authenticated proxy or VPN.\n\nRisk: Sensitive market data could be sent to an untrusted endpoint.\n\nMitigation: Point the skill only at a Wickworks instance operated by you or another trusted operator.\n\nRisk: The MCP transport has host validation disabled for real-hostname deployments.\n\nMitigation: Gate remote access at the proxy or VPN layer rather than relying on the application for access control.\n\n## Reference(s):\n\n- [wickworks setup](references/setup.md)\n- [ClawHub skill page](https://clawhub.ai/psyb0t/skills/wickworks)\n- [Model Context Protocol](https://modelcontextprotocol.io)\n\n## Skill Output:\n\n**Output Type(s):** [API calls, Shell commands, Configuration, Guidance, JSON]\n\n**Output Format:** [Markdown guidance with JSON request and response shapes plus shell-command examples; service responses are JSON.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Compute calls require caller-supplied OHLC bars and an indicators selection map; output uses camelCase fields and NaN-safe JSON.]\n\n## Skill Version(s):\n\n0.7.0 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v0.6.8: 4 files, 7342 bytes\n\nFiles: references/setup.md (2535b), skill-card.md (2237b), SKILL.md (9258b), _meta.json (128b)\n\nFile v0.6.8:SKILL.md\n\n---\nname: wickworks\ndescription: Stateless OHLC primitives service — candlestick bars in, technical indicators + Smart-Money-Concepts objects out. Single POST / takes a bars array + an indicators selection map and returns computed primitives; GET /metadata is the output-path catalog; GET /health. 67 primitives across trend (SMA/EMA + 15 more MAs, slope, Donchian, Ichimoku), momentum (RSI, MACD, Stoch, StochRSI, ADX, MFI, CCI, Williams %R, ROC, MOM, TSI, TRIX, UO, Fisher), volatility (ATR, NATR, Bollinger, Keltner, Squeeze), volume (VWAP, VWMA, OBV, AD, ADOSC, CMF, KVO), and SMC (order blocks, fair-value gaps, BOS/CHoCH, swing structure, S/R levels, liquidity, retracements, sessions, previous-period H/L) plus pre-baked summaries. camelCase, NaN-safe JSON. Unified REST + MCP (streamable-HTTP at /mcp — tools health / list_indicators / metadata / compute). Auth-less by default. Use when the user wants technical indicators or Smart-Money-Concepts primitives computed from OHLC candlestick bars.\nhomepage: https://github.com/psyb0t/docker-wickworks\nuser-invocable: true\nmetadata:\n  { \"openclaw\": { \"emoji\": \"🕯️\", \"primaryEnv\": \"WICKWORKS_URL\", \"requires\": { \"bins\": [\"docker\", \"curl\"] } } }\n---\n\n# wickworks\n\nStateless OHLC primitives service — bars in, indicators + Smart-Money-Concepts objects out. No scoring, no opinions, no state.\n\n- **Trend** — SMA/EMA + 15 other moving averages (`dema`, `tema`, `hma`, `kama`, `zlma`, `t3`, `alma`, `jma`, …), `slope`, `linreg`, Donchian channels, Ichimoku.\n- **Momentum** — RSI, MACD, Stochastic, StochRSI, ADX, MFI, CCI, Williams %R, ROC, MOM, TSI, TRIX, Ultimate Oscillator, Fisher.\n- **Volatility** — ATR, NATR, Bollinger Bands, Keltner Channels, Squeeze.\n- **Volume** — VWAP (anchored), VWMA, OBV, AD, ADOSC, CMF, KVO.\n- **SMC** — order blocks, fair-value gaps (`fvg`/`fvgs`), BOS/CHoCH (`bosChoch`), swing structure (`swingLevels`), S/R levels (`srLevels`), `liquidity`, `retracements`, `sessions`, previous-period H/L, `levels`.\n- **Summaries** — `position`, `slope`, `momentum`, `volume`, `recentRange`, `price` — pre-baked projections over the raw series.\n- **Two ways to drive it** — the REST API (`POST /`) and an MCP server (streamable-HTTP at `/mcp`). Same compute, same output envelope.\n\nAll JSON field names are **camelCase**; output is **NaN-safe** (`NaN` → `null`). Bars are UTC unix seconds; the container runs `TZ=UTC`.\n\nFor installation, configuration, and container setup, see [references/setup.md](references/setup.md).\n\n## Security & safety\n\n- **Stateless + read-only** — every call is self-contained: bars in, primitives out. wickworks stores nothing, writes no files, mutates nothing, and has **no destructive operations**. There is no state to corrupt and nothing to confirm before calling.\n- **Auth-less by default, network-exposed** — wickworks ships with no built-in auth; anyone who can reach the port can call it. Bind it to loopback (`-p 127.0.0.1:8000:8000`) and only expose it behind your own reverse proxy / VPN with auth if it needs to be reachable off-host. The MCP bridge's optional `WICKWORKS_TOKEN` is for a bearer your *proxy* enforces, not wickworks itself.\n- **Consumer of the data you send** — you hand it OHLC bars; it computes on them and returns numbers. It does not fetch, phone home, or transmit your bars anywhere. Point the skill only at a wickworks instance you (or a trusted operator) run.\n- **Bounded input** — the request is capped at `MAX_BARS` bars (default 5000); oversized requests get `413`. Some indicators need a minimum warm-up (`MIN_BARS`, default 50) or they return an `insufficient_bars` error listing the deficits.\n\n## When To Use\n\n- The user has OHLC candlestick bars and wants technical indicators computed (RSI, MACD, Bollinger, Ichimoku, Supertrend, …).\n- The user wants Smart-Money-Concepts structure: order blocks, fair-value gaps, BOS/CHoCH, swing highs/lows, support/resistance, liquidity pools.\n- You're enriching a trading/market dataset server-side and want one call to return many primitives at once.\n\n## When NOT To Use\n\n- The user wants a *forecast*, a *signal*, or a buy/sell *opinion* — wickworks emits primitives only, no scoring. (Forecasting is a different service.)\n- You don't have OHLC bars (wickworks computes on bars you supply; it has no market-data feed of its own).\n- You need indicators over more than `MAX_BARS` bars in one call — window it down or raise `MAX_BARS` on the server.\n\n## Setup\n\n```bash\nexport WICKWORKS_URL=\"http://localhost:8000\"   # your running instance\n```\n\nSee [references/setup.md](references/setup.md) to stand one up (docker compose or `uv`).\n\n## The compute contract — `POST /`\n\nOne endpoint does the work. Body:\n\n```json\n{\n  \"symbol\": \"EURUSD\",\n  \"timeframe\": \"H1\",\n  \"recentBars\": 10,\n  \"bars\": [\n    { \"time\": 1700000000, \"open\": 1.08, \"high\": 1.09, \"low\": 1.07, \"close\": 1.085, \"tickVolume\": 1200 }\n  ],\n  \"indicators\": { \"rsi\": true, \"macd\": true }\n}\n```\n\n- **`bars`** — array of `{ time (UTC unix seconds), open, high, low, close, tickVolume?, realVolume? }`. `tickVolume`/`tick_volume` and `realVolume`/`real_volume` aliases both accepted.\n- **`indicators`** — a map of **output-name → spec**. This is the whole point:\n  - `\"rsi\": true` → run `rsi` with defaults, output under key `rsi`.\n  - `\"rsi14\": { \"type\": \"rsi\", \"length\": 14 }` → run `rsi` with `length=14`, output under key `rsi14` (the key is the output name, `type` picks the indicator).\n  - `\"rsi\": { \"length\": 21 }` → key doubles as the type when no `type` is given.\n- **`symbol` / `timeframe`** — echoed back in the response.\n- **`recentBars`** — signal-like outputs within this many bars of the end get `isRecent: true`.\n\nResponse envelope: `{ symbol, timeframe, candles, <outputName>: <series-or-object>, ... }` — one entry per requested output, each a series the same length as `bars` (or a structured object for multi-line indicators like `macd` / `bbands` / `ichimoku`, or an array of objects for SMC like `orderBlocks` / `fvgs`).\n\n```bash\n# Health\ncurl -s \"$WICKWORKS_URL/health\"\n\n# The output-path catalog (labels + descriptions; static per version — cache it)\ncurl -s \"$WICKWORKS_URL/metadata\"\n\n# Compute RSI + MACD + order blocks in one call\ncurl -s -X POST \"$WICKWORKS_URL/\" -H 'Content-Type: application/json' -d '{\n  \"symbol\": \"EURUSD\", \"timeframe\": \"H1\",\n  \"bars\": [ /* ...OHLC bars... */ ],\n  \"indicators\": { \"rsi\": true, \"macd\": true, \"orderBlocks\": true }\n}'\n```\n\n## Indicator names\n\nPass any of these as `indicators` keys (also available at runtime via the MCP `list_indicators` tool):\n\n```\nad, adosc, adx, alma, aroon, atr, bbands, bosChoch, cci, chandelierExit, cmf,\ndema, donchian, ema, fisher, fvg, fvgs, fwma, hma, ichimoku, jma, kama, kc, kvo,\nlevels, linreg, liquidity, macd, mfi, mom, momentum, natr, obv, orderBlocks,\nposition, previousHighLow, price, psar, recentRange, retracements, rma, roc, rsi,\nsessions, sinwma, slope, sma, squeeze, srLevels, stoch, stochrsi, supertrend,\nswingLevels, swma, t3, tema, trima, trix, tsi, uo, volume, vortex, vwap, vwma,\nwillr, wma, zlma\n```\n\nFetch `GET /metadata` (or the MCP `metadata` tool) for the human-readable label + description of every output path each of these produces.\n\n## MCP Endpoint (`/mcp`)\n\nwickworks mounts a [Model Context Protocol](https://modelcontextprotocol.io) server over Streamable HTTP at `/mcp`, in the same process — so an agent can drive it over JSON-RPC without the REST client. It's **stateless** (no initialize handshake needed) and returns JSON. Tools:\n\n| Tool | Args | Returns |\n|---|---|---|\n| `health` | — | `{ ok, version }` |\n| `list_indicators` | — | `{ indicators: [...] }` — the registered indicator types |\n| `metadata` | — | the output-path catalog (`{ version, count, entries }`) |\n| `compute` | `bars`, `indicators`, `timeframe?`, `symbol?`, `recent_bars?` | the same envelope as `POST /` |\n\nPoint an MCP client straight at the endpoint:\n\n```bash\n# Claude Code (native remote MCP — no bridge needed)\nclaude mcp add --transport http wickworks \"$WICKWORKS_URL/mcp\"\n\n# Raw JSON-RPC (stateless — call tools/call directly)\ncurl -s \"$WICKWORKS_URL/mcp/\" \\\n  -H 'Content-Type: application/json' \\\n  -H 'Accept: application/json, text/event-stream' \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\n       \"params\":{\"name\":\"compute\",\"arguments\":{\n         \"bars\":[/* ...OHLC... */],\"indicators\":{\"rsi\":true},\"symbol\":\"EURUSD\",\"timeframe\":\"H1\"}}}'\n```\n\nThe [`@psyb0t/wickworks`](https://github.com/psyb0t/docker-wickworks/tree/main/.agents/plugins/wickworks) OpenClaw plugin is a thin stdio↔HTTP bridge to this endpoint for MCP clients that only speak local stdio servers.\n\n## Errors\n\n- `400 bars must not be empty` / `400 indicators must not be empty` — empty request pieces.\n- `400 { error: \"insufficient_bars\", available, deficits }` — a requested indicator needs more warm-up bars than supplied; `deficits` lists which and how many.\n- `400` unknown indicator — the requested `type`/key isn't in the registry (see the indicator-names list above).\n- `413 too many bars` — more than `MAX_BARS` bars in one request.\n\nOver MCP the same failures come back as an `isError` tool result carrying the message, not an HTTP status.\n\nFile v0.6.8:_meta.json\n\n{\n  \"ownerId\": \"kn79dhvmpjng4rp2jjk8k0v5xx80ccbk\",\n  \"slug\": \"wickworks\",\n  \"version\": \"0.6.8\",\n  \"publishedAt\": 1785616005637\n}\n\nFile v0.6.8:references/setup.md\n\n# wickworks setup\n\nwickworks is a single stateless HTTP container — no DB, no queues, no external\ncalls. Stand one up, point `WICKWORKS_URL` at it, done.\n\n## Requirements\n\n- `docker` (to run the image) and `curl` (to call it), or Python 3.12 + `uv`\n  for a local run.\n- OHLC bars to feed it — wickworks has no market-data feed of its own.\n\n## Security & safety\n\nwickworks ships **auth-less** and **stateless** — bars in, primitives out, no\nwrites, no destructive ops. But anyone who can reach the port can call it, so:\n\n- **Bind to loopback by default** — `-p 127.0.0.1:8000:8000`. Only expose it\n  off-host behind your own reverse proxy / VPN with auth in front.\n- It never fetches or transmits your bars anywhere; it only computes on what you\n  POST. Still, only run an instance you (or a trusted operator) control.\n\n## Quick Install\n\n### docker run\n\n```bash\ndocker run --rm -p 127.0.0.1:8000:8000 psyb0t/wickworks:latest\n# listens on :8000; GET /health to check\n```\n\n### docker compose\n\n```yaml\nservices:\n  wickworks:\n    image: psyb0t/wickworks:latest\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:8000:8000\"\n    environment:\n      LOG_LEVEL: INFO\n      MAX_BARS: \"5000\"\n      MIN_BARS: \"50\"\n      WORKERS: \"2\"\n```\n\n### Local (uv-based)\n\n```bash\nmake install   # uv sync from the pinned lockfile\nmake run       # uvicorn on :8000\n```\n\n## Point the skill at it\n\n```bash\nexport WICKWORKS_URL=\"http://localhost:8000\"\ncurl -s \"$WICKWORKS_URL/health\"     # {\"ok\":true,\"version\":\"...\"}\n```\n\nFor the MCP bridge plugin, the same base URL: `WICKWORKS_URL` (the bridge\nappends `/mcp/`), plus optional `WICKWORKS_TOKEN` if a reverse proxy in front\nrequires a bearer.\n\n## Environment Variables\n\nAll env-driven; sensible defaults, nothing to tune for a first run.\n\n| Variable    | Default | Description |\n| ----------- | ------- | ----------- |\n| `LOG_LEVEL` | `INFO`  | Python logging level. |\n| `MAX_BARS`  | `5000`  | Reject requests with more bars than this (HTTP 413). |\n| `MIN_BARS`  | `50`    | Baseline warm-up floor for SMC outputs / summaries and the fallback for indicators without an explicit requirement. Series indicators (`sma`, `rsi`, `macd`, …) compute their own minimum from params. |\n| `WORKERS`   | `2`     | uvicorn worker count. |\n\nwickworks has **no auth env var** — connection-level access control is the\noperator's responsibility (loopback bind + reverse proxy). The MCP transport's\nDNS-rebinding Host check is disabled so real-hostname deployments work; gate\naccess at your proxy, not the app.\n\nFile v0.6.8:skill-card.md\n\n## Description: <br>\nwickworks helps agents compute technical indicators and Smart-Money-Concepts primitives from user-supplied OHLC candlestick bars through a stateless REST or MCP service. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[psyb0t](https://clawhub.ai/user/psyb0t) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and market-data analysts use this skill when an agent needs to compute technical indicators, support/resistance structures, order blocks, fair-value gaps, or related OHLC primitives without producing forecasts or trading opinions. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The wickworks service is auth-less by default, so a network-exposed instance can be called by anyone who can reach it. <br>\nMitigation: Bind the service to localhost by default and expose it beyond the machine only behind an authenticated reverse proxy or VPN. <br>\nRisk: OHLC bars or account-derived market data sent to an untrusted instance could disclose sensitive data. <br>\nMitigation: Send data only to a wickworks instance operated by the user or another trusted operator. <br>\n\n\n## Reference(s): <br>\n- [wickworks setup](references/setup.md) <br>\n- [ClawHub skill page](https://clawhub.ai/psyb0t/skills/wickworks) <br>\n- [Model Context Protocol](https://modelcontextprotocol.io) <br>\n- [wickworks homepage](https://github.com/psyb0t/docker-wickworks) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown with JSON, shell command, and configuration examples] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Guides agents to call a stateless service that returns NaN-safe JSON indicator and SMC outputs from supplied bars.] <br>\n\n## Skill Version(s): <br>\n0.6.8 (source: server release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v0.6.7: 4 files, 7391 bytes\n\nFiles: references/setup.md (2535b), skill-card.md (2360b), SKILL.md (9258b), _meta.json (128b)\n\nFile v0.6.7:SKILL.md\n\n---\nname: wickworks\ndescription: Stateless OHLC primitives service — candlestick bars in, technical indicators + Smart-Money-Concepts objects out. Single POST / takes a bars array + an indicators selection map and returns computed primitives; GET /metadata is the output-path catalog; GET /health. 67 primitives across trend (SMA/EMA + 15 more MAs, slope, Donchian, Ichimoku), momentum (RSI, MACD, Stoch, StochRSI, ADX, MFI, CCI, Williams %R, ROC, MOM, TSI, TRIX, UO, Fisher), volatility (ATR, NATR, Bollinger, Keltner, Squeeze), volume (VWAP, VWMA, OBV, AD, ADOSC, CMF, KVO), and SMC (order blocks, fair-value gaps, BOS/CHoCH, swing structure, S/R levels, liquidity, retracements, sessions, previous-period H/L) plus pre-baked summaries. camelCase, NaN-safe JSON. Unified REST + MCP (streamable-HTTP at /mcp — tools health / list_indicators / metadata / compute). Auth-less by default. Use when the user wants technical indicators or Smart-Money-Concepts primitives computed from OHLC candlestick bars.\nhomepage: https://github.com/psyb0t/docker-wickworks\nuser-invocable: true\nmetadata:\n  { \"openclaw\": { \"emoji\": \"🕯️\", \"primaryEnv\": \"WICKWORKS_URL\", \"requires\": { \"bins\": [\"docker\", \"curl\"] } } }\n---\n\n# wickworks\n\nStateless OHLC primitives service — bars in, indicators + Smart-Money-Concepts objects out. No scoring, no opinions, no state.\n\n- **Trend** — SMA/EMA + 15 other moving averages (`dema`, `tema`, `hma`, `kama`, `zlma`, `t3`, `alma`, `jma`, …), `slope`, `linreg`, Donchian channels, Ichimoku.\n- **Momentum** — RSI, MACD, Stochastic, StochRSI, ADX, MFI, CCI, Williams %R, ROC, MOM, TSI, TRIX, Ultimate Oscillator, Fisher.\n- **Volatility** — ATR, NATR, Bollinger Bands, Keltner Channels, Squeeze.\n- **Volume** — VWAP (anchored), VWMA, OBV, AD, ADOSC, CMF, KVO.\n- **SMC** — order blocks, fair-value gaps (`fvg`/`fvgs`), BOS/CHoCH (`bosChoch`), swing structure (`swingLevels`), S/R levels (`srLevels`), `liquidity`, `retracements`, `sessions`, previous-period H/L, `levels`.\n- **Summaries** — `position`, `slope`, `momentum`, `volume`, `recentRange`, `price` — pre-baked projections over the raw series.\n- **Two ways to drive it** — the REST API (`POST /`) and an MCP server (streamable-HTTP at `/mcp`). Same compute, same output envelope.\n\nAll JSON field names are **camelCase**; output is **NaN-safe** (`NaN` → `null`). Bars are UTC unix seconds; the container runs `TZ=UTC`.\n\nFor installation, configuration, and container setup, see [references/setup.md](references/setup.md).\n\n## Security & safety\n\n- **Stateless + read-only** — every call is self-contained: bars in, primitives out. wickworks stores nothing, writes no files, mutates nothing, and has **no destructive operations**. There is no state to corrupt and nothing to confirm before calling.\n- **Auth-less by default, network-exposed** — wickworks ships with no built-in auth; anyone who can reach the port can call it. Bind it to loopback (`-p 127.0.0.1:8000:8000`) and only expose it behind your own reverse proxy / VPN with auth if it needs to be reachable off-host. The MCP bridge's optional `WICKWORKS_TOKEN` is for a bearer your *proxy* enforces, not wickworks itself.\n- **Consumer of the data you send** — you hand it OHLC bars; it computes on them and returns numbers. It does not fetch, phone home, or transmit your bars anywhere. Point the skill only at a wickworks instance you (or a trusted operator) run.\n- **Bounded input** — the request is capped at `MAX_BARS` bars (default 5000); oversized requests get `413`. Some indicators need a minimum warm-up (`MIN_BARS`, default 50) or they return an `insufficient_bars` error listing the deficits.\n\n## When To Use\n\n- The user has OHLC candlestick bars and wants technical indicators computed (RSI, MACD, Bollinger, Ichimoku, Supertrend, …).\n- The user wants Smart-Money-Concepts structure: order blocks, fair-value gaps, BOS/CHoCH, swing highs/lows, support/resistance, liquidity pools.\n- You're enriching a trading/market dataset server-side and want one call to return many primitives at once.\n\n## When NOT To Use\n\n- The user wants a *forecast*, a *signal*, or a buy/sell *opinion* — wickworks emits primitives only, no scoring. (Forecasting is a different service.)\n- You don't have OHLC bars (wickworks computes on bars you supply; it has no market-data feed of its own).\n- You need indicators over more than `MAX_BARS` bars in one call — window it down or raise `MAX_BARS` on the server.\n\n## Setup\n\n```bash\nexport WICKWORKS_URL=\"http://localhost:8000\"   # your running instance\n```\n\nSee [references/setup.md](references/setup.md) to stand one up (docker compose or `uv`).\n\n## The compute contract — `POST /`\n\nOne endpoint does the work. Body:\n\n```json\n{\n  \"symbol\": \"EURUSD\",\n  \"timeframe\": \"H1\",\n  \"recentBars\": 10,\n  \"bars\": [\n    { \"time\": 1700000000, \"open\": 1.08, \"high\": 1.09, \"low\": 1.07, \"close\": 1.085, \"tickVolume\": 1200 }\n  ],\n  \"indicators\": { \"rsi\": true, \"macd\": true }\n}\n```\n\n- **`bars`** — array of `{ time (UTC unix seconds), open, high, low, close, tickVolume?, realVolume? }`. `tickVolume`/`tick_volume` and `realVolume`/`real_volume` aliases both accepted.\n- **`indicators`** — a map of **output-name → spec**. This is the whole point:\n  - `\"rsi\": true` → run `rsi` with defaults, output under key `rsi`.\n  - `\"rsi14\": { \"type\": \"rsi\", \"length\": 14 }` → run `rsi` with `length=14`, output under key `rsi14` (the key is the output name, `type` picks the indicator).\n  - `\"rsi\": { \"length\": 21 }` → key doubles as the type when no `type` is given.\n- **`symbol` / `timeframe`** — echoed back in the response.\n- **`recentBars`** — signal-like outputs within this many bars of the end get `isRecent: true`.\n\nResponse envelope: `{ symbol, timeframe, candles, <outputName>: <series-or-object>, ... }` — one entry per requested output, each a series the same length as `bars` (or a structured object for multi-line indicators like `macd` / `bbands` / `ichimoku`, or an array of objects for SMC like `orderBlocks` / `fvgs`).\n\n```bash\n# Health\ncurl -s \"$WICKWORKS_URL/health\"\n\n# The output-path catalog (labels + descriptions; static per version — cache it)\ncurl -s \"$WICKWORKS_URL/metadata\"\n\n# Compute RSI + MACD + order blocks in one call\ncurl -s -X POST \"$WICKWORKS_URL/\" -H 'Content-Type: application/json' -d '{\n  \"symbol\": \"EURUSD\", \"timeframe\": \"H1\",\n  \"bars\": [ /* ...OHLC bars... */ ],\n  \"indicators\": { \"rsi\": true, \"macd\": true, \"orderBlocks\": true }\n}'\n```\n\n## Indicator names\n\nPass any of these as `indicators` keys (also available at runtime via the MCP `list_indicators` tool):\n\n```\nad, adosc, adx, alma, aroon, atr, bbands, bosChoch, cci, chandelierExit, cmf,\ndema, donchian, ema, fisher, fvg, fvgs, fwma, hma, ichimoku, jma, kama, kc, kvo,\nlevels, linreg, liquidity, macd, mfi, mom, momentum, natr, obv, orderBlocks,\nposition, previousHighLow, price, psar, recentRange, retracements, rma, roc, rsi,\nsessions, sinwma, slope, sma, squeeze, srLevels, stoch, stochrsi, supertrend,\nswingLevels, swma, t3, tema, trima, trix, tsi, uo, volume, vortex, vwap, vwma,\nwillr, wma, zlma\n```\n\nFetch `GET /metadata` (or the MCP `metadata` tool) for the human-readable label + description of every output path each of these produces.\n\n## MCP Endpoint (`/mcp`)\n\nwickworks mounts a [Model Context Protocol](https://modelcontextprotocol.io) server over Streamable HTTP at `/mcp`, in the same process — so an agent can drive it over JSON-RPC without the REST client. It's **stateless** (no initialize handshake needed) and returns JSON. Tools:\n\n| Tool | Args | Returns |\n|---|---|---|\n| `health` | — | `{ ok, version }` |\n| `list_indicators` | — | `{ indicators: [...] }` — the registered indicator types |\n| `metadata` | — | the output-path catalog (`{ version, count, entries }`) |\n| `compute` | `bars`, `indicators`, `timeframe?`, `symbol?`, `recent_bars?` | the same envelope as `POST /` |\n\nPoint an MCP client straight at the endpoint:\n\n```bash\n# Claude Code (native remote MCP — no bridge needed)\nclaude mcp add --transport http wickworks \"$WICKWORKS_URL/mcp\"\n\n# Raw JSON-RPC (stateless — call tools/call directly)\ncurl -s \"$WICKWORKS_URL/mcp/\" \\\n  -H 'Content-Type: application/json' \\\n  -H 'Accept: application/json, text/event-stream' \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\n       \"params\":{\"name\":\"compute\",\"arguments\":{\n         \"bars\":[/* ...OHLC... */],\"indicators\":{\"rsi\":true},\"symbol\":\"EURUSD\",\"timeframe\":\"H1\"}}}'\n```\n\nThe [`@psyb0t/wickworks`](https://github.com/psyb0t/docker-wickworks/tree/main/.agents/plugins/wickworks) OpenClaw plugin is a thin stdio↔HTTP bridge to this endpoint for MCP clients that only speak local stdio servers.\n\n## Errors\n\n- `400 bars must not be empty` / `400 indicators must not be empty` — empty request pieces.\n- `400 { error: \"insufficient_bars\", available, deficits }` — a requested indicator needs more warm-up bars than supplied; `deficits` lists which and how many.\n- `400` unknown indicator — the requested `type`/key isn't in the registry (see the indicator-names list above).\n- `413 too many bars` — more than `MAX_BARS` bars in one request.\n\nOver MCP the same failures come back as an `isError` tool result carrying the message, not an HTTP status.\n\nFile v0.6.7:_meta.json\n\n{\n  \"ownerId\": \"kn79dhvmpjng4rp2jjk8k0v5xx80ccbk\",\n  \"slug\": \"wickworks\",\n  \"version\": \"0.6.7\",\n  \"publishedAt\": 1785195532897\n}\n\nFile v0.6.7:references/setup.md\n\n# wickworks setup\n\nwickworks is a single stateless HTTP container — no DB, no queues, no external\ncalls. Stand one up, point `WICKWORKS_URL` at it, done.\n\n## Requirements\n\n- `docker` (to run the image) and `curl` (to call it), or Python 3.12 + `uv`\n  for a local run.\n- OHLC bars to feed it — wickworks has no market-data feed of its own.\n\n## Security & safety\n\nwickworks ships **auth-less** and **stateless** — bars in, primitives out, no\nwrites, no destructive ops. But anyone who can reach the port can call it, so:\n\n- **Bind to loopback by default** — `-p 127.0.0.1:8000:8000`. Only expose it\n  off-host behind your own reverse proxy / VPN with auth in front.\n- It never fetches or transmits your bars anywhere; it only computes on what you\n  POST. Still, only run an instance you (or a trusted operator) control.\n\n## Quick Install\n\n### docker run\n\n```bash\ndocker run --rm -p 127.0.0.1:8000:8000 psyb0t/wickworks:latest\n# listens on :8000; GET /health to check\n```\n\n### docker compose\n\n```yaml\nservices:\n  wickworks:\n    image: psyb0t/wickworks:latest\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:8000:8000\"\n    environment:\n      LOG_LEVEL: INFO\n      MAX_BARS: \"5000\"\n      MIN_BARS: \"50\"\n      WORKERS: \"2\"\n```\n\n### Local (uv-based)\n\n```bash\nmake install   # uv sync from the pinned lockfile\nmake run       # uvicorn on :8000\n```\n\n## Point the skill at it\n\n```bash\nexport WICKWORKS_URL=\"http://localhost:8000\"\ncurl -s \"$WICKWORKS_URL/health\"     # {\"ok\":true,\"version\":\"...\"}\n```\n\nFor the MCP bridge plugin, the same base URL: `WICKWORKS_URL` (the bridge\nappends `/mcp/`), plus optional `WICKWORKS_TOKEN` if a reverse proxy in front\nrequires a bearer.\n\n## Environment Variables\n\nAll env-driven; sensible defaults, nothing to tune for a first run.\n\n| Variable    | Default | Description |\n| ----------- | ------- | ----------- |\n| `LOG_LEVEL` | `INFO`  | Python logging level. |\n| `MAX_BARS`  | `5000`  | Reject requests with more bars than this (HTTP 413). |\n| `MIN_BARS`  | `50`    | Baseline warm-up floor for SMC outputs / summaries and the fallback for indicators without an explicit requirement. Series indicators (`sma`, `rsi`, `macd`, …) compute their own minimum from params. |\n| `WORKERS`   | `2`     | uvicorn worker count. |\n\nwickworks has **no auth env var** — connection-level access control is the\noperator's responsibility (loopback bind + reverse proxy). The MCP transport's\nDNS-rebinding Host check is disabled so real-hostname deployments work; gate\naccess at your proxy, not the app.\n\nFile v0.6.7:skill-card.md\n\n## Description: <br>\nwickworks helps an agent send OHLC candlestick bars to a stateless REST or MCP service and receive technical indicators plus Smart-Money-Concepts primitives as JSON. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[psyb0t](https://clawhub.ai/user/psyb0t) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and agents use this skill when they already have OHLC candlestick bars and need technical indicators, Smart-Money-Concepts structure, or pre-baked market-data summaries computed without forecasting or trading opinions. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The configured wickworks endpoint receives the OHLC bar data supplied by the user. <br>\nMitigation: Use only a trusted endpoint, preferably a local instance on 127.0.0.1. <br>\nRisk: The wickworks service is auth-less by default when exposed on a reachable network interface. <br>\nMitigation: Bind to loopback by default and put any off-host deployment behind an authenticated reverse proxy or VPN. <br>\nRisk: Using the floating Docker image tag can change runtime behavior over time. <br>\nMitigation: Pin the Docker image version for repeatable deployments. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/psyb0t/skills/wickworks) <br>\n- [wickworks setup](references/setup.md) <br>\n- [Model Context Protocol](https://modelcontextprotocol.io) <br>\n- [OpenClaw wickworks plugin](https://github.com/psyb0t/docker-wickworks/tree/main/.agents/plugins/wickworks) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Guidance, Shell commands, Configuration, API calls, JSON] <br>\n**Output Format:** [Markdown guidance with shell commands and JSON request examples; service responses are JSON.] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Outputs are camelCase, NaN-safe, stateless market-data primitives computed from caller-supplied OHLC bars.] <br>\n\n## Skill Version(s): <br>\n0.6.7 (source: server release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v0.6.6: 4 files, 7317 bytes\n\nFiles: references/setup.md (2535b), skill-card.md (2194b), SKILL.md (9258b), _meta.json (128b)\n\nFile v0.6.6:SKILL.md\n\n---\nname: wickworks\ndescription: Stateless OHLC primitives service — candlestick bars in, technical indicators + Smart-Money-Concepts objects out. Single POST / takes a bars array + an indicators selection map and returns computed primitives; GET /metadata is the output-path catalog; GET /health. 67 primitives across trend (SMA/EMA + 15 more MAs, slope, Donchian, Ichimoku), momentum (RSI, MACD, Stoch, StochRSI, ADX, MFI, CCI, Williams %R, ROC, MOM, TSI, TRIX, UO, Fisher), volatility (ATR, NATR, Bollinger, Keltner, Squeeze), volume (VWAP, VWMA, OBV, AD, ADOSC, CMF, KVO), and SMC (order blocks, fair-value gaps, BOS/CHoCH, swing structure, S/R levels, liquidity, retracements, sessions, previous-period H/L) plus pre-baked summaries. camelCase, NaN-safe JSON. Unified REST + MCP (streamable-HTTP at /mcp — tools health / list_indicators / metadata / compute). Auth-less by default. Use when the user wants technical indicators or Smart-Money-Concepts primitives computed from OHLC candlestick bars.\nhomepage: https://github.com/psyb0t/docker-wickworks\nuser-invocable: true\nmetadata:\n  { \"openclaw\": { \"emoji\": \"🕯️\", \"primaryEnv\": \"WICKWORKS_URL\", \"requires\": { \"bins\": [\"docker\", \"curl\"] } } }\n---\n\n# wickworks\n\nStateless OHLC primitives service — bars in, indicators + Smart-Money-Concepts objects out. No scoring, no opinions, no state.\n\n- **Trend** — SMA/EMA + 15 other moving averages (`dema`, `tema`, `hma`, `kama`, `zlma`, `t3`, `alma`, `jma`, …), `slope`, `linreg`, Donchian channels, Ichimoku.\n- **Momentum** — RSI, MACD, Stochastic, StochRSI, ADX, MFI, CCI, Williams %R, ROC, MOM, TSI, TRIX, Ultimate Oscillator, Fisher.\n- **Volatility** — ATR, NATR, Bollinger Bands, Keltner Channels, Squeeze.\n- **Volume** — VWAP (anchored), VWMA, OBV, AD, ADOSC, CMF, KVO.\n- **SMC** — order blocks, fair-value gaps (`fvg`/`fvgs`), BOS/CHoCH (`bosChoch`), swing structure (`swingLevels`), S/R levels (`srLevels`), `liquidity`, `retracements`, `sessions`, previous-period H/L, `levels`.\n- **Summaries** — `position`, `slope`, `momentum`, `volume`, `recentRange`, `price` — pre-baked projections over the raw series.\n- **Two ways to drive it** — the REST API (`POST /`) and an MCP server (streamable-HTTP at `/mcp`). Same compute, same output envelope.\n\nAll JSON field names are **camelCase**; output is **NaN-safe** (`NaN` → `null`). Bars are UTC unix seconds; the container runs `TZ=UTC`.\n\nFor installation, configuration, and container setup, see [references/setup.md](references/setup.md).\n\n## Security & safety\n\n- **Stateless + read-only** — every call is self-contained: bars in, primitives out. wickworks stores nothing, writes no files, mutates nothing, and has **no destructive operations**. There is no state to corrupt and nothing to confirm before calling.\n- **Auth-less by default, network-exposed** — wickworks ships with no built-in auth; anyone who can reach the port can call it. Bind it to loopback (`-p 127.0.0.1:8000:8000`) and only expose it behind your own reverse proxy / VPN with auth if it needs to be reachable off-host. The MCP bridge's optional `WICKWORKS_TOKEN` is for a bearer your *proxy* enforces, not wickworks itself.\n- **Consumer of the data you send** — you hand it OHLC bars; it computes on them and returns numbers. It does not fetch, phone home, or transmit your bars anywhere. Point the skill only at a wickworks instance you (or a trusted operator) run.\n- **Bounded input** — the request is capped at `MAX_BARS` bars (default 5000); oversized requests get `413`. Some indicators need a minimum warm-up (`MIN_BARS`, default 50) or they return an `insufficient_bars` error listing the deficits.\n\n## When To Use\n\n- The user has OHLC candlestick bars and wants technical indicators computed (RSI, MACD, Bollinger, Ichimoku, Supertrend, …).\n- The user wants Smart-Money-Concepts structure: order blocks, fair-value gaps, BOS/CHoCH, swing highs/lows, support/resistance, liquidity pools.\n- You're enriching a trading/market dataset server-side and want one call to return many primitives at once.\n\n## When NOT To Use\n\n- The user wants a *forecast*, a *signal*, or a buy/sell *opinion* — wickworks emits primitives only, no scoring. (Forecasting is a different service.)\n- You don't have OHLC bars (wickworks computes on bars you supply; it has no market-data feed of its own).\n- You need indicators over more than `MAX_BARS` bars in one call — window it down or raise `MAX_BARS` on the server.\n\n## Setup\n\n```bash\nexport WICKWORKS_URL=\"http://localhost:8000\"   # your running instance\n```\n\nSee [references/setup.md](references/setup.md) to stand one up (docker compose or `uv`).\n\n## The compute contract — `POST /`\n\nOne endpoint does the work. Body:\n\n```json\n{\n  \"symbol\": \"EURUSD\",\n  \"timeframe\": \"H1\",\n  \"recentBars\": 10,\n  \"bars\": [\n    { \"time\": 1700000000, \"open\": 1.08, \"high\": 1.09, \"low\": 1.07, \"close\": 1.085, \"tickVolume\": 1200 }\n  ],\n  \"indicators\": { \"rsi\": true, \"macd\": true }\n}\n```\n\n- **`bars`** — array of `{ time (UTC unix seconds), open, high, low, close, tickVolume?, realVolume? }`. `tickVolume`/`tick_volume` and `realVolume`/`real_volume` aliases both accepted.\n- **`indicators`** — a map of **output-name → spec**. This is the whole point:\n  - `\"rsi\": true` → run `rsi` with defaults, output under key `rsi`.\n  - `\"rsi14\": { \"type\": \"rsi\", \"length\": 14 }` → run `rsi` with `length=14`, output under key `rsi14` (the key is the output name, `type` picks the indicator).\n  - `\"rsi\": { \"length\": 21 }` → key doubles as the type when no `type` is given.\n- **`symbol` / `timeframe`** — echoed back in the response.\n- **`recentBars`** — signal-like outputs within this many bars of the end get `isRecent: true`.\n\nResponse envelope: `{ symbol, timeframe, candles, <outputName>: <series-or-object>, ... }` — one entry per requested output, each a series the same length as `bars` (or a structured object for multi-line indicators like `macd` / `bbands` / `ichimoku`, or an array of objects for SMC like `orderBlocks` / `fvgs`).\n\n```bash\n# Health\ncurl -s \"$WICKWORKS_URL/health\"\n\n# The output-path catalog (labels + descriptions; static per version — cache it)\ncurl -s \"$WICKWORKS_URL/metadata\"\n\n# Compute RSI + MACD + order blocks in one call\ncurl -s -X POST \"$WICKWORKS_URL/\" -H 'Content-Type: application/json' -d '{\n  \"symbol\": \"EURUSD\", \"timeframe\": \"H1\",\n  \"bars\": [ /* ...OHLC bars... */ ],\n  \"indicators\": { \"rsi\": true, \"macd\": true, \"orderBlocks\": true }\n}'\n```\n\n## Indicator names\n\nPass any of these as `indicators` keys (also available at runtime via the MCP `list_indicators` tool):\n\n```\nad, adosc, adx, alma, aroon, atr, bbands, bosChoch, cci, chandelierExit, cmf,\ndema, donchian, ema, fisher, fvg, fvgs, fwma, hma, ichimoku, jma, kama, kc, kvo,\nlevels, linreg, liquidity, macd, mfi, mom, momentum, natr, obv, orderBlocks,\nposition, previousHighLow, price, psar, recentRange, retracements, rma, roc, rsi,\nsessions, sinwma, slope, sma, squeeze, srLevels, stoch, stochrsi, supertrend,\nswingLevels, swma, t3, tema, trima, trix, tsi, uo, volume, vortex, vwap, vwma,\nwillr, wma, zlma\n```\n\nFetch `GET /metadata` (or the MCP `metadata` tool) for the human-readable label + description of every output path each of these produces.\n\n## MCP Endpoint (`/mcp`)\n\nwickworks mounts a [Model Context Protocol](https://modelcontextprotocol.io) server over Streamable HTTP at `/mcp`, in the same process — so an agent can drive it over JSON-RPC without the REST client. It's **stateless** (no initialize handshake needed) and returns JSON. Tools:\n\n| Tool | Args | Returns |\n|---|---|---|\n| `health` | — | `{ ok, version }` |\n| `list_indicators` | — | `{ indicators: [...] }` — the registered indicator types |\n| `metadata` | — | the output-path catalog (`{ version, count, entries }`) |\n| `compute` | `bars`, `indicators`, `timeframe?`, `symbol?`, `recent_bars?` | the same envelope as `POST /` |\n\nPoint an MCP client straight at the endpoint:\n\n```bash\n# Claude Code (native remote MCP — no bridge needed)\nclaude mcp add --transport http wickworks \"$WICKWORKS_URL/mcp\"\n\n# Raw JSON-RPC (stateless — call tools/call directly)\ncurl -s \"$WICKWORKS_URL/mcp/\" \\\n  -H 'Content-Type: application/json' \\\n  -H 'Accept: application/json, text/event-stream' \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\n       \"params\":{\"name\":\"compute\",\"arguments\":{\n         \"bars\":[/* ...OHLC... */],\"indicators\":{\"rsi\":true},\"symbol\":\"EURUSD\",\"timeframe\":\"H1\"}}}'\n```\n\nThe [`@psyb0t/wickworks`](https://github.com/psyb0t/docker-wickworks/tree/main/.agents/plugins/wickworks) OpenClaw plugin is a thin stdio↔HTTP bridge to this endpoint for MCP clients that only speak local stdio servers.\n\n## Errors\n\n- `400 bars must not be empty` / `400 indicators must not be empty` — empty request pieces.\n- `400 { error: \"insufficient_bars\", available, deficits }` — a requested indicator needs more warm-up bars than supplied; `deficits` lists which and how many.\n- `400` unknown indicator — the requested `type`/key isn't in the registry (see the indicator-names list above).\n- `413 too many bars` — more than `MAX_BARS` bars in one request.\n\nOver MCP the same failures come back as an `isError` tool result carrying the message, not an HTTP status.\n\nFile v0.6.6:_meta.json\n\n{\n  \"ownerId\": \"kn79dhvmpjng4rp2jjk8k0v5xx80ccbk\",\n  \"slug\": \"wickworks\",\n  \"version\": \"0.6.6\",\n  \"publishedAt\": 1785193732272\n}\n\nFile v0.6.6:references/setup.md\n\n# wickworks setup\n\nwickworks is a single stateless HTTP container — no DB, no queues, no external\ncalls. Stand one up, point `WICKWORKS_URL` at it, done.\n\n## Requirements\n\n- `docker` (to run the image) and `curl` (to call it), or Python 3.12 + `uv`\n  for a local run.\n- OHLC bars to feed it — wickworks has no market-data feed of its own.\n\n## Security & safety\n\nwickworks ships **auth-less** and **stateless** — bars in, primitives out, no\nwrites, no destructive ops. But anyone who can reach the port can call it, so:\n\n- **Bind to loopback by default** — `-p 127.0.0.1:8000:8000`. Only expose it\n  off-host behind your own reverse proxy / VPN with auth in front.\n- It never fetches or transmits your bars anywhere; it only computes on what you\n  POST. Still, only run an instance you (or a trusted operator) control.\n\n## Quick Install\n\n### docker run\n\n```bash\ndocker run --rm -p 127.0.0.1:8000:8000 psyb0t/wickworks:latest\n# listens on :8000; GET /health to check\n```\n\n### docker compose\n\n```yaml\nservices:\n  wickworks:\n    image: psyb0t/wickworks:latest\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:8000:8000\"\n    environment:\n      LOG_LEVEL: INFO\n      MAX_BARS: \"5000\"\n      MIN_BARS: \"50\"\n      WORKERS: \"2\"\n```\n\n### Local (uv-based)\n\n```bash\nmake install   # uv sync from the pinned lockfile\nmake run       # uvicorn on :8000\n```\n\n## Point the skill at it\n\n```bash\nexport WICKWORKS_URL=\"http://localhost:8000\"\ncurl -s \"$WICKWORKS_URL/health\"     # {\"ok\":true,\"version\":\"...\"}\n```\n\nFor the MCP bridge plugin, the same base URL: `WICKWORKS_URL` (the bridge\nappends `/mcp/`), plus optional `WICKWORKS_TOKEN` if a reverse proxy in front\nrequires a bearer.\n\n## Environment Variables\n\nAll env-driven; sensible defaults, nothing to tune for a first run.\n\n| Variable    | Default | Description |\n| ----------- | ------- | ----------- |\n| `LOG_LEVEL` | `INFO`  | Python logging level. |\n| `MAX_BARS`  | `5000`  | Reject requests with more bars than this (HTTP 413). |\n| `MIN_BARS`  | `50`    | Baseline warm-up floor for SMC outputs / summaries and the fallback for indicators without an explicit requirement. Series indicators (`sma`, `rsi`, `macd`, …) compute their own minimum from params. |\n| `WORKERS`   | `2`     | uvicorn worker count. |\n\nwickworks has **no auth env var** — connection-level access control is the\noperator's responsibility (loopback bind + reverse proxy). The MCP transport's\nDNS-rebinding Host check is disabled so real-hostname deployments work; gate\naccess at your proxy, not the app.\n\nFile v0.6.6:skill-card.md\n\n## Description: <br>\nwickworks helps agents compute technical indicators and Smart-Money-Concepts primitives from user-provided OHLC candlestick bars through a stateless REST or MCP service. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[psyb0t](https://clawhub.ai/user/psyb0t) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and agents use this skill when they have OHLC candlestick bars and need market-analysis primitives such as RSI, MACD, Bollinger Bands, order blocks, fair-value gaps, support/resistance levels, or liquidity structures. It is for computing indicators and structured primitives, not for forecasting prices or giving buy/sell advice. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The wickworks service is auth-less if exposed beyond localhost. <br>\nMitigation: Bind the service to localhost by default and expose it only behind an authenticated reverse proxy or VPN. <br>\nRisk: OHLC market data is sent to the configured wickworks instance for computation. <br>\nMitigation: Point the skill only at an instance you operate or otherwise trust. <br>\n\n\n## Reference(s): <br>\n- [wickworks setup](references/setup.md) <br>\n- [ClawHub skill page](https://clawhub.ai/psyb0t/skills/wickworks) <br>\n- [Publisher profile](https://clawhub.ai/user/psyb0t) <br>\n- [Model Context Protocol](https://modelcontextprotocol.io) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown guidance with JSON and shell command examples] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Guides calls to a stateless service that returns JSON indicator series, structured indicator objects, and MCP tool results.] <br>\n\n## Skill Version(s): <br>\n0.6.6 (source: release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v0.6.5: 4 files, 7356 bytes\n\nFiles: references/setup.md (2535b), skill-card.md (2249b), SKILL.md (9258b), _meta.json (128b)\n\nFile v0.6.5:SKILL.md\n\n---\nname: wickworks\ndescription: Stateless OHLC primitives service — candlestick bars in, technical indicators + Smart-Money-Concepts objects out. Single POST / takes a bars array + an indicators selection map and returns computed primitives; GET /metadata is the output-path catalog; GET /health. 67 primitives across trend (SMA/EMA + 15 more MAs, slope, Donchian, Ichimoku), momentum (RSI, MACD, Stoch, StochRSI, ADX, MFI, CCI, Williams %R, ROC, MOM, TSI, TRIX, UO, Fisher), volatility (ATR, NATR, Bollinger, Keltner, Squeeze), volume (VWAP, VWMA, OBV, AD, ADOSC, CMF, KVO), and SMC (order blocks, fair-value gaps, BOS/CHoCH, swing structure, S/R levels, liquidity, retracements, sessions, previous-period H/L) plus pre-baked summaries. camelCase, NaN-safe JSON. Unified REST + MCP (streamable-HTTP at /mcp — tools health / list_indicators / metadata / compute). Auth-less by default. Use when the user wants technical indicators or Smart-Money-Concepts primitives computed from OHLC candlestick bars.\nhomepage: https://github.com/psyb0t/docker-wickworks\nuser-invocable: true\nmetadata:\n  { \"openclaw\": { \"emoji\": \"🕯️\", \"primaryEnv\": \"WICKWORKS_URL\", \"requires\": { \"bins\": [\"docker\", \"curl\"] } } }\n---\n\n# wickworks\n\nStateless OHLC primitives service — bars in, indicators + Smart-Money-Concepts objects out. No scoring, no opinions, no state.\n\n- **Trend** — SMA/EMA + 15 other moving averages (`dema`, `tema`, `hma`, `kama`, `zlma`, `t3`, `alma`, `jma`, …), `slope`, `linreg`, Donchian channels, Ichimoku.\n- **Momentum** — RSI, MACD, Stochastic, StochRSI, ADX, MFI, CCI, Williams %R, ROC, MOM, TSI, TRIX, Ultimate Oscillator, Fisher.\n- **Volatility** — ATR, NATR, Bollinger Bands, Keltner Channels, Squeeze.\n- **Volume** — VWAP (anchored), VWMA, OBV, AD, ADOSC, CMF, KVO.\n- **SMC** — order blocks, fair-value gaps (`fvg`/`fvgs`), BOS/CHoCH (`bosChoch`), swing structure (`swingLevels`), S/R levels (`srLevels`), `liquidity`, `retracements`, `sessions`, previous-period H/L, `levels`.\n- **Summaries** — `position`, `slope`, `momentum`, `volume`, `recentRange`, `price` — pre-baked projections over the raw series.\n- **Two ways to drive it** — the REST API (`POST /`) and an MCP server (streamable-HTTP at `/mcp`). Same compute, same output envelope.\n\nAll JSON field names are **camelCase**; output is **NaN-safe** (`NaN` → `null`). Bars are UTC unix seconds; the container runs `TZ=UTC`.\n\nFor installation, configuration, and container setup, see [references/setup.md](references/setup.md).\n\n## Security & safety\n\n- **Stateless + read-only** — every call is self-contained: bars in, primitives out. wickworks stores nothing, writes no files, mutates nothing, and has **no destructive operations**. There is no state to corrupt and nothing to confirm before calling.\n- **Auth-less by default, network-exposed** — wickworks ships with no built-in auth; anyone who can reach the port can call it. Bind it to loopback (`-p 127.0.0.1:8000:8000`) and only expose it behind your own reverse proxy / VPN with auth if it needs to be reachable off-host. The MCP bridge's optional `WICKWORKS_TOKEN` is for a bearer your *proxy* enforces, not wickworks itself.\n- **Consumer of the data you send** — you hand it OHLC bars; it computes on them and returns numbers. It does not fetch, phone home, or transmit your bars anywhere. Point the skill only at a wickworks instance you (or a trusted operator) run.\n- **Bounded input** — the request is capped at `MAX_BARS` bars (default 5000); oversized requests get `413`. Some indicators need a minimum warm-up (`MIN_BARS`, default 50) or they return an `insufficient_bars` error listing the deficits.\n\n## When To Use\n\n- The user has OHLC candlestick bars and wants technical indicators computed (RSI, MACD, Bollinger, Ichimoku, Supertrend, …).\n- The user wants Smart-Money-Concepts structure: order blocks, fair-value gaps, BOS/CHoCH, swing highs/lows, support/resistance, liquidity pools.\n- You're enriching a trading/market dataset server-side and want one call to return many primitives at once.\n\n## When NOT To Use\n\n- The user wants a *forecast*, a *signal*, or a buy/sell *opinion* — wickworks emits primitives only, no scoring. (Forecasting is a different service.)\n- You don't have OHLC bars (wickworks computes on bars you supply; it has no market-data feed of its own).\n- You need indicators over more than `MAX_BARS` bars in one call — window it down or raise `MAX_BARS` on the server.\n\n## Setup\n\n```bash\nexport WICKWORKS_URL=\"http://localhost:8000\"   # your running instance\n```\n\nSee [references/setup.md](references/setup.md) to stand one up (docker compose or `uv`).\n\n## The compute contract — `POST /`\n\nOne endpoint does the work. Body:\n\n```json\n{\n  \"symbol\": \"EURUSD\",\n  \"timeframe\": \"H1\",\n  \"recentBars\": 10,\n  \"bars\": [\n    { \"time\": 1700000000, \"open\": 1.08, \"high\": 1.09, \"low\": 1.07, \"close\": 1.085, \"tickVolume\": 1200 }\n  ],\n  \"indicators\": { \"rsi\": true, \"macd\": true }\n}\n```\n\n- **`bars`** — array of `{ time (UTC unix seconds), open, high, low, close, tickVolume?, realVolume? }`. `tickVolume`/`tick_volume` and `realVolume`/`real_volume` aliases both accepted.\n- **`indicators`** — a map of **output-name → spec**. This is the whole point:\n  - `\"rsi\": true` → run `rsi` with defaults, output under key `rsi`.\n  - `\"rsi14\": { \"type\": \"rsi\", \"length\": 14 }` → run `rsi` with `length=14`, output under key `rsi14` (the key is the output name, `type` picks the indicator).\n  - `\"rsi\": { \"length\": 21 }` → key doubles as the type when no `type` is given.\n- **`symbol` / `timeframe`** — echoed back in the response.\n- **`recentBars`** — signal-like outputs within this many bars of the end get `isRecent: true`.\n\nResponse envelope: `{ symbol, timeframe, candles, <outputName>: <series-or-object>, ... }` — one entry per requested output, each a series the same length as `bars` (or a structured object for multi-line indicators like `macd` / `bbands` / `ichimoku`, or an array of objects for SMC like `orderBlocks` / `fvgs`).\n\n```bash\n# Health\ncurl -s \"$WICKWORKS_URL/health\"\n\n# The output-path catalog (labels + descriptions; static per version — cache it)\ncurl -s \"$WICKWORKS_URL/metadata\"\n\n# Compute RSI + MACD + order blocks in one call\ncurl -s -X POST \"$WICKWORKS_URL/\" -H 'Content-Type: application/json' -d '{\n  \"symbol\": \"EURUSD\", \"timeframe\": \"H1\",\n  \"bars\": [ /* ...OHLC bars... */ ],\n  \"indicators\": { \"rsi\": true, \"macd\": true, \"orderBlocks\": true }\n}'\n```\n\n## Indicator names\n\nPass any of these as `indicators` keys (also available at runtime via the MCP `list_indicators` tool):\n\n```\nad, adosc, adx, alma, aroon, atr, bbands, bosChoch, cci, chandelierExit, cmf,\ndema, donchian, ema, fisher, fvg, fvgs, fwma, hma, ichimoku, jma, kama, kc, kvo,\nlevels, linreg, liquidity, macd, mfi, mom, momentum, natr, obv, orderBlocks,\nposition, previousHighLow, price, psar, recentRange, retracements, rma, roc, rsi,\nsessions, sinwma, slope, sma, squeeze, srLevels, stoch, stochrsi, supertrend,\nswingLevels, swma, t3, tema, trima, trix, tsi, uo, volume, vortex, vwap, vwma,\nwillr, wma, zlma\n```\n\nFetch `GET /metadata` (or the MCP `metadata` tool) for the human-readable label + description of every output path each of these produces.\n\n## MCP Endpoint (`/mcp`)\n\nwickworks mounts a [Model Context Protocol](https://modelcontextprotocol.io) server over Streamable HTTP at `/mcp`, in the same process — so an agent can drive it over JSON-RPC without the REST client. It's **stateless** (no initialize handshake needed) and returns JSON. Tools:\n\n| Tool | Args | Returns |\n|---|---|---|\n| `health` | — | `{ ok, version }` |\n| `list_indicators` | — | `{ indicators: [...] }` — the registered indicator types |\n| `metadata` | — | the output-path catalog (`{ version, count, entries }`) |\n| `compute` | `bars`, `indicators`, `timeframe?`, `symbol?`, `recent_bars?` | the same envelope as `POST /` |\n\nPoint an MCP client straight at the endpoint:\n\n```bash\n# Claude Code (native remote MCP — no bridge needed)\nclaude mcp add --transport http wickworks \"$WICKWORKS_URL/mcp\"\n\n# Raw JSON-RPC (stateless — call tools/call directly)\ncurl -s \"$WICKWORKS_URL/mcp/\" \\\n  -H 'Content-Type: application/json' \\\n  -H 'Accept: application/json, text/event-stream' \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\n       \"params\":{\"name\":\"compute\",\"arguments\":{\n         \"bars\":[/* ...OHLC... */],\"indicators\":{\"rsi\":true},\"symbol\":\"EURUSD\",\"timeframe\":\"H1\"}}}'\n```\n\nThe [`@psyb0t/wickworks`](https://github.com/psyb0t/docker-wickworks/tree/main/.agents/plugins/wickworks) OpenClaw plugin is a thin stdio↔HTTP bridge to this endpoint for MCP clients that only speak local stdio servers.\n\n## Errors\n\n- `400 bars must not be empty` / `400 indicators must not be empty` — empty request pieces.\n- `400 { error: \"insufficient_bars\", available, deficits }` — a requested indicator needs more warm-up bars than supplied; `deficits` lists which and how many.\n- `400` unknown indicator — the requested `type`/key isn't in the registry (see the indicator-names list above).\n- `413 too many bars` — more than `MAX_BARS` bars in one request.\n\nOver MCP the same failures come back as an `isError` tool result carrying the message, not an HTTP status.\n\nFile v0.6.5:_meta.json\n\n{\n  \"ownerId\": \"kn79dhvmpjng4rp2jjk8k0v5xx80ccbk\",\n  \"slug\": \"wickworks\",\n  \"version\": \"0.6.5\",\n  \"publishedAt\": 1785165709761\n}\n\nFile v0.6.5:references/setup.md\n\n# wickworks setup\n\nwickworks is a single stateless HTTP container — no DB, no queues, no external\ncalls. Stand one up, point `WICKWORKS_URL` at it, done.\n\n## Requirements\n\n- `docker` (to run the image) and `curl` (to call it), or Python 3.12 + `uv`\n  for a local run.\n- OHLC bars to feed it — wickworks has no market-data feed of its own.\n\n## Security & safety\n\nwickworks ships **auth-less** and **stateless** — bars in, primitives out, no\nwrites, no destructive ops. But anyone who can reach the port can call it, so:\n\n- **Bind to loopback by default** — `-p 127.0.0.1:8000:8000`. Only expose it\n  off-host behind your own reverse proxy / VPN with auth in front.\n- It never fetches or transmits your bars anywhere; it only computes on what you\n  POST. Still, only run an instance you (or a trusted operator) control.\n\n## Quick Install\n\n### docker run\n\n```bash\ndocker run --rm -p 127.0.0.1:8000:8000 psyb0t/wickworks:latest\n# listens on :8000; GET /health to check\n```\n\n### docker compose\n\n```yaml\nservices:\n  wickworks:\n    image: psyb0t/wickworks:latest\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:8000:8000\"\n    environment:\n      LOG_LEVEL: INFO\n      MAX_BARS: \"5000\"\n      MIN_BARS: \"50\"\n      WORKERS: \"2\"\n```\n\n### Local (uv-based)\n\n```bash\nmake install   # uv sync from the pinned lockfile\nmake run       # uvicorn on :8000\n```\n\n## Point the skill at it\n\n```bash\nexport WICKWORKS_URL=\"http://localhost:8000\"\ncurl -s \"$WICKWORKS_URL/health\"     # {\"ok\":true,\"version\":\"...\"}\n```\n\nFor the MCP bridge plugin, the same base URL: `WICKWORKS_URL` (the bridge\nappends `/mcp/`), plus optional `WICKWORKS_TOKEN` if a reverse proxy in front\nrequires a bearer.\n\n## Environment Variables\n\nAll env-driven; sensible defaults, nothing to tune for a first run.\n\n| Variable    | Default | Description |\n| ----------- | ------- | ----------- |\n| `LOG_LEVEL` | `INFO`  | Python logging level. |\n| `MAX_BARS`  | `5000`  | Reject requests with more bars than this (HTTP 413). |\n| `MIN_BARS`  | `50`    | Baseline warm-up floor for SMC outputs / summaries and the fallback for indicators without an explicit requirement. Series indicators (`sma`, `rsi`, `macd`, …) compute their own minimum from params. |\n| `WORKERS`   | `2`     | uvicorn worker count. |\n\nwickworks has **no auth env var** — connection-level access control is the\noperator's responsibility (loopback bind + reverse proxy). The MCP transport's\nDNS-rebinding Host check is disabled so real-hostname deployments work; gate\naccess at your proxy, not the app.\n\nFile v0.6.5:skill-card.md\n\n## Description: <br>\nwickworks helps agents call a self-hosted OHLC primitives service to compute technical indicators and Smart-Money-Concepts objects from candlestick bars. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[psyb0t](https://clawhub.ai/user/psyb0t) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and agents use wickworks to compute technical indicators, market structure objects, and summary primitives from OHLC candlestick data through REST or MCP. It is useful when the caller already has bars and needs deterministic indicator outputs rather than forecasts or trading opinions. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The HTTP/MCP endpoint has no built-in authentication, so anyone who can reach the service can submit computations. <br>\nMitigation: Bind the service to localhost by default and expose it only through an authenticated reverse proxy, VPN, or other access control layer. <br>\nRisk: OHLC bars sent to an untrusted instance may disclose proprietary or sensitive market data. <br>\nMitigation: Use an instance operated by you or a trusted party, and avoid sending sensitive bars to services you do not control. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/psyb0t/skills/wickworks) <br>\n- [wickworks setup](references/setup.md) <br>\n- [Model Context Protocol](https://modelcontextprotocol.io) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [guidance, shell commands, configuration, API calls] <br>\n**Output Format:** [Markdown guidance with JSON and shell command examples] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Requires a reachable wickworks HTTP/MCP service configured through WICKWORKS_URL; service responses are JSON primitives computed from supplied OHLC bars.] <br>\n\n## Skill Version(s): <br>\n0.6.5 (source: server release metadata) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v0.6.4: 4 files, 7466 bytes\n\nFiles: references/setup.md (2535b), skill-card.md (2547b), SKILL.md (9258b), _meta.json (128b)\n\nFile v0.6.4:SKILL.md\n\n---\nname: wickworks\ndescription: Stateless OHLC primitives service — candlestick bars in, technical indicators + Smart-Money-Concepts objects out. Single POST / takes a bars array + an indicators selection map and returns computed primitives; GET /metadata is the output-path catalog; GET /health. 67 primitives across trend (SMA/EMA + 15 more MAs, slope, Donchian, Ichimoku), momentum (RSI, MACD, Stoch, StochRSI, ADX, MFI, CCI, Williams %R, ROC, MOM, TSI, TRIX, UO, Fisher), volatility (ATR, NATR, Bollinger, Keltner, Squeeze), volume (VWAP, VWMA, OBV, AD, ADOSC, CMF, KVO), and SMC (order blocks, fair-value gaps, BOS/CHoCH, swing structure, S/R levels, liquidity, retracements, sessions, previous-period H/L) plus pre-baked summaries. camelCase, NaN-safe JSON. Unified REST + MCP (streamable-HTTP at /mcp — tools health / list_indicators / metadata / compute). Auth-less by default. Use when the user wants technical indicators or Smart-Money-Concepts primitives computed from OHLC candlestick bars.\nhomepage: https://github.com/psyb0t/docker-wickworks\nuser-invocable: true\nmetadata:\n  { \"openclaw\": { \"emoji\": \"🕯️\", \"primaryEnv\": \"WICKWORKS_URL\", \"requires\": { \"bins\": [\"docker\", \"curl\"] } } }\n---\n\n# wickworks\n\nStateless OHLC primitives service — bars in, indicators + Smart-Money-Concepts objects out. No scoring, no opinions, no state.\n\n- **Trend** — SMA/EMA + 15 other moving averages (`dema`, `tema`, `hma`, `kama`, `zlma`, `t3`, `alma`, `jma`, …), `slope`, `linreg`, Donchian channels, Ichimoku.\n- **Momentum** — RSI, MACD, Stochastic, StochRSI, ADX, MFI, CCI, Williams %R, ROC, MOM, TSI, TRIX, Ultimate Oscillator, Fisher.\n- **Volatility** — ATR, NATR, Bollinger Bands, Keltner Channels, Squeeze.\n- **Volume** — VWAP (anchored), VWMA, OBV, AD, ADOSC, CMF, KVO.\n- **SMC** — order blocks, fair-value gaps (`fvg`/`fvgs`), BOS/CHoCH (`bosChoch`), swing structure (`swingLevels`), S/R levels (`srLevels`), `liquidity`, `retracements`, `sessions`, previous-period H/L, `levels`.\n- **Summaries** — `position`, `slope`, `momentum`, `volume`, `recentRange`, `price` — pre-baked projections over the raw series.\n- **Two ways to drive it** — the REST API (`POST /`) and an MCP server (streamable-HTTP at `/mcp`). Same compute, same output envelope.\n\nAll JSON field names are **camelCase**; output is **NaN-safe** (`NaN` → `null`). Bars are UTC unix seconds; the container runs `TZ=UTC`.\n\nFor installation, configuration, and container setup, see [references/setup.md](references/setup.md).\n\n## Security & safety\n\n- **Stateless + read-only** — every call is self-contained: bars in, primitives out. wickworks stores nothing, writes no files, mutates nothing, and has **no destructive operations**. There is no state to corrupt and nothing to confirm before calling.\n- **Auth-less by default, network-exposed** — wickworks ships with no built-in auth; anyone who can reach the port can call it. Bind it to loopback (`-p 127.0.0.1:8000:8000`) and only expose it behind your own reverse proxy / VPN with auth if it needs to be reachable off-host. The MCP bridge's optional `WICKWORKS_TOKEN` is for a bearer your *proxy* enforces, not wickworks itself.\n- **Consumer of the data you send** — you hand it OHLC bars; it computes on them and returns numbers. It does not fetch, phone home, or transmit your bars anywhere. Point the skill only at a wickworks instance you (or a trusted operator) run.\n- **Bounded input** — the request is capped at `MAX_BARS` bars (default 5000); oversized requests get `413`. Some indicators need a minimum warm-up (`MIN_BARS`, default 50) or they return an `insufficient_bars` error listing the deficits.\n\n## When To Use\n\n- The user has OHLC candlestick bars and wants technical indicators computed (RSI, MACD, Bollinger, Ichimoku, Supertrend, …).\n- The user wants Smart-Money-Concepts structure: order blocks, fair-value gaps, BOS/CHoCH, swing highs/lows, support/resistance, liquidity pools.\n- You're enriching a trading/market dataset server-side and want one call to return many primitives at once.\n\n## When NOT To Use\n\n- The user wants a *forecast*, a *signal*, or a buy/sell *opinion* — wickworks emits primitives only, no scoring. (Forecasting is a different service.)\n- You don't have OHLC bars (wickworks computes on bars you supply; it has no market-data feed of its own).\n- You need indicators over more than `MAX_BARS` bars in one call — window it down or raise `MAX_BARS` on the server.\n\n## Setup\n\n```bash\nexport WICKWORKS_URL=\"http://localhost:8000\"   # your running instance\n```\n\nSee [references/setup.md](references/setup.md) to stand one up (docker compose or `uv`).\n\n## The compute contract — `POST /`\n\nOne endpoint does the work. Body:\n\n```json\n{\n  \"symbol\": \"EURUSD\",\n  \"timeframe\": \"H1\",\n  \"recentBars\": 10,\n  \"bars\": [\n    { \"time\": 1700000000, \"open\": 1.08, \"high\": 1.09, \"low\": 1.07, \"close\": 1.085, \"tickVolume\": 1200 }\n  ],\n  \"indicators\": { \"rsi\": true, \"macd\": true }\n}\n```\n\n- **`bars`** — array of `{ time (UTC unix seconds), open, high, low, close, tickVolume?, realVolume? }`. `tickVolume`/`tick_volume` and `realVolume`/`real_volume` aliases both accepted.\n- **`indicators`** — a map of **output-name → spec**. This is the whole point:\n  - `\"rsi\": true` → run `rsi` with defaults, output under key `rsi`.\n  - `\"rsi14\": { \"type\": \"rsi\", \"length\": 14 }` → run `rsi` with `length=14`, output under key `rsi14` (the key is the output name, `type` picks the indicator).\n  - `\"rsi\": { \"length\": 21 }` → key doubles as the type when no `type` is given.\n- **`symbol` / `timeframe`** — echoed back in the response.\n- **`recentBars`** — signal-like outputs within this many bars of the end get `isRecent: true`.\n\nResponse envelope: `{ symbol, timeframe, candles, <outputName>: <series-or-object>, ... }` — one entry per requested output, each a series the same length as `bars` (or a structured object for multi-line indicators like `macd` / `bbands` / `ichimoku`, or an array of objects for SMC like `orderBlocks` / `fvgs`).\n\n```bash\n# Health\ncurl -s \"$WICKWORKS_URL/health\"\n\n# The output-path catalog (labels + descriptions; static per version — cache it)\ncurl -s \"$WICKWORKS_URL/metadata\"\n\n# Compute RSI + MACD + order blocks in one call\ncurl -s -X POST \"$WICKWORKS_URL/\" -H 'Content-Type: application/json' -d '{\n  \"symbol\": \"EURUSD\", \"timeframe\": \"H1\",\n  \"bars\": [ /* ...OHLC bars... */ ],\n  \"indicators\": { \"rsi\": true, \"macd\": true, \"orderBlocks\": true }\n}'\n```\n\n## Indicator names\n\nPass any of these as `indicators` keys (also available at runtime via the MCP `list_indicators` tool):\n\n```\nad, adosc, adx, alma, aroon, atr, bbands, bosChoch, cci, chandelierExit, cmf,\ndema, donchian, ema, fisher, fvg, fvgs, fwma, hma, ichimoku, jma, kama, kc, kvo,\nlevels, linreg, liquidity, macd, mfi, mom, momentum, natr, obv, orderBlocks,\nposition, previousHighLow, price, psar, recentRange, retracements, rma, roc, rsi,\nsessions, sinwma, slope, sma, squeeze, srLevels, stoch, stochrsi, supertrend,\nswingLevels, swma, t3, tema, trima, trix, tsi, uo, volume, vortex, vwap, vwma,\nwillr, wma, zlma\n```\n\nFetch `GET /metadata` (or the MCP `metadata` tool) for the human-readable label + description of every output path each of these produces.\n\n## MCP Endpoint (`/mcp`)\n\nwickworks mounts a [Model Context Protocol](https://modelcontextprotocol.io) server over Streamable HTTP at `/mcp`, in the same process — so an agent can drive it over JSON-RPC without the REST client. It's **stateless** (no initialize handshake needed) and returns JSON. Tools:\n\n| Tool | Args | Returns |\n|---|---|---|\n| `health` | — | `{ ok, version }` |\n| `list_indicators` | — | `{ indicators: [...] }` — the registered indicator types |\n| `metadata` | — | the output-path catalog (`{ version, count, entries }`) |\n| `compute` | `bars`, `indicators`, `timeframe?`, `symbol?`, `recent_bars?` | the same envelope as `POST /` |\n\nPoint an MCP client straight at the endpoint:\n\n```bash\n# Claude Code (native remote MCP — no bridge needed)\nclaude mcp add --transport http wickworks \"$WICKWORKS_URL/mcp\"\n\n# Raw JSON-RPC (stateless — call tools/call directly)\ncurl -s \"$WICKWORKS_URL/mcp/\" \\\n  -H 'Content-Type: application/json' \\\n  -H 'Accept: application/json, text/event-stream' \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\n       \"params\":{\"name\":\"compute\",\"arguments\":{\n         \"bars\":[/* ...OHLC... */],\"indicators\":{\"rsi\":true},\"symbol\":\"EURUSD\",\"timeframe\":\"H1\"}}}'\n```\n\nThe [`@psyb0t/wickworks`](https://github.com/psyb0t/docker-wickworks/tree/main/.agents/plugins/wickworks) OpenClaw plugin is a thin stdio↔HTTP bridge to this endpoint for MCP clients that only speak local stdio servers.\n\n## Errors\n\n- `400 bars must not be empty` / `400 indicators must not be empty` — empty request pieces.\n- `400 { error: \"insufficient_bars\", available, deficits }` — a requested indicator needs more warm-up bars than supplied; `deficits` lists which and how many.\n- `400` unknown indicator — the requested `type`/key isn't in the registry (see the indicator-names list above).\n- `413 too many bars` — more than `MAX_BARS` bars in one request.\n\nOver MCP the same failures come back as an `isError` tool result carrying the message, not an HTTP status.\n\nFile v0.6.4:_meta.json\n\n{\n  \"ownerId\": \"kn79dhvmpjng4rp2jjk8k0v5xx80ccbk\",\n  \"slug\": \"wickworks\",\n  \"version\": \"0.6.4\",\n  \"publishedAt\": 1785158897116\n}\n\nFile v0.6.4:references/setup.md\n\n# wickworks setup\n\nwickworks is a single stateless HTTP container — no DB, no queues, no external\ncalls. Stand one up, point `WICKWORKS_URL` at it, done.\n\n## Requirements\n\n- `docker` (to run the image) and `curl` (to call it), or Python 3.12 + `uv`\n  for a local run.\n- OHLC bars to feed it — wickworks has no market-data feed of its own.\n\n## Security & safety\n\nwickworks ships **auth-less** and **stateless** — bars in, primitives out, no\nwrites, no destructive ops. But anyone who can reach the port can call it, so:\n\n- **Bind to loopback by default** — `-p 127.0.0.1:8000:8000`. Only expose it\n  off-host behind your own reverse proxy / VPN with auth in front.\n- It never fetches or transmits your bars anywhere; it only computes on what you\n  POST. Still, only run an instance you (or a trusted operator) control.\n\n## Quick Install\n\n### docker run\n\n```bash\ndocker run --rm -p 127.0.0.1:8000:8000 psyb0t/wickworks:latest\n# listens on :8000; GET /health to check\n```\n\n### docker compose\n\n```yaml\nservices:\n  wickworks:\n    image: psyb0t/wickworks:latest\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:8000:8000\"\n    environment:\n      LOG_LEVEL: INFO\n      MAX_BARS: \"5000\"\n      MIN_BARS: \"50\"\n      WORKERS: \"2\"\n```\n\n### Local (uv-based)\n\n```bash\nmake install   # uv sync from the pinned lockfile\nmake run       # uvicorn on :8000\n```\n\n## Point the skill at it\n\n```bash\nexport WICKWORKS_URL=\"http://localhost:8000\"\ncurl -s \"$WICKWORKS_URL/health\"     # {\"ok\":true,\"version\":\"...\"}\n```\n\nFor the MCP bridge plugin, the same base URL: `WICKWORKS_URL` (the bridge\nappends `/mcp/`), plus optional `WICKWORKS_TOKEN` if a reverse proxy in front\nrequires a bearer.\n\n## Environment Variables\n\nAll env-driven; sensible defaults, nothing to tune for a first run.\n\n| Variable    | Default | Description |\n| ----------- | ------- | ----------- |\n| `LOG_LEVEL` | `INFO`  | Python logging level. |\n| `MAX_BARS`  | `5000`  | Reject requests with more bars than this (HTTP 413). |\n| `MIN_BARS`  | `50`    | Baseline warm-up floor for SMC outputs / summaries and the fallback for indicators without an explicit requirement. Series indicators (`sma`, `rsi`, `macd`, …) compute their own minimum from params. |\n| `WORKERS`   | `2`     | uvicorn worker count. |\n\nwickworks has **no auth env var** — connection-level access control is the\noperator's responsibility (loopback bind + reverse proxy). The MCP transport's\nDNS-rebinding Host check is disabled so real-hostname deployments work; gate\naccess at your proxy, not the app.\n\nFile v0.6.4:skill-card.md\n\n## Description: <br>\nwickworks helps agents compute technical indicators and Smart-Money-Concepts primitives from user-supplied OHLC candlestick bars through REST or MCP. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[psyb0t](https://clawhub.ai/user/psyb0t) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and agents use wickworks when they already have OHLC candlestick bars and need technical indicators, Smart-Money-Concepts structures, or indicator metadata computed without forecasts or buy/sell opinions. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The wickworks service is auth-less by default, so any reachable port can accept compute requests. <br>\nMitigation: Bind the service to loopback by default and expose it off-host only behind an authenticated reverse proxy, VPN, or equivalent access control. <br>\nRisk: OHLC bars are sent to the instance configured by WICKWORKS_URL. <br>\nMitigation: Use only a wickworks instance you control or trust, and do not send private market data to an unknown operator. <br>\nRisk: Requests can fail when inputs are too large or lack enough bars for selected indicators. <br>\nMitigation: Respect MAX_BARS and MIN_BARS, and handle insufficient_bars, unknown indicator, and 413 responses in agent workflows. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/psyb0t/skills/wickworks) <br>\n- [wickworks setup](references/setup.md) <br>\n- [Project homepage](https://github.com/psyb0t/docker-wickworks) <br>\n- [OpenClaw wickworks plugin](https://github.com/psyb0t/docker-wickworks/tree/main/.agents/plugins/wickworks) <br>\n- [Model Context Protocol](https://modelcontextprotocol.io) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [JSON, Shell commands, Configuration, Guidance] <br>\n**Output Format:** [JSON API and MCP responses, with Markdown setup guidance and inline shell commands] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Computes from caller-supplied OHLC bars; outputs camelCase, NaN-safe JSON and does not provide forecasts, scores, or buy/sell opinions.] <br>\n\n## Skill Version(s): <br>\n0.6.4 (source: ClawHub release metadata) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v0.6.3: 4 files, 7411 bytes\n\nFiles: references/setup.md (2535b), skill-card.md (2327b), SKILL.md (9258b), _meta.json (128b)\n\nFile v0.6.3:SKILL.md\n\n---\nname: wickworks\ndescription: Stateless OHLC primitives service — candlestick bars in, technical indicators + Smart-Money-Concepts objects out. Single POST / takes a bars array + an indicators selection map and returns computed primitives; GET /metadata is the output-path catalog; GET /health. 67 primitives across trend (SMA/EMA + 15 more MAs, slope, Donchian, Ichimoku), momentum (RSI, MACD, Stoch, StochRSI, ADX, MFI, CCI, Williams %R, ROC, MOM, TSI, TRIX, UO, Fisher), volatility (ATR, NATR, Bollinger, Keltner, Squeeze), volume (VWAP, VWMA, OBV, AD, ADOSC, CMF, KVO), and SMC (order blocks, fair-value gaps, BOS/CHoCH, swing structure, S/R levels, liquidity, retracements, sessions, previous-period H/L) plus pre-baked summaries. camelCase, NaN-safe JSON. Unified REST + MCP (streamable-HTTP at /mcp — tools health / list_indicators / metadata / compute). Auth-less by default. Use when the user wants technical indicators or Smart-Money-Concepts primitives computed from OHLC candlestick bars.\nhomepage: https://github.com/psyb0t/docker-wickworks\nuser-invocable: true\nmetadata:\n  { \"openclaw\": { \"emoji\": \"🕯️\", \"primaryEnv\": \"WICKWORKS_URL\", \"requires\": { \"bins\": [\"docker\", \"curl\"] } } }\n---\n\n# wickworks\n\nStateless OHLC primitives service — bars in, indicators + Smart-Money-Concepts objects out. No scoring, no opinions, no state.\n\n- **Trend** — SMA/EMA + 15 other moving averages (`dema`, `tema`, `hma`, `kama`, `zlma`, `t3`, `alma`, `jma`, …), `slope`, `linreg`, Donchian channels, Ichimoku.\n- **Momentum** — RSI, MACD, Stochastic, StochRSI, ADX, MFI, CCI, Williams %R, ROC, MOM, TSI, TRIX, Ultimate Oscillator, Fisher.\n- **Volatility** — ATR, NATR, Bollinger Bands, Keltner Channels, Squeeze.\n- **Volume** — VWAP (anchored), VWMA, OBV, AD, ADOSC, CMF, KVO.\n- **SMC** — order blocks, fair-value gaps (`fvg`/`fvgs`), BOS/CHoCH (`bosChoch`), swing structure (`swingLevels`), S/R levels (`srLevels`), `liquidity`, `retracements`, `sessions`, previous-period H/L, `levels`.\n- **Summaries** — `position`, `slope`, `momentum`, `volume`, `recentRange`, `price` — pre-baked projections over the raw series.\n- **Two ways to drive it** — the REST API (`POST /`) and an MCP server (streamable-HTTP at `/mcp`). Same compute, same output envelope.\n\nAll JSON field names are **camelCase**; output is **NaN-safe** (`NaN` → `null`). Bars are UTC unix seconds; the container runs `TZ=UTC`.\n\nFor installation, configuration, and container setup, see [references/setup.md](references/setup.md).\n\n## Security & safety\n\n- **Stateless + read-only** — every call is self-contained: bars in, primitives out. wickworks stores nothing, writes no files, mutates nothing, and has **no destructive operations**. There is no state to corrupt and nothing to confirm before calling.\n- **Auth-less by default, network-exposed** — wickworks ships with no built-in auth; anyone who can reach the port can call it. Bind it to loopback (`-p 127.0.0.1:8000:8000`) and only expose it behind your own reverse proxy / VPN with auth if it needs to be reachable off-host. The MCP bridge's optional `WICKWORKS_TOKEN` is for a bearer your *proxy* enforces, not wickworks itself.\n- **Consumer of the data you send** — you hand it OHLC bars; it computes on them and returns numbers. It does not fetch, phone home, or transmit your bars anywhere. Point the skill only at a wickworks instance you (or a trusted operator) run.\n- **Bounded input** — the request is capped at `MAX_BARS` bars (default 5000); oversized requests get `413`. Some indicators need a minimum warm-up (`MIN_BARS`, default 50) or they return an `insufficient_bars` error listing the deficits.\n\n## When To Use\n\n- The user has OHLC candlestick bars and wants technical indicators computed (RSI, MACD, Bollinger, Ichimoku, Supertrend, …).\n- The user wants Smart-Money-Concepts structure: order blocks, fair-value gaps, BOS/CHoCH, swing highs/lows, support/resistance, liquidity pools.\n- You're enriching a trading/market dataset server-side and want one call to return many primitives at once.\n\n## When NOT To Use\n\n- The user wants a *forecast*, a *signal*, or a buy/sell *opinion* — wickworks emits primitives only, no scoring. (Forecasting is a different service.)\n- You don't have OHLC bars (wickworks computes on bars you supply; it has no market-data feed of its own).\n- You need indicators over more than `MAX_BARS` bars in one call — window it down or raise `MAX_BARS` on the server.\n\n## Setup\n\n```bash\nexport WICKWORKS_URL=\"http://localhost:8000\"   # your running instance\n```\n\nSee [references/setup.md](references/setup.md) to stand one up (docker compose or `uv`).\n\n## The compute contract — `POST /`\n\nOne endpoint does the work. Body:\n\n```json\n{\n  \"symbol\": \"EURUSD\",\n  \"timeframe\": \"H1\",\n  \"recentBars\": 10,\n  \"bars\": [\n    { \"time\": 1700000000, \"open\": 1.08, \"high\": 1.09, \"low\": 1.07, \"close\": 1.085, \"tickVolume\": 1200 }\n  ],\n  \"indicators\": { \"rsi\": true, \"macd\": true }\n}\n```\n\n- **`bars`** — array of `{ time (UTC unix seconds), open, high, low, close, tickVolume?, realVolume? }`. `tickVolume`/`tick_volume` and `realVolume`/`real_volume` aliases both accepted.\n- **`indicators`** — a map of **output-name → spec**. This is the whole point:\n  - `\"rsi\": true` → run `rsi` with defaults, output under key `rsi`.\n  - `\"rsi14\": { \"type\": \"rsi\", \"length\": 14 }` → run `rsi` with `length=14`, output under key `rsi14` (the key is the output name, `type` picks the indicator).\n  - `\"rsi\": { \"length\": 21 }` → key doubles as the type when no `type` is given.\n- **`symbol` / `timeframe`** — echoed back in the response.\n- **`recentBars`** — signal-like outputs within this many bars of the end get `isRecent: true`.\n\nResponse envelope: `{ symbol, timeframe, candles, <outputName>: <series-or-object>, ... }` — one entry per requested output, each a series the same length as `bars` (or a structured object for multi-line indicators like `macd` / `bbands` / `ichimoku`, or an array of objects for SMC like `orderBlocks` / `fvgs`).\n\n```bash\n# Health\ncurl -s \"$WICKWORKS_URL/health\"\n\n# The output-path catalog (labels + descriptions; static per version — cache it)\ncurl -s \"$WICKWORKS_URL/metadata\"\n\n# Compute RSI + MACD + order blocks in one call\ncurl -s -X POST \"$WICKWORKS_URL/\" -H 'Content-Type: application/json' -d '{\n  \"symbol\": \"EURUSD\", \"timeframe\": \"H1\",\n  \"bars\": [ /* ...OHLC bars... */ ],\n  \"indicators\": { \"rsi\": true, \"macd\": true, \"orderBlocks\": true }\n}'\n```\n\n## Indicator names\n\nPass any of these as `indicators` keys (also available at runtime via the MCP `list_indicators` tool):\n\n```\nad, adosc, adx, alma, aroon, atr, bbands, bosChoch, cci, chandelierExit, cmf,\ndema, donchian, ema, fisher, fvg, fvgs, fwma, hma, ichimoku, jma, kama, kc, kvo,\nlevels, linreg, liquidity, macd, mfi, mom, momentum, natr, obv, orderBlocks,\nposition, previousHighLow, price, psar, recentRange, retracements, rma, roc, rsi,\nsessions, sinwma, slope, sma, squeeze, srLevels, stoch, stochrsi, supertrend,\nswingLevels, swma, t3, tema, trima, trix, tsi, uo, volume, vortex, vwap, vwma,\nwillr, wma, zlma\n```\n\nFetch `GET /metadata` (or the MCP `metadata` tool) for the human-readable label + description of every output path each of these produces.\n\n## MCP Endpoint (`/mcp`)\n\nwickworks mounts a [Model Context Protocol](https://modelcontextprotocol.io) server over Streamable HTTP at `/mcp`, in the same process — so an agent can drive it over JSON-RPC without the REST client. It's **stateless** (no initialize handshake needed) and returns JSON. Tools:\n\n| Tool | Args | Returns |\n|---|---|---|\n| `health` | — | `{ ok, version }` |\n| `list_indicators` | — | `{ indicators: [...] }` — the registered indicator types |\n| `metadata` | — | the output-path catalog (`{ version, count, entries }`) |\n| `compute` | `bars`, `indicators`, `timeframe?`, `symbol?`, `recent_bars?` | the same envelope as `POST /` |\n\nPoint an MCP client straight at the endpoint:\n\n```bash\n# Claude Code (native remote MCP — no bridge needed)\nclaude mcp add --transport http wickworks \"$WICKWORKS_URL/mcp\"\n\n# Raw JSON-RPC (stateless — call tools/call directly)\ncurl -s \"$WICKWORKS_URL/mcp/\" \\\n  -H 'Content-Type: application/json' \\\n  -H 'Accept: application/json, text/event-stream' \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\n       \"params\":{\"name\":\"compute\",\"arguments\":{\n         \"bars\":[/* ...OHLC... */],\"indicators\":{\"rsi\":true},\"symbol\":\"EURUSD\",\"timeframe\":\"H1\"}}}'\n```\n\nThe [`@psyb0t/wickworks`](https://github.com/psyb0t/docker-wickworks/tree/main/.agents/plugins/wickworks) OpenClaw plugin is a thin stdio↔HTTP bridge to this endpoint for MCP clients that only speak local stdio servers.\n\n## Errors\n\n- `400 bars must not be empty` / `400 indicators must not be empty` — empty request pieces.\n- `400 { error: \"insufficient_bars\", available, deficits }` — a requested indicator needs more warm-up bars than supplied; `deficits` lists which and how many.\n- `400` unknown indicator — the requested `type`/key isn't in the registry (see the indicator-names list above).\n- `413 too many bars` — more than `MAX_BARS` bars in one request.\n\nOver MCP the same failures come back as an `isError` tool result carrying the message, not an HTTP status.\n\nFile v0.6.3:_meta.json\n\n{\n  \"ownerId\": \"kn79dhvmpjng4rp2jjk8k0v5xx80ccbk\",\n  \"slug\": \"wickworks\",\n  \"version\": \"0.6.3\",\n  \"publishedAt\": 1785066221095\n}\n\nFile v0.6.3:references/setup.md\n\n# wickworks setup\n\nwickworks is a single stateless HTTP container — no DB, no queues, no external\ncalls. Stand one up, point `WICKWORKS_URL` at it, done.\n\n## Requirements\n\n- `docker` (to run the image) and `curl` (to call it), or Python 3.12 + `uv`\n  for a local run.\n- OHLC bars to feed it — wickworks has no market-data feed of its own.\n\n## Security & safety\n\nwickworks ships **auth-less** and **stateless** — bars in, primitives out, no\nwrites, no destructive ops. But anyone who can reach the port can call it, so:\n\n- **Bind to loopback by default** — `-p 127.0.0.1:8000:8000`. Only expose it\n  off-host behind your own reverse proxy / VPN with auth in front.\n- It never fetches or transmits your bars anywhere; it only computes on what you\n  POST. Still, only run an instance you (or a trusted operator) control.\n\n## Quick Install\n\n### docker run\n\n```bash\ndocker run --rm -p 127.0.0.1:8000:8000 psyb0t/wickworks:latest\n# listens on :8000; GET /health to check\n```\n\n### docker compose\n\n```yaml\nservices:\n  wickworks:\n    image: psyb0t/wickworks:latest\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:8000:8000\"\n    environment:\n      LOG_LEVEL: INFO\n      MAX_BARS: \"5000\"\n      MIN_BARS: \"50\"\n      WORKERS: \"2\"\n```\n\n### Local (uv-based)\n\n```bash\nmake install   # uv sync from the pinned lockfile\nmake run       # uvicorn on :8000\n```\n\n## Point the skill at it\n\n```bash\nexport WICKWORKS_URL=\"http://localhost:8000\"\ncurl -s \"$WICKWORKS_URL/health\"     # {\"ok\":true,\"version\":\"...\"}\n```\n\nFor the MCP bridge plugin, the same base URL: `WICKWORKS_URL` (the bridge\nappends `/mcp/`), plus optional `WICKWORKS_TOKEN` if a reverse proxy in front\nrequires a bearer.\n\n## Environment Variables\n\nAll env-driven; sensible defaults, nothing to tune for a first run.\n\n| Variable    | Default | Description |\n| ----------- | ------- | ----------- |\n| `LOG_LEVEL` | `INFO`  | Python logging level. |\n| `MAX_BARS`  | `5000`  | Reject requests with more bars than this (HTTP 413). |\n| `MIN_BARS`  | `50`    | Baseline warm-up floor for SMC outputs / summaries and the fallback for indicators without an explicit requirement. Series indicators (`sma`, `rsi`, `macd`, …) compute their own minimum from params. |\n| `WORKERS`   | `2`     | uvicorn worker count. |\n\nwickworks has **no auth env var** — connection-level access control is the\noperator's responsibility (loopback bind + reverse proxy). The MCP transport's\nDNS-rebinding Host check is disabled so real-hostname deployments work; gate\naccess at your proxy, not the app.\n\nFile v0.6.3:skill-card.md\n\n## Description: <br>\nwickworks helps agents compute technical indicators and Smart-Money-Concepts primitives from caller-provided OHLC candlestick bars through a stateless REST or MCP service. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[psyb0t](https://clawhub.ai/user/psyb0t) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and trading-data agents use wickworks when they already have OHLC bars and need technical indicators or SMC structures computed without forecasting, scoring, or stateful data storage. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The wickworks service is auth-less if exposed beyond localhost. <br>\nMitigation: Bind it to localhost by default and expose it off-host only behind an authenticated reverse proxy or VPN. <br>\nRisk: Using an unpinned container image can reduce deployment reproducibility. <br>\nMitigation: Pin a specific Docker image version for deployments that need repeatable behavior. <br>\nRisk: Requests can fail when they exceed configured bar limits or do not include enough warm-up bars for selected indicators. <br>\nMitigation: Respect MAX_BARS and MIN_BARS settings, and handle insufficient_bars and 413 responses in the calling workflow. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/psyb0t/skills/wickworks) <br>\n- [wickworks setup](references/setup.md) <br>\n- [Model Context Protocol](https://modelcontextprotocol.io) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [JSON, API calls, Shell commands, Configuration guidance] <br>\n**Output Format:** [Markdown guidance with shell, JSON, REST, and MCP examples; service responses are JSON.] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Computes stateless, NaN-safe outputs from caller-provided OHLC bars and returns insufficient-input or oversize-request errors when limits are not met.] <br>\n\n## Skill Version(s): <br>\n0.6.3 (source: server release metadata) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v0.6.2: 4 files, 7449 bytes\n\nFiles: references/setup.md (2535b), skill-card.md (2473b), SKILL.md (9258b), _meta.json (128b)\n\nFile v0.6.2:SKILL.md\n\n---\nname: wickworks\ndescription: Stateless OHLC primitives service — candlestick bars in, technical indicators + Smart-Money-Concepts objects out. Single POST / takes a bars array + an indicators selection map and returns computed primitives; GET /metadata is the output-path catalog; GET /health. 67 primitives across trend (SMA/EMA + 15 more MAs, slope, Donchian, Ichimoku), momentum (RSI, MACD, Stoch, StochRSI, ADX, MFI, CCI, Williams %R, ROC, MOM, TSI, TRIX, UO, Fisher), volatility (ATR, NATR, Bollinger, Keltner, Squeeze), volume (VWAP, VWMA, OBV, AD, ADOSC, CMF, KVO), and SMC (order blocks, fair-value gaps, BOS/CHoCH, swing structure, S/R levels, liquidity, retracements, sessions, previous-period H/L) plus pre-baked summaries. camelCase, NaN-safe JSON. Unified REST + MCP (streamable-HTTP at /mcp — tools health / list_indicators / metadata / compute). Auth-less by default. Use when the user wants technical indicators or Smart-Money-Concepts primitives computed from OHLC candlestick bars.\nhomepage: https://github.com/psyb0t/docker-wickworks\nuser-invocable: true\nmetadata:\n  { \"openclaw\": { \"emoji\": \"🕯️\", \"primaryEnv\": \"WICKWORKS_URL\", \"requires\": { \"bins\": [\"docker\", \"curl\"] } } }\n---\n\n# wickworks\n\nStateless OHLC primitives service — bars in, indicators + Smart-Money-Concepts objects out. No scoring, no opinions, no state.\n\n- **Trend** — SMA/EMA + 15 other moving averages (`dema`, `tema`, `hma`, `kama`, `zlma`, `t3`, `alma`, `jma`, …), `slope`, `linreg`, Donchian channels, Ichimoku.\n- **Momentum** — RSI, MACD, Stochastic, StochRSI, ADX, MFI, CCI, Williams %R, ROC, MOM, TSI, TRIX, Ultimate Oscillator, Fisher.\n- **Volatility** — ATR, NATR, Bollinger Bands, Keltner Channels, Squeeze.\n- **Volume** — VWAP (anchored), VWMA, OBV, AD, ADOSC, CMF, KVO.\n- **SMC** — order blocks, fair-value gaps (`fvg`/`fvgs`), BOS/CHoCH (`bosChoch`), swing structure (`swingLevels`), S/R levels (`srLevels`), `liquidity`, `retracements`, `sessions`, previous-period H/L, `levels`.\n- **Summaries** — `position`, `slope`, `momentum`, `volume`, `recentRange`, `price` — pre-baked projections over the raw series.\n- **Two ways to drive it** — the REST API (`POST /`) and an MCP server (streamable-HTTP at `/mcp`). Same compute, same output envelope.\n\nAll JSON field names are **camelCase**; output is **NaN-safe** (`NaN` → `null`). Bars are UTC unix seconds; the container runs `TZ=UTC`.\n\nFor installation, configuration, and container setup, see [references/setup.md](references/setup.md).\n\n## Security & safety\n\n- **Stateless + read-only** — every call is self-contained: bars in, primitives out. wickworks stores nothing, writes no files, mutates nothing, and has **no destructive operations**. There is no state to corrupt and nothing to confirm before calling.\n- **Auth-less by default, network-exposed** — wickworks ships with no built-in auth; anyone who can reach the port can call it. Bind it to loopback (`-p 127.0.0.1:8000:8000`) and only expose it behind your own reverse proxy / VPN with auth if it needs to be reachable off-host. The MCP bridge's optional `WICKWORKS_TOKEN` is for a bearer your *proxy* enforces, not wickworks itself.\n- **Consumer of the data you send** — you hand it OHLC bars; it computes on them and returns numbers. It does not fetch, phone home, or transmit your bars anywhere. Point the skill only at a wickworks instance you (or a trusted operator) run.\n- **Bounded input** — the request is capped at `MAX_BARS` bars (default 5000); oversized requests get `413`. Some indicators need a minimum warm-up (`MIN_BARS`, default 50) or they return an `insufficient_bars` error listing the deficits.\n\n## When To Use\n\n- The user has OHLC candlestick bars and wants technical indicators computed (RSI, MACD, Bollinger, Ichimoku, Supertrend, …).\n- The user wants Smart-Money-Concepts structure: order blocks, fair-value gaps, BOS/CHoCH, swing highs/lows, support/resistance, liquidity pools.\n- You're enriching a trading/market dataset server-side and want one call to return many primitives at once.\n\n## When NOT To Use\n\n- The user wants a *forecast*, a *signal*, or a buy/sell *opinion* — wickworks emits primitives only, no scoring. (Forecasting is a different service.)\n- You don't have OHLC bars (wickworks computes on bars you supply; it has no market-data feed of its own).\n- You need indicators over more than `MAX_BARS` bars in one call — window it down or raise `MAX_BARS` on the server.\n\n## Setup\n\n```bash\nexport WICKWORKS_URL=\"http://localhost:8000\"   # your running instance\n```\n\nSee [references/setup.md](references/setup.md) to stand one up (docker compose or `uv`).\n\n## The compute contract — `POST /`\n\nOne endpoint does the work. Body:\n\n```json\n{\n  \"symbol\": \"EURUSD\",\n  \"timeframe\": \"H1\",\n  \"recentBars\": 10,\n  \"bars\": [\n    { \"time\": 1700000000, \"open\": 1.08, \"high\": 1.09, \"low\": 1.07, \"close\": 1.085, \"tickVolume\": 1200 }\n  ],\n  \"indicators\": { \"rsi\": true, \"macd\": true }\n}\n```\n\n- **`bars`** — array of `{ time (UTC unix seconds), open, high, low, close, tickVolume?, realVolume? }`. `tickVolume`/`tick_volume` and `realVolume`/`real_volume` aliases both accepted.\n- **`indicators`** — a map of **output-name → spec**. This is the whole point:\n  - `\"rsi\": true` → run `rsi` with defaults, output under key `rsi`.\n  - `\"rsi14\": { \"type\": \"rsi\", \"length\": 14 }` → run `rsi` with `length=14`, output under key `rsi14` (the key is the output name, `type` picks the indicator).\n  - `\"rsi\": { \"length\": 21 }` → key doubles as the type when no `type` is given.\n- **`symbol` / `timeframe`** — echoed back in the response.\n- **`recentBars`** — signal-like outputs within this many bars of the end get `isRecent: true`.\n\nResponse envelope: `{ symbol, timeframe, candles, <outputName>: <series-or-object>, ... }` — one entry per requested output, each a series the same length as `bars` (or a structured object for multi-line indicators like `macd` / `bbands` / `ichimoku`, or an array of objects for SMC like `orderBlocks` / `fvgs`).\n\n```bash\n# Health\ncurl -s \"$WICKWORKS_URL/health\"\n\n# The output-path catalog (labels + descriptions; static per version — cache it)\ncurl -s \"$WICKWORKS_URL/metadata\"\n\n# Compute RSI + MACD + order blocks in one call\ncurl -s -X POST \"$WICKWORKS_URL/\" -H 'Content-Type: application/json' -d '{\n  \"symbol\": \"EURUSD\", \"timeframe\": \"H1\",\n  \"bars\": [ /* ...OHLC bars... */ ],\n  \"indicators\": { \"rsi\": true, \"macd\": true, \"orderBlocks\": true }\n}'\n```\n\n## Indicator names\n\nPass any of these as `indicators` keys (also available at runtime via the MCP `list_indicators` tool):\n\n```\nad, adosc, adx, alma, aroon, atr, bbands, bosChoch, cci, chandelierExit, cmf,\ndema, donchian, ema, fisher, fvg, fvgs, fwma, hma, ichimoku, jma, kama, kc, kvo,\nlevels, linreg, liquidity, macd, mfi, mom, momentum, natr, obv, orderBlocks,\nposition, previousHighLow, price, psar, recentRange, retracements, rma, roc, rsi,\nsessions, sinwma, slope, sma, squeeze, srLevels, stoch, stochrsi, supertrend,\nswingLevels, swma, t3, tema, trima, trix, tsi, uo, volume, vortex, vwap, vwma,\nwillr, wma, zlma\n```\n\nFetch `GET /metadata` (or the MCP `metadata` tool) for the human-readable label + description of every output path each of these produces.\n\n## MCP Endpoint (`/mcp`)\n\nwickworks mounts a [Model Context Protocol](https://modelcontextprotocol.io) server over Streamable HTTP at `/mcp`, in the same process — so an agent can drive it over JSON-RPC without the REST client. It's **stateless** (no initialize handshake needed) and returns JSON. Tools:\n\n| Tool | Args | Returns |\n|---|---|---|\n| `health` | — | `{ ok, version }` |\n| `list_indicators` | — | `{ indicators: [...] }` — the registered indicator types |\n| `metadata` | — | the output-path catalog (`{ version, count, entries }`) |\n| `compute` | `bars`, `indicators`, `timeframe?`, `symbol?`, `recent_bars?` | the same envelope as `POST /` |\n\nPoint an MCP client straight at the endpoint:\n\n```bash\n# Claude Code (native remote MCP — no bridge needed)\nclaude mcp add --transport http wickworks \"$WICKWORKS_URL/mcp\"\n\n# Raw JSON-RPC (stateless — call tools/call directly)\ncurl -s \"$WICKWORKS_URL/mcp/\" \\\n  -H 'Content-Type: application/json' \\\n  -H 'Accept: application/json, text/event-stream' \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\n       \"params\":{\"name\":\"compute\",\"arguments\":{\n         \"bars\":[/* ...OHLC... */],\"indicators\":{\"rsi\":true},\"symbol\":\"EURUSD\",\"timeframe\":\"H1\"}}}'\n```\n\nThe [`@psyb0t/wickworks`](https://github.com/psyb0t/docker-wickworks/tree/main/.agents/plugins/wickworks) OpenClaw plugin is a thin stdio↔HTTP bridge to this endpoint for MCP clients that only speak local stdio servers.\n\n## Errors\n\n- `400 bars must not be empty` / `400 indicators must not be empty` — empty request pieces.\n- `400 { error: \"insufficient_bars\", available, deficits }` — a requested indicator needs more warm-up bars than supplied; `deficits` lists which and how many.\n- `400` unknown indicator — the requested `type`/key isn't in the registry (see the indicator-names list above).\n- `413 too many bars` — more than `MAX_BARS` bars in one request.\n\nOver MCP the same failures come back as an `isError` tool result carrying the message, not an HTTP status.\n\nFile v0.6.2:_meta.json\n\n{\n  \"ownerId\": \"kn79dhvmpjng4rp2jjk8k0v5xx80ccbk\",\n  \"slug\": \"wickworks\",\n  \"version\": \"0.6.2\",\n  \"publishedAt\": 1785065525069\n}\n\nFile v0.6.2:references/setup.md\n\n# wickworks setup\n\nwickworks is a single stateless HTTP container — no DB, no queues, no external\ncalls. Stand one up, point `WICKWORKS_URL` at it, done.\n\n## Requirements\n\n- `docker` (to run the image) and `curl` (to call it), or Python 3.12 + `uv`\n  for a local run.\n- OHLC bars to feed it — wickworks has no market-data feed of its own.\n\n## Security & safety\n\nwickworks ships **auth-less** and **stateless** — bars in, primitives out, no\nwrites, no destructive ops. But anyone who can reach the port can call it, so:\n\n- **Bind to loopback by default** — `-p 127.0.0.1:8000:8000`. Only expose it\n  off-host behind your own reverse proxy / VPN with auth in front.\n- It never fetches or transmits your bars anywhere; it only computes on what you\n  POST. Still, only run an instance you (or a trusted operator) control.\n\n## Quick Install\n\n### docker run\n\n```bash\ndocker run --rm -p 127.0.0.1:8000:8000 psyb0t/wickworks:latest\n# listens on :8000; GET /health to check\n```\n\n### docker compose\n\n```yaml\nservices:\n  wickworks:\n    image: psyb0t/wickworks:latest\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:8000:8000\"\n    environment:\n      LOG_LEVEL: INFO\n      MAX_BARS: \"5000\"\n      MIN_BARS: \"50\"\n      WORKERS: \"2\"\n```\n\n### Local (uv-based)\n\n```bash\nmake install   # uv sync from the pinned lockfile\nmake run       # uvicorn on :8000\n```\n\n## Point the skill at it\n\n```bash\nexport WICKWORKS_URL=\"http://localhost:8000\"\ncurl -s \"$WICKWORKS_URL/health\"     # {\"ok\":true,\"version\":\"...\"}\n```\n\nFor the MCP bridge plugin, the same base URL: `WICKWORKS_URL` (the bridge\nappends `/mcp/`), plus optional `WICKWORKS_TOKEN` if a reverse proxy in front\nrequires a bearer.\n\n## Environment Variables\n\nAll env-driven; sensible defaults, nothing to tune for a first run.\n\n| Variable    | Default | Description |\n| ----------- | ------- | ----------- |\n| `LOG_LEVEL` | `INFO`  | Python logging level. |\n| `MAX_BARS`  | `5000`  | Reject requests with more bars than this (HTTP 413). |\n| `MIN_BARS`  | `50`    | Baseline warm-up floor for SMC outputs / summaries and the fallback for indicators without an explicit requirement. Series indicators (`sma`, `rsi`, `macd`, …) compute their own minimum from params. |\n| `WORKERS`   | `2`     | uvicorn worker count. |\n\nwickworks has **no auth env var** — connection-level access control is the\noperator's responsibility (loopback bind + reverse proxy). The MCP transport's\nDNS-rebinding Host check is disabled so real-hostname deployments work; gate\naccess at your proxy, not the app.\n\nFile v0.6.2:skill-card.md\n\n## Description: <br>\nwickworks helps agents compute technical indicators and Smart-Money-Concepts primitives from supplied OHLC candlestick bars through a stateless REST or MCP service. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[psyb0t](https://clawhub.ai/user/psyb0t) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and trading-analysis agents use this skill when they already have OHLC bars and need computed indicators, market-structure primitives, metadata, or health checks from a trusted wickworks instance. It is not for forecasts, buy/sell recommendations, or fetching market data. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The wickworks service is auth-less by default, so an exposed port can be called by anyone who can reach it. <br>\nMitigation: Bind the service to localhost or place it behind an authenticated reverse proxy or VPN before exposing it off-host. <br>\nRisk: OHLC bars sent to an untrusted wickworks instance may reveal sensitive proprietary market data. <br>\nMitigation: Use only an instance operated by you or another trusted operator, and avoid sending sensitive bars to untrusted endpoints. <br>\nRisk: Oversized or under-warmed inputs can fail or return insufficient-bars errors instead of computed primitives. <br>\nMitigation: Keep requests within the configured MAX_BARS limit and provide enough history for the requested indicators. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/psyb0t/skills/wickworks) <br>\n- [wickworks setup](references/setup.md) <br>\n- [Model Context Protocol](https://modelcontextprotocol.io) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Guidance, Shell commands, Configuration, JSON] <br>\n**Output Format:** [Markdown guidance with shell examples and JSON request or response shapes] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Outputs are NaN-safe JSON from a user-selected wickworks endpoint; computed values depend on the supplied bars and requested indicators.] <br>\n\n## Skill Version(s): <br>\n0.6.2 (source: server release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v0.6.1: 4 files, 7479 bytes\n\nFiles: references/setup.md (2535b), skill-card.md (2509b), SKILL.md (9258b), _meta.json (128b)\n\nFile v0.6.1:SKILL.md\n\n---\nname: wickworks\ndescription: Stateless OHLC primitives service — candlestick bars in, technical indicators + Smart-Money-Concepts objects out. Single POST / takes a bars array + an indicators selection map and returns computed primitives; GET /metadata is the output-path catalog; GET /health. 67 primitives across trend (SMA/EMA + 15 more MAs, slope, Donchian, Ichimoku), momentum (RSI, MACD, Stoch, StochRSI, ADX, MFI, CCI, Williams %R, ROC, MOM, TSI, TRIX, UO, Fisher), volatility (ATR, NATR, Bollinger, Keltner, Squeeze), volume (VWAP, VWMA, OBV, AD, ADOSC, CMF, KVO), and SMC (order blocks, fair-value gaps, BOS/CHoCH, swing structure, S/R levels, liquidity, retracements, sessions, previous-period H/L) plus pre-baked summaries. camelCase, NaN-safe JSON. Unified REST + MCP (streamable-HTTP at /mcp — tools health / list_indicators / metadata / compute). Auth-less by default. Use when the user wants technical indicators or Smart-Money-Concepts primitives computed from OHLC candlestick bars.\nhomepage: https://github.com/psyb0t/docker-wickworks\nuser-invocable: true\nmetadata:\n  { \"openclaw\": { \"emoji\": \"🕯️\", \"primaryEnv\": \"WICKWORKS_URL\", \"requires\": { \"bins\": [\"docker\", \"curl\"] } } }\n---\n\n# wickworks\n\nStateless OHLC primitives service — bars in, indicators + Smart-Money-Concepts objects out. No scoring, no opinions, no state.\n\n- **Trend** — SMA/EMA + 15 other moving averages (`dema`, `tema`, `hma`, `kama`, `zlma`, `t3`, `alma`, `jma`, …), `slope`, `linreg`, Donchian channels, Ichimoku.\n- **Momentum** — RSI, MACD, Stochastic, StochRSI, ADX, MFI, CCI, Williams %R, ROC, MOM, TSI, TRIX, Ultimate Oscillator, Fisher.\n- **Volatility** — ATR, NATR, Bollinger Bands, Keltner Channels, Squeeze.\n- **Volume** — VWAP (anchored), VWMA, OBV, AD, ADOSC, CMF, KVO.\n- **SMC** — order blocks, fair-value gaps (`fvg`/`fvgs`), BOS/CHoCH (`bosChoch`), swing structure (`swingLevels`), S/R levels (`srLevels`), `liquidity`, `retracements`, `sessions`, previous-period H/L, `levels`.\n- **Summaries** — `position`, `slope`, `momentum`, `volume`, `recentRange`, `price` — pre-baked projections over the raw series.\n- **Two ways to drive it** — the REST API (`POST /`) and an MCP server (streamable-HTTP at `/mcp`). Same compute, same output envelope.\n\nAll JSON field names are **camelCase**; output is **NaN-safe** (`NaN` → `null`). Bars are UTC unix seconds; the container runs `TZ=UTC`.\n\nFor installation, configuration, and container setup, see [references/setup.md](references/setup.md).\n\n## Security & safety\n\n- **Stateless + read-only** — every call is self-contained: bars in, primitives out. wickworks stores nothing, writes no files, mutates nothing, and has **no destructive operations**. There is no state to corrupt and nothing to confirm before calling.\n- **Auth-less by default, network-exposed** — wickworks ships with no built-in auth; anyone who can reach the port can call it. Bind it to loopback (`-p 127.0.0.1:8000:8000`) and only expose it behind your own reverse proxy / VPN with auth if it needs to be reachable off-host. The MCP bridge's optional `WICKWORKS_TOKEN` is for a bearer your *proxy* enforces, not wickworks itself.\n- **Consumer of the data you send** — you hand it OHLC bars; it computes on them and returns numbers. It does not fetch, phone home, or transmit your bars anywhere. Point the skill only at a wickworks instance you (or a trusted operator) run.\n- **Bounded input** — the request is capped at `MAX_BARS` bars (default 5000); oversized requests get `413`. Some indicators need a minimum warm-up (`MIN_BARS`, default 50) or they return an `insufficient_bars` error listing the deficits.\n\n## When To Use\n\n- The user has OHLC candlestick bars and wants technical indicators computed (RSI, MACD, Bollinger, Ichimoku, Supertrend, …).\n- The user wants Smart-Money-Concepts structure: order blocks, fair-value gaps, BOS/CHoCH, swing highs/lows, support/resistance, liquidity pools.\n- You're enriching a trading/market dataset server-side and want one call to return many primitives at once.\n\n## When NOT To Use\n\n- The user wants a *forecast*, a *signal*, or a buy/sell *opinion* — wickworks emits primitives only, no scoring. (Forecasting is a different service.)\n- You don't have OHLC bars (wickworks computes on bars you supply; it has no market-data feed of its own).\n- You need indicators over more than `MAX_BARS` bars in one call — window it down or raise `MAX_BARS` on the server.\n\n## Setup\n\n```bash\nexport WICKWORKS_URL=\"http://localhost:8000\"   # your running instance\n```\n\nSee [references/setup.md](references/setup.md) to stand one up (docker compose or `uv`).\n\n## The compute contract — `POST /`\n\nOne endpoint does the work. Body:\n\n```json\n{\n  \"symbol\": \"EURUSD\",\n  \"timeframe\": \"H1\",\n  \"recentBars\": 10,\n  \"bars\": [\n    { \"time\": 1700000000, \"open\": 1.08, \"high\": 1.09, \"low\": 1.07, \"close\": 1.085, \"tickVolume\": 1200 }\n  ],\n  \"indicators\": { \"rsi\": true, \"macd\": true }\n}\n```\n\n- **`bars`** — array of `{ time (UTC unix seconds), open, high, low, close, tickVolume?, realVolume? }`. `tickVolume`/`tick_volume` and `realVolume`/`real_volume` aliases both accepted.\n- **`indicators`** — a map of **output-name → spec**. This is the whole point:\n  - `\"rsi\": true` → run `rsi` with defaults, output under key `rsi`.\n  - `\"rsi14\": { \"type\": \"rsi\", \"length\": 14 }` → run `rsi` with `length=14`, output under key `rsi14` (the key is the output name, `type` picks the indicator).\n  - `\"rsi\": { \"length\": 21 }` → key doubles as the type when no `type` is given.\n- **`symbol` / `timeframe`** — echoed back in the response.\n- **`recentBars`** — signal-like outputs within this many bars of the end get `isRecent: true`.\n\nResponse envelope: `{ symbol, timeframe, candles, <outputName>: <series-or-object>, ... }` — one entry per requested output, each a series the same length as `bars` (or a structured object for multi-line indicators like `macd` / `bbands` / `ichimoku`, or an array of objects for SMC like `orderBlocks` / `fvgs`).\n\n```bash\n# Health\ncurl -s \"$WICKWORKS_URL/health\"\n\n# The output-path catalog (labels + descriptions; static per version — cache it)\ncurl -s \"$WICKWORKS_URL/metadata\"\n\n# Compute RSI + MACD + order blocks in one call\ncurl -s -X POST \"$WICKWORKS_URL/\" -H 'Content-Type: application/json' -d '{\n  \"symbol\": \"EURUSD\", \"timeframe\": \"H1\",\n  \"bars\": [ /* ...OHLC bars... */ ],\n  \"indicators\": { \"rsi\": true, \"macd\": true, \"orderBlocks\": true }\n}'\n```\n\n## Indicator names\n\nPass any of these as `indicators` keys (also available at runtime via the MCP `list_indicators` tool):\n\n```\nad, adosc, adx, alma, aroon, atr, bbands, bosChoch, cci, chandelierExit, cmf,\ndema, donchian, ema, fisher, fvg, fvgs, fwma, hma, ichimoku, jma, kama, kc, kvo,\nlevels, linreg, liquidity, macd, mfi, mom, momentum, natr, obv, orderBlocks,\nposition, previousHighLow, price, psar, recentRange, retracements, rma, roc, rsi,\nsessions, sinwma, slope, sma, squeeze, srLevels, stoch, stochrsi, supertrend,\nswingLevels, swma, t3, tema, trima, trix, tsi, uo, volume, vortex, vwap, vwma,\nwillr, wma, zlma\n```\n\nFetch `GET /metadata` (or the MCP `metadata` tool) for the human-readable label + description of every output path each of these produces.\n\n## MCP Endpoint (`/mcp`)\n\nwickworks mounts a [Model Context Protocol](https://modelcontextprotocol.io) server over Streamable HTTP at `/mcp`, in the same process — so an agent can drive it over JSON-RPC without the REST client. It's **stateless** (no initialize handshake needed) and returns JSON. Tools:\n\n| Tool | Args | Returns |\n|---|---|---|\n| `health` | — | `{ ok, version }` |\n| `list_indicators` | — | `{ indicators: [...] }` — the registered indicator types |\n| `metadata` | — | the output-path catalog (`{ version, count, entries }`) |\n| `compute` | `bars`, `indicators`, `timeframe?`, `symbol?`, `recent_bars?` | the same envelope as `POST /` |\n\nPoint an MCP client straight at the endpoint:\n\n```bash\n# Claude Code (native remote MCP — no bridge needed)\nclaude mcp add --transport http wickworks \"$WICKWORKS_URL/mcp\"\n\n# Raw JSON-RPC (stateless — call tools/call directly)\ncurl -s \"$WICKWORKS_URL/mcp/\" \\\n  -H 'Content-Type: application/json' \\\n  -H 'Accept: application/json, text/event-stream' \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\n       \"params\":{\"name\":\"compute\",\"arguments\":{\n         \"bars\":[/* ...OHLC... */],\"indicators\":{\"rsi\":true},\"symbol\":\"EURUSD\",\"timeframe\":\"H1\"}}}'\n```\n\nThe [`@psyb0t/wickworks`](https://github.com/psyb0t/docker-wickworks/tree/main/.agents/plugins/wickworks) OpenClaw plugin is a thin stdio↔HTTP bridge to this endpoint for MCP clients that only speak local stdio servers.\n\n## Errors\n\n- `400 bars must not be empty` / `400 indicators must not be empty` — empty request pieces.\n- `400 { error: \"insufficient_bars\", available, deficits }` — a requested indicator needs more warm-up bars than supplied; `deficits` lists which and how many.\n- `400` unknown indicator — the requested `type`/key isn't in the registry (see the indicator-names list above).\n- `413 too many bars` — more than `MAX_BARS` bars in one request.\n\nOver MCP the same failures come back as an `isError` tool result carrying the message, not an HTTP status.\n\nFile v0.6.1:_meta.json\n\n{\n  \"ownerId\": \"kn79dhvmpjng4rp2jjk8k0v5xx80ccbk\",\n  \"slug\": \"wickworks\",\n  \"version\": \"0.6.1\",\n  \"publishedAt\": 1785057901128\n}\n\nFile v0.6.1:references/setup.md\n\n# wickworks setup\n\nwickworks is a single stateless HTTP container — no DB, no queues, no external\ncalls. Stand one up, point `WICKWORKS_URL` at it, done.\n\n## Requirements\n\n- `docker` (to run the image) and `curl` (to call it), or Python 3.12 + `uv`\n  for a local run.\n- OHLC bars to feed it — wickworks has no market-data feed of its own.\n\n## Security & safety\n\nwickworks ships **auth-less** and **stateless** — bars in, primitives out, no\nwrites, no destructive ops. But anyone who can reach the port can call it, so:\n\n- **Bind to loopback by default** — `-p 127.0.0.1:8000:8000`. Only expose it\n  off-host behind your own reverse proxy / VPN with auth in front.\n- It never fetches or transmits your bars anywhere; it only computes on what you\n  POST. Still, only run an instance you (or a trusted operator) control.\n\n## Quick Install\n\n### docker run\n\n```bash\ndocker run --rm -p 127.0.0.1:8000:8000 psyb0t/wickworks:latest\n# listens on :8000; GET /health to check\n```\n\n### docker compose\n\n```yaml\nservices:\n  wickworks:\n    image: psyb0t/wickworks:latest\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:8000:8000\"\n    environment:\n      LOG_LEVEL: INFO\n      MAX_BARS: \"5000\"\n      MIN_BARS: \"50\"\n      WORKERS: \"2\"\n```\n\n### Local (uv-based)\n\n```bash\nmake install   # uv sync from the pinned lockfile\nmake run       # uvicorn on :8000\n```\n\n## Point the skill at it\n\n```bash\nexport WICKWORKS_URL=\"http://localhost:8000\"\ncurl -s \"$WICKWORKS_URL/health\"     # {\"ok\":true,\"version\":\"...\"}\n```\n\nFor the MCP bridge plugin, the same base URL: `WICKWORKS_URL` (the bridge\nappends `/mcp/`), plus optional `WICKWORKS_TOKEN` if a reverse proxy in front\nrequires a bearer.\n\n## Environment Variables\n\nAll env-driven; sensible defaults, nothing to tune for a first run.\n\n| Variable    | Default | Description |\n| ----------- | ------- | ----------- |\n| `LOG_LEVEL` | `INFO`  | Python logging level. |\n| `MAX_BARS`  | `5000`  | Reject requests with more bars than this (HTTP 413). |\n| `MIN_BARS`  | `50`    | Baseline warm-up floor for SMC outputs / summaries and the fallback for indicators without an explicit requirement. Series indicators (`sma`, `rsi`, `macd`, …) compute their own minimum from params. |\n| `WORKERS`   | `2`     | uvicorn worker count. |\n\nwickworks has **no auth env var** — connection-level access control is the\noperator's responsibility (loopback bind + reverse proxy). The MCP transport's\nDNS-rebinding Host check is disabled so real-hostname deployments work; gate\naccess at your proxy, not the app.\n\nFile v0.6.1:skill-card.md\n\n## Description: <br>\nwickworks helps agents compute stateless technical indicators and Smart-Money-Concepts primitives from user-supplied OHLC candlestick bars through REST or MCP. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[psyb0t](https://clawhub.ai/user/psyb0t) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and trading-analysis agents use wickworks to enrich market datasets by computing indicator series, Smart-Money-Concepts structures, metadata, and health checks from supplied OHLC bars. It is for market-data primitives, not forecasts, signals, or buy/sell opinions. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The wickworks service is auth-less by default, so a network-exposed instance can be called by anyone who can reach its port. <br>\nMitigation: Bind the service to 127.0.0.1 by default and only expose it off-host behind an authenticated reverse proxy or VPN. <br>\nRisk: Market bar data sent to an untrusted wickworks instance could disclose proprietary trading data. <br>\nMitigation: Send OHLC bars only to an instance operated by you or another trusted operator. <br>\nRisk: Oversized or under-warmed indicator requests may fail instead of producing output. <br>\nMitigation: Respect MAX_BARS limits, window large datasets, and provide enough warm-up bars for the requested indicators. <br>\n\n\n## Reference(s): <br>\n- [wickworks setup](references/setup.md) <br>\n- [Project homepage](https://github.com/psyb0t/docker-wickworks) <br>\n- [Model Context Protocol](https://modelcontextprotocol.io) <br>\n- [ClawHub skill page](https://clawhub.ai/psyb0t/skills/wickworks) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Guidance, Shell commands, Configuration, API Calls, JSON] <br>\n**Output Format:** [Markdown guidance with bash and JSON examples; runtime service responses are NaN-safe camelCase JSON.] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Uses caller-supplied OHLC bars and an indicator selection map; bounded by the configured MAX_BARS and indicator warm-up requirements.] <br>\n\n## Skill Version(s): <br>\n0.6.1 (source: release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v0.6.0: 4 files, 7304 bytes\n\nFiles: references/setup.md (2535b), skill-card.md (2119b), SKILL.md (9258b), _meta.json (128b)\n\nFile v0.6.0:SKILL.md\n\n---\nname: wickworks\ndescription: Stateless OHLC primitives service — candlestick bars in, technical indicators + Smart-Money-Concepts objects out. Single POST / takes a bars array + an indicators selection map and returns computed primitives; GET /metadata is the output-path catalog; GET /health. 67 primitives across trend (SMA/EMA + 15 more MAs, slope, Donchian, Ichimoku), momentum (RSI, MACD, Stoch, StochRSI, ADX, MFI, CCI, Williams %R, ROC, MOM, TSI, TRIX, UO, Fisher), volatility (ATR, NATR, Bollinger, Keltner, Squeeze), volume (VWAP, VWMA, OBV, AD, ADOSC, CMF, KVO), and SMC (order blocks, fair-value gaps, BOS/CHoCH, swing structure, S/R levels, liquidity, retracements, sessions, previous-period H/L) plus pre-baked summaries. camelCase, NaN-safe JSON. Unified REST + MCP (streamable-HTTP at /mcp — tools health / list_indicators / metadata / compute). Auth-less by default. Use when the user wants technical indicators or Smart-Money-Concepts primitives computed from OHLC candlestick bars.\nhomepage: https://github.com/psyb0t/docker-wickworks\nuser-invocable: true\nmetadata:\n  { \"openclaw\": { \"emoji\": \"🕯️\", \"primaryEnv\": \"WICKWORKS_URL\", \"requires\": { \"bins\": [\"docker\", \"curl\"] } } }\n---\n\n# wickworks\n\nStateless OHLC primitives service — bars in, indicators + Smart-Money-Concepts objects out. No scoring, no opinions, no state.\n\n- **Trend** — SMA/EMA + 15 other moving averages (`dema`, `tema`, `hma`, `kama`, `zlma`, `t3`, `alma`, `jma`, …), `slope`, `linreg`, Donchian channels, Ichimoku.\n- **Momentum** — RSI, MACD, Stochastic, StochRSI, ADX, MFI, CCI, Williams %R, ROC, MOM, TSI, TRIX, Ultimate Oscillator, Fisher.\n- **Volatility** — ATR, NATR, Bollinger Bands, Keltner Channels, Squeeze.\n- **Volume** — VWAP (anchored), VWMA, OBV, AD, ADOSC, CMF, KVO.\n- **SMC** — order blocks, fair-value gaps (`fvg`/`fvgs`), BOS/CHoCH (`bosChoch`), swing structure (`swingLevels`), S/R levels (`srLevels`), `liquidity`, `retracements`, `sessions`, previous-period H/L, `levels`.\n- **Summaries** — `position`, `slope`, `momentum`, `volume`, `recentRange`, `price` — pre-baked projections over the raw series.\n- **Two ways to drive it** — the REST API (`POST /`) and an MCP server (streamable-HTTP at `/mcp`). Same compute, same output envelope.\n\nAll JSON field names are **camelCase**; output is **NaN-safe** (`NaN` → `null`). Bars are UTC unix seconds; the container runs `TZ=UTC`.\n\nFor installation, configuration, and container setup, see [references/setup.md](references/setup.md).\n\n## Security & safety\n\n- **Stateless + read-only** — every call is self-contained: bars in, primitives out. wickworks stores nothing, writes no files, mutates nothing, and has **no destructive operations**. There is no state to corrupt and nothing to confirm before calling.\n- **Auth-less by default, network-exposed** — wickworks ships with no built-in auth; anyone who can reach the port can call it. Bind it to loopback (`-p 127.0.0.1:8000:8000`) and only expose it behind your own reverse proxy / VPN with auth if it needs to be reachable off-host. The MCP bridge's optional `WICKWORKS_TOKEN` is for a bearer your *proxy* enforces, not wickworks itself.\n- **Consumer of the data you send** — you hand it OHLC bars; it computes on them and returns numbers. It does not fetch, phone home, or transmit your bars anywhere. Point the skill only at a wickworks instance you (or a trusted operator) run.\n- **Bounded input** — the request is capped at `MAX_BARS` bars (default 5000); oversized requests get `413`. Some indicators need a minimum warm-up (`MIN_BARS`, default 50) or they return an `insufficient_bars` error listing the deficits.\n\n## When To Use\n\n- The user has OHLC candlestick bars and wants technical indicators computed (RSI, MACD, Bollinger, Ichimoku, Supertrend, …).\n- The user wants Smart-Money-Concepts structure: order blocks, fair-value gaps, BOS/CHoCH, swing highs/lows, support/resistance, liquidity pools.\n- You're enriching a trading/market dataset server-side and want one call to return many primitives at once.\n\n## When NOT To Use\n\n- The user wants a *forecast*, a *signal*, or a buy/sell *opinion* — wickworks emits primitives only, no scoring. (Forecasting is a different service.)\n- You don't have OHLC bars (wickworks computes on bars you supply; it has no market-data feed of its own).\n- You need indicators over more than `MAX_BARS` bars in one call — window it down or raise `MAX_BARS` on the server.\n\n## Setup\n\n```bash\nexport WICKWORKS_URL=\"http://localhost:8000\"   # your running instance\n```\n\nSee [references/setup.md](references/setup.md) to stand one up (docker compose or `uv`).\n\n## The compute contract — `POST /`\n\nOne endpoint does the work. Body:\n\n```json\n{\n  \"symbol\": \"EURUSD\",\n  \"timeframe\": \"H1\",\n  \"recentBars\": 10,\n  \"bars\": [\n    { \"time\": 1700000000, \"open\": 1.08, \"high\": 1.09, \"low\": 1.07, \"close\": 1.085, \"tickVolume\": 1200 }\n  ],\n  \"indicators\": { \"rsi\": true, \"macd\": true }\n}\n```\n\n- **`bars`** — array of `{ time (UTC unix seconds), open, high, low, close, tickVolume?, realVolume? }`. `tickVolume`/`tick_volume` and `realVolume`/`real_volume` aliases both accepted.\n- **`indicators`** — a map of **output-name → spec**. This is the whole point:\n  - `\"rsi\": true` → run `rsi` with defaults, output under key `rsi`.\n  - `\"rsi14\": { \"type\": \"rsi\", \"length\": 14 }` → run `rsi` with `length=14`, output under key `rsi14` (the key is the output name, `type` picks the indicator).\n  - `\"rsi\": { \"length\": 21 }` → key doubles as the type when no `type` is given.\n- **`symbol` / `timeframe`** — echoed back in the response.\n- **`recentBars`** — signal-like outputs within this many bars of the end get `isRecent: true`.\n\nResponse envelope: `{ symbol, timeframe, candles, <outputName>: <series-or-object>, ... }` — one entry per requested output, each a series the same length as `bars` (or a structured object for multi-line indicators like `macd` / `bbands` / `ichimoku`, or an array of objects for SMC like `orderBlocks` / `fvgs`).\n\n```bash\n# Health\ncurl -s \"$WICKWORKS_URL/health\"\n\n# The output-path catalog (labels + descriptions; static per version — cache it)\ncurl -s \"$WICKWORKS_URL/metadata\"\n\n# Compute RSI + MACD + order blocks in one call\ncurl -s -X POST \"$WICKWORKS_URL/\" -H 'Content-Type: application/json' -d '{\n  \"symbol\": \"EURUSD\", \"timeframe\": \"H1\",\n  \"bars\": [ /* ...OHLC bars... */ ],\n  \"indicators\": { \"rsi\": true, \"macd\": true, \"orderBlocks\": true }\n}'\n```\n\n## Indicator names\n\nPass any of these as `indicators` keys (also available at runtime via the MCP `list_indicators` tool):\n\n```\nad, adosc, adx, alma, aroon, atr, bbands, bosChoch, cci, chandelierExit, cmf,\ndema, donchian, ema, fisher, fvg, fvgs, fwma, hma, ichimoku, jma, kama, kc, kvo,\nlevels, linreg, liquidity, macd, mfi, mom, momentum, natr, obv, orderBlocks,\nposition, previousHighLow, price, psar, recentRange, retracements, rma, roc, rsi,\nsessions, sinwma, slope, sma, squeeze, srLevels, stoch, stochrsi, supertrend,\nswingLevels, swma, t3, tema, trima, trix, tsi, uo, volume, vortex, vwap, vwma,\nwillr, wma, zlma\n```\n\nFetch `GET /metadata` (or the MCP `metadata` tool) for the human-readable label + description of every output path each of these produces.\n\n## MCP Endpoint (`/mcp`)\n\nwickworks mounts a [Model Context Protocol](https://modelcontextprotocol.io) server over Streamable HTTP at `/mcp`, in the same process — so an agent can drive it over JSON-RPC without the REST client. It's **stateless** (no initialize handshake needed) and returns JSON. Tools:\n\n| Tool | Args | Returns |\n|---|---|---|\n| `health` | — | `{ ok, version }` |\n| `list_indicators` | — | `{ indicators: [...] }` — the registered indicator types |\n| `metadata` | — | the output-path catalog (`{ version, count, entries }`) |\n| `compute` | `bars`, `indicators`, `timeframe?`, `symbol?`, `recent_bars?` | the same envelope as `POST /` |\n\nPoint an MCP client straight at the endpoint:\n\n```bash\n# Claude Code (native remote MCP — no bridge needed)\nclaude mcp add --transport http wickworks \"$WICKWORKS_URL/mcp\"\n\n# Raw JSON-RPC (stateless — call tools/call directly)\ncurl -s \"$WICKWORKS_URL/mcp/\" \\\n  -H 'Content-Type: application/json' \\\n  -H 'Accept: application/json, text/event-stream' \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\n       \"params\":{\"name\":\"compute\",\"arguments\":{\n         \"bars\":[/* ...OHLC... */],\"indicators\":{\"rsi\":true},\"symbol\":\"EURUSD\",\"timeframe\":\"H1\"}}}'\n```\n\nThe [`@psyb0t/wickworks`](https://github.com/psyb0t/docker-wickworks/tree/main/.agents/plugins/wickworks) OpenClaw plugin is a thin stdio↔HTTP bridge to this endpoint for MCP clients that only speak local stdio servers.\n\n## Errors\n\n- `400 bars must not be empty` / `400 indicators must not be empty` — empty request pieces.\n- `400 { error: \"insufficient_bars\", available, deficits }` — a requested indicator needs more warm-up bars than supplied; `deficits` lists which and how many.\n- `400` unknown indicator — the requested `type`/key isn't in the registry (see the indicator-names list above).\n- `413 too many bars` — more than `MAX_BARS` bars in one request.\n\nOver MCP the same failures come back as an `isError` tool result carrying the message, not an HTTP status.\n\nFile v0.6.0:_meta.json\n\n{\n  \"ownerId\": \"kn79dhvmpjng4rp2jjk8k0v5xx80ccbk\",\n  \"slug\": \"wickworks\",\n  \"version\": \"0.6.0\",\n  \"publishedAt\": 1785020425662\n}\n\nFile v0.6.0:references/setup.md\n\n# wickworks setup\n\nwickworks is a single stateless HTTP container — no DB, no queues, no external\ncalls. Stand one up, point `WICKWORKS_URL` at it, done.\n\n## Requirements\n\n- `docker` (to run the image) and `curl` (to call it), or Python 3.12 + `uv`\n  for a local run.\n- OHLC bars to feed it — wickworks has no market-data feed of its own.\n\n## Security & safety\n\nwickworks ships **auth-less** and **stateless** — bars in, primitives out, no\nwrites, no destructive ops. But anyone who can reach the port can call it, so:\n\n- **Bind to loopback by default** — `-p 127.0.0.1:8000:8000`. Only expose it\n  off-host behind your own reverse proxy / VPN with auth in front.\n- It never fetches or transmits your bars anywhere; it only computes on what you\n  POST. Still, only run an instance you (or a trusted operator) control.\n\n## Quick Install\n\n### docker run\n\n```bash\ndocker run --rm -p 127.0.0.1:8000:8000 psyb0t/wickworks:latest\n# listens on :8000; GET /health to check\n```\n\n### docker compose\n\n```yaml\nservices:\n  wickworks:\n    image: psyb0t/wickworks:latest\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:8000:8000\"\n    environment:\n      LOG_LEVEL: INFO\n      MAX_BARS: \"5000\"\n      MIN_BARS: \"50\"\n      WORKERS: \"2\"\n```\n\n### Local (uv-based)\n\n```bash\nmake install   # uv sync from the pinned lockfile\nmake run       # uvicorn on :8000\n```\n\n## Point the skill at it\n\n```bash\nexport WICKWORKS_URL=\"http://localhost:8000\"\ncurl -s \"$WICKWORKS_URL/health\"     # {\"ok\":true,\"version\":\"...\"}\n```\n\nFor the MCP bridge plugin, the same base URL: `WICKWORKS_URL` (the bridge\nappends `/mcp/`), plus optional `WICKWORKS_TOKEN` if a reverse proxy in front\nrequires a bearer.\n\n## Environment Variables\n\nAll env-driven; sensible defaults, nothing to tune for a first run.\n\n| Variable    | Default | Description |\n| ----------- | ------- | ----------- |\n| `LOG_LEVEL` | `INFO`  | Python logging level. |\n| `MAX_BARS`  | `5000`  | Reject requests with more bars than this (HTTP 413). |\n| `MIN_BARS`  | `50`    | Baseline warm-up floor for SMC outputs / summaries and the fallback for indicators without an explicit requirement. Series indicators (`sma`, `rsi`, `macd`, …) compute their own minimum from params. |\n| `WORKERS`   | `2`     | uvicorn worker count. |\n\nwickworks has **no auth env var** — connection-level access control is the\noperator's responsibility (loopback bind + reverse proxy). The MCP transport's\nDNS-rebinding Host check is disabled so real-hostname deployments work; gate\naccess at your proxy, not the app.\n\nFile v0.6.0:skill-card.md\n\n## Description: <br>\nwickworks helps agents call a stateless OHLC service to compute technical indicators and Smart-Money-Concepts primitives from supplied candlestick bars. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[psyb0t](https://clawhub.ai/user/psyb0t) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers, engineers, and market-analysis agents use wickworks when they have OHLC candlestick bars and need technical indicators or Smart-Money-Concepts primitives returned without forecasts, scoring, or buy/sell opinions","readmeExcerpt":"Skill: wickworks Owner: psyb0t Summary: Stateless OHLC primitives service — candlestick bars in, technical indicators + Smart-Money-Concepts objects out. Single POST / takes a bars array + an indicators selection map and returns computed primitives; GET /metadata is the output-path catalog; GET /health. 67 primitives across trend (SMA/EMA + 15 more MAs, slope, Donchian, Ichimoku), momentum (RSI, MACD, Stoch, StochRSI","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"export WICKWORKS_URL=\"http://localhost:8000\"   # your running instance"},{"language":"json","snippet":"{\n  \"symbol\": \"SYMBOL_X\",\n  \"timeframe\": \"H1\",\n  \"bars\": [\n    { \"time\": 1700000000, \"open\": 100, \"high\": 102, \"low\": 99, \"close\": 101, \"volume\": 1200 }\n  ],\n  \"indicators\": { \"rsi\": true, \"macd\": true }\n}"},{"language":"bash","snippet":"curl -s \"$WICKWORKS_URL/health\""},{"language":"bash","snippet":"curl -s \"$WICKWORKS_URL/metadata\""},{"language":"bash","snippet":"curl -s -X POST \"$WICKWORKS_URL/\" -H 'Content-Type: application/json' -d '{"},{"language":"bash","snippet":"# Health\ncurl -s \"$WICKWORKS_URL/health\"\n\n# The output-path catalog (labels + descriptions; static per version — cache it)\ncurl -s \"$WICKWORKS_URL/metadata\"\n\n# Compute RSI + MACD + order blocks in one call\ncurl -s -X POST \"$WICKWORKS_URL/\" -H 'Content-Type: application/json' -d '{\n  \"symbol\": \"SYMBOL_X\", \"timeframe\": \"H1\",\n  \"bars\": [ /* ...OHLC bars... */ ],\n  \"indicators\": { \"rsi\": true, \"macd\": true, \"orderBlocks\": true }\n}'"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: wickworks\ndescription: Stateless OHLC primitives service — candlestick bars in, technical indicators + Smart-Money-Concepts objects out. Single POST / takes a bars array + an indicators selection map and returns computed primitives; GET /metadata is the output-path catalog; GET /health. 67 primitives across trend (SMA/EMA + 15 more MAs, slope, Donchian, Ichimoku), momentum (RSI, MACD, Stoch, StochRSI, ADX, MFI, CCI, Williams %R, ROC, MOM, TSI, TRIX, UO, Fisher), volatility (ATR, NATR, Bollinger, Keltner, Squeeze), volume (VWAP, VWMA, OBV, AD, ADOSC, CMF, KVO), and SMC (order blocks, fair-value gaps, BOS/CHoCH, swing structure, S/R levels, liquidity, retracements, sessions, previous-period H/L) plus pre-baked summaries. camelCase, NaN-safe JSON. Unified REST + MCP (streamable-HTTP at /mcp — tools health / list_indicators / metadata / compute). Auth-less by default. Use when the user wants technical indicators or Smart-Money-Concepts primitives computed from OHLC candlestick bars.\nhomepage: https://github.com/psyb0t/docker-wickworks\nuser-invocable: true\nmetadata:\n  { \"openclaw\": { \"emoji\": \"🕯️\", \"primaryEnv\": \"WICKWORKS_URL\", \"requires\": { \"bins\": [\"docker\", \"curl\"] } } }\n---\n\n# wickworks\n\nStateless OHLC primitives service — bars in, indicators + Smart-Money-Concepts objects out. No scoring, no opinions, no state.\n\n- **Trend** — SMA/EMA + 15 other moving averages (`dema`, `tema`, `hma`, `kama`, `zlma`, `t3`, `alma`, `jma`, …), `slope`, `linreg`, Donchian channels, Ichimoku.\n- **Momentum** — RSI, MACD, Stochastic, StochRSI, ADX, MFI, CCI, Williams %R, ROC, MOM, TSI, TRIX, Ultimate Oscillator, Fisher.\n- **Volatility** — ATR, NATR, Bollinger Bands, Keltner Channels, Squeeze.\n- **Volume** — VWAP (anchored), VWMA, OBV, AD, ADOSC, CMF, KVO.\n- **SMC** — order blocks, fair-value gaps (`fvg`/`fvgs`), BOS/CHoCH (`bosChoch`), swing structure (`swingLevels`), S/R levels (`srLevels`), `liquidity`, `retracements`, `sessions`, previous-period H/L, `levels`.\n- **Summaries** — `position`, `slope`, `momentum`, `volume`, `recentRange`, `price` — pre-baked projections over the raw series.\n- **Two ways to drive it** — the REST API (`POST /`) and an MCP server (streamable-HTTP at `/mcp`). Same compute, same output envelope.\n\nAll JSON field names are **camelCase**; output is **NaN-safe** (`NaN` → `null`). Bars are UTC unix seconds; the container runs `TZ=UTC`.\n\nFor installation, configuration, and container setup, see [references/setup.md](references/setup.md).\n\n## Security & safety\n\n- **Stateless + read-only** — every call is self-contained: bars in, primitives out. wickworks stores nothing, writes no files, mutates nothing, and has **no destructive operations**. There is no state to corrupt and nothing to confirm before calling.\n- **Auth-less by default, network-exposed** — wickworks ships with no built-in auth; anyone who can reach the port can call it. Bind it to loopback (`-p 127.0.0.1:8000:8000`) and only expose it behind your own reverse proxy / VPN wit"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn79dhvmpjng4rp2jjk8k0v5xx80ccbk\",\n  \"slug\": \"wickworks\",\n  \"version\": \"0.7.0\",\n  \"publishedAt\": 1788636497080\n}"},{"path":"references/setup.md","content":"# wickworks setup\n\nwickworks is a single stateless HTTP container — no DB, no queues, no external\ncalls. Stand one up, point `WICKWORKS_URL` at it, done.\n\n## Requirements\n\n- `docker` (to run the image) and `curl` (to call it), or Python 3.12 + `uv`\n  for a local run.\n- OHLC bars to feed it — wickworks has no market-data feed of its own.\n\n## Security & safety\n\nwickworks ships **auth-less** and **stateless** — bars in, primitives out, no\nwrites, no destructive ops. But anyone who can reach the port can call it, so:\n\n- **Bind to loopback by default** — `-p 127.0.0.1:8000:8000`. Only expose it\n  off-host behind your own reverse proxy / VPN with auth in front.\n- It never fetches or transmits your bars anywhere; it only computes on what you\n  POST. Still, only run an instance you (or a trusted operator) control.\n\n## Quick Install\n\n### docker run\n\n```bash\ndocker run --rm -p 127.0.0.1:8000:8000 psyb0t/wickworks:latest\n# listens on :8000; GET /health to check\n```\n\n### docker compose\n\n```yaml\nservices:\n  wickworks:\n    image: psyb0t/wickworks:latest\n    restart: unless-stopped\n    ports:\n      - \"127.0.0.1:8000:8000\"\n    environment:\n      LOG_LEVEL: INFO\n      MAX_BARS: \"5000\"\n      MIN_BARS: \"50\"\n      WORKERS: \"2\"\n```\n\n### Local (uv-based)\n\n```bash\nmake install   # uv sync from the pinned lockfile\nmake run       # uvicorn on :8000\n```\n\n## Point the skill at it\n\n```bash\nexport WICKWORKS_URL=\"http://localhost:8000\"\ncurl -s \"$WICKWORKS_URL/health\"     # {\"ok\":true,\"version\":\"...\"}\n```\n\nFor the MCP bridge plugin, the same base URL: `WICKWORKS_URL` (the bridge\nappends `/mcp/`), plus optional `WICKWORKS_TOKEN` if a reverse proxy in front\nrequires a bearer.\n\n## Environment Variables\n\nAll env-driven; sensible defaults, nothing to tune for a first run.\n\n| Variable    | Default | Description |\n| ----------- | ------- | ----------- |\n| `LOG_LEVEL` | `INFO`  | Python logging level. |\n| `MAX_BARS`  | `5000`  | Reject requests with more bars than this (HTTP 413). |\n| `MIN_BARS`  | `50`    | Baseline warm-up floor for SMC outputs / summaries and the fallback for indicators without an explicit requirement. Series indicators (`sma`, `rsi`, `macd`, …) compute their own minimum from params. |\n| `WORKERS`   | `2`     | uvicorn worker count. |\n\nwickworks has **no auth env var** — connection-level access control is the\noperator's responsibility (loopback bind + reverse proxy). The MCP transport's\nDNS-rebinding Host check is disabled so real-hostname deployments work; gate\naccess at your proxy, not the app."},{"path":"skill-card.md","content":"## Description:\n\nwickworks lets agents compute technical indicators and Smart-Money-Concepts primitives from caller-supplied OHLC candlestick bars through REST or MCP endpoints.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[psyb0t](https://clawhub.ai/user/psyb0t)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and agents use wickworks to enrich market or trading datasets by computing indicator series, market-structure objects, and prebuilt summaries from OHLC bars. It is for primitives and analysis support, not forecasts, trade signals, or buy/sell opinions.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The setup uses a mutable third-party Docker image tag.\n\nMitigation: Use a reviewed image digest or build from reviewed local source before deployment.\n\nRisk: The Wickworks service is unauthenticated by default and may be reachable by anyone with network access to its port.\n\nMitigation: Bind it to localhost by default and expose it only behind an authenticated proxy or VPN.\n\nRisk: Sensitive market data could be sent to an untrusted endpoint.\n\nMitigation: Point the skill only at a Wickworks instance operated by you or another trusted operator.\n\nRisk: The MCP transport has host validation disabled for real-hostname deployments.\n\nMitigation: Gate remote access at the proxy or VPN layer rather than relying on the application for access control.\n\n## Reference(s):\n\n- [wickworks setup](references/setup.md)\n- [ClawHub skill page](https://clawhub.ai/psyb0t/skills/wickworks)\n- [Model Context Protocol](https://modelcontextprotocol.io)\n\n## Skill Output:\n\n**Output Type(s):** [API calls, Shell commands, Configuration, Guidance, JSON]\n\n**Output Format:** [Markdown guidance with JSON request and response shapes plus shell-command examples; service responses are JSON.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Compute calls require caller-supplied OHLC bars and an indicators selection map; output uses camelCase fields and NaN-safe JSON.]\n\n## Skill Version(s):\n\n0.7.0 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1706,"uniquenessScore":44,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T20:08:48.831Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T20:08:48.831Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-12T08:44:11.294Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}