Skip to main content
Glama

Work Journal MCP 服务器

一个托管的 MCP 服务器,让团队中的任何成员都能通过 Claude 阅读他们的简化版 HR 工作日志——始终是自己的条目,以及在其现有工作日志权限允许的情况下,同事的条目。

只读。此处的任何工具都不能创建、更改或删除条目。

从任何 Claude 客户端连接

无论使用哪个客户端,流程都一样:通过 URL 添加服务器,然后在打开的浏览器窗口中登录。

Claude Desktop 或 claude.ai — 设置 → 连接器 → 添加自定义连接器 →

https://wj-mcp.dev.besimplified.net/mcp

Claude Code

claude mcp add work-journal --transport http https://wj-mcp.dev.besimplified.net/mcp

无论哪种方式,都会打开一个浏览器窗口。使用你的简化版 HR 电子邮件和密码登录。在开发环境中,你还需要输入你的工作区,例如 development-hr.dev.besimplified.net。

如果此设备是账户服务之前未见过的,你会通过电子邮件或短信收到验证码。输入一次;同一客户端不会再次要求你输入。

你的密码永远不会到达 Claude,此服务器也从不存储它。

改为在账户服务处登录

WJ_LOGIN_MODE=redirect 替换了上面的表单。/authorize 将浏览器发送到该环境的账户登录页面,成员在那里登录,然后账户服务将他们返回到 /identifier,并带有一个短期交接令牌,此服务器用该令牌交换会话。由此产生两件事:密码不会输入到此服务器渲染的页面中,并且成员同时登录了 BeSimplified Web 应用,因为会话是账户服务在其自身源上创建的。

默认情况下它是关闭的,因为它有表单模式所没有的先决条件:

  • 账户服务中的 app_registrations 记录,将本服务器的主机命名为已验证的 fqdn 或 workspace,适用于其成员使用它的每个组织。登录页面从提供给它的 referrer 中取出主机并查找;如果没有记录,它会回答 valid_workspace: false 并将浏览器返回到 HR 应用而不是这里。这是账户服务自身数据库中的一条记录——那里的代码没有变化。

  • WJ_PUBLIC_BASE_URL 为 https 且不带端口。 账户服务仅根据主机名将回调重建为 https://<host>/identifier,因此带端口或明文方案无法接收它。否则服务器拒绝启动,而不是提供可能开始但永远无法完成的登录。

  • 对账户会话存储的读取访问权限,WJ_REDIS_HOST 和 WJ_ACC_CACHE_PREFIX。交接令牌在那里命名一个键;没有它,就没有什么可用来交换令牌。

在两种模式下,回调主机都会根据允许列表进行检查。在这里更重要:一旦成员在账户服务处完成身份验证,无论谁指定了 redirect_uri,都会收到授权码,而 PKCE 无法抵御发起流程的攻击者。

Related MCP server: zulip-mcp

工具

work_journal_get_entries

包含某一天或最多 31 天范围内条目的完整任务详情。

参数

说明

date

单日,YYYY-MM-DD

start_date, end_date

包含范围,替代 date 使用

type

可选,见下面的别名表;省略则返回所有类型

member

可选,来自 work_journal_find_member 的另一成员 ID

include_tasks

可选,默认 true;false 仅返回状态,在单个请求中完成

询问:“显示我上周的 EOD 条目”

work_journal_get_day

某一天的完整内容:每个任务及其备注和附件、通知的收件人、预计完成时间和提交时间。

参数

说明

date

必填,YYYY-MM-DD

type

可选,缩小到一种条目类型

member

可选,另一成员的 ID

询问:“我在 8 月 4 日记录了什么?”

work_journal_get_summary

按类型和状态统计任意时间段内的数量,不提供每日详情。用于超过 31 天的任何查询。

参数

说明

start_date, end_date

包含范围

year

整个日历年,当未给出明确范围时使用

type

可选

member

可选,另一成员的 ID

询问:“我今年错过了多少份 EOW 报告?”

work_journal_find_member

通过姓名或电子邮件的一部分查找同事,并返回其成员 ID,用于上述工具的 member 参数。

参数

说明

query

姓名或电子邮件的一部分,至少两个字符

询问:“查找 Rahul 的成员 ID”

work_journal_get_team_report

每个成员一行,包含某时间段内已提交、待处理和已错过的计数。

参数

说明

start_date, end_date

必填,包含范围

type

可选,默认为 EOD

team

可选团队 ID,或字面量 unassigned

status

可选:submitted、pending 或 missed

member

可选,缩小到单个成员

limit, page

可选;默认 15 行,最大 50

询问:“上周谁错过了他们的 EOD?”

类型别名

你可以说

解析为

显示为

eod, daily, end of day

daily

EOD

eow, weekly, end of week

weekly

EOW

group eow, group weekly

group_weekly

Group EOW

eom, monthly, end of month

monthly

EOM

匹配忽略大小写,并将空格、连字符和下划线视为等效。

谁能查看谁的日志

此服务器不执行自己的权限。每个请求都携带你自己的简化版 HR 会话,Work Journal API 应用与 Web UI 中完全相同的权限:

  • 实例权限 — 你可以读取你公司的任何成员

  • 组权限 — 你可以读取你报告子树中的成员

  • 两者皆无 — 你只能读取自己的日志,任何尝试读取其他成员日志的请求都会被拒绝

阅读同事条目时需要注意两点:请求可能被直接拒绝,并且管理员视图会排除草稿、计划中和私密条目。因此,缺少条目并不能证明没有记录任何内容。

限制

  • work_journal_get_entries 拒绝超过 31 天的范围,并引导你使用 work_journal_get_summary

  • 每次工具调用最多并发运行 4 个请求,因此宽范围对 API 保持温和

  • 相对日期(如“上周”)由 Claude 在调用前解析;工具仅接受 YYYY-MM-DD

本地运行

npm install
cp .env.example .env      # then fill in the two secrets
WJ_ENV=dev \
WJ_PUBLIC_BASE_URL=http://localhost:8080 \
WJ_TOKEN_KEY=$(openssl rand -hex 32) \
WJ_FINGERPRINT_SECRET=$(openssl rand -hex 32) \
npm start

GET /healthz 应返回 {"status":"ok"}。在没有任何环境变量的情况下运行 node src/index.js 必须立即退出,并列出所有缺失的变量。

环境变量

变量

必需

用途

WJ_ENV

是

选择主机预设:dev 或 prod。没有默认值,因此空值不能静默地将生产环境指向开发主机

WJ_PUBLIC_BASE_URL

是

外部可达的源,发布在 OAuth 发现文档中

WJ_TOKEN_KEY

是

64 个十六进制字符;加密会话信封

WJ_FINGERPRINT_SECRET

是

至少 32 个字符;派生每个成员的设备指纹

WJ_API_BASE_URL

否

插件 API 主机,当与 WJ_ENV 的预设不同时

WJ_AUTH_BASE_URL

否

账户服务源,当与预设不同时

WJ_PORT

否,默认为 8080

监听端口

WJ_REQUEST_TIMEOUT_MS

否,默认为 15000

每个请求的超时时间

WJ_EXTRA_REDIRECT_HOSTS

否

额外的回调主机,逗号分隔,超出 claude.ai、anthropic.com 和回环地址

WJ_LOGIN_MODE

否,默认为 form

form 或 redirect;见下文

WJ_REDIS_HOST

仅当 WJ_LOGIN_MODE=redirect 时

账户会话存储

WJ_REDIS_PORT

否,默认为 6379

WJ_REDIS_TLS

否

true 通过 TLS 连接,并验证证书

WJ_REDIS_TLS_SERVERNAME

否

Redis 证书颁发给的主机名,当与拨号的主机不同时

WJ_REDIS_TLS_INSECURE

否

true 放弃证书验证;仅作为最后手段

WJ_ACC_CACHE_PREFIX

仅当 WJ_LOGIN_MODE=redirect 时

账户服务自身的 CACHE_PREFIX,它也作为 sso_prefix 返回

WJ_FINGERPRINT_SECRET 必须在每个任务中完全相同,并且不能随意轮换。 它派生每个成员的稳定设备指纹;更改它会使整个团队重新收到验证码挑战。

部署说明

  • /authorize 上的 Cookie 粘性仅是 WJ_LOGIN_MODE=form 模式的要求。在 redirect 模式下,两段流程之间不会在进程内存中保留任何内容——授权请求以加密的 redirect_page 令牌从账户服务返回——因此 /authorize 和 /identifier 都是无状态的,不需要粘性。

  • Cookie 粘性仅在 /authorize 上是必需的。OTP 提交必须到达发起登录的任务,因为进行中的登录会保存在该进程的内存中五分钟。/mcp 和 /token 是无状态的,绝不能设置粘性。

  • 两个密钥都应存放在 SSM Parameter Store 中,类型为 SecureString,从任务定义的 secrets 块中引用——绝不能作为环境变量字面量。在首次部署前,为每个环境各创建一次;平台中没有任何其他内容使用 /hr/work-journal-mcp/ 前缀,因此它们不会已存在:

    aws ssm put-parameter --type SecureString --name /hr/work-journal-mcp/<env>/token_key           --value "$(openssl rand -hex 32)"
    aws ssm put-parameter --type SecureString --name /hr/work-journal-mcp/<env>/fingerprint_secret  --value "$(openssl rand -hex 32)"

    ecsTaskExecutionRole 需要对两者具有 ssm:GetParameters 和 kms:Decrypt 权限,否则任务会在启动时以 ResourceInitializationError 失败,早于任何此代码运行。

  • 生产环境拒绝开发环境所需的 workspace 登录字段,因此登录页面在开发环境之外会隐藏该字段。

安全

  • 密码从不存储、从不记录日志,也从不以任何形式返回给浏览器。它们只存在于内存中,仅持续登录所需的几秒钟。

  • 会话状态以 AES-256-GCM 加密信封传输,只有此服务器能打开。Simplified HR JWT 永远不会到达 Claude 或模型。

  • 访问令牌、刷新令牌和授权码信封在密码学上绑定到各自的类型,因此一种不能被当作另一种使用。

  • 登录尝试按电子邮件地址进行速率限制。

  • 每次工具调用都会记录调用者、工具以及被读取日志的成员,因此跨成员读取是可审计的。令牌和条目内容从不记录日志。

测试

npm test

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Read-only MCP server that proxies deepHR's API to MCP clients, enabling interaction with deepHR modules such as payroll and employees through natural language.
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    A read-only MCP server that gives Claude safe access to Kubernetes clusters, enabling listing, describing, and monitoring resources without mutation risks and with secret masking.
    1
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    A local MCP server that reads logged hours from an internal time tracker, providing tools to list time entries, projects, and the active timer. It is read-only, enabling Claude Code to see time-tracking data without writing.
    -