自分のマシンで行うAI求人検索:Claude Codeフレームワーク
求人を評価し、応募書類を最適化し、ATS向けにPDFを検証し、面接準備まで行うローカルClaude Codeワークフロー。
自分のマシンで行うAI求人検索:Claude Codeフレームワーク
求人検索は、多くの場合、文章作成の問題として扱われます。求人を見つけ、履歴書を編集し、カバーレターを書き、それを繰り返すというものです。しかし実際に難しいのは、文脈を失ったり、一般的で不正確な資料を誤って送信したりせずに、応募プロセス全体を管理することです。
ai-job-search は、このプロセスをエンジニアリングワークフローとして捉えています。Claude Codeをローカルな求人応募アシスタントに変え、候補者プロフィールの構造化、求人ポータルの検索、適合度の評価、応募書類のカスタマイズ、PDF出力の確認、面接資料の準備を行います。ワークフローは自分のリポジトリ内で実行されるため、キャリア情報を自分で管理でき、市場に合わせて調整することも可能です。
このプロジェクトは、評価のしやすさという点でも珍しいものです。作者は、2025年後半に職を失った後、このワークフローを使用したと報告しています。その結果、カスタマイズされた応募書類69件、一次面接20件、署名済み契約1件につながりました。作者は2026年6月にAIエンジニアとして働き始めています。これらの数字は、すべての候補者が同じ結果を得られることを保証するものではありません。しかし、このシステムが単なるデモではなく、実際の求人検索ツールとして使われた具体例を示しています。
中核となるワークフロー
メインワークフローは意図的に短く設計されています。
/setup -> /scrape -> /apply <url>
| | |
profile search evaluate fit
files portals draft documents
review and revise
/setup が基盤を構築します。CV、LinkedInのエクスポート、卒業証書、推薦状、過去の応募書類などが入ったdocuments/ディレクトリを読み込めます。また、チャットに貼り付けた1件のCVをインポートしたり、面談形式で情報を収集したりすることもできます。documentsフォルダーを使う方法はべき等なので、追加の資料が揃ったときに再実行できます。
/scrape は設定された求人ポータルを検索し、重複する求人を削除して、適合度順に結果を表示します。結果が多すぎて手作業で確認できない場合は、/rank が求人を一括スコアリングし、ランキング形式の候補リストを返します。評価では、キーワードの一致だけでなく、スキル、経験、文化、勤務地、キャリアとの整合性を考慮します。
最後に、/apply は求人URLまたは貼り付けた求人情報を受け取り、応募プロセス全体を実行します。この分離は重要です。求人の発見、優先順位付け、書類作成はそれぞれ異なる意思決定であり、それらを1つの構造化されていないプロンプトにまとめると、システムの推論を確認しにくくなるからです。
/apply の異なる点
応募コマンドは、作成者とレビュアーのパターンに従います。
- 求人情報を解析する。
- 設定された基準に沿って、候補者の適合度を評価する。 3.カスタマイズしたCVとカバーレターを作成する。
- 新しいコンテキストを持つ2つ目のClaudeエージェントを起動し、企業を調査して書類を批評する。
- レビューに基づいて書類を修正する。
- 最終PDFをコンパイルして検査する。
- ATSを意識したテキストレイヤーのチェックを実行し、検証用チェックリストを提示する。
2つ目のエージェントを使う設計は重要です。1回の処理では、流暢でも一般的な文章になったり、要件を見落としたり、移転可能なスキルのアピールが弱かったり、企業調査が表面的に聞こえたりする可能性があります。レビュアーには書類を読み直させるのではなく、インラインで書類を渡すため、呼び出しに必要なトークンを比較的効率的に抑えられます。検証は最後に1回だけ実行しますが、新しいPDF検査ステージでは、レンダリングとレイアウトの反復にその節約分の一部を使います。
このワークフローには、事実性に関するルールもあります。CVとカバーレターの主張は、候補者プロフィールによって裏付けられていなければなりません。持っていないスキルは、依然として不足項目です。見かけ上の適合度を高めるために、裏付けのないキーワードを追加することはありません。
PDFレイアウトも正確性の一部
このリポジトリでは、生成された書類をテストが必要なビルド成果物として扱います。CVはlualatexでコンパイルし、カバーレターはカスタムのcover.clsがfontspecに依存しているため、xelatexを使用します。ワークフローは、CVが正確に2ページ、カバーレターが署名の表示と一貫したフォントを備えた正確に1ページになるまで反復します。
これにより、ソースファイルからは見えない失敗を検出できます。たとえば、項目のタイトルがページ下部に取り残される、カバーレターが2ページ目にはみ出す、リスト項目のアイコンがひそかに本文フォントへフォールバックするといった問題です。プロジェクトでは、\\needspaceや\\enlargethispageなどの対象を絞ったLaTeX修正と、リスト項目用のフォント一致ラッパーを使用しています。
CVが2ページを超えた場合、古い職歴から機械的に内容を削除することはありません。候補者の各行は、対象求人との関連性、文書内での独自性、そしてカバーレターがその行に依存しているかどうかによってスコアリングされます。そのため、最近の職歴にあるものの無関係な箇条書きよりも、古い職歴にある関連性の高い箇条書きが残る場合があります。
ATSチェックでは、見た目ではなくPDFに埋め込まれたテキストを調べます。pypdfまたはpdftotextを使い、連絡先情報がリテラルテキストになっているか、文字が文字化けしていないか、読み取り順序が妥当か、対応する求人のキーワードが抽出された文書に含まれているかを検証します。どちらの抽出ツールも利用できない場合は、目視によるキーワード確認に切り替えます。
インストールとセットアップ
このフレームワークには以下が必要です。
- Claude Code CLI。ただし、ポータルスキルは
AGENTS.mdを通じて他のエージェントツールでも使用できます。 - Python 3.10以降。
- 求人検索CLIツール用のBun。
lualatexとxelatexを備えたTeX Live、MacTeX、TinyTeX、MiKTeXなどのLaTeXディストリビューション。
オプションのATSパーサーには、pypdfをインストールします。
pip install pypdf
Popplerのpdftotextは引き続きフォールバックとして使用できます。macOSではbrew install poppler、DebianまたはUbuntuではapt install poppler-utils、Windowsではchoco install popplerでインストールできます。最小構成のTeXディストリビューションでは、SETUP.mdに記載された追加パッケージも必要になる場合があります。
リポジトリをクローンした後、ポータルツールをインストールします。
gh repo fork MadsLorentzen/ai-job-search --clone
cd ai-job-search
for tool in jobbank-search jobdanmark-search jobindex-search jobnet-search linkedin-search freehire-search; do
(cd .agents/skills/$tool/cli && bun install)
done
linkedin-searchとfreehire-searchには実行時の依存関係がないため、インストール手順は任意です。実行した場合も、TypeScriptの開発用型を取得するだけです。
セットアップ手順には、重要なプライバシーに関する注意点があります。公開GitHubフォークを非公開に変更することはできません。一方、/setupは連絡先、職歴、希望給与などの個人情報を追跡対象ファイルに書き込みます。個人の求人検索では、このプロジェクトを上流リモートとして設定した非公開リポジトリを使うことが推奨されます。変更を還元する場合にのみ、公開フォークを作成してください。
デンマーク以外への拡張
付属するJobindex、Jobnet、Jobdanmark、Akademikernes Jobbankとの連携は、デンマーク市場向けに設計されています。ただし、アーキテクチャは移植可能です。各ポータルスキルは.agents/skills/以下の独立したフォルダーにあり、共通の検索・詳細CLI、--format json|table|plain出力、テスト、スキル定義内のenabled:フラグを備えています。
/add-portalは、地域の求人掲示板についてURLパターン、結果構造、robotsルール、アクセス制限を調査し、新しい連携をひな形から作成してテストできます。認証で保護されたポータルは対象外となり、制限的な利用規約がある場合は個人利用に関する警告が表示されます。LinkedInは公開求人ゲストエンドポイントを通じて国を問わず利用でき、-l "Berlin, Germany"や-l "Remote"のように明示的な勤務地フラグを指定できます。リポジトリには、freehire.meの公開REST APIを使用し、地域、国、リモート勤務のフィルターに対応するfreehire-searchも含まれています。
別のフォークからコピーしたポータルスキルは、使用前に読み、テストする必要があります。プロジェクトでは、ネットワーク接続先、依存関係、ライフサイクルスクリプト、ファイルシステムへのアクセス、テスト、利用規約に関する注意事項、enabled:設定を確認することを特に推奨しています。インストールされたツールは、事前承認済みのClaude Code権限で実行される可能性があるため、この手動検査は意図的なセキュリティ対策です。
追跡、面接、キャリア計画
このフレームワークは、応募書類の生成後も機能します。/outcomeは、正確な求人情報、提出したCV、カバーレターをdocuments/applications/<company>_<role>/に保存し、面接、オファー、不採用、または音沙汰なしの状況をトラッカーに記録します。/outcome followupは、デフォルトの10日間静かな状態にある応募を見つけ、チャネルに適したフォローアップ文を作成します。メッセージを送信することはなく、1件の応募につきフォローアップは2回までに制限されます。
/interviewは、面接官が実際に見た書類、前回の面接でのフィードバック、企業調査、面接官調査から準備資料を作成します。想定質問は実際のSTAR形式のエピソードに対応付けられ、経験不足については、作り話ではなく正直な橋渡し回答で対応します。
レポート作成では、/html-reportが、ステータス、業界、チャネル、ファネルのグラフと、フィルタリング可能な応募一覧を備えた自己完結型のオフラインダッシュボードを生成します。/notion-syncは公式MCPサーバーを使ってNotion内に一方向の読み取り専用ビューを提供し、リポジトリのファイルを唯一の記録元として維持します。/gmail-syncはGmailからステータス変更を提案できますが、承認が必要で、変更ごとに根拠となるメールを引用します。
このプロジェクトは、リンクされた公開ソースからプロフィールを充実させる/expand、優先順位付きのスキルギャップヒートマップと学習計画を作成する/upskill、組合の統計、Glassdoorのエクスポート、個人調査からユーザーが提供したデータを受け取る給与ベンチマークスクリプトにも対応しています。
品質を大きく左右するのはプロフィールの深さ
プロフィールに含まれていない情報を、システムが応募書類に反映することはできません。「Python」は弱い入力です。一方、「scikit-learnを使い、Pythonで顧客離脱予測のMLパイプラインを構築した」と書けば、ワークフローが再利用できる具体的な成果、ツールチェーン、文脈が得られます。
詳細な職務内容、測定可能な成果、プロジェクトの具体例、希望条件、譲れない条件、何に意欲を感じ、何に疲れたかについての振り返りは、すべて推薦に影響します。このフレームワークは明確なターゲット設定を支援できますが、肩書きの背後にある実際の仕事を分析して、隣接するキャリアパスを発見することもできます。言語要件には専用の処理があり、申告されていない言語は即時不採用の要因となる一方、求人が申告レベルより高い水準を求めている場合は、人間による判断が必要な項目としてフラグ付けされます。
このように、構造化された評価、書類生成、PDF検証、応募追跡、面接準備を組み合わせることで、ai-job-searchは単なる履歴書プロンプトではなくなっています。これは求人検索のための、ローカルで検査可能なオペレーティングシステムであり、ポータル、書類テンプレート、評価基準を拡張するための明確な接続点を備えています。このプロジェクトはMITライセンスで公開されており、github.com/MadsLorentzen/ai-job-searchから利用できます。