AgentStack
Browse Sign in
Browse Why AgentStack Sell Docs
Sign in
MCP verified MIT Self-run

Multi Agent Job Search

mcp-djh-001-multi-agent-job-search ยท by DJH-001

๐Ÿค– ๅคšAgentๆฑ‚่Œ็ณป็ปŸ | Multi-Agent Job-Search Pipeline โ€” ็‹ฌ็ซ‹ Python ๅฎž็Žฐ๏ผŒ3 ไธช AI Agent + 5 ้“ๅฎ‰ๅ…จๆŠคๆ  + ๅทฅไฝœๆต็ผ–ๆŽ’ใ€‚ๆ”ฏๆŒ MCP ๅ่ฎฎๆŽฅๅ…ฅ OpenCode / Codex / Claude Codeใ€‚Standalone Python pipeline with 3 LLM agents, 5 guardrails, MCP integration, and dashboard.

โ€” No reviews yet
0 installs
7 views
0.0% viewโ†’install

Install

$ agentstack add mcp-djh-001-multi-agent-job-search

โœ“ scanned ยท โœ“ verified, works with Claude Code, Cursor, and more.

Security review

โœ“ Passed

No issues found. Passed automated security review. ยท v0.1.0 How review works โ†’

  • โœ“ Prompt-injection patterns
  • โœ“ Secret / credential exfiltration
  • โœ“ Dangerous shell & filesystem operations
  • โœ“ Untrusted network calls
  • โœ“ Known-malicious package signatures

What it can access

  • โœ“ Network access No
  • โœ“ Filesystem access No
  • โœ“ Shell / process execution No
  • โ— Environment & secrets Used
  • โœ“ Dynamic code execution No

From automated source analysis of v0.1.0. โ€œUsedโ€ means the capability is present in the source โ€” more access means more to trust, not that itโ€™s unsafe.

View the full security report โ†’

Verified badge

Passed review? Show it. Paste this badge into your README, it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/mcp-djh-001-multi-agent-job-search)

Reliability & compatibility

โœ“ Security review passed
0 installs to date
โ€” no reviews yet
โ— 9d ago

Declared compatibility

Claude CodeClaude DesktopCursorWindsurf

Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.

Preview Execution monitoring

We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.

How agent discovery & health will work โ†’
Are you the author of Multi Agent Job Search? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

multi-agent-job-search

[English](README.md) | [ไธญๆ–‡](README.zh.md)

A standalone Python multi-agent system for job search, featuring 3 AI agents, 5 safety guardrails, and workflow orchestration.


What This Is

This repository contains a self-contained Python multi-agent pipeline that automates job-search preparation: triaging positions, tailoring resumes, and generating interview prep. It runs independently with no external platform dependencies beyond a Python environment and an LLM API key.

The project originated as a design-validated domain Skill on OpenCode (~400 lines of Markdown rules defining agent behavior, safety constraints, and workflows). That original design was battle-tested across 16+ real job applications and iteratively improved based on actual AI failure modes. The SKILL.md is preserved in docs/SKILL.md as design documentation.

This Python implementation translates those design rules into executable code:

  • 3 agents (triage, resume, interview) calling an LLM via the OpenAI-compatible API
  • 5 guardrails (G1-G5), 3 blocking and 2 advisory, checked deterministically after every agent step
  • Workflow orchestrator coordinating the full pipeline with retry logic and state persistence
  • State dual-write: every position update is saved to both a position-level JSON tracker and an aggregate dashboard

The system is self-contained: pip install -r requirements.txt, set an API key, and run python main.py apply --jd demo/jd.txt --profile demo/candidate-profile.md. No OpenCode installation is needed.


Architecture

flowchart LR
    subgraph Input["Input"]
        A["JD file + Candidate profile"]
        B["parse_jd() / parse_profile()"]
        A --> B
    end

    subgraph Pipeline["Agent Pipeline"]
        C["TriageAgent"]
        D["Track label:Safety / Stretch/ Boundary"]
        F["ResumeAgent"]
        G["Tailored markdownresume + ATS score"]
        I["InterviewAgent"]
        J["Predicted questions+ chase trees+ draft answers"]
        L["StateTracker"]
        C --> D
        F --> G
        I --> J
    end

    subgraph Guardrails["Guardrails"]
        E["G1 (skipped)G2 (advisory)G3 (blocking)"]
        H["G1 (blocking)G2 (advisory)G3 (blocking)G4 (advisory)"]
        K["G1 (blocking)G2 (advisory)G3 (blocking)G5 (advisory)"]
    end

    subgraph Output["Output"]
        M["Dual-write:position.json+ dashboard.json"]
    end

    subgraph Legend["Legend"]
        L1["Input"]:::inputClass
        L2["Triage"]:::triageClass
        L3["Resume"]:::resumeClass
        L4["Interview"]:::interviewClass
        L5["State"]:::stateClass
        L6["Blocking GR"]:::blockingClass
        L7["Advisory GR"]:::advisoryClass
        L8["Output"]:::outputClass
    end

    B --> C
    D --> E
    E --> F
    G --> H
    H --> I
    J --> K
    K --> L
    L --> M

    classDef inputClass fill:#d5d8dc,stroke:#839192,color:#1c2833
    classDef triageClass fill:#d7bde2,stroke:#7d3c98,color:#1c2833
    classDef resumeClass fill:#aed6f1,stroke:#2471a3,color:#1c2833
    classDef interviewClass fill:#a9dfbf,stroke:#1e8449,color:#1c2833
    classDef stateClass fill:#f9e79f,stroke:#b7950b,color:#1c2833
    classDef blockingClass fill:#e74c3c,stroke:#c0392b,color:#fff
    classDef advisoryClass fill:#f39c12,stroke:#d35400,color:#fff
    classDef outputClass fill:#82e0aa,stroke:#27ae60,color:#1c2833
    classDef guardrailClass fill:#f5cba7,stroke:#e67e22,color:#1c2833

    class A,B inputClass
    class C,D triageClass
    class F,G resumeClass
    class I,J interviewClass
    class L stateClass
    class E,H,K guardrailClass
    class M outputClass

Pipeline steps:

  1. Parse inputs: parse_jd() extracts title, company, responsibilities, requirements, and preferred qualifications from a markdown or plain-text JD file. parse_profile() reads a YAML, JSON, or markdown candidate profile into a typed CandidateProfile dataclass.
  1. TriageAgent evaluates the JD against the candidate profile along three dimensions -- hard-skill match, hold-ability (can the candidate pass now?), and salary/level gap -- and outputs a track label: ไฟๅบ• (safety), ๅ†ฒๅˆบ (stretch), or ่พน็•Œ (boundary).
  1. ResumeAgent extracts JD keywords, selects track-appropriate bullets from the master CV, and generates a tailored resume with an AI-estimated ATS score. The output is plain markdown, no proprietary format.
  1. InterviewAgent predicts round-by-round interview questions, drafts answers from verified profile facts only, and builds chase trees (2-3 follow-up questions per concept).
  1. StateTracker writes two files after every step: a position-level JSON file (_.json) and an aggregate dashboard (dashboard.json), maintaining consistency without a database.

Guardrails (G1-G5) wrap every agent step:

| Guardrail | Stage | Severity | What It Prevents | |:---|:---|:---|:---| | G1 Pre-promotion content firewall | Resume, Interview | Blocking | AI from writing unverified skills into resumes | | G2 Truth-source hierarchy | All stages | Advisory | Master CV from drifting away from verified facts | | G3 Real numbers only | All stages | Blocking | AI from inventing numbers to "strengthen" bullet points | | G4 Cross-track contamination | Resume | Advisory | Stretch-track framing from leaking into safety-track resumes | | G5 Rumor-vs-fact separation | Interview | Advisory | Scraped interview experiences from being treated as confirmed facts |

G1-G3 are blocking: a violation raises GuardrailViolation and halts the pipeline. G4-G5 are advisory: violations are logged as warnings but never block execution.


Quickstart

# Clone the repository
git clone https://github.com/DJH-001/multi-agent-job-search.git
cd multi-agent-job-search

# Create and activate a virtual environment
python -m venv .venv
.venv\Scripts\activate

# Install dependencies
pip install -r requirements.txt

# Configure your API key
copy .env.example .env
# Edit .env with your OpenAI-compatible API key and optional base URL

# Run the full pipeline with demo data
python main.py apply --jd demo/jd.txt --profile demo/candidate-profile.md

# Check pipeline status
python main.py status --output output

# Run the test suite
python -m pytest tests/ -v

Requirements: Python 3.9+, an OpenAI-compatible API key (tested with OpenAI and DeepSeek).

The .env.example file documents all configuration options:

  • OPENAI_API_KEY -- your API key (required)
  • OPENAI_BASE_URL -- base URL for the API (defaults to https://api.openai.com/v1)
  • LLM_MODEL -- model name (defaults to gpt-4o, also tested with deepseek-chat)

Project Structure

multi-agent-job-search/
โ”œโ”€โ”€ main.py                         # CLI entry point (argparse: apply, status, mcp)
โ”œโ”€โ”€ requirements.txt                # openai, rich, python-dotenv, pytest, mcp
โ”œโ”€โ”€ .env.example                    # API key and model configuration template
โ”œโ”€โ”€ LICENSE                         # MIT
โ”‚
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ __init__.py
โ”‚   โ”œโ”€โ”€ config.py                   # Loads OPENAI_API_KEY, OPENAI_BASE_URL, LLM_MODEL from env
โ”‚   โ”œโ”€โ”€ schema.py                   # Dataclass contracts: CandidateProfile, JobDescription,
โ”‚   โ”‚                               #   TriageResult, ResumeOutput, InterviewPrep
โ”‚   โ”œโ”€โ”€ orchestrator.py             # JobSearchOrchestrator: 5 workflows (A-E),
โ”‚   โ”‚                               #   guardrail runner, retry logic, JD/profile parsers
โ”‚   โ”œโ”€โ”€ mcp_server.py               # MCP stdio server: 3 read-only tools for agent integration
โ”‚   โ”œโ”€โ”€ agents/
โ”‚   โ”‚   โ”œโ”€โ”€ __init__.py
โ”‚   โ”‚   โ”œโ”€โ”€ triage.py               # TriageAgent: JD vs profile assessment, track label output
โ”‚   โ”‚   โ”œโ”€โ”€ resume.py               # ResumeAgent: keyword extraction, bullet selection,
โ”‚   โ”‚   โ”‚                           #   ATS scoring, banned-word detection
โ”‚   โ”‚   โ””โ”€โ”€ interview.py            # InterviewAgent: question prediction, draft answers,
โ”‚   โ”‚                               #   chase trees, round-by-round prep
โ”‚   โ”œโ”€โ”€ guardrails/
โ”‚   โ”‚   โ”œโ”€โ”€ __init__.py
โ”‚   โ”‚   โ”œโ”€โ”€ g1_pre_promotion.py     # G1: deterministic skill whitelist check (blocking)
โ”‚   โ”‚   โ”œโ”€โ”€ g2_source_hierarchy.py  # G2: [source:] annotation check (advisory)
โ”‚   โ”‚   โ”œโ”€โ”€ g3_real_numbers.py      # G3: invented-number detection (blocking)
โ”‚   โ”‚   โ”œโ”€โ”€ g4_cross_track.py       # G4: cross-track contamination via LLM + regex (advisory)
โ”‚   โ”‚   โ””โ”€โ”€ g5_rumor_vs_fact.py     # G5: rumor-vs-fact firewall via LLM + regex (advisory)
โ”‚   โ””โ”€โ”€ state/
โ”‚       โ”œโ”€โ”€ __init__.py
โ”‚       โ””โ”€โ”€ tracker.py              # StateTracker: dual-write JSON persistence,
โ”‚                                   #   JobState dataclass, dashboard aggregation
โ”‚
โ”œโ”€โ”€ tests/
โ”‚   โ”œโ”€โ”€ __init__.py
โ”‚   โ”œโ”€โ”€ test_guardrails_g1_g3.py    # 28 tests: G1 (skill whitelist), G3 (fake numbers)
โ”‚   โ”œโ”€โ”€ test_guardrails_g4_g5.py    # 14 tests: G4 (cross-track), G5 (rumor-vs-fact)
โ”‚   โ”œโ”€โ”€ test_tracker.py             # 6 tests: save/load roundtrip, dual-write, dashboard
โ”‚   โ””โ”€โ”€ test_mcp.py                 # MCP server: tool registration, parsing, error handling, LLM skipif
โ”‚
โ”œโ”€โ”€ demo/
โ”‚   โ”œโ”€โ”€ jd.txt                      # Sample JD: Senior Camera Hardware Engineer
โ”‚   โ”œโ”€โ”€ candidate-profile.md        # Sample profile: fictional hardware engineer
โ”‚   โ””โ”€โ”€ ็คบไพ‹-ๆŸ็›ธๆœบๅ…ฌๅธ-็กฌไปถๅทฅ็จ‹ๅธˆ/  # Example output from a completed pipeline run
โ”‚       โ”œโ”€โ”€ resume.md
โ”‚       โ”œโ”€โ”€ interview_prep_round1.json
โ”‚       โ””โ”€โ”€ position.json
โ”‚
โ”œโ”€โ”€ docs/
โ”‚   โ”œโ”€โ”€ SKILL.md                    # Original OpenCode Skill design (~400 lines Markdown)
โ”‚   โ”‚                               #   Documents the design phase: 5 core principles,
โ”‚   โ”‚                               #   5 guardrails, dual-track engine, promotion gate,
โ”‚   โ”‚                               #   workflows A-E, and writing rules
โ”‚   โ””โ”€โ”€ architecture.md             # Detailed architecture documentation
โ”‚
โ”œโ”€โ”€ config/
โ”‚   โ””โ”€โ”€ skill.md                    # Copy of docs/SKILL.md (for OpenCode compatibility)
โ”‚
โ”œโ”€โ”€ scripts/
โ”‚   โ””โ”€โ”€ verify_guardrails.py        # Standalone guardrail compliance verification
โ”‚
โ”œโ”€โ”€ templates/
โ”‚   โ”œโ”€โ”€ position-analysis.md        # Position analysis template
โ”‚   โ”œโ”€โ”€ interview-prepare.md        # Interview prep template
โ”‚   โ””โ”€โ”€ interview-review.md         # Interview review template
โ”‚
โ””โ”€โ”€ output/                         # Created at runtime -- pipeline output directory

Platform vs My Work

This project has two layers: a design layer (the SKILL.md rules and methodology) and an implementation layer (the Python code). The table below separates what the OpenCode platform provided during the original deployment from what was designed and built independently.

| Capability | Provided by OpenCode Platform | Designed & Built | |:---|:---|:---| | Agent runtime (LLM calls, parallel dispatch, session management) | Built-in. OpenCode handles agent lifecycle, tool dispatch, and state persistence across sessions. | I designed which agent roles to dispatch for each workflow step and when to run them sequentially vs in parallel. | | SKILL.md rules (~400 lines) | Not provided. | Core design output. Domain rules: 5 principles, 5 guardrails, dual-track engine, promotion gate, workflows A-E, AI-slop ban lists. | | G1-G5 guardrails | Not provided. | Design: each guardrail addresses a real AI failure observed in practice. Implementation: src/guardrails/g1_*.py through g5_*.py -- deterministic checks with LLM assistance where needed. | | Dual-track engine | Not provided. | Three-track triage (ไฟๅบ•/ๅ†ฒๅˆบ/่พน็•Œ) with distinct governance strategies per track. | | Promotion gate | Not provided. | 5-step human-in-the-loop mechanism: learn, challenge list, self-certify, register, backflow. | | Python implementation | Not provided. | Entirely self-built. main.py (CLI), src/orchestrator.py (900 lines, 5 workflows), src/agents/ (3 agent files), src/guardrails/ (5 guardrail files), src/state/tracker.py (dual-write persistence), src/schema.py (dataclass contracts), src/config.py (env-based config). | | Test suite | Not provided. | Entirely self-built. 44 pytest tests across 3 test files covering G1-G5 guardrails and state management. | | State dual-write | Not provided. | Design: every update writes to two locations for distributed consistency. Implementation: StateTracker in src/state/tracker.py with atomic dual-write logic. | | File system architecture | Not provided. | Three-layer structure: truth-source (immutable facts), company/position (per-position isolation), market-research (cross-company intelligence). | | Workflows A-E | Not provided. | Five standard workflows with explicit step sequences: A (new position), B (update existing), C (re-derive all), D (detect source changes), E (interview iteration). | | Writing rules & ban lists | Not provided. | Specific rules for AI-generated professional text: banned AI-slop words, plain alternatives, bullet structure constraints. |

Bottom line: The OpenCode platform provided the agent runtime environment for the original deployment. The domain architecture, safety system, workflow definitions, and the complete Python reimplementation were designed and built independently. The Python system is fully standalone -- it requires no OpenCode installation to run.


Design Highlights

Five Core Principles

  1. Truth-source first. Every output (resume, cover letter, interview answer) must be traceable to verified personal data. The agent cannot invent or embellish.
  2. Position isolation. Preparing for one position does not give the agent access to another position's folder. No cross-contamination.
  3. Optional reference. If one position's output could help another, the agent must explicitly ask for permission before referencing it. No silent copying.
  4. State dual-write. Every progress update writes to two locations: the position-level tracker (detail) and the aggregate dashboard (summary). This is a distributed consistency problem solved through rule constraints.
  5. Completeness check. Before producing any material for a new position, the agent must cross-reference against the full verified facts inventory to prevent omissions.

Dual-Track Engine

Every incoming position is triaged into one of three governance tracks:

  • Safety track (ไฟๅบ•่ฝจ): Candidate can interview now and likely pass. Strategy: fast application, stable messaging, no over-packaging.
  • Stretch track (ๅ†ฒๅˆบ่ฝจ): Candidate wants the role but has a clear skill gap. Strategy: identify gaps explicitly, record genuine growth, gate new skills behind the promotion mechanism before they appear in materials.
  • Boundary track (่พน็•Œ่ฝจ): Unclear fit. Strategy: default to conservative messaging, treat any new capability claims through the stretch-track promotion gate.

Tracks are determined through a 3-step evaluation (read JD, natural-language assessment, single label output) with strict rules against formulaic scoring and silent label rewriting. Label changes are append-only in a change log.

Promotion Gate

Content learned after the initial profile cannot appear in application materials until it passes the promotion gate:

  1. Record learning in the growth timeline (facts only, no future plans).
  2. AI generates a challenge list: hard questions interviewers might ask, evidence gaps, reproducibility challenges, statements that would fail under pressure.
  3. Human self-certifies: the candidate checks each item and confirms they can explain, reproduce, and handle pushback.
  4. Register the promotion: date, content, linked evidence, and the candidate's explicit confirmation statement.
  5. ๅ›žๆต (backflow): promoted content flows back into the truth-source materials and master CV.

The AI never decides what is "ready." It only generates the challenge list and records the human's confirmation. This is a human-in-the-loop safety mechanism, not an AI evaluation

โ€ฆ

Source & license

This open-source MCP server is cataloged on AgentStack and links to its original source โ€” we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet, be the first.

Versions

  • v0.1.0 Imported from the upstream source.