mcp-memory-libsql
by spences10
Verified
- src
- tools
import {
BaseToolArguments,
CalendarEventParams,
SendEmailArgs,
ManageLabelParams,
ManageLabelAssignmentParams,
ManageLabelFilterParams,
ManageDraftParams,
DriveFileListArgs,
DriveSearchArgs,
DriveUploadArgs,
DriveDownloadArgs,
DriveFolderArgs,
DrivePermissionArgs,
DriveDeleteArgs,
ManageAttachmentParams
} from './types.js';
// Base Tool Arguments
export function isBaseToolArguments(args: Record<string, unknown>): args is BaseToolArguments {
return typeof args.email === 'string';
}
export function assertBaseToolArguments(args: Record<string, unknown>): asserts args is BaseToolArguments {
if (!isBaseToolArguments(args)) {
throw new Error('Missing required email parameter');
}
}
// Calendar Type Guards
export function isCalendarEventParams(args: Record<string, unknown>): args is CalendarEventParams {
return typeof args.email === 'string' &&
(args.query === undefined || typeof args.query === 'string') &&
(args.maxResults === undefined || typeof args.maxResults === 'number') &&
(args.timeMin === undefined || typeof args.timeMin === 'string') &&
(args.timeMax === undefined || typeof args.timeMax === 'string');
}
export function assertCalendarEventParams(args: Record<string, unknown>): asserts args is CalendarEventParams {
if (!isCalendarEventParams(args)) {
throw new Error('Invalid calendar event parameters');
}
}
export function isEmailEventIdArgs(args: Record<string, unknown>): args is { email: string; eventId: string } {
return typeof args.email === 'string' && typeof args.eventId === 'string';
}
export function assertEmailEventIdArgs(args: Record<string, unknown>): asserts args is { email: string; eventId: string } {
if (!isEmailEventIdArgs(args)) {
throw new Error('Missing required email or eventId parameter');
}
}
// Gmail Type Guards
export function isSendEmailArgs(args: Record<string, unknown>): args is SendEmailArgs {
return typeof args.email === 'string' &&
Array.isArray(args.to) &&
args.to.every(to => typeof to === 'string') &&
typeof args.subject === 'string' &&
typeof args.body === 'string' &&
(args.cc === undefined || (Array.isArray(args.cc) && args.cc.every(cc => typeof cc === 'string'))) &&
(args.bcc === undefined || (Array.isArray(args.bcc) && args.bcc.every(bcc => typeof bcc === 'string')));
}
export function assertSendEmailArgs(args: Record<string, unknown>): asserts args is SendEmailArgs {
if (!isSendEmailArgs(args)) {
throw new Error('Invalid email parameters. Required: email, to, subject, body');
}
}
// Drive Type Guards
export function isDriveFileListArgs(args: unknown): args is DriveFileListArgs {
if (typeof args !== 'object' || args === null) return false;
const params = args as Partial<DriveFileListArgs>;
return typeof params.email === 'string' &&
(params.options === undefined || (() => {
const opts = params.options as any;
return (opts.folderId === undefined || typeof opts.folderId === 'string') &&
(opts.query === undefined || typeof opts.query === 'string') &&
(opts.pageSize === undefined || typeof opts.pageSize === 'number') &&
(opts.orderBy === undefined || (Array.isArray(opts.orderBy) && opts.orderBy.every((o: unknown) => typeof o === 'string'))) &&
(opts.fields === undefined || (Array.isArray(opts.fields) && opts.fields.every((f: unknown) => typeof f === 'string')));
})());
}
export function assertDriveFileListArgs(args: unknown): asserts args is DriveFileListArgs {
if (!isDriveFileListArgs(args)) {
throw new Error('Invalid file list parameters. Required: email');
}
}
export function isDriveSearchArgs(args: unknown): args is DriveSearchArgs {
if (typeof args !== 'object' || args === null) return false;
const params = args as Partial<DriveSearchArgs>;
return typeof params.email === 'string' &&
typeof params.options === 'object' && params.options !== null &&
(params.options.fullText === undefined || typeof params.options.fullText === 'string') &&
(params.options.mimeType === undefined || typeof params.options.mimeType === 'string') &&
(params.options.folderId === undefined || typeof params.options.folderId === 'string') &&
(params.options.trashed === undefined || typeof params.options.trashed === 'boolean') &&
(params.options.query === undefined || typeof params.options.query === 'string') &&
(params.options.pageSize === undefined || typeof params.options.pageSize === 'number');
}
export function assertDriveSearchArgs(args: unknown): asserts args is DriveSearchArgs {
if (!isDriveSearchArgs(args)) {
throw new Error('Invalid search parameters. Required: email, options');
}
}
export function isDriveUploadArgs(args: unknown): args is DriveUploadArgs {
if (typeof args !== 'object' || args === null) return false;
const params = args as Partial<DriveUploadArgs>;
return typeof params.email === 'string' &&
typeof params.options === 'object' && params.options !== null &&
typeof params.options.name === 'string' &&
typeof params.options.content === 'string' &&
(params.options.mimeType === undefined || typeof params.options.mimeType === 'string') &&
(params.options.parents === undefined || (Array.isArray(params.options.parents) && params.options.parents.every(p => typeof p === 'string')));
}
export function assertDriveUploadArgs(args: unknown): asserts args is DriveUploadArgs {
if (!isDriveUploadArgs(args)) {
throw new Error('Invalid upload parameters. Required: email, options.name, options.content');
}
}
export function isDriveDownloadArgs(args: unknown): args is DriveDownloadArgs {
if (typeof args !== 'object' || args === null) return false;
const params = args as Partial<DriveDownloadArgs>;
return typeof params.email === 'string' &&
typeof params.fileId === 'string' &&
(params.mimeType === undefined || typeof params.mimeType === 'string');
}
export function assertDriveDownloadArgs(args: unknown): asserts args is DriveDownloadArgs {
if (!isDriveDownloadArgs(args)) {
throw new Error('Invalid download parameters. Required: email, fileId');
}
}
export function isDriveFolderArgs(args: unknown): args is DriveFolderArgs {
if (typeof args !== 'object' || args === null) return false;
const params = args as Partial<DriveFolderArgs>;
return typeof params.email === 'string' &&
typeof params.name === 'string' &&
(params.parentId === undefined || typeof params.parentId === 'string');
}
export function assertDriveFolderArgs(args: unknown): asserts args is DriveFolderArgs {
if (!isDriveFolderArgs(args)) {
throw new Error('Invalid folder parameters. Required: email, name');
}
}
export function isDrivePermissionArgs(args: unknown): args is DrivePermissionArgs {
if (typeof args !== 'object' || args === null) return false;
const params = args as Partial<DrivePermissionArgs>;
return typeof params.email === 'string' &&
typeof params.options === 'object' && params.options !== null &&
typeof params.options.fileId === 'string' &&
['owner', 'organizer', 'fileOrganizer', 'writer', 'commenter', 'reader'].includes(params.options.role) &&
['user', 'group', 'domain', 'anyone'].includes(params.options.type) &&
(params.options.emailAddress === undefined || typeof params.options.emailAddress === 'string') &&
(params.options.domain === undefined || typeof params.options.domain === 'string') &&
(params.options.allowFileDiscovery === undefined || typeof params.options.allowFileDiscovery === 'boolean');
}
export function assertDrivePermissionArgs(args: unknown): asserts args is DrivePermissionArgs {
if (!isDrivePermissionArgs(args)) {
throw new Error('Invalid permission parameters. Required: email, options.fileId, options.role, options.type');
}
}
export function isDriveDeleteArgs(args: unknown): args is DriveDeleteArgs {
if (typeof args !== 'object' || args === null) return false;
const params = args as Partial<DriveDeleteArgs>;
return typeof params.email === 'string' &&
typeof params.fileId === 'string';
}
export function assertDriveDeleteArgs(args: unknown): asserts args is DriveDeleteArgs {
if (!isDriveDeleteArgs(args)) {
throw new Error('Invalid delete parameters. Required: email, fileId');
}
}
// Label Management Type Guards
export function isManageLabelParams(args: unknown): args is ManageLabelParams {
if (typeof args !== 'object' || args === null) return false;
const params = args as Partial<ManageLabelParams>;
return typeof params.email === 'string' &&
typeof params.action === 'string' &&
['create', 'read', 'update', 'delete'].includes(params.action) &&
(params.labelId === undefined || typeof params.labelId === 'string') &&
(params.data === undefined || (() => {
if (typeof params.data !== 'object' || params.data === null) return false;
const data = params.data as {
name?: string;
messageListVisibility?: string;
labelListVisibility?: string;
};
return (data.name === undefined || typeof data.name === 'string') &&
(data.messageListVisibility === undefined || ['show', 'hide'].includes(data.messageListVisibility)) &&
(data.labelListVisibility === undefined || ['labelShow', 'labelHide', 'labelShowIfUnread'].includes(data.labelListVisibility));
})());
}
export function assertManageLabelParams(args: unknown): asserts args is ManageLabelParams {
if (!isManageLabelParams(args)) {
throw new Error('Invalid label management parameters. Required: email, action');
}
}
export function isManageLabelAssignmentParams(args: unknown): args is ManageLabelAssignmentParams {
if (typeof args !== 'object' || args === null) return false;
const params = args as Partial<ManageLabelAssignmentParams>;
return typeof params.email === 'string' &&
typeof params.action === 'string' &&
['add', 'remove'].includes(params.action) &&
typeof params.messageId === 'string' &&
Array.isArray(params.labelIds) &&
params.labelIds.every((id: unknown) => typeof id === 'string');
}
export function assertManageLabelAssignmentParams(args: unknown): asserts args is ManageLabelAssignmentParams {
if (!isManageLabelAssignmentParams(args)) {
throw new Error('Invalid label assignment parameters. Required: email, action, messageId, labelIds');
}
}
export function isManageLabelFilterParams(args: unknown): args is ManageLabelFilterParams {
if (typeof args !== 'object' || args === null) return false;
const params = args as Partial<ManageLabelFilterParams>;
return typeof params.email === 'string' &&
typeof params.action === 'string' &&
['create', 'read', 'update', 'delete'].includes(params.action) &&
(params.filterId === undefined || typeof params.filterId === 'string') &&
(params.labelId === undefined || typeof params.labelId === 'string') &&
(params.data === undefined || (() => {
if (typeof params.data !== 'object' || params.data === null) return false;
const data = params.data as {
criteria?: { [key: string]: unknown };
actions?: { addLabel: boolean; markImportant?: boolean; markRead?: boolean; archive?: boolean };
};
return (data.criteria === undefined || (typeof data.criteria === 'object' && data.criteria !== null)) &&
(data.actions === undefined || (
typeof data.actions === 'object' &&
data.actions !== null &&
typeof data.actions.addLabel === 'boolean'
));
})());
}
export function assertManageLabelFilterParams(args: unknown): asserts args is ManageLabelFilterParams {
if (!isManageLabelFilterParams(args)) {
throw new Error('Invalid label filter parameters. Required: email, action');
}
}
// Draft Management Type Guards
export function isManageDraftParams(args: unknown): args is ManageDraftParams {
if (typeof args !== 'object' || args === null) return false;
const params = args as Partial<ManageDraftParams>;
return typeof params.email === 'string' &&
typeof params.action === 'string' &&
['create', 'read', 'update', 'delete', 'send'].includes(params.action) &&
(params.draftId === undefined || typeof params.draftId === 'string') &&
(params.data === undefined || (() => {
if (typeof params.data !== 'object' || params.data === null) return false;
const data = params.data as {
to?: string[];
subject?: string;
body?: string;
cc?: string[];
bcc?: string[];
replyToMessageId?: string;
threadId?: string;
references?: string[];
inReplyTo?: string;
};
return (data.to === undefined || (Array.isArray(data.to) && data.to.every(to => typeof to === 'string'))) &&
(data.subject === undefined || typeof data.subject === 'string') &&
(data.body === undefined || typeof data.body === 'string') &&
(data.cc === undefined || (Array.isArray(data.cc) && data.cc.every(cc => typeof cc === 'string'))) &&
(data.bcc === undefined || (Array.isArray(data.bcc) && data.bcc.every(bcc => typeof bcc === 'string'))) &&
(data.replyToMessageId === undefined || typeof data.replyToMessageId === 'string') &&
(data.threadId === undefined || typeof data.threadId === 'string') &&
(data.references === undefined || (Array.isArray(data.references) && data.references.every(ref => typeof ref === 'string'))) &&
(data.inReplyTo === undefined || typeof data.inReplyTo === 'string');
})());
}
export function isManageAttachmentParams(args: unknown): args is ManageAttachmentParams {
if (typeof args !== 'object' || args === null) return false;
const params = args as Partial<ManageAttachmentParams>;
return typeof params.email === 'string' &&
typeof params.action === 'string' &&
['download', 'upload', 'delete'].includes(params.action) &&
typeof params.source === 'string' &&
['email', 'calendar'].includes(params.source) &&
typeof params.messageId === 'string' &&
typeof params.filename === 'string' &&
(params.content === undefined || typeof params.content === 'string');
}
export function assertManageAttachmentParams(args: unknown): asserts args is ManageAttachmentParams {
if (!isManageAttachmentParams(args)) {
throw new Error('Invalid attachment management parameters. Required: email, action, source, messageId, filename');
}
}
export function assertManageDraftParams(args: unknown): asserts args is ManageDraftParams {
if (!isManageDraftParams(args)) {
throw new Error('Invalid draft management parameters. Required: email, action');
}
}