@neverinfamous/postgres-mcp 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/README.md +68 -62
  2. package/dist/adapters/postgresql/PostgresAdapter.d.ts.map +1 -1
  3. package/dist/adapters/postgresql/PostgresAdapter.js +53 -3
  4. package/dist/adapters/postgresql/PostgresAdapter.js.map +1 -1
  5. package/dist/adapters/postgresql/prompts/ltree.js +2 -2
  6. package/dist/adapters/postgresql/prompts/ltree.js.map +1 -1
  7. package/dist/adapters/postgresql/schemas/admin.d.ts +10 -5
  8. package/dist/adapters/postgresql/schemas/admin.d.ts.map +1 -1
  9. package/dist/adapters/postgresql/schemas/admin.js +10 -5
  10. package/dist/adapters/postgresql/schemas/admin.js.map +1 -1
  11. package/dist/adapters/postgresql/schemas/backup.d.ts +8 -4
  12. package/dist/adapters/postgresql/schemas/backup.d.ts.map +1 -1
  13. package/dist/adapters/postgresql/schemas/backup.js +11 -4
  14. package/dist/adapters/postgresql/schemas/backup.js.map +1 -1
  15. package/dist/adapters/postgresql/schemas/core.d.ts +53 -19
  16. package/dist/adapters/postgresql/schemas/core.d.ts.map +1 -1
  17. package/dist/adapters/postgresql/schemas/core.js +61 -17
  18. package/dist/adapters/postgresql/schemas/core.js.map +1 -1
  19. package/dist/adapters/postgresql/schemas/cron.d.ts +51 -32
  20. package/dist/adapters/postgresql/schemas/cron.d.ts.map +1 -1
  21. package/dist/adapters/postgresql/schemas/cron.js +64 -44
  22. package/dist/adapters/postgresql/schemas/cron.js.map +1 -1
  23. package/dist/adapters/postgresql/schemas/extensions.d.ts +168 -73
  24. package/dist/adapters/postgresql/schemas/extensions.d.ts.map +1 -1
  25. package/dist/adapters/postgresql/schemas/extensions.js +177 -60
  26. package/dist/adapters/postgresql/schemas/extensions.js.map +1 -1
  27. package/dist/adapters/postgresql/schemas/index.d.ts +5 -5
  28. package/dist/adapters/postgresql/schemas/index.d.ts.map +1 -1
  29. package/dist/adapters/postgresql/schemas/index.js +9 -7
  30. package/dist/adapters/postgresql/schemas/index.js.map +1 -1
  31. package/dist/adapters/postgresql/schemas/jsonb.d.ts +94 -42
  32. package/dist/adapters/postgresql/schemas/jsonb.d.ts.map +1 -1
  33. package/dist/adapters/postgresql/schemas/jsonb.js +101 -30
  34. package/dist/adapters/postgresql/schemas/jsonb.js.map +1 -1
  35. package/dist/adapters/postgresql/schemas/monitoring.d.ts +28 -11
  36. package/dist/adapters/postgresql/schemas/monitoring.d.ts.map +1 -1
  37. package/dist/adapters/postgresql/schemas/monitoring.js +49 -24
  38. package/dist/adapters/postgresql/schemas/monitoring.js.map +1 -1
  39. package/dist/adapters/postgresql/schemas/partitioning.d.ts +5 -4
  40. package/dist/adapters/postgresql/schemas/partitioning.d.ts.map +1 -1
  41. package/dist/adapters/postgresql/schemas/partitioning.js +5 -4
  42. package/dist/adapters/postgresql/schemas/partitioning.js.map +1 -1
  43. package/dist/adapters/postgresql/schemas/performance.d.ts +60 -30
  44. package/dist/adapters/postgresql/schemas/performance.d.ts.map +1 -1
  45. package/dist/adapters/postgresql/schemas/performance.js +85 -22
  46. package/dist/adapters/postgresql/schemas/performance.js.map +1 -1
  47. package/dist/adapters/postgresql/schemas/postgis.d.ts +20 -0
  48. package/dist/adapters/postgresql/schemas/postgis.d.ts.map +1 -1
  49. package/dist/adapters/postgresql/schemas/postgis.js +20 -0
  50. package/dist/adapters/postgresql/schemas/postgis.js.map +1 -1
  51. package/dist/adapters/postgresql/schemas/schema-mgmt.d.ts +35 -23
  52. package/dist/adapters/postgresql/schemas/schema-mgmt.d.ts.map +1 -1
  53. package/dist/adapters/postgresql/schemas/schema-mgmt.js +69 -26
  54. package/dist/adapters/postgresql/schemas/schema-mgmt.js.map +1 -1
  55. package/dist/adapters/postgresql/schemas/stats.d.ts +33 -20
  56. package/dist/adapters/postgresql/schemas/stats.d.ts.map +1 -1
  57. package/dist/adapters/postgresql/schemas/stats.js +36 -20
  58. package/dist/adapters/postgresql/schemas/stats.js.map +1 -1
  59. package/dist/adapters/postgresql/schemas/text-search.d.ts +8 -5
  60. package/dist/adapters/postgresql/schemas/text-search.d.ts.map +1 -1
  61. package/dist/adapters/postgresql/schemas/text-search.js +11 -4
  62. package/dist/adapters/postgresql/schemas/text-search.js.map +1 -1
  63. package/dist/adapters/postgresql/tools/admin.d.ts.map +1 -1
  64. package/dist/adapters/postgresql/tools/admin.js +211 -140
  65. package/dist/adapters/postgresql/tools/admin.js.map +1 -1
  66. package/dist/adapters/postgresql/tools/backup/dump.d.ts.map +1 -1
  67. package/dist/adapters/postgresql/tools/backup/dump.js +360 -337
  68. package/dist/adapters/postgresql/tools/backup/dump.js.map +1 -1
  69. package/dist/adapters/postgresql/tools/citext.d.ts.map +1 -1
  70. package/dist/adapters/postgresql/tools/citext.js +221 -163
  71. package/dist/adapters/postgresql/tools/citext.js.map +1 -1
  72. package/dist/adapters/postgresql/tools/core/convenience.d.ts +9 -1
  73. package/dist/adapters/postgresql/tools/core/convenience.d.ts.map +1 -1
  74. package/dist/adapters/postgresql/tools/core/convenience.js +78 -11
  75. package/dist/adapters/postgresql/tools/core/convenience.js.map +1 -1
  76. package/dist/adapters/postgresql/tools/core/error-helpers.d.ts +48 -0
  77. package/dist/adapters/postgresql/tools/core/error-helpers.d.ts.map +1 -0
  78. package/dist/adapters/postgresql/tools/core/error-helpers.js +256 -0
  79. package/dist/adapters/postgresql/tools/core/error-helpers.js.map +1 -0
  80. package/dist/adapters/postgresql/tools/core/health.d.ts.map +1 -1
  81. package/dist/adapters/postgresql/tools/core/health.js +18 -4
  82. package/dist/adapters/postgresql/tools/core/health.js.map +1 -1
  83. package/dist/adapters/postgresql/tools/core/indexes.d.ts.map +1 -1
  84. package/dist/adapters/postgresql/tools/core/indexes.js +45 -4
  85. package/dist/adapters/postgresql/tools/core/indexes.js.map +1 -1
  86. package/dist/adapters/postgresql/tools/core/objects.d.ts.map +1 -1
  87. package/dist/adapters/postgresql/tools/core/objects.js +104 -85
  88. package/dist/adapters/postgresql/tools/core/objects.js.map +1 -1
  89. package/dist/adapters/postgresql/tools/core/query.d.ts.map +1 -1
  90. package/dist/adapters/postgresql/tools/core/query.js +100 -42
  91. package/dist/adapters/postgresql/tools/core/query.js.map +1 -1
  92. package/dist/adapters/postgresql/tools/core/schemas.d.ts +51 -25
  93. package/dist/adapters/postgresql/tools/core/schemas.d.ts.map +1 -1
  94. package/dist/adapters/postgresql/tools/core/schemas.js +51 -25
  95. package/dist/adapters/postgresql/tools/core/schemas.js.map +1 -1
  96. package/dist/adapters/postgresql/tools/core/tables.d.ts.map +1 -1
  97. package/dist/adapters/postgresql/tools/core/tables.js +68 -28
  98. package/dist/adapters/postgresql/tools/core/tables.js.map +1 -1
  99. package/dist/adapters/postgresql/tools/cron.d.ts.map +1 -1
  100. package/dist/adapters/postgresql/tools/cron.js +274 -179
  101. package/dist/adapters/postgresql/tools/cron.js.map +1 -1
  102. package/dist/adapters/postgresql/tools/jsonb/advanced.d.ts.map +1 -1
  103. package/dist/adapters/postgresql/tools/jsonb/advanced.js +372 -284
  104. package/dist/adapters/postgresql/tools/jsonb/advanced.js.map +1 -1
  105. package/dist/adapters/postgresql/tools/jsonb/basic.d.ts.map +1 -1
  106. package/dist/adapters/postgresql/tools/jsonb/basic.js +617 -398
  107. package/dist/adapters/postgresql/tools/jsonb/basic.js.map +1 -1
  108. package/dist/adapters/postgresql/tools/kcache.d.ts.map +1 -1
  109. package/dist/adapters/postgresql/tools/kcache.js +278 -246
  110. package/dist/adapters/postgresql/tools/kcache.js.map +1 -1
  111. package/dist/adapters/postgresql/tools/ltree.d.ts.map +1 -1
  112. package/dist/adapters/postgresql/tools/ltree.js +121 -35
  113. package/dist/adapters/postgresql/tools/ltree.js.map +1 -1
  114. package/dist/adapters/postgresql/tools/monitoring.d.ts.map +1 -1
  115. package/dist/adapters/postgresql/tools/monitoring.js +54 -34
  116. package/dist/adapters/postgresql/tools/monitoring.js.map +1 -1
  117. package/dist/adapters/postgresql/tools/partitioning.d.ts.map +1 -1
  118. package/dist/adapters/postgresql/tools/partitioning.js +79 -15
  119. package/dist/adapters/postgresql/tools/partitioning.js.map +1 -1
  120. package/dist/adapters/postgresql/tools/partman/management.d.ts.map +1 -1
  121. package/dist/adapters/postgresql/tools/partman/management.js +11 -4
  122. package/dist/adapters/postgresql/tools/partman/management.js.map +1 -1
  123. package/dist/adapters/postgresql/tools/partman/operations.d.ts.map +1 -1
  124. package/dist/adapters/postgresql/tools/partman/operations.js +132 -19
  125. package/dist/adapters/postgresql/tools/partman/operations.js.map +1 -1
  126. package/dist/adapters/postgresql/tools/performance/analysis.d.ts.map +1 -1
  127. package/dist/adapters/postgresql/tools/performance/analysis.js +264 -160
  128. package/dist/adapters/postgresql/tools/performance/analysis.js.map +1 -1
  129. package/dist/adapters/postgresql/tools/performance/explain.d.ts.map +1 -1
  130. package/dist/adapters/postgresql/tools/performance/explain.js +61 -21
  131. package/dist/adapters/postgresql/tools/performance/explain.js.map +1 -1
  132. package/dist/adapters/postgresql/tools/performance/monitoring.d.ts.map +1 -1
  133. package/dist/adapters/postgresql/tools/performance/monitoring.js +44 -7
  134. package/dist/adapters/postgresql/tools/performance/monitoring.js.map +1 -1
  135. package/dist/adapters/postgresql/tools/performance/optimization.d.ts.map +1 -1
  136. package/dist/adapters/postgresql/tools/performance/optimization.js +92 -81
  137. package/dist/adapters/postgresql/tools/performance/optimization.js.map +1 -1
  138. package/dist/adapters/postgresql/tools/performance/stats.d.ts.map +1 -1
  139. package/dist/adapters/postgresql/tools/performance/stats.js +124 -36
  140. package/dist/adapters/postgresql/tools/performance/stats.js.map +1 -1
  141. package/dist/adapters/postgresql/tools/pgcrypto.d.ts.map +1 -1
  142. package/dist/adapters/postgresql/tools/pgcrypto.js +244 -89
  143. package/dist/adapters/postgresql/tools/pgcrypto.js.map +1 -1
  144. package/dist/adapters/postgresql/tools/postgis/advanced.d.ts.map +1 -1
  145. package/dist/adapters/postgresql/tools/postgis/advanced.js +285 -222
  146. package/dist/adapters/postgresql/tools/postgis/advanced.js.map +1 -1
  147. package/dist/adapters/postgresql/tools/postgis/basic.d.ts.map +1 -1
  148. package/dist/adapters/postgresql/tools/postgis/basic.js +359 -249
  149. package/dist/adapters/postgresql/tools/postgis/basic.js.map +1 -1
  150. package/dist/adapters/postgresql/tools/postgis/standalone.d.ts.map +1 -1
  151. package/dist/adapters/postgresql/tools/postgis/standalone.js +135 -51
  152. package/dist/adapters/postgresql/tools/postgis/standalone.js.map +1 -1
  153. package/dist/adapters/postgresql/tools/schema.d.ts.map +1 -1
  154. package/dist/adapters/postgresql/tools/schema.js +504 -231
  155. package/dist/adapters/postgresql/tools/schema.js.map +1 -1
  156. package/dist/adapters/postgresql/tools/stats/advanced.d.ts.map +1 -1
  157. package/dist/adapters/postgresql/tools/stats/advanced.js +515 -476
  158. package/dist/adapters/postgresql/tools/stats/advanced.js.map +1 -1
  159. package/dist/adapters/postgresql/tools/stats/basic.d.ts.map +1 -1
  160. package/dist/adapters/postgresql/tools/stats/basic.js +302 -293
  161. package/dist/adapters/postgresql/tools/stats/basic.js.map +1 -1
  162. package/dist/adapters/postgresql/tools/text.d.ts.map +1 -1
  163. package/dist/adapters/postgresql/tools/text.js +392 -218
  164. package/dist/adapters/postgresql/tools/text.js.map +1 -1
  165. package/dist/adapters/postgresql/tools/transactions.d.ts.map +1 -1
  166. package/dist/adapters/postgresql/tools/transactions.js +157 -50
  167. package/dist/adapters/postgresql/tools/transactions.js.map +1 -1
  168. package/dist/adapters/postgresql/tools/vector/advanced.d.ts.map +1 -1
  169. package/dist/adapters/postgresql/tools/vector/advanced.js +18 -0
  170. package/dist/adapters/postgresql/tools/vector/advanced.js.map +1 -1
  171. package/dist/adapters/postgresql/tools/vector/basic.d.ts.map +1 -1
  172. package/dist/adapters/postgresql/tools/vector/basic.js +100 -53
  173. package/dist/adapters/postgresql/tools/vector/basic.js.map +1 -1
  174. package/dist/codemode/api.js +1 -1
  175. package/dist/codemode/api.js.map +1 -1
  176. package/dist/constants/ServerInstructions.d.ts +1 -1
  177. package/dist/constants/ServerInstructions.d.ts.map +1 -1
  178. package/dist/constants/ServerInstructions.js +45 -7
  179. package/dist/constants/ServerInstructions.js.map +1 -1
  180. package/package.json +9 -5
@@ -3,9 +3,10 @@
3
3
  *
4
4
  * Advanced spatial tools: geocode, geo_transform, geo_index_optimize, geo_cluster.
5
5
  */
6
- import { z } from "zod";
6
+ import { z, ZodError } from "zod";
7
7
  import { readOnly } from "../../../../utils/annotations.js";
8
8
  import { getToolIcons } from "../../../../utils/icons.js";
9
+ import { formatPostgresError } from "../core/error-helpers.js";
9
10
  import { GeocodeSchemaBase, GeocodeSchema, GeoTransformSchemaBase, GeoTransformSchema, GeoClusterSchemaBase, GeoClusterSchema,
10
11
  // Output schemas
11
12
  GeocodeOutputSchema, GeoTransformOutputSchema, GeoIndexOptimizeOutputSchema, GeoClusterOutputSchema, } from "../../schemas/index.js";
@@ -19,27 +20,41 @@ export function createGeocodeTool(adapter) {
19
20
  annotations: readOnly("Geocode"),
20
21
  icons: getToolIcons("postgis", readOnly("Geocode")),
21
22
  handler: async (params, _context) => {
22
- const parsed = GeocodeSchema.parse(params ?? {});
23
- const srid = parsed.srid ?? 4326;
24
- const sql = `SELECT
23
+ try {
24
+ const parsed = GeocodeSchema.parse(params ?? {});
25
+ const srid = parsed.srid ?? 4326;
26
+ const sql = `SELECT
25
27
  ST_AsGeoJSON(ST_SetSRID(ST_MakePoint($1, $2), $3)) as geojson,
26
28
  ST_AsText(ST_SetSRID(ST_MakePoint($1, $2), $3)) as wkt`;
27
- const result = await adapter.executeQuery(sql, [
28
- parsed.lng,
29
- parsed.lat,
30
- srid,
31
- ]);
32
- // Add note about SRID for non-4326 cases
33
- const row = result.rows?.[0];
34
- if (row === undefined) {
35
- return {};
29
+ const result = await adapter.executeQuery(sql, [
30
+ parsed.lng,
31
+ parsed.lat,
32
+ srid,
33
+ ]);
34
+ // Add note about SRID for non-4326 cases
35
+ const row = result.rows?.[0];
36
+ if (row === undefined) {
37
+ return {};
38
+ }
39
+ const response = { ...row };
40
+ if (srid !== 4326) {
41
+ response["note"] =
42
+ `Coordinates are WGS84 lat/lng with SRID ${String(srid)} metadata. Use pg_geo_transform to convert to target CRS.`;
43
+ }
44
+ return response;
36
45
  }
37
- const response = { ...row };
38
- if (srid !== 4326) {
39
- response["note"] =
40
- `Coordinates are WGS84 lat/lng with SRID ${String(srid)} metadata. Use pg_geo_transform to convert to target CRS.`;
46
+ catch (error) {
47
+ if (error instanceof ZodError) {
48
+ return {
49
+ success: false,
50
+ error: error.issues.map((i) => i.message).join("; "),
51
+ };
52
+ }
53
+ return {
54
+ success: false,
55
+ error: formatPostgresError(error, { tool: "pg_geocode" }),
56
+ };
41
57
  }
42
- return response;
43
58
  },
44
59
  };
45
60
  }
@@ -56,84 +71,114 @@ export function createGeoTransformTool(adapter) {
56
71
  annotations: readOnly("Transform Geometry"),
57
72
  icons: getToolIcons("postgis", readOnly("Transform Geometry")),
58
73
  handler: async (params, _context) => {
59
- const parsed = GeoTransformSchema.parse(params ?? {});
60
- const schemaName = parsed.schema ?? "public";
61
- const qualifiedTable = schemaName !== "public"
62
- ? `"${schemaName}"."${parsed.table}"`
63
- : `"${parsed.table}"`;
64
- const columnName = `"${parsed.column}"`;
65
- // Auto-detect fromSrid from column metadata if not provided
66
- let fromSrid = parsed.fromSrid;
67
- if (fromSrid === 0) {
68
- const sridQuery = `
69
- SELECT srid FROM geometry_columns
70
- WHERE f_table_schema = $1 AND f_table_name = $2 AND f_geometry_column = $3
71
- UNION
72
- SELECT srid FROM geography_columns
73
- WHERE f_table_schema = $1 AND f_table_name = $2 AND f_geography_column = $3
74
- LIMIT 1
74
+ try {
75
+ const parsed = GeoTransformSchema.parse(params ?? {});
76
+ const schemaName = parsed.schema ?? "public";
77
+ const qualifiedTable = schemaName !== "public"
78
+ ? `"${schemaName}"."${parsed.table}"`
79
+ : `"${parsed.table}"`;
80
+ const columnName = `"${parsed.column}"`;
81
+ // Auto-detect fromSrid from column metadata if not provided
82
+ let fromSrid = parsed.fromSrid;
83
+ if (fromSrid === 0) {
84
+ // Check if table exists before attempting SRID auto-detection
85
+ const tableCheckSql = `SELECT 1 FROM information_schema.tables WHERE table_schema = $1 AND table_name = $2`;
86
+ const tableCheckResult = await adapter.executeQuery(tableCheckSql, [
87
+ schemaName,
88
+ parsed.table,
89
+ ]);
90
+ if ((tableCheckResult.rows?.length ?? 0) === 0) {
91
+ return {
92
+ success: false,
93
+ error: `Table or view '${parsed.table}' not found. Use pg_list_tables to see available tables.`,
94
+ };
95
+ }
96
+ const sridQuery = `
97
+ SELECT srid FROM geometry_columns
98
+ WHERE f_table_schema = $1 AND f_table_name = $2 AND f_geometry_column = $3
99
+ UNION
100
+ SELECT srid FROM geography_columns
101
+ WHERE f_table_schema = $1 AND f_table_name = $2 AND f_geography_column = $3
102
+ LIMIT 1
103
+ `;
104
+ const sridResult = await adapter.executeQuery(sridQuery, [
105
+ schemaName,
106
+ parsed.table,
107
+ parsed.column,
108
+ ]);
109
+ const sridValue = sridResult.rows?.[0]?.["srid"];
110
+ if (sridValue !== undefined && sridValue !== null) {
111
+ fromSrid = Number(sridValue);
112
+ }
113
+ else {
114
+ return {
115
+ success: false,
116
+ error: `Could not auto-detect SRID for column "${parsed.column}" on table "${parsed.table}". Provide fromSrid (or sourceSrid) explicitly.`,
117
+ suggestion: `Use fromSrid: 4326 for WGS84/GPS coordinates, or fromSrid: 3857 for Web Mercator`,
118
+ };
119
+ }
120
+ }
121
+ const whereClause = parsed.where !== undefined ? `WHERE ${parsed.where}` : "";
122
+ // Default limit of 50 to prevent large payloads, use limit: 0 for all
123
+ const effectiveLimit = parsed.limit ?? 50;
124
+ const limitClause = effectiveLimit > 0 ? `LIMIT ${String(effectiveLimit)}` : "";
125
+ // Get non-geometry columns to avoid returning raw WKB
126
+ const colQuery = `
127
+ SELECT column_name FROM information_schema.columns
128
+ WHERE table_schema = $1 AND table_name = $2
129
+ AND udt_name NOT IN ('geometry', 'geography')
130
+ ORDER BY ordinal_position
75
131
  `;
76
- const sridResult = await adapter.executeQuery(sridQuery, [
132
+ const colResult = await adapter.executeQuery(colQuery, [
77
133
  schemaName,
78
134
  parsed.table,
79
- parsed.column,
80
135
  ]);
81
- const sridValue = sridResult.rows?.[0]?.["srid"];
82
- if (sridValue !== undefined && sridValue !== null) {
83
- fromSrid = Number(sridValue);
136
+ const nonGeomCols = (colResult.rows ?? [])
137
+ .map((row) => `"${String(row["column_name"])}"`)
138
+ .join(", ");
139
+ // Select non-geometry columns + transformed geometry representations
140
+ const selectCols = nonGeomCols.length > 0
141
+ ? `${nonGeomCols}, ST_AsGeoJSON(ST_Transform(ST_SetSRID(${columnName}, ${String(fromSrid)}), ${String(parsed.toSrid)})) as transformed_geojson, ST_AsText(ST_Transform(ST_SetSRID(${columnName}, ${String(fromSrid)}), ${String(parsed.toSrid)})) as transformed_wkt, ${String(parsed.toSrid)} as output_srid`
142
+ : `ST_AsGeoJSON(ST_Transform(ST_SetSRID(${columnName}, ${String(fromSrid)}), ${String(parsed.toSrid)})) as transformed_geojson, ST_AsText(ST_Transform(ST_SetSRID(${columnName}, ${String(fromSrid)}), ${String(parsed.toSrid)})) as transformed_wkt, ${String(parsed.toSrid)} as output_srid`;
143
+ const sql = `SELECT ${selectCols} FROM ${qualifiedTable} ${whereClause} ${limitClause}`;
144
+ const result = await adapter.executeQuery(sql);
145
+ // Build response with truncation indicators if default limit was applied
146
+ const response = {
147
+ results: result.rows,
148
+ count: result.rows?.length ?? 0,
149
+ fromSrid: fromSrid,
150
+ toSrid: parsed.toSrid,
151
+ ...(parsed.fromSrid === 0 && { autoDetectedSrid: true }),
152
+ };
153
+ // Check if results were truncated (works for both default and explicit limits)
154
+ if (effectiveLimit > 0) {
155
+ const countSql = `SELECT COUNT(*) as cnt FROM ${qualifiedTable} ${whereClause}`;
156
+ const countResult = await adapter.executeQuery(countSql);
157
+ const totalCount = Number(countResult.rows?.[0]?.["cnt"] ?? 0);
158
+ if (totalCount > effectiveLimit) {
159
+ response["truncated"] = true;
160
+ response["totalCount"] = totalCount;
161
+ response["limit"] = effectiveLimit;
162
+ }
84
163
  }
85
- else {
164
+ return response;
165
+ }
166
+ catch (error) {
167
+ if (error instanceof ZodError) {
86
168
  return {
87
169
  success: false,
88
- error: `Could not auto-detect SRID for column "${parsed.column}" on table "${parsed.table}". Provide fromSrid (or sourceSrid) explicitly.`,
89
- suggestion: `Use fromSrid: 4326 for WGS84/GPS coordinates, or fromSrid: 3857 for Web Mercator`,
170
+ error: error.issues.map((i) => i.message).join("; "),
90
171
  };
91
172
  }
173
+ return {
174
+ success: false,
175
+ error: formatPostgresError(error, {
176
+ tool: "pg_geo_transform",
177
+ table: params?.["table"] ??
178
+ undefined,
179
+ }),
180
+ };
92
181
  }
93
- const whereClause = parsed.where !== undefined ? `WHERE ${parsed.where}` : "";
94
- // Default limit of 50 to prevent large payloads, use limit: 0 for all
95
- const effectiveLimit = parsed.limit ?? 50;
96
- const limitClause = effectiveLimit > 0 ? `LIMIT ${String(effectiveLimit)}` : "";
97
- // Get non-geometry columns to avoid returning raw WKB
98
- const colQuery = `
99
- SELECT column_name FROM information_schema.columns
100
- WHERE table_schema = $1 AND table_name = $2
101
- AND udt_name NOT IN ('geometry', 'geography')
102
- ORDER BY ordinal_position
103
- `;
104
- const colResult = await adapter.executeQuery(colQuery, [
105
- schemaName,
106
- parsed.table,
107
- ]);
108
- const nonGeomCols = (colResult.rows ?? [])
109
- .map((row) => `"${String(row["column_name"])}"`)
110
- .join(", ");
111
- // Select non-geometry columns + transformed geometry representations
112
- const selectCols = nonGeomCols.length > 0
113
- ? `${nonGeomCols}, ST_AsGeoJSON(ST_Transform(ST_SetSRID(${columnName}, ${String(fromSrid)}), ${String(parsed.toSrid)})) as transformed_geojson, ST_AsText(ST_Transform(ST_SetSRID(${columnName}, ${String(fromSrid)}), ${String(parsed.toSrid)})) as transformed_wkt, ${String(parsed.toSrid)} as output_srid`
114
- : `ST_AsGeoJSON(ST_Transform(ST_SetSRID(${columnName}, ${String(fromSrid)}), ${String(parsed.toSrid)})) as transformed_geojson, ST_AsText(ST_Transform(ST_SetSRID(${columnName}, ${String(fromSrid)}), ${String(parsed.toSrid)})) as transformed_wkt, ${String(parsed.toSrid)} as output_srid`;
115
- const sql = `SELECT ${selectCols} FROM ${qualifiedTable} ${whereClause} ${limitClause}`;
116
- const result = await adapter.executeQuery(sql);
117
- // Build response with truncation indicators if default limit was applied
118
- const response = {
119
- results: result.rows,
120
- count: result.rows?.length ?? 0,
121
- fromSrid: fromSrid,
122
- toSrid: parsed.toSrid,
123
- ...(parsed.fromSrid === 0 && { autoDetectedSrid: true }),
124
- };
125
- // Check if results were truncated (works for both default and explicit limits)
126
- if (effectiveLimit > 0) {
127
- const countSql = `SELECT COUNT(*) as cnt FROM ${qualifiedTable} ${whereClause}`;
128
- const countResult = await adapter.executeQuery(countSql);
129
- const totalCount = Number(countResult.rows?.[0]?.["cnt"] ?? 0);
130
- if (totalCount > effectiveLimit) {
131
- response["truncated"] = true;
132
- response["totalCount"] = totalCount;
133
- response["limit"] = effectiveLimit;
134
- }
135
- }
136
- return response;
137
182
  },
138
183
  };
139
184
  }
@@ -267,151 +312,169 @@ export function createGeoClusterTool(adapter) {
267
312
  annotations: readOnly("Geo Cluster"),
268
313
  icons: getToolIcons("postgis", readOnly("Geo Cluster")),
269
314
  handler: async (params, _context) => {
270
- const parsed = GeoClusterSchema.parse(params ?? {});
271
- const method = parsed.method ?? "dbscan";
272
- const schemaName = parsed.schema ?? "public";
273
- const qualifiedTable = schemaName !== "public"
274
- ? `"${schemaName}"."${parsed.table}"`
275
- : `"${parsed.table}"`;
276
- const whereClause = parsed.where !== undefined ? `WHERE ${parsed.where}` : "";
277
- const limitClause = parsed.limit !== undefined && parsed.limit > 0
278
- ? `LIMIT ${String(parsed.limit)}`
279
- : "";
280
- // Track warning if K > N
281
- let warning;
282
- // For K-Means, validate and adjust numClusters
283
- let effectiveNumClusters = parsed.numClusters ?? 5;
284
- let rowCount = 0;
285
- if (method === "kmeans") {
286
- // Validate numClusters > 0
287
- if (effectiveNumClusters <= 0) {
288
- return {
289
- error: `numClusters must be greater than 0 (received: ${String(effectiveNumClusters)}).`,
290
- method,
291
- table: parsed.table,
292
- numClusters: effectiveNumClusters,
293
- suggestion: "Provide a positive integer for numClusters (e.g., numClusters: 3)",
294
- };
315
+ try {
316
+ const parsed = GeoClusterSchema.parse(params ?? {});
317
+ const method = parsed.method ?? "dbscan";
318
+ const schemaName = parsed.schema ?? "public";
319
+ const qualifiedTable = schemaName !== "public"
320
+ ? `"${schemaName}"."${parsed.table}"`
321
+ : `"${parsed.table}"`;
322
+ const whereClause = parsed.where !== undefined ? `WHERE ${parsed.where}` : "";
323
+ const limitClause = parsed.limit !== undefined && parsed.limit > 0
324
+ ? `LIMIT ${String(parsed.limit)}`
325
+ : "";
326
+ // Track warning if K > N
327
+ let warning;
328
+ // For K-Means, validate and adjust numClusters
329
+ let effectiveNumClusters = parsed.numClusters ?? 5;
330
+ let rowCount;
331
+ if (method === "kmeans") {
332
+ // Validate numClusters > 0
333
+ if (effectiveNumClusters <= 0) {
334
+ return {
335
+ error: `numClusters must be greater than 0 (received: ${String(effectiveNumClusters)}).`,
336
+ method,
337
+ table: parsed.table,
338
+ numClusters: effectiveNumClusters,
339
+ suggestion: "Provide a positive integer for numClusters (e.g., numClusters: 3)",
340
+ };
341
+ }
342
+ const countResult = await adapter.executeQuery(`SELECT COUNT(*) as cnt FROM ${qualifiedTable} ${whereClause}`);
343
+ rowCount = Number(countResult.rows?.[0]?.["cnt"] ?? 0);
344
+ if (rowCount === 0) {
345
+ return {
346
+ error: `No rows found in table ${parsed.table}${whereClause !== "" ? " matching filter" : ""}. K-Means requires at least 1 row.`,
347
+ method,
348
+ table: parsed.table,
349
+ rowCount: 0,
350
+ };
351
+ }
352
+ // Clamp K to row count and warn if exceeded
353
+ if (effectiveNumClusters > rowCount) {
354
+ warning = `Requested ${String(parsed.numClusters)} clusters but only ${String(rowCount)} rows available. Using ${String(rowCount)} clusters instead.`;
355
+ effectiveNumClusters = rowCount;
356
+ }
295
357
  }
296
- const countResult = await adapter.executeQuery(`SELECT COUNT(*) as cnt FROM ${qualifiedTable} ${whereClause}`);
297
- rowCount = Number(countResult.rows?.[0]?.["cnt"] ?? 0);
298
- if (rowCount === 0) {
299
- return {
300
- error: `No rows found in table ${parsed.table}${whereClause !== "" ? " matching filter" : ""}. K-Means requires at least 1 row.`,
301
- method,
302
- table: parsed.table,
303
- rowCount: 0,
304
- };
358
+ let clusterFunction;
359
+ if (method === "kmeans") {
360
+ clusterFunction = `ST_ClusterKMeans("${parsed.column}", ${String(effectiveNumClusters)}) OVER ()`;
305
361
  }
306
- // Clamp K to row count and warn if exceeded
307
- if (effectiveNumClusters > rowCount) {
308
- warning = `Requested ${String(parsed.numClusters)} clusters but only ${String(rowCount)} rows available. Using ${String(rowCount)} clusters instead.`;
309
- effectiveNumClusters = rowCount;
362
+ else {
363
+ const eps = parsed.eps ?? 100;
364
+ const minPoints = parsed.minPoints ?? 3;
365
+ clusterFunction = `ST_ClusterDBSCAN("${parsed.column}", ${String(eps)}, ${String(minPoints)}) OVER ()`;
310
366
  }
311
- }
312
- let clusterFunction;
313
- if (method === "kmeans") {
314
- clusterFunction = `ST_ClusterKMeans("${parsed.column}", ${String(effectiveNumClusters)}) OVER ()`;
315
- }
316
- else {
317
- const eps = parsed.eps ?? 100;
318
- const minPoints = parsed.minPoints ?? 3;
319
- clusterFunction = `ST_ClusterDBSCAN("${parsed.column}", ${String(eps)}, ${String(minPoints)}) OVER ()`;
320
- }
321
- const sql = `
322
- WITH clustered AS (
323
- SELECT
324
- *,
325
- ${clusterFunction} as cluster_id
326
- FROM ${qualifiedTable}
327
- ${whereClause}
328
- )
329
- SELECT
330
- cluster_id,
331
- COUNT(*) as point_count,
332
- ST_AsGeoJSON(ST_Centroid(ST_Collect("${parsed.column}"))) as centroid,
333
- ST_AsGeoJSON(ST_ConvexHull(ST_Collect("${parsed.column}"))) as hull
334
- FROM clustered
335
- WHERE cluster_id IS NOT NULL
336
- GROUP BY cluster_id
337
- ORDER BY point_count DESC
338
- ${limitClause}
339
- `;
340
- const [clustersResult, summaryResult] = await Promise.all([
341
- adapter.executeQuery(sql),
342
- adapter.executeQuery(`
343
- WITH clustered AS (
344
- SELECT ${clusterFunction} as cluster_id
345
- FROM ${qualifiedTable}
346
- ${whereClause}
347
- )
348
- SELECT
349
- COUNT(DISTINCT cluster_id) as num_clusters,
350
- COUNT(*) FILTER (WHERE cluster_id IS NULL) as noise_points,
351
- COUNT(*) as total_points
352
- FROM clustered
353
- `),
354
- ]);
355
- // Normalize cluster point_count to numbers
356
- const normalizedClusters = (clustersResult.rows ?? []).map((row) => ({
357
- ...row,
358
- point_count: Number(row["point_count"]),
359
- }));
360
- // Normalize summary values to numbers for consistency
361
- const rawSummary = summaryResult.rows?.[0] ?? {};
362
- const normalizedSummary = {
363
- num_clusters: Number(rawSummary["num_clusters"] ?? 0),
364
- noise_points: Number(rawSummary["noise_points"] ?? 0),
365
- total_points: Number(rawSummary["total_points"] ?? 0),
366
- };
367
- // Build response
368
- const response = {
369
- method,
370
- parameters: method === "kmeans"
371
- ? { numClusters: effectiveNumClusters }
372
- : { eps: parsed.eps ?? 100, minPoints: parsed.minPoints ?? 3 },
373
- summary: normalizedSummary,
374
- clusters: normalizedClusters,
375
- };
376
- // Add warning if K was clamped
377
- if (warning !== undefined) {
378
- response["warning"] = warning;
379
- response["requestedClusters"] = parsed.numClusters;
380
- response["actualClusters"] = effectiveNumClusters;
381
- }
382
- // Add contextual hints based on method and results
383
- const numClusters = normalizedSummary.num_clusters;
384
- const noisePoints = normalizedSummary.noise_points;
385
- const totalPoints = normalizedSummary.total_points;
386
- if (method === "dbscan") {
387
- const eps = parsed.eps ?? 100;
388
- const minPoints = parsed.minPoints ?? 3;
389
- // Provide hints about DBSCAN parameter trade-offs
390
- const hints = [];
391
- if (numClusters === 1 && totalPoints > 1) {
392
- hints.push(`All ${String(totalPoints)} points formed a single cluster. Consider decreasing eps (currently ${String(eps)}m) to create more distinct clusters.`);
367
+ const sql = `
368
+ WITH clustered AS (
369
+ SELECT
370
+ *,
371
+ ${clusterFunction} as cluster_id
372
+ FROM ${qualifiedTable}
373
+ ${whereClause}
374
+ )
375
+ SELECT
376
+ cluster_id,
377
+ COUNT(*) as point_count,
378
+ ST_AsGeoJSON(ST_Centroid(ST_Collect("${parsed.column}"))) as centroid,
379
+ ST_AsGeoJSON(ST_ConvexHull(ST_Collect("${parsed.column}"))) as hull
380
+ FROM clustered
381
+ WHERE cluster_id IS NOT NULL
382
+ GROUP BY cluster_id
383
+ ORDER BY point_count DESC
384
+ ${limitClause}
385
+ `;
386
+ const [clustersResult, summaryResult] = await Promise.all([
387
+ adapter.executeQuery(sql),
388
+ adapter.executeQuery(`
389
+ WITH clustered AS (
390
+ SELECT ${clusterFunction} as cluster_id
391
+ FROM ${qualifiedTable}
392
+ ${whereClause}
393
+ )
394
+ SELECT
395
+ COUNT(DISTINCT cluster_id) as num_clusters,
396
+ COUNT(*) FILTER (WHERE cluster_id IS NULL) as noise_points,
397
+ COUNT(*) as total_points
398
+ FROM clustered
399
+ `),
400
+ ]);
401
+ // Normalize cluster point_count to numbers
402
+ const normalizedClusters = (clustersResult.rows ?? []).map((row) => ({
403
+ ...row,
404
+ point_count: Number(row["point_count"]),
405
+ }));
406
+ // Normalize summary values to numbers for consistency
407
+ const rawSummary = summaryResult.rows?.[0] ?? {};
408
+ const normalizedSummary = {
409
+ num_clusters: Number(rawSummary["num_clusters"] ?? 0),
410
+ noise_points: Number(rawSummary["noise_points"] ?? 0),
411
+ total_points: Number(rawSummary["total_points"] ?? 0),
412
+ };
413
+ // Build response
414
+ const response = {
415
+ method,
416
+ parameters: method === "kmeans"
417
+ ? { numClusters: effectiveNumClusters }
418
+ : { eps: parsed.eps ?? 100, minPoints: parsed.minPoints ?? 3 },
419
+ summary: normalizedSummary,
420
+ clusters: normalizedClusters,
421
+ };
422
+ // Add warning if K was clamped
423
+ if (warning !== undefined) {
424
+ response["warning"] = warning;
425
+ response["requestedClusters"] = parsed.numClusters;
426
+ response["actualClusters"] = effectiveNumClusters;
393
427
  }
394
- if (noisePoints > 0 && noisePoints > totalPoints * 0.5) {
395
- hints.push(`${String(noisePoints)} of ${String(totalPoints)} points (${String(Math.round((noisePoints / totalPoints) * 100))}%) are noise. Consider increasing eps or decreasing minPoints (currently ${String(minPoints)}).`);
428
+ // Add contextual hints based on method and results
429
+ const numClusters = normalizedSummary.num_clusters;
430
+ const noisePoints = normalizedSummary.noise_points;
431
+ const totalPoints = normalizedSummary.total_points;
432
+ if (method === "dbscan") {
433
+ const eps = parsed.eps ?? 100;
434
+ const minPoints = parsed.minPoints ?? 3;
435
+ // Provide hints about DBSCAN parameter trade-offs
436
+ const hints = [];
437
+ if (numClusters === 1 && totalPoints > 1) {
438
+ hints.push(`All ${String(totalPoints)} points formed a single cluster. Consider decreasing eps (currently ${String(eps)}m) to create more distinct clusters.`);
439
+ }
440
+ if (noisePoints > 0 && noisePoints > totalPoints * 0.5) {
441
+ hints.push(`${String(noisePoints)} of ${String(totalPoints)} points (${String(Math.round((noisePoints / totalPoints) * 100))}%) are noise. Consider increasing eps or decreasing minPoints (currently ${String(minPoints)}).`);
442
+ }
443
+ if (numClusters === 0 && totalPoints > 0) {
444
+ hints.push(`No clusters formed - all points are noise. Try increasing eps (currently ${String(eps)}m) or decreasing minPoints (currently ${String(minPoints)}).`);
445
+ }
446
+ response["notes"] =
447
+ "Noise points (cluster_id = NULL) are points not belonging to any cluster";
448
+ if (hints.length > 0) {
449
+ response["hints"] = hints;
450
+ }
451
+ response["parameterGuide"] = {
452
+ eps: `Distance threshold in meters. Larger values group more distant points together.`,
453
+ minPoints: `Minimum points required to form a cluster. Higher values create fewer, denser clusters.`,
454
+ };
396
455
  }
397
- if (numClusters === 0 && totalPoints > 0) {
398
- hints.push(`No clusters formed - all points are noise. Try increasing eps (currently ${String(eps)}m) or decreasing minPoints (currently ${String(minPoints)}).`);
456
+ else {
457
+ response["notes"] =
458
+ "K-Means will always assign all points to a cluster";
399
459
  }
400
- response["notes"] =
401
- "Noise points (cluster_id = NULL) are points not belonging to any cluster";
402
- if (hints.length > 0) {
403
- response["hints"] = hints;
460
+ return response;
461
+ }
462
+ catch (error) {
463
+ if (error instanceof ZodError) {
464
+ return {
465
+ success: false,
466
+ error: error.issues.map((i) => i.message).join("; "),
467
+ };
404
468
  }
405
- response["parameterGuide"] = {
406
- eps: `Distance threshold in meters. Larger values group more distant points together.`,
407
- minPoints: `Minimum points required to form a cluster. Higher values create fewer, denser clusters.`,
469
+ return {
470
+ success: false,
471
+ error: formatPostgresError(error, {
472
+ tool: "pg_geo_cluster",
473
+ table: params?.["table"] ??
474
+ undefined,
475
+ }),
408
476
  };
409
477
  }
410
- else {
411
- response["notes"] =
412
- "K-Means will always assign all points to a cluster";
413
- }
414
- return response;
415
478
  },
416
479
  };
417
480
  }
@@ -1 +1 @@
1
- {"version":3,"file":"advanced.js","sourceRoot":"","sources":["../../../../../src/adapters/postgresql/tools/postgis/advanced.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"advanced.js","sourceRoot":"","sources":["../../../../../src/adapters/postgresql/tools/postgis/advanced.ts"],"names":[],"mappings":"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"}