Read public Reddit (zero keys)
[reddit] extra — no API key, no OAuth. The Reddit client and
its rate limiter are shared across calls, so a loop of searches stays within
Reddit’s limits.
The discovery loop
discovery.run searches your queries, filters each candidate for relevance,
drafts a reply in the matching persona’s voice, gates it through compliance, and
returns Opportunity objects. Nothing is posted — it produces gated drafts.
The compliance gate
The gate is a standalone, deterministic function — usable with no Reddit, no posting, no LLM:metalworks.discovery.llm_judge).
The gate is the security boundary, not the prompt: the posting tools refuse on a
block verdict regardless of what a model asked for.
Posting (gated + audited)
REDDIT_CLIENT_ID / REDDIT_CLIENT_SECRET and a connected
account (metalworks reddit auth login). Every attempt — sent or blocked — is
appended to ~/.metalworks/post-log.jsonl. A draft that fails the compliance
check is refused before it ever reaches Reddit.
Authentic, disclosed engagement only. The usage policy prohibits fake personas, invented backstories, and coordinated inauthentic behavior.
Long runs: the async job pattern
A full research run takes minutes (comment hydration alone is rate-limited at ~1.5 req/s), so the MCP server exposes the pipeline as a start → poll → result job instead of one blocking call:mw.research(...) call is synchronous
and blocks; use the job tools when a host model’s tool-call timeout is in play.
The CLI mirrors this with metalworks research run and metalworks discovery run.