mcpField
A
apply

apply

github.com/infrasity-labs生産性15074 回インストール18 週間前に更新
リポジトリ

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/infrasity-labs/dev-gtm-claude-skills --skill apply

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

同梱ファイル

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

references/
ats-patterns.md
browser-setup.md
data-directory.md
prerequisites.md
priority-hierarchy.md
scripts/
fill-page.md

詳細

スキルを適用する

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

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

ファイル構成

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

データディレクトリ

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


ワークフロー

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

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

ステップ 1:応募先の求人を特定する

$ARGUMENTSを解析します。

URLの場合:

  • DATA_DIR/jobs/に一致する求人フォルダーがあるか確認します(フォルダー名の会社スラッグまたはURLで照合)。見つかった場合は、そのフォルダーからposting.md、resume.md、cover-letter.mdを読み込みます。
  • 一致するものがない場合は、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:応募フォームに移動して必要事項を確認する

references/browser-setup.md(tabs_context → tabs_create → navigate)に従ってブラウザーを設定します。

$ARGUMENTSが「current」の場合:ナビゲーションをスキップします。tabs_context_mcpを呼び出してアクティブなタブを取得します。

それ以外の場合は、URLのパターンからATSの種類を特定し(references/ats-patterns.mdを参照)、次の手順に従って移動します。

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]/


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

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

ラベルのパターンデータソース入力方法
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. 次のステップ — カバーレターがない場合はその作成を提案するか、次の求人検索を提案します

コメント