SmartHire AI is a state-of-the-art, microservices-based recruitment ecosystem designed to automate and augment the hiring process using advanced AI. From automated candidate extraction to intelligent job matching and interview scheduling, SmartHire AI streamlines the entire recruiter workflow.
The SmartHire AI platform is fully deployed and ready for use. You can explore the system immediately using the credentials provided below.
- Dashboard: smarthire.fun
- Chat Interface: chat.smarthire.fun
Email: r5bg011edh@bltiwd.com
Password: Qsdf@9876
No setup required β just open the links, log in, and start interacting with the system.
The following diagram illustrates the interaction between the different microservices:
graph TD
User((Recruiter)) --> WebApp[SmartHire WebApp]
User --> TeamsBot[Teams Bot]
subgraph Teams Service
TeamsBot --> Planner[Planner Agent]
TeamsBot --> Formatter[Formatter Agent]
Planner --> Formatter
end
subgraph Core Ecosystem
WebApp --> MCP[MCP Tool Server]
Planner --> MCP[MCP Tool Server]
WebApp --> Auth[BetterAuth]
MCP --> JS[Job Service]
MCP --> CS[Candidate Service]
MCP --> MS[Matching Service]
MCP --> RS[Report Service]
JS --> DB[(MongoDB Cluster)]
CS --> DB
MS --> DB
RS --> DB
MS -.-> JS
MS -.-> CS
RS -.-> JS
RS -.-> CS
end
subgraph Automation & External
EmailProc[Email Processing Service] --> CS
S3Proc[S3 Processing Service] --> CS
NS[Notification Service] --> DB
MSched[Meet Scheduler] --> DB
end
subgraph Storage & External AI
RS --> S3[Cloud Storage S3]
WebApp --> AI[Vercel AI SDK Hub]
Planner --> AI
AI --> LLM[OpenAI/Gemini/Claude]
end
| Service | Description |
|---|---|
smart_hire_webapp |
The main Next.js interface for managing jobs, candidates, and AI settings. |
smart_hire_mcp_server |
Model Context Protocol server that exposes hiring tools directly to AI agents. |
candidate_service |
Handles candidate lifecycle, CV parsing, and metadata extraction. |
job_service |
Manages job descriptions, requirements, and status tracking. |
matching_service |
Computes compatibility scores between candidates and jobs using LLMs. |
report_service |
Generates professional PDF matching reports and contracts via PodPDF. |
notification_service |
Runs background cron jobs for meeting reminders and high-score alerts. |
meet_scheduler |
Orchestrates Google Meet and Microsoft Teams interview integrations. |
email_processing_service |
Monitors IMAP mailboxes to automatically ingest incoming resumes. |
s3_processing_service |
Watches S3 buckets for new PDF uploads to trigger candidate extraction. |
teams_bot_service |
Microsoft Teams integration with a dual-agent architecture (Planner & Formatter). |
The SmartHire Teams Bot is built using a modern dual-agent pattern to provide a seamless conversational experience within Microsoft Teams:
- MCP Integration: Directly connected to the
smart_hire_mcp_server. - Tool Orchestration: Decides which tools to call based on user intent (e.g., "Find candidates for the JS developer role").
- Human-in-the-loop: Manages approval flows for sensitive operations that require recruiter confirmation before execution.
- UX Transformation: Takes raw JSON responses from tools and the Planner.
- Adaptive Cards: Converts data into rich, interactive Microsoft Teams Adaptive Cards.
- Engagement: Ensures that lists of candidates, job details, and matching reports are beautifully rendered and actionable within the Teams interface.
- Docker & Docker Compose
- Bun Runtime (for local development)
Use is ENV file struct:
- Copy and fill this env file
ENCRYPTION_KEY=
# Secret key used to encrypt LLM API keys data.
# Generate it with: openssl rand -base64 32
BETTER_AUTH_SECRET=
# Secret for session/JWT signing in the web app.
# Generate with: openssl rand -base64 32
UPSTASH_SEARCH_REST_URL=
# Upstash Search/Vector DB URL.
# Get from Upstash console β Database β REST URL.
UPSTASH_SEARCH_REST_TOKEN=
# Upstash API token.
# Get from Upstash console β REST Token.
S3_CV_BUCKET_NAME=
# Name of the S3 bucket where CVs/resumes are stored.
S3_CONTRACTS_BUCKET_NAME=
# Name of the S3 bucket where contract documents are stored.
S3_MATCHING_REPORTS_BUCKET_NAME=
# Name of the S3 bucket where matching analysis reports are stored.
ENDPOINT=
# S3 storage endpoint (AWS S3, MinIO, Supabase Storage etc.)
# AWS example: https://s3.amazonaws.com
REGION=
# Cloud region of your S3 bucket.
# Example: eu-west-1
ACCESS_KEY_ID=
# S3 access key.
# Create in AWS IAM β Users β Security Credentials.
SECRET_ACCESS_KEY=
# S3 secret key.
# Generated with ACCESS_KEY_ID in AWS IAM.
# you may need to create a azure Bot in "azure Portal" to get those credentials (pl use single talent app)
CLIENT_ID=
# OAuth client ID.
# Get from Microsoft Azure App Registration.
CLIENT_SECRET=
# OAuth client secret.
# Generated in Azure app registration.
TENANT_ID=
# Microsoft Azure tenant ID.
# Found in Azure Active Directory.
NEXT_PUBLIC_WEBSITE_URL=http://localhost:3000
# Public URL of the web app used in emails.
BETTER_AUTH_URL=http://localhost:3000
# Base URL of the web app for authentication callbacks.
GOOGLE_CLIENT_ID=
# Google OAuth Client ID
# This is the public identifier of your Google OAuth application.
GOOGLE_CLIENT_SECRET=
# Google OAuth Client Secret
# This is the private secret key linked to your Google OAuth application.
GOOGLE_REDIRECT_URI=
# meet scheduler call back url ex : http://localhost:3012/callback- Build and start all services:
docker compose build
docker-compose --env-file .env up -dThis works because the docker-compose.yml is configured to "pull" these variables from your shell's environment using the ${VARIABLE_NAME} syntax.
SmartHire is fully containerized. To spin up the entire stack:
# Build and start all 12 containers (MongoDB + 11 Services)
docker-compose up -d --buildThe application will be available at:
- WebApp: http://localhost:3000
- Teams Bot: http://localhost:3978/api/messages
- MCP Server: http://localhost:3003
- MongoDB: localhost:27017
- Open your browser and go to Web App
Youβll see the setup interface.
Provide:
- Your admin email
- Your LLM API key
- Your SMTP credentials
This configures the system.
After setup:
-
Go to Company
-
Click Add Company
Enter:
- Company name
- Company email
The system will send an invitation email.
- Open the email sent to the company address
- Click the invitation link
- Set a password
Now the company account exists.
Log out from the admin account and log in to the company account to continue next steps
You must link the app to Teams using a Conversation ID.
On the server where Teams Bot is running:
ngrok http 3978Copy the HTTPS URL ngrok gives you, for example: https://abc123.ngrok.io
In the Azure Portal:
- Open your Azure Bot resource
- Go to Messaging Endpoint
Set it to:
https://YOUR_NGROK_URL/api/messages
Save changes.
Step 3 β Get the Conversation ID
You can test this from the Azure portal web chat.
Send a message
The bot will reply with your Conversation ID
Step 4 β Add Conversation ID to the App
Go to Dashboard β Settings
Paste the Conversation ID into the Teams Conversation ID field
Click save changes
Your system is now connected.
You can:
- Upload CVs
- Chat with the bot
- Start using the system
- Encrypted Secrets: Sensitive API keys (OpenAI, SMTP) are encrypted at rest in MongoDB using AES-256.
- Role-Based Access: Specialized views for Administrators and Company users.
- MCP Authorization: Cross-service tool calls are protected by unique MCP tokens.
This project is proprietary. All rights reserved.
