script_projects_versions_create
Create a new version of a Google Apps Script project to track changes, manage deployments, and maintain project history.
Instructions
Creates a new version of a Google Apps Script project.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| scriptId | Yes | The ID of the script project. | |
| description | Yes | A description for the new version. |
Implementation Reference
- The handler function that executes the tool's core logic: authenticates via OAuth, makes a POST request to the Google Apps Script API to create a new project version, handles responses and errors with detailed logging.const executeFunction = async ({ scriptId, description }) => { const baseUrl = 'https://script.googleapis.com'; const url = `${baseUrl}/v1/projects/${scriptId}/versions`; const startTime = Date.now(); const body = JSON.stringify({ description }); try { logger.info('VERSION_CREATE', 'Starting version creation', { scriptId, description }); // Get OAuth access token const token = await getOAuthAccessToken(); // Set up headers for the request const headers = { 'Content-Type': 'application/json', 'Accept': 'application/json', 'Authorization': `Bearer ${token}` }; logger.logAPICall('POST', url, headers, { description }); // Perform the fetch request const fetchStartTime = Date.now(); const response = await fetch(url, { method: 'POST', headers, body }); const fetchDuration = Date.now() - fetchStartTime; const responseSize = response.headers.get('content-length') || 'unknown'; logger.logAPIResponse('POST', url, response.status, fetchDuration, responseSize); // Check if the response was successful if (!response.ok) { const errorText = await response.text(); let errorData; try { errorData = JSON.parse(errorText); } catch (parseError) { errorData = { message: errorText }; } const detailedError = { status: response.status, statusText: response.statusText, url, errorResponse: errorData, duration: Date.now() - startTime, scriptId, description, timestamp: new Date().toISOString() }; logger.error('VERSION_CREATE', 'API request failed', detailedError); console.error('❌ API Error Details:', JSON.stringify(detailedError, null, 2)); throw new Error(`API Error (${response.status}): ${errorData.error?.message || errorData.message || 'Unknown error'}`); } // Parse and return the response data const data = await response.json(); logger.info('VERSION_CREATE', 'Successfully created version', { scriptId, versionNumber: data.versionNumber, description, duration: Date.now() - startTime }); console.log('✅ Successfully created version'); return data; } catch (error) { const errorDetails = { message: error.message, stack: error.stack, scriptId, description, duration: Date.now() - startTime, timestamp: new Date().toISOString(), errorType: error.name || 'Unknown' }; logger.error('VERSION_CREATE', 'Error creating version', errorDetails); console.error('❌ Error creating version:', errorDetails); // Return detailed error information for debugging return { error: true, message: error.message, details: errorDetails, rawError: { name: error.name, stack: error.stack } }; } };
- The tool schema defining the function name, description, input parameters (scriptId and description as required strings), and structure used for MCP tool validation.name: 'script_projects_versions_create', description: 'Creates a new version of a Google Apps Script project.', parameters: { type: 'object', properties: { scriptId: { type: 'string', description: 'The ID of the script project.' }, description: { type: 'string', description: 'A description for the new version.' } }, required: ['scriptId', 'description'] }
- tools/google-app-script-api/apps-script-api/script-projects-versions-create.js:122-147 (registration)The apiTool export object that bundles the handler function reference and tool definition (name, schema). This object is dynamically imported and registered by lib/tools.js during tool discovery in the MCP server.const apiTool = { function: executeFunction, definition: { type: 'function', function: { name: 'script_projects_versions_create', description: 'Creates a new version of a Google Apps Script project.', parameters: { type: 'object', properties: { scriptId: { type: 'string', description: 'The ID of the script project.' }, description: { type: 'string', description: 'A description for the new version.' } }, required: ['scriptId', 'description'] } } } }; export { apiTool };
- lib/tools.js:8-64 (registration)The discoverTools function dynamically imports all apiTool exports from toolPaths (including this tool's path), wraps handlers with logging, and returns the list of tools used by the MCP server for registration.export async function discoverTools() { logger.info('DISCOVERY', `Starting tool discovery for ${toolPaths.length} tool paths`); const toolPromises = toolPaths.map(async (file) => { try { logger.debug('DISCOVERY', `Loading tool from: ${file}`); const module = await import(`../tools/${file}`); if (!module.apiTool) { logger.warn('DISCOVERY', `Tool file missing apiTool export: ${file}`); return null; } const toolName = module.apiTool.definition?.function?.name; if (!toolName) { logger.warn('DISCOVERY', `Tool missing function name: ${file}`); return null; } // Wrap the original function with logging const originalFunction = module.apiTool.function; const wrappedFunction = withLogging(toolName, originalFunction); logger.debug('DISCOVERY', `Successfully loaded tool: ${toolName}`, { file, toolName, description: module.apiTool.definition?.function?.description }); return { ...module.apiTool, function: wrappedFunction, path: file, }; } catch (error) { logger.error('DISCOVERY', `Failed to load tool: ${file}`, { file, error: { message: error.message, stack: error.stack } }); return null; } }); const tools = (await Promise.all(toolPromises)).filter(Boolean); logger.info('DISCOVERY', `Tool discovery completed`, { totalPaths: toolPaths.length, successfullyLoaded: tools.length, failed: toolPaths.length - tools.length, toolNames: tools.map(t => t.definition?.function?.name).filter(Boolean) }); return tools; }