@neverinfamous/postgres-mcp 1.0.2 → 1.1.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.
- package/README.md +38 -19
- package/dist/__tests__/mocks/adapter.d.ts.map +1 -1
- package/dist/__tests__/mocks/adapter.js.map +1 -1
- package/dist/adapters/DatabaseAdapter.d.ts +5 -6
- package/dist/adapters/DatabaseAdapter.d.ts.map +1 -1
- package/dist/adapters/DatabaseAdapter.js +73 -52
- package/dist/adapters/DatabaseAdapter.js.map +1 -1
- package/dist/adapters/postgresql/PostgresAdapter.d.ts +13 -0
- package/dist/adapters/postgresql/PostgresAdapter.d.ts.map +1 -1
- package/dist/adapters/postgresql/PostgresAdapter.js +48 -3
- package/dist/adapters/postgresql/PostgresAdapter.js.map +1 -1
- package/dist/adapters/postgresql/schemas/admin.d.ts +42 -0
- package/dist/adapters/postgresql/schemas/admin.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/admin.js +61 -0
- package/dist/adapters/postgresql/schemas/admin.js.map +1 -1
- package/dist/adapters/postgresql/schemas/backup.d.ts +119 -0
- package/dist/adapters/postgresql/schemas/backup.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/backup.js +169 -0
- package/dist/adapters/postgresql/schemas/backup.js.map +1 -1
- package/dist/adapters/postgresql/schemas/core.d.ts +27 -0
- package/dist/adapters/postgresql/schemas/core.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/core.js +62 -0
- package/dist/adapters/postgresql/schemas/core.js.map +1 -1
- package/dist/adapters/postgresql/schemas/cron.d.ts +117 -0
- package/dist/adapters/postgresql/schemas/cron.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/cron.js +148 -1
- package/dist/adapters/postgresql/schemas/cron.js.map +1 -1
- package/dist/adapters/postgresql/schemas/extensions.d.ts +335 -0
- package/dist/adapters/postgresql/schemas/extensions.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/extensions.js +453 -0
- package/dist/adapters/postgresql/schemas/extensions.js.map +1 -1
- package/dist/adapters/postgresql/schemas/index.d.ts +15 -15
- package/dist/adapters/postgresql/schemas/index.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/index.js +56 -16
- package/dist/adapters/postgresql/schemas/index.js.map +1 -1
- package/dist/adapters/postgresql/schemas/jsonb.d.ts +408 -21
- package/dist/adapters/postgresql/schemas/jsonb.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/jsonb.js +544 -23
- package/dist/adapters/postgresql/schemas/jsonb.js.map +1 -1
- package/dist/adapters/postgresql/schemas/monitoring.d.ts +179 -0
- package/dist/adapters/postgresql/schemas/monitoring.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/monitoring.js +240 -0
- package/dist/adapters/postgresql/schemas/monitoring.js.map +1 -1
- package/dist/adapters/postgresql/schemas/partitioning.d.ts +57 -0
- package/dist/adapters/postgresql/schemas/partitioning.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/partitioning.js +84 -0
- package/dist/adapters/postgresql/schemas/partitioning.js.map +1 -1
- package/dist/adapters/postgresql/schemas/partman.d.ts +156 -0
- package/dist/adapters/postgresql/schemas/partman.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/partman.js +203 -0
- package/dist/adapters/postgresql/schemas/partman.js.map +1 -1
- package/dist/adapters/postgresql/schemas/performance.d.ts +123 -0
- package/dist/adapters/postgresql/schemas/performance.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/performance.js +221 -0
- package/dist/adapters/postgresql/schemas/performance.js.map +1 -1
- package/dist/adapters/postgresql/schemas/postgis.d.ts +173 -0
- package/dist/adapters/postgresql/schemas/postgis.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/postgis.js +279 -0
- package/dist/adapters/postgresql/schemas/postgis.js.map +1 -1
- package/dist/adapters/postgresql/schemas/schema-mgmt.d.ts +100 -0
- package/dist/adapters/postgresql/schemas/schema-mgmt.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/schema-mgmt.js +133 -0
- package/dist/adapters/postgresql/schemas/schema-mgmt.js.map +1 -1
- package/dist/adapters/postgresql/schemas/stats.d.ts +248 -4
- package/dist/adapters/postgresql/schemas/stats.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/stats.js +362 -0
- package/dist/adapters/postgresql/schemas/stats.js.map +1 -1
- package/dist/adapters/postgresql/schemas/text-search.d.ts +47 -0
- package/dist/adapters/postgresql/schemas/text-search.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/text-search.js +62 -0
- package/dist/adapters/postgresql/schemas/text-search.js.map +1 -1
- package/dist/adapters/postgresql/schemas/vector.d.ts +252 -0
- package/dist/adapters/postgresql/schemas/vector.d.ts.map +1 -1
- package/dist/adapters/postgresql/schemas/vector.js +373 -0
- package/dist/adapters/postgresql/schemas/vector.js.map +1 -1
- package/dist/adapters/postgresql/tools/admin.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/admin.js +37 -7
- package/dist/adapters/postgresql/tools/admin.js.map +1 -1
- package/dist/adapters/postgresql/tools/backup/dump.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/backup/dump.js +14 -2
- package/dist/adapters/postgresql/tools/backup/dump.js.map +1 -1
- package/dist/adapters/postgresql/tools/backup/planning.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/backup/planning.js +6 -0
- package/dist/adapters/postgresql/tools/backup/planning.js.map +1 -1
- package/dist/adapters/postgresql/tools/citext.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/citext.js +9 -1
- package/dist/adapters/postgresql/tools/citext.js.map +1 -1
- package/dist/adapters/postgresql/tools/codemode/index.d.ts +11 -0
- package/dist/adapters/postgresql/tools/codemode/index.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/codemode/index.js +33 -0
- package/dist/adapters/postgresql/tools/codemode/index.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/convenience.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/core/convenience.js +6 -0
- package/dist/adapters/postgresql/tools/core/convenience.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/health.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/core/health.js +7 -2
- package/dist/adapters/postgresql/tools/core/health.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/indexes.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/core/indexes.js +4 -0
- package/dist/adapters/postgresql/tools/core/indexes.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/objects.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/core/objects.js +4 -1
- package/dist/adapters/postgresql/tools/core/objects.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/query.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/core/query.js +3 -0
- package/dist/adapters/postgresql/tools/core/query.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/schemas.d.ts +164 -0
- package/dist/adapters/postgresql/tools/core/schemas.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/core/schemas.js +238 -0
- package/dist/adapters/postgresql/tools/core/schemas.js.map +1 -1
- package/dist/adapters/postgresql/tools/core/tables.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/core/tables.js +5 -0
- package/dist/adapters/postgresql/tools/core/tables.js.map +1 -1
- package/dist/adapters/postgresql/tools/cron.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/cron.js +12 -2
- package/dist/adapters/postgresql/tools/cron.js.map +1 -1
- package/dist/adapters/postgresql/tools/jsonb/advanced.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/jsonb/advanced.js +56 -46
- package/dist/adapters/postgresql/tools/jsonb/advanced.js.map +1 -1
- package/dist/adapters/postgresql/tools/jsonb/basic.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/jsonb/basic.js +114 -72
- package/dist/adapters/postgresql/tools/jsonb/basic.js.map +1 -1
- package/dist/adapters/postgresql/tools/kcache.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/kcache.js +10 -1
- package/dist/adapters/postgresql/tools/kcache.js.map +1 -1
- package/dist/adapters/postgresql/tools/ltree.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/ltree.js +11 -1
- package/dist/adapters/postgresql/tools/ltree.js.map +1 -1
- package/dist/adapters/postgresql/tools/monitoring.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/monitoring.js +14 -1
- package/dist/adapters/postgresql/tools/monitoring.js.map +1 -1
- package/dist/adapters/postgresql/tools/partitioning.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/partitioning.js +9 -1
- package/dist/adapters/postgresql/tools/partitioning.js.map +1 -1
- package/dist/adapters/postgresql/tools/partman/management.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/partman/management.js +8 -1
- package/dist/adapters/postgresql/tools/partman/management.js.map +1 -1
- package/dist/adapters/postgresql/tools/partman/operations.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/partman/operations.js +8 -1
- package/dist/adapters/postgresql/tools/partman/operations.js.map +1 -1
- package/dist/adapters/postgresql/tools/performance/analysis.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/performance/analysis.js +4 -0
- package/dist/adapters/postgresql/tools/performance/analysis.js.map +1 -1
- package/dist/adapters/postgresql/tools/performance/explain.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/performance/explain.js +4 -1
- package/dist/adapters/postgresql/tools/performance/explain.js.map +1 -1
- package/dist/adapters/postgresql/tools/performance/monitoring.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/performance/monitoring.js +10 -8
- package/dist/adapters/postgresql/tools/performance/monitoring.js.map +1 -1
- package/dist/adapters/postgresql/tools/performance/optimization.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/performance/optimization.js +4 -0
- package/dist/adapters/postgresql/tools/performance/optimization.js.map +1 -1
- package/dist/adapters/postgresql/tools/performance/stats.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/performance/stats.js +9 -0
- package/dist/adapters/postgresql/tools/performance/stats.js.map +1 -1
- package/dist/adapters/postgresql/tools/pgcrypto.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/pgcrypto.js +12 -3
- package/dist/adapters/postgresql/tools/pgcrypto.js.map +1 -1
- package/dist/adapters/postgresql/tools/postgis/advanced.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/postgis/advanced.js +7 -1
- package/dist/adapters/postgresql/tools/postgis/advanced.js.map +1 -1
- package/dist/adapters/postgresql/tools/postgis/basic.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/postgis/basic.js +11 -1
- package/dist/adapters/postgresql/tools/postgis/basic.js.map +1 -1
- package/dist/adapters/postgresql/tools/postgis/standalone.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/postgis/standalone.js +6 -1
- package/dist/adapters/postgresql/tools/postgis/standalone.js.map +1 -1
- package/dist/adapters/postgresql/tools/schema.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/schema.js +15 -1
- package/dist/adapters/postgresql/tools/schema.js.map +1 -1
- package/dist/adapters/postgresql/tools/stats/advanced.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/stats/advanced.js +59 -20
- package/dist/adapters/postgresql/tools/stats/advanced.js.map +1 -1
- package/dist/adapters/postgresql/tools/stats/basic.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/stats/basic.js +35 -13
- package/dist/adapters/postgresql/tools/stats/basic.js.map +1 -1
- package/dist/adapters/postgresql/tools/text.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/text.js +43 -26
- package/dist/adapters/postgresql/tools/text.js.map +1 -1
- package/dist/adapters/postgresql/tools/transactions.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/transactions.js +10 -1
- package/dist/adapters/postgresql/tools/transactions.js.map +1 -1
- package/dist/adapters/postgresql/tools/vector/advanced.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/vector/advanced.js +29 -5
- package/dist/adapters/postgresql/tools/vector/advanced.js.map +1 -1
- package/dist/adapters/postgresql/tools/vector/basic.d.ts.map +1 -1
- package/dist/adapters/postgresql/tools/vector/basic.js +81 -28
- package/dist/adapters/postgresql/tools/vector/basic.js.map +1 -1
- package/dist/codemode/api.d.ts.map +1 -1
- package/dist/codemode/api.js +4 -0
- package/dist/codemode/api.js.map +1 -1
- package/dist/constants/ServerInstructions.d.ts +1 -1
- package/dist/constants/ServerInstructions.d.ts.map +1 -1
- package/dist/constants/ServerInstructions.js +13 -7
- package/dist/constants/ServerInstructions.js.map +1 -1
- package/dist/filtering/ToolConstants.d.ts +3 -3
- package/dist/filtering/ToolConstants.d.ts.map +1 -1
- package/dist/filtering/ToolConstants.js +4 -3
- package/dist/filtering/ToolConstants.js.map +1 -1
- package/dist/types/adapters.d.ts +2 -0
- package/dist/types/adapters.d.ts.map +1 -1
- package/dist/types/oauth.d.ts +4 -0
- package/dist/types/oauth.d.ts.map +1 -1
- package/dist/utils/fts-config.d.ts +38 -0
- package/dist/utils/fts-config.d.ts.map +1 -0
- package/dist/utils/fts-config.js +64 -0
- package/dist/utils/fts-config.js.map +1 -0
- package/dist/utils/identifiers.d.ts +21 -0
- package/dist/utils/identifiers.d.ts.map +1 -1
- package/dist/utils/identifiers.js +48 -0
- package/dist/utils/identifiers.js.map +1 -1
- package/dist/utils/logger.d.ts +22 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +71 -14
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/progress-utils.d.ts +44 -0
- package/dist/utils/progress-utils.d.ts.map +1 -0
- package/dist/utils/progress-utils.js +75 -0
- package/dist/utils/progress-utils.js.map +1 -0
- package/dist/utils/where-clause.d.ts +39 -0
- package/dist/utils/where-clause.d.ts.map +1 -0
- package/dist/utils/where-clause.js +123 -0
- package/dist/utils/where-clause.js.map +1 -0
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsonb.d.ts","sourceRoot":"","sources":["../../../../src/adapters/postgresql/schemas/jsonb.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB
|
|
1
|
+
{"version":3,"file":"jsonb.d.ts","sourceRoot":"","sources":["../../../../src/adapters/postgresql/schemas/jsonb.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,7 @@ import { z } from "zod";
|
|
|
18
18
|
* Convert a string path to array format
|
|
19
19
|
* 'a.b[0].c' → ['a', 'b', '0', 'c']
|
|
20
20
|
* 'a.b.0' → ['a', 'b', '0']
|
|
21
|
+
* '[-1]' → ['-1'] (supports negative indices)
|
|
21
22
|
*/
|
|
22
23
|
export function stringPathToArray(path) {
|
|
23
24
|
// Handle JSONPath format ($.a.b) - strip leading $. if present
|
|
@@ -27,8 +28,8 @@ export function stringPathToArray(path) {
|
|
|
27
28
|
normalized = normalized.slice(1);
|
|
28
29
|
if (normalized.startsWith("."))
|
|
29
30
|
normalized = normalized.slice(1);
|
|
30
|
-
// Replace array notation [0] with .0
|
|
31
|
-
normalized = normalized.replace(/\[(
|
|
31
|
+
// Replace array notation [0] or [-1] with .0 or .-1 (supports negative indices)
|
|
32
|
+
normalized = normalized.replace(/\[(-?\d+)\]/g, ".$1");
|
|
32
33
|
// Split by dot and filter empty strings
|
|
33
34
|
return normalized.split(".").filter((p) => p !== "");
|
|
34
35
|
}
|
|
@@ -94,10 +95,57 @@ export function parseJsonbValue(value) {
|
|
|
94
95
|
}
|
|
95
96
|
return value;
|
|
96
97
|
}
|
|
98
|
+
/**
|
|
99
|
+
* Preprocess JSONB tool parameters to normalize common input patterns.
|
|
100
|
+
* Handles aliases and schema.table format parsing.
|
|
101
|
+
* Exported so tools can apply it in their handlers.
|
|
102
|
+
*
|
|
103
|
+
* SPLIT SCHEMA PATTERN:
|
|
104
|
+
* - Base schemas use optional table/tableName with .refine() for MCP visibility
|
|
105
|
+
* - Handlers use z.preprocess(preprocessJsonbParams, BaseSchema) for alias resolution
|
|
106
|
+
*/
|
|
107
|
+
export function preprocessJsonbParams(input) {
|
|
108
|
+
if (typeof input !== "object" || input === null) {
|
|
109
|
+
return input;
|
|
110
|
+
}
|
|
111
|
+
const result = { ...input };
|
|
112
|
+
// Alias: tableName → table
|
|
113
|
+
if (result["tableName"] !== undefined && result["table"] === undefined) {
|
|
114
|
+
result["table"] = result["tableName"];
|
|
115
|
+
}
|
|
116
|
+
// Alias: name → table (for consistency with other tool groups)
|
|
117
|
+
if (result["name"] !== undefined && result["table"] === undefined) {
|
|
118
|
+
result["table"] = result["name"];
|
|
119
|
+
}
|
|
120
|
+
// Alias: col → column
|
|
121
|
+
if (result["col"] !== undefined && result["column"] === undefined) {
|
|
122
|
+
result["column"] = result["col"];
|
|
123
|
+
}
|
|
124
|
+
// Alias: filter → where
|
|
125
|
+
if (result["filter"] !== undefined && result["where"] === undefined) {
|
|
126
|
+
result["where"] = result["filter"];
|
|
127
|
+
}
|
|
128
|
+
// Parse schema.table format (embedded schema takes priority)
|
|
129
|
+
if (typeof result["table"] === "string" && result["table"].includes(".")) {
|
|
130
|
+
const parts = result["table"].split(".");
|
|
131
|
+
if (parts.length === 2 && parts[0] && parts[1]) {
|
|
132
|
+
// Only override schema if not already explicitly set
|
|
133
|
+
if (result["schema"] === undefined) {
|
|
134
|
+
result["schema"] = parts[0];
|
|
135
|
+
}
|
|
136
|
+
result["table"] = parts[1];
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
97
141
|
// ============== EXTRACT SCHEMA ==============
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
142
|
+
// Base schema (for MCP inputSchema visibility - no preprocess)
|
|
143
|
+
export const JsonbExtractSchemaBase = z
|
|
144
|
+
.object({
|
|
145
|
+
table: z.string().optional().describe("Table name"),
|
|
146
|
+
tableName: z.string().optional().describe("Table name (alias for table)"),
|
|
147
|
+
column: z.string().optional().describe("JSONB column name"),
|
|
148
|
+
col: z.string().optional().describe("JSONB column name (alias for column)"),
|
|
101
149
|
path: z
|
|
102
150
|
.union([
|
|
103
151
|
z.string().describe('Path as string (e.g., "a.b.c" or "a[0].b")'),
|
|
@@ -111,12 +159,26 @@ export const JsonbExtractSchema = z.object({
|
|
|
111
159
|
.optional()
|
|
112
160
|
.describe('Additional columns to include in result for row identification (e.g., ["id"])'),
|
|
113
161
|
where: z.string().optional().describe("WHERE clause"),
|
|
162
|
+
filter: z.string().optional().describe("WHERE clause (alias for where)"),
|
|
114
163
|
limit: z.number().optional().describe("Maximum number of rows to return"),
|
|
164
|
+
schema: z.string().optional().describe("Schema name (default: public)"),
|
|
165
|
+
})
|
|
166
|
+
.refine((data) => data.table !== undefined || data.tableName !== undefined, {
|
|
167
|
+
message: "Either 'table' or 'tableName' is required",
|
|
168
|
+
})
|
|
169
|
+
.refine((data) => data.column !== undefined || data.col !== undefined, {
|
|
170
|
+
message: "Either 'column' or 'col' is required",
|
|
115
171
|
});
|
|
172
|
+
// Full schema with preprocess (for handler parsing)
|
|
173
|
+
export const JsonbExtractSchema = z.preprocess(preprocessJsonbParams, JsonbExtractSchemaBase);
|
|
116
174
|
// ============== SET SCHEMA ==============
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
175
|
+
// Base schema (for MCP inputSchema visibility - no preprocess)
|
|
176
|
+
export const JsonbSetSchemaBase = z
|
|
177
|
+
.object({
|
|
178
|
+
table: z.string().optional().describe("Table name"),
|
|
179
|
+
tableName: z.string().optional().describe("Table name (alias for table)"),
|
|
180
|
+
column: z.string().optional().describe("JSONB column name"),
|
|
181
|
+
col: z.string().optional().describe("JSONB column name (alias for column)"),
|
|
120
182
|
path: z
|
|
121
183
|
.union([
|
|
122
184
|
z.string().describe('Path as string (e.g., "a.b.c" or "a[0].b")'),
|
|
@@ -128,16 +190,36 @@ export const JsonbSetSchema = z.object({
|
|
|
128
190
|
value: z
|
|
129
191
|
.unknown()
|
|
130
192
|
.describe("New value to set at the path (will be converted to JSONB)"),
|
|
131
|
-
where: z
|
|
193
|
+
where: z
|
|
194
|
+
.string()
|
|
195
|
+
.optional()
|
|
196
|
+
.describe("WHERE clause to identify rows to update"),
|
|
197
|
+
filter: z.string().optional().describe("WHERE clause (alias for where)"),
|
|
132
198
|
createMissing: z
|
|
133
199
|
.boolean()
|
|
134
200
|
.optional()
|
|
135
201
|
.describe("Create intermediate keys if path does not exist (default: true)"),
|
|
202
|
+
schema: z.string().optional().describe("Schema name (default: public)"),
|
|
203
|
+
})
|
|
204
|
+
.refine((data) => data.table !== undefined || data.tableName !== undefined, {
|
|
205
|
+
message: "Either 'table' or 'tableName' is required",
|
|
206
|
+
})
|
|
207
|
+
.refine((data) => data.column !== undefined || data.col !== undefined, {
|
|
208
|
+
message: "Either 'column' or 'col' is required",
|
|
209
|
+
})
|
|
210
|
+
.refine((data) => data.where !== undefined || data.filter !== undefined, {
|
|
211
|
+
message: "Either 'where' or 'filter' is required",
|
|
136
212
|
});
|
|
213
|
+
// Full schema with preprocess (for handler parsing)
|
|
214
|
+
export const JsonbSetSchema = z.preprocess(preprocessJsonbParams, JsonbSetSchemaBase);
|
|
137
215
|
// ============== CONTAINS SCHEMA ==============
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
216
|
+
// Base schema (for MCP inputSchema visibility - no preprocess)
|
|
217
|
+
export const JsonbContainsSchemaBase = z
|
|
218
|
+
.object({
|
|
219
|
+
table: z.string().optional().describe("Table name"),
|
|
220
|
+
tableName: z.string().optional().describe("Table name (alias for table)"),
|
|
221
|
+
column: z.string().optional().describe("JSONB column name"),
|
|
222
|
+
col: z.string().optional().describe("JSONB column name (alias for column)"),
|
|
141
223
|
value: z
|
|
142
224
|
.unknown()
|
|
143
225
|
.describe('JSON value to check if contained (e.g., {"status": "active"})'),
|
|
@@ -146,11 +228,25 @@ export const JsonbContainsSchema = z.object({
|
|
|
146
228
|
.optional()
|
|
147
229
|
.describe("Columns to select in result"),
|
|
148
230
|
where: z.string().optional().describe("Additional WHERE clause filter"),
|
|
231
|
+
filter: z.string().optional().describe("WHERE clause (alias for where)"),
|
|
232
|
+
schema: z.string().optional().describe("Schema name (default: public)"),
|
|
233
|
+
})
|
|
234
|
+
.refine((data) => data.table !== undefined || data.tableName !== undefined, {
|
|
235
|
+
message: "Either 'table' or 'tableName' is required",
|
|
236
|
+
})
|
|
237
|
+
.refine((data) => data.column !== undefined || data.col !== undefined, {
|
|
238
|
+
message: "Either 'column' or 'col' is required",
|
|
149
239
|
});
|
|
240
|
+
// Full schema with preprocess (for handler parsing)
|
|
241
|
+
export const JsonbContainsSchema = z.preprocess(preprocessJsonbParams, JsonbContainsSchemaBase);
|
|
150
242
|
// ============== PATH QUERY SCHEMA ==============
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
243
|
+
// Base schema (for MCP inputSchema visibility - no preprocess)
|
|
244
|
+
export const JsonbPathQuerySchemaBase = z
|
|
245
|
+
.object({
|
|
246
|
+
table: z.string().optional().describe("Table name"),
|
|
247
|
+
tableName: z.string().optional().describe("Table name (alias for table)"),
|
|
248
|
+
column: z.string().optional().describe("JSONB column name"),
|
|
249
|
+
col: z.string().optional().describe("JSONB column name (alias for column)"),
|
|
154
250
|
path: z
|
|
155
251
|
.string()
|
|
156
252
|
.describe('JSONPath expression (e.g., "$.items[*].name" or "$.* ? (@.price > 10)")'),
|
|
@@ -159,11 +255,25 @@ export const JsonbPathQuerySchema = z.object({
|
|
|
159
255
|
.optional()
|
|
160
256
|
.describe("Variables for JSONPath (access with $var_name)"),
|
|
161
257
|
where: z.string().optional().describe("WHERE clause"),
|
|
258
|
+
filter: z.string().optional().describe("WHERE clause (alias for where)"),
|
|
259
|
+
schema: z.string().optional().describe("Schema name (default: public)"),
|
|
260
|
+
})
|
|
261
|
+
.refine((data) => data.table !== undefined || data.tableName !== undefined, {
|
|
262
|
+
message: "Either 'table' or 'tableName' is required",
|
|
263
|
+
})
|
|
264
|
+
.refine((data) => data.column !== undefined || data.col !== undefined, {
|
|
265
|
+
message: "Either 'column' or 'col' is required",
|
|
162
266
|
});
|
|
267
|
+
// Full schema with preprocess (for handler parsing)
|
|
268
|
+
export const JsonbPathQuerySchema = z.preprocess(preprocessJsonbParams, JsonbPathQuerySchemaBase);
|
|
163
269
|
// ============== INSERT SCHEMA ==============
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
270
|
+
// Base schema (for MCP inputSchema visibility - no preprocess)
|
|
271
|
+
export const JsonbInsertSchemaBase = z
|
|
272
|
+
.object({
|
|
273
|
+
table: z.string().optional().describe("Table name"),
|
|
274
|
+
tableName: z.string().optional().describe("Table name (alias for table)"),
|
|
275
|
+
column: z.string().optional().describe("JSONB column name"),
|
|
276
|
+
col: z.string().optional().describe("JSONB column name (alias for column)"),
|
|
167
277
|
path: z
|
|
168
278
|
.union([
|
|
169
279
|
z.string().describe('Path as string (e.g., "tags.0")'),
|
|
@@ -174,16 +284,33 @@ export const JsonbInsertSchema = z.object({
|
|
|
174
284
|
])
|
|
175
285
|
.describe("Path to insert at (for arrays). Accepts both string and array formats."),
|
|
176
286
|
value: z.unknown().describe("Value to insert"),
|
|
177
|
-
where: z.string().describe("WHERE clause"),
|
|
287
|
+
where: z.string().optional().describe("WHERE clause"),
|
|
288
|
+
filter: z.string().optional().describe("WHERE clause (alias for where)"),
|
|
178
289
|
insertAfter: z
|
|
179
290
|
.boolean()
|
|
180
291
|
.optional()
|
|
181
292
|
.describe("Insert after the specified position (default: false)"),
|
|
293
|
+
schema: z.string().optional().describe("Schema name (default: public)"),
|
|
294
|
+
})
|
|
295
|
+
.refine((data) => data.table !== undefined || data.tableName !== undefined, {
|
|
296
|
+
message: "Either 'table' or 'tableName' is required",
|
|
297
|
+
})
|
|
298
|
+
.refine((data) => data.column !== undefined || data.col !== undefined, {
|
|
299
|
+
message: "Either 'column' or 'col' is required",
|
|
300
|
+
})
|
|
301
|
+
.refine((data) => data.where !== undefined || data.filter !== undefined, {
|
|
302
|
+
message: "Either 'where' or 'filter' is required",
|
|
182
303
|
});
|
|
304
|
+
// Full schema with preprocess (for handler parsing)
|
|
305
|
+
export const JsonbInsertSchema = z.preprocess(preprocessJsonbParams, JsonbInsertSchemaBase);
|
|
183
306
|
// ============== DELETE SCHEMA ==============
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
307
|
+
// Base schema (for MCP inputSchema visibility - no preprocess)
|
|
308
|
+
export const JsonbDeleteSchemaBase = z
|
|
309
|
+
.object({
|
|
310
|
+
table: z.string().optional().describe("Table name"),
|
|
311
|
+
tableName: z.string().optional().describe("Table name (alias for table)"),
|
|
312
|
+
column: z.string().optional().describe("JSONB column name"),
|
|
313
|
+
col: z.string().optional().describe("JSONB column name (alias for column)"),
|
|
187
314
|
path: z
|
|
188
315
|
.union([
|
|
189
316
|
z.string().describe("Key to delete (single key) or dot-notation path"),
|
|
@@ -193,6 +320,400 @@ export const JsonbDeleteSchema = z.object({
|
|
|
193
320
|
.describe('Path as array (e.g., ["nested", 0])'),
|
|
194
321
|
])
|
|
195
322
|
.describe("Key or path to delete. Supports numeric indices for arrays."),
|
|
196
|
-
where: z.string().describe("WHERE clause"),
|
|
323
|
+
where: z.string().optional().describe("WHERE clause"),
|
|
324
|
+
filter: z.string().optional().describe("WHERE clause (alias for where)"),
|
|
325
|
+
schema: z.string().optional().describe("Schema name (default: public)"),
|
|
326
|
+
})
|
|
327
|
+
.refine((data) => data.table !== undefined || data.tableName !== undefined, {
|
|
328
|
+
message: "Either 'table' or 'tableName' is required",
|
|
329
|
+
})
|
|
330
|
+
.refine((data) => data.column !== undefined || data.col !== undefined, {
|
|
331
|
+
message: "Either 'column' or 'col' is required",
|
|
332
|
+
})
|
|
333
|
+
.refine((data) => data.where !== undefined || data.filter !== undefined, {
|
|
334
|
+
message: "Either 'where' or 'filter' is required",
|
|
335
|
+
});
|
|
336
|
+
// Full schema with preprocess (for handler parsing)
|
|
337
|
+
export const JsonbDeleteSchema = z.preprocess(preprocessJsonbParams, JsonbDeleteSchemaBase);
|
|
338
|
+
// ============== TYPEOF SCHEMA ==============
|
|
339
|
+
// Base schema (for MCP inputSchema visibility - no preprocess)
|
|
340
|
+
export const JsonbTypeofSchemaBase = z
|
|
341
|
+
.object({
|
|
342
|
+
table: z.string().optional().describe("Table name"),
|
|
343
|
+
tableName: z.string().optional().describe("Table name (alias for table)"),
|
|
344
|
+
column: z.string().optional().describe("JSONB column name"),
|
|
345
|
+
col: z.string().optional().describe("JSONB column name (alias for column)"),
|
|
346
|
+
path: z
|
|
347
|
+
.union([z.string(), z.array(z.union([z.string(), z.number()]))])
|
|
348
|
+
.optional()
|
|
349
|
+
.describe("Path to check type of nested value (string or array format)"),
|
|
350
|
+
where: z.string().optional().describe("WHERE clause"),
|
|
351
|
+
filter: z.string().optional().describe("WHERE clause (alias for where)"),
|
|
352
|
+
})
|
|
353
|
+
.refine((data) => data.table !== undefined || data.tableName !== undefined, {
|
|
354
|
+
message: "Either 'table' or 'tableName' is required",
|
|
355
|
+
})
|
|
356
|
+
.refine((data) => data.column !== undefined || data.col !== undefined, {
|
|
357
|
+
message: "Either 'column' or 'col' is required",
|
|
358
|
+
});
|
|
359
|
+
// Full schema with preprocess (for handler parsing)
|
|
360
|
+
export const JsonbTypeofSchema = z.preprocess(preprocessJsonbParams, JsonbTypeofSchemaBase);
|
|
361
|
+
// ============== KEYS SCHEMA ==============
|
|
362
|
+
// Base schema (for MCP inputSchema visibility - no preprocess)
|
|
363
|
+
export const JsonbKeysSchemaBase = z
|
|
364
|
+
.object({
|
|
365
|
+
table: z.string().optional().describe("Table name"),
|
|
366
|
+
tableName: z.string().optional().describe("Table name (alias for table)"),
|
|
367
|
+
column: z.string().optional().describe("JSONB column name"),
|
|
368
|
+
col: z.string().optional().describe("JSONB column name (alias for column)"),
|
|
369
|
+
where: z.string().optional().describe("WHERE clause"),
|
|
370
|
+
filter: z.string().optional().describe("WHERE clause (alias for where)"),
|
|
371
|
+
})
|
|
372
|
+
.refine((data) => data.table !== undefined || data.tableName !== undefined, {
|
|
373
|
+
message: "Either 'table' or 'tableName' is required",
|
|
374
|
+
})
|
|
375
|
+
.refine((data) => data.column !== undefined || data.col !== undefined, {
|
|
376
|
+
message: "Either 'column' or 'col' is required",
|
|
377
|
+
});
|
|
378
|
+
// Full schema with preprocess (for handler parsing)
|
|
379
|
+
export const JsonbKeysSchema = z.preprocess(preprocessJsonbParams, JsonbKeysSchemaBase);
|
|
380
|
+
// ============== STRIP NULLS SCHEMA ==============
|
|
381
|
+
// Base schema (for MCP inputSchema visibility - no preprocess)
|
|
382
|
+
export const JsonbStripNullsSchemaBase = z
|
|
383
|
+
.object({
|
|
384
|
+
table: z.string().optional().describe("Table name"),
|
|
385
|
+
tableName: z.string().optional().describe("Table name (alias for table)"),
|
|
386
|
+
column: z.string().optional().describe("JSONB column name"),
|
|
387
|
+
col: z.string().optional().describe("JSONB column name (alias for column)"),
|
|
388
|
+
where: z.string().optional().describe("WHERE clause"),
|
|
389
|
+
filter: z.string().optional().describe("WHERE clause (alias for where)"),
|
|
390
|
+
preview: z
|
|
391
|
+
.boolean()
|
|
392
|
+
.optional()
|
|
393
|
+
.describe("Preview what would be stripped without modifying data"),
|
|
394
|
+
})
|
|
395
|
+
.refine((data) => data.table !== undefined || data.tableName !== undefined, {
|
|
396
|
+
message: "Either 'table' or 'tableName' is required",
|
|
397
|
+
})
|
|
398
|
+
.refine((data) => data.column !== undefined || data.col !== undefined, {
|
|
399
|
+
message: "Either 'column' or 'col' is required",
|
|
400
|
+
})
|
|
401
|
+
.refine((data) => data.where !== undefined || data.filter !== undefined, {
|
|
402
|
+
message: "Either 'where' or 'filter' is required",
|
|
403
|
+
});
|
|
404
|
+
// Full schema with preprocess (for handler parsing)
|
|
405
|
+
export const JsonbStripNullsSchema = z.preprocess(preprocessJsonbParams, JsonbStripNullsSchemaBase);
|
|
406
|
+
// ============== AGG SCHEMA ==============
|
|
407
|
+
// Base schema (for MCP inputSchema visibility - no preprocess)
|
|
408
|
+
export const JsonbAggSchemaBase = z
|
|
409
|
+
.object({
|
|
410
|
+
table: z.string().optional().describe("Table name"),
|
|
411
|
+
tableName: z.string().optional().describe("Table name (alias for table)"),
|
|
412
|
+
select: z
|
|
413
|
+
.array(z.string())
|
|
414
|
+
.optional()
|
|
415
|
+
.describe('Columns or expressions to include. Supports AS aliases: ["id", "metadata->\'name\' AS name"]'),
|
|
416
|
+
where: z.string().optional().describe("WHERE clause"),
|
|
417
|
+
filter: z.string().optional().describe("WHERE clause (alias for where)"),
|
|
418
|
+
groupBy: z
|
|
419
|
+
.string()
|
|
420
|
+
.optional()
|
|
421
|
+
.describe("Column or expression to group by. Returns {result: [{group_key, items}], count, grouped: true}"),
|
|
422
|
+
orderBy: z
|
|
423
|
+
.string()
|
|
424
|
+
.optional()
|
|
425
|
+
.describe('ORDER BY clause (e.g., "id DESC", "name ASC")'),
|
|
426
|
+
limit: z
|
|
427
|
+
.number()
|
|
428
|
+
.optional()
|
|
429
|
+
.describe("Maximum number of rows to aggregate"),
|
|
430
|
+
})
|
|
431
|
+
.refine((data) => data.table !== undefined || data.tableName !== undefined, {
|
|
432
|
+
message: "Either 'table' or 'tableName' is required",
|
|
433
|
+
});
|
|
434
|
+
// Full schema with preprocess (for handler parsing)
|
|
435
|
+
export const JsonbAggSchema = z.preprocess(preprocessJsonbParams, JsonbAggSchemaBase);
|
|
436
|
+
// ============== NORMALIZE SCHEMA ==============
|
|
437
|
+
// Base schema (for MCP inputSchema visibility - no preprocess)
|
|
438
|
+
export const JsonbNormalizeSchemaBase = z
|
|
439
|
+
.object({
|
|
440
|
+
table: z.string().optional().describe("Table name"),
|
|
441
|
+
tableName: z.string().optional().describe("Table name (alias for table)"),
|
|
442
|
+
column: z.string().optional().describe("JSONB column"),
|
|
443
|
+
col: z.string().optional().describe("JSONB column (alias for column)"),
|
|
444
|
+
mode: z
|
|
445
|
+
.enum(["keys", "array", "pairs", "flatten"])
|
|
446
|
+
.optional()
|
|
447
|
+
.describe("keys: text values (all converted to string). pairs: JSONB types preserved. array: for arrays. flatten: recursive."),
|
|
448
|
+
where: z.string().optional().describe("WHERE clause"),
|
|
449
|
+
filter: z.string().optional().describe("WHERE clause (alias for where)"),
|
|
450
|
+
idColumn: z
|
|
451
|
+
.string()
|
|
452
|
+
.optional()
|
|
453
|
+
.describe('Column to use for row identification (e.g., "id"). If omitted, defaults to "id" if it exists, else uses ctid.'),
|
|
454
|
+
})
|
|
455
|
+
.refine((data) => data.table !== undefined || data.tableName !== undefined, {
|
|
456
|
+
message: "Either 'table' or 'tableName' is required",
|
|
457
|
+
})
|
|
458
|
+
.refine((data) => data.column !== undefined || data.col !== undefined, {
|
|
459
|
+
message: "Either 'column' or 'col' is required",
|
|
460
|
+
});
|
|
461
|
+
// Full schema with preprocess (for handler parsing)
|
|
462
|
+
export const JsonbNormalizeSchema = z.preprocess(preprocessJsonbParams, JsonbNormalizeSchemaBase);
|
|
463
|
+
// ============== STATS SCHEMA ==============
|
|
464
|
+
// Base schema (for MCP inputSchema visibility - no preprocess)
|
|
465
|
+
export const JsonbStatsSchemaBase = z
|
|
466
|
+
.object({
|
|
467
|
+
table: z.string().optional().describe("Table name"),
|
|
468
|
+
tableName: z.string().optional().describe("Table name (alias for table)"),
|
|
469
|
+
column: z.string().optional().describe("JSONB column"),
|
|
470
|
+
col: z.string().optional().describe("JSONB column (alias for column)"),
|
|
471
|
+
sampleSize: z.number().optional().describe("Sample rows to analyze"),
|
|
472
|
+
where: z.string().optional().describe("WHERE clause to filter rows"),
|
|
473
|
+
filter: z
|
|
474
|
+
.string()
|
|
475
|
+
.optional()
|
|
476
|
+
.describe("WHERE clause to filter rows (alias for where)"),
|
|
477
|
+
topKeysLimit: z
|
|
478
|
+
.number()
|
|
479
|
+
.optional()
|
|
480
|
+
.describe("Maximum number of top keys to return (default: 20)"),
|
|
481
|
+
})
|
|
482
|
+
.refine((data) => data.table !== undefined || data.tableName !== undefined, {
|
|
483
|
+
message: "Either 'table' or 'tableName' is required",
|
|
484
|
+
})
|
|
485
|
+
.refine((data) => data.column !== undefined || data.col !== undefined, {
|
|
486
|
+
message: "Either 'column' or 'col' is required",
|
|
487
|
+
});
|
|
488
|
+
// Full schema with preprocess (for handler parsing)
|
|
489
|
+
export const JsonbStatsSchema = z.preprocess(preprocessJsonbParams, JsonbStatsSchemaBase);
|
|
490
|
+
// ============== INDEX SUGGEST SCHEMA ==============
|
|
491
|
+
// Base schema (for MCP inputSchema visibility - no preprocess)
|
|
492
|
+
export const JsonbIndexSuggestSchemaBase = z
|
|
493
|
+
.object({
|
|
494
|
+
table: z.string().optional().describe("Table name"),
|
|
495
|
+
tableName: z.string().optional().describe("Table name (alias for table)"),
|
|
496
|
+
column: z.string().optional().describe("JSONB column"),
|
|
497
|
+
col: z.string().optional().describe("JSONB column (alias for column)"),
|
|
498
|
+
sampleSize: z.number().optional().describe("Sample rows to analyze"),
|
|
499
|
+
where: z.string().optional().describe("WHERE clause to filter rows"),
|
|
500
|
+
filter: z
|
|
501
|
+
.string()
|
|
502
|
+
.optional()
|
|
503
|
+
.describe("WHERE clause to filter rows (alias for where)"),
|
|
504
|
+
})
|
|
505
|
+
.refine((data) => data.table !== undefined || data.tableName !== undefined, {
|
|
506
|
+
message: "Either 'table' or 'tableName' is required",
|
|
507
|
+
})
|
|
508
|
+
.refine((data) => data.column !== undefined || data.col !== undefined, {
|
|
509
|
+
message: "Either 'column' or 'col' is required",
|
|
510
|
+
});
|
|
511
|
+
// Full schema with preprocess (for handler parsing)
|
|
512
|
+
export const JsonbIndexSuggestSchema = z.preprocess(preprocessJsonbParams, JsonbIndexSuggestSchemaBase);
|
|
513
|
+
// ============== SECURITY SCAN SCHEMA ==============
|
|
514
|
+
// Base schema (for MCP inputSchema visibility - no preprocess)
|
|
515
|
+
export const JsonbSecurityScanSchemaBase = z
|
|
516
|
+
.object({
|
|
517
|
+
table: z.string().optional().describe("Table name"),
|
|
518
|
+
tableName: z.string().optional().describe("Table name (alias for table)"),
|
|
519
|
+
column: z.string().optional().describe("JSONB column"),
|
|
520
|
+
col: z.string().optional().describe("JSONB column (alias for column)"),
|
|
521
|
+
sampleSize: z.number().optional().describe("Sample rows to scan"),
|
|
522
|
+
where: z.string().optional().describe("WHERE clause to filter rows"),
|
|
523
|
+
filter: z
|
|
524
|
+
.string()
|
|
525
|
+
.optional()
|
|
526
|
+
.describe("WHERE clause to filter rows (alias for where)"),
|
|
527
|
+
})
|
|
528
|
+
.refine((data) => data.table !== undefined || data.tableName !== undefined, {
|
|
529
|
+
message: "Either 'table' or 'tableName' is required",
|
|
530
|
+
})
|
|
531
|
+
.refine((data) => data.column !== undefined || data.col !== undefined, {
|
|
532
|
+
message: "Either 'column' or 'col' is required",
|
|
533
|
+
});
|
|
534
|
+
// Full schema with preprocess (for handler parsing)
|
|
535
|
+
export const JsonbSecurityScanSchema = z.preprocess(preprocessJsonbParams, JsonbSecurityScanSchemaBase);
|
|
536
|
+
// ============== OUTPUT SCHEMAS (MCP 2025-11-25 structuredContent) ==============
|
|
537
|
+
// Output schema for pg_jsonb_extract
|
|
538
|
+
export const JsonbExtractOutputSchema = z.object({
|
|
539
|
+
rows: z
|
|
540
|
+
.array(z.record(z.string(), z.unknown()))
|
|
541
|
+
.describe("Extracted values with optional identifying columns"),
|
|
542
|
+
count: z.number().describe("Number of rows returned"),
|
|
543
|
+
hint: z.string().optional().describe("Hint when all values are null"),
|
|
544
|
+
});
|
|
545
|
+
// Output schema for pg_jsonb_set
|
|
546
|
+
export const JsonbSetOutputSchema = z.object({
|
|
547
|
+
rowsAffected: z.number().describe("Number of rows updated"),
|
|
548
|
+
hint: z.string().optional().describe("Additional information"),
|
|
549
|
+
});
|
|
550
|
+
// Output schema for pg_jsonb_insert
|
|
551
|
+
export const JsonbInsertOutputSchema = z.object({
|
|
552
|
+
rowsAffected: z.number().describe("Number of rows updated"),
|
|
553
|
+
});
|
|
554
|
+
// Output schema for pg_jsonb_delete
|
|
555
|
+
export const JsonbDeleteOutputSchema = z.object({
|
|
556
|
+
rowsAffected: z.number().describe("Number of rows updated"),
|
|
557
|
+
hint: z.string().describe("Note about rowsAffected semantics"),
|
|
558
|
+
});
|
|
559
|
+
// Output schema for pg_jsonb_contains
|
|
560
|
+
export const JsonbContainsOutputSchema = z.object({
|
|
561
|
+
rows: z.array(z.record(z.string(), z.unknown())).describe("Matching rows"),
|
|
562
|
+
count: z.number().describe("Number of matching rows"),
|
|
563
|
+
warning: z
|
|
564
|
+
.string()
|
|
565
|
+
.optional()
|
|
566
|
+
.describe("Warning for empty object containment"),
|
|
567
|
+
});
|
|
568
|
+
// Output schema for pg_jsonb_path_query
|
|
569
|
+
export const JsonbPathQueryOutputSchema = z.object({
|
|
570
|
+
results: z.array(z.unknown()).describe("Query results"),
|
|
571
|
+
count: z.number().describe("Number of results"),
|
|
572
|
+
});
|
|
573
|
+
// Output schema for pg_jsonb_agg
|
|
574
|
+
export const JsonbAggOutputSchema = z.object({
|
|
575
|
+
result: z.unknown().describe("Aggregated JSONB array or grouped results"),
|
|
576
|
+
count: z.number().describe("Number of items or groups"),
|
|
577
|
+
grouped: z.boolean().describe("Whether results are grouped"),
|
|
578
|
+
hint: z.string().optional().describe("Empty result hint"),
|
|
579
|
+
});
|
|
580
|
+
// Output schema for pg_jsonb_object
|
|
581
|
+
export const JsonbObjectOutputSchema = z.object({
|
|
582
|
+
object: z.record(z.string(), z.unknown()).describe("Built JSONB object"),
|
|
583
|
+
});
|
|
584
|
+
// Output schema for pg_jsonb_array
|
|
585
|
+
export const JsonbArrayOutputSchema = z.object({
|
|
586
|
+
array: z.array(z.unknown()).describe("Built JSONB array"),
|
|
587
|
+
});
|
|
588
|
+
// Output schema for pg_jsonb_keys
|
|
589
|
+
export const JsonbKeysOutputSchema = z.object({
|
|
590
|
+
keys: z.array(z.string()).describe("Unique keys from JSONB column"),
|
|
591
|
+
count: z.number().describe("Number of unique keys"),
|
|
592
|
+
hint: z.string().describe("Deduplication note"),
|
|
593
|
+
});
|
|
594
|
+
// Output schema for pg_jsonb_strip_nulls (two modes: update or preview)
|
|
595
|
+
// Uses combined schema with optional fields instead of union with z.literal() to avoid Zod validation issues
|
|
596
|
+
export const JsonbStripNullsOutputSchema = z.object({
|
|
597
|
+
// Update mode fields
|
|
598
|
+
rowsAffected: z.number().optional().describe("Number of rows updated"),
|
|
599
|
+
// Preview mode fields
|
|
600
|
+
preview: z.boolean().optional().describe("Preview mode indicator"),
|
|
601
|
+
rows: z
|
|
602
|
+
.array(z.record(z.string(), z.unknown()))
|
|
603
|
+
.optional()
|
|
604
|
+
.describe("Before/after comparison"),
|
|
605
|
+
count: z.number().optional().describe("Number of rows"),
|
|
606
|
+
hint: z.string().optional().describe("Preview mode note"),
|
|
607
|
+
});
|
|
608
|
+
// Output schema for pg_jsonb_typeof
|
|
609
|
+
export const JsonbTypeofOutputSchema = z.object({
|
|
610
|
+
types: z
|
|
611
|
+
.array(z.string().nullable())
|
|
612
|
+
.describe("JSONB types for each row (null if path doesn't exist)"),
|
|
613
|
+
count: z.number().describe("Number of rows"),
|
|
614
|
+
columnNull: z
|
|
615
|
+
.boolean()
|
|
616
|
+
.describe("Whether any column was NULL (uses .some() aggregation)"),
|
|
617
|
+
hint: z.string().optional().describe("Additional information"),
|
|
618
|
+
});
|
|
619
|
+
// ============== ADVANCED JSONB OUTPUT SCHEMAS ==============
|
|
620
|
+
// Output schema for pg_jsonb_validate_path
|
|
621
|
+
export const JsonbValidatePathOutputSchema = z.object({
|
|
622
|
+
valid: z.boolean().describe("Whether path is valid"),
|
|
623
|
+
error: z.string().optional().describe("Error message if invalid"),
|
|
624
|
+
results: z
|
|
625
|
+
.array(z.unknown())
|
|
626
|
+
.optional()
|
|
627
|
+
.describe("Test results if testValue provided"),
|
|
628
|
+
count: z.number().optional().describe("Number of results"),
|
|
629
|
+
});
|
|
630
|
+
// Output schema for pg_jsonb_merge
|
|
631
|
+
export const JsonbMergeOutputSchema = z.object({
|
|
632
|
+
merged: z.unknown().describe("Merged JSONB document"),
|
|
633
|
+
deep: z.boolean().describe("Whether deep merge was used"),
|
|
634
|
+
mergeArrays: z
|
|
635
|
+
.boolean()
|
|
636
|
+
.optional()
|
|
637
|
+
.describe("Whether arrays were concatenated"),
|
|
638
|
+
});
|
|
639
|
+
// Output schema for pg_jsonb_normalize
|
|
640
|
+
export const JsonbNormalizeOutputSchema = z.object({
|
|
641
|
+
rows: z.array(z.record(z.string(), z.unknown())).describe("Normalized rows"),
|
|
642
|
+
count: z.number().describe("Number of rows"),
|
|
643
|
+
mode: z.string().optional().describe("Normalization mode used"),
|
|
644
|
+
hint: z.string().optional().describe("Additional information"),
|
|
645
|
+
});
|
|
646
|
+
// Output schema for pg_jsonb_diff
|
|
647
|
+
export const JsonbDiffOutputSchema = z.object({
|
|
648
|
+
differences: z
|
|
649
|
+
.array(z.object({
|
|
650
|
+
key: z.string().describe("Key that differs"),
|
|
651
|
+
status: z
|
|
652
|
+
.enum(["added", "removed", "modified"])
|
|
653
|
+
.describe("Type of difference"),
|
|
654
|
+
value1: z.unknown().optional().describe("Value in doc1"),
|
|
655
|
+
value2: z.unknown().optional().describe("Value in doc2"),
|
|
656
|
+
}))
|
|
657
|
+
.describe("List of differences"),
|
|
658
|
+
hasDifferences: z.boolean().describe("Whether any differences exist"),
|
|
659
|
+
comparison: z.string().describe("Comparison type performed"),
|
|
660
|
+
hint: z.string().describe("Explanation of comparison scope"),
|
|
661
|
+
});
|
|
662
|
+
// Output schema for pg_jsonb_index_suggest
|
|
663
|
+
export const JsonbIndexSuggestOutputSchema = z.object({
|
|
664
|
+
recommendations: z
|
|
665
|
+
.array(z.string())
|
|
666
|
+
.describe("Index creation SQL recommendations"),
|
|
667
|
+
analyzed: z
|
|
668
|
+
.object({
|
|
669
|
+
topKeys: z.number().optional().describe("Number of top keys analyzed"),
|
|
670
|
+
existingIndexes: z.number().optional().describe("Existing indexes found"),
|
|
671
|
+
})
|
|
672
|
+
.optional()
|
|
673
|
+
.describe("Analysis details"),
|
|
674
|
+
});
|
|
675
|
+
// Output schema for pg_jsonb_security_scan
|
|
676
|
+
export const JsonbSecurityScanOutputSchema = z.object({
|
|
677
|
+
issues: z
|
|
678
|
+
.array(z.object({
|
|
679
|
+
type: z.string().describe("Issue type"),
|
|
680
|
+
key: z.string().optional().describe("Affected key"),
|
|
681
|
+
count: z.number().optional().describe("Occurrence count"),
|
|
682
|
+
severity: z.string().optional().describe("Issue severity"),
|
|
683
|
+
}))
|
|
684
|
+
.describe("Security issues found"),
|
|
685
|
+
riskLevel: z.enum(["low", "medium", "high"]).describe("Overall risk level"),
|
|
686
|
+
scannedRows: z.number().describe("Number of rows scanned"),
|
|
687
|
+
});
|
|
688
|
+
// Output schema for pg_jsonb_stats
|
|
689
|
+
export const JsonbStatsOutputSchema = z.object({
|
|
690
|
+
basics: z
|
|
691
|
+
.object({
|
|
692
|
+
total_rows: z.number().describe("Total rows"),
|
|
693
|
+
non_null_count: z.number().optional().describe("Non-null values"),
|
|
694
|
+
avg_size_bytes: z.number().optional().describe("Average size"),
|
|
695
|
+
max_size_bytes: z.number().optional().describe("Maximum size"),
|
|
696
|
+
})
|
|
697
|
+
.describe("Basic statistics"),
|
|
698
|
+
topKeys: z
|
|
699
|
+
.array(z.object({
|
|
700
|
+
key: z.string().describe("Key name"),
|
|
701
|
+
frequency: z.number().describe("Occurrence count"),
|
|
702
|
+
}))
|
|
703
|
+
.describe("Most common keys"),
|
|
704
|
+
typeDistribution: z
|
|
705
|
+
.array(z.object({
|
|
706
|
+
type: z
|
|
707
|
+
.string()
|
|
708
|
+
.nullable()
|
|
709
|
+
.describe("JSONB type (null = SQL NULL column)"),
|
|
710
|
+
count: z.number().describe("Count"),
|
|
711
|
+
}))
|
|
712
|
+
.describe("Type distribution"),
|
|
713
|
+
sqlNullCount: z
|
|
714
|
+
.number()
|
|
715
|
+
.optional()
|
|
716
|
+
.describe("Count of rows with SQL NULL in the JSONB column"),
|
|
717
|
+
hint: z.string().optional().describe("Usage hints or notes"),
|
|
197
718
|
});
|
|
198
719
|
//# sourceMappingURL=jsonb.js.map
|