职位搜索服务

一个基于德国联邦就业局API的AI友好型职位搜索集成服务器,提供丰富的职位搜索和筛选功能。

  • by wunderfrucht
  • Rust
  • 本地部署
  • 3 星标
  • 更新于
在 GitHub 查看 wunderfrucht/jobsuche-mcp-server

使用说明

寻找工作 MCP 服务器

一个使用模型上下文协议(MCP)的对AI友好的求职信息集成服务器。 这台服务器提供了通过联邦就业局搜索德国职位空缺的工具 机构(联邦劳动局)API。

特点/特性

  • 人工智能友好型界面简洁、语义化的求职参数
  • 官方API集成使用 jobsuche 用于可靠API访问的容器
  • 丰富的过滤功能按地点、职位名称、雇佣类型、合同类型等条件搜索
  • 全面细节获取完整的职位信息,包括职位描述和要求
  • 分页支持高效处理大型结果集
  • 零配置开箱即用,拥有合理的默认设置

安装

来自 npm(推荐)

npm install -g @wunderfrucht/jobsuche-mcp-server

来自源(或“来源”)

git clone https://github.com/wunderfrucht/jobsuche-mcp-server.git
cd jobsuche-mcp-server
cargo build --release

配置

服务器使用环境变量进行配置(所有均为可选):

  • JOBSUCHE_API_URLAPI基础URL(默认:官方联邦劳动局API)
  • JOBSUCHE_API_KEY自定义API密钥(默认:公共API密钥)
  • JOBSUCHE_DEFAULT_PAGE_SIZE每页默认结果数(默认:25)
  • JOBSUCHE_MAX_PAGE_SIZE每页最大结果数(默认:100)

与MCP客户端的使用

Claude Desktop(克劳德桌面版)

添加到您的Claude桌面配置中(~/Library/Application Support/Claude/claude_desktop_config.json (在 macOS 上):

{
  "mcpServers": {
    "jobsuche": {
      "command": "npx",
      "args": ["@wunderfrucht/jobsuche-mcp-server"]
    }
  }
}

或者使用本地二进制文件:

{
  "mcpServers": {
    "jobsuche": {
      "command": "/path/to/jobsuche-mcp-server"
    }
  }
}

Continue.dev(可译为“继续开发平台”或根据具体语境调整,此处直译为“继续.dev”以保留原名风格,但实际应用中可能需根据上下文选择更贴切的译名)

在您的Continue配置中添加:

{
  "mcpServers": {
    "jobsuche": {
      "command": "npx",
      "args": ["@wunderfrucht/jobsuche-mcp-server"]
    }
  }
}

可用工具

1. search_jobs

使用各种筛选条件在德国搜索工作。

注: 对于大多数使用场景,请考虑使用 search_jobs_with_details 或者 batch_search_jobs 相反,因为它们在人工智能工作流程中效率更高。

参数:

  • job_title (可选):职位名称或关键词(例如,“软件工程师”,“数据科学家”)
  • location (可选):地点名称(例如,“柏林”,“慕尼黑”,“德国”)
  • radius_km (可选):以当前位置为圆心,搜索半径(公里)
  • employment_type (可选):就业类型筛选器
    • 选项: "fulltime", "parttime", "mini_job", "home_office", "shift"
  • contract_type (可选):合同类型筛选器
    • 选项: "permanent", "temporary"
  • published_since_days (可选):自发布以来的天数(0-100,默认值:30)
  • page_size (可选):每页结果数量(1-100)
  • page (可选):用于分页的页码(从1开始)
  • employer (可选):要搜索的雇主名称(例如,“BARMER”,“Siemens”)
  • branch (可选):要搜索的行业/分支(例如,“IT”,“医疗保健”)

示例:

{
  "job_title": "Software Engineer",
  "location": "Berlin",
  "employment_type": ["fulltime"]
}
{
  "location": "München",
  "published_since_days": 7,
  "radius_km": 50
}
{
  "job_title": "Data Scientist",
  "location": "Deutschland",
  "employment_type": ["fulltime", "parttime"],
  "page_size": 50
}
{
  "employer": "BARMER",
  "location": "Wuppertal",
  "employment_type": ["parttime"]
}

2. get_job_details

获取特定职位发布的详细信息。

参数:

  • reference_number (必填):搜索结果中的职位参考编号

示例:

{
  "reference_number": "10001-1234567890-S"
}

3. search_jobs_with_details ⭐ 推荐

搜索工作,并在一次操作中自动获取最热门结果的完整详情。

为什么要使用这个? 联合 search_jobs + 多个 get_job_details 整合为一个高效运营体系。

参数:

  • 所有参数来自 search_jobs (职位名称、地点、雇佣类型等)
  • max_details (可选):要获取详细信息的工作数量(默认:3,最大:10)
  • fields (可选):字段过滤(请参阅“字段过滤”部分)

⚠️ 速率限制: 在详细信息获取之间自动加入100毫秒延迟,以尊重API速率限制。

示例:

{
  "employer": "BARMER",
  "location": "Wuppertal",
  "employment_type": ["parttime"],
  "max_details": 3
}
{
  "job_title": "Sekretärin",
  "location": "Wuppertal",
  "radius_km": 25,
  "employment_type": ["parttime"],
  "max_details": 3,
  "fields": {
    "include_fields": ["title", "employer", "salary", "description", "location"]
  }
}

回复内容包括:

  • 总搜索结果数量
  • 前N名职位的完整详情(职位名称、描述、薪资、要求等)
  • 性能指标(搜索时长毫秒,详情加载时长毫秒)

4. batch_search_jobs ⭐⭐ 动力工具

一次性执行多个不同的职位搜索——非常适合系统性比较。

为什么要使用这个? 同时比较不同的雇主、工作类型或地点,而不是多次分别搜索。

参数:

  • searches搜索配置数组(最多5个),每个配置包含:
    • name此搜索的标识符
    • 所有标准搜索参数(职位名称、地点、雇主等)
  • max_details_per_search (可选):每次搜索要获取的详细信息数量(默认:2,最大:5)
  • fields (可选):对所有结果应用字段过滤

⚠️ 流量限制: 包含自动延迟(搜索之间200毫秒,详细信息之间100毫秒),以尊重API速率限制。保守的默认设置可防止API过载。

示例 - 比较雇主:

{
  "searches": [
    {
      "name": "BARMER Jobs",
      "employer": "BARMER",
      "location": "Wuppertal",
      "employment_type": ["parttime"]
    },
    {
      "name": "Siemens Jobs",
      "employer": "Siemens",
      "location": "Wuppertal",
      "employment_type": ["parttime"]
    }
  ],
  "max_details_per_search": 3
}

示例 - 比较作业类型:

{
  "searches": [
    {
      "name": "Sekretariat",
      "job_title": "Sekretärin",
      "location": "Wuppertal"
    },
    {
      "name": "Sport/Schwimmen",
      "job_title": "Schwimm",
      "location": "Wuppertal"
    },
    {
      "name": "Pädagogik",
      "job_title": "Pädagog",
      "location": "Wuppertal"
    },
    {
      "name": "Verwaltung",
      "job_title": "Verwaltung",
      "branch": "Bildung",
      "location": "Wuppertal"
    }
  ],
  "max_details_per_search": 2,
  "fields": {
    "include_fields": ["title", "employer", "salary", "description"]
  }
}

响应内容包括:

  • 每次搜索的结果(附带名称以作识别)
  • 每次搜索找到的总结果数
  • 每次搜索时显示排名前N个职位的完整详情
  • 错误处理(若某次搜索失败,则继续执行)

5. get_server_status

获取服务器状态和连接信息。

示例:

{}

响应示例

搜索工作响应

{
  "total_results": 1523,
  "current_page": 1,
  "page_size": 25,
  "jobs_count": 25,
  "jobs": [
    {
      "reference_number": "10001-1234567890-S",
      "title": "Software Engineer (m/w/d)",
      "employer": "Example GmbH",
      "location": "Berlin (10115)",
      "published_date": "2025-10-15",
      "external_url": null
    }
  ],
  "search_duration_ms": 342
}

职位详情回复

{
  "reference_number": "10001-1234567890-S",
  "title": "Software Engineer (m/w/d)",
  "description": "We are looking for an experienced software engineer...",
  "employer": "Example GmbH",
  "location": "Berlin",
  "employment_type": "Vollzeit",
  "contract_type": "unbefristet",
  "start_date": "2025-11-01",
  "application_deadline": null,
  "contact_info": null,
  "external_url": null,
  "employer_profile_url": null,
  "partner_url": "https://example.com/partner",
  "salary": "50.000 - 70.000 EUR",
  "contract_duration": "12 Monate",
  "takeover_opportunity": null,
  "job_type": "arbeitsstelle",
  "open_positions": null,
  "company_size": null,
  "employer_description": null,
  "branch": null,
  "published_date": null,
  "first_published": "2025-10-10",
  "only_for_disabled": false,
  "fulltime": true,
  "entry_period": "ab 2025-11-01",
  "publication_period": "2025-10-01 - 2025-11-30",
  "is_minor_employment": false,
  "is_temp_agency": false,
  "is_private_agency": false,
  "career_changer_suitable": true,
  "cipher_number": null,
  "raw_data": { ... }
}

可用字段:

  • 基本信息:

    • reference_number独特的工作参考(或职位参考)
    • title职位名称
    • description完整的工作职责描述
    • employer公司名称
    • location工作地点
  • 就业详情:

    • employment_type就业类型(全职、兼职,根据全职标志推导得出)
    • fulltime全职就业的布尔指示器(v0.2.0新增)
    • contract_duration合同期限(如为临时合同)
    • start_date预期开始日期(根据entry_period格式化得出)
    • entry_period输入日期范围(v0.2.0 新增功能)
    • publication_period出版日期范围(v0.2.0 新增)
  • 雇佣类型(v0.2.0 新增):

    • is_minor_employment零工/迷你工作(或:小规模就业/临时工作)
    • is_temp_agency临时就业机构(Zeitarbeit,直译为“时间工作”)
    • is_private_agency私人就业机构
    • career_changer_suitable适合转行者(跨界人士)
  • 补偿:

    • salary薪资信息(如可提供)
  • 应用程序信息:

    • external_url外部应用URL(可能在搜索结果中提供)
    • partner_url合作伙伴/联盟网址
    • cipher_number匿名发帖的加密编号(v0.2.0 新增功能)
    • application_deadline申请截止日期(API中不可用)
    • contact_info联系信息(API中不可用)
  • 附加信息:

    • job_type职位类型(工作职位、培训、实习)
    • first_published首次出版日期
    • only_for_disabled仅限重度残疾人使用
    • raw_data完整的原始API响应
  • 字段不再可用(API v0.3.0):

    • employer_profile_url已从API中移除
    • takeover_opportunity已从API中移除
    • open_positions已从API中移除
    • company_size已从API中移除
    • employer_description已从API中移除
    • branch已从API中移除
    • published_date已从API中移除
    • contract_type已从API中移除

    这些字段为了保持向后兼容性仍保留在响应结构中,但将始终返回(或:但会始终存在) null。

性能与效率

AI的大规模操作

v0.3.0版本中的新批量操作极大地减少了执行常见AI工作流所需的工具调用次数:

场景1:查找并审查前3名的工作

Traditional approach:
- 1x search_jobs
- 3x get_job_details
= 4 tool calls

With search_jobs_with_details:
- 1x search_jobs_with_details (with auto-delays)
= 1 tool call (75% reduction!)

场景2:比较4个不同的工作类别

Traditional approach:
- 4x search_jobs
- 8x get_job_details (2 per search)
= 12 tool calls

With batch_search_jobs:
- 1x batch_search_jobs (with auto-delays)
= 1 tool call (92% reduction!)

速率限制保护:

  • 在详细信息获取之间自动设置100毫秒延迟
  • 搜索之间自动设置200毫秒延迟
  • 保守默认设置(最大详细信息:3,每次搜索的最大详细信息:2)
  • 依赖于jobsuche库内置的指数退避重试逻辑

何时使用何种(方法/工具/资源等)

  • **search_jobs**当你只需要查看可用的信息(职位名称、雇主、地点)时
  • **get_job_details**当你有一个特定的工作参考编号时
  • search_jobs_with_details ⭐:当你想要搜索并查看详细信息时(最常见的AI工作流程)
  • batch_search_jobs ⭐⭐:在比较多个类别(雇主、工作类型、地点)时

字段过滤(可选)

通过指定要包含/排除的字段来减小响应大小和减少令牌使用量:

{
  "fields": {
    "include_fields": ["title", "employer", "salary", "description", "location"]
  }
}

或者排除不必要的字段:

{
  "fields": {
    "exclude_fields": ["raw_data", "cipher_number", "is_temp_agency"]
  }
}

注: 现场过滤基础设施已存在,但全面实施将在未来版本中推出。

发展

先决条件

  • Rust 1.75.0 或更高版本
  • Node.js 16+(用于npm分发)

建筑

cargo build

运行测试

cargo test

使用MCP Inspector进行测试

npm install -g @modelcontextprotocol/inspector
npx @modelcontextprotocol/inspector ./target/debug/jobsuche-mcp-server

使用直接JSON-RPC进行测试

# List available tools
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' | ./target/debug/jobsuche-mcp-server

# Call search_jobs
echo '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"search_jobs","arguments":{"location":"Berlin","page_size":5}}}' | ./target/debug/jobsuche-mcp-server

API信息

这个服务器使用了官方的联邦就业局(德国联邦就业机构)Jobsuche API:

  • 基本URL: https://rest.arbeitsagentur.de/jobboerse/jobsuche-service
  • 文档可通过以下方式获取 jobsuche Rust 项目(或库)
  • 速率限制根据API提供商的限制

已知API限制

  • 联系方式API未提供直接的联系方式(电子邮件、电话)或申请截止日期
  • 外部网址可能仅在搜索结果中可见,而非在详细职位信息中
  • 雇主搜索在搜索查询中结合职位名称(没有专门的筛选器)
  • 分支搜索在搜索查询中结合职位名称(无专用筛选器)
  • API v0.3.0 更新“在之前的API版本中,有多个字段已不再可用(请参阅“已不再可用的字段”部分)”
  • 结果按从旧到新的顺序排列(无法自定义排序)
  • 每页最多显示100个结果
  • 如果任务快速过期,任务详情可能会返回404错误

处理缺失数据的权宜之计

  • 对于应用程序URL使用 external_url 从搜索结果中选择字段,或检查 partner_url 在职位详情中
  • 针对特定雇主的搜索使用 employer 与……结合的参数 job_title 在搜索中
  • 对于已移除的字段检查 raw_data 包含完整API响应的字段——部分数据可能仍存在于未记录的字段中

故障排除

服务器无法启动

  • 检查API URL是否可访问
  • 验证环境变量是否设置正确
  • 确保您的设备已连接互联网

未找到结果

  • 尝试使用更宽泛的搜索条件
  • 检查地点名称的拼写
  • 增加 published_since_days 参数
  • 尝试移除雇佣类型筛选条件

连接错误

  • 验证网络连接
  • 检查Bundesagentur für Arbeit(联邦劳动局)的API是否可访问
  • 尝试使用默认API URL,无需自定义配置

做出贡献

  1. 克隆该仓库
  2. 创建一个特性分支
  3. 做出你的更改
  4. 如适用,请添加测试
  5. 提交拉取请求

许可证

MIT 许可证 - 详见 许可证 详情见下文。

致谢

支持