Mastra AIフレームワークで構築された個人用求人エージェントシステムです。複数の専門化されたAIエージェントを使用して、効率的な求人検索とマッチングを支援します。
- マルチエージェントシステム: 求人検索、要件分析、マッチング評価を専門化されたAIエージェントが自動実行
- 統合ワークフロー: 3つのエージェントが連携する自動化された求人マッチングフロー
- LAPRAS統合: 日本のエンジニア求人情報への直接アクセス
- 高精度マッチング: 重み付けスコアリングシステムによる80%以上の精度保証
- 並列処理: 最大10件の求人を同時分析してパフォーマンスを最適化
- 重複除去: 検索結果の重複求人を自動で削除
- Runtime: Node.js 20.9.0+
- 言語: TypeScript (ES2022)
- AIフレームワーク: Mastra AI Framework
- AIモデル: Gemini 2.5-flash / GPT-4.1-mini(切り替え可能)
- ストレージ: LibSQL(SQLite互換)
- 外部統合: LAPRAS MCP(Model Context Protocol)
- コード品質: ESLint + Prettier + Husky
- Node.js 20.9.0以上
- npm
- 以下のいずれかのAPIキー:
- Google Generative AI API Key(Gemini使用時)
- OpenAI API Key(GPT使用時)
プロジェクトで使用される環境変数の一覧です:
| 環境変数名 | 必須 | デフォルト値 | 説明 | 使用場所 |
|---|---|---|---|---|
GOOGLE_GENERATIVE_AI_API_KEY |
◯* | なし | GeminiモデルのAPIキー | AI SDK |
OPENAI_API_KEY |
◯* | なし | OpenAIモデルのAPIキー | AI SDK |
SLACK_WEBHOOK_URL |
◯ | なし | Slack通知用のWebhook URL | src/mastra/utils/slack-sender.ts |
NODE_ENV |
- | development |
実行環境(production/development) | src/mastra/mcp-client/lapras-mcp.ts |
SLACK_DEFAULT_CHANNEL |
- | #general |
Slack通知のデフォルトチャンネル | src/mastra/utils/slack-sender.ts |
JOB_FILTER_DAYS |
- | 7 |
求人の日付フィルタリング(日数) | src/mastra/workflows/recruit-workflow.ts |
ECR_REGISTRY |
◯** | なし | AWS ECRレジストリURL(Docker デプロイ用) | package.json |
*AIモデルのAPIキーはGeminiかOpenAIのどちらか一つが必須
**Docker デプロイ時のみ必須
-
リポジトリのクローン
git clone https://github.com/kota/personal-recruit-agent.git cd personal-recruit-agent -
依存関係のインストール
npm install
-
環境変数の設定
ローカル開発環境:
.envファイルを作成して必要な環境変数を設定# .env # AIモデル用(どちらか一つ必須) GOOGLE_GENERATIVE_AI_API_KEY=your-gemini-api-key OPENAI_API_KEY=your-openai-api-key # Slack通知用(必須) SLACK_WEBHOOK_URL=your-slack-webhook-url # オプション設定 NODE_ENV=development SLACK_DEFAULT_CHANNEL=#recruitment JOB_FILTER_DAYS=14 # Docker デプロイ用(Docker使用時のみ必須) ECR_REGISTRY=your-ecr-registry-url
Lambda環境: AWS Lambda環境変数として設定
# AWS Lambda Environment Variables GOOGLE_GENERATIVE_AI_API_KEY=your-gemini-api-key OPENAI_API_KEY=your-openai-api-key SLACK_WEBHOOK_URL=your-slack-webhook-url NODE_ENV=production SLACK_DEFAULT_CHANNEL=#recruitment JOB_FILTER_DAYS=7 ECR_REGISTRY=your-ecr-registry-url
-
開発サーバーの起動
npm run dev
npm run dev開発サーバーが起動後、統合ワークフローが以下の流れで実行されます:
- ユーザー要件をMarkdownチェックリストに変換
- 積極的な求人検索(10件以上を目標)
- 重複求人の自動除去
- 並列マッチング分析(最大10件同時)
- 80%以上のマッチング率の求人を抽出
- マッチング率順でソートされた結果を出力
src/mastra/models.ts で利用可能なモデルを定義:
export const MODELS = {
// OpenAI モデル
GPT_4_1_MINI: openai('gpt-4.1-mini'),
GPT_4O_MINI: openai('gpt-4o-mini'),
GPT_4O: openai('gpt-4o'),
// Gemini モデル
GEMINI_2_5_FLASH: google('gemini-2.5-flash'),
} as const;各エージェントファイルで使用するモデルを個別に設定できます。
npm run dev- 開発サーバーを起動npm run build- プロジェクトをビルド
npm run lint- ESLintでコードチェックnpm run lint:fix- ESLintの問題を自動修正npm run format- Prettierでコードフォーマットnpm run format:check- コードフォーマットをチェックnpx tsc --noEmit- TypeScript型チェック
npm run build:docker- Dockerイメージをビルドnpm run build:docker-ecr- ARM64アーキテクチャ用Dockerイメージをビルドnpm run test:docker- Dockerコンテナをテスト実行npm run deploy:docker- ECRへのデプロイ(環境変数ECR_REGISTRYが必要)
- 現在テストスイートは設定されていません(
npm testは失敗します)
- LibSQL(ファイルデータベース)を使用した中央設定
- 3つのメインエージェントを統合管理
- 統合ワークフローシステム
JobSearchAgent (src/mastra/agents/job-search-agent.ts)
- 積極的な検索戦略を持つ求人検索スペシャリスト
- マルチフェーズ検索(厳密→拡張)
- 10件以上の求人発見を目標
ChecklistAgent (src/mastra/agents/checklist-agent.ts)
- ユーザー要件を構造化されたMarkdownチェックリストに変換
- 一貫した評価基準を提供
JobMatcherAgent (src/mastra/agents/job-matcher-agent.ts)
- 詳細なスコアリングアルゴリズム
- 重み付け評価:技術スタック(30%)、働き方(25%)、給与(20%)、会社(15%)、その他(10%)
- 80%以上の閾値で推奨判定
- 3つのエージェントを自動連携
- 並列処理とエラー耐性
- 重複除去とフィルタリング
- 結果の自動ソート
- LAPRAS MCP クライアント: 日本のエンジニア求人データベースへのアクセス
- Slack通知: 求人結果の自動通知機能(オプション)
すべてのエージェントはLibSQLストレージを使用してワーキングメモリを管理し、以下を追跡:
- ユーザープロファイルと設定
- 検索履歴と戦略
- 求人マッチング結果とパターン
- 評価基準の一貫性
ストレージ設定:
- 全環境: インメモリストレージ(
:memory:)を使用 - データは実行時のみ保持され、プロセス終了時に消去されます
src/
├── lambda/ # AWS Lambda関数
│ ├── index.ts
│ └── index.test.ts
├── mastra/
│ ├── agents/ # AIエージェント
│ │ ├── checklist-agent.ts
│ │ ├── job-matcher-agent.ts
│ │ └── job-search-agent.ts
│ ├── formatters/ # 出力フォーマッター
│ │ └── job-slack-formatter.ts
│ ├── mcp-client/ # MCPクライアント
│ │ └── lapras-mcp.ts
│ ├── types/ # 型定義
│ │ └── recruitment.ts
│ ├── utils/ # ユーティリティ
│ │ └── slack-sender.ts
│ ├── workflows/ # ワークフロー
│ │ └── recruit-workflow.ts
│ ├── index.ts # Mastraエントリーポイント
│ └── models.ts # AIモデル定義
└── lambda.ts # Lambda関数エントリーポイント
システムにはPinoLoggerが組み込まれており、動作状況をログで確認できます:
- レベル: info(デフォルト)
- 場所:
src/mastra/index.tsで設定
本番環境でのAWS Lambda + EventBridge構成による定期実行セットアップ手順です。
- AWS CLI設定済み
- Docker環境
- ECRリポジトリが作成済み
- 必要なIAM権限
# ECRリポジトリを作成
aws ecr create-repository \
--repository-name personal-recruit-agent \
--region ap-northeast-1
# ECR_REGISTRY環境変数を設定
export ECR_REGISTRY="<ACCOUNT_ID>.dkr.ecr.ap-northeast-1.amazonaws.com"# ARM64アーキテクチャ用Dockerイメージをビルド
npm run build:docker-ecr
# ECRにログイン
aws ecr get-login-password --region ap-northeast-1 | \
docker login --username AWS --password-stdin $ECR_REGISTRY
# イメージをタグ付けしてプッシュ
docker tag personal-recruit-agent:latest $ECR_REGISTRY/personal-recruit-agent:latest
docker push $ECR_REGISTRY/personal-recruit-agent:latest
# または一括実行
npm run deploy:docker- Lambdaコンソールにアクセス
- **「関数の作成」**をクリック
- **「コンテナイメージ」**を選択
- 設定項目:
- 関数名:
personal-recruit-agent-container - コンテナイメージURI:
<ACCOUNT_ID>.dkr.ecr.ap-northeast-1.amazonaws.com/personal-recruit-agent:latest - 実行ロール: **「基本的なLambdaアクセス権限で新しいロールを作成」**を選択
- 関数名:
- **「関数の作成」**をクリック
- **「設定」**タブで環境変数を追加:
NODE_ENV:productionGOOGLE_GENERATIVE_AI_API_KEY:your-gemini-api-keySLACK_WEBHOOK_URL:your-slack-webhook-urlSLACK_DEFAULT_CHANNEL:#recruitmentJOB_FILTER_DAYS:7
- **「一般設定」**を調整:
- タイムアウト: 15分(900秒)
- メモリ: 1024MB(初期設定、必要に応じて増加)
- EventBridgeコンソールにアクセス
- 「ルール」→「ルールの作成」
- 設定項目:
- 名前:
personal-recruit-agent-daily - 説明:
Personal Recruit Agent daily execution at 8PM JST
- 名前:
- **「スケジュール」**を選択
- スケジュール式:
cron(0 11 * * ? *)(毎日JST 20:00) - 「次へ」→「ターゲットを選択」
- ターゲット設定:
- ターゲットタイプ:
AWS Lambda function - 関数:
personal-recruit-agent-container
- ターゲットタイプ:
- **「追加設定」→「定数(JSON テキスト)**で以下を入力:
{ "source": "personal.recruit.agent", "detail-type": "Scheduled Job Search", "detail": { "userRequirements": "TypeScript、Next.js、React、フルリモート、副業OK、年収700万円以上、自社開発" } } - 「次へ」→「ルールの作成」
- Lambdaコンソール→関数を選択
- 「テスト」タブ→「新しいテストイベント作成」
- イベントJSON:
{ "source": "personal.recruit.agent", "detail-type": "Manual Test", "detail": { "userRequirements": "TypeScript、フルリモート、年収600万円以上" } } - **「テスト」**実行
- CloudWatchコンソール→**「ログ」→「ログ グループ」**
/aws/lambda/personal-recruit-agent-containerを選択- 最新のログストリームで実行結果を確認
コードを更新する場合:
# 1. 新しいイメージをビルド・プッシュ
npm run deploy:docker
# 2. Lambda関数のイメージURIを更新
aws lambda update-function-code \
--function-name personal-recruit-agent-container \
--image-uri $ECR_REGISTRY/personal-recruit-agent:latest \
--region ap-northeast-1