Skip to main content
Glama
MetadataRecordService.ts2.04 kB
import { getLazyAttioClient } from '../../api/lazy-client.js'; import { OBJECT_SLUG_MAP } from '../../constants/universal.constants.js'; import type { UniversalResourceType } from '../../handlers/tool-configs/universal/types.js'; import type { MetadataErrorService, MetadataRecordService } from './types.js'; import { OperationType as OperationTypeEnum } from '../../utils/logger.js'; import { createScopedLogger } from '../../utils/logger.js'; const logger = createScopedLogger( 'MetadataRecordService', undefined, OperationTypeEnum.DATA_PROCESSING ); export class DefaultMetadataRecordService implements MetadataRecordService { constructor(private readonly errorService: MetadataErrorService) {} async getAttributesForRecord( resourceType: UniversalResourceType, recordId: string ): Promise<Record<string, unknown>> { const client = getLazyAttioClient(); try { const resourceSlug = OBJECT_SLUG_MAP[resourceType.toLowerCase()] || resourceType.toLowerCase(); const response = await client.get( `/objects/${resourceSlug}/records/${recordId}` ); if (!response || !response.data) { throw { status: 500, body: { code: 'invalid_response', message: `Invalid API response for ${resourceType} record: ${recordId}`, }, }; } const result = response.data.data?.values || response.data.data || {}; if (result === null || result === undefined) { throw { status: 404, body: { code: 'not_found', message: `${resourceType} record with ID "${recordId}" not found.`, }, }; } return result; } catch (error: unknown) { logger.error( `Failed to get attributes for ${resourceType} record ${recordId}`, error, { resourceType, recordId } ); return this.errorService.toRecordFetchError( resourceType, recordId, error ); } } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/kesslerio/attio-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server