mcpField
J
job-auto-apply

job-auto-apply

github.com/liruihan000生産性565 回インストール29 週間前に更新
リポジトリ

job-auto-apply について

job-auto-applyは、求職検索から応募書類の準備、提出までを管理するClaudeスキルです。求人の選定と調査、個別の履歴書作成、応募状況の追跡に加え、手動レビューまたは自動提出を設定できます。

主な機能

  1. 01求人検索と応募条件の確認
  2. 02企業・求人の調査記録
  3. 03履歴書とカバーレターの調整
  4. 04ATSと文書形式のチェック
  5. 05応募状況と提出の追跡
  6. 06手動レビュー・自動モード

活用シーン

  1. 01日次目標に沿った求人の検索と選別
  2. 02求人に合わせた応募書類の準備
  3. 03ブラウザー提出前の応募内容確認
  4. 04提出済み・保留中の応募の追跡

MCP 対応

求人検索やブラウザーでの応募手順にPlaywright MCPを利用できます。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/liruihan000/claude-job-auto-apply --skill job-auto-apply

インストール後、Claude Code で/job-auto-applyを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

README.md
.gitignore
SETUP.md
config.example.json
package.json
package-lock.json
ats-handlers/
generic.md
jobvite.md
indeed.md
lever.md
ashby.md
greenhouse.md
sap.md
oracle.md
taleo.md
workday.md
evals/
test-bootstrap.sh
test-config-change.md
test-tailoring.md
references/
filing-guide.md
cover-letter-guide.md
resume-format-spec.md
user-profile.example.md
selection-strategy.md
template-guide.md
tailoring-guide.md
search-guide.md
scripts/
ats_score.js
create_cover_letter.js
bootstrap.js

詳細

求人の自動応募

設定:起動時に node ${CLAUDE_SKILL_DIR}/scripts/bootstrap.js を実行して、すべての実行時パラメーターを読み込みます。 以下の config.* が接頭辞に付いた値は、すべて config.json の値です。 bootstrap.js が ready: false を返した場合は、${CLAUDE_SKILL_DIR}/SETUP.md を読み込み、セットアップをユーザーに案内します。 Playwright インスタンスごとのツール:browser_snapshot、browser_navigate、browser_click、browser_type、browser_fill_form、browser_select_option、browser_file_upload、browser_press_key、browser_evaluate、browser_take_screenshot、browser_wait_for、browser_tabs、browser_hover


ステージ -1:起動時の自動チェック(必須)

このスキルが呼び出されるたびに、次の手順を実行します。

  1. ユーザーの意図を確認:
    • ユーザーが求人について質問したり、「相談する」「分析する」「レビューする」「確認する」と言ったりした場合は、相談モード(後述)に入ります。
    • ユーザーが特定の求人 URL または職種について「応募する」「提出する」「投」と言った場合は、単一応募モードに入ります。その求人についてフェーズ 1 の調査手順(求人情報の取得、キーワードの抽出、企業の調査、フォルダーの作成)を実行し、その求人だけを対象にフェーズ 2 → フェーズ 2.5 → フェーズ 3 に直接進みます。
    • それ以外の場合は、自動応募フローを続行します。
  2. node ${CLAUDE_SKILL_DIR}/scripts/bootstrap.js を実行し、設定を読み込んで準備状況を確認します。
    • ready: false の場合は、${CLAUDE_SKILL_DIR}/SETUP.md を読み込み、不足項目の対応をユーザーに案内します。どのフェーズにも進まないでください。回避策や代替ツールを試さないでください。
    • ディレクトリと TRACKER.md は bootstrap.js によって自動作成されます。
  3. applications/TRACKER.md を読み込みます。
  4. 今日の日付が記載された Submitted 列の項目数を数え、today_submitted に設定します。
  5. 資料の準備ができている ⬜ 未提出の項目を一覧表示します。
  6. 「本日:X/{config.daily_target} 件を提出済み、Y 件が保留中」と報告します。
  7. today_submitted >= config.daily_target の場合は、完了を報告して停止します。
  8. それ以外の場合は、自動応募パイプラインに直ちに進みます。

自律性:config.automation.manual_review: false の場合は完全に自律して動作し、ユーザーに確認を求めず、ループの途中で停止しません。true の場合は、次に進む前にフェーズ間で一時停止し、ユーザーの確認を求めます。


相談モード

自動応募ではなく、特定の求人について相談したい場合:

  1. 求人情報を読み込みます(WebFetch、Playwright、またはユーザーが提供したテキストを使用)。
  2. 職務要件、技術スタック、チーム、企業情報を分析します。
  3. uploaded-resumes/ 内のユーザーの履歴書と user-profile.md を比較します。
  4. 適合性の評価、メリットとデメリット、履歴書の方針、質問事項についてユーザーと相談します。
  5. 自動応募パイプラインには進まないでください。 ユーザーが応募すると言うか、相談を終了するまで会話を続けます。
  6. ユーザーが「応募する」または「提出する」と言った場合は、TRACKER.md に追加し、この求人だけを対象にフェーズ 2 へ進みます。

自動応募パイプライン

フェーズ 1:検索とリサーチ

pending + today_submitted >= config.daily_target になるまで求人を探します。

${CLAUDE_SKILL_DIR}/references/search-guide.md に従い、config.search.platforms を並行して検索します。 求人の検索には、Playwright MCP、WebSearch、または WebFetch を使用できます。 ${CLAUDE_SKILL_DIR}/references/selection-strategy.md に従って絞り込み、重複を除外します。

候補となる求人ごとに、次の求人に進む前にすべての手順を完了してください。

  1. JD の全文を取得します(まだ TRACKER には追加しません)。

  2. ${CLAUDE_SKILL_DIR}/references/selection-strategy.md のフィルターをすべて適用します。特に、スポンサーシップと市民権に関する確認を行います。求人がいずれかのフィルターに通らない場合は、完全にスキップし、フォルダーを作成せず、TRACKER に追加しないでください。

  3. 求人がすべてのフィルターに通った場合に限り、次に進む前に以下をすべて完了します。 a. TRACKER.md に ⬜ NOT SUBMITTED として行を追加します。 b. applications/YYYY-MM-DD_Company_Role/ フォルダーを作成します。 c. JD の全文を {APP_FOLDER}/jd.md に保存します。 d. JD のキーワードを抽出し、{APP_FOLDER}/jd-keywords.json に保存します(形式:{"required_skills":[], "preferred_skills":[], "keywords":[]})。 e. 企業の About/Mission ページを見つけて読み、概要を {APP_FOLDER}/notes.md に保存します(業界、製品、規模、事業段階、企業文化、JD URL を記載)。 f. {APP_FOLDER}/STATUS.md に ⬜ NOT SUBMITTED と記入します。

    フェーズ 1 で求人の処理が完了したとみなされるのは、次の 6 つがすべて揃った場合のみです:TRACKER の行、フォルダー、jd.md、jd-keywords.json、notes.md、STATUS.md。途中までの完了は未完了として扱います。

確認チェックポイント(config.automation.manual_review: true の場合): 見つかった求人の一覧(企業、職種、プラットフォーム、URL)をユーザーに提示します。続行する求人をユーザーが確認するまで待ちます。却下された求人は TRACKER.md とそのフォルダーから削除します。

フェーズ 1.5:ネットワークスキャン(任意 — Playwright プロファイルで LinkedIn にログインしている必要があります)

TRACKER.md で ⬜ ステータスの各企業について、次の手順を実行します。

  1. LinkedIn に移動します:linkedin.com/search/results/people/?keywords={COMPANY}&network=%5B%22F%22%5D(1 次のつながりに絞り込みます)
  2. その企業のつながりが見つかった場合は、その人の名前と役職を TRACKER.md の該当求人の Notes 列に追加します(例:「🤝 John Doe - SWE @ Company」)。
  3. つながりがある求人の優先度を上げます。

LinkedIn にログインしていない場合、またはアクセスがブロックされた場合は、このフェーズをスキップします。1 社あたり 30 秒以上かけないでください。

フェーズ 2:準備(履歴書とカバーレターのみ)

STATUS.md に ⬜ NOT SUBMITTED と記載され、フォルダーに jd.md が含まれる各求人について作業します。リサーチはすでに完了しているため、ローカルファイルのみを読み込み、Web リクエストは不要です。

  1. {APP_FOLDER}/jd.md を読みます — JD の全文
  2. {APP_FOLDER}/jd-keywords.json を読みます — 抽出済みキーワード
  3. {APP_FOLDER}/notes.md を読みます — 企業情報
  4. ${CLAUDE_SKILL_DIR}/references/template-guide.md に従い、uploaded-resumes/ からテンプレートを選択します。
  5. 個人情報(連絡先、就労資格、EEO)について user-profile.md を読みます。
  6. ${CLAUDE_SKILL_DIR}/references/tailoring-guide.md に従って履歴書を求人に合わせます。
  7. ${CLAUDE_SKILL_DIR}/references/cover-letter-guide.md に従ってカバーレターを作成します(config.prepare.cover_letter_required の場合)。
  8. DOCX と PDF を生成します。
  9. STATUS.md に 📁 PREPARED — NOT SUBMITTED と記入します。

サブエージェントを使って並行処理できます(ブラウザーは不要です)。以下の Prepare Subagent Prompt Template を使用してください。

すべての Prepare サブエージェントの完了後 — TRACKER.md を同期します: applications/*/STATUS.md をすべて確認します。📁 PREPARED または ✅ SUBMITTED のステータスが記載された各フォルダーについて、対応する TRACKER.md の行にもそのステータスが反映されていることを確認します。

フェーズ 2.5:自動レビュー(必須 — 常に実行)

すべての資料の準備が整ったら、メインエージェントが各応募書類をレビューします。次のチェックを実行します。

  1. 内容:${CLAUDE_SKILL_DIR}/references/tailoring-guide.md の同じルールを適用し、準拠していることを確認します。
  2. 形式:生成された PDF を読み、表示上の問題がないか確認します — 余分な Markdown 文字(*、**、#)、書式の崩れ、文字化け、セクションの欠落。
  3. ページ適合性:1 ページちょうどであることを確認します — はみ出しがなく、短すぎないこと。
  4. AI 文章検出 + ATS キーワードスコア:node ${CLAUDE_SKILL_DIR}/scripts/ats_score.js {APP_FOLDER}/resume.md {APP_FOLDER}/jd-keywords.json を実行します。(jd-keywords.json はフェーズ 1 ですでに作成済みです — 再生成しないでください。)結果を確認します。
    • ats_score < 60 → 不足しているキーワードを履歴書に自然に追加し、再生成します
    • ai_phrases_found → 指摘された表現を、提示された代替表現に置き換えます
    • ai_patterns_found → 該当する文を書き直します
  5. ATS 解析チェック:node ${CLAUDE_SKILL_DIR}/scripts/ats_parse_check.js {APP_FOLDER}/resume.pdf を実行します。結果を確認します。
    • status: FAIL → エラー(セクションの欠落、不適切な書式)を修正し、再生成します
    • status: WARN → 警告を確認し、可能であれば修正します

見つかった問題は自動修正し、変更があれば DOCX + PDF を再生成します。

レビューチェックポイント(config.automation.manual_review: true の場合): 自動レビューの後、準備した各応募書類の概要と、見つかった問題および修正した問題をユーザーに提示します。どの応募書類を提出するか、ユーザーの確認を待ちます。却下されたものは TRACKER.md で ❌ SKIPPED として記録します。

フェーズ 3:提出

config.automation.manual_review に応じて、2 つのモードがあります:

手動レビュー モード(manual_review: true)— 並列サブエージェント、ユーザーが手動で提出

サブエージェントは引き続き N 個の Playwright インスタンスで並列に実行します。各サブエージェントの作業はレビュー画面で終了し、ユーザーがブラウザーで手動提出します。

サブエージェントの動作(manual_review: true):

1. Navigate to job URL (opens a new tab in the assigned Playwright browser instance)
2. Fill all forms and upload tailored resume as normal
3. Navigate to the final review/confirmation page — do NOT click Submit
4. Take screenshot → {APP_FOLDER}/review-screenshot.png
5. Return "REVIEW_READY: {COMPANY} — {ROLE} | screenshot: {APP_FOLDER}/review-screenshot.png"
   (Task is complete — browser tab stays open at the review page)

メインエージェントの動作(manual_review: true):

active_subagents = 0
WHILE today_submitted < config.daily_target OR active_subagents > 0:
    // Dispatch up to N subagents (N = config.submit.parallel_instances)
    WHILE active_subagents < N AND more jobs with 📁 PREPARED:
        Launch next subagent (run_in_background: true, mode=REVIEW_ONLY)
        active_subagents++

    // Handle incoming results (non-blocking — process as they arrive)
    When a subagent returns REVIEW_READY:
        active_subagents--
        Show user: "✋ {COMPANY} — {ROLE} ready. Screenshot: {APP_FOLDER}/review-screenshot.png
                    Submit in browser → reply 'submitted {COMPANY}' | 'skip {COMPANY}' | 'stop'"

    When user replies:
        "submitted {COMPANY}" → update TRACKER.md ✅, today_submitted++
        "skip {COMPANY}"      → update TRACKER.md ❌ SKIPPED
        "stop"                → drain active subagents then exit loop
END WHILE
自律モード(manual_review: false)— 並列サブエージェント
WHILE today_submitted < config.daily_target:
    1. Pick up to N jobs whose STATUS.md contains `📁 PREPARED` (N = config.submit.parallel_instances)
    2. Launch N subagents (run_in_background: true), each assigned a unique Playwright prefix
    3. Wait for ALL subagents in this batch to complete
    4. For EACH completed subagent — immediately update TRACKER.md:
       SUCCESS → change Status to ✅ SUBMITTED, fill Submitted date column, today_submitted++
       FAILED  → change Status to ❌ SKIPPED, add reason to Notes column
       Do NOT batch these updates — update one row at a time as each result comes in.
    5. After updating TRACKER.md, verify the row was written correctly by re-reading it.
    6. If more pending → repeat. If none → back to Phase 1.
END WHILE

TRACKER.md の更新ルール:TRACKER.md の管理はメインエージェントが担当します。各結果の直後に更新し、まとめて更新したり、更新を飛ばしたりしないでください。

フェーズ 4:振り返り(日次目標の達成後、またはセッション終了時)

サブエージェントの返答メッセージに FRICTION: の行があるか確認します。

  1. 新しい ATS + friction → 回避策を記載した ${CLAUDE_SKILL_DIR}/ats-handlers/{platform}.md を作成します
  2. 既知の ATS + friction → 修正内容を既存のハンドラーに箇条書きで 1 項目追加します
  3. friction の行なし → スキップし、更新は不要です

サブエージェント準備用プロンプトテンプレート

{variables} を置き換え、Agent ツールに渡します。

Prepare application materials for {COMPANY} — {ROLE}.

**Application folder**: {APP_FOLDER}

Start from the research already saved in {APP_FOLDER}. You may do additional web research if needed (e.g. deeper company info, product details for cover letter).

**Input files (already exist in {APP_FOLDER}):**
- `jd.md` — full job description text
- `jd-keywords.json` — extracted JD keywords
- `notes.md` — company info (industry, product, size, culture)

**Steps:**
1. Read `{APP_FOLDER}/jd.md`, `{APP_FOLDER}/jd-keywords.json`, `{APP_FOLDER}/notes.md`
   **JD completeness check**: If `jd.md` is missing, empty, or clearly truncated (< 300 words, no responsibilities/requirements section), re-fetch the full JD from the URL in `notes.md` and overwrite `jd.md` and `jd-keywords.json`.
2. Select the best matching template from `uploaded-resumes/` per `${CLAUDE_SKILL_DIR}/references/template-guide.md` — read its full content for experience/skills
3. Read `user-profile.md` for personal info (contact, work auth, EEO)
4. Tailor resume per `${CLAUDE_SKILL_DIR}/references/tailoring-guide.md`
   **Format**: follow `${CLAUDE_SKILL_DIR}/references/resume-format-spec.md` exactly. `create_resume.js` enforces this automatically.
5. Write `resume-config.json` (structured data for DOCX generation)
6. Generate DOCX: `node ${CLAUDE_SKILL_DIR}/scripts/create_resume.js {APP_FOLDER}/resume-config.json {APP_FOLDER}/resume.docx`
7. Generate PDF: `libreoffice --headless --convert-to pdf --outdir {APP_FOLDER} {APP_FOLDER}/resume.docx`
8. **Page check**: Read the generated PDF and verify exactly 1 page. If not, reduce bullets per role (min 1) and regenerate. Repeat until exactly 1 full page.
9. If `config.prepare.cover_letter_required`: write `cover-letter-config.json`, generate cover_letter.docx + PDF — reference specific company details from notes.md
10. Write `STATUS.md` as `📁 PREPARED — NOT SUBMITTED`
11. Do NOT submit anything — only prepare materials
12. Do NOT fabricate experience — only use info from the resume template
13. Return "PREPARED: {COMPANY} — {ROLE}" when done

サブエージェント提出用プロンプトテンプレート

{variables} を置き換え、Agent ツールに渡します。

Submit application to {COMPANY} — {ROLE}.

**Mode:** {SUBMIT_MODE}  (either "AUTO_SUBMIT" or "REVIEW_ONLY")

**Goal:**
- AUTO_SUBMIT: Fill all forms, upload resume, and click Submit.
- REVIEW_ONLY: Fill all forms, upload resume, navigate to review/confirmation page — do NOT click Submit. Take screenshot and return "REVIEW_READY".

**Tools:** ONLY use `{PLAYWRIGHT_PREFIX}*` tools. Never use other playwright instances.

**Data sources:**
- `user-profile.md` — personal info, contact, work auth, EEO defaults
- `secrets.md` — credentials for login/registration
- Resume: {RESUME_PATH}
- Cover letter: {COVER_LETTER_PATH} (if exists)
- Additional documents: {ADDITIONAL_DOCS}
- ATS strategies: `${CLAUDE_SKILL_DIR}/ats-handlers/` (read matching platform file if recognized)

**Approach:** Observe the page at each step, decide what to do next. Every ATS is different — adapt to what you see rather than following a fixed sequence. General flow: navigate → find apply button → fill forms → upload files → review → submit. But let the page guide you.

**Constraints:**
- Auto-agree all terms/cookies/eSignatures (if config.automation.auto_agree_terms)
- Auto-register accounts if needed (if config.automation.auto_register_accounts)
- Fill ALL required fields — never leave a field empty or on "Select..."
- **Resume upload**: ALWAYS upload {RESUME_PATH} — never use a previously saved resume from the ATS profile, even if one is already shown. Actively replace it.
- Screening questions: authorized=Yes, sponsorship=Yes (+explanation), 18+=Yes, background=Yes, previously worked=No. Check for follow-up fields after each answer.
- Experience/Education dates must match the tailored resume exactly — never guess
- Before submitting: verify all required fields are filled
- Screenshot before submit → {APP_FOLDER}/review-screenshot.png (if config.submit.screenshot_review)
- Screenshot after submit → {APP_FOLDER}/confirmation-screenshot.png (if config.submit.screenshot_confirmation)
- If stuck on any interaction for >config.submit.max_retries_per_form retries, skip and report why

**Output:**
- AUTO_SUBMIT: Write {APP_FOLDER}/STATUS.md as ✅ SUBMITTED. Return "SUCCESS" or "FAILED: [reason]"
- REVIEW_ONLY: Take screenshot → {APP_FOLDER}/review-screenshot.png. Do NOT write STATUS.md. Return "REVIEW_READY: {COMPANY} — {ROLE}"
- If friction encountered, append: "FRICTION: [what happened] → [what worked]"

参照資料

  • 求人検索:${CLAUDE_SKILL_DIR}/references/search-guide.md — プラットフォームの方法、重複排除
  • 求人選定:${CLAUDE_SKILL_DIR}/references/selection-strategy.md — フィルター、優先順位付け
  • 履歴書の調整:${CLAUDE_SKILL_DIR}/references/tailoring-guide.md — 8 段階のチェックリスト
  • 履歴書の書式:${CLAUDE_SKILL_DIR}/references/resume-format-spec.md — Times New Roman、黒の見出し、2 行の会社名形式、箇条書きのスキル
  • カバーレター:${CLAUDE_SKILL_DIR}/references/cover-letter-guide.md — 構成、ルール
  • テンプレート選定:${CLAUDE_SKILL_DIR}/references/template-guide.md — JD に応じたテンプレート
  • ファイル整理と追跡:${CLAUDE_SKILL_DIR}/references/filing-guide.md — フォルダー構成、TRACKER 形式
  • ユーザープロフィール:user-profile.md — 個人情報、連絡先、就労資格、EEO
  • 認証情報:secrets.md — ATS ログイン、登録、Google Sign-In

主なルール

  • ブラウザツールのルール:
    • 求人検索:WebSearch、WebFetch、Playwright はすべて使用できます。
    • Web ページを操作するすべての処理(フォームへの入力、クリック、アップロード、送信、ログイン、登録):Playwright MCP(mcp__playwright*)のみを使用してください。 BrowserMCP、Claude-in-Chrome、その他のブラウザツールは決して使用しないでください。
    • Playwright が利用できない場合は、停止して SETUP を実行してください — 代替のブラウザツールを試してはいけません。
  • 応募書類は毎回個別に調整してください。 テンプレートをそのまま送信してはいけません。
  • 経験を決して捏造しないでください — uploaded-resumes/ 内の履歴書テンプレートに記載された情報のみを使用してください。
  • 送信前の検証 — 送信ボタンをクリックする前に、JS ですべての必須フィールドを確認してください。
  • エラー発生時:config.submit.max_retries_per_form で指定された回数まで再試行し、その後はスキップして理由を記録してください。
  • 1日の目標を達成するまで、決して停止しないでください。
  • ユーザーの言語に合わせてください(config.preferences.response_language を参照)。
  • 自動更新:ユーザーから新しい検索プラットフォーム、ATS ハンドラー、または設定の変更を求められた場合は、該当ファイル(config.json、${CLAUDE_SKILL_DIR}/references/search-guide.md、${CLAUDE_SKILL_DIR}/ats-handlers/*.md)をすぐに更新してください — ユーザーに手動での編集を求めてはいけません。

コメント