How ai-job-search Handles Natural Language Processing for Job Descriptions Using Claude Code
The ai‑job‑search repository delegates all natural language processing for job descriptions to Claude Code, using prompt‑engineered extraction and LLM‑based reasoning rather than embedded Python NLP libraries like spaCy or NLTK.
The ai‑job‑search project by MadsLorentzen takes an unconventional approach to parsing job postings. Instead of integrating traditional natural language processing libraries directly into the codebase, the repository relies entirely on Claude Code to perform linguistic analysis through carefully engineered prompts and structured workflows.
Architecture Overview: LLM‑First NLP
Unlike conventional Python applications that import spaCy or NLTK for entity recognition, this repository treats Claude Code as the primary NLP engine. According to the repository's README.md, the architecture explicitly positions the AI‑driven command‑line environment as the language understanding layer. This design choice eliminates the need for explicit tokenization, part‑of‑speech tagging, or named entity recognition models within the Python codebase, allowing the project to remain lightweight while leveraging advanced linguistic capabilities.
The Four‑Stage Processing Pipeline
Step 1: Content Retrieval via WebFetch
The /apply command defined in .claude/commands/apply.md initiates the workflow by fetching job posting content. When the user provides a URL, the system invokes the built‑in WebFetch tool to retrieve the raw HTML; when provided with pasted text, it processes the verbatim input directly without additional scraping logic.
Step 2: Prompt‑Based Entity Extraction
Step 0 of the workflow instructs Claude to extract structured data from unstructured text. The prompt explicitly requests: "Extract: company name, role title, department, location, and language of the posting". These extraction rules are hard‑coded in the prompt rather than implemented through regex or statistical models, allowing Claude's large‑language model to parse free‑text descriptions and output normalized fields without explicit tokenization or part‑of‑speech tagging occurring in the code base.
Step 3: Structured Evaluation Framework
Once extracted, the data feeds into the Job Evaluation Framework defined in .claude/skills/job-application-assistant/04‑job‑evaluation.md. Claude scores the posting across five dimensions: technical skills, experience, behavioral fit, location/logistics, and career alignment. The framework consumes the JSON structure output from the extraction phase and applies the scoring rubric using the model's internal reasoning capabilities rather than algorithmic scoring functions.
Step 4: Security Boundaries for Untrusted Input
The system treats all job postings as untrusted data. The prompts in .claude/commands/apply.md explicitly forbid following any instructions embedded within the posting text and prohibit fetching additional URLs found in the body. This "Trust Boundary" ensures Claude interprets the content without executing potentially malicious commands hidden in the job description.
Key Implementation Files
The repository organizes its NLP‑related logic across three critical files:
-
.claude/commands/apply.md: Orchestrates the two‑agent workflow and defines the initial Parse Input step with extraction rules for company name, role title, department, location, and language. -
.claude/skills/job-application-assistant/04‑job‑evaluation.md: Contains the evaluation rubric that consumes the extracted fields and generates fit scores across the five‑dimension framework. -
tools/security_guards.py: Acts as a CI guard ensuring only approved Claude Code permissions are packaged, reinforcing the exclusive reliance on Claude for all NLP operations and preventing the introduction of unauthorized processing tools.
Code Example: Conceptual Workflow
While no direct Python NLP code exists in the repository, the processing flow conceptually follows this pattern:
# Conceptual pseudocode showing the LLM-driven pipeline
# 1. Retrieve posting via WebFetch or direct input
raw_text = web_fetch(url) # Built-in Claude tool
# 2. Prompt Claude for structured extraction
extraction_prompt = """
Extract from the job posting below:
- company name
- role title
- department
- location
- language
Posting: {raw_text}
"""
# 3. Claude returns structured JSON
extracted_data = claude.complete(extraction_prompt)
# 4. Evaluate against candidate profile using framework
scores = evaluate_fit(extracted_data) # Defined in 04-job-evaluation.md
Summary
- ai‑job‑search avoids embedding traditional NLP libraries, delegating all linguistic analysis to Claude Code through prompt engineering.
- The
.claude/commands/apply.mdfile orchestrates content retrieval and entity extraction via hard‑coded prompt instructions. - Structured evaluation occurs through
.claude/skills/job-application-assistant/04‑job‑evaluation.mdusing five‑dimensional scoring criteria. - Security guards in
tools/security_guards.pyenforce the Claude‑only processing model and permission boundaries. - No tokenization, POS tagging, or named entity recognition occurs in Python; the LLM handles all parsing internally via the WebFetch tool and extraction prompts.
Frequently Asked Questions
Does ai‑job‑search use spaCy or NLTK for parsing job descriptions?
No. According to the source code analysis, the repository contains no embedded traditional NLP libraries. All natural language processing for job descriptions is performed by Claude Code through prompt engineering, eliminating the need for Python‑based tokenization or statistical entity recognition models.
How does the system extract structured data from unstructured job postings?
The system uses hard‑coded extraction prompts in .claude/commands/apply.md that instruct Claude to identify specific fields including company name, role title, department, location, and language. Claude's large‑language model capabilities parse the free‑text description and return structured data without explicit programming of parsing rules or grammar models.
What security measures protect against malicious job postings?
The workflow treats all postings as untrusted data. The prompts explicitly forbid following instructions embedded in the job text and prohibit fetching additional URLs from the posting body. Additionally, tools/security_guards.py acts as a CI guard to ensure only approved Claude Code permissions are packaged with the application, preventing unauthorized code execution.
Where is the job evaluation logic implemented?
The evaluation rubric resides in .claude/skills/job-application-assistant/04‑job‑evaluation.md. This file defines the Job Evaluation Framework that scores postings across five dimensions—technical skills, experience, behavioral fit, location/logistics, and career alignment—using Claude's reasoning capabilities rather than algorithmic scoring functions.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →