Work Journal MCP Server
Work Journal MCP 服务器
一个托管的 MCP 服务器,让团队中的任何成员都能通过 Claude 阅读他们的简化版 HR 工作日志——始终是自己的条目,以及在其现有工作日志权限允许的情况下,同事的条目。
只读。此处的任何工具都不能创建、更改或删除条目。
从任何 Claude 客户端连接
无论使用哪个客户端,流程都一样:通过 URL 添加服务器,然后在打开的浏览器窗口中登录。
Claude Desktop 或 claude.ai — 设置 → 连接器 → 添加自定义连接器 →
https://wj-mcp.dev.besimplified.net/mcpClaude 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 天范围内条目的完整任务详情。
参数 | 说明 |
| 单日, |
| 包含范围,替代 |
| 可选,见下面的别名表;省略则返回所有类型 |
| 可选,来自 |
| 可选,默认 |
询问:“显示我上周的 EOD 条目”
work_journal_get_day
某一天的完整内容:每个任务及其备注和附件、通知的收件人、预计完成时间和提交时间。
参数 | 说明 |
| 必填, |
| 可选,缩小到一种条目类型 |
| 可选,另一成员的 ID |
询问:“我在 8 月 4 日记录了什么?”
work_journal_get_summary
按类型和状态统计任意时间段内的数量,不提供每日详情。用于超过 31 天的任何查询。
参数 | 说明 |
| 包含范围 |
| 整个日历年,当未给出明确范围时使用 |
| 可选 |
| 可选,另一成员的 ID |
询问:“我今年错过了多少份 EOW 报告?”
work_journal_find_member
通过姓名或电子邮件的一部分查找同事,并返回其成员 ID,用于上述工具的 member 参数。
参数 | 说明 |
| 姓名或电子邮件的一部分,至少两个字符 |
询问:“查找 Rahul 的成员 ID”
work_journal_get_team_report
每个成员一行,包含某时间段内已提交、待处理和已错过的计数。
参数 | 说明 |
| 必填,包含范围 |
| 可选,默认为 EOD |
| 可选团队 ID,或字面量 |
| 可选: |
| 可选,缩小到单个成员 |
| 可选;默认 15 行,最大 50 |
询问:“上周谁错过了他们的 EOD?”
类型别名
你可以说 | 解析为 | 显示为 |
|
|
|
|
|
|
|
|
|
|
|
|
匹配忽略大小写,并将空格、连字符和下划线视为等效。
谁能查看谁的日志
此服务器不执行自己的权限。每个请求都携带你自己的简化版 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 startGET /healthz 应返回 {"status":"ok"}。在没有任何环境变量的情况下运行 node src/index.js 必须立即退出,并列出所有缺失的变量。
环境变量
变量 | 必需 | 用途 |
| 是 | 选择主机预设: |
| 是 | 外部可达的源,发布在 OAuth 发现文档中 |
| 是 | 64 个十六进制字符;加密会话信封 |
| 是 | 至少 32 个字符;派生每个成员的设备指纹 |
| 否 | 插件 API 主机,当与 |
| 否 | 账户服务源,当与预设不同时 |
| 否,默认为 | 监听端口 |
| 否,默认为 | 每个请求的超时时间 |
| 否 | 额外的回调主机,逗号分隔,超出 |
| 否,默认为 |
|
| 仅当 | 账户会话存储 |
| 否,默认为 | |
| 否 |
|
| 否 | Redis 证书颁发给的主机名,当与拨号的主机不同时 |
| 否 |
|
| 仅当 | 账户服务自身的 |
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 testThis server cannot be deployed
Maintenance
Related MCP Connectors
- mcp-serverOAuthio.klokin
MCP server exposing klokin time-tracking operations (employees, time entries, stores) to AI clients.
Read-only MCP server for ClassQuill, a tutoring-business-management platform.
Read-only MCP server for interior design studios: projects, overviews, weekly activity. No writes.
The HubSpot MCP Server acts as a bridge that enables AI assistants and Large Language Models to securely interact with HubSpot CRM data through natural conversation, without requiring users to understand complex API structures. It provides read-only access to standard CRM objects (contacts, companies, deals, tickets, products, invoices, and more) and their associations, secured via OAuth 2.0, allowing AI agents to perform tasks like summarizing deals, fetching company updates, and looking up record changes.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceRead-only MCP server that proxies deepHR's API to MCP clients, enabling interaction with deepHR modules such as payroll and employees through natural language.-
- AlicenseAqualityDmaintenanceA read-only MCP server that allows Claude Code to securely access Zulip chat messages, streams, topics, and user information without modification capabilities.9MIT
- AlicenseNot gradedqualityAmaintenanceA 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.1MIT
- FlicenseNot gradedqualityCmaintenanceA 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.-