We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Thinh-nguyen-03/virtual-assistant-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
export var ErrorCode;
(function (ErrorCode) {
ErrorCode["INVALID_ARGUMENT"] = "INVALID_ARGUMENT";
ErrorCode["UNAUTHENTICATED"] = "UNAUTHENTICATED";
ErrorCode["FORBIDDEN"] = "FORBIDDEN";
ErrorCode["NOT_FOUND"] = "NOT_FOUND";
ErrorCode["CONFLICT"] = "CONFLICT";
ErrorCode["RATE_LIMITED"] = "RATE_LIMITED";
ErrorCode["INTERNAL"] = "INTERNAL";
})(ErrorCode || (ErrorCode = {}));
export const GOOGLE_ERROR_MAP = {
'rateLimitExceeded': { code: ErrorCode.RATE_LIMITED, retry_after_ms: 60000 },
'quotaExceeded': { code: ErrorCode.RATE_LIMITED, retry_after_ms: 300000 },
'conflict': { code: ErrorCode.CONFLICT },
'forbidden': { code: ErrorCode.FORBIDDEN },
'notFound': { code: ErrorCode.NOT_FOUND },
'invalidCredentials': { code: ErrorCode.UNAUTHENTICATED },
'invalidArgument': { code: ErrorCode.INVALID_ARGUMENT },
'failedPrecondition': { code: ErrorCode.INVALID_ARGUMENT },
'insufficientAuthentication': { code: ErrorCode.UNAUTHENTICATED },
'invalidGrant': { code: ErrorCode.UNAUTHENTICATED },
'accessDenied': { code: ErrorCode.FORBIDDEN },
'userRateLimitExceeded': { code: ErrorCode.RATE_LIMITED, retry_after_ms: 60000 },
'dailyLimitExceeded': { code: ErrorCode.RATE_LIMITED, retry_after_ms: 86400000 },
'400': { code: ErrorCode.INVALID_ARGUMENT },
'401': { code: ErrorCode.UNAUTHENTICATED },
'403': { code: ErrorCode.FORBIDDEN },
'404': { code: ErrorCode.NOT_FOUND },
'409': { code: ErrorCode.CONFLICT },
'429': { code: ErrorCode.RATE_LIMITED, retry_after_ms: 60000 },
'500': { code: ErrorCode.INTERNAL },
'502': { code: ErrorCode.INTERNAL },
'503': { code: ErrorCode.INTERNAL },
'504': { code: ErrorCode.INTERNAL }
};
export function normalizeGoogleError(error, provider = 'calendar') {
const status = error?.status || error?.code || error?.statusCode;
const message = error?.message || error?.error_description || 'Unknown error';
const providerCode = error?.error || error?.code;
if (providerCode && GOOGLE_ERROR_MAP[providerCode]) {
const mapping = GOOGLE_ERROR_MAP[providerCode];
return {
code: mapping.code,
message,
provider_code: providerCode,
retry_after_ms: mapping.retry_after_ms
};
}
if (status && GOOGLE_ERROR_MAP[status.toString()]) {
const mapping = GOOGLE_ERROR_MAP[status.toString()];
if (mapping) {
return {
code: mapping.code,
message,
provider_code: status.toString(),
retry_after_ms: mapping.retry_after_ms
};
}
}
return {
code: ErrorCode.INTERNAL,
message: `Unexpected error from ${provider} API: ${message}`,
provider_code: providerCode || status?.toString()
};
}
export function createErrorResponse(code, message, provider_code, retry_after_ms) {
return {
ok: false,
error: {
code,
message,
provider_code: provider_code || undefined,
retry_after_ms: retry_after_ms || undefined
}
};
}
export function createSuccessResponse(data) {
return {
ok: true,
data
};
}
export function isRetryableError(error) {
return error.code === ErrorCode.RATE_LIMITED ||
error.code === ErrorCode.INTERNAL ||
(error.retry_after_ms !== undefined && error.retry_after_ms > 0);
}
export function getRetryDelay(error) {
return error.retry_after_ms || 1000;
}
//# sourceMappingURL=errors.js.map