mcp-quickbase
Version:
Work with Quickbase via Model Context Protocol
123 lines • 4.54 kB
JavaScript
;
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