MCP服务器POC-基于人工智能的简历到工作匹配
一个基于Spring Boot的模型上下文协议(MCP)服务器,使用AI嵌入和JSearch API提供智能简历分析和工作匹配功能。
🎯 概述
此MCP服务器使AI助手(如Claude Desktop、Cline)能够:
- 上传并分析简历 -使用LLM提取结构化信息
- 店铺简历嵌入 -基于向量的语义搜索存储
- 将简历与工作匹配 -使用JSearch API(RapidAPI)查找相关职位
- 排名职位匹配 -基于语义相似度和过滤器对作业进行评分
🏗️ 建筑
┌─────────────────────┐
│ Claude Desktop / │
│ Cline (MCP Client) │
└──────────┬──────────┘
│ SSE/STDIO
▼
┌─────────────────────┐
│ MCP Server │
│ (Spring Boot) │
├─────────────────────┤
│ • ResumeTools │
│ • MatchingTools │
│ • CourseService │
└──────────┬──────────┘
│
┌──────┴──────┐
▼ ▼
┌─────────┐ ┌──────────┐
│ Vector │ │ JSearch │
│ Store │ │ API │
│(In-Mem) │ │(RapidAPI)│
└─────────┘ └──────────┘📦 组件
MCP工具
- upload_resume -处理简历文本并生成结构化摘要
- get_sume_summary -按ID检索存储的简历摘要
- match_resume_to_jobs -从JSearch API查找匹配作业并对其进行排名
- 获取全部课程 -列出可用课程的演示工具
- Getcoursebyid -按标题获取课程的演示工具
- print_env -打印环境变量的诊断工具
- llm诊断 -LLM配置和健康检查的诊断工具
服务
- 简历服务 -简历处理和基于LLM的提取
- 矢量存储服务 -具有余弦相似度的内存向量存储
- 嵌入服务 -文本到向量嵌入(存根实现)
- JSearchService -与用于作业列表的JSearch API集成
- LlmClient -LLM聊天完成界面
🚀 入门指南
先决条件
- Java 21+
- 等级8.14.3+
- 具有JSearch API访问权限的RapidAPI帐户
- Claude Desktop或Cline(VS代码扩展)
步骤1:克隆和设置
git clone
cd job-recommendations-mcp-server步骤2:配置API密钥
- 复制示例环境文件:
copy .env.example .env- 编辑
.env并添加您的RapidAPI密钥:
JSEARCH_API_KEY=your_actual_rapidapi_key_here
JSEARCH_API_HOST=jsearch.p.rapidapi.com从以下位置获取API密钥:https://rapidapi.com/letscrape-6bRBa3QguO5/api/jsearch
步骤3:构建项目
# Windows
gradlew.bat clean bootJar
# Unix/Linux/Mac
./gradlew clean bootJarJAR将在以下位置创建: build/libs/job-recommendations-mcp-server-0.0.1.jar
步骤4:选择运输方式
方案A:STDIO(地方发展)
配置:
- 注释中的SSE配置
application.properties - 未注释:
spring.main.web-application-type=none
Claude桌面配置 (claude_desktop_config.json):
{
"mcpServers": {
"resume-matcher": {
"command": "java",
"args": [
"-jar",
"C:\\Workspace\\mcp\\job-recommendations-mcp-server\\build\\libs\\job-recommendations-mcp-server-0.0.1.jar"
]
}
}
}选项B:SSE(生产就绪)
配置:
- 保持当前
application.properties(SSE已启用) - 服务器在上运行
http://localhost:8080
运行服务器:
java -jar build/libs/job-recommendations-mcp-server-0.0.1.jarClaude桌面配置:
{
"mcpServers": {
"resume-matcher": {
"url": "http://localhost:8080/sse"
}
}
}对于Cline(VS代码): 添加到VS代码设置.json:
{
"cline.mcpServers": {
"resume-matcher": {
"url": "http://localhost:8080/sse"
}
}
}步骤5:重新启动MCP客户端
- 克劳德桌面版:重新启动应用程序
- 克莱恩:重新加载VS代码窗口
💡 使用示例
示例1:上传简历
在Claude Desktop或Cline中:
Upload my resume:
John Doe
Senior Software Engineer
5 years experience in Java, Spring Boot, AWS
Skills: Microservices, Docker, Kubernetes
Location: San Francisco, CA答复:
{
"resumeId": "abc-123-def",
"name": "John Doe",
"title": "Senior Software Engineer",
"years_experience": 5,
"skills": ["Java", "Spring Boot", "AWS", "Docker", "Kubernetes"],
"summary_text": "...",
"status": "processed"
}示例2:匹配工作
Find jobs matching resume abc-123-def in San Francisco服务器将:
- 从矢量存储中获取简历摘要
- 查询JSearch API中的相关作业
- 计算作业的嵌入
- 按语义相似性对作业进行排名
- 返回得分最高的比赛
🔧 配置
应用程序属性
| 属性 | 描述 | 默认值 |
|---|---|---|
spring.ai.mcp.server.transport | 运输方式(sse/stdio) | sse |
server.port | HTTP服务器端口(SSE模式) | 8080 |
jsearch.api.key | RapidAPI JSearch密钥 | 来自 .env |
jsearch.api.host | JSearch API主机 | jsearch.p.rapidapi.com |
环境变量
创建 .env file(永远不要提交此内容):
JSEARCH_API_KEY=your_key_here
JSEARCH_API_HOST=jsearch.p.rapidapi.com🏭 生产部署
部署到AWS
选项1:ECS Fargate
# Build Docker image
docker build -t mcp-server .
# Push to ECR
aws ecr get-login-password | docker login --username AWS --password-stdin
docker tag mcp-server:latest /mcp-server:latest
docker push /mcp-server:latest
# Deploy to ECS (use Fargate)选项2:弹性豆茎
# Package JAR
gradlew.bat bootJar
# Deploy via EB CLI
eb init
eb create mcp-server-env
eb deploy客户端配置(生产):
{
"mcpServers": {
"resume-matcher": {
"url": "https://mcp.yourcompany.com/sse",
"headers": {
"Authorization": "Bearer "
}
}
}
}🧪 测试
使用MCP检查员进行手动测试
# Install MCP Inspector
npm install -g @modelcontextprotocol/inspector
# Test your server
mcp-inspector http://localhost:8080/sse单元测试
gradlew.bat test📁 项目结构
job-recommendations-mcp-server/
├── src/main/java/com/anupam/
│ ├── job/recommendations/mcp/server/
│ │ ├── Course.java
│ │ ├── CourseService.java
│ │ └── JobRecommendationsMcpServerApplication.java
│ └── mcp/
│ ├── ai/ # LLM client interfaces
│ │ ├── chat/
│ │ ├── LlmClient.java
│ │ └── OpenAILlmClient.java
│ ├── service/ # Business logic services
│ │ ├── ResumeService.java
│ │ ├── VectorStoreService.java
│ │ ├── EmbeddingService.java
│ │ └── JSearchService.java
│ ├── tools/ # MCP-exposed tools
│ │ ├── ResumeTools.java
│ │ ├── MatchingTools.java
│ │ ├── LlmDiagnostics.java
│ │ ├── EnvPrinter.java
│ │ └── JobDto.java
│ └── util/ # Utilities
│ └── JsonUtils.java
├── src/main/resources/
│ └── application.properties
├── .env # API keys (gitignored)
├── .env.example # Template for .env
├── build.gradle
└── README.md🔐 安全说明
- 永不承诺
.env-包含敏感的API密钥 - 使用环境变量 -对于生产中的所有秘密
- 添加身份验证 -为生产SSE端点实现API令牌
- 仅限HTTPS -将TLS用于生产部署
🛠️ 故障排除
问题:“ClassNotFoundException:标准Servlet环境”
解决方案: 确保 spring-boot-starter-web 处于依赖关系中
问题:“JSearch API返回401”
解决方案: 验证您的RapidAPI密钥 .env 文件
问题:“Claude Desktop中的服务器已断开连接”
解决方案:
- 检查Spring Boot横幅是否已禁用(
spring.main.banner-mode=off) - 确保没有日志写入stdout(只有JSON-RPC消息)
问题:“找不到.env文件”
解决方案: 创建 .env 从 .env.example 在项目根中
📚 资源
🤝 贡献
- 复刻仓库
- 创建特征分支(
git checkout -b feature/amazing-feature) - 提交更改(
git commit -m 'Add amazing feature') - 推送到分支(
git push origin feature/amazing-feature) - 打开拉取请求
📝 许可证
该项目根据MIT许可证获得许可。
👥 作者
- Anupam-初步工作
🙏 致谢
- Spring AI团队为MCP服务器提供支持
- Claude和MCP方案的人体工程学
- 用于JSearch API访问的RapidAPI
