UNPKG

mcp-quickbase

Version:

Work with Quickbase via Model Context Protocol

123 lines 4.52 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CreateRecordTool = void 0; const base_1 = require("../base"); const logger_1 = require("../../utils/logger"); const logger = (0, logger_1.createLogger)('CreateRecordTool'); /** * Tool for creating a new record in a Quickbase table */ class CreateRecordTool extends base_1.BaseTool { /** * Constructor * @param client Quickbase client */ constructor(client) { super(client); this.name = 'create_record'; this.description = 'Creates a new record in a Quickbase table'; /** * Parameter schema for create_record */ this.paramSchema = { type: 'object', properties: { table_id: { type: 'string', description: 'The ID of the Quickbase table' }, data: { type: 'object', description: 'The data for the new record, as field ID/value pairs' } }, required: ['table_id', 'data'] }; } /** * Run the create_record tool * @param params Tool parameters * @returns Created record information */ async run(params) { const { table_id, data } = params; logger.info('Creating new record in Quickbase table', { tableId: table_id }); // Validate data if (!data || typeof data !== 'object' || Object.keys(data).length === 0) { throw new Error('Record data is required and must be a non-empty object'); } // Prepare record data // Convert data to { [fieldId]: { value: fieldValue } } format expected by the API const recordData = {}; for (const [field, value] of Object.entries(data)) { recordData[field] = { value }; } // Prepare request body const body = { to: table_id, data: [recordData] }; // Create the record const response = await this.client.request({ method: 'POST', path: '/records', body }); if (!response.success || !response.data) { logger.error('Failed to create record', { error: response.error, tableId: table_id }); throw new Error(response.error?.message || 'Failed to create record'); } // Safely validate response structure if (typeof response.data !== 'object' || response.data === null) { throw new Error('Invalid API response: data is not an object'); } const result = response.data; // Validate metadata exists and is an object if (typeof result.metadata !== 'object' || result.metadata === null) { logger.error('Record creation response missing metadata', { response: result }); throw new Error('Record created but response metadata is missing'); } const metadata = result.metadata; // Validate createdRecordIds exists and is an array if (!Array.isArray(metadata.createdRecordIds)) { logger.error('Record creation response missing createdRecordIds array', { metadata }); throw new Error('Record created but no record IDs array was returned'); } const createdRecordIds = metadata.createdRecordIds; if (createdRecordIds.length === 0) { logger.error('Record creation response has empty createdRecordIds array', { metadata }); throw new Error('Record created but no record ID was returned'); } // Validate first record ID is a string const recordId = createdRecordIds[0]; if (typeof recordId !== 'string') { logger.error('Record creation response has invalid record ID type', { recordId, type: typeof recordId }); throw new Error('Record created but returned record ID is not a string'); } logger.info('Successfully created record', { recordId, tableId: table_id }); return { recordId, tableId: table_id, createdTime: new Date().toISOString() }; } } exports.CreateRecordTool = CreateRecordTool; //# sourceMappingURL=create_record.js.map