mcpField
A
apply

apply

github.com/proficientlyjobs生産性443106 回インストール33 週間前に更新
リポジトリ

apply について

applyは、Greenhouse、Lever、Workdayの応募フォームを操作するブラウザー自動化スキルです。応募者向けに回答案を確認してから入力し、送信前に明示的な承認を求めます。

主な機能

  1. 01Greenhouse、Lever、Workdayに対応
  2. 02求人ごとの履歴書と応募情報の整理
  3. 03フォーム項目の確認と回答案の提示
  4. 04承認後に複数ステップのフォームを入力
  5. 05送信前の明示的な確認

活用シーン

  1. 01特定の求人への応募準備とフォーム入力
  2. 02複数の応募で個人情報を再利用
  3. 03フォーム要件の確認と履歴書の調整

インストール

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

$npx skills add https://github.com/proficientlyjobs/proficiently-claude-skills --skill apply

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

同梱ファイルscripts/fill-page.md

詳細

スキルを適用する

優先順位:競合の解決については、shared/references/priority-hierarchy.md を参照してください。

ブラウザー自動化を使用して、Greenhouse、Lever、Workday の応募フォームに入力します。

クイックスタート

  • /proficiently:apply - フローを開始します(求人 URL を尋ねるか、直近の求人を使用します)
  • /proficiently:apply https://... - 特定の求人情報に応募します
  • /proficiently:apply last - 最新の求人フォルダーを使用して応募します
  • /proficiently:apply current - アクティブなブラウザータブですでに開いている応募フォームに入力します

ファイル構成

scripts/
  fill-page.md              # Form-filling subagent prompt

データディレクトリ

shared/references/data-directory.md に従ってデータディレクトリを解決します。


ワークフロー

ステップ 0:前提条件を確認する

データディレクトリを解決してから、shared/references/prerequisites.md に従って前提条件を確認します。履歴書ファイルは必須です。DATA_DIR/application-data.md が存在する場合は読み込みます(存在しない場合はステップ 2 で作成します)。

ステップ 1:対象の求人を決定する

$ARGUMENTS を解析します。

URL の場合:

  • DATA_DIR/jobs/ に一致する求人フォルダーがあるか確認します(フォルダー名の会社名スラッグまたは URL で照合します)。見つかった場合は、そのフォルダーから posting.md、resume.md、cover-letter.md を読み込みます。
  • 一致するものがない場合は、shared/references/browser-setup.md に従ってブラウザーをセットアップし、求人情報を取得して、DATA_DIR/jobs/[company-slug]-[date]/posting.md に新しいフォルダーを作成して保存します。

「last」または空の場合:

  • DATA_DIR/jobs/ から最終更新日時が最も新しい求人フォルダーを探します
  • そのフォルダーの posting.md、resume.md、cover-letter.md を読み込みます
  • どの求人への応募かをユーザーに確認します

「current」の場合:

  • ページ遷移をスキップし、現在のブラウザータブをそのまま使用します
  • 可能であれば、タブの URL と保存済み求人フォルダーを照合してコンテキストを読み込みます

読み込んだ内容を報告します。

Applying to [Role] at [Company].
ステップ 2:応募データを作成/読み込む

DATA_DIR/application-data.md が存在する場合は、それを読み込み、値を取得します。

存在しない場合:

  1. 履歴書から取得できる情報を抽出します:氏名、メールアドレス、電話番号、LinkedIn、所在地
  2. 抽出したデータをユーザーに提示します。内容の確認と不足項目の記入を依頼します:就労資格、ビザのスポンサーシップ、EEO に関する希望(EEO の既定値はすべて「自己識別を辞退する」です)
  3. 次の形式で DATA_DIR/application-data.md に保存します。
# Application Data

## Personal Information
- First Name: ...
- Last Name: ...
- Email: ...
- Phone: ...
- City: ...
- Country: United States

## Online Profiles
- LinkedIn: ...
- GitHub: ...
- Portfolio: ...

## Standard Answers
- How did you hear about us: Job Board
- Previously worked at this company: No
- Authorized to work in the US: Yes
- Requires visa sponsorship: No

## EEO / Voluntary Disclosures
- Gender: Decline to self-identify
- Race/Ethnicity: Decline to self-identify
- Veteran status: I am not a veteran
- Disability: I don't wish to answer
ステップ 3:応募フォームに移動し、必要項目を確認する

shared/references/browser-setup.md に従ってブラウザーをセットアップします(tabs_context → tabs_create → navigate)。

$ARGUMENTS が「current」の場合:ページ遷移をスキップします。tabs_context_mcp を呼び出してアクティブなタブを取得します。

それ以外の場合は、URL パターン(shared/references/ats-patterns.md を参照)から ATS の種類を検出し、該当する方法で移動します。

Lever(jobs.lever.co/...):

  • 求人情報の URL の末尾に /apply を追加して移動するか、求人情報に移動して「APPLY FOR THIS JOB」をクリックします

Greenhouse(boards.greenhouse.io/... または grnhse_iframe を含むページ):

  • 求人情報の URL に移動します
  • javascript_tool を使用して iframe トークンを抽出します。
    const iframe = document.getElementById('grnhse_iframe');
    const url = new URL(iframe.src);
    JSON.stringify({
      boardToken: url.searchParams.get('for'),
      jobToken: url.searchParams.get('token')
    });
    
  • 直接フォーム URL https://job-boards.greenhouse.io/embed/job_app?for={boardToken}&token={jobToken} に移動します

Workday(*.myworkdayjobs.com/...):

  • 求人情報に移動し、「Apply Now」をクリックします。
  • Autofill/Manual の選択肢があるランディングページが表示された場合は、「Apply Manually」をクリックします。
  • 認証ゲートが表示された場合は、ユーザーにサインインするよう伝え、準備ができたら「continue」と入力するよう伝えます。アカウント作成は禁止されている操作です。認証はユーザー自身が行う必要があります。

不明な ATS:

  • URL に移動して、スクリーンショットを撮ります
  • フォームの特定を試みます。判別できない場合はユーザーに伝え、指示を求めます。

フォームを確認します。 応募フォームが表示されたら、簡単にスキャンして(read_page(filter="interactive") を使用するか、Workday の場合はスクロールして)、以下を確認します。

  • 履歴書/CV のアップロード欄はありますか?
  • カバーレターのアップロード欄またはテキスト入力欄はありますか?
  • 特別な対応が必要な通常とは異なる必須項目はありますか?

これらの要件を記録します。ステップ 4 で作成する資料は、これらの要件によって決まります。

Step 4: 不足している資料を作成する

入力作業を始める前にすべてを準備し、ユーザーの作業を最小限に抑えることが目的です。

必ず履歴書を応募先に合わせて調整してください。 この求人について、DATA_DIR/jobs/[job-folder]/resume.md が存在するか確認します。

  • 存在する場合:履歴書はすでにこの職種向けに調整されています。スキップします。
  • 存在しない場合:履歴書調整スキルをインラインで実行します。skills/tailor-resume/SKILL.md のワークフローに従い、読み込み済みの求人情報、元の履歴書、職務経歴プロフィールを使って、応募先に合わせた履歴書を作成します。求人フォルダーに保存し、続行する前にユーザーに提示して簡単に確認してもらいます。

フォームで必要な場合にのみカバーレターを作成してください。 ステップ 3 で調査した結果、フォームにカバーレター欄があった場合:

  • DATA_DIR/jobs/[job-folder]/cover-letter.md が存在するか確認します
  • 存在する場合:作成済みです。スキップします。
  • 存在しない場合:カバーレター作成スキルをインラインで実行します。skills/cover-letter/SKILL.md のワークフローに従い、求人情報、調整済みの履歴書、プロフィールを使います。求人フォルダーに保存し、簡単に確認してもらうためユーザーに提示します。

フォームにカバーレター欄がない場合は、カバーレターの作成を完全にスキップします。

作成したものをユーザーに伝えます。

Prepared for [Role] at [Company]:
- Tailored resume: [generated / already existed]
- Cover letter: [generated / already existed / not required by form]

Ready to fill the application. Proceeding...
Step 5: すべてのフィールドを確認する

入力を始める前にフォーム全体を確認し、すべてのフィールドを特定します。このステップではフィールドに入力しないでください。読み取りのみ行います。

Lever/Greenhouse(単一ページのフォーム)の場合:

  • read_page(tabId, filter="interactive") を呼び出して、すべてのフィールドを一度に取得します

Workday(複数ステップのウィザード)の場合:

  • 現在のページを上から下へスクロールし、各ビューポート位置で read_page を呼び出して確認します
  • すべてのフィールドのラベル、種類、必須かどうかを記録します
  • 注:ウィザードの各ページには、ページに進んだ時点で確認します(ステップ 7 を参照)

見つかった各フィールドについて、次の内容を記録します。

  • フィールドラベル
  • フィールドの種類(テキスト、ドロップダウン、ラジオボタン、チェックボックス、ファイルアップロード)
  • 必須かどうか
  • 後で入力するための要素参照
Step 6: 回答を提案して承認を得る

次の優先順位に従って、すべてのフィールドに対する回答案を作成します。

  1. 応募データ — 以下のフィールド対応付けリファレンスに従って、application-data.md から照合します
  2. 妥当なデフォルト — 応募データにない一般的なフィールドには、次の値を使用します。
    • 法的な氏名(名/姓)→ 通常の氏名(名/姓)と同じ
    • 電子署名 → フルネーム
    • 仲裁/規約への同意 → 同意(ユーザーへの注記を付ける)
    • 面接プロセスへの同意 → 同意
    • AI による文字起こしへの同意 → 同意
    • 契約社員/短期雇用に関する質問 → 「いいえ」(応募データに別の記載がある場合を除く)
  3. カスタム回答 — application-data.md の「Custom Answers」セクションを確認し、以前に保存された回答を使用します
  4. 最善の推測 — それ以外のフィールドについて、フィールドラベルと求人の内容に基づいて妥当な回答を作成します
  5. 判断できない — 本当に曖昧で、妥当なデフォルトもない場合に限ります

ユーザーには、まとめた内容を一度に提示します。

Here's my plan for the [Company] application:

**Auto-fill from your data:**
- First Name: Jane
- Last Name: Doe
- Email: [email protected]
- Phone: 555-0123
- LinkedIn: https://linkedin.com/in/janedoe
...

**Proposed answers (please review):**
- Legal First Name: Jane (same as first name)
- Electronic signature: Jane Doe
- Arbitration agreement: Accept
- Contract work: No
- [Any other non-obvious fields]: [proposed answer]

**Needs your input:**
- [Only truly ambiguous fields, if any]

**Manual upload needed:**
- Resume: [file path]
- Cover letter: [file path] (if applicable)

Approve and I'll fill everything in. Or tell me what to change.

重要な原則:質問は一度、入力も一度。 フィールドごとに質問して作業を中断しないでください。ユーザーとのやり取りは、この一度の承認(およびステップ 8 の最終送信確認)のみとします。

ユーザーが承認した後(修正があれば反映したうえで)、新しい回答を DATA_DIR/application-data.md の「Custom Answers」セクションに保存し、今後の応募で再利用できるようにします。

Step 7: フォームに入力する

承認後、すべてを一度に入力します。

サブエージェントに委任します。 scripts/fill-page.md を呼び出し、以下を渡します。

  • ATS の種類(lever/greenhouse/workday/unknown)
  • 承認済みのフィールド→値のマッピング(応募データだけでなく、すべての回答)
  • タブ ID
  • 履歴書とカバーレターのアップロード用ファイルパス

サブエージェントが現在のページのすべてのフィールドに入力し、入力済みの内容と残りの項目を返します。

複数ページのフォームの場合(Workday):

  1. 現在のページに入力 → 「Save and Continue」をクリックします
  2. 検証エラーがある場合:エラーを読み、フィールドを修正して再試行します
  3. 新しいページでフィールドを確認し(Step 5 のロジック)、承認済みの回答と照合して入力し、次へ進みます
  4. 確認ページに到達するまで繰り返します

ファイルのアップロード処理: MCP ツールでアップロードできるのは、upload_image を使った画像のみです。PDF/DOCX 形式の履歴書やカバーレターをアップロードする場合は、ファイルパスをユーザーに伝え、手動でアップロードするよう依頼してください。これは既知の制限です。ユーザーが確認中にアップロードできるよう、Step 6 の概要にパスを含めてください。

Step 8: 送信前に確認する

確認ページに到達したとき、または単一ページのフォームのすべてのフィールドに入力したとき:

  1. スクリーンショットを撮ります
  2. すべて正しく表示されていることを確認します
  3. 送信前に、ユーザーに明示的な確認を求めてください — ブラウザー自動化ルールにより、これは必須の明示的な許可を得る操作です

ユーザーが確認するまで、送信/送信するボタンをクリックしないでください。

Step 9: 応募を記録する

送信後(またはユーザーが送信しないことを決めた場合):

DATA_DIR/jobs/[company-slug]-[date]/applied.md を作成します:

# Application Log

- **Date**: YYYY-MM-DD
- **ATS**: Greenhouse/Lever/Workday
- **Status**: Submitted / Draft (not submitted)
- **Notes**: [any relevant notes]

DATA_DIR/job-history.md を更新します — 該当する求人の項目を見つけ、応募状況と日付を追記します。

ユーザーに提示します:

Applied to [Role] at [Company] on [date].
Files saved to: DATA_DIR/jobs/[folder]/

Next: /proficiently:apply [next-job-url] (apply to another job)
      /proficiently:job-search (find more jobs)

Built by Proficiently. Want someone to handle applications and connect
you with hiring managers? Visit proficiently.com

フィールド照合リファレンス

フォームのフィールドラベル(大文字と小文字を区別せず、あいまい一致)を応募データと照合します:

ラベルのパターンデータソース入力方法
first namePersonal.FirstNameform_input / type
last namePersonal.LastNameform_input / type
full namePersonal.FirstName + LastNameform_input / type
emailPersonal.Emailform_input / type
phonePersonal.Phoneform_input / type
city, location, current locationPersonal.Cityform_input / type / combobox
countryPersonal.Countryドロップダウン選択
linkedinProfiles.LinkedInform_input / type
githubProfiles.GitHubform_input / type
portfolio, websiteProfiles.Portfolioform_input / type
resume, cvファイルアップロード:履歴書 PDFファイルアップロード
cover letterファイルアップロード:カバーレターファイルアップロード
how did you hearStandardAnswers.HowHeardドロップダウン:「Job Board」
previously workedStandardAnswers.PreviouslyWorkedラジオボタン/チェックボックス:「No」
authorized to work, work authorizationStandardAnswers.WorkAuthラジオボタン/ドロップダウン
sponsorshipStandardAnswers.Sponsorshipラジオボタン/ドロップダウン
genderEEO.Genderドロップダウン:「Decline」
race, ethnicityEEO.Raceドロップダウン:「Decline」
veteranEEO.Veteranドロップダウン/ラジオボタン:回答拒否の選択肢
disabilityEEO.Disabilityドロップダウン/ラジオボタン:回答拒否の選択肢

認識できないフィールド:必須かどうかを確認します。必須の場合はユーザーに尋ねます。任意の場合はスキップします。ユーザーの回答は、再利用できるよう DATA_DIR/application-data.md の「Custom Answers」に保存します。

ATS 固有の操作に関する注意事項

Lever:form_input は、値またはテキストを指定すると、ドロップダウンを含むすべてのフィールドタイプで直接機能します。

Greenhouse:直接フォームの URL(iframe の外部)に移動した後は、form_input は値を指定すると機能します。

Workday:

  • read_page(filter="interactive") は、ビューポート内に表示されている要素のみを返します。上から下までスクロールし、スクロール位置ごとに read_page を呼び出す必要があります。
  • ラジオボタンは read_page で返されません。find ツールを使うか、computer で座標を指定してクリックしてください。
  • ドロップダウンは、クリックするとポップアップパネルを開く button 要素です。ボタンをクリックし、find または read_page で選択肢を見つけてから、選択肢をクリックしてください。階層型ドロップダウン(「どこで知りましたか」など)では、ポップアップ内の Search テキストボックスで検索してください。

回答形式

ユーザー向けの出力は、次のセクションに分けてください。

  1. 応募状況 — 入力した内容、スキップした内容、応募の送信確認
  2. 保存したファイル — 保存した応募ログのパス
  3. 次のステップ — カバーレターがない場合は作成を提案するか、次の求人検索を提案します

必要な権限

~/.claude/settings.json に追加します。

{
  "permissions": {
    "allow": [
      "Read(~/.claude/skills/**)",
      "Read(~/.proficiently/**)",
      "Write(~/.proficiently/**)",
      "Edit(~/.proficiently/**)",
      "mcp__claude-in-chrome__*"
    ]
  }
}

コメント