/demand-report can I sell a focus supplement to developers? and you get the same grounded
report the library produces — every claim linked to a real quote you can open — right in your chat,
then keep going (/position-wedge, /build-spec, /launch-kit) from there.
Under the hood it’s an MCP server: each slash command is a skill that calls
one or more of its 26 tools. The commands chain through a stored demand report, exactly like the
CLI — see Projects & memory for how that state persists.
Install
uvx, which installs it into an isolated environment on first launch:
SessionStart hook pre-warms that environment (it runs metalworks version quietly when
your session opens), so the first real command doesn’t pay the one-time install delay.
Keys: what works with none, what needs one
The data tools run with no API key. The research and synthesis tools use whatever provider key is in your environment (ANTHROPIC_API_KEY / OPENAI_API_KEY / GOOGLE_API_KEY — first
present wins). A few tools also need an embeddings key.
| Tier | Needs | Tools |
|---|---|---|
| Zero-key | nothing | Reddit search & comments, subreddit info/rules, Arctic corpus pull, corpus stats, run/report listing, compliance lint, channel plan, content plan |
| Chat key | a provider key | demand research, positioning, launch assets, reply drafting, discovery |
| Chat + embeddings | provider + embeddings | competitor map, surface, UX skeleton, marketing site, build spec |
| Gated | env opt-in (below) | posting a Reddit reply |
The commands
Each command runs one step of the end-to-end workflow. Start with/demand-report; the rest take the report it produces (by report_id) and build on it.
Research
/demand-report <idea>— is there real demand? Runs the pipeline (research_plan_brief→research_start→ pollresearch_status→research_result), or a zero-key Arctic-corpus path if no key is set. Returns a go/no-go plus ranked demand clusters with distinct-author counts and verbatim, permalinked quotes. Research only — never posts./position-wedge— turns the report into a Dunford wedge (competitive alternative, unique attribute, value, beachhead, category) + a price band. Callspositioning_from_report. Every slot resolves to a real quote; if nothing defensible survives, it says so rather than inventing one./competitor-map— direct / adjacent / status-quo rivals, each gap backed by a cited complaint, severity derived from distinct-author counts. Callscompetitor_map_from_report. Leads with the “do nothing” alternative.
Design
/surface-and-ux— picks the surface to build (web, mobile, CLI, SDK, …) with a cited rubric (surface_recommend), then sketches 3–5 screens (ux_skeleton_build), each marked validated or hypothesis. Text and structure only — no mockups./generate-site— a marketing site whose every load-bearing line is a verbatim real quote, footnoted to its permalink. Callssite_render, which returns theMarketingSiteplus a self-containedindex.html. A line that can’t be exact-matched to a real quote is dropped.
Build
/build-spec— a feature spec mapped to real demand (build_spec), then a scaffolded repo:CLAUDE.mdwith a cite-or-die rule,docs/SPEC.md, a frozendocs/EVIDENCE.mdquote table, aPostToolUselint hook, and.mcp.jsonwiring back to metalworks. metalworks specs and scaffolds; your agent builds. Ungrounded features are dropped before scaffolding.
Launch
/launch-kit— Product Hunt / Show HN / X drafts (launch_assets_build), each claim carrying a permalink and exact text span, plus a human-executed channel plan (channel_plan_build). It never posts — every channel step isrequires_human. If the report is a no-go, it returns nothing and says so.
Grow
/content-plan— a deterministic, zero-key content/SEO plan (content_plan_from_report): one page per demand cluster, FAQ blocks built from your brief’s must-address questions, real distinct-author/mention counts as stat anchors, and a list of permalinks to cite./find-threads <product>— live Reddit threads worth a genuine reply (reddit_search_posts), ranked by honest fit. Discovery only — it doesn’t draft or post./draft-reply <thread>— reads the thread and rules (reddit_get_post_comments,reddit_subreddit_rules), drafts a reply in your voice (generate_reply), and runs it through the compliance gate (compliance_lint) until it passes. It stops there. Posting happens only on your explicit instruction, and only if the gate is satisfied./subreddit-intel <r/name>— a practical brief on a community (rules that bite, tone, what gets removed) before you participate (reddit_subreddit_info). Reconnaissance only.
The posting gate
Nothing in the plugin posts to Reddit on its own. The one tool that can,reddit_post_comment,
is the security boundary, and it is triple-gated:
- Operator opt-in. It refuses unless
METALWORKS_ALLOW_POSTING=1is set in the server’s environment. Disabled by default. - A confirm token. The reply text must carry a token issued by the deterministic
compliance check (
compliance_lint/generate_reply) over that exact text — edit the draft after it passed, and the token no longer matches. - A re-check. It re-runs the compliance gate at post time and refuses if it fails.
REDDIT_CLIENT_ID / REDDIT_CLIENT_SECRET and a connected account. Every
attempt is logged.
What the compliance gate checks
The gate (compliance_lint) is deterministic, offline, and zero-key. It flags AI-tells
(“great question”, “hope this helps”, em-dashes), over-promotion (your product named repeatedly),
length out of bounds, and naked CTAs (“sign up”, “check out”) — returning a pass/fail verdict
with a confidence score. Drafts that read like marketing get tightened, not shipped.