Skip to main content
Glama

Work Journal MCP Server

チームのメンバーなら誰でも、Simplified HR の Work Journal を Claude 経由で読めるホスト型 MCP サーバーです。自分のエントリは常に、同僚のエントリは既存の Work Journal 権限で許可されている範囲で読めます。

読み取り専用です。ここにあるツールでエントリを作成・変更・削除することはできません。

接続方法(任意の 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

どちらの場合もブラウザウィンドウが開きます。Simplified HR のメールアドレスとパスワードでサインインします。開発環境ではワークスペースも入力します(例: development-hr.dev.besimplified.net)。

アカウントサービスが初めて見るデバイスの場合、メールまたは SMS で確認コードが送信されます。一度入力すれば、同じクライアントから再度求められることはありません。

パスワードが 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

1 日分を完全に取得します。すべてのタスク(メモと添付ファイル付き)、通知先、ETA、提出時刻を含みます。

パラメータ

備考

date

必須、YYYY-MM-DD

type

任意。1 つのエントリタイプに絞る

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

名前またはメールの一部。少なくとも 2 文字

質問例: 「Rahul のメンバー ID を探して」

work_journal_get_team_report

期間について、メンバーごとに提出済み・保留中・未提出の件数を 1 行で返します。

パラメータ

備考

start_date, end_date

必須、包括範囲

type

任意。デフォルトは EOD

team

任意のチーム ID、またはリテラル unassigned

status

任意: submitted、pending、または missed

member

任意。1 人のメンバーに絞る

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

マッチングは大文字小文字を無視し、スペース、ハイフン、アンダースコアを同等に扱います。

誰が誰のジャーナルを読めるか

このサーバーは独自の権限を強制しません。すべてのリクエストはあなた自身の Simplified HR セッションを運び、Work Journal API は Web UI とまったく同じ権限を適用します。

  • インスタンス権限 — 自社の任意のメンバーを読めます

  • グループ権限 — 自分のレポートサブツリー内のメンバーを読めます

  • どちらもない — 自分のジャーナルだけを読め、他のメンバーへの試みは拒否されます

同僚のエントリを読む際に知っておくべきことが 2 つあります。リクエストが完全に拒否される可能性があること、管理者ビューでは下書き・予定・非公開エントリが除外されることです。したがって、エントリがないことは何も記録されていないことを証明しません。

制限

  • 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 桁の 16 進文字。セッションエンベロープを暗号化します

WJ_FINGERPRINT_SECRET

はい

32 文字以上。各メンバーのデバイスフィンガープリントを導出します

WJ_API_BASE_URL

いいえ

WJ_ENV のプリセットと異なる場合のプラグイン API ホスト

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 モードでは、2つのレッグ間でプロセスメモリに保持されるものはありません。認可リクエストは暗号化された redirect_page トークンとしてアカウントサービスから戻ってくるため、/authorize と /identifier はどちらもステートレスで、スティッキネスは不要です。

  • Cookie スティッキネスは /authorize でのみ必要です。OTP 送信はログインを開始したタスクに到達する必要があります。進行中のログインはそのプロセスのメモリに5分間保持されるためです。/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 で起動時に失敗します。

  • 本番環境は dev で必要な workspace ログインフィールドを拒否するため、ログインページは dev 以外ではそれを非表示にします。

セキュリティ

  • パスワードは決して保存されず、ログにも記録されず、いかなる形式でもブラウザに返されることはありません。パスワードはログインに要する数秒間のみメモリ内に存在します。

  • セッション状態は、このサーバーのみが開封できる 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.
    -