datetime-mcp-server
Servidor MCP datetime
Un servidor Model Context Protocol que proporciona consultas de fecha/hora actual, escrito en TypeScript y diseñado para desplegarse en AWS Lambda, sirviendo a través de HTTP Streamable.
Características
Dos herramientas MCP:
get_date,get_datetime, con salida en formato ISO 8601Parámetro de zona horaria opcional: admite nombres de zona horaria IANA (
Asia/Shanghai) y desplazamientos UTC (+08:00), por defecto UTCCero librerías de tiempo de terceros: completamente basado en el
Intlintegrado de Node.js (ICU), sin dependencias de moment/luxon/dayjsDespliegue serverless: bundle de un solo archivo (~2 MB) + Lambda Web Adapter, con respuesta en milisegundos en instancias calientes tras el arranque en frío
Cumple con el estándar MCP más reciente: transporte HTTP Streamable, modo de ejecución stateless, negociación de versión de protocolo gestionada por el SDK oficial
Related MCP server: date-today-mcp
Arquitectura
MCP Client ──HTTP POST /mcp──▶ Function URL ──▶ Lambda 函数
│
├─ LWA Layer (AWS_LAMBDA_EXEC_WRAPPER=/opt/bootstrap)
│ └─ 执行 zip 根目录 bootstrap → node dist/index.js
│
└─ Express app (端口 8080)
└─ POST /mcp → StreamableHTTPServerTransport
(stateless:每请求新建 transport,
enableJsonResponse 返回普通 JSON)Mecanismos clave:
Componente | Descripción |
HTTP Streamable | El único transporte HTTP recomendado actualmente por MCP; HTTP+SSE está obsoleto |
Modo stateless | Cada petición es autocontenida y no mantiene sesión, encaja con el modelo de congelación/descongelación de Lambda |
| La respuesta usa JSON normal en lugar de flujo SSE, evitando las limitaciones de buffer de respuesta de Lambda |
Lambda Web Adapter (LWA) | Layer pública oficial de AWS que traduce la invocación de Lambda a una petición HTTP real a localhost:8080 |
Script | El punto de entrada real del proceso tras la toma de control de LWA ( |
Herramientas MCP
get_date
Devuelve la fecha de calendario actual, ISO 8601 YYYY-MM-DD.
Parámetro | Tipo | Obligatorio | Descripción |
| string | No | Nombre de zona horaria IANA o desplazamiento UTC, por defecto |
{"result":{"content":[{"type":"text","text":"2026-08-24"}]}}get_datetime
Devuelve la fecha y hora actuales, ISO 8601 con sufijo de desplazamiento (la salida UTC usa Z).
{"result":{"content":[{"type":"text","text":"2026-08-23T14:30:00+08:00"}]}}Comportamiento de errores
Zona horaria ausente o cadena vacía → se trata como UTC
Zona horaria no vacía pero inválida → devuelve un resultado con
isError: true, con mensaje informativo:
Error: Invalid IANA timezone "Mars/Olympus". Use a name like "UTC", "Asia/Shanghai" or "America/New_York".Errores a nivel de protocolo (como falta de cabecera Accept) los devuelve el SDK como error JSON-RPC estándar
Fuente de tiempo y precisión
La hora se lee del reloj del sistema del entorno de ejecución (new Date()). En local es el reloj de la máquina (depende de la calibración NTP); en Lambda, el reloj del host se sincroniza automáticamente mediante Amazon Time Sync Service (fuente GPS/reloj atómico, PTP/NTP), con error inferior al milisegundo, sin necesidad de configuración.
Deliberadamente no se consulta NTP externo en cada petición: el reloj de AWS ya está sincronizado continuamente, y una consulta externa solo añadiría latencia (+10~100 ms), introduciría superficie de fallo de red y problemas de limitación, sin mayor precisión.
La resolución de salida es de segundos (los milisegundos se truncan). La conversión de zona horaria es aritmética pura: todas las zonas horarias obtienen el mismo instante absoluto, solo difiere la representación de la hora de pared.
Desarrollo local
Requiere Node.js ≥ 22.
npm install # 安装依赖
npm run dev # 构建 + 启动(默认 http://localhost:3000/mcp)
npm test # vitest 单测(14 个用例)
npm run typecheck # tsc --noEmit
npm run lint # eslint
npm run build # esbuild 打包为 CJS 单文件 dist/index.jsPrueba manual local (la cabecera Accept debe declarar ambos tipos de medio, es la validación de protocolo del SDK):
curl -s http://localhost:3000/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_datetime","arguments":{"timezone":"Asia/Shanghai"}}}'También se puede usar el depurador oficial: npx @modelcontextprotocol/inspector, tipo de conexión HTTP Streamable.
Nota: si la máquina local tiene la variable de entorno
http_proxyconfigurada, curl necesita--noproxy '*', de lo contrario las peticiones a localhost serán interceptadas por el proxy y devolverán 502.
Estructura del proyecto
├── src/
│ ├── time.ts # 核心纯函数:ISO 格式化、时区校验(可独立单测)
│ ├── server.ts # McpServer 实例 + 工具注册
│ └── index.ts # Express app + stateless transport 挂载 + 进程入口
├── test/
│ └── time.test.ts # 固定时间戳验证多时区/DST/半小时偏移/错误输入
├── build.mjs # esbuild 构建脚本(bundle: platform=node22, format=cjs)
├── bootstrap # LWA 进入口(zip 根目录,需可执行位 755)
├── deploy.sh # CLI 一键部署脚本
├── function.zip # 部署包(构建产物,不入库)
└── dist/index.js # 打包产物(约 2MB,零运行时依赖安装)Puntos clave de implementación técnica
El formateo de zonas horarias se realiza íntegramente con Intl.DateTimeFormat, con técnicas clave:
Fecha: el locale
en-CAproduce naturalmenteYYYY-MM-DD, sin ensamblaje manualHora con desplazamiento:
formatToPartsobtiene los campos de hora de pared de la zona horaria objetivo → se usaDate.UTC()para recalcular como si fuera UTC → se resta del instante original para obtener el offset en minutos → se formatea como±HH:MMoZhourCycle: "h23": evita el bug de borde de la hora"24"que producehour12: falseen algunos localesDST y zonas horarias especiales: el offset se calcula en el momento de la petición, el cambio de horario de verano es naturalmente correcto (Nueva York
-04:00→-05:00); zonas horarias de media hora/cuarto de hora (India+05:30, Nepal+05:45, Chatham+12:45) están cubiertas por pruebas unitariasCaché de formateadores: se cachean las instancias de
Intl.DateTimeFormatpor zona horaria, cero coste de construcción en llamadas repetidas en instancias calientesValidación de zona horaria: try/catch al construir
Intl.DateTimeFormat; si lanzaRangeErrorse considera inválida. El nuevo ECMA-402 hace que ICU acepte también cadenas de desplazamiento UTC (como+08:00), verificado que toda la cadena produce salida correcta e incluido en las pruebas
Despliegue en AWS Lambda
Requisitos previos: credenciales configuradas en AWS CLI; un rol de ejecución con permisos AWSLambdaBasicExecutionRole (si no existe, se puede crear con el siguiente comando):
aws iam create-role --role-name datetime-mcp-role \
--assume-role-policy-document '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":{"Service":"lambda.amazonaws.com"},"Action":"sts:AssumeRole"}]}'
aws iam attach-role-policy --role-name datetime-mcp-role \
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRoleOpción 1: Script CLI
ROLE_ARN=arn:aws:iam::<账号ID>:role/datetime-mcp-role ./deploy.shVariables de entorno opcionales: AWS_REGION (por defecto us-east-1), FUNCTION_NAME (por defecto datetime-mcp), ARCH (arm64/x86_64, por defecto arm64).
Flujo del script: consulta dinámicamente la versión más reciente del Layer LWA de la región → build con esbuild → empaquetado con bsdtar (el sistema no tiene comando zip) → create/update de la función (nodejs22.x, 512 MB, timeout 10 s) → creación de Function URL sin autenticación y autorización de invocación pública → salida del endpoint. La ejecución repetida es segura, toma automáticamente la ruta de actualización.
Opción 2: Consola de AWS
Empaquetado local:
npm run build && bsdtar --format zip -cf function.zip bootstrap dist/index.jsConsola de Lambda → Create function → Author from scratch
Runtime: Node.js 22.x; Architecture: arm64
Permissions: Create a new role with basic Lambda permissions
Pestaña Code → Upload from → .zip file → seleccionar
function.zip(la estructura interna debe serbootstrapen la raíz +dist/index.js)Sección Layers → Add a layer → AWS layers → LambdaAdapterLayerArm64 (seleccionar la versión más reciente)
Configuration → Environment variables:
Key
Value
AWS_LAMBDA_EXEC_WRAPPER/opt/bootstrapPORT8080Configuration → General configuration → Memory 512 MB、Timeout 10 s
Configuration → Function URL → Create → Auth type NONE
Al crear un Function URL de tipo NONE desde la consola se añade automáticamente la política de recursos para invocación pública, no es necesario ejecutar
add-permission(esta es la diferencia con el CLI).
Acceder directamente al Function URL desde el navegador devolviendo 405 es normal (solo se permite POST). Para actualizar el código en el futuro: reconstruir y reempaquetar, y volver a subir en la pestaña Code.
Integración con clientes MCP
Con opencode como ejemplo, añadir el servidor MCP remoto en la configuración:
{
"mcp": {
"datetime": {
"type": "remote",
"url": "https://<identifier>.lambda-url.<region>.on.aws/mcp"
}
}
}Registro de decisiones de diseño
Decisión | Conclusión | Justificación |
Lenguaje | TypeScript | Soporte de zonas horarias integrado con |
Transporte | HTTP Streamable + stateless + respuesta JSON | Lambda no tiene proceso persistente, stdio no es viable; sin estado de sesión encaja naturalmente con el modelo de congelación/descongelación; JSON puro evita las limitaciones de flujo SSE |
Versión SDK | Versión estable | Implementa correctamente la negociación de versión de protocolo, retrocompatible con clientes antiguos; las nuevas características de la revisión de 2026-07-28 (caché TTL, etc.) no tienen sentido para una lista estática de herramientas; la API de paquetes divididos beta no está estabilizada |
Implementación de zonas horarias |
| Cero dependencias, sin necesidad de instalar tzdata en Lambda, precisión suficiente |
Fuente de tiempo | Reloj del sistema en lugar de consultar NTP cada vez | AWS ya hace sincronización submilisegundo; consultar NTP externo añade latencia/superficie de fallo/coste sin beneficio de precisión |
Despliegue | CLI/consola manual + Layer LWA | Sin inversión inicial de SAM/CDK/Terraform; deploy.sh es solo un lote de comandos, no IaC |
Resolución de problemas
Síntoma | Causa y solución |
| La petición no tiene cabecera Accept. Las pruebas con curl necesitan |
| Falta el Layer LWA o no se configuró |
GET /mcp devuelve 405 | Comportamiento esperado. El modo stateless no admite flujos push del servidor, solo acepta POST |
curl en local devuelve 502 con respuesta muy rápida | El proxy del sistema intercepta localhost. Añadir |
Primera petición lenta en Function URL en arranque en frío | Debido al mecanismo de congelación/descongelación de Lambda, las peticiones posteriores son de milisegundos |
Error | La máquina no tiene instalado el paquete zip (en Arch son dos paquetes separados con unzip). Este proyecto usa |
Limitaciones conocidas y mejoras futuras
Handler defensivo no añadido: si se ejecuta directamente en el runtime Node.js por defecto (sin LWA), el mensaje de error es confuso. Se podría exportar un handler de marcador de posición informativo para mejorar la experiencia de error en configuración incorrecta, con impacto cero en la ruta normal
La salida solo tiene precisión de segundos, no expone milisegundos
Sin autenticación ni limitación de tasa: un endpoint público podría ser abusado para inflar el número de llamadas (aunque el coste por llamada tiende a cero)
La tabla de alias de
Intl.supportedValuesOf("timeZone")no se usa para sugerencias de parámetros, el mensaje de error solo da tres ejemplosCuando el SDK migre de la versión estable 1.x a los paquetes divididos (soporte de la revisión de 2026-07-28), habrá que seguir los cambios de API
Licencia
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseAqualityNot gradedmaintenanceProvides timezone-aware date and time information with configurable time formats and timezone support. Enables users to get current date and time in their preferred timezone and format through simple MCP tools.2
- FlicenseAqualityCmaintenanceProvides the current date in multiple formats (e.g., European, ISO, US) via a simple MCP tool.1
- FlicenseAqualityCmaintenanceA simple MCP server that returns the current date and time with timezone information in ISO 8601, Unix timestamp, and human-readable formats.1
- AlicenseNot gradedqualityDmaintenanceProvides time-related tools including current time retrieval, timezone conversion, time formatting, and timezone info via MCP.15MIT
Related MCP Connectors
Timezone MCP — wraps WorldTimeAPI (free, no auth)
A real clock for AI agents: current time, timezone conversion, and DST facts from the IANA tzdb.
Time MCP server via HTTP
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/timeaissr/datetime-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server