- Call the MCP tools — if you are an LLM or Claude agent that works by making tool calls, run
the MCP server (
metalworks mcp serve) and call its tools. Start with the MCP tools reference. - Import the Python SDK — if you are a coding agent writing Python, import the
Metalworksfacade directly. Start with the Python SDK.
llms.txt (the machine-readable index) and
the reference page for your path above.
The one entry point
mw.research(question, subreddits=[...]) -> Research— demand research (theDemandReportis on.demand).mw.reddit.search / subreddit / comments / rules / inbox / post— Reddit surfaces.mw.discovery.run / filter / generate— discovery loop + building blocks.
MissingKeyError (with a fix string) surfaces only when a
call needs a key. With metalworks[claude-code] installed and no provider key set, the chat
model falls back to your Claude Code login — so a call that would raise MissingKeyError
runs keyless instead. Every error carries error_code, message, fix, and docs_url —
relay the fix verbatim.
MCP tools (the language-agnostic surface)
Runmetalworks mcp serve (stdio). 35 tools are registered. The full table — every
tool, its tier, whether it needs a key, its purpose, and params — is the canonical MCP tools
reference; read it there rather than re-deriving the list here. In short:
- Zero-key data + deterministic tools (Reddit + Arctic corpus reads, run/report listing,
compliance_lint,distribution_data_report, …) need no provider key. - Key-gated tools call a model: demand research (
research_start/research_status/research_result),research_plan_brief, the report-derived pillars (positioning_from_report,landscape_from_report,assess_from_report, design,distribution_assets,build_spec, …),generate_reply,discovery_run, and thevalidate_from_ideaorchestrator. - Posting (the security boundary):
reddit_post_commentrequires aconfirm_tokenemitted by acompliance_lintpass over that exact text andMETALWORKS_ALLOW_POSTING=1. There is no override.
The async job pattern
Research and discovery take minutes. Do not call a blocking tool and wait — useresearch_start → research_status → research_result. The synchronous Python
mw.research(...) is for scripts, not for tool-call timeouts.
Rules that matter
- Posting is gated and irreversible. A blocked draft is refused before it reaches
Reddit; every attempt is logged to
~/.metalworks/post-log.jsonl. Never try to route around the compliance gate. - Authentic engagement only. No fabricated personas or backstories. The
Persona.backgroundfield must be real. - Every claim is backed by a real quote. Quotes are exact-matched against stored comments; web URLs come from citation metadata. Don’t present model-authored text as a sourced quote.
- Pick models by ref.
Metalworks(model="provider/model"); point at any OpenAI-compatible endpoint withbase_url. See Configuration.
Where to look
- Python SDK — the facade surface.
- Extending metalworks — the swappable protocols + functions.
- Protocols — exact protocol shapes.
llms.txt— the machine-readable index.