Skip to main content
Glama

Forge MCP — freelance pipeline operations

Version: 1.0.0
Quality gate: .\make.ps1 (black, ruff, mypy, pytest cov≥90%, Martin limits)

Forge hunts public, ToS-safe job APIs, ranks listings by capability match and money heat, pushes HOT cards (Telegram + local digest), and tracks the pipeline from NEW → paid. Client pitches stay in the listing language; operator briefs are in Russian.

What is in scope / out of scope

In scope

Out of scope

RemoteOK, Remotive, Himalayas, Arbeitnow(+UK), Jobicy, HN Who's Hiring

Upwork / Freelancer.com scraping

Manual capture_lead for off-board finds

Auto-apply without a human

Telegram buttons + rituals

Secret logging / token echo

Related MCP server: Escrow Sentinel

Install

pip install -e ".[dev]"
copy .env.example .env   # fill BOT_TOKEN + CHAT_ID
.\make.ps1               # must exit 0

CLIs: forge-hunt, forge-telegram-bot, forge-morning, forge-evening, forge-mcp.

Configuration

Secrets and knobs live in .env (gitignored). See .env.example.

Variable

Role

BOT_TOKEN / CHAT_ID

Telegram (aliases → FORGE_TELEGRAM_*)

FORGE_CONTRACT_ONLY=1

Strict contract/freelance HOT gate

FORGE_ANCHOR_* / FORGE_WALK_AWAY

One killer offer + floor

FORGE_PROOF_URL

Optional case link appended to SHORT

FORGE_PAUSED_BOARDS

Manual board deprioritization

FORGE_DB / FORGE_DIGEST_PATH

Storage / digest overrides

Operations (money loop)

  1. set_watchlist([...]) — narrow magnets

  2. forge-hunt every ~30m — HOT + Telegram buttons

  3. Copy PITCH → send → Proposed (target <15 min NEW→proposed)

  4. forge-morning / forge-evening — queue + follow-ups + board pause

  5. Won + log_win_reason → learning / A/B / packages

Windows schedules: scripts\schedule_hunt.ps1, schedule_rituals.ps1, schedule_bot.ps1
(scripts resolve project root from their own location).

MCP

{
  "mcpServers": {
    "forge": {
      "command": "python",
      "args": ["-m", "forge.presentation.mcp_server"]
    }
  }
}

Core tools: hunt_jobs, act_now, morning_digest, evening_followup, draft_proposal, brief_lead, rate_advice, check_red_flags, follow_ups, sla_status, chase_leads, package_prices, pause_weak_boards, platform_roi, board_advice, win_journal, log_win_reason, pitch_ab_stats, set_watchlist, pipeline_status, earnings_summary, capture_lead, scan_for_leads, hot_leads.

Architecture

src/forge/
  entities/         # Lead FSM, match, heat, gates, pricing, i18n
  use_cases/        # hunt, rituals, pipeline, learning, act-now
  interfaces/       # ports (repos, sources, notifier)
  infrastructure/   # SQLite, HTTP boards, Telegram, .env loader
  presentation/     # MCP + CLIs + composition root

Clean architecture: use cases depend on ports; composition wires adapters. Persistence: SQLite (~/.forge/forge.db by default) with additive migrations.

Quality / acceptance

See docs/ACCEPTANCE.md. Summary:

  • .\make.ps1 exits 0

  • ≥90% line coverage on forge (CLIs/MCP omitted by design)

  • No secrets in repo; Telegram errors redacted

  • Martin limits: file ≤300 lines, fn ≤25 lines, ≤4 args, CC≤10, nesting≤3

License

MIT — see LICENSE.

Available Tools

31 tools
act_nowC

Priority queue of NEW leads (payability + age + rate).

Inputs: limit. Returns: result

add_capabilityC

Add a reusable capability asset for future matching.

Inputs: name (required), keywords (required), description (required), proposal_snippet (required). Returns: result

board_adviceC

Deprioritize boards with paid=0 and enough leads.

Inputs: no named parameters. Returns: result

brief_leadC

Explain a vacancy in clear Russian.

Inputs: lead_id (required). Returns: result

capture_leadC

Track a job lead. Dedupes by URL and title fingerprint.

Inputs: title (required), platform (required), description (required), source_url. Returns: result

chase_leadsC

NEW leads past SLA — propose these first.

Inputs: stale_after_hours. Returns: result

check_red_flagsC

Red-flag checklist before you propose.

Inputs: lead_id (required). Returns: result

draft_proposalC

SHORT + FULL pitches with i18n opener, A/B variant, anchor price.

Inputs: lead_id (required). Returns: result

earnings_summaryB

Show total won, paid, and outstanding amounts.

Inputs: no named parameters. Returns: result

evening_followupC

Evening: SLA + proposed pings + board pause advice.

Inputs: no named parameters. Returns: result

follow_upsD

Proposed leads silent too long — copy the EN ping.

Inputs: after_hours. Returns: result

hot_leadsA

List fresh (status=new) leads waiting for your proposal.

Inputs: no named parameters. Returns: result

hunt_jobsD

Hunt boards; push freelance-only HOT with RU brief + EN short pitch.

Inputs: min_heat. Returns: result

list_outreachB

List pending outreach drafts.

Inputs: no named parameters. Returns: result

log_win_reasonC

Win journal: one phrase why the client chose you.

Inputs: reason (required), lead_id (required). Returns: result

morning_digestC

Push top NEW with RU brief + SHORT EN (Telegram buttons).

Inputs: no named parameters. Returns: result

package_pricesC

Discovery / milestone / retainer from average won + anchor.

Inputs: no named parameters. Returns: result

pause_weak_boardsB

Auto-pause boards with paid=0 and enough leads.

Inputs: no named parameters. Returns: result

pipeline_statusB

Show pipeline counts and win rate.

Inputs: no named parameters. Returns: result

pitch_ab_statsB

A/B win rates for short vs full pitches.

Inputs: no named parameters. Returns: result

platform_roiB

Show which job boards actually convert to paid work.

Inputs: no named parameters. Returns: result

queue_outreachC

Queue Merchant/MCP outreach draft → Telegram Send/Skip buttons.

Inputs: email (required), company (required), angle. Returns: result

rate_adviceD

Your avg won vs listing budget mid.

Inputs: lead_id (required). Returns: result

record_paymentC

Record that you've actually been paid for a lead.

Inputs: amount (required), lead_id (required). Returns: result

record_won_amountC

Record the agreed price once you win a lead.

Inputs: amount (required), lead_id (required). Returns: result

scan_for_leadsB

Scan public job boards and auto-track capability matches.

Inputs: no named parameters. Returns: result

set_watchlistC

Set personal hunt keywords (money magnets).

Inputs: keywords (required). Returns: result

sla_statusC

SLA: burning NEW leads and proposed needing a 48h ping.

Inputs: no named parameters. Returns: result

suggest_capabilitiesC

Rank your capability assets by relevance to a lead.

Inputs: lead_id (required). Returns: result

update_lead_statusC

Move a lead through the pipeline; wins feed learned magnets.

Inputs: status (required), lead_id (required). Returns: result

win_journalC

Recent wins with amounts, pitch variant, and reasons.

Inputs: no named parameters. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    C2.3/5.0

    Scored across 31 tools

    Disambiguation2/5

    Several tool clusters overlap heavily: act_now/hot_leads/chase_leads all surface fresh NEW leads to act on, scan_for_leads/hunt_jobs both scan boards for leads, and pause_weak_boards/board_advice both deprioritize paid=0 boards. Descriptions hint at nuances (age, SLA, push vs track) but an agent could easily misselect within these pairs.

    Naming Consistency3/5

    Casing is consistently snake_case, but the verb/noun pattern is mixed: some tools are verb_noun (capture_lead, record_payment, draft_proposal) while many others are bare noun phrases (pipeline_status, hot_leads, follow_ups, win_journal, rate_advice). Readable but not a predictable convention.

    Tool Count2/5

    31 tools is heavy for a lead-hunting/pipeline server, and the count is inflated by overlapping capabilities (multiple lead-surfacing, board-advice, and outreach tools) rather than distinct operations. Bloat suggests several tools could be merged or parameterized.

    Completeness4/5

    The lifecycle is well covered: capture/scan leads, qualify (red flags, pricing, rate advice), outreach/proposals, pipeline status, payments, board ROI, and win analytics. Only minor gaps (e.g., no explicit lead delete/archive or contact management) that agents can work around.

    Maintenance

    ActivitySlowing
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      C
      maintenance
      Enables MCP clients to search and manage Freelancehunt projects, bids, profiles, reviews, messages, and workspaces, with local filtering by keywords, budget, bid count, and employer quality.
      31
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables AI agents to discover Gibwork bounties, verify their Solana escrow accounts on-chain, rank opportunities by value, competition and deadline, diff captures over time, and export Markdown/CSV/JSON reports through four read-only MCP tools requiring no wallet or API key.
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables tracking a job-search pipeline through MCP tools, a resource, and a prompt, providing stale-application alerts, weekly reviews, and gated follow-up drafting with human approval.
      MIT