gcp-spanner-list-tables
Retrieve a list of tables from a Google Cloud Spanner database. Specify the instance ID and database ID to fetch table names for database management and analysis.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| databaseId | No | Spanner database ID (defaults to SPANNER_DATABASE env var) | |
| instanceId | No | Spanner instance ID (defaults to SPANNER_INSTANCE env var) |
Implementation Reference
- src/services/spanner/tools.ts:164-241 (handler)The handler function that lists Spanner tables by querying information_schema.tables, counts columns per table, and returns a formatted Markdown table with resource links.async ({ instanceId, databaseId }, _extra) => { try { const projectId = await getProjectId(); const config = await getSpannerConfig( Array.isArray(instanceId) ? instanceId[0] : instanceId, Array.isArray(databaseId) ? databaseId[0] : databaseId, ); const spanner = await getSpannerClient(); logger.debug( `Using Spanner client with project ID: ${spanner.projectId} for execute-spanner-query`, ); const instance = spanner.instance(config.instanceId); const database = instance.database(config.databaseId); // Query for tables // Execute query to list tables const [tablesResult] = await database.run({ sql: `SELECT t.table_name, (SELECT COUNT(1) FROM information_schema.columns WHERE table_name = t.table_name) as column_count FROM information_schema.tables t WHERE t.table_catalog = '' AND t.table_schema = '' ORDER BY t.table_name`, }); if (!tablesResult || tablesResult.length === 0) { return { content: [ { type: "text", text: `# Spanner Tables\n\nProject: ${projectId}\nInstance: ${config.instanceId}\nDatabase: ${config.databaseId}\n\nNo tables found in the database.`, }, ], }; } let markdown = `# Spanner Tables\n\nProject: ${projectId}\nInstance: ${config.instanceId}\nDatabase: ${config.databaseId}\n\n`; // Table header markdown += "| Table Name | Column Count |\n"; markdown += "|------------|-------------|\n"; // Table rows for (const row of tablesResult) { // Access the row properties directly // Extract table name and column count const tableName = ((row as any).table_name as string) || "unknown"; const columnCount = ((row as any).column_count as number) || 0; markdown += `| ${tableName} | ${columnCount} |\n`; } // Add resource links for further exploration markdown += "\n## Available Resources\n\n"; markdown += `- Schema: \`gcp-spanner://${projectId}/${config.instanceId}/${config.databaseId}/schema\`\n`; for (const row of tablesResult) { const tableName = ((row as any).table_name as string) || "unknown"; markdown += `- Table Preview: \`gcp-spanner://${projectId}/${config.instanceId}/${config.databaseId}/tables/${tableName}/preview\`\n`; } return { content: [ { type: "text", text: markdown, }, ], }; } catch (error: any) { logger.error( `Error listing Spanner tables: ${error instanceof Error ? error.message : String(error)}`, ); throw error; } },
- Input schema using Zod for optional instanceId and databaseId parameters.instanceId: z .string() .optional() .describe("Spanner instance ID (defaults to SPANNER_INSTANCE env var)"), databaseId: z .string() .optional() .describe("Spanner database ID (defaults to SPANNER_DATABASE env var)"), },
- src/services/spanner/tools.ts:152-242 (registration)Registers the 'gcp-spanner-list-tables' tool using server.tool() inside the registerSpannerTools function.server.tool( "gcp-spanner-list-tables", { instanceId: z .string() .optional() .describe("Spanner instance ID (defaults to SPANNER_INSTANCE env var)"), databaseId: z .string() .optional() .describe("Spanner database ID (defaults to SPANNER_DATABASE env var)"), }, async ({ instanceId, databaseId }, _extra) => { try { const projectId = await getProjectId(); const config = await getSpannerConfig( Array.isArray(instanceId) ? instanceId[0] : instanceId, Array.isArray(databaseId) ? databaseId[0] : databaseId, ); const spanner = await getSpannerClient(); logger.debug( `Using Spanner client with project ID: ${spanner.projectId} for execute-spanner-query`, ); const instance = spanner.instance(config.instanceId); const database = instance.database(config.databaseId); // Query for tables // Execute query to list tables const [tablesResult] = await database.run({ sql: `SELECT t.table_name, (SELECT COUNT(1) FROM information_schema.columns WHERE table_name = t.table_name) as column_count FROM information_schema.tables t WHERE t.table_catalog = '' AND t.table_schema = '' ORDER BY t.table_name`, }); if (!tablesResult || tablesResult.length === 0) { return { content: [ { type: "text", text: `# Spanner Tables\n\nProject: ${projectId}\nInstance: ${config.instanceId}\nDatabase: ${config.databaseId}\n\nNo tables found in the database.`, }, ], }; } let markdown = `# Spanner Tables\n\nProject: ${projectId}\nInstance: ${config.instanceId}\nDatabase: ${config.databaseId}\n\n`; // Table header markdown += "| Table Name | Column Count |\n"; markdown += "|------------|-------------|\n"; // Table rows for (const row of tablesResult) { // Access the row properties directly // Extract table name and column count const tableName = ((row as any).table_name as string) || "unknown"; const columnCount = ((row as any).column_count as number) || 0; markdown += `| ${tableName} | ${columnCount} |\n`; } // Add resource links for further exploration markdown += "\n## Available Resources\n\n"; markdown += `- Schema: \`gcp-spanner://${projectId}/${config.instanceId}/${config.databaseId}/schema\`\n`; for (const row of tablesResult) { const tableName = ((row as any).table_name as string) || "unknown"; markdown += `- Table Preview: \`gcp-spanner://${projectId}/${config.instanceId}/${config.databaseId}/tables/${tableName}/preview\`\n`; } return { content: [ { type: "text", text: markdown, }, ], }; } catch (error: any) { logger.error( `Error listing Spanner tables: ${error instanceof Error ? error.message : String(error)}`, ); throw error; } }, );
- src/index.ts:170-170 (registration)Top-level call to registerSpannerTools(server) which includes the gcp-spanner-list-tables tool.registerSpannerTools(server);