mcp-memory-libsql
by spences10
Verified
import { GoogleApiError } from '../../types.js';
interface ServiceConfig {
version: string;
methods: string[];
scopes: Record<string, string[]>;
}
export class EndpointValidator {
// Registry of supported services and their configurations
private readonly serviceRegistry: Record<string, ServiceConfig> = {
calendar: {
version: 'v3',
methods: [
'events.list',
'events.get',
'events.insert',
'events.update',
'events.delete',
'events.attachments.get',
'events.attachments.upload',
'events.attachments.delete'
],
scopes: {
'events.list': ['https://www.googleapis.com/auth/calendar.readonly'],
'events.get': ['https://www.googleapis.com/auth/calendar.readonly'],
'events.insert': ['https://www.googleapis.com/auth/calendar.events'],
'events.update': ['https://www.googleapis.com/auth/calendar.events'],
'events.delete': ['https://www.googleapis.com/auth/calendar.events'],
'events.attachments.get': ['https://www.googleapis.com/auth/calendar.readonly'],
'events.attachments.upload': ['https://www.googleapis.com/auth/calendar.events'],
'events.attachments.delete': ['https://www.googleapis.com/auth/calendar.events']
}
},
gmail: {
version: 'v1',
methods: [
'users.messages.list',
'users.messages.get',
'users.messages.send',
'users.labels.list',
'users.labels.get',
'users.drafts.list',
'users.drafts.get',
'users.drafts.create',
'users.drafts.update',
'users.drafts.delete'
],
scopes: {
'users.messages.list': ['https://www.googleapis.com/auth/gmail.readonly'],
'users.messages.get': ['https://www.googleapis.com/auth/gmail.readonly'],
'users.messages.send': ['https://www.googleapis.com/auth/gmail.send'],
'users.labels.list': ['https://www.googleapis.com/auth/gmail.labels'],
'users.labels.get': ['https://www.googleapis.com/auth/gmail.labels'],
'users.drafts.list': ['https://www.googleapis.com/auth/gmail.readonly'],
'users.drafts.get': ['https://www.googleapis.com/auth/gmail.readonly'],
'users.drafts.create': ['https://www.googleapis.com/auth/gmail.compose'],
'users.drafts.update': ['https://www.googleapis.com/auth/gmail.compose'],
'users.drafts.delete': ['https://www.googleapis.com/auth/gmail.compose']
}
},
drive: {
version: 'v3',
methods: [
'files.list',
'files.get',
'files.create',
'files.update',
'files.delete',
'files.copy',
'permissions.list',
'permissions.get',
'permissions.create',
'permissions.update',
'permissions.delete'
],
scopes: {
'files.list': ['https://www.googleapis.com/auth/drive.readonly'],
'files.get': ['https://www.googleapis.com/auth/drive.readonly'],
'files.create': ['https://www.googleapis.com/auth/drive.file'],
'files.update': ['https://www.googleapis.com/auth/drive.file'],
'files.delete': ['https://www.googleapis.com/auth/drive.file'],
'files.copy': ['https://www.googleapis.com/auth/drive.file'],
'permissions.list': ['https://www.googleapis.com/auth/drive.readonly'],
'permissions.get': ['https://www.googleapis.com/auth/drive.readonly'],
'permissions.create': ['https://www.googleapis.com/auth/drive.file'],
'permissions.update': ['https://www.googleapis.com/auth/drive.file'],
'permissions.delete': ['https://www.googleapis.com/auth/drive.file']
}
}
};
async validate(endpoint: string): Promise<void> {
// Parse endpoint into service and method
const [service, ...methodParts] = endpoint.split('.');
const methodName = methodParts.join('.');
// Validate service exists
if (!service || !this.serviceRegistry[service]) {
throw new GoogleApiError(
`Service "${service}" is not supported`,
'INVALID_SERVICE',
`Supported services are: ${Object.keys(this.serviceRegistry).join(', ')}`
);
}
// Validate method exists
const serviceConfig = this.serviceRegistry[service];
if (!methodName || !serviceConfig.methods.includes(methodName)) {
throw new GoogleApiError(
`Method "${methodName}" is not supported for service "${service}"`,
'INVALID_METHOD',
`Available methods for ${service} are: ${serviceConfig.methods.join(', ')}`
);
}
}
getRequiredScopes(endpoint: string): string[] {
const [service, ...methodParts] = endpoint.split('.');
const methodName = methodParts.join('.');
const serviceConfig = this.serviceRegistry[service];
if (!serviceConfig || !serviceConfig.scopes[methodName]) {
return [];
}
return serviceConfig.scopes[methodName];
}
getSupportedServices(): string[] {
return Object.keys(this.serviceRegistry);
}
getSupportedMethods(service: string): string[] {
return this.serviceRegistry[service]?.methods || [];
}
}