一个赋予语言模型时间感知和时间计算能力的MCP服务器。通过协作工具开发,教会LLMs时间流逝的重要性。

这个项目源于一个哲学问题:“AI能否感知时间的流逝?”从探索机器意识开始,最终成为解决实际问题的实用方案——LLMs无法可靠地计算时间差。
与其发表一篇关于这些模型在心算方面有多“愚蠢”的论文,我们决定做我们为自己做的事情:给它们配备一个时间计算器。
通过人类与LLM的合作,我们发现,有了适当的时间工具,模型可以揭示出关于对话模式、工作节奏以及人类对时间体验的惊人见解。
git clone https://github.com/jlumbroso/passage-of-time-mcp.git
cd passage-of-time-mcp
pipenv install
# 或使用pip:
pip install fastmcp pytz
pipenv run server
# 或直接运行:
pipenv run python passage_of_time_mcp.py
服务器将在http://0.0.0.0:8000/sse启动。
https://your-server.ngrok-free.app/sse,确保末尾加上/sse)注意:对于本地开发,你需要使用ngrok或其他方式公开你的服务器,或者将其部署到公共URL。
current_datetime(timezone="America/New_York")返回当前日期和时间。这是时间感知的基础。
返回:"2024-01-15 14:30:45 EST"
time_difference(timestamp1, timestamp2, unit="auto")计算两个时间戳之间的持续时间,并以人类可读的方式输出。
# 示例响应:
{
"seconds": 11401,
"formatted": "3小时10分钟1秒",
"requested_unit": 3.17, # 如果unit="hours"
"is_negative": false
}
timestamp_context(timestamp)提供关于时间戳的人类上下文——是周末吗?工作时间吗?晚餐时间吗?
# 示例响应:
{
"time_of_day": "晚上",
"day_of_week": "星期六",
"is_weekend": true,
"is_business_hours": false,
"typical_activity": "休闲时间",
"relative_day": "今天"
}
time_since(timestamp)计算某件事发生多久了,并带有上下文描述。
# 示例响应:
{
"seconds": 7200,
"formatted": "2小时前",
"context": "今天早些时候"
}
parse_timestamp(timestamp)在不同格式之间转换时间戳,以实现最大兼容性。
# 示例响应:
{
"iso": "2024-01-15T14:30:45-05:00",
"unix": "1705343445",
"human": "2024年1月15日 下午2:30 EST",
"day_of_week": "星期一"
}
add_time(timestamp, duration, unit)使用自然语言描述添加或减去时间。
# 示例响应:
{
"result": "2024-01-16 14:30:45",
"iso": "2024-01-16T14:30:45-05:00",
"description": "明天下午2:30"
}
format_duration(seconds, style="full")根据不同的上下文格式化持续时间。
# style="full": "2小时30分钟15秒"
# style="compact": "2h 30m 15s"
# style="minimal": "2:30:15"
人类:现在几点?
Claude:[调用current_datetime] 现在是2024年1月15日星期一下午3:45 EST。
人类:让我们讨论一下AI意识。
Claude:[每次回应时调用current_datetime]
[经过几次交流后]
人类:你注意到我们的对话有什么模式吗?
Claude:查看时间戳,我发现你在回复之间用了30秒到2分钟的时间,这表明你积极参与。在你提问实施细节前的3分钟停顿显示了更深入的考虑……
人类:[晚上11:45] 你能帮我调试这段代码吗?
Claude:[调用current_datetime,然后调用timestamp_context]
我看到现在是工作日的深夜,接近午夜。让我帮你高效地完成任务,这样你可以休息一下。这里有一个集中的调试方法……
此服务器体现了几个关键原则:
服务器默认为America/New_York,但支持所有标准时区名称:
UTCUS/PacificEurope/LondonAsia/Tokyo所有时间戳必须使用以下格式之一:
YYYY-MM-DD HH:MM:SS(例如,“2024-01-15 14:30:45”)YYYY-MM-DD(例如,“2024-01-15”)严格的格式防止歧义并确保可靠的计算。
http-stream传输此项目源于人类与LLM的合作,并欢迎更多的合作!无论你是单独贡献还是借助AI的帮助,我们都重视:
首先,克隆仓库:
git clone https://github.com/jlumbroso/passage-of-time-mcp.git
cd passage-of-time-mcp
然后,安装依赖(我使用pipenv因为它同时创建虚拟环境并安装包,但任何与pip兼容的工具都可以工作):
# 安装开发依赖
pipenv install --dev
# 运行测试
pipenv run test
# 运行服务器
pipenv run server
这将在你的本地计算机上启动服务器http://0.0.0.0:8000/sse。然而,为了让基于web的客户端连接到它,你需要使用像ngrok这样的服务将其暴露到互联网。
假设你已经安装了ngrok,你可以运行ngrok http 8000来将服务器暴露到互联网,并在你的MCP客户端中使用提供的URL。默认情况下,ngrok将以https://<随机子域>.ngrok-free.app/的形式提供端点:
❤️ ngrok? 我们正在招聘 https://ngrok.com/careers
会话状态 在线
账户 Jérémie Lumbroso (计划:免费)
更新 有可用更新(版本3.23.1,按Ctrl-U更新)
版本 3.22.1
区域 美国
延迟 31ms
延迟 1575ms
Web界面 http://127.0.0.1:4040
转发 https://37f9-2607-f470-6-1001-243b-bc5c-df2e-762.ngrok-free.app ->
连接 ttl opn rt1 rt5 p50 p90
1756 0 0.01 0.03 5.32 61.51
HTTP请求
-------------
00:06:44.030 EDT POST /messages/ 202 已接受
00:06:43.936 EDT POST /messages/ 202 已接受
00:06:43.514 EDT GET /sse 200 OK
00:06:43.682 EDT POST /messages/ 202 已接受
00:06:43.342 EDT POST /sse 405 方法不允许
在我的情况下,我使用了https://37f9-2607-f470-6-1001-243b-bc5c-df2e-762.ngrok-free.app,但由于我们使用的是"SSE"传输方法,端点末尾应加上/sse,因此最终的URL将是https://37f9-2607-f470-6-1001-243b-bc5c-df2e-762.ngrok-free.app/sse。
一旦该端点存在,你可以按照以下说明将MCP服务器作为集成添加到LLMs中,如Claude:

一旦你将MCP服务器连接到Claude.ai,你应该开始接收本地查询:
$ pipenv run server
/Users/jlumbroso/.asdf/installs/python/3.12.4/lib/python3.12/asyncio/events.py:88: DeprecationWarning: run_sse_async方法已弃用(自2.3.2起)。使用run_http_async作为现代(非SSE)替代方案,或使用`fastmcp.server.http.create_sse_app`创建SSE应用程序并直接运行。
self._context.run(self._callback, *self._args)
[06/16/25 19:18:04] INFO 启动MCP服务器'时间流逝',传输为'sse',地址为http://0.0.0.0:8000/sse server.py:1219
INFO: 启动服务器进程 [11373]
INFO: 正在等待应用程序启动。
INFO: 应用程序启动完成。
INFO: Uvicorn正在运行于http://0.0.0.0:8000(按CTRL+C退出)
INFO: 34.162.142.92:0 - "POST /sse HTTP/1.1" 405 方法不允许
INFO: 34.162.142.92:0 - "GET /sse HTTP/1.1" 200 OK
INFO: 34.162.142.92:0 - "POST /messages/?session_id=e21108cecbf646ffb7effe14dd856b3d HTTP/1.1" 202 已接受
INFO: 34.162.142.92:0 - "POST /messages/?session_id=e21108cecbf646ffb7effe14dd856b3d HTTP/1.1" 202 已接受
INFO: 34.162.142.92:0 - "POST /messages/?session_id=e21108cecbf646ffb7effe14dd856b3d HTTP/1.1" 202 已接受
INFO: 34.162.142.92:0 - "POST /messages/?session_id=e21108cecbf646ffb7effe14dd856b3d HTTP/1.1" 202 已接受
INFO: 34.162.142.92:0 - "POST /messages/?session_id=e21108cecbf646ffb7effe14dd856b3d HTTP/1.1" 202 已接受
INFO: 34.162.142.92:0 - "POST /messages/?session_id=e21108cecbf646ffb7effe14dd856b3d HTTP/1.1" 202 已接受
最终,你可能希望将此MCP服务器部署到云提供商,如Render.com,这样你的LLM就不必应对你的本地机器不可靠的问题。
Mozilla Public License 2.0 —— 因为好的想法应该传播开来,同时保持开放。
"我们不仅仅是在构建更好的LLM工具。我们正在教导好奇的认知系统什么是人类——一次时间戳。"