氪星。Carevo。JMR。主控程序
MCP(模型上下文协议)服务器实现,用于与MongoDB集成和可流式传输HTTP服务的作业列表和管理服务。
项目概述
该项目实现了一个现代化的MCP服务器,具有用于作业列表管理、数据库操作和实时作业分析的全面工具。它提供:
- 作业列表管理:创建、检索和筛选工作列表
- 作业视图跟踪:跟踪和分析职位列表视图
- MCP资源:对工作列表和查看数据的基于URI的只读访问
- MCP工具:人工智能模型集成的标准化工具定义
- MongoDB集成:使用Beanie ODM异步数据库操作
- REST API:基于Starlette的HTTP传输层
建筑
项目结构
Krypton.Carevo.JMR.MCP/
├── libraries/
│ └── jmr-lib/
│ ├── src/
│ │ ├── components/
│ │ │ ├── resources/
│ │ │ │ └── job_listing.py # Job listing resources
│ │ │ └── tools/
│ │ │ ├── job_listing.py # Job listing tools
│ │ │ └── schemas/ # JSON schema definitions
│ │ ├── models/
│ │ │ ├── domain/jobs/ # Job domain models
│ │ │ ├── context/ # Database context
│ │ │ └── handler/ # Tool & resource handler base
│ │ └── utility/ # Logging and config
│ ├── pyproject.toml
│ └── requirements.txt
├── servers/
│ └── jmr-svc/
│ ├── src/
│ │ ├── main.py # FastMCP server entry
│ │ ├── config.py # Configuration management
│ │ ├── managers/ # MongoDB context manager
│ │ ├── services/ # MCP services
│ │ └── helpers/ # Tool registration
│ ├── pyproject.toml
│ └── requirements.txt
├── docs/ # Documentation images
├── .vscode/ # VSCode configuration
└── README.md主要特点
1.MCP资源和资源模板
资源通过基于URI的端点提供对作业列表数据的直接访问。这些是以JSON格式公开作业数据的只读端点。该项目现在遵循MCP规范,以区分直接资源和资源模板:
- 直接资源 使用
uri静态端点的属性(例如。,jobs://today). - 资源模板 使用
uriTemplate具有参数的动态端点的属性(例如。,jobs://details/{job_id}和jobs://views/{job_id}).
jobs://today(直接资源)
URI: jobs://today\ MIME类型: application/json\ 说明: 返回在当前日期或之后发布的所有活动职位列表。
jobs://details/{job_id}(资源模板)
URI模板: jobs://details/{job_id}\ MIME类型: application/json\ 说明: 获取单个作业列表的全面详细信息,包括查看次数。
jobs://views/{job_id}(资源模板)
URI模板: jobs://views/{job_id}\ MIME类型: application/json\ 说明: 检索特定作业列表的视图总数。
注: 现在可以使用以下工具发现和注册资源模板 uriTemplate 属性,遵循模型上下文协议(MCP)最佳实践。看 job_listing.py 和 resource_register.py 了解实施细节。
2.MCP工具
fetch_job_listings
使用高级过滤功能获取工作列表。
输入架构:
filter:带有可选条件的JobFilter对象:
- job_id:按作业ID筛选 - company:按公司名称筛选 - location:按工作地点筛选 - job_type:全职、兼职、合同制、实习生、临时工 - connection_type:现场、远程、混合动力 - skills:所需技能数组 - posted_from / posted_to:日期范围筛选 - operator:过滤条件的AND或or逻辑
答复: 作业对象列表(出于隐私考虑,视图数组除外)
create_job_listing
在数据库中创建新的作业列表。
输入架构:
job:填写包含所有必填字段的Job对象
答复: 已创建ID为的Job对象
create_job_view
跟踪用户对职位列表的看法。
输入架构:
job_id:职位列表的IDuser_id:查看作业的用户的ID
答复: 查看包含操作(创建/更新)和total_job_views计数的元数据
get_job_views
检索作业的视图计数和元数据。
输入架构:
jobid:作业ID
答复: 作业的查看记录列表
2.数据模型
工作
job_id: str (unique)
title: str
description: str
company: str
location: str
job_type: JobType (enum)
connection_type: ConnectionType (enum)
salary_range: Dict[str, Any]
posted_date: str
skills: List[str]
views: List[View] (not exposed in API)
source: str
created_at: str
updated_at: str
view_count: int (computed field)职位筛选器
使用AND/OR运算符的作业查询的筛选条件。
视图
user_id: str
view_date: str测试
使用mongosh进行MongoDB测试
使用mongosh验证数据持久性和结构:
mongosh设置和使用
1.连接到MongoDB:
mongosh "mongodb://username:password@host:port/database"2.验证作业集合:
// List all jobs
db.job.find().pretty()
// Find specific job
db.job.findOne({ job_id: "job_123456" })
// Search by company
db.job.find({ company: "Tech Innovations Inc" }).pretty()
// Check views on a job
db.job.findOne({ job_id: "job_123456" }).views
// Count total jobs
db.job.countDocuments()
// Find jobs with specific skills
db.job.find({ skills: { $in: ["Python", "FastAPI"] } }).pretty()
// Filter by location and job type
db.job.find({
location: "Remote",
job_type: "Full Time"
}).pretty()3.验证视图数据:
// Check if views are being saved
db.job.findOne({ job_id: "job_123456" }, { views: 1 })
// Count views for a specific job
db.job.aggregate([
{ $match: { job_id: "job_123456" } },
{ $project: { view_count: { $size: "$views" } } }
])
// Find jobs sorted by view count
db.job.aggregate([
{ $addFields: { view_count: { $size: "$views" } } },
{ $sort: { view_count: -1 } },
{ $limit: 10 }
])4.数据管理:
// Delete a job listing
db.job.deleteOne({ job_id: "job_123456" })
// Update job details
db.job.updateOne(
{ job_id: "job_123456" },
{ $set: { title: "New Title", updated_at: new Date().toISOString() } }
)
// Clear all views for a job (reset view tracking)
db.job.updateOne(
{ job_id: "job_123456" },
{ $set: { views: [] } }
)配置
环境变量
位于 config.py:
MONGO_URI:MongoDB连接URIMONGO_USERNAME:MongoDB用户名MONGO_PASSWORD:MongoDB密码MONGO_DB:数据库名称API_ENDPOINT:API主机和端口ORIGINS:CORS允许的来源
依赖项
核心:
fastapi:Web框架uvicorn:ASGI服务器pydantic:数据验证pymongo:MongoDB驱动程序beanie:MongoDB ODMpython-mcp:模型上下文协议
发展:
debugpy:Python调试器pytest:测试框架
发展
安装
# Install project dependencies
./install.sh
# Or manually:
cd libraries/jmr-lib && pip install -e .
cd ../../servers/jmr-svc && pip install -e .运行服务器
# Start development server
python servers/jmr-svc/src/main.py
# With debugging
# Use VSCode launch configuration: Debug JMR Service数据库初始化
MongoDB客户端在中初始化 app_lifespan() 上下文管理器:
- 使用连接池自动连接
- Beanie ODM初始化
- 使用ping进行连接健康检查
工具注册
工具通过注册 ToolRegister 帮手:
- 处理程序实现
BaseToolHandler - 在中定义工具模式
@property tools - 模式加载器将JSON模式转换为Python类型的注释
- FastMCP使用正确的签名注册工具
资源注册
资源通过以下方式注册 ResourceRegister 帮手:
- 处理程序实现
BaseResourceHandler - 定义中的资源
@property resources具有URI模式 - 实现
read_resource(uri)处理基于URI的读取的方法 - FastMCP使用正确的URI路由注册资源
隐私和安全
- 查看隐私:用户视图数据存储在数据库中,但从API响应中排除
- 查看计数:通过公开可见
view_count计算字段 - 数据库排除:视图标记为
Field(default=[])用于存储,不包括在响应中model_dump(exclude={'views'})
最近的更新
MCP资源实施
- 为只读作业访问添加了三个基于URI的资源:
- jobs://today:今日发布的活跃招聘信息 - jobs://details/{job_id}:按ID列出的详细工作信息 - jobs://views/{job_id}:查看特定作业的计数
- 资源提供具有隐私保护的JSON格式数据(视图除外)
- 实现
BaseResourceHandler用于资源处理架构 - 与FastMCP集成的资源注册系统
模式外部化
- 作业筛选器架构:
components/tools/schemas/job_filter_schema.json - 创建作业模式:
components/tools/schemas/job_schema.json - 作业视图架构:
components/tools/schemas/job_view_schema.json
视图处理
- 视图现在正确地持久化到MongoDB
- 隐私保护:从获取/创建响应中排除的视图
- 通过计算属性查看可用计数
类型系统
- 使用适当的Python类型注释增强工具注册
- MCP客户端兼容性的模式到类型转换
- 对job_type和connection_type的完全枚举支持
调试
断点问题
如果断点未命中:
- 验证
.vscode/launch.json配置 - 确保
justMyCode: false已设置 - 检查PYTHONPATH是否包括图书馆和服务目录
- 重新启动Python解释器
已知问题
Postman中的动态资源发现
使用动态(模板)资源 uriTemplate (例如。, jobs://details/{job_id})在Postman中不能直接加载或发现。这是Postman解释MCP资源列表和模板的一个限制。
Dynamic Resource Issue in Postman
但是,动态资源已正确加载,并在Cline MCP官方客户端中可见:
Cline Detecting dynamic resources
在代理核心和MCP客户端集成后,将对动态URI的资源调用进行全面测试。在此之前,只有直接资源(静态URI)可以在Postman中可靠地测试。
许可证
内部工具-氪。Carevo。JMR。主控程序
