mastra-ai/mastra · error
notification-inbox ${input.action} requires id
Error message
notification-inbox ${input.action} requires id What it means
Actions markSeen, dismiss, and archive operate on a single notification and therefore require input.id. The tool throws this error when the action is one of these but no id was supplied.
Source
Thrown at packages/core/src/notifications/tool.ts:148
: await storage.listNotifications({
threadId,
status: input.status ?? ['pending', 'delivered'],
priority: input.priority,
source: input.source,
limit: input.limit,
});
if (input.id && !notifications[0])
throw new Error(`Notification ${input.id} was not found for thread ${threadId}`);
return deliverNotifications({
notifications: notifications.filter((notification): notification is NotificationRecord =>
Boolean(notification),
),
storage,
context,
});
}
if (!input.id) throw new Error(`notification-inbox ${input.action} requires id`);
const statusByAction = {
markSeen: 'seen',
dismiss: 'dismissed',
archive: 'archived',
} satisfies Record<'markSeen' | 'dismiss' | 'archive', NotificationStatus>;
return {
notification: await storage.updateNotification({
threadId,
id: input.id,
status: statusByAction[input.action],
}),
};
},
});
}
View on GitHub (pinned to 75dd419e61)
Solutions
- Always include id in the tool input for markSeen/dismiss/archive actions
- Enforce the input schema (notificationActionSchema) at the UI/client layer before invoking the tool
- If the LLM omits id, re-prompt or reject the tool call; check tool choice/strict schema settings
Example fix
// before
await inboxTool.execute({ action: 'dismiss', threadId });
// after
await inboxTool.execute({ action: 'dismiss', threadId, id: notificationId }); Defensive patterns
Strategy: validation
Validate before calling
const idActions = ['markSeen', 'dismiss', 'archive'] as const;
if (idActions.includes(input.action as any) && !input.id) {
throw new Error(`Action ${input.action} requires a notification id`);
} Type guard
function hasId(i: NotificationInboxAction): i is NotificationInboxAction & { id: string } {
return typeof (i as any).id === 'string' && (i as any).id.length > 0;
} Try / catch
try {
await inboxTool.execute(input, context);
} catch (e) {
if (e instanceof Error && e.message.includes('requires id')) {
logger.warn('Tool call missing id', { action: input.action });
return { error: 'Select a notification first' };
}
throw e;
} Prevention
- Always include the notification id in markSeen/dismiss/archive calls
- Validate inputs at the client boundary before invoking the tool
- Use strict tool-call schemas so the model cannot omit id
When it happens
Trigger: Invoking the notification-inbox tool with action 'markSeen', 'dismiss', or 'archive' while omitting input.id — commonly when the LLM emits partial tool arguments or a UI button click sends an action without the selected notification id.
Common situations: Model-generated tool calls missing required fields despite the schema; frontend dispatching actions with stale/undefined state; writing tests against the tool with incomplete inputs.
Understand the failure class
Background: Missing required parameter errors: what 'X is required' and 'the required X param is missing' mean, and how to fix them — this error's family across 27 libraries.
Related errors
- notification-inbox requires a threadId
- notification-inbox search requires query
- Notification ${input.id} was not found for thread ${threadId
- Factory rule version is required.
- notification_inbox requires a notifications storage domain
AI-assisted analysis of mastra-ai/mastra@75dd419e61 (2026-08-30).
Data as JSON: /api/errors/7641367085e44041.
Report an issue: GitHub.