apply について
applyは、Greenhouse、Lever、Workdayの応募フォームを操作するブラウザー自動化スキルです。応募者向けに回答案を確認してから入力し、送信前に明示的な承認を求めます。
主な機能
- 01Greenhouse、Lever、Workdayに対応
- 02求人ごとの履歴書と応募情報の整理
- 03フォーム項目の確認と回答案の提示
- 04承認後に複数ステップのフォームを入力
- 05送信前の明示的な確認
活用シーン
- 01特定の求人への応募準備とフォーム入力
- 02複数の応募で個人情報を再利用
- 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 が存在する場合は、それを読み込み、値を取得します。
存在しない場合:
- 履歴書から取得できる情報を抽出します:氏名、メールアドレス、電話番号、LinkedIn、所在地
- 抽出したデータをユーザーに提示します。内容の確認と不足項目の記入を依頼します:就労資格、ビザのスポンサーシップ、EEO に関する希望(EEO の既定値はすべて「自己識別を辞退する」です)
- 次の形式で
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: 回答を提案して承認を得る
次の優先順位に従って、すべてのフィールドに対する回答案を作成します。
- 応募データ — 以下のフィールド対応付けリファレンスに従って、
application-data.mdから照合します - 妥当なデフォルト — 応募データにない一般的なフィールドには、次の値を使用します。
- 法的な氏名(名/姓)→ 通常の氏名(名/姓)と同じ
- 電子署名 → フルネーム
- 仲裁/規約への同意 → 同意(ユーザーへの注記を付ける)
- 面接プロセスへの同意 → 同意
- AI による文字起こしへの同意 → 同意
- 契約社員/短期雇用に関する質問 → 「いいえ」(応募データに別の記載がある場合を除く)
- カスタム回答 —
application-data.mdの「Custom Answers」セクションを確認し、以前に保存された回答を使用します - 最善の推測 — それ以外のフィールドについて、フィールドラベルと求人の内容に基づいて妥当な回答を作成します
- 判断できない — 本当に曖昧で、妥当なデフォルトもない場合に限ります
ユーザーには、まとめた内容を一度に提示します。
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):
- 現在のページに入力 → 「Save and Continue」をクリックします
- 検証エラーがある場合:エラーを読み、フィールドを修正して再試行します
- 新しいページでフィールドを確認し(Step 5 のロジック)、承認済みの回答と照合して入力し、次へ進みます
- 確認ページに到達するまで繰り返します
ファイルのアップロード処理:
MCP ツールでアップロードできるのは、upload_image を使った画像のみです。PDF/DOCX 形式の履歴書やカバーレターをアップロードする場合は、ファイルパスをユーザーに伝え、手動でアップロードするよう依頼してください。これは既知の制限です。ユーザーが確認中にアップロードできるよう、Step 6 の概要にパスを含めてください。
Step 8: 送信前に確認する
確認ページに到達したとき、または単一ページのフォームのすべてのフィールドに入力したとき:
- スクリーンショットを撮ります
- すべて正しく表示されていることを確認します
- 送信前に、ユーザーに明示的な確認を求めてください — ブラウザー自動化ルールにより、これは必須の明示的な許可を得る操作です
ユーザーが確認するまで、送信/送信するボタンをクリックしないでください。
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 name | Personal.FirstName | form_input / type |
last name | Personal.LastName | form_input / type |
full name | Personal.FirstName + LastName | form_input / type |
email | Personal.Email | form_input / type |
phone | Personal.Phone | form_input / type |
city, location, current location | Personal.City | form_input / type / combobox |
country | Personal.Country | ドロップダウン選択 |
linkedin | Profiles.LinkedIn | form_input / type |
github | Profiles.GitHub | form_input / type |
portfolio, website | Profiles.Portfolio | form_input / type |
resume, cv | ファイルアップロード:履歴書 PDF | ファイルアップロード |
cover letter | ファイルアップロード:カバーレター | ファイルアップロード |
how did you hear | StandardAnswers.HowHeard | ドロップダウン:「Job Board」 |
previously worked | StandardAnswers.PreviouslyWorked | ラジオボタン/チェックボックス:「No」 |
authorized to work, work authorization | StandardAnswers.WorkAuth | ラジオボタン/ドロップダウン |
sponsorship | StandardAnswers.Sponsorship | ラジオボタン/ドロップダウン |
gender | EEO.Gender | ドロップダウン:「Decline」 |
race, ethnicity | EEO.Race | ドロップダウン:「Decline」 |
veteran | EEO.Veteran | ドロップダウン/ラジオボタン:回答拒否の選択肢 |
disability | EEO.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 テキストボックスで検索してください。
回答形式
ユーザー向けの出力は、次のセクションに分けてください。
- 応募状況 — 入力した内容、スキップした内容、応募の送信確認
- 保存したファイル — 保存した応募ログのパス
- 次のステップ — カバーレターがない場合は作成を提案するか、次の求人検索を提案します
必要な権限
~/.claude/settings.json に追加します。
{
"permissions": {
"allow": [
"Read(~/.claude/skills/**)",
"Read(~/.proficiently/**)",
"Write(~/.proficiently/**)",
"Edit(~/.proficiently/**)",
"mcp__claude-in-chrome__*"
]
}
}