Tick について
Tick は、正確な時刻情報を必要とする AI アシスタント向けの MCP 時刻サーバーです。ローカル版、リモート版、Claude Code hook を備え、ツール説明で時刻確認を促し、since で経過時間を算出します。
主な機能
- 01現在の日付、時刻、曜日の取得
- 02IANA タイムゾーン対応
- 03タイムスタンプからの経過時間計算
- 04stdio と HTTP トランスポート
- 05hook による Claude Code メッセージへの時刻付与
活用シーン
- 01会話中の現在時刻の確認
- 02メッセージからの経過時間の確認
- 03Claude Code のユーザーメッセージへの送信時刻付与
MCP 対応
MCP クライアント向けに、時刻と経過時間を調べる `now` と `since` ツールを提供します。ローカルの stdio とリモートの Streamable HTTP に対応し、Claude Code hook も含みます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://tick-mcp-production.up.railway.app/mcpclaude mcp add --transport http tick https://tick-mcp-production.up.railway.app/mcp{"mcpServers":{"tick":{"type":"http","url":"https://tick-mcp-production.up.railway.app/mcp"}}}Cursor で開く{"servers":{"tick":{"type":"http","url":"https://tick-mcp-production.up.railway.app/mcp"}}}VS Code で開く{"mcpServers":{"tick":{"type":"http","url":"https://tick-mcp-production.up.railway.app/mcp"}}}{"mcpServers":{"tick":{"serverUrl":"https://tick-mcp-production.up.railway.app/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
tick
AI が時間について正確でいられるようにする MCP 時刻サーバーです。
AI アシスタントには時計がありません。文脈から時間を推測するため、長時間のチャットではうまくいかず、10 分前のメッセージを「昨日」と呼んだり、午後 2 時に「おやすみなさい」と言ったり、3 日も古い日付を基に「明日」の予定を立てたりします。Claude と複数日にわたる作業セッションを行う方なら、見覚えがあるはずです。
tick がそれを解決します。依存関係はゼロで、用途ごとにファイルが 1 つずつあります。
セットアップが技術的に見えますか?このページを Claude のチャットに貼り付けて、手順を案内するよう頼んでください。Claude Code ならインストール全体を実行できます。
| トランスポート | 対象 | ファイル | |
|---|---|---|---|
| local | stdio | Claude Desktop、Claude Code、その他のローカル MCP クライアント | local/server.py |
| remote | Streamable HTTP | claude.ai(ウェブ/モバイル)のカスタムコネクター、セルフホスティング | remote/server.py |
| hook | Claude Code フック | すべてのユーザーメッセージに実際の送信時刻を付与 | hooks/ |
アシスタントにできること
now— 曜日を含む、実際の現在日時(任意の IANA タイムゾーン)。since— タイムスタンプから現在までの正確な経過時間(「3h 42m ago」)——「昨日」と誤認しないためのツールです。
ツールの説明は、相対的な時間表現を使う前にモデルが時間を確認するよう 促す 内容になっています。これが目的です。AI が 見てもよい 時計ではなく、見るように 指示されている 時計です。
この仕組みが必要かどうか、Claude 自身に聞いた回答です (「私には内部時計がありません。時間の経過を感じることはできません。」)。
実際の動作では、モデルは回答する前に時計を確認し、最初の呼び出しに失敗した場合はタイムスタンプを捏造せずに再試行します。
「でも Claude はすでに日付を知っています」
分かるのは、セッションが 始まった 日付です。それだけです。何時間、何日も続くチャットでは、その日付は古くなります。また、セッション中の時刻や曜日は分からず、最後のメッセージが 10 分前に届いたのか、10 時間前に届いたのかを判断する方法もありません。モデルはそのすべてを推測で補います。tick はその推測をツール呼び出しに置き換えます。
インストール:ローカル(推奨)
Python 3.9 以降が必要です(macOS にはインストール済みです)。local/server.py を任意の場所(例:~/mcp/tick/server.py)に配置します。
Claude Desktop
claude_desktop_config.json に追加します
(macOS の場合:~/Library/Application Support/Claude/claude_desktop_config.json)。
{
"mcpServers": {
"tick": {
"command": "python3",
"args": ["/Users/YOU/mcp/tick/server.py"]
}
}
}
Claude Desktop を再起動します。これで完了です。
Claude Code
claude mcp add tick -- python3 /Users/YOU/mcp/tick/server.py
(すべてのプロジェクトで使うには --scope user を指定します)
その他の MCP クライアント
標準的な stdio MCP サーバーです。クライアントから
python3 /path/to/server.py を指定してください。
インストール:リモート(claude.ai のウェブ/モバイル向け)
claude.ai はローカルサーバーを実行できません。URL を使ってリモート MCP サーバーに接続します。
公開インスタンスを使う場合: claude.ai で 設定 → コネクター → カスタムコネクターを追加 を開き、次を貼り付けます。
https://tick-mcp-production.up.railway.app/mcp
コネクターの説明欄に次を貼り付けます。これはモデルのコンテキストに入り、ルールの徹底にも役立ちます。
Instructions for Claude: get the REAL current date and time from this server.
NEVER write a clock time in a reply that did not come from this tool's output
in THIS turn — a timestamp without a fresh call is a hallucination. Call `now`
before any relative time words (yesterday, tomorrow, tonight, this week) and
before any greeting tied to a time of day. Always pass the user's IANA timezone.
これはステートレスな時計です。ツール呼び出し(タイムゾーン名、タイムスタンプ)は認識しますが、会話の内容は認識しません。
または、自分のサーバーを数分でデプロイできます。 remote/ には、どこでも(Railway、Render、Fly.io、VPS)実行できる Dockerfile が含まれています。
# Railway
railway init && railway up
次に claude.ai で 設定 → コネクター → カスタムコネクターを追加 を開き、
https://your-app.up.railway.app/mcp を貼り付けます。
Claude Code でも利用できます。
claude mcp add --transport http tick https://your-app.up.railway.app/mcp
セルフホスト用環境変数: TICK_DEFAULT_TZ(デフォルトは UTC)、TICK_RATE_LIMIT(POST パスにおける IP ごとのウィンドウあたりのリクエスト数。デフォルトは 120、0 に設定すると無効になります)、TICK_RATE_WINDOW(秒数。デフォルトは 60)。
タイムゾーンに関する注意: リモートサーバーはローカル時刻を認識しません。デフォルトは UTC です(TICK_DEFAULT_TZ 環境変数で変更できます)。また、ツールの説明では、モデルに常に IANA タイムゾーンを渡すよう指示しています。ローカル時刻を自動的に認識する時計が必要な場合は、ローカル版を実行してください。
Claude Code 向けボーナス:メッセージにタイムスタンプを付ける
どの MCP サーバーにも確認できないことがひとつあります。メッセージを送信した時刻です。プロトコルはメッセージのタイムスタンプをモデルに渡しません。Claude Code では、3 行の UserPromptSubmit フックを使って各メッセージに実際の送信時刻を付け、このギャップまで埋められます。hooks/ をご覧ください。
規律のルール(修正のもう半分)
サーバーだけでは不十分です。モデルに必ず使わせる必要があります。Claude のメモリ/ユーザー設定/CLAUDE.md に次の内容を追加してください。
時刻に何らかの形で言及する返答(日時、「昨日」「明日」「今夜」「今週」、および「おはようございます」のようなあいさつなど)をする前に、まず tick time server の
nowツールを呼び出してください(クライアントが登録した名前が異なる場合は、その名前を使ってください)。会話の文脈から現在時刻を推測してはいけません。過去の出来事がどれくらい最近のことかを述べる場合は、推測せずにsinceツールで確認してください。
サーバー+ルール=今日が何曜日かを誤って伝えるのをやめるアシスタントです。
制限(率直に)
このルールは遵守率を高めますが、遵守を保証するものではありません。モデルは呼び出しを省略して、もっともらしいタイムスタンプをでっち上げることがあります。直近の実際の呼び出しから計算を続けて(「21:39」→「21:42」→「21:47」と、すべて作り話です)、平気で返答します。偽のタイムスタンプは、ないよりも悪質です。実測値のように見えるからです。一度指摘すれば、残りのセッションでは正しく振る舞います。
実際の使用では、もうひとつのパターンも見つかりました。会話の内容が感情的に重いと、遵守率が下がります。ユーザーがその場で気にかけている話題に会話が移り、モデルがその内容に注意を向けると、時刻の確認がひそかに後回しにされます。そして、人間も時計を見失うようなまさにそのやり取りで、記憶を頼りにタイムスタンプを書いてしまいます。説明とルールによって発生頻度は下がりますが、注意が完全に別のことへ向いているやり取りでは防ぎきれません。
現時点で確実に強制できるのは、システムレベルでの仕組みだけです。Claude Code では、モデルの制御外でフックがメッセージにタイムスタンプを付けます。Claude Desktop と claude.ai には、そのような仕組みはありません。
セキュリティ
公開エンドポイントは、意図的に認証なしにしています。時計であり、秘密情報も状態も保持しないためです(呼び出し元の間で漏れる情報はありません)。一方で、可用性は保護します。リクエストボディは 256 KB、JSON-RPC バッチは 50 件までに制限され、ソケットにはタイムアウトを設定しています(スローロリス攻撃対策)。また、ベストエフォートの IP ごとのレート制限もあります。ツールの説明とサーバーのメタデータは静的な定数なので、サーバーを使って作成者が意図していない指示を注入することはできません。共有インスタンスを信頼したくない場合は、セルフホストしてください。ファイルひとつと Dockerfile だけで済みます(ベースイメージを固定し、root 以外のユーザーで実行し、ヘルスチェックを設定しています)。何か見つけましたか?Issue を作成してください。
参照用の time server を使えばいいのでは?
Anthropic の参照用 mcp-server-time は既にあり、問題なく使えます。tick との違いは目的にあります。コピーしてすぐ使える単一ファイル(pip install 不要)、最近の出来事を確認する since ツール、claude.ai web 向けのリモート版、そして確認を徹底させるために工夫されたツールの説明があり、さらにそれを定着させるメモリのルールもあります。単なる API ではなく、振る舞いを修正するものです。
先行事例
さまざまな立場から、この問題に取り組んできた方々がいます。功績を称えます。
mcp-server-time— Anthropic の参照サーバーです。現在時刻の取得とタイムゾーンの変換に対応しています。- Andy Brandt による
mcp-simple-timeserver—calculate_time_distanceツールや NTP 時刻まで備えた、これに最も近い先行例です。 - Ted Murray によるフックの解説記事 —
hooks/にあるものと同じUserPromptSubmitタイムスタンプ注入パターンに、独自にたどり着いています。
tick の貢献は、各要素をひとつのキットにまとめ、遵守の徹底を目指したことです。説明、ルール、フックが連携し、モデルが推測をやめるようにします。
これが重要な理由(研究)
これは単なる個人的な悩みではありません。「モデルが時刻を確認しない」という問題は、実際に測定されています。
- Your LLM Agents are Temporally Blind
(arXiv 2510.23853)— 時刻を利用できるモデルでも、推論の記録内でタイムスタンプを示す割合は4%未満です。ツールの使用判断と実際の経過時間の一致度は、ランダムをわずかに上回る程度です。「時刻を確認して」と簡単にプロンプトで指示しても、改善はわずかです。信頼できる解決策はファインチューニングでした。これが
tickの主張であり、同時に率直な限界でもあります。プロンプトレベルでの強制は有効ですが、効果は限定的です。 - Test of Time(arXiv 2406.09170)— モデルが日付を知っていても、期間の計算は最も苦手なカテゴリです(典型的な誤りは1日のずれです)。日付の計算を決定論的なツールに任せることで、関連研究では時間に関するQAの正答率が59%から93%に向上しました。まさに
sinceが行うことです。 - Date Fragments(arXiv 2505.16088)— トークナイザーは日付を2〜4個のトークンに分割します。これは、時計ツールでは解決できない時間に関する誤りのメカニズム上の根本原因です。
ライセンス
MITです。ご自由にお使いください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。