Skip to main content
Glama
mingyangsun-sketch

Moka MCP Server

Moka MCP Server

基于 Moka 开放 API 的 MCP Server。让 Claude、Cursor 等 AI 助手能够直接查询 Moka 招聘系统中的候选人、职位、招聘流程、组织架构、Offer 字段与人才库等信息。

第一阶段:只读。 仅提供查询类能力,不涉及任何写入 / 删除等高危操作。

功能(Tool 一览)

下表的端点与版本均已对生产环境实测校准。Moka API 实际分布在三套基础路径上: v1(多数)、v2(招聘流程/阶段)、candidate/v1(候选人申请记录)。

模块

Tool

真实端点

方法/版本

候选人

search_candidates

/data/ehrApplications

GET v1

候选人

get_candidate_detail

/data/ehrApplications?applicationId=

GET v1

候选人

get_candidate_applications

/getApplicationStates(body: candidateId)

POST candidate/v1

候选人

get_candidate_stage

复用候选人详情的 stageName

GET v1

职位

list_jobs

/jobs/{orgId}mode 必填:social/campus)

GET v1

职位

get_job_detail

/jobs/{orgId}/{jobId}

GET v1

职位

get_job_custom_fields

取自职位详情的 customFields

GET v1

流程

list_pipelines

/pipelines/getPipelinesList

GET v2

流程

list_stages

/stage/getStagesList

GET v2

组织

list_departments

/departments

GET v1

Offer

get_offer_custom_fields

/offers/custom_fields(返回 social/campus)

GET v1

人才库

list_talent_pools

/talentPool/list

GET v1

人才库

list_talent_pool_candidates

/talentPool/candidates(需 archivedAt 范围 + talentPoolIds)

GET v1

环境说明:当前 API Key 仅在生产环境有效(CSM 未开通 staging),故 MOKA_ENV 请用 production。所有 Tool 均为只读,首阶段不涉及任何写操作。

Related MCP server: Sprinklr MCP Server

安装

要求 Python 3.10+。

# 推荐用 uv
uv pip install -e .

# 或者用标准 venv + pip
python3 -m venv .venv
source .venv/bin/activate
pip install -e .

配置

复制 .env.example.env 并填入真实值:

cp .env.example .env

变量

必填

说明

MOKA_API_KEY

Moka API Key(Basic Auth),由 CSM 发放

MOKA_ORG_ID

职位接口需要

组织标识,由 CSM 提供

MOKA_ENV

production(默认)/ staging

MOKA_BASE_URL

显式覆盖 Base URL,一般留空

MOKA_MASK_SENSITIVE

是否脱敏手机号/身份证,默认 true

MOKA_TIMEOUT

HTTP 超时(秒),默认 30

MOKA_MAX_ITEMS

自动翻页累计上限,默认 200

运行

# 直接以 stdio 方式启动(供 MCP 客户端拉起)
moka-mcp-server

# 或
python -m moka_mcp.server

接入 Claude Desktop

编辑 claude_desktop_config.json(macOS 路径: ~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "moka": {
      "command": "/绝对路径/到/.venv/bin/moka-mcp-server",
      "env": {
        "MOKA_API_KEY": "your_api_key_here",
        "MOKA_ORG_ID": "your_org_id",
        "MOKA_ENV": "production",
        "MOKA_MASK_SENSITIVE": "true"
      }
    }
  }
}

接入 Cursor

.cursor/mcp.json 中加入相同结构的配置即可。

自托管 HTTP 端点(Hermes / mcporter 接入)

除本地 stdio 外,本服务支持以 streamable-http 方式部署成一个 HTTP 端点,供 Hermes Agent 等通过 url + X-API-Key 请求头接入(与团队现有自研 MCP server 一致)。

1)以 http 方式启动

.env 中设置:

MOKA_TRANSPORT=http
MOKA_HTTP_HOST=0.0.0.0
MOKA_HTTP_PORT=8000
MOKA_HTTP_PATH=/mcp
MOKA_MCP_API_KEY=请设置一个足够随机的访问密钥   # agent 接入凭证

然后启动:

moka-mcp-server
# 端点即为 http://<部署机IP>:8000/mcp

鉴权:开启 MOKA_MCP_API_KEY 后,所有请求必须携带请求头 X-API-Key: <该值>, 否则返回 401。留空表示不校验(仅限完全可信的内网)。生产环境务必设置, 并在外层用 HTTPS(反向代理)保护。

2)mcporter / Hermes 配置

在 mcporter 配置(如 ~/.mcporter/mcporter.json 或项目 config/mcporter.json)中添加, 结构与团队其他 server 完全一致:

{
  "mcpServers": {
    "moka-mcp": {
      "url": "https://<你的域名>/mcp",
      "headers": {
        "X-API-Key": "与 MOKA_MCP_API_KEY 相同的值"
      }
    }
  }
}

验证连通与工具列表:

mcporter list moka-mcp --schema
mcporter call moka-mcp.list_pipelines

注意区分两套凭证:MOKA_API_KEY 是「本服务 → Moka」的认证;MOKA_MCP_API_KEY 是「agent → 本服务」的认证(对应请求头 X-API-Key),两者互不相同。

通过 uvx 作为 stdio 包接入(推荐)

本服务可作为标准 stdio MCP 包,由 agent(Hermes/mcporter)以子进程方式拉起, 无需常驻 HTTP 服务。宿主机需有 Python / uv。

mcporter(stdio 形式)配置示例:

{
  "mcpServers": {
    "moka-mcp": {
      "command": "uvx",
      "args": ["--from", "git+ssh://git@github.com/mingyangsun-sketch/moka-mcpserver.git", "moka-mcp-server"],
      "env": {
        "MOKA_API_KEY": "组织级 Moka Key",
        "MOKA_ORG_ID": "Antalpha",
        "MOKA_ENV": "production",
        "MOKA_ACTING_EMAIL": "该 Slack 用户的可信邮箱(Hermes 校验后注入)"
      }
    }
  }
}

每个用户用各自的 env(角色 + 身份)拉起一个实例,即可实现按用户限权(见下)。

权限控制(面向企业内部用户)

由于 Moka 的 API Key 是组织级的(能读全量数据),按用户限权只能在本服务层实现。 身份模型为模型 A:Hermes 解析 Slack 用户 → 决定角色/部门 → 用对应 env 拉起该 用户的 MCP 实例。因此 stdio 下每个实例即一个调用者,角色由启动 env 决定。

角色

角色

对应人群

可用工具

数据范围

hr_admin

HR/招聘团队负责人

全部

全量

recruiter

招聘专员

候选人/职位/流程/Offer/人才库/组织(读)

全量

hiring_manager

用人经理/部门负责人

候选人/职位/流程/组织(无人才库)

仅本部门

interviewer

面试官

候选人状态/详情/阶段 + 职位/流程(无人才库/Offer)

仅自己参与面试的候选人

viewer

普通员工

职位/流程/组织(不含候选人 PII

全量(公开信息)

身份与角色的确定方式(两种)

① 按邮箱自动派生(推荐):Hermes 校验 Slack 用户后,注入其可信邮箱 MOKA_ACTING_EMAIL。本服务用组织 key 在 Moka 解析该用户(POST /users/list 按 email 精确查询),再按其 Moka roledepartment 自动定档:

Moka role

自动派生角色

≥30(HR / 管理员 / 超级管理员)

hr_admin(全量)

20 / 25(用人经理 / 高级用人经理)

hiring_manager(仅其所在部门)

10(面试官)

interviewer(仅自己参与面试的候选人)

5 / 0(前台 / 内推人)

viewer

邮箱在 Moka 找不到 → 退化为 viewer(最小权限)。无需手工维护角色表, 人员/部门在 Moka 一改,权限自动跟随。

② 静态配置(兜底,未配 MOKA_ACTING_EMAIL 时生效)

env

说明

MOKA_ROLE

上表角色之一;默认 hr_admin

MOKA_DEPARTMENTS

hiring_manager 必填:逗号分隔的本部门名

MOKA_SCOPE

数据范围覆盖:all / department

MOKA_ALLOWED_TOOLS

工具白名单覆盖(逗号分隔,* 表示全部)

控制分两层:

  • 工具级:角色决定可调用哪些 Tool(如 viewer 不能调用 search_candidates)。

  • 数据行级hiring_manager 的候选人/职位结果按其部门过滤到本部门。

⚠️ MOKA_ACTING_EMAIL 必须是 Hermes 校验过的可信邮箱,不能由 LLM 或用户 随意填入,否则可冒充他人。

权限模型边界(重要)

本服务的权限是我们自行设计的近似管控不等同于用户登录 Moka 后台时的真实数据权限:

  • Moka 只提供组织级访问控制:这把 API Key 是全权的、不区分调用者,Moka 不会按用户过滤。

  • Moka 也未开放「查询某用户有效数据权限范围」的接口(/users/*/userGroup/* 只给 角色、部门、分组成员等属性,不含数据可见范围规则)。

  • 因此本服务只能用用户的 Moka role + department 两个属性,套我们自己定的规则做近似—— 可能与该用户在 Moka 实际能看到的范围有出入(看多或看少)。

若业务/合规要求「AI 中看到的 = 本人在 Moka 能看到的」强一致,Moka 现有 API 无法支持 (用户级 OAuth 亦不可行,Moka 仅支持组织级)。当前定位为面向可信内部场景的近似管控

⚠️ 安全前提:组织级 Key 会随实例分发,因此按用户限权只有在可信后端 (Hermes)统一持有 Key、并为每个用户 spawn 对应角色 env 的实例时才真正有效; 终端用户不能自行查看/修改 env,否则可拿全量 Key 绕过限制。

设计要点

  • 认证:Basic Auth(Authorization: Basic base64(api_key + ":")),无需处理 token 刷新。

  • 错误处理:统一映射 401/403/404/429/500 为友好提示;特别地,按 stage 查询且该阶段无候选人时 Moka 返回 500,本服务会将其作为「空结果」处理。

  • 分页:基于 next 游标自动翻页,受 MOKA_MAX_ITEMS 上限保护。

  • 脱敏:默认对手机号、身份证号掩码(138****1234 / 4103**********2910)。

  • 重试:429 与网络错误做有限次指数退避重试。

项目结构

src/moka_mcp/
├── server.py          # FastMCP 入口,注册全部 Tool
├── config.py          # 配置(pydantic-settings)
├── client.py          # Moka HTTP 客户端(Basic Auth / 错误 / 重试)
├── errors.py          # 统一异常与状态码映射
├── tools/             # 各模块 Tool
│   ├── candidates.py
│   ├── jobs.py
│   ├── pipelines.py
│   ├── departments.py
│   ├── offers.py
│   └── talent_pools.py
└── utils/
    ├── pagination.py  # next 游标自动翻页
    └── sanitize.py    # 敏感字段脱敏

待办(第二阶段)

写入类能力(推进阶段、归档、创建职位、人才库导入、组织/人事同步等)暂未实现,详见需求文档第 3.3 节。

Available Tools

13 tools
get_candidate_applicationsA

查询某候选人的所有申请记录及状态(一人可投递多个职位)。

对应 Moka 接口:POST /getApplicationStates(candidate/v1,body 传 candidateId)

参数:

  • candidate_id:候选人 ID(注意区别于 applicationId)。

返回每条申请的 applicationId、status(in_progress/rejected 等)、 stageName、createdAt。

ParametersJSON Schema
NameRequiredDescriptionDefault
candidate_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the burden. It discloses the tool returns a list of applications with specific fields, and warns that candidate_id differs from applicationId. However, it does not explicitly state that the operation is read-only, mention permissions, or report potential side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured into clear sections: purpose, API reference, parameter, and return fields. It is slightly verbose with the API endpoint reference, but overall front-loaded and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists, the description need not detail return values, but it does so anyway. It covers purpose, parameter, return fields, and API mapping. Missing error handling or permissions, but adequate for a simple tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description adds significant value. It explains the parameter candidate_id meaning (candidate ID, not applicationId) and how to pass it (in body). This compensates fully for the lack of schema documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool queries all application records and statuses for a candidate, emphasizing that one person can apply for multiple positions. This distinguishes it from sibling tools like get_candidate_detail which returns a single candidate's info.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage by stating 'one person can apply for multiple positions' and provides the corresponding API endpoint, but it does not explicitly state when to use this tool over siblings or provide exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_candidate_detailA

获取单个候选人的完整信息。

对应 Moka 接口:GET /data/ehrApplications?applicationId={id}(v1)

参数:

  • application_id:候选人申请 ID;支持逗号分隔的多个 ID(如 "81,82,83")。

返回包含基本信息、教育/工作经历、自定义字段、阶段、职位、Offer、 面试官、内推人、附件等。注意附件与头像 URL 有效期仅 1 小时。

ParametersJSON Schema
NameRequiredDescriptionDefault
application_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It mentions the API method (GET) implying read-only, notes return content structure, and warns that attachment/avatar URLs expire in 1 hour. This provides useful behavioral context, though explicit safety hints are missing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is concise with a clear first sentence stating purpose, followed by API reference, parameter description, return summary, and a key behavioral note. No redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (single parameter, output schema exists), the description covers the essential aspects: purpose, parameter format, return contents, and URL expiration. Missing explicit permission or error information, but overall sufficient for a simple retrieval tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 0% description coverage, so the description fully compensates. It explains application_id as '候选人申请 ID' (candidate application ID) and importantly notes support for comma-separated multiple IDs with an example, adding significant meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states '获取单个候选人的完整信息' (get complete info of a single candidate), which is clear. However, it later allows comma-separated multiple IDs, creating slight ambiguity about single vs. multiple. It does not explicitly differentiate from siblings like search_candidates or get_candidate_applications.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. It does not mention siblings or provide when-not-to-use conditions. The only context is the API endpoint, which is technical but not decision-guiding.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_candidate_stageA

查询候选人当前所处的招聘阶段。

实现说明:Moka v1 没有独立的单申请阶段查询接口,但候选人详情里自带 stageName,故本工具复用 GET /data/ehrApplications?applicationId={id}。

参数:

  • application_id:候选人申请 ID。

ParametersJSON Schema
NameRequiredDescriptionDefault
application_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description carries the transparency burden. It explains the internal reuse of another endpoint and clarifies the data source (stageName from candidate detail). It implies read-only behavior but does not explicitly state idempotence. The implementation insight is helpful.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two sentences and a parameter bullet. It front-loads the purpose but includes implementation details that, while useful, extend beyond the core purpose. Still efficient overall.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has an output schema, the description need not detail return values. It covers the parameter, implementation rationale, and data source. It is complete enough for an agent to use correctly, though lacks error handling or edge-case context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the description explicitly documents the parameter: 'application_id:候选人申请 ID。'. This adds meaning beyond the schema's type-only definition, compensating for the lack of schema description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: '查询候选人当前所处的招聘阶段' (query the candidate's current recruitment stage). It distinguishes from siblings like list_stages (lists all stages) and get_candidate_applications (lists applications) by specifying it returns the stage for a specific application.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for querying a candidate's stage but does not provide explicit when-to-use or when-not-to-use guidance. It mentions the implementation limitation but lacks direct comparison to siblings or conditions for alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_job_custom_fieldsA

获取某职位的自定义字段。

实现说明:Moka 没有稳定的独立「职位自定义字段定义」读取接口, 但职位详情里自带 customFields,故本工具从 GET /jobs/{orgId}/{jobId} 提取。

参数:

  • job_id:职位 ID。

  • org_id:组织标识;留空则使用 .env 中的 MOKA_ORG_ID。

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes
org_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description carries full burden. It discloses the underlying API call (GET /jobs) which implies a read operation and provides context about Moka's API limitations. It does not cover rate limits or authentication, but the behavioral information is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with a purpose sentence, an implementation note, and parameter list. It is front-loaded and every part adds value, though it could be slightly more concise. No fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema, the description adequately covers what the tool does, its parameters, and the unconventional implementation. It is complete for an agent to understand and invoke the tool, though it omits potential limitations or return format hints.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so description must compensate. It explains job_id (job ID) and org_id (organization identifier, defaults to env variable if empty), adding meaning beyond the schema. It also explains the internal mechanism (extraction from GET /jobs).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states '获取某职位的自定义字段' (get custom fields of a job), with a specific verb and resource. It distinguishes from sibling tools like get_job_detail (full job detail) and get_offer_custom_fields (different resource).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the implementation reason (no stable independent API) and that it extracts from GET /jobs, implying when to use this tool. However, it does not explicitly state when not to use it or provide specific alternatives, though siblings are listed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_job_detailA

获取单个职位详情(含自定义字段、招聘流程信息)。

对应 Moka 接口:GET /jobs/{orgId}/{jobId}(v1)

参数:

  • job_id:职位 ID。

  • org_id:组织标识;留空则使用 .env 中的 MOKA_ORG_ID。

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes
org_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It mentions it fetches details but does not disclose whether it is read-only, authorization requirements, rate limits, or error behavior (e.g., if job not found). This is insufficient for a complete behavioral understanding.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, consisting of a main sentence and a bulleted parameter list. It is front-loaded with the purpose and includes relevant API details. However, it could be slightly more structured (e.g., separating usage notes).

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description does not need to explain return values. It covers parameters well but lacks usage guidelines and behavioral transparency. For a simple retrieval tool, this is adequate but has clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description compensates by explaining the purpose of each parameter: job_id is the job ID, org_id is the org identifier with a default from .env. This adds meaningful context beyond the schema's type definitions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states it retrieves a single job's details including custom fields and recruitment process info, which clearly distinguishes it from siblings like list_jobs or search_candidates. The API endpoint is also provided for reference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not provide explicit guidance on when to use this tool versus alternatives. It implies usage for getting full details of a specific job, but lacks exclusions or context for choosing it over other tools like get_job_custom_fields.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_offer_custom_fieldsA

获取 Offer 自定义字段的定义(社招 / 校招)。

对应 Moka 接口:GET /offers/custom_fields(v1)

说明:实测返回结构为 {"social": [...], "campus": [...]},分别对应 社招和校招的字段定义(不是通用的 data 字段)。

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description fully carries behavioral disclosure. Reveals API endpoint, crucial return structure (social/campus keys, not generic data), implying read-only nature.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

3 clear sentences, front-loaded with purpose and API reference, no wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Comprehensive given 0 params and output schema existing: covers purpose, API, and exact response format.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage 100% (0 parameters), baseline 3. Description does not need to add param info but adds value via return structure explanation, though not about parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clear verb 'get' and specific resource 'offer custom fields', distinct from siblings which deal with candidates, jobs, departments, etc. Includes context for social/campus recruitment.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use or when-not-to-use, but the tool is unique so usage is implied. Lacks guidance on prerequisites or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_departmentsA

查询部门列表(树形组织架构)。

对应 Moka 接口:GET /departments(v1)

说明:实测返回结构为 {"departments": [...]}(不是通用的 data 字段)。

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses one important behavioral trait: the response uses a non-standard structure ('{"departments": [...]}' instead of the typical 'data' field). However, with no annotations, it does not explicitly state read-only nature, authentication requirements, or potential side effects. This partial disclosure provides some transparency but leaves gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is composed of three concise sentences, each serving a clear purpose: stating the function, providing the API reference, and noting the return structure caveat. It is front-loaded with the primary purpose and contains no redundant or extraneous information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (no parameters) and the existence of an output schema, the description adds valuable context about the non-standard return format. It could further explain the tree hierarchy or pagination, but for a basic list tool, it covers the essential points. The output schema presumably handles remaining details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters, so the description correctly has no parameter documentation. Per the guidelines, 0 parameters yields a baseline of 4. The description does not need to add anything beyond what the empty schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states '查询部门列表(树形组织架构)' which translates to 'query department list (tree organizational structure)'. This clearly identifies the tool's purpose of listing departments in a hierarchical tree format. The inclusion of the specific API endpoint (GET /departments v1) further solidifies its function, leaving no ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

While the description accurately describes what the tool does, it lacks explicit guidance on when or when not to use it. There are no sibling department tools, so alternatives are absent, but no prerequisites or context for usage are provided. The agent must infer usage from the tool's name and purpose, which is adequate but not proactive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_jobsA

查询职位列表。

对应 Moka 接口:GET /jobs/{orgId}(v1)

参数:

  • mode:招聘模式,必填。social=社招 / campus=校招。

  • org_id:组织标识;留空则使用 .env 中的 MOKA_ORG_ID。

  • limit:返回条数上限。

说明:已关闭但未勾选「取消在官网显示」的职位仍会返回;已删除职位不返回。

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYes
org_idNo
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses important behavioral details: closed jobs not unchecked 'cancel display on website' are still returned, and deleted jobs are not. This adds context beyond the schema. No annotations provided, so description carries full burden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Concise and well-structured with bullet points for parameters and behavioral notes. It includes the API endpoint for reference without unnecessary fluff. Could be slightly more streamlined.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers all necessary context: required parameter, optional parameters with defaults, and edge case behaviors. With an output schema existing, it appropriately omits return value details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Despite 0% schema description coverage, the description explains each parameter clearly: mode is required with enum values, org_id defaults to environment variable, limit sets max results. This adds significant value over the schema definition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states '查询职位列表' (query job list) and specifies the Moka API endpoint. It distinguishes from sibling tools like get_job_detail and list_departments by its focus on listing jobs with specific filters.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides parameter details and behaviors for edge cases, but lacks explicit guidance on when to use this tool versus alternatives like search_candidates or get_job_detail. The description assumes the user knows to use it for listing jobs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_pipelinesA

获取招聘流程(Pipeline)列表。

对应 Moka 接口:GET /pipelines/getPipelinesList(v2)

返回每个流程的 id、name、hireMode、entryConditions 等。

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided. The description implies a read-only operation via GET, but does not explicitly confirm safety, permissions, or other behavioral traits. Adequate but not thorough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Very concise, three sentences: purpose, API reference, and return fields. No unnecessary words, front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and presence of an output schema, the description is complete. It lists key return fields and API version, sufficient for a simple list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters in the input schema (0 params), so the description does not need to add parameter details. Baseline 4 applies as per rules.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists pipelines and mentions the fields returned. It does not explicitly distinguish from sibling tools like list_stages, but the resource is distinct enough.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use or not use this tool versus alternatives. The description simply states what it does without contextual advice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_stagesB

获取招聘阶段(Stage)信息列表。

对应 Moka 接口:GET /stage/getStagesList(v2)

参数:

  • pipeline_id:可选,按指定流程过滤阶段。

返回每个阶段的 id、name、type。

ParametersJSON Schema
NameRequiredDescriptionDefault
pipeline_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry the full burden. It does not disclose any behavioral traits beyond returning id, name, type. There is no mention of pagination, sorting, ordering, or potential performance implications. For a list operation, this is a significant gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: four lines with no extraneous information. It front-loads the purpose, then lists parameters and return fields. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity of the tool (list stages with one optional filter) and the presence of an output schema, the description is minimally adequate. However, it lacks details on pagination, ordering, or whether all stages are returned. For a complete picture, an agent might need more.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, so the description must compensate. It clearly explains pipeline_id as '可选,按指定流程过滤阶段' (optional, filter by specified pipeline), adding meaning beyond the schema's type and default. The return fields are also listed, though that is not parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists stage information, using the verb '获取' (get/list) and resource '招聘阶段' (recruitment stages). It specifies the API endpoint and return fields. However, it does not explicitly differentiate from sibling tools like get_candidate_stage or list_pipelines, though the context makes it fairly clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions an optional pipeline_id filter but provides no guidance on when to use this tool versus alternatives like get_candidate_stage (which gets a candidate's stage) or list_pipelines. There is no explicit 'when to use' or 'when not to use' advice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_talent_pool_candidatesA

查询指定人才库下的候选人(按归档时间范围)。

对应 Moka 接口:GET /talentPool/candidates(v1)

参数(均必填):

  • talent_pool_ids:人才库 ID 列表,如 [666, 888]。

  • archived_at_start:归档开始时间,如 "2019-06-01"。

  • archived_at_end:归档结束时间,如 "2019-11-01"。

ParametersJSON Schema
NameRequiredDescriptionDefault
talent_pool_idsYes
archived_at_startYes
archived_at_endYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description does not disclose any behavioral traits beyond the basic query operation. It lacks information on pagination, permissions, rate limits, or side effects, which is needed since annotations are absent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, with a clear purpose statement, an API endpoint reference, and a structured parameter list. Every sentence adds value, and the most important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the parameter count and presence of an output schema, the description covers the core functionality and parameter details. However, it lacks context on pagination or result structure, though the output schema exists to supplement. Overall, it is fairly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description bears full responsibility. It adds significant value by providing examples and clarifying that all parameters are required, which the schema (with only titles) does not convey. Each parameter is explained with format and usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool queries candidates under a specified talent pool with archive time range filtering. It uses specific verbs and resources, distinguishing it from siblings like list_talent_pools (lists pools, not candidates) and search_candidates (general search).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage by listing required parameters and giving examples, but does not explicitly state when to use this tool versus alternatives like search_candidates or list_talent_pools. No exclusions or context are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_talent_poolsA

查询所有人才库。

对应 Moka 接口:GET /talentPool/list(v1)

返回每个人才库的 id、name、hireMode、isPrivate 等(实测直接返回数组)。

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided. The description only mentions it returns an array of talent pools with specific fields, but does not disclose any behavioral traits such as read-only nature, authentication needs, rate limits, or potential side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the purpose, and contains no extraneous content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and an existing output schema, the description adequately covers the tool's purpose and basic return structure. No further details are necessary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters, so schema description coverage is 100%. The description adds no parameter info, which is acceptable as none exist.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists all talent pools, provides the Moka API endpoint, and lists returned fields (id, name, hireMode, isPrivate). It is specific and distinct from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. No prerequisites, exclusions, or context are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_candidatesA

按条件搜索候选人(eHR 申请列表)。

对应 Moka 接口:GET /data/ehrApplications(v1)

参数说明:

  • stage:阶段筛选,offer=Offer 阶段 / pending_checkin=待入职 / all=两者。

  • email / phone:按邮箱或手机号精确筛选。

  • moved_at_start_time / moved_at_end_time:进入当前阶段的时间范围。

  • order:DESC(默认,从新到旧)/ ASC。

  • limit:返回条数上限(Moka 单页最大 20,这里支持跨页累计上限)。

注意:stage 与 applicationId 至少需要一个定位条件;按 stage 查询且该 阶段当前没有候选人时,Moka 会返回 500,本工具会将其作为「空结果」处理。

ParametersJSON Schema
NameRequiredDescriptionDefault
stageNo
emailNo
phoneNo
moved_at_start_timeNo
moved_at_end_timeNo
orderNoDESC
limitNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full behavioral disclosure. It reveals how the tool handles Moka's 500 error by returning an empty result, supports cumulative pagination via limit, and requires a positioning condition. This provides useful context beyond a simple read operation, though authentication and rate limits are not mentioned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with a clear heading, bullet points for parameters, and a note section. It front-loads the core purpose. The reference to the Moka API endpoint adds a bit of redundancy, but overall it is efficient and each part adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations and 0% schema coverage, the description is thorough: it explains all seven parameters, error handling, pagination, and a usage condition. Since an output schema exists, return values need not be described. It could add more about typical scenarios or best practices, but it is sufficiently complete for an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description compensates well by explaining each parameter's meaning (e.g., stage enum values, exact search for email/phone, time range, order, limit with pagination). It also notes the need for at least one condition (stage or applicationId). However, applicationId is not actually a parameter in the schema, which weakens the explanation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it searches candidates by criteria and references the Moka API endpoint. It lists specific parameters, making the purpose evident. However, it does not explicitly differentiate from sibling tools like get_candidate_applications or get_candidate_detail, though the distinction is implicit by its search nature.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides parameter notes and an important usage condition (need at least one of stage or applicationId), but applicationId is not present in the input schema, causing confusion. No explicit guidance on when to use this tool over alternatives or when not to use it is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 13 tool updatesv0.1.0
    • First observedget_candidate_applications
    • First observedget_candidate_detail
    • First observedget_candidate_stage
    • First observedget_job_custom_fields
    • First observedget_job_detail
    • First observedget_offer_custom_fields
    • First observedlist_departments
    • First observedlist_jobs
    • First observedlist_pipelines
    • First observedlist_stages
    • First observedlist_talent_pool_candidates
    • First observedlist_talent_pools
    • First observedsearch_candidates

TDQS

A3.9/5.0

Scored across 13 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: candidate management (applications, detail, stage), job management (detail, custom fields), listing (departments, jobs, pipelines, stages, talent pools), and search. No overlapping functionality.

Naming Consistency5/5

All tools follow a consistent verb_noun pattern in snake_case (e.g., get_candidate_detail, list_jobs, search_candidates). Verbs are uniformly 'get', 'list', or 'search', making the set predictable.

Tool Count5/5

With 13 tools, the server covers the main entities of an HR platform (candidates, jobs, offers, departments, pipelines, stages, talent pools) without being excessive. The count feels well-scoped.

Completeness3/5

The server provides comprehensive read operations for all major entities but lacks any create, update, or delete tools. This means agents cannot perform full lifecycle management, leaving notable gaps for tasks requiring modifications.

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    B
    maintenance
    Enables Claude, Cursor, and other MCP clients to query PeopleForce HRIS data (employees, time-off, recruitment) via 27 read-only tools.
    28
    3
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants read-only access to Sprinklr data via MCP, allowing querying reports, searching cases, and calling Sprinklr API endpoints.
    7 npm
    ISC
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables read-only access to company data across PostgreSQL, MongoDB Atlas, and flat files through MCP tools, allowing AI assistants to query and retrieve information via natural language.
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to recommend jobs, parse candidate profiles, compute semantic skill match scores, and filter opportunities by location through standardized MCP tools.
    -