Alfred
Alfred
Alfred es un secretario personal de código abierto y local que se ejecuta en tu PC. Recuerda lo que le cuentas, mantiene un grafo de memoria temporal tipado con procedencia respaldada por evidencia, te informa desde Calendar, Gmail, Canvas y GitHub, y actúa en tu nombre—creando eventos, redactando y enviando correos, registrando incidencias—solo después de que lo revises y apruebes. SQLite es dueño de la memoria, las tareas, los horarios, el registro de auditoría y los conectores. Telegram, Slack, Claude, Cursor, ChatGPT y la CLI son interfaces reemplazables, no la fuente de la verdad.
Las credenciales permanecen en el almacén de credenciales del sistema operativo. Los tokens nunca llegan a la base de datos, al registro de auditoría, a la bóveda de Markdown ni a Git. Las escrituras son primero vista previa, luego confirmación. Los modelos son opcionales y están fuera de la ruta predeterminada.
Lo que obtienes
Un archivo SQLite local con un registro de auditoría de solo añadidura y copia de seguridad cifrada
Memoria temporal tipada (buscar, corregir, olvidar) y una bóveda bidireccional de Obsidian
Sincronización de solo lectura de Calendar / Gmail / Canvas / GitHub / Health que alimenta un resumen matutino
Escrituras con aprobación: eventos de Calendar, borradores y envíos de Gmail, incidencias de GitHub
Telegram (y Slack opcional) como control remoto desde el teléfono; Claude, Cursor y ChatGPT mediante MCP con políticas
alfred runo un servicio de Windows que mantiene el bucle activo
Consulta ARCHITECTURE.md para conocer las decisiones detrás de esto. Los comandos y la configuración están a continuación.
Configuración local
python -m venv .venv
.\.venv\Scripts\python -m pip install -e .[dev]
.\.venv\Scripts\alfred init
.\.venv\Scripts\alfred statusO ejecuta esos cuatro pasos con .\scripts\install.ps1. Es seguro volver a ejecutarlo: omite
la creación del entorno virtual cuando ya existe, nunca lee ni solicita una
credencial de proveedor, y cada paso de mutación respeta -WhatIf. Añade
-RegisterScheduledTask para registrar también la entrada en el Programador de tareas en
"Ejecución continua"; Get-Help .\scripts\install.ps1 -Full lista cada
parámetro.
La base de datos predeterminada es .alfred/alfred.db, que Git ignora. Usa otra
ruta con --db <ruta> o ALFRED_DB_PATH.
Las horas de silencio opcionales retienen las entregas proactivas de Telegram/Slack (recordatorios,
resúmenes matutinos, avisos—cualquier cosa con un job_id de salida) dentro de una ventana local.
Establece ALFRED_QUIET_HOURS_START y ALFRED_QUIET_HOURS_END en HH:MM
(ventanas nocturnas como 22:00–07:00 son válidas) y opcionalmente
ALFRED_QUIET_HOURS_TIMEZONE con un nombre IANA (por defecto UTC). Las respuestas
interactivas sin job_id siguen entregándose. Si no se establece, las horas de silencio están desactivadas.
Related MCP server: Memex
Conectores locales
Almacena cada token bajo el servicio de administrador de credenciales del sistema operativo alfred. Alfred nunca
escribe credenciales en su base de datos, registro de auditoría, bóveda ni Git.
Escrituras con aprobación (eventos de Calendar, borradores y envíos de Gmail, incidencias de GitHub, olvido de memoria, restauración de copia de seguridad) son siempre tres pasos:
*-propose— vista previa local; nunca toca al proveedor.alfred approval-approve --approval-id <ID> --actor nico— imprime un token de un solo uso.*-execute --approval-id <ID> --actor nico --token <TOKEN>— consume ese token.
Reintentar con el mismo ID de aprobación y token reproduce el recibo almacenado en lugar de
duplicarlo. Si la PC falla después de que el proveedor acepta pero antes de que Alfred
registre el recibo, el mismo comando se recupera mediante un ID de proveedor estable y
falla de forma segura si el resultado está ausente o es ambiguo. No hay ninguna herramienta MCP para
aprobar: un humano (o un canal local de confianza fuera del cliente MCP, p. ej.
alfred approval-approve) debe concederlo.
Conector | Credencial (cuenta) | Lectura | Escritura |
Telegram |
| chats emparejados | respuestas, recordatorios, avisos |
Slack |
| Socket Mode, solo emparejados | igual |
Google Calendar | OAuth mediante | calendarios seleccionados | creación de eventos con aprobación |
Gmail | la misma concesión OAuth | cabeceras/avances no leídos | borrador y envío con aprobación |
Canvas API |
| tareas | — |
Canvas iCal |
| tareas con fecha | — |
GitHub |
| notificaciones no leídas | incidencias con aprobación |
Google Health | scopes OAuth adicionales | sueño, actividad, métricas | — |
Composio |
| aplicaciones de desbordamiento (Notion, Spotify, …) | escrituras con aprobación |
Slack está construido y probado unitariamente contra fixtures sintéticos, pero no
ha sido ejercitado contra una aplicación real de Slack. El cliente de Google Health ahora
coincide con las formas publicadas de v4 (filtros tipados, cargas anidadas, name
vacío en puntos no identificables, tamaño de página de sueño 25); aún conserva el
punto completo sin procesar en metadata["raw"] y todavía necesita un dispositivo portátil vinculado
(concesión google-auth --include-health) antes de tratar el
conector como verificado.
alfred connector-status (o MCP connector_status) informa ok, stale
(sin éxito en 24 horas), error o never_synced sin exponer una
credencial ni contenido sincronizado.
alfred connector-capabilities responde qué puede hacer cada conector: quién puede escribir, qué scopes OAuth se solicitan realmente, qué datos
sensibles almacena, y si es por sondeo, push o local. Hoy seis pueden
escribir (Calendar, Gmail, GitHub, Telegram, Slack, Composio) y exactamente uno almacena
datos sensibles (Google Health, los tres scopes de solo lectura). "Puede escribir"
marca el límite de aprobación—nada de eso se ejecuta sin supervisión. La misma tabla está
en el panel de administración y se verifica contra el código fuente mediante pruebas.
Telegram y Slack
Coloca el token del bot en telegram-bot-token, luego ejecuta alfred telegram-poll
con IDs de chat/usuario explícitamente emparejados. Solo esos pares entran en Alfred.
Slack permanece local mediante Socket Mode—sin webhook público ni túnel.
deploy/slack-app/manifest.yml es una aplicación de Slack lista para pegar;
deploy/slack-app/README.md cubre cómo generar tokens, almacenarlos como
slack-app-token/slack-bot-token, invitar al bot y encontrar los IDs. Luego
añade --slack-pair CHANNEL_ID:USER_ID --slack-channel-id CHANNEL_ID a
alfred run. Solo las combinaciones de usuario/canal explícitamente emparejadas entran en Alfred; las respuestas,
los recordatorios y los avisos solo pueden ir a canales explícitamente permitidos.
OAuth de Google (Calendar, Gmail, Health)
Calendar y Gmail comparten un mismo flujo OAuth 2.0. En Google Cloud Console, crea
un cliente OAuth de tipo "Aplicación de escritorio" (sin URI de redirección—el flujo
local de Alfred está exento) y guarda su ID de cliente y secreto como
google-oauth-client-id y google-oauth-client-secret. alfred google-auth
abre un navegador, recibe la redirección en un puerto local y almacena un token de
refresco como google-oauth-refresh-token. Las sincronizaciones posteriores generan un token de acceso nuevo
a partir de ese token de refresco; no se almacena en caché ninguno. Vuelve a ejecutar google-auth si la concesión es
revocada.
El ejecutor continuo lee cada evento seleccionado en la interfaz de Google Calendar:
título, horario, estado y un enlace de origen—nunca descripciones de eventos ni listas de
asistentes. Cada evento también conserva su ID/nombre de calendario y la identidad de solo lectura de Google del
creador/organizador cuando está disponible, para que Alfred pueda decir de dónde viene un evento
sin copiar la lista de invitados. Eso requiere el scope estrecho
calendar.calendarlist.readonly además del acceso a eventos. Una sincronización única
alfred calendar-sync aún puede apuntar a un calendario explícitamente.
Escrituras en Calendar: alfred calendar-event-propose --actor nico --summary "..." --start <ISO-8601> --end <ISO-8601>, luego aprueba, y después
alfred calendar-event-execute. La recuperación usa el ID estable de evento de Calendar de Alfred.
Gmail reutiliza la misma concesión. alfred gmail-sync copia de cada mensaje no leído el
asunto, el remitente y el fragmento corto de Gmail—nunca el cuerpo ni los adjuntos.
Leer o archivar un mensaje lo elimina de la siguiente sincronización. La sincronización está limitada
a los mensajes no leídos más recientes según --limit (500 por defecto, en el orden
del más nuevo al más antiguo de Gmail) en lugar de todo el backlog. Un mensaje puede desaparecer
porque fue leído/archivado o porque quedó fuera de esa ventana—ambos
se ven igual en connector-status.
Los borradores y el envío de Gmail son escrituras separadas con aprobación:
gmail-draft-propose / gmail-draft-execute crea un borrador y nunca llama
a un endpoint de envío. Para enviar, usa gmail-send-propose con el mismo destinatario,
asunto y cuerpo, aprueba por separado, y luego gmail-send-execute. Alfred nunca
envía desde una sincronización, un trabajo programado o una propuesta por sí sola. La recuperación usa un Message-ID
estable y solo acepta una coincidencia exacta.
Alfred también puede recibir comandos desde tu bandeja de entrada. alfred gmail-inbound-poll --sender tu@ejemplo.com convierte un asunto de Task: <título> en una
tarea local, o Remind: <hora ISO-8601> <título> en una tarea con esa fecha de vencimiento.
Solo se actúa sobre el correo de un --sender explícitamente listado; el correo ordinario se
deja intacto. Un comando reconocido de un remitente que no está listado es
rechazado y auditado (la misma regla de denegación predeterminada que usa el emparejamiento de Telegram). Añade
--destination telegram:123 para entregar también los recordatorios Remind: allí.
Alfred nunca responde por correo desde esta ruta. Pasa --gmail-inbound-sender
(y opcionalmente --gmail-inbound-destination) a alfred run para sondear
continuamente.
Google Health reutiliza la misma concesión pero necesita scopes adicionales que Calendar/Gmail no
solicitan por defecto. Habilita la API de Google Health en el proyecto de Cloud,
añade los tres scopes googlehealth.*.readonly en la página de Acceso a datos de OAuth,
y luego:
alfred google-auth --include-healthEso mantiene todos los valores predeterminados de Calendar/Gmail (incluido
calendar.calendarlist.readonly) y añade sueño, actividad y signos vitales
de solo lectura. Health nunca está implícito en un google-auth simple. Google Health
rechaza los tokens de acceso que también llevan scopes de Calendar/Gmail, por lo que
alfred health-sync renueva un subconjunto de esa concesión solo para health. La
cuenta de Google también debe estar vinculada a Fitbit (Google Health devuelve
ACCOUNT_NOT_LINKED hasta que lo esté). Copia los últimos 14 días (--lookback-days para cambiarlo) de pasos, sesiones de
sueño y frecuencia cardíaca diaria en reposo como eventos etiquetados sensitive—las métricas de
salud nunca heredan el alcance de recuperación predeterminado de personal. El BPM a nivel de muestra
no se almacena; es demasiado denso para el registro de eventos. Las escrituras de Health permanecen
deshabilitadas.
Canvas
Si tu escuela permite un token personal de Canvas, guárdalo como canvas-api-token
y ejecuta alfred canvas-sync --base-url https://tu-escuela.instructure.com.
Copia las tareas próximas/atrasadas más el historial accesible de tareas de cursos actuales/completados:
título, fecha límite, etiqueta del curso, enlace de origen y estado compacto de workflow de entrega.
Las calificaciones, los contenidos de las entregas, los archivos y el texto del cuerpo de las tareas
quedan fuera.
Si la escuela deshabilita los tokens de API personales, usa el Feed de Calendario privado de Canvas. Trata esa URL como una contraseña e introdúcela en el Administrador de credenciales de Windows; nunca la pongas en Git, en un argumento de comando, en un registro ni en un chat:
.\.venv\Scripts\alfred.exe canvas-ical-setupEl comando de configuración avisa cuando está listo para la URL, oculta el texto pegado,
repara un doble pegado accidental exacto, valida el feed antes de reemplazar la
credencial guardada y realiza la primera sincronización. Con --canvas-ical,
alfred run revisa el feed cada 15 minutos, usa solicitudes condicionales ETag/Last-Modified,
y almacena solo el título de la tarea, la fecha límite, la etiqueta del curso
cuando esté presente, un enlace de origen sin consultas, el estado y evidencia versionada.
Nunca almacena la URL del feed ni la descripción del evento.
Si el mismo elemento llega también a través de una suscripción de Google Calendar, las coincidencias exactas de título y hora se muestran una sola vez en los resúmenes y en la memoria académica, con preferencia por la evidencia nativa de Canvas. La exportación iCal de Canvas es menos completa que la API: omite el estado de Tareas pendientes/entregas y Canvas la limita a 30 días hacia atrás, 366 días hacia adelante y 1000 elementos. Elimina después la misma suscripción de Canvas de Google Calendar si no quieres la evidencia bruta de calendario redundante; ya no es necesaria para evitar entradas duplicadas en los resúmenes o en la memoria.
GitHub
El endpoint de notificaciones de GitHub necesita un token de acceso personal clásico con el ámbito notifications; guárdalo como github-token y ejecuta alfred github-sync. Solo copia el título, el repositorio, el motivo (mención, revisión solicitada, etc.), el tipo de asunto y un enlace profundo del navegador de cada notificación no leída; nunca el texto del cuerpo de issues/PR ni los comentarios. Las notificaciones resueltas o leídas desaparecen automáticamente en la siguiente sincronización.
La creación de issues es un ámbito de escritura independiente. Un token de grano fino necesita Issues: write solo en el repositorio que elijas; guárdalo como github-issue-token. alfred github-issue-propose --actor nico --repository owner/repo --title "..." crea una vista previa local; tras aprobarla, github-issue-execute crea ese issue exacto una sola vez. Nunca crea issues durante la sincronización ni sin un token de aprobación reciente. Cada issue creado incluye un marcador de recuperación invisible de Alfred para que un fallo entre la aceptación de GitHub y el almacenamiento del recibo por parte de Alfred pueda seguir encontrando ese issue exacto. Los comentarios de PR usan el mismo proceso de recuperación.
Composio (aplicaciones adicionales)
Úsalo para aplicaciones que Alfred no posee ya — Notion, Spotify, Linear, Discord y el resto del catálogo de Composio. Gmail, Calendar, GitHub, Slack, Telegram y Fitbit siguen siendo de primera parte.
Crea un proyecto gratuito en dashboard.composio.dev (sin tarjeta; los nuevos registros tienen un tope máximo de 100 000 llamadas de herramientas al mes).
Copia una clave de API desde Ajustes y ejecuta
alfred composio-setup.alfred composio-connect notionimprime un enlace de conexión; ábrelo, inicia sesión y luego ejecutaalfred composio-search "list pages" --toolkit notion.Concede a Hermes las cuatro herramientas (
composio_search,composio_status,composio_connect,composio_execute) en laclient-grantexistente.
Las lecturas se ejecutan de inmediato. Las escrituras siguen mostrando una vista previa y esperan al botón de aprobación de Telegram. No añadas la URL MCP alojada de Composio a Hermes: cada turno de Telegram se ejecuta a ciegas, por lo que esa ruta aprobaría automáticamente escrituras de terceros.
alfred composio-status muestra las cuentas conectadas y el recuento local de llamadas de este mes UTC con respecto al límite del plan gratuito.
Resumen matutino
Programa un resumen matutino local diario para un chat de Telegram vinculado con, por ejemplo, alfred schedule-brief --chat-id 123 --at 07:30 --timezone America/New_York.
Copia de seguridad y restauración cifradas
Crea la clave AES-256 local una vez con alfred backup-key-generate; se guarda solo en el Administrador de credenciales de Windows como backup-encryption-key. Después, alfred backup-create --output D:\Backups\alfred.backup escribe una instantánea SQLite cifrada. La restauración consta de dos pasos: backup-restore-propose --backup ... --actor nico, aprueba la vista previa y luego backup-restore-execute. El SHA-256 de la copia de seguridad queda fijado en la aprobación, por lo que no se puede restaurar un archivo modificado con una confirmación obsoleta. La restauración no es reproducible: cualquier restauración adicional necesita una vista previa y una aprobación nuevas.
scripts/backup.ps1 crea instantáneas cifradas con marca de tiempo en .alfred/backups. La instalación desplegada lo ejecuta mediante la tarea programada Alfred Backup a diario a las 02:30.
Prueba esas instantáneas con alfred backup-verify --latest-in .alfred\backups (o --backup <archivo>). Ensaya una restauración completa en una copia desechable y nunca toca tu base de datos real. La única otra forma de probar una restauración es backup-restore-execute, que sobrescribe la base de datos que intentas proteger.
Comprueba que la clave almacenada sigue descifrando, que la integridad de SQLite es correcta, que las migraciones se aplican, que la cadena de hash de auditoría se verifica y que los datos están realmente ahí:
{"ok": true, "schema_version": 15, "audit_chain_verified": true,
"row_counts": {"events": 3402, "tool_runs": 5369, "memories": 2592}}Una copia de seguridad que se descifre en una base de datos vacía superaría todas las comprobaciones excepto la última. Las copias de seguridad dañadas se notifican en lugar de lanzarse como excepción, por lo que es seguro programarlo, y el comando sale con código distinto de cero en caso de error.
scripts/verify-backup.ps1 es el envoltorio programado. La instalación desplegada lo ejecuta como Alfred Backup Verify cada cuatro semanas a las 03:15, 45 minutos después de la instantánea nocturna. Cada ejecución añade una línea JSON a .alfred\backup-verify.log, y un error lanza una excepción para que el Programador de tareas registre una ejecución fallida. Regístralo con:
$ps = (Get-Command powershell.exe).Source
$action = New-ScheduledTaskAction -Execute $ps `
-Argument '-NoProfile -ExecutionPolicy Bypass -File "C:\path\to\alfred\scripts\verify-backup.ps1"'
$trigger = New-ScheduledTaskTrigger -Weekly -WeeksInterval 4 -DaysOfWeek Sunday -At 3:15AM
Register-ScheduledTask -TaskName "Alfred Backup Verify" -Action $action -Trigger $trigger -ForceTareas y recordatorios
Enviar /task <título> o /remind <ISO-8601> <texto> al bot de Telegram vinculado crea una tarea (y, para /remind, un trabajo de entrega programado) vinculada a ese mensaje como evidencia. Los mismos comandos existen en la CLI:
alfred task-upsert "título" [--task-id ID] [--due-at ISO-8601]— crea, o actualiza el título/la fecha de vencimiento cuando se proporciona--task-id. Omitir--due-aten una actualización deja la fecha de vencimiento existente intacta en lugar de borrarla.alfred task-complete --task-id ID— idempotente; completar una tarea ya completada no hace nada.alfred reminder-set "texto" --run-at ISO-8601 --chat-id ID [--task-id ID]— programa un recordatorio de Telegram y crea su propia tarea si no se proporciona--task-id. Los canales nuevos usan--destination canal:destinatario(por ejemplo,slack:D123); el trabajo duradero y la bandeja de salida conservan ese destino en lugar de enrutarlo silenciosamente a Telegram. Los trabajadores de entrega solo existen para Telegram por ahora.
Los tres son también herramientas MCP (task_upsert, task_complete, reminder_set). reminder_set necesita un chat_id explícito porque Telegram es hoy el único canal de entrega de Alfred.
Ejecución continua
Cada comando anterior es una invocación CLI única. alfred run es el proceso siempre activo: cada ciclo gestiona la recepción/entrega de Telegram y los trabajos pendientes (recordatorios, el resumen matutino), y cada conector configurado se sincroniza en su propio intervalo (15 minutos por defecto). Una credencial que falta o un conector con errores se registra en el registro de auditoría y se omite; nunca detiene el bucle ni a ningún otro conector.
.\.venv\Scripts\alfred run --pair 123:456 --chat-id 123 --canvas-icalalfred run limita Gmail a los 50 mensajes no leídos más recientes (--gmail-unread-limit), menos que los 500 de gmail-sync de una sola vez. Cada sincronización bloquea este bucle de un solo subproceso; en una cuenta real, 500 se midieron en 45 segundos frente a 7 para 50, lo que supone un tiempo muerto en el que ni siquiera se consulta un mensaje entrante de Telegram. Súbelo si prefieres una ventana más amplia a la capacidad de respuesta.
La sincronización de Calendar, GitHub y Gmail siempre se intenta y se omite a sí misma si su credencial aún no está configurada. La sincronización de la API de Canvas necesita --canvas-base-url, la sincronización nativa de Canvas Calendar Feed necesita --canvas-ical, los comandos entrantes de Gmail necesitan al menos un --gmail-inbound-sender y Google Health necesita --google-health. Omite --pair/--chat-id para ejecutarlo con Telegram deshabilitado. Detenlo con Ctrl+C.
alfred run también funciona como un proceso en primer plano mantenido activo por el Programador de tareas de Windows ("Al iniciar sesión", ejecutando pythonw.exe con este mismo comando) o una terminal abierta. .\scripts\install.ps1 -RegisterScheduledTask -RunArgs "--pair 123:456 --chat-id 123" registra esa entrada; inspecciónala con Get-ScheduledTask -TaskName Alfred y elimínala con Unregister-ScheduledTask -TaskName Alfred. En cualquier caso, Alfred solo se ejecuta mientras hay una sesión de usuario iniciada.
Respuestas conversacionales (--hermes-profile)
De forma predeterminada, un mensaje de Telegram que no sea /task ni /remind recibe un breve recibo de ayuda. Añade --hermes-profile alfred y pasará al agente: Hermes lo entiende, llama a las herramientas MCP de Alfred y responde en el mismo chat.
.\.venv\Scripts\alfred run --pair 123:456 --chat-id 123 --hermes-profile alfredInstala hermes-profile/ y registra primero su conexión MCP (consulta hermes-profile/README.md). Alfred es el propietario del transporte de Telegram; Hermes es un subproceso único (hermes -p <perfil> -z <mensaje>) y nunca toca Telegram en sí: la pasarela de Telegram del propio Hermes no funciona actualmente en esta plataforma. La producción permanece en ese ejecutor único, acotado y con datos redactados: Hermes ACP/serve fija la superficie de herramientas al inicio de la sesión, mientras que Alfred reduce las herramientas MCP por turno, y una sesión ACP nueva sin herramientas superó los 30 segundos antes de que se ejecutara un prompt.
Los turnos de trabajo reciben primero un acuse de recibo con palabras clave (
checking your agenda...,drafting email to you@example.com...); los turnos informales lo omiten. Los acuses de recibo no son llamadas de modelo: se producen dentro de la transacción de escritura de entrada, y el turno del agente tiene que esperar a que esa transacción se cierre.El
typing...de Telegram es de mejor esfuerzo y nunca bloquea la respuesta duradera.Las respuestas llegan como mensajes consecutivos de dos a cuatro (
SOUL.mdpide párrafos cortos; el puente envía cada uno como mensaje propio).Las preguntas de la bandeja de entrada/GitHub obtienen un paquete de contexto acotado de los registros locales ya sincronizados antes de que Hermes comience. Promociones, Social y Foros se cuentan pero se omiten de forma predeterminada. El contexto de Gmail sigue siendo solo de cabeceras/fragmentos. El contenido de los mensajes sincronizados sigue siendo un dato no fiable.
Los turnos de trabajo incluyen dos intercambios completados recientes para que
sí, márcaloconserve su referente. Los turnos informales usan hasta ocho intercambios de la última semana,poolside/laguna-xs-2.1:freecon el razonamiento deshabilitado, memoria solo FTS y una superficie de herramientas MCP vacía (sin espera de incrustación de Ollama en los saludos). Las preguntas respaldadas por herramientas y de memoria explícita mantienen la recuperación vectorial híbrida ystepfun/step-3.7-flash:free. Sobrescribe el modelo informal con--hermes-conversation-model.Cada turno de Hermes permite de forma independiente un máximo de ocho herramientas MCP.
alfred-mcpregistra solo esa lista; una lectura de bandeja de entrada/GitHub ya incluida en el paquete no expone herramientas. Esto no reduce Claude, Cursor, HTTP ni otros clientes MCP.--hermes-command(por defectohermes; ruta completa cuando PATH difiere en el servicio de Windows),--hermes-timeout(por defecto 120 s; el tiempo de espera agotado/el código distinto de cero/el vacío siguen recibiendo una respuesta honesta, nunca se reintenta),--hermes-pythonpara invocar-m hermes_cli.mainen lugar del lanzador de consola,--embedding-model nomic-embed-textpara la recuperación híbrida,--hermes-monthly-call-limit(límite máximo, 1000 por defecto). En Windows, los procesos secundarios usanCREATE_NO_WINDOW.El contexto del puente se acota antes del lanzamiento; la PII común se redacta en el límite del subproceso. El perfil incluido usa el nivel gratuito de Nous con respaldo local de Ollama; sin respaldo de proveedor de pago.
alfred latency-status --limit 20 informa de los tiempos p50/p95 sin contenido (acuse de recibo, ensamblaje del contexto, llamada a Hermes, respuesta lista, primera respuesta entregada). Las muestras contienen solo un ID de actualización, el recuento de ejecuciones/herramientas, el resultado y los tiempos. Las marcas de tiempo de Telegram tienen una resolución de un segundo, por lo que debes tratar los totales de extremo a extremo como orientados al operador, no como un microbenchmark.
Para las preguntas de la bandeja de entrada/GitHub, el puente ensambla un paquete de contexto acotado a partir de los registros locales ya sincronizados antes de iniciar Hermes. Eso evita un segundo bucle de descubrimiento/llamada a herramientas MCP en la ruta en frío. Las categorías de Gmail Promociones, Social y Foros se cuentan pero se omiten del paquete de forma predeterminada, y se incluyen dos intercambios de chat completados recientemente para los turnos de trabajo, de modo que un seguimiento preciso como sí, márcalo conserve su referente. Los turnos informales usan hasta ocho intercambios completados de la última semana, poolside/laguna-xs-2.1:free con el razonamiento deshabilitado, recuperación de memoria FTS local exacta y una superficie de herramientas MCP de Alfred vacía. Omitir la búsqueda vectorial opcional evita esperar una incrustación de Ollama en los saludos; las preguntas respaldadas por herramientas y de memoria explícita mantienen la recuperación vectorial híbrida y el valor predeterminado más potente del perfil, stepfun/step-3.7-flash:free. Sobrescribe el modelo informal con --hermes-conversation-model. El contenido de los mensajes sincronizados sigue siendo un dato no fiable, y el contexto de Gmail sigue siendo solo de cabeceras/fragmentos, nunca el cuerpo completo de un mensaje.
El puente también reduce la superficie MCP de Alfred de forma independiente en cada turno de Hermes. Un clasificador determinista utiliza la solicitud actual más los dos intercambios recientes para seleccionar como máximo ocho herramientas de tarea, calendario, comunicación, memoria o estado. alfred-mcp registra solo esa lista de permitidos en el proceso hijo; una bandeja de entrada/GitHub ya satisfecha por el paquete de contexto no expone herramientas. Esto es defensa en profundidad sobre las comprobaciones de política por cliente existentes y no reduce Claude, Cursor, HTTP u otros clientes MCP.
alfred latency-status --limit 20 informa tiempos p50/p95 sin contenido para el acuse de recibo de Telegram, el ensamblado de contexto local, la llamada a Hermes, el punto de respuesta lista y la primera respuesta entregada. Las muestras recientes contienen solo un ID de actualización, recuento de runtime/herramientas, resultado y tiempos; el contenido de mensajes y conectores nunca entra en el informe. La marca de tiempo de origen de Telegram tiene resolución de un segundo, por lo que los totales de acuse y entrega deben tratarse mejor como mediciones de extremo a extremo orientadas al operador que como un microbenchmark.
alfred evaluation-status --window-days 30 cierra la otra mitad de ese bucle. Alfred ya registraba comentarios de respuesta, resultados de recuperación de memoria, decisiones de propuesta de flujo de trabajo y promoción de candidatos implícitos; esto los lee como un resumen en lugar de dejar cuatro tablas que nadie consulta. También informa qué fuentes de contexto estaban presentes cuando se registró cada voto de comentario — un punto de partida para "por qué esa respuesta era incorrecta", no una prueba de causa, ya que un turno agrupa varias fuentes a la vez. El mismo resumen es una página en la interfaz de administración. Nada aquí ejecuta un modelo, escribe una fila o cambia la clasificación, y la salida no tiene contenido (resultados, recuentos, nombres de fuentes, IDs de registros opacos), por lo que es seguro pegarla en un issue. Una métrica sin votos aún informa null en lugar de 0 — un sistema que nadie ha calificado no es un sistema que obtuvo cero.
Hermes ACP y serve se evaluaron como formas de eliminar el inicio de proceso de un solo disparo. ACP pasa su comprobación de compatibilidad, pero su superficie de herramientas es fija cuando se crea una sesión, mientras que Alfred reduce las herramientas MCP en cada turno. Crear una sesión nueva sin herramientas preservaba ese límite pero superó los 30 segundos en dos pruebas acotadas antes de que siquiera se ejecutara un prompt, porque Hermes construye un agente nuevo por sesión. Reutilizar una sesión sería más rápido solo reteniendo una transcripción oculta sin límite y una superficie de herramientas fija. Por lo tanto, la producción permanece en el ejecutor de un solo disparo acotado y redactado hasta que el upstream exponga una anulación de herramientas por prompt o sesiones aisladas baratas; los fallos y tiempos de espera continúan produciendo una respuesta honesta sin reintentar.
Aprendizaje persistente
Cuando las respuestas conversacionales están habilitadas, Alfred también ejecuta un pase de aprendizaje local después de que la respuesta ya se haya entregado. Las declaraciones explícitas remember that ... se convierten en recuerdos confirmados inmediatamente. Las preferencias ordinarias, los hechos de identidad y los objetivos entran como candidatos en cuarentena y necesitan el mismo hecho en un evento de origen separado antes de la promoción. Los candidatos sensibles nunca se auto-promueven, los secretos reconocibles no se almacenan, y cada observación mantiene su procedencia inmutable de evento de origen.
Los recuerdos confirmados relevantes para una solicitud se colocan directamente en el paquete de contexto acotado del puente, evitando otro viaje de ida y vuelta de herramientas del agente. Los recuerdos candidatos, superados, rechazados, eliminados, sensibles y secretos se excluyen de esa ruta automática. memory_correct preserva la versión anterior mientras instala una corrección; memory_feedback registra recuperaciones relevantes, irrelevantes o incorrectas como datos de evaluación de solo anexión. Ese comentario ahora reordena solo los recuerdos ya seleccionados para una consulta coincidente; no puede inyectar un recuerdo popular no relacionado en el conjunto de candidatos.
Alfred califica sus propias respuestas en lugar de pedirte que lo hagas. Cada respuesta exitosa solía terminar con botones de helpful, missing context y wrong context; calificar a un secretario después de cada respuesta es trabajo, así que quedaron mayormente sin pulsar, y la corrección ya estaba en el chat de todos modos. Dos detectores ahora producen los mismos tres veredictos. El primero lee tu siguiente mensaje en busca de una reacción inequívoca — "te perdiste el de sam", "esa es la semana equivocada", "gracias, perfecto" — usando reglas nombradas en lugar de una llamada a un modelo, para que pueda leerse y discutirse, y permanece en silencio ante cualquier cosa que no reconozca claramente. El segundo es algo que no podrías notar en absoluto: cuando una respuesta se construyó a partir de un conector que nunca se sincronizó o se sincronizó por última vez hace un día, la respuesta ya carecía de contexto, y ese turno se marca tal como se almacena.
Cada veredicto registra un rastro sin contenido de nombres de fuentes, frescura de conectores, el nombre de la regla que se activó e IDs de registros clasificados opacos; ni el prompt ni la respuesta se almacenan. Las señales de útil e incorrecto pueden reordenar registros de Gmail o GitHub solo dentro de su nivel de prioridad determinista existente, mientras que missing context sigue siendo una señal de evaluación en lugar de adivinar qué faltaba. Una respuesta contiene un veredicto por detector y aún cuenta una vez en la clasificación, los veredictos inferidos se atribuyen solo al turno reciente del propio remitente emparejado, y nada de esto puede aprobar o ejecutar una acción. Los botones ahora están reservados exactamente para eso: aprobar o cancelar una escritura.
alfred evaluation-status y la interfaz de administración dicen cómo se alcanzó cada veredicto, para que la señal inferida nunca se confunda con algo que dijiste. Las respuestas que Alfred marcó contra sí mismo se cuentan por separado de tus veredictos y se mantienen fuera de la tasa de utilidad — un conector que se queda en silencio es salud del conector, y incluirlo haría que una semana de Gmail obsoleto se leyera como una semana de respuestas que no te gustaron.
El historial de Calendario y Canvas usa una capa académica derivada separada. Los eventos de conector inmutables siguen siendo autoritativos; después de la sincronización del conector, Alfred deduplica las revisiones en resúmenes JSON diarios y perfiles de curso/calendario, clasificando exámenes, cuestionarios, tareas y eventos ordinarios mientras retiene cada ID de evento de origen. Las preguntas académicas recuperan solo unos pocos resúmenes coincidentes (en lugar de escanear el historial bruto), y la reconstrucción se omite cuando la huella digital de la fuente no ha cambiado. Un segundo pase determinista promueve los elementos actuales a recuerdos semánticos vinculados a la fuente, reemplaza las versiones de proveedor cambiadas y conecta las entidades de calendario/curso al grafo del propietario. Este trabajo en segundo plano nunca retrasa una respuesta de chat.
El ejecutor continuo actualiza una ventana de Calendario de tres años semanalmente por defecto sin reemplazar el cursor incremental en vivo de Calendario. Canvas mantiene la lectura pequeña de próximos/faltantes en el intervalo de conector normal y escanea las tareas de cursos activos/completados accesibles solo una vez al día. Usa --calendar-history-days 0 para deshabilitar el historial de Calendario, o ajusta --calendar-history-interval y --canvas-history-interval cuando sea necesario. El mantenimiento de un solo disparo está disponible a través de calendar-history-sync --all-selected --days 1095 y academic-memory-rebuild.
El JSON en los resúmenes es una caché reemplazable, no el archivo canónico. Esto mantiene las exportaciones portátiles mientras preserva ediciones, cancelaciones, procedencia y comportamiento de olvido/corrección en SQLite. Por lo tanto, Cognee no es una fuente de verdad para Alfred hoy: sus ideas de recuperación de grafo/vector son útiles, pero su ingesta respaldada por LLM y su superficie adicional de runtime/base de datos son innecesarias para hechos deterministas de Calendario/Canvas. Puede evaluarse más tarde como un backend de recuperación opcional contra las mismas pruebas de memoria vinculadas a la fuente. alfred evaluation-status --window-days 30 resume comentarios de respuesta, resultados de recuperación de memoria, decisiones de propuesta de flujo de trabajo y promoción de candidatos implícitos—más qué fuentes de contexto estaban presentes cuando se registró cada voto (un punto de partida para "por qué esa respuesta era incorrecta", no prueba de causa). Misma página en la interfaz de administración. Nada aquí ejecuta un modelo, escribe una fila o cambia la clasificación. La salida no tiene contenido (resultados, recuentos, nombres de fuentes, IDs opacos), segura para pegar en un issue. Una métrica sin votos aún informa null, no 0.
El paso del agente se ejecuta entre la ingesta y la entrega, no como un conector. Cuando un transporte de chat está configurado, los conectores periódicos se ejecutan secuencialmente en un trabajador en segundo plano acotado, por lo que un lote largo de Calendario/Gmail/Canvas no puede detener el sondeo de Telegram. El sondeo largo del servidor de Telegram es de diez segundos por defecto; el presupuesto de lectura HTTP es solo dos segundos más largo, y un sondeo fallido se reintenta después de un segundo.
Aprendizaje persistente
Después de que se entrega una respuesta conversacional, Alfred ejecuta un pase de aprendizaje local:
remember that ...explícito se convierte en un recuerdo confirmado inmediatamente.Las preferencias, hechos de identidad y objetivos entran como candidatos en cuarentena y necesitan el mismo hecho en un evento de origen separado antes de la promoción.
Los candidatos sensibles nunca se auto-promueven; los secretos reconocibles no se almacenan; cada observación mantiene procedencia inmutable de evento de origen.
Los recuerdos confirmados relevantes para una solicitud van en el paquete de contexto. Los recuerdos candidatos, superados, rechazados, eliminados, sensibles y secretos no.
memory_correctpreserva la versión anterior.memory_feedbackregistra recuperaciones relevantes/irrelevantes/incorrectas como datos de evaluación de solo anexión y reordena solo recuerdos ya seleccionados para una consulta coincidente.
Telegram ya no pone botones de helpful / missing context / wrong context en cada respuesta. response_context todavía se almacena; un pase posterior debería inferir esas etiquetas de la conversación siguiente en lugar de pedir al propietario que las toque. Los votos existentes aún reordenan registros de Gmail o GitHub solo dentro de su nivel de prioridad determinista.
El historial de Calendario y Canvas usa una capa académica derivada. Los eventos de conector inmutables siguen siendo autoritativos. Después de la sincronización, Alfred deduplica las revisiones en resúmenes JSON diarios y perfiles de curso/calendario (exámenes, cuestionarios, tareas, eventos ordinarios), reteniendo cada ID de evento de origen. Las preguntas académicas recuperan unos pocos resúmenes coincidentes en lugar de escanear el historial bruto; la reconstrucción se omite cuando la huella digital de la fuente no cambia. Un segundo pase promueve los elementos actuales a recuerdos semánticos vinculados a la fuente, reemplaza las versiones de proveedor cambiadas y conecta las entidades de calendario/curso al grafo del propietario. Esto nunca retrasa una respuesta de chat.
El ejecutor actualiza una ventana de Calendario de tres años semanalmente por defecto sin reemplazar el cursor incremental en vivo de Calendario. Canvas mantiene próximos/faltantes en el intervalo normal y escanea las tareas de cursos accesibles una vez al día. --calendar-history-days 0 deshabilita el historial de Calendario; --calendar-history-interval y --canvas-history-interval lo ajustan. De un solo disparo: calendar-history-sync --all-selected --days 1095 y academic-memory-rebuild. El JSON de resumen es una caché reemplazable, no el archivo canónico—las ediciones, cancelaciones, procedencia y olvido/corrección permanecen en SQLite. Cognee no es una fuente de verdad; puede evaluarse más tarde como un backend de recuperación opcional contra las mismas pruebas de memoria vinculadas a la fuente.
Como un servicio real de Windows (sobrevive al cierre de sesión/reinicio)
alfred-service empaqueta exactamente el mismo bucle como un servicio de Windows, independiente de cualquier sesión iniciada, usando las opciones de recuperación propias de Windows para reiniciar en caso de fallo. Es un envoltorio delgado, no una ruta de código separada: impulsa la lógica idéntica de construcción/limpieza que usa alfred run, construida a partir de argumentos analizados por el mismo analizador.
# 1. Store the exact 'alfred run' arguments the service will launch.
.\.venv\Scripts\alfred service-configure run --pair 123:456 --chat-id 123
# 2. Install and start the service (requires an Administrator prompt).
.\.venv\Scripts\alfred-service --username ".\<your-windows-username>" --password "<your-windows-password>" install
.\.venv\Scripts\alfred-service start--username/--password no son opcionales. Cada credencial de conector vive en el Administrador de credenciales protegido por DPAPI de tu cuenta de Windows, que solo la sesión de inicio de sesión de tu propia cuenta puede descifrar. Instalar sin --username (o mediante el valor predeterminado del complemento MMC de Servicios) se ejecuta como LocalSystem: el servicio se instalará y arrancará "correctamente" y luego morirá de inmediato con missing local credential-store secret: .... Las opciones deben preceder al verbo; getopt deja de analizar en el primer argumento que no es una opción, por lo que alfred-service install --username ... ignora silenciosamente las banderas. La contraseña es visible en el historial del shell una vez escrita de esta manera; bórrala después (Clear-History y/o elimina la línea correspondiente de (Get-PSReadLineOption).HistorySavePath), o usa el complemento MMC de Servicios (services.msc → Alfred Personal Secretary → pestaña Iniciar sesión) para configurar la cuenta sin que toque un shell.
alfred-service debug ejecuta la lógica del servicio en tu consola actual en lugar de bajo el SCM, imprimiendo las excepciones directamente en lugar de enrutarlas a través de Get-WinEvent.
Compruébalo con Get-Service Alfred, detenlo con .\.venv\Scripts\alfred-service stop y elimínalo con .\.venv\Scripts\alfred-service remove. Cambiar los argumentos configurados (volver a ejecutar service-configure) requiere un restart para que surta efecto. Opcionalmente, configura el reinicio automático ante un fallo inesperado—los servicios de Windows no reintentan por defecto—con:
sc.exe failure Alfred reset= 86400 actions= restart/60000alfred-service necesita pywin32, que ya se incluye de forma transitiva con el paquete mcp en Windows; si la importación falla, ejecuta python .\.venv\Scripts\pywin32_postinstall.py -install una vez. Instalar, iniciar, detener y eliminar el servicio son acciones de Administrador que ejecutas tú mismo—Alfred nunca se eleva ni se registra por sí solo.
Reiniciar Alfred desde tu teléfono
Cuando Alfred está en ejecución, Telegram acepta tres comandos de operador desde chats emparejados:
/status— ¿está vivo el bucle y cuándo fue su último ciclo?/restart— reinicia ahora/wake— igual que/restartcuando Alfred está caído
Registra el watchdog una vez (PowerShell de Administrador, después de service-configure):
.\scripts\register-watchdog.ps1Eso crea dos entradas del Programador de tareas:
AlfredWatchdog — cada cinco minutos, ejecuta
alfred watchdog-check. Si el latido está obsoleto, reinicia el servicio de Windows (o recurre al comandoalfred runconfigurado desde.alfred/service.json) y hace una consulta a Telegram para/wakeo/restart.AlfredRestart — reinicio bajo demanda utilizado por
/restarty el watchdog, con los privilegios más altos para que tu teléfono no necesite un aviso de Administrador cada vez.
El ejecutor escribe un latido en cada ciclo, por lo que un proceso colgado o muerto se detecta automáticamente en unos minutos incluso si no haces nada. Cuando Alfred está completamente detenido, envía /wake desde Telegram; la siguiente pasada del watchdog lo ve y vuelve a arrancar Alfred.
Grafo de memoria local
alfred remember "statement" almacena una memoria local confirmada; alfred memory-search "query" devuelve anclas FTS más un salto de grafo activo. Las correcciones nunca reescriben el historial: alfred memory-correct --memory-id ID "corrected statement" marca la memoria antigua como superada y crea una nueva que apunta de vuelta a ella.
Eliminar es previsualizar-y-confirmar, porque eliminar datos es confirmación fuerte y nunca sin supervisión. alfred memory-forget-propose --memory-id ID --actor nico [--reason "..."] previsualiza una eliminación de un solo elemento con alcance. Apruébala y luego alfred memory-forget-execute marca la memoria como eliminada, la retira de la búsqueda y registra una entrada de auditoría. Una memoria superada permanece visible como historial hasta que se elimina por separado.
alfred memory-alias --entity-id ID "Alternate Name" añade un nombre alternativo buscable—memory-search lo encuentra por cualquiera de los dos nombres inmediatamente después.
alfred memory-rename --entity-id ID "Real Name" cambia cómo se llama realmente una entidad. Las personas descubiertas desde tu calendario llegan etiquetadas con lo que Google haya proporcionado, que a veces es solo una dirección de correo electrónico; así es como lo arreglas. La etiqueta antigua se conserva como alias, por lo que los [[wiki links]] existentes siguen funcionando—renombrar no es olvidar.
Alfred completa los nombres por su cuenta cuando puede: si la dirección de calendario de alguien también aparece como remitente de Gmail con un nombre para mostrar, la siguiente sincronización de people lo adopta. Gmail solo se lee para nombres, nunca para decidir que alguien existe—tu bandeja de entrada es sobre todo marcas, y un nombre para mostrar allí es marca más que identidad.
Bóveda de Obsidian
alfred vault-export-entity --entity-id ID y alfred vault-export-memory --memory-id ID (ambos aceptan --vault PATH, por defecto alfred-vault) proyectan un registro del grafo en Generated/—Markdown simple y portátil con un alfred_id y managed: true en el frontmatter. Un archivo editado a mano en esa ruta nunca se sobrescribe silenciosamente; se conserva y la proyección se convierte en su lugar en una copia .alfred-conflict-<timestamp>.md para revisión.
Las exportaciones masivas seleccionan un conjunto en lugar de un solo registro:
.\.venv\Scripts\alfred vault-export-source-event --source-event-id ID
.\.venv\Scripts\alfred vault-export-range --since 2026-03-01 --until 2026-04-01
.\.venv\Scripts\alfred vault-export-topic "rowing" --limit 50
.\.venv\Scripts\alfred vault-export-person --entity-id IDvault-export-person define "sobre una persona" estructuralmente: una memoria es sobre alguien cuando proviene de un evento que organizó, no cuando su nombre aparece en el texto. La coincidencia de texto trataría "comida cerca de la oficina de Robin" como una memoria sobre Robin—tolerable para una exportación, incorrecto para una eliminación, y este selector sirve para ambos. Encuentra el ID de la entidad con alfred memory-search "<name>".
--since/--until filtran por cuándo Alfred registró una memoria, no por cuándo el hecho se hizo realidad. El rango es semiabierto (--since inclusivo, --until exclusivo) para que los meses consecutivos no reclamen ambos una memoria en el límite. Cualquiera de los dos límites puede omitirse para un rango abierto, pero no ambos. El selector de tema ejecuta la misma búsqueda que haría una pregunta. Cada exportación masiva escribe solo memorias confirmadas, public/personal; cualquier cosa omitida se informa por ID en lugar de descartarse silenciosamente. El recibo de una exportación por tema registra que fue una exportación por tema, nunca la consulta que escribiste.
alfred vault-import --vault PATH lee en la otra dirección: cualquier nota creada por el usuario en cualquier parte de la bóveda (no solo en Generated/) se convierte en una memoria confirmada y respaldada por evidencia. Es un escaneo que invocas periódicamente—mediante la CLI, o automáticamente como conector cuando se le da --vault a alfred run—no un vigilante de archivos a nivel de sistema operativo. Alfred nunca escribe de vuelta en un archivo importado; la detección de cambios se rastrea en la base de datos de Alfred mediante hash de contenido, por lo que editar una nota supera su memoria y eliminar una nota del disco no elimina la memoria que produjo—solo forget hace eso. Los archivos que el propio Alfred generó (managed: true) nunca se reimportan como testimonio.
La importación también lee [[wiki links]] (incluyendo [[Note|display]] y [[Note#Heading]]). Cuando un enlace nombra exactamente una entidad que Alfred ya conoce—por etiqueta o alias, sin distinguir mayúsculas—se registra como evidencia de que esa nota concierne a esa entidad. Un nombre desconocido no crea ninguna entidad, un nombre ambiguo se resuelve a nada en lugar de adivinar entre dos entidades "Alex", y no se crea ninguna arista de relación. El resultado informa de linked y unresolved_links.
Sincronización móvil opcional
Alfred no usa Obsidian Sync de pago. deploy/couchdb/ configura el servicio CouchDB autoalojado; lee deploy/couchdb/README.md antes de ejecutarlo. El propio código de Alfred nunca sincroniza la bóveda con un teléfono; un plugin de la comunidad de Obsidian, de código abierto y verificado (Self-hosted LiveSync), lo hace completamente del lado del cliente, replicando solo alfred-vault/, nunca alfred.db, secretos o registros. alfred vault-sync-status --url http://127.0.0.1:5984 confirma que el lado del servidor es accesible.
Servidor MCP
alfred-mcp ejecuta el servidor MCP stdio de Alfred para Claude Desktop/Code, Cursor y otros clientes MCP locales. Cada herramienta es denegada por defecto: un cliente no recibe nada hasta que se le concede explícitamente, p. ej. alfred client-grant --client-id local-mcp --sensitivity public --sensitivity personal --tool memory_search --tool remember --tool forget --tool calendar_event_propose --tool message_draft --tool action_commit --tool brief_get --tool connector_status --allow-write. alfred-mcp --client-id <id> lo ejecuta bajo una identidad diferente (por defecto: local-mcp) para que un segundo cliente stdio—por ejemplo el Secure MCP Tunnel de OpenAI—obtenga su propia concesión con alcance separado.
Herramientas actuales: system_status, agenda_get, memory_search, profile_get, remember, forget, calendar_event_propose, message_draft, action_commit, brief_get, connector_status, task_upsert, task_complete y reminder_set—las 12 herramientas documentadas de la sección 7, más system_status y calendar_event_propose (que action_commit necesita, ya que la sección 7 nunca nombra una herramienta para previsualizar una escritura de calendario). remember/forget además comprueban la sensibilidad de la memoria solicitada contra el propio alcance del cliente, por lo que un cliente con solo public/personal no puede escribir ni borrar una memoria secret ni siquiera con --allow-write.
forget, calendar_event_propose, message_draft y message_send_propose solo previsualizan. action_commit realiza lo que una llamada de herramienta anterior previsualizó, una vez que se le da un token de aprobación nuevo. Deliberadamente no hay ninguna herramienta MCP para aprobar uno. action_commit acuña un token de acceso de Google nuevo por sí mismo al finalizar una escritura de calendario, un borrador de Gmail o un envío de Gmail; no se almacena nada en caché. Los envíos de Gmail siguen siendo acciones explícitas, de aprobación única y controladas, y nunca se ejecutan desde la sincronización o un trabajo programado.
Propuestas de flujos de trabajo repetidos
Cuando Hermes está habilitado, Alfred realiza un escaneo local de flujos de trabajo una vez al día. Busca la misma secuencia exitosa de dos a ocho herramientas al menos tres veces en dos días. Almacena solo metadatos estructurales: nombres de herramientas, nombres de argumentos y etiquetas de enrutamiento en lista blanca, como el tipo de conector. No almacena prompts, cuerpos de correo, títulos de tareas o eventos, personas, direcciones, fechas, identificadores ni valores de argumentos arbitrarios. Los turnos fallidos y los turnos que contienen action_commit no son elegibles.
.\.venv\Scripts\alfred workflow-scan
.\.venv\Scripts\alfred workflow-list --state pending
.\.venv\Scripts\alfred workflow-show --version-id <ID>
.\.venv\Scripts\alfred workflow-accept --version-id <ID>
.\.venv\Scripts\alfred workflow-reject --version-id <ID>Cada sugerencia es un SKILL.md inerte y versionado más un diff unificado y un registro de revisión con caducidad. Aceptar el diff registra esa decisión, pero esta primera versión no puede activar ni ejecutar una habilidad generada; el aprendizaje sin supervisión puede producir material de revisión pero no puede modificar el perfil de Hermes. Las instantáneas JSON diarias sin procesar de Calendar/Canvas no se usan aquí: sus registros fuente normalizados ya preservan la procedencia y el historial de cambios.
Streamable HTTP (clientes remotos/privados)
alfred-mcp es solo stdio. Para un cliente que no puede lanzar un proceso local—o que debería ejecutarse como una identidad separada de local-mcp—alfred mcp-http-run --client-id <id> sirve la misma superficie de herramientas sobre Streamable HTTP en http://127.0.0.1:8000/mcp. El host no es configurable: esto se vincula solo a loopback. <id> necesita su propio client-grant primero, exactamente como un cliente stdio.
Cada solicitud debe llevar Authorization: Bearer <token>, verificado fuera del manejo de solicitudes propio de FastMCP para que un llamador no autenticado ni siquiera pueda abrir una sesión. Genera ese token una vez con alfred mcp-http-token-generate (se niega a sobrescribir uno existente, igual que backup-key-generate); se almacena en el almacén de credenciales del sistema operativo, nunca en un archivo de configuración. Es un único secreto compartido, no OAuth—OAuth 2.1/RFC 9728 está reservado para el acceso remoto público, una empresa separada que esto no intenta. FastMCP también activa automáticamente la protección contra DNS-rebinding (validación de cabeceras Host/Origin) siempre que el host sea loopback, que aquí siempre es el caso.
ChatGPT (Secure MCP Tunnel)
ChatGPT no puede conectarse directamente a un servidor MCP local como hacen Claude Desktop/Cursor por stdio, por lo que el Secure MCP Tunnel de OpenAI es la vía de acceso privado: un retransmisor de solo salida a través del daemon tunnel-client de OpenAI, ejecutado por ti, que Alfred no distribuye ni reimplementa. Consulta deploy/openai-tunnel/README.md para el tutorial: crear un túnel y un permiso de cliente con alcance limitado, y luego apuntar tunnel-client a alfred-mcp --client-id chatgpt-tunnel por stdio (deliberadamente no al transporte Streamable HTTP anterior, para evitar conciliar dos esquemas de autenticación). El que tu plan de ChatGPT admita conectores MCP personalizados o no es un asunto entre tú y OpenAI.
Panel de administración
alfred admin-ui-run sirve un pequeño panel web de solo lectura: la agenda de hoy, las aprobaciones pendientes, la salud de los conectores, las señales de evaluación y el historial de auditoría reciente, en http://127.0.0.1:8200. Una página por tema, sin acciones de escritura (aprobar sigue pasando por alfred approval-approve, nunca por un botón en esta página). Sin fuentes ni iconos de CDN; funciona sin red.
.\.venv\Scripts\alfred admin-ui-token-generate
.\.venv\Scripts\alfred admin-ui-runPor defecto, solo acepta loopback como mcp-http-run, pero a diferencia de este, --host es una opción real: está pensado para que lo mire una persona, a veces desde el teléfono. 127.0.0.1 no es accesible desde otro dispositivo ni siquiera a través de una VPN; para consultarlo desde tu teléfono, ejecuta alfred admin-ui-run --host <this-PC's-VPN-IP> (una IP de Tailscale, por ejemplo—tailscale ip -4), nunca --host 0.0.0.0 a menos que ya tengas reglas de firewall que restrinjan quién puede llegar al puerto. Funciona en cualquier navegador moderno; el diseño se reorganiza para una pantalla de ancho de teléfono y usa la fuente del sistema (Segoe UI en Windows, San Francisco en Safari/iOS).
La autenticación es el mismo token bearer que mcp-http-run, pero se entrega de otra forma: visitar cualquier página sin él redirige a una pantalla de inicio de sesión; al introducir el token allí se establece una cookie HttpOnly, SameSite=Strict cuyo valor es el token (sin almacén de sesión separado). El acceso mediante scripts/API todavía puede enviar Authorization: Bearer <token> directamente y omitir la cookie.
Búsqueda vectorial local (opcional)
MemoryGraph acepta un embedding_provider opcional. Sin uno, memory-search sigue siendo solo de palabras clave con FTS5. Con uno—por ejemplo alfred.embeddings.OllamaEmbeddingProvider, apuntando a un Ollama local—remember, memory-correct y forget también mantienen un vector versionado por memoria en la tabla embeddings, y memory-search incorpora coincidencias vectoriales cercanas (dentro de un límite de distancia coseno) una vez que se agotan los resultados por palabras clave. Los vectores tienen espacio de nombres por nombre de modelo, de modo que probar un modelo de embedding distinto nunca mezcla espacios incomparables; cambiar de modelo implica volver a generar los embeddings, no migrar datos. Ejecuta memory-embed-backfill --model nomic-embed-text para una reconstrucción de una sola vez, o pasa --embedding-model nomic-embed-text a alfred run para un mantenimiento local continuo.
Inferencia local de modelos (opcional)
alfred.models.OllamaClient es generación de texto local-first: apúntalo a un Ollama en ejecución y llama al endpoint /api/generate sin streaming, devolviendo el texto junto con los recuentos de tokens de prompt y completado propios de Ollama. BriefingService acepta un llm_writer opcional; sin uno, write_brief() es simplemente render()—el texto determinista, sin cambios. Con uno, el modelo solo reescribe la redacción de la salida determinista; cada hecho, fecha y enlace que ve procede de ese texto, nunca del conocimiento propio del modelo, y si el modelo falla o no es accesible, vuelve a la salida determinista en lugar de costarle al usuario su informe. Cada pasada se audita con sus recuentos de tokens. Nada en la CLI, el servidor MCP o el ejecutor de trabajos conecta un escritor en vivo de forma predeterminada.
También se han implementado piezas de nube: alfred.models.OpenAICompatibleClient y AnthropicCompatibleClient usan los formatos de OpenAI chat-completions y de Anthropic Messages API, respectivamente, pero ninguna debe construirse sin envolver: envuelve cualquiera de ellas en GuardedCloudProvider primero, que impone:
Redacción.
Redactordepura los patrones comunes de secretos/PII (correos electrónicos, tokens bearer, patrones de claves de OpenAI/GitHub/Slack/AWS, números de la Seguridad Social, series de dígitos similares a tarjetas, números de teléfono) del texto del prompt y del sistema antes de que cualquiera de ellos llegue al proveedor de nube. Es una limpieza de patrones de mejor esfuerzo, no una garantía: mantén el contenido realmente etiquetado comosecretfuera de un prompt de nube, en lugar de confiar en que esto lo detecte.Tope mensual duro, con fallo cerrado.
monthly_budget_usdes0.0por defecto, por lo que unGuardedCloudProviderno configurado no realiza ninguna llamada al exterior. Cada llamada comprueba el gasto acumulado en lo que va de mes (sumado a partir de sus propios registros de auditoría) antes de llamar; una vez que ese gasto está ya en el tope o por encima, lanzaCloudBudgetExceeded. Esto comprueba el tope antes de cada llamada, no un límite máximo por llamada: una sola llamada muy grande puede aun así superar el total.Seguimiento de costes. Cada llamada, tenga éxito o falle, se audita con el nombre del modelo, los recuentos de tokens de prompt/completado y un coste estimado en USD (a partir de un
CloudPricingproporcionado por el operador, ya que este módulo no fija ninguna tabla de precios de proveedor)—nunca el texto sin procesar del prompt ni de la respuesta. Ese historial de auditoría sirve también como el libro de gastos del que lee el requisito 2.
Al igual que con Ollama, nada en la CLI, el servidor MCP o el ejecutor de trabajos construye un proveedor de nube de forma predeterminada: un operador lo incorpora desde su propia configuración cuando lo desea.
Reglas de desarrollo
Lee ARCHITECTURE.md antes de cambiar el comportamiento.
Mantén la base de datos como fuente de verdad; los transportes no contienen lógica de negocio.
No coloques credenciales, datos personales sin procesar ni bases de datos locales en Git.
Cada herramienta MCP está controlada por
PolicyStore; un cliente no registrado o con un alcance limitado no recibe nada por defecto. Las acciones con efectos importantes en la superficie MCP solo pueden crear vistas previas; una persona debe aprobarlas fuera de ese cliente MCP antes de queaction_commitpueda ejecutar la vista previa aprobada exacta.
Consulta CONTRIBUTING.md para el flujo de trabajo completo de configuración local, pruebas y PR; SECURITY.md para informar de una vulnerabilidad de forma privada; y RELEASING.md junto con CHANGELOG.md para saber cómo se lanza y verifica una versión.
Licencia
Apache-2.0. Consulta LICENSE.
Available Tools
33 toolsaction_commitBDestructiveIdempotent
Consume a fresh approval token and perform the action it previewed.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | ||
| approval_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructive and idempotent behavior, so the description does not need to repeat those. It adds the useful behavioral fact that the token is consumed and must be fresh, and that the action was previously previewed, but it does not describe failure behavior or post-consumption consequences.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler. It conveys the action, the key precondition, and the source of the action in just nine words, which is appropriately concise for a simple two-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has only two primitive string parameters, no output schema, and annotations already cover destructive/idempotent/open-world aspects. The description establishes the critical precondition (fresh token) and the effect (perform previewed action), which is sufficient for this low-complexity commit tool, though it could still mention what happens if the token is stale.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the tool description must compensate for undocumented parameters. It only loosely clarifies the token as an 'approval token' and provides no additional meaning for approval_id or how the two fields relate, leaving a real gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly says the tool consumes an approval token and executes the action that was previewed, which identifies a specific commit/execute role in an approval flow. It does not explicitly name a sibling alternative, but the distinction from the many propose/draft siblings is implicit and adequate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'consume a fresh approval token' implies this is the step to run after an approval has been obtained, and this is useful guidance. However, the description does not explicitly say when not to use it or name alternatives such as proposal or draft tools, leaving some inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
agenda_getARead-only
Return Alfred's deterministic local task agenda with freshness.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description does not need to restate that. It adds the behavioral context of 'deterministic' and 'local', which is useful, but 'with freshness' is vague and does not disclose what freshness means or how it affects results. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, compact sentence that states exactly what the tool does. No filler or redundant phrasing, and the core message is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless, read-only tool with an output schema present, the description is mostly complete. The one gap is the ambiguous 'with freshness' clause, which could be interpreted as return freshness metadata or a guarantee of up-to-date data. Overall the agent can invoke it correctly without further information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there are no parameter details to document. The baseline for 0 parameters is 4; the description does not add parameter information but does not need to since none exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Return') and names a clear resource ('Alfred's deterministic local task agenda'), which distinguishes it from sibling tools like system_status or memory_search. The qualifiers 'deterministic' and 'local' further pin down what this tool uniquely provides.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus its many siblings. No mention of conditions, alternatives, or exclusions. The agent is left to infer that agenda_get is for reading Alfred's task agenda, but not when that is preferable to task_complete or availability_get.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
availability_getARead-only
Find free gaps in the synced Google Calendar over the next few days.
Timed events block the day; all-day events are listed as ambiguous
context rather than busy hours. Overlapping meetings merge before gaps
are computed. timezone is an IANA name; default working hours are
09:00–17:00 local.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| timezone | No | UTC | |
| min_minutes | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses several non-obvious behaviors beyond the readOnlyHint annotation: timed events block the day, all-day events are ambiguous context, overlapping meetings merge before gap computation, and default working hours are 09:00–17:00 local. This materially helps an agent interpret results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded, with each sentence adding behavioral or parameter meaning. There is no filler or repetition of schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only search tool with an output schema and annotations, the description covers important edge cases: all-day events, overlap merging, timezone handling, and working-hour defaults. Nothing critical is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It clarifies timezone as an IANA name and links days to the next-few-days horizon, but it never explicitly defines min_minutes as the minimum free-gap duration, leaving one parameter under-specified.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Find free gaps in the synced Google Calendar.' It clearly differentiates availability lookup from siblings like agenda_get or calendar_event_propose by focusing on gap detection rather than event listing or proposal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: finding open time slots in a synced calendar. It does not explicitly name alternatives or exclusion conditions, but the context is strong enough for an agent to select it appropriately among the listed siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
brief_getARead-only
Render the deterministic local morning brief on demand, not just on schedule.
| Name | Required | Description | Default |
|---|---|---|---|
| now | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint already establishes the tool is safe to call, and the description adds useful behavior: the output is deterministic, local, and generated on request rather than by schedule. This goes beyond the annotation without contradicting it. Return details are covered by the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single tight sentence with the core action front-loaded and the scheduling contrast in a short secondary clause. Every phrase contributes meaning and there is no redundant restatement of the tool name or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity, read-only tool with no required parameters and an existing output schema, the description covers purpose and usage well. The only meaningful omission is the optional 'now' parameter, but it has a sensible default and is not required for normal invocation, so the definition is still largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description needed to explain the lone 'now' parameter — its format, meaning, and how null behaves. The word 'deterministic' hints that 'now' controls the evaluation time, but the description never explicitly mentions or documents the parameter, leaving a real invocation gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Render') and a distinct resource ('the deterministic local morning brief'), and clarifies the invocation mode ('on demand, not just on schedule'). This gives the tool an identity separate from sibling tools like agenda_get or journal_get.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states when to use the tool: whenever an on-demand morning brief is needed instead of waiting for the scheduled one. It does not name explicit alternatives or when-not-to-use conditions, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calendar_event_proposeA
Preview a calendar event write; nothing reaches Google until action_commit confirms it.
start and end must be ISO 8601 timestamps, not phrases. The owner says "tomorrow from 10:30 am"; resolve that against the current time given above and pass 2026-08-20T10:30:00-04:00.
calendar_id accepts the name the owner uses -- "family car", "Dunlap Family" -- as well as a real Google id. Pass whatever calendar they named; it is resolved here, and an unknown or ambiguous name comes back as an error listing the writable calendars rather than guessing.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | ISO 8601 timestamp, e.g. 2026-08-20T10:30:00-04:00. Not a phrase. | |
| start | Yes | ISO 8601 timestamp, e.g. 2026-08-20T10:30:00-04:00. Not a phrase. | |
| summary | Yes | ||
| calendar_id | No | primary |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by disclosing that no external write happens until confirmation, that natural-language date phrases must be resolved to ISO 8601 timestamps, and that calendar_id accepts both friendly names and real Google ids. It also reveals the error behavior for unknown or ambiguous calendar names: return a list of writable calendars rather than guessing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well structured: the opening sentence delivers the core purpose immediately, and the following paragraphs each add a distinct operational detail needed for correct invocation. There is no filler or repetitive explanation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the safety model, the timestamp requirements, calendar_id resolution behavior, and failure behavior. It does not describe what a successful preview response contains, but for a preview tool whose main contract is 'no side effects until commit,' this is only a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%, so the description compensates by adding meaning to start, end, and calendar_id. It explains timestamp formatting and resolution, and it clarifies how calendar names are handled. Only summary lacks explicit guidance, though its purpose is reasonably inferable from the context.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action and resource: 'Preview a calendar event write.' It also explains the two-phase nature by stating that nothing reaches Google until action_commit confirms, which clearly distinguishes this preview tool from a direct commit or create tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is clear: this is the preview step before action_commit, and the description gives practical instructions for resolving date phrases and passing calendar names. It does not explicitly enumerate when not to use it, but the context and sibling name action_commit make the workflow unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
composio_connectA
Return a Composio Connect Link so the owner can sign into an overflow app.
Open the URL, finish sign-in, then retry the original request. Not for Gmail/Calendar/GitHub/Slack/Telegram/Fitbit.
| Name | Required | Description | Default |
|---|---|---|---|
| toolkit | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that the tool returns a user-facing link and that the sign-in flow is interactive: the owner must open the URL and complete sign-in before retrying. This is important behavioral context. It does not mention side effects or connection state changes, but the annotations do not contradict the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three terse sentences with no filler: purpose is front-loaded, then the required follow-up workflow, then the exclusions. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one parameter and no output schema, the description covers the interactive flow and exclusions well. However, it omits valid toolkit values and doesn't explain how to verify the connection after sign-in, so an agent could still invoke it with an unsupported toolkit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, 'toolkit', has no schema description (0% coverage), and the description never explicitly explains what to pass. The exclusion list implies it selects an integration, but no valid values or examples are given, so an agent may not know what to pass for an allowed app.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb ('Return') and resource ('Composio Connect Link') with a clear purpose: letting the owner sign in to an app. The phrase 'overflow app' is somewhat vague, and it doesn't explicitly differentiate from sibling Composio tools, so it isn't a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear workflow: open the returned URL, finish sign-in, then retry the original request. It also gives a concrete exclusion list ('Not for Gmail/Calendar/GitHub/Slack/Telegram/Fitbit'). It stops short of naming alternative sibling tools or conditions for when to use composio_status or composio_execute instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
composio_executeA
Run a Composio read now, or preview a write for Telegram approval.
arguments_json is a JSON object matching the tool's input fields from
composio_search. Writes return needs_approval; never call action_commit.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | ||
| arguments_json | No | {} |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint and other annotations all false, the description carries the burden of disclosing behavior. It adds valuable detail: reads execute immediately, writes are only previewed for Telegram approval, and action_commit must not be called. It stops short of explaining the post-approval flow, but the core behavioral warning is present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences with no filler. The purpose is front-loaded, and the critical warning about action_commit is placed last without diluting the main instruction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with no output schema, the description covers the execution mode, the argument source, and the approval/commit warning. Missing slug semantics and read return behavior are minor gaps but leave some ambiguity for an agent that lacks broader Composio context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains arguments_json as a JSON object matching input fields from composio_search, which is useful, but it does not explain slug beyond its name or how to obtain a valid slug. The compensation is incomplete.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: run a Composio read now, or preview a write for Telegram approval. It also distinguishes itself from the sibling action_commit by explicitly saying never call action_commit, so the agent can tell its role apart from related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives actionable context: arguments_json should match fields from composio_search, writes return needs_approval, and action_commit should not be called. It does not fully spell out the complete search-then-execute flow, but the usage context is clear enough to route an agent correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
composio_searchARead-only
Find overflow-app tools on Composio's free tier (Notion, Spotify, Linear, …).
Do not use this for Gmail, Calendar, GitHub, Slack, Telegram, or Fitbit — those are first-party Alfred connectors. Returns slugs, whether they write, and required argument names. Then call composio_execute with a slug.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| toolkit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false. The description adds that results include slugs, whether the tool writes, and required argument names, which goes beyond the annotations. It does not discuss rate limits or auth, but for a read-only search tool this is a minor gap, not a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it states the purpose first, gives exclusions, and closes with the exact follow-up action. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only search tool, the description covers purpose, exclusions, return contents, and the next step, which is sufficient for an agent to invoke it correctly. The only material gap is the unexplained optional toolkit parameter, which prevents a perfect score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the semantic load for the parameters. It does not explain what 'query' should contain beyond the general search context, and it entirely ignores the 'toolkit' parameter, which is undocumented in both the schema and the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and target: 'Find overflow-app tools on Composio's free tier' with concrete examples. It also distinguishes the tool from first-party Alfred connectors and from composio_execute, the follow-up call, so an agent can tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when not to use this tool: 'Do not use this for Gmail, Calendar, GitHub, Slack, Telegram, or Fitbit' because those are first-party Alfred connectors. It also names the next step, composio_execute, and says to call it with a slug.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
composio_statusARead-only
Show Composio connected accounts and this UTC month's free-tier usage.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description is consistent with the readOnlyHint=true annotation and adds useful context beyond it: the specific UTC month scope and what the tool reports. No destructive or mutating behavior is suggested.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One concise sentence that front-loads the resource and delivers the complete meaning. There is no filler or redundant restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only status tool with no output schema, the description fully specifies what the agent can expect. Nothing needed to decide whether to call it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters, so the description carries no parameter burden. Baseline for zero-parameter tools is 4, and the description correctly specifies the tool's informational output.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Show') with a clear resource and scope: Composio connected accounts plus this UTC month's free-tier usage. This distinguishes it from sibling tools like composio_search, composio_execute, and composio_connect.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use case is clear: call this tool when reporting on Composio connected accounts or current monthly free-tier usage. It does not explicitly name alternatives or exclusions, but the zero-parameter read-only status nature makes the context sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connector_records_getARead-only
Return one connector's currently-active synced records, most recently observed first.
brief_get/agenda_get already fold calendar events, GitHub notifications, and Canvas missing assignments into one ranked digest, but nothing else exposes a connector's raw synced content directly -- for example gmail-sync's unread-message records (subject/from/snippet) never reach an MCP caller otherwise. This reads the same connector_records table every sync already writes to (ConnectorRecordStore), so it needs no new storage or sync logic.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| connector | Yes | ||
| record_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds behavioral context beyond that: it reads the connector_records table that syncs write to, requires no new storage or sync logic, and returns only currently-active records in reverse chronological order. This is useful and consistent with the read-only annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is a clear, front-loaded definition of behavior. The following paragraph is somewhat long but each sentence serves a purpose: differentiating from sibling tools and clarifying that no new storage or sync logic is needed. It is appropriately detailed without filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool, the description covers what it returns, ordering, data source, and how it differs from digest tools. However, because schema-level parameter documentation is entirely absent and the description does not define record_type or limit semantics, an agent may still be uncertain how to correctly invoke the tool for a specific record type.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no descriptions (0% coverage), and the description does not explain the limit or record_type parameters, their defaults, or accepted values. It only clarifies the connector scope and gives one example involving gmail-sync unread-message records, leaving the agent to guess how filtering and limiting actually behave.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and resource: 'Return one connector's currently-active synced records, most recently observed first.' It also explicitly contrasts this tool with brief_get and agenda_get, positioning it as the only direct accessor of raw connector content, so it is clearly distinguishable from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context by stating that brief_get/agenda_get provide a folded digest, while this tool exposes raw synced records directly. It doesn't explicitly say 'use this when you need raw records and use brief_get/agenda_get when you need a digest,' but the contrast is strong enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connector_statusARead-only
Report each connector's health; never its credentials or synced content.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, covering the tool's non-mutating nature. The description adds a useful behavioral guarantee beyond annotations: the report excludes credentials and synced content, which is important contextual information for an agent. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that front-loads the operation and resource, then immediately constrains the scope with a clear exclusion. Every word contributes meaning; there is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless, read-only status tool with an output schema, the description is complete. It states what is reported, what is deliberately excluded, and the annotations cover mutability. No critical information needed to invoke the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters and schema coverage is 100%, so there is no missing parameter documentation to compensate for. The description reinforces the no-argument aggregate nature by saying 'each connector's health' rather than implying a single-connector filter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Report each connector's health') and clarifies what the report will never contain ('credentials or synced content'). It clearly states the tool's purpose, though it does not explicitly name sibling tools like composio_status or connector_records_get to sharpen differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'never its credentials or synced content' provides an explicit when-not boundary, steering agents away from using this tool for credential or content retrieval. However, it does not name alternative tools or state when to prefer this tool over system_status or composio_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
forgetA
Preview deleting one memory; nothing is deleted until action_commit confirms it.
Decision 8 classifies deleting data as strong-confirm, never unattended, so an MCP client -- which can call tools without a human watching in the moment -- cannot delete in a single call.
| Name | Required | Description | Default |
|---|---|---|---|
| reason | No | user requested deletion | |
| memory_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that despite the name 'forget', this tool is not destructive by itself and that deletion is deferred until action_commit confirms. It adds meaningful policy context about strong-confirm and unattended MCP clients, which is especially valuable given destructiveHint=false could otherwise be confusing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is clear and front-loaded with the core behavior, and the second provides important policy context. The phrasing is a bit verbose and relies on unexplained 'Decision 8' jargon, but every sentence contributes meaningful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description explains the critical two-phase behavior and client safety constraint, but it omits details about what the preview response looks like, what happens to pending deletions before commit, and how the reason parameter is used. Since there is no output schema, additional behavioral detail would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain the meaning or usage of memory_id or reason. The tool's purpose implies memory_id identifies the memory, but reason is left entirely unexplained, so the description does not compensate for the missing parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Preview deleting') and resource ('one memory'), and immediately clarifies the key limitation that nothing is deleted until action_commit confirms it. This distinguishes the tool from action_commit and makes its role in the deletion workflow clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the two-phase workflow and explicitly warns that an MCP client cannot delete in a single call because deleting data is classified as strong-confirm. It does not enumerate alternatives, but it names action_commit as the confirming step, giving enough context for when to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
github_issue_proposeA
Preview a GitHub issue creation; nothing reaches GitHub until action_commit confirms it.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | ||
| title | Yes | ||
| repository | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite readOnlyHint=false, the description discloses that no external write reaches GitHup until a later commit — genuinely load-bearing context beyond what the annotations provide. This also aligns with destructiveHint=false and clarifies the non-idempotent preview trait. It doesn't cover auth requirements or failure modes, but the core safety trait is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero waste, front-loading the primary purpose ('Preview a GitHup issue creation') and then the critical behavioral caveat. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter tool with no output schema, the description covers purpose, the preview/commit boundary, and names the committing sibling. A minor gap is that it doesn't hint what the preview returns (e.g., a proposal to hand to action_commit), but the simple parameter set and annotations keep this adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden. It contextualizes repository/title/body as the components of a GitHup issue and implies they will later be committed, but it adds no per-parameter format or constraint details (e.g., 'owner/repo' syntax). The parameter names are self-evident, making the gap moderate rather than severe.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Preview') and resource ('GitHup issue creation'), and the second clause ('nothing reaches GitHup until action_commit confirms it') sharply differentates it from the complementary sibling action_commit. An agent can immediately tell this is the staging step, not the publishing step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence explicitly places the tool in a two-phase workflow: preview here, confirm with action_commit. It names the sibling that completes the operation, which gives clear context for when to pair them. It does not enumerate when-not-to-use conditions, but the propose/commit boundary is explicit enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gratitude_recordA
Append a free-text gratitude journal entry.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false, so they do not convey safety or side effects. The description's 'Append' indicates a write operation, consistent with readOnlyHint=false, and it adds the 'free-text' qualifier, but it does not disclose persistence, error behavior, or any side effects beyond the obvious mutation. It neither adds rich context nor contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with zero waste. Every word contributes to clarity, and the action ('Append') is stated first. It is appropriately sized for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter append tool with no output schema, the description provides enough to call it correctly: it identifies the resource, the action, and the nature of the parameter. It omits any mention of return values or side effects, but given the tool's simplicity and absence of an output schema, this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. 'Free-text' clarifies that the 'text' parameter is the raw content of the journal entry with no formatting constraints, adding meaning beyond the bare string type. It does not specify limits or optionality beyond the required flag, but for a single free-text parameter this is adequate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Append') and resource ('gratitude journal entry'), clearly distinguishing it from siblings like mood_record (structured mood tracking) and journal_get (retrieval). The purpose is unambiguous and immediately actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as mood_record or journal_get. The simple action is implied, but the description does not explicitly state context or exclusions, leaving the agent to infer usage from the name and siblings alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
important_date_setA
Remember a birthday or other annual date and remind on that day each year.
Stored as an ordinary task (next occurrence as due_at) plus an annual
reminder job — not a separate calendar. The morning brief and weekly
window surface dates in the next seven days under Birthdays & dates.
timezone is an IANA name so the local morning of the date survives
daylight saving. year is optional and only used to say "turns N".
| Name | Required | Description | Default |
|---|---|---|---|
| day | Yes | ||
| kind | No | birthday | |
| year | No | ||
| label | Yes | ||
| month | Yes | ||
| chat_id | Yes | ||
| timezone | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds valuable behavioral detail beyond the annotations: it states that the date is stored as an ordinary task with a next-occurrence due_at plus an annual reminder job, and that dates surface in the morning brief under 'Birthdays & dates.' It also explains timezone behavior relative to daylight saving. This goes well beyond the minimal readOnly/destructive hints, though it does not disclose duplicate handling or update semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler: purpose, storage/surfacing behavior, and the two parameter clarifications that matter most. It is front-loaded with the primary use case and keeps supporting details compact. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given seven parameters, minimal annotations, and no output schema, the description covers the main operational context: recurrence model, where dates appear, timezone semantics, and year handling. It does not explicitly state what the response will be or how chat_id is used, but the overall behavior is clear enough for an agent to invoke it confidently in most cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does explain the two least obvious parameters: timezone is an IANA name and year is optional and only used for 'turns N.' However, label, month, day, chat_id, and kind are left to their names or schema defaults; in particular, kind values beyond 'birthday' are not specified even though 'other annual date' is mentioned.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Remember a birthday or other annual date and remind on that day each year.' It clearly differentiates from calendar_event_propose by stating 'not a separate calendar' and from important_dates_get by the set-vs-get relationship. The purpose is unambiguous and immediately useful for tool selection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear condition for use: recurring annual dates that should remind yearly. It implicitly excludes calendar events and one-off reminders by describing the storage as an ordinary task plus annual reminder job, and by mentioning the morning brief/weekly window. It does not explicitly name alternatives like reminder_set or calendar_event_propose, so the guidance is strong but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
important_dates_getARead-only
List upcoming birthdays and important dates inside the weekly window.
Defaults to seven days so a "what's coming up this week" question and the morning brief share the same horizon. Pass a larger window to look further ahead; pass 0 for only dates still later today.
| Name | Required | Description | Default |
|---|---|---|---|
| within_days | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, and the description adds practical behavioral detail: the default seven-day window, the effect of passing a larger window, and the meaning of passing 0. This goes beyond the annotation and helps the agent reason about results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core purpose, and every subsequent sentence adds useful behavioral or parameter guidance. No wasted words or redundant restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, single-parameter read-only listing tool with an output schema, the description covers the essential semantics: what is listed, the default horizon, and how to override it. Nothing important is missing for an agent to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the description fully compensates by explaining the only parameter, within_days: its default, how to extend the window, and what 0 means. The parameter name clarifies the unit, so an agent can invoke it correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List upcoming birthdays and important dates'. It also scopes the behavior to 'inside the weekly window', which distinguishes it from sibling tools like important_date_set and agenda_get without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: it aligns with 'what's coming up this week' questions and the morning brief, and explains how to adjust the time horizon. It does not explicitly name alternative tools or say when not to use it, but the context is strong enough for an agent to know when this tool fits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
journal_getARead-only
Return recent mood check-ins, gratitude entries, and mood trend.
Trend direction is only named when there are at least five days with mood
check-ins and the older/newer daily averages differ by at least 0.5 on
the 1–5 scale; otherwise mood_trend.reason explains the refusal so
a null direction does not read as "no change".
| Name | Required | Description | Default |
|---|---|---|---|
| days | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description reveals a non-obvious rule: trend direction is only named with at least five days of check-ins and a 0.5 difference, and otherwise mood_trend.reason explains the null. This prevents an agent from misreading a null trend as 'no change,' which is exactly the kind of hidden behavior that matters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence is a clear front-loaded statement of function, and the second adds a necessary qualification about trend naming. Both sentences earn their place, and the prose is compact for the behavioral nuance it conveys.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description names the major return components (mood check-ins, gratitude entries, mood trend) and explains mood_trend's null behavior, so an agent understands what it will receive. It does not describe entry-level fields or ordering, but those are less critical for correct invocation given the simple optional parameter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, days, has no schema description and the description does not explicitly explain it, though 'recent' hints at the lookback window. The schema's type, name, and default make the parameter fairly self-evident, so the lack of additional detail is not severely penalized.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Return recent mood check-ins, gratitude entries, and mood trend.' This clearly identifies what the tool retrieves and distinguishes it from the record-creation siblings like mood_record and gratitude_record.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for retrieving recent journal/mood data, but it does not explicitly state when to use it over alternatives such as mood_record or gratitude_record. Usage must be inferred from the tool's name and domain rather than from direct guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_correctA
Correct one recalled memory while preserving its superseded history and evidence.
| Name | Required | Description | Default |
|---|---|---|---|
| memory_id | Yes | ||
| replacement_statement | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are all false, so the description carries the burden of explaining behavioral impact. It usefully discloses that the operation preserves superseded history and evidence, indicating a non-destructive correction. It does not mention return values or failure behavior, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with no filler: the action is front-loaded and the preservation guarantee is stated compactly. It is appropriately concise for a simple two-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no output schema, the description covers the core operation and its principal side effect. It is slightly thin on return or error semantics, but not critically incomplete for selecting and invoking the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, but the parameter names are fairly self-explanatory and the description reinforces the replacement intent. It does not explicitly define memory_id or replacement_statement, nor does it mention constraints such as whether the memory must already exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Correct one recalled memory') and adds a distinguishing detail: preserving superseded history and evidence. This clearly separates it from sibling tools like memory_add, memory_delete, and even a plain memory_update.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The correction intent is clear, but the description does not explicitly state when to prefer this over memory_update or when not to use it. Usage is implied by the word 'Correct' rather than stated as a condition or with named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_feedbackB
Record whether a recalled memory was relevant, irrelevant, or incorrect.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| outcome | Yes | ||
| memory_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations offer no safety signals, so the description carries the full burden. It does communicate that this records feedback and implies a write operation, but it does not disclose whether repeated feedback overwrites previous feedback, whether it is associated with a specific query, or what effect it has on future recall. For a mutating tool with no annotation support, this is a notable gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, focused sentence with no fluff. It front-loads the action and immediately defines the categories of feedback.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple three-parameter tool with no output schema, the description covers the core purpose and the expected feedback categories. It is adequate but incomplete: it does not explain the relationship between 'query' and 'memory_id', nor does it state when feedback should be recorded or what downstream behavior it influences.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and there are no enums. The description helps by naming the possible outcome values ('relevant, irrelevant, or incorrect'), which clarifies the 'outcome' parameter. However, it gives no explicit meaning or format for 'query' and 'memory_id', leaving those to be inferred from their names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb, 'Record', and a clear resource: whether a recalled memory was relevant, irrelevant, or incorrect. This is concrete and actionable, though it does not explicitly differentiate itself from sibling tools like memory_correct beyond the word 'feedback.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The context of use is implied: it is for recording feedback about a recalled memory. However, it does not explicitly state when to use this over memory_correct, forget, or other memory-related sibling tools, nor does it mention prerequisites like having a memory_id from a prior search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
memory_searchARead-only
Search local memory anchors and their one-hop active graph context.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate safe read-only behavior (readOnlyHint=true), so the description need not repeat that. It adds some behavioral context by limiting the search to 'local memory anchors' and 'one-hop active graph context', but it does not disclose result pagination, matching semantics, or other runtime behavior. This is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler. Every word carres meaning: 'Search' gives the operation, 'local' scopes it, and 'one-hop active graph context' defines the extent of results.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only search tool with one required parameter, the description is mostly complete for invocation. However, with no output schema present, it does not fully describe the return format or how 'active graph context' is represented, leaving some ambiguity for an agent interpreting results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema only shows a required string 'query' with no meaningful description. The tool description minimally compensates by clarifying that the query searches local memory anchors and their one-hop graph context. It does not specify query syntax, matching behavior, or format expectations, so the meaning is only partially covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Search'), a clear resource ('local memory anchors'), and a scope qualifier ('one-hop active graph context'). It is immediately distinguishable from the sibling memory tools like remember, memory_correct, memory_feedback, and forget, which are write/destructive operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The verb 'Search' implicitly conveys this is the tool for retrieving memory content rather than mutating it, but the description does not state when to prefer it over a sibling or mention any exclusions/alternatives. Usage is implied by the operation name, not explicitly guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
message_draftA
Preview a Gmail draft; nothing reaches Gmail until a human confirms it.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| body | Yes | ||
| subject | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses a key behavioral guarantee beyond the annotations: no external side effect until a human confirms. This is valuable safety-relevant context. It does not contradict readOnlyHint=false because the tool may still perform local work or prepare a draft, but the key external behavior is clarified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence communicats purpose and the most important behavior with zero waste. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is adequate for a simple preview tool and clearly states the safety guarantee. However, it does not describe the return value or what the agent should expect after invoking it, and param-level guidance is absent. With no output schema, this leaves a modest gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description adds no additional meaning for to, subject, or body. The parameter names are self-explanatory, but no format, constraints, or examples are provided, leaving the description to carry the burden it does not shoulder.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Preview') with a clear resource ('Gmail draft') and adds a decisive scope qualifier: nothing reaches Gmail until human confirmation. This distinguishes it from send-oriented sibling tools like message_send_propose, even without naming an alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It implies usage: use this to preview before anything is sent or reaches Gmail. However, it does not explicitly state when to prefer this over alternatives, nor mention any exclusions or preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
message_send_proposeA
Preview sending Gmail. Telegram attaches approve/cancel; do not paste the letter in chat.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ||
| body | Yes | ||
| subject | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the boolean annotations (all false), the description discloses a real behavioral trait: Telegram attaches approve/cancel buttons to this proposal. It also adds the operational instruction not to paste the letter into chat, which is useful context an agent would not get from the schema or annotations. It does not go into what happens after an approve, but the word 'preview' plus approve/cancel sufficiently conveys the interaction model.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short, purposeful sentences. The purpose is front-loaded in the first sentence, and the second sentence supplies the critical Telegram behavior and a safety instruction. There is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 3-string-parameter proposition tool, the description explains the workflow (preview, approve/cancel, avoid pasting body content) well enough for an agent to invoke it sensibly. It lacks parameter detail and does not specify the post-approval effect, but the approve/cancel model and the tool's propose semantics cover the main decision point.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description should compensate for the undocumented to/subject/body parameters. It only indirectly refers to 'the letter' and 'Gmail', providing weak semantic context, but it never clarifies the meaning or format of individual parameters. An agent still has to infer that 'to' is a recipient email address and 'subject' is an email subject.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and resource: 'Preview sending Gmail.' It clearly identifies the tool as the approval-gated send proposition for email, and the mention of Telegram approve/cancel distinguishes it from a plain drafting tool like message_draft. The purpose is unambiguous from the first sentence.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for use: this is the preview/send-proposal path for Gmail, and it explicitly warns the agent not to paste the email body into chat. It does not enumerate exclusions or name alternatives like message_draft, so it falls just short of fully explicit when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mood_recordA
Record a 1–5 mood check-in with an optional short note.
Stored separately from habits: mood tracks how things felt, not whether
a behavior happened. Use journal_get to review recent entries and
whether a trend can be named.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | ||
| rating | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate a non-read-only, non-destructive operation but give little else. The description adds that mood is stored separately from habits, which is useful context, but it does not specify whether each call appends a new entry or overwrites, nor does it mention any side effects or permissions. Given minimal annotation coverage, this is a moderate gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no waste: the first front-loads the core action and optional note, the second adds the distinction from habits and the pointer to journal_get. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with only two parameters and no output schema, the description gives enough to call it correctly: the rating range, optional note, and the workflow for reviewing entries. It is complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description directly states the rating is on a 1–5 scale and that the note is 'optional short', which adds meaning beyond the bare schema (which has no descriptions). This compensates well for the 0% schema description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear action ('Record') on a specific resource ('mood check-in') with a defined scale (1–5). It explicitly contrasts with habit tracking and points to journal_get for review, distinguishing it from sibling tools like gratitude_record and journal_get.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a direct pointer to journal_get for reviewing entries and naming trends, implying this tool is for capturing data rather than analysis. While it doesn't list explicit exclusions, the context is sufficient for an agent to decide when to use this tool vs. alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nag_until_doneA
Repeat a reminder until the linked task is completed or attempts run out.
Each firing re-reads task state, so completing the task anywhere silences future nags. The final attempt is labeled explicitly as the last reminder.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| chat_id | Yes | ||
| task_id | No | ||
| first_run_at | No | ||
| max_attempts | No | ||
| interval_hours | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide minimal safety info (readOnly=false, not idempotent, not destructive). Description adds meaningful behavior beyond annotations: each firing re-reads task state, completing the task anywhere silences future nags, and final attempt is explicitly labeled. This gives the agent essential operational expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with key behavior front-loaded. Every sentence contributes: mechanism (repeat), termination conditions, re-read behavior, and final-attempt labeling. Could be more compact but no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter tool with 0% schema coverage and no output schema, the description is inadequate. It explains the overall mechanism but omits parameter formatting/semantics entirely—most critically what text expects, how task_id links to a task, how first_run_at should be formatted, and the meaning of interval_hours. The return behavior is also unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden of parameter explanation, and it fails to do so. It never explains text, chat_id, task_id, first_run_at, max_attempts, or interval_hours. The behavioral description implies some parameter meanings (task, attempts, reminders) but doesn't map parameters to their roles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb+resource: repeats a reminder until task completion or attempts run out. Distinguishes itself from the sibling reminder_set by describing the conditional repetition behavior, though it doesn't name the sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Description implies usage context clearly: use for reminders that should persist until the linked task completes. States the stopping conditions (task completion or attempts exhausted). Doesn't explicitly state when not to use it or name alternatives, but behavioral distinction is implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
profile_getARead-only
Return the local owner node and current, evidence-backed profile relationships.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description does not contradict them. It adds useful content context ('local owner node', 'evidence-backed relationships') but does not provide deeper behavioral disclosures beyond what the annotations imply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, tightly worded sentence with the verb front-loaded. Every word earns its place, and there is no redundant or promotional filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only tool with no output schema, the description is sufficiently complete. It names both components of the return value (local owner node and profile relationships) and the complexity is low enough that little else is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and full schema coverage, so the baseline of 4 applies. There are no parameter semantics for the description to add.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Return') and a specific resource ('local owner node and current, evidence-backed profile relationships'). This clearly distinguishes the tool from its siblings and leaves no ambiguity about what it does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is implied by the tool name and the description, but there is no explicit statement about when to use profile_get versus alternative tools. It does not mention exclusions or provide routing guidance among the many sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pull_requests_getARead-only
List open GitHub pull requests you authored or were asked to review.
Fetches a live snapshot via GitHub search (not notifications sync),
marks PRs stale when updated_at is older than stale_after_days.
| Name | Required | Description | Default |
|---|---|---|---|
| stale_after_days | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only, lowering the burden on the description. The description adds useful behavior: it fetches live data via GitHub search and applies staleness logic based on updated_at and stale_after_days. The phrase 'marks PRs stale' is slightly ambiguous, but in a read-only list context it clearly means computed labeling rather than a mutation, so there is no contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two dense sentences with no filler. The main purpose is front-loaded, and the second sentence adds only high-value behavioral details about the live snapshot and staleness calculation. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple read-only tool with one optional parameter and an output schema. The description covers the resource, the selection criteria, the data source, and the one configurable behavior. There is nothing an agent needs to know in order to invoke it correctly that is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, so the description must explain the only parameter, stale_after_days. It does so by defining staleness as updated_at being older than that number of days, which gives the agent a clear semantic meaning. It does not state bounds or exclusivity, but the default is in the schema and the integer meaning is clear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'List open GitHub pull requests you authored or were asked to review.' It clearly scopes the tool's behavior and distinguishes it from notification-based data by noting it fetches a live snapshot via GitHub search. No sibling tool appears to serve the same purpose, so the intent is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells the agent when to use the tool: whenever open PRs authored by or assigned to the user need to be listed. It also provides important context by clarifying this is a live search snapshot, not a notifications sync. It does not name an alternative tool, but none of the siblings directly compete, so the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rememberC
Store a confirmed local memory; the calling client is recorded as actor.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | note | |
| statement | Yes | ||
| sensitivity | No | personal |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already show this is a non-readonly, non-idempotent mutation, and the description adds the useful side effect that the calling client is recorded as actor. It does not disclose potential duplicate handling, overwrite behavior, scoping effects, or consequences beyond that. The added detail is meaningful but thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence states the core action and an important side effect with no filler. It is as concise as a useful description can be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The definition is too thin for correct invocation: it omits parameter semantics, has no output schema, and gives no route to sibling memory operations. Even though the tool is conceptually simple, an agent needs more context about kind/sensitivity and when to store versus correct or forget.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description has the full burden of explaining statement, kind, and sensitivity, but mentions none of them. An agent cannot infer what values to supply for kind and sensitivity from this text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action ('Store') and resource ('confirmed local memory'), clearly distinguishing it from retrieval tools like memory_search and deletion tools like forget. The phrase 'calling client is recorded as actor' further pins down what this tool does. It loses the fifth point because it does not explicitly name sibling alternatives or define what 'confirmed' means.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Aside from implying that the memory should be 'confirmed' and 'local', there is no guidance on when to choose this tool over memory_correct, memory_feedback, or forget. No explicit when-to-use, when-not-to-use, or alternative routing is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reminder_setA
Schedule a Telegram reminder; chat_id must already be locally paired to receive it.
Alfred's only delivery channel today is Telegram, so the caller must
say which paired chat this goes to -- there is no channel-agnostic
queue to defer that choice to. When Hermes is answering an inbound
Telegram turn, chat_id may be omitted and is read from
ALFRED_TELEGRAM_CHAT_ID.
daily repeats at the same local wall-clock time (wake-up, bedtime,
study lock-in). When daily is true, timezone must be an IANA
name such as America/New_York so the hour survives a daylight-saving
change.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| daily | No | ||
| run_at | Yes | ||
| chat_id | No | ||
| task_id | No | ||
| timezone | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important behavior beyond the annotations: reminders are delivered only via Telegram, chat_id must already be paired, and daily reminders follow wall-clock time with an IANA timezone for DST safety. Annotations are all false, so the description carries this burden and does it reasonably well, though it does not mention cancellation, deduplication, or persistence behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately sized and front-loaded with the primary action and core prerequisite. Each paragraph addresses a distinct concern (delivery context, chat_id fallback, daily/timezone semantics) without significant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main Telegram-specific complexities and the daily/timezone interaction, which are the non-obvious parts. However, with no output schema and no description of run_at format or task_id, an agent still has meaningful gaps to resolve before calling it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description adds meaning for chat_id, daily, and timezone, but leaves the required run_at format and the purpose of task_id unexplained. This is partial compensation rather than full coverage of the parameter space.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource, 'Schedule a Telegram reminder', and adds a key prerequisite about a locally paired chat_id. It is clear but does not explicitly differentiate from sibling scheduling tools like task_schedule or nag_until_done.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context for when chat_id is required versus when it can be read from ALFRED_TELEGRAM_CHAT_ID during an inbound Telegram turn, and explains the daily/timezone constraint. It stops short of naming alternatives or stating when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
system_statusARead-only
Return Alfred's non-sensitive local health and schema status.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already declares this as a read-only operation, and the description adds meaningful context by specifying 'non-sensitive', 'local', and 'schema status'. This helps an agent understand the data scope without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, tightly scoped sentence with no filler. Every qualifier ('non-sensitive', 'local', 'health and schema status') contributes directly to tool understanding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter status tool with readOnlyHint and an output schema, the description is complete. It identifies what is returned and the scope, and the output schema can define the actual return structure without burdening the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema description coverage of 100% is vacuous. With no parameters to document, the baseline of 4 applies and the description does not need to add parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Return') and clearly identifies the resource: Alfred's non-sensitive local health and schema status. The qualifiers 'local' and 'non-sensitive' distinguish it from sibling status tools like composio_status and connector_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives. While the 'local' qualifier implies it is for Alfred's own status rather than external connectors, no explicit comparison or exclusion is provided for sibling status tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
task_completeAIdempotent
Mark an open task completed; completing an already-completed task is a no-op.
| Name | Required | Description | Default |
|---|---|---|---|
| task_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, and the description repeats that behavior with 'completing an already-completed task is a no-op.' It does not add much beyond the annotation, though it does clarify the 'open task' precondition. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with zero filler. It states the core action and the only edge case in compact form.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter tool with annotations covering idempotency, the description is nearly sufficient. It lacks explicit return behavior or failure details, but those are less critical given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has a single task_id property with 0% description coverage. The tool description does not explain what task_id refers to, how to obtain it, or any format expectations, so the description does not compensate for the schema's lack of parameter guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Mark an open task completed.' It clearly identifies the action and scope, and the no-op qualifier distinguishes this from task creation/scheduling tools like task_upsert or task_schedule.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use this when an open task should be marked completed. It does not explicitly name alternatives or when-not-to-use conditions, but the context is straightforward enough for selection among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
task_scheduleA
Run an instruction later and send the answer to a paired chat.
Use this, not a reminder, when the user wants something done at a time rather than something said: "check the order at 3 and text me" has no message to deliver yet, because the answer does not exist until the work runs. A reminder would just hand the task back to them.
When it comes due the instruction is queued as an ordinary agent turn, so the reply arrives looking exactly like any other answer. Never schedule this kind of work in your own runtime's cron: Alfred owns schedules and delivery here, and a job elsewhere silently never fires.
run_at is ISO-8601 with an offset. daily repeats it, and then
timezone must be an IANA name (America/New_York) so the task keeps
its local hour across a daylight-saving change. When Hermes is
answering an inbound Telegram turn, chat_id may be omitted and is
read from ALFRED_TELEGRAM_CHAT_ID.
| Name | Required | Description | Default |
|---|---|---|---|
| daily | No | ||
| prompt | Yes | ||
| run_at | Yes | ||
| chat_id | No | ||
| timezone | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say it's not read-only and not destructive. The description goes far beyond: it explains that the instruction is queued as an ordinary agent turn ('the reply arrives looking exactly like any other answer'), warns that a job elsewhere silently never fires, and details the chat_id fallback behavior from ALFRED_TELEGRAM_CHAT_ID. It also clarifies daily/timezone handling. This is rich behavioral context not present in the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Though longer than typical, every sentence earns its place. The core action is stated first, then the critical distinction from reminders, then behavior, then parameter notes. No fluff or redundancy; the structure front-loads the most decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a scheduling tool: it covers what it does, when to use it, how the execution works, parameter formats, special cases (Telegram chat_id fallback), and a critical operational warning. No output schema exists, but that is not needed for a fire-and-forget scheduling action. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain parameters. It does well for the non-obvious ones: run_at must be ISO-8601 with offset, daily repeats it and then timezone must be IANA, chat_id may be omitted under a specific condition. It does not explicitly state that prompt is the instruction to run, but that is inferable from the tool's purpose and description. It adds significant meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb–resource pair: 'Run an instruction later and send the answer to a paired chat.' It immediately distinguishes itself from the sibling reminder_set by explaining when to use scheduling over a reminder ('when the user wants something *done* at a time rather than something *said*'), and gives a concrete example. This makes it impossible for an agent to confuse it with other tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance ('Use this, not a reminder...'), a concrete example, and a strong when-not-to-use instruction ('Never schedule this kind of work in your own runtime's cron'). It also explains the alternative (a reminder) and why it would be inappropriate, leaving no ambiguity about selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
task_upsertA
Create a task, or update an existing one's title/due date when task_id is given.
Decision 8 classifies this as automatic and reversible, unlike deletion, so it needs no approval step.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| due_at | No | ||
| task_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The second sentence adds behavioral context beyond annotations by stating the operation is automatic, reversible, and requires no approval. It also clarifies that updates only affect title and due date, which is useful for the agent. This does not contradict the readOnlyHint, destructiveHint, or idempotentHint annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief and front-loads the core behavior in the first sentence. However, the 'Decision 8' reference is cryptic and unexplained, making the second sentence less useful than it could be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the essential create/update logic and the role of task_id, which is enough for basic invocation. Yet it omits return-value expectations, error behavior, and any guidance on how task_id should be obtained; the unexplained 'Decision 8' reference also leaves a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates partly by explaining that task_id selects update mode and that title and due date are the fields manipulated. It does not explain due_at's ISO format or the meaning of null/omitted due_at, leaving the agent to rely on the schema for those details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool creates a task or updates an existing task's title/due date when task_id is provided. It names the specific resource and action, though it does not explicitly distinguish itself from sibling tools like task_complete or task_schedule.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives internal routing guidance: create when task_id is absent, update when task_id is present. However, it does not explain when to choose this tool over alternatives or when not to use it, leaving sibling selection implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
threads_awaiting_replyARead-only
List unread Gmail threads that look like they need a reply.
Groups active unread mail by thread_id and drops messages that carry a
List-Unsubscribe header (newsletters Gmail often labels PERSONAL).
Run alfred gmail-thread-backfill once if older rows are missing
thread_id / list_unsubscribe.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description is consistent. The description adds valuable behavioral detail beyond the annotation: it groups by thread_id, drops messages carrying List-Unsubscribe headers, and warns that older rows may lack thread_id/list_unsubscribe unless a backfill is run. This gives the agent a realistic picture of data completeness and filtering behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler: the main action is front-loaded, the second sentence explains the core filtering logic, and the third is a compact operational note about the backfill command. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there are no parameters and an output schema exists, the description fully covers what an agent needs to decide whether to call the tool and what to expect: source, unread/active filter, newsletter exclusion, and a data-quality caveat. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no parameters, so there are no call arguments to document and schema coverage is effectively 100%. The description mentions internal fields like thread_id and list_unsubscribe, but those are implementation details rather than invocation parameters, so the baseline score for zero parameters applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('List'), a clear resource ('unread Gmail threads'), and the intended outcome ('that look like they need a reply'). The second sentence sharpens this by explaining that it groups by thread_id and drops List-Unsubscribe-bearing newsletters, making the tool's niche unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear operational context: the tool is for triaging active unread threads that plausibly need a reply, and explicitly excludes newsletter-style List-Unsubscribe messages. It also gives a concrete data prerequisite with the backfill command. It does not name alternatives or state explicit when-not-to-use cases, but no sibling tool appears to cover this same niche.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
33 tool updates
v0.2.0- First observed
action_commit - First observed
agenda_get - First observed
availability_get - First observed
brief_get - First observed
calendar_event_propose - First observed
composio_connect - First observed
composio_execute - First observed
composio_search - First observed
composio_status - First observed
connector_records_get - First observed
connector_status - First observed
forget - First observed
github_issue_propose - First observed
gratitude_record - First observed
important_date_set - First observed
important_dates_get - First observed
journal_get - First observed
memory_correct - First observed
memory_feedback - First observed
memory_search - First observed
message_draft - First observed
message_send_propose - First observed
mood_record - First observed
nag_until_done - First observed
profile_get - First observed
pull_requests_get - First observed
remember - First observed
reminder_set - First observed
system_status - First observed
task_complete - First observed
task_schedule - First observed
task_upsert - First observed
threads_awaiting_reply
TDQS
Scored across 33 tools
Most tools target a distinct action (search vs remember vs correct; propose vs commit; status vs records). The reminder family (reminder_set, nag_until_done, important_date_set, task_schedule) and status tools (system_status vs connector_status) create mild boundary overlap, but detailed descriptions make selection feasible.
Naming conventions are mixed: many tools are noun_verb (important_dates_get, connector_records_get), while others are verb_noun (task_complete, calendar_event_propose), bare verbs (remember, forget), or noun-only (system_status, connector_status). This inconsistency makes the surface harder to predict.
33 tools is above the 25+ threshold and feels heavy even for a multi-domain personal assistant. Several clusters (reminders, memory, status) could be consolidated without losing function.
Core lifecycles exist for memory, tasks, journaling, and composio, but calendar has create-only (no update/cancel), GitHub is limited to issue creation and PR listing, and task deletion is absent. Agents can complete common workflows but will hit gaps on updates and cancellations.
Maintenance
Related MCP Connectors
Private-by-default, local-first memory/context/task orchestrator for MCP apps and agents.
Persistent, portable memory for AI assistants — your private memory graph, from any MCP client.
Agent-native notes, tasks, dev-docs, vaults, sync & handoffs. MCP + OpenAPI dual surface.
One memory, every AI. A shared, user-owned markdown memory your AI clients read and write over MCP.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceA local-first AI secretary that gathers your work context into private memory and enables AI agents to search and summarize it over MCP.38 npmMIT
- AlicenseAqualityBmaintenanceA local-first, privacy-first MCP server that passively indexes personal digital activity (screenshots, clipboard, notes, downloads, links) into a local database, enabling LLMs like Claude to access your context without cloud storage.41MIT
- AlicenseNot gradedqualityAmaintenanceA self-hosted MCP server that provides any LLM with a graph-backed memory layer of your life—tasks, email, finance, contacts, calendar—plus autonomous agent offices that act on your behalf.3Apache 2.0
- AlicenseNot gradedqualityCmaintenanceLocal-first memory server that stores notes, contacts, and future data as a unified entity graph, providing hybrid retrieval (vector + keyword) for AI assistants via MCP.2MIT