Honest, local-first cold outreach toolkit: research → personalize → sequence → send → follow. CLI + MCP, no SaaS required.
Coldforge has 12 well-named tools with clear action verbs (research_, draft_, list_, check_, build_, score_, lint_, classify_, geo_, plan_). All tools have descriptions (avg ~150 chars, within 10-1024 baseline). Input schemas are visible and typed. However, output schemas are NOT documented, responses are inferred from code but not formally declared in tool definitions. Parameter descriptions are present but sparse (avg ~40 chars vs 72 baseline). No error handling guidance, no recovery hints, no enum constraints on categorical inputs (e.g., category in list_templates, verdict in check_deliverability). No tool annotations (readOnlyHint/destructiveHint). Three tools (build_icp, plan_content, draft_article) perform writes but descriptions do not explicitly state this. Missing pagination guidance for list_templates despite returning arrays.
Read a product website and derive an Ideal Customer Profile: what it sells, the pains it removes, and ranked buyer segments. Saved to $COLDFORGE_HOME/icp.json so `score_prospect` and the CLI can use it.
Check a sending domain's SPF / DKIM / DMARC and return a 0–100 score.
Triage a reply to a cold email: interested, not_interested, unsubscribe, ooo, or other. An unsubscribe should go straight to `coldforge suppress add`.
Write one article from a brief planned by plan_content (LLM if ANTHROPIC_API_KEY is set, else a skeleton outline).
Draft a cold email from a template for one prospect. Pass a `signal` (e.g. from research_prospect) to make the opener specific. Extra template variables go in `variables`. Returns subject + body; LLM-personalizes the body when ANTHROPIC_API_KEY is set, else fills the template.
Ask every configured AI engine (Claude/OpenAI/Perplexity/Gemini, whichever have an API key set) a buyer question and check whether `brand` is mentioned in the answer — the GEO/AI-search-visibility idea behind tools like BabyLoveGrowth, done by asking the engines directly.
Output schemas not formally documented. Tool descriptions state what is returned (e.g., 'Returns subject + body') but JSON Schema output types are absent from tool definitions. LLMs cannot plan downstream calls or extract fields reliably.
Destructive operations (build_icp, plan_content, draft_article) lack explicit state-change warnings in descriptions. Descriptions do not say 'Saves to $COLDFORGE_HOME/icp.json' or 'Writes to disk', only implementation comments reveal this. LLMs cannot distinguish read-only from write tools.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). MCP spec supports these to help clients and LLMs reason about safety. All 12 tools lack annotations.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
Spam-filter check email copy before sending: trigger words (EN+FR), link count, all-caps, length, unfilled variables. Score < 70 → rewrite.
List available cold-email templates, optionally filtered by category (sales, recruiting, partnership, warm-intro, networking, follow-up).
Cluster the stored ICP's keywords/content_gaps into `count` SEO/GEO article briefs (call build_icp first). Saved to $COLDFORGE_HOME/content/plan.json; draft one with draft_article.
Research a prospect and return personalization signals (a concrete, true fact you can open a cold email with). Uses Tavily if TAVILY_API_KEY is set, otherwise a free DuckDuckGo fallback, plus the prospect's own site.
Score a prospect 0-100 against the stored ICP (build_icp first). Pass whatever fields you know; a researched `signal` sharpens the score.
Return one template's metadata, subject, body and deliverability notes.
Categorical parameters lack enum constraints. 'category' in list_templates accepts free-form strings (should be enum: sales|recruiting|partnership|warm-intro|networking|follow-up). 'verdict' in check_deliverability response is untyped. Enums prevent hallucinated values.
No error handling guidance. Descriptions do not explain failure modes or recovery steps. E.g., research_prospect may fail if Tavily/DuckDuckGo are down, but no fallback or retry guidance is documented. LLMs cannot self-correct.