@neverinfamous/postgres-mcp 1.0.1
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/LICENSE +21 -0
- package/README.md +515 -0
- package/dist/__tests__/mocks/adapter.d.ts +80 -0
- package/dist/__tests__/mocks/adapter.d.ts.map +1 -0
- package/dist/__tests__/mocks/adapter.js +225 -0
- package/dist/__tests__/mocks/adapter.js.map +1 -0
- package/dist/__tests__/mocks/index.d.ts +11 -0
- package/dist/__tests__/mocks/index.d.ts.map +1 -0
- package/dist/__tests__/mocks/index.js +11 -0
- package/dist/__tests__/mocks/index.js.map +1 -0
- package/dist/__tests__/mocks/pool.d.ts +43 -0
- package/dist/__tests__/mocks/pool.d.ts.map +1 -0
- package/dist/__tests__/mocks/pool.js +71 -0
- package/dist/__tests__/mocks/pool.js.map +1 -0
- package/dist/adapters/DatabaseAdapter.d.ts +139 -0
- package/dist/adapters/DatabaseAdapter.d.ts.map +1 -0
- package/dist/adapters/DatabaseAdapter.js +250 -0
- package/dist/adapters/DatabaseAdapter.js.map +1 -0
- package/dist/adapters/postgresql/PostgresAdapter.d.ts +119 -0
- package/dist/adapters/postgresql/PostgresAdapter.d.ts.map +1 -0
- package/dist/adapters/postgresql/PostgresAdapter.js +902 -0
- package/dist/adapters/postgresql/PostgresAdapter.js.map +1 -0
- package/dist/adapters/postgresql/index.d.ts +5 -0
- package/dist/adapters/postgresql/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/index.js +5 -0
- package/dist/adapters/postgresql/index.js.map +1 -0
- package/dist/adapters/postgresql/prompts/backup.d.ts +8 -0
- package/dist/adapters/postgresql/prompts/backup.d.ts.map +1 -0
- package/dist/adapters/postgresql/prompts/backup.js +132 -0
- package/dist/adapters/postgresql/prompts/backup.js.map +1 -0
- package/dist/adapters/postgresql/prompts/citext.d.ts +8 -0
- package/dist/adapters/postgresql/prompts/citext.d.ts.map +1 -0
- package/dist/adapters/postgresql/prompts/citext.js +227 -0
- package/dist/adapters/postgresql/prompts/citext.js.map +1 -0
- package/dist/adapters/postgresql/prompts/extensionSetup.d.ts +8 -0
- package/dist/adapters/postgresql/prompts/extensionSetup.d.ts.map +1 -0
- package/dist/adapters/postgresql/prompts/extensionSetup.js +282 -0
- package/dist/adapters/postgresql/prompts/extensionSetup.js.map +1 -0
- package/dist/adapters/postgresql/prompts/health.d.ts +8 -0
- package/dist/adapters/postgresql/prompts/health.d.ts.map +1 -0
- package/dist/adapters/postgresql/prompts/health.js +118 -0
- package/dist/adapters/postgresql/prompts/health.js.map +1 -0
- package/dist/adapters/postgresql/prompts/index.d.ts +13 -0
- package/dist/adapters/postgresql/prompts/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/prompts/index.js +308 -0
- package/dist/adapters/postgresql/prompts/index.js.map +1 -0
- package/dist/adapters/postgresql/prompts/indexTuning.d.ts +8 -0
- package/dist/adapters/postgresql/prompts/indexTuning.d.ts.map +1 -0
- package/dist/adapters/postgresql/prompts/indexTuning.js +130 -0
- package/dist/adapters/postgresql/prompts/indexTuning.js.map +1 -0
- package/dist/adapters/postgresql/prompts/kcache.d.ts +8 -0
- package/dist/adapters/postgresql/prompts/kcache.d.ts.map +1 -0
- package/dist/adapters/postgresql/prompts/kcache.js +227 -0
- package/dist/adapters/postgresql/prompts/kcache.js.map +1 -0
- package/dist/adapters/postgresql/prompts/ltree.d.ts +8 -0
- package/dist/adapters/postgresql/prompts/ltree.d.ts.map +1 -0
- package/dist/adapters/postgresql/prompts/ltree.js +286 -0
- package/dist/adapters/postgresql/prompts/ltree.js.map +1 -0
- package/dist/adapters/postgresql/prompts/partman.d.ts +8 -0
- package/dist/adapters/postgresql/prompts/partman.d.ts.map +1 -0
- package/dist/adapters/postgresql/prompts/partman.js +211 -0
- package/dist/adapters/postgresql/prompts/partman.js.map +1 -0
- package/dist/adapters/postgresql/prompts/pgcron.d.ts +8 -0
- package/dist/adapters/postgresql/prompts/pgcron.d.ts.map +1 -0
- package/dist/adapters/postgresql/prompts/pgcron.js +233 -0
- package/dist/adapters/postgresql/prompts/pgcron.js.map +1 -0
- package/dist/adapters/postgresql/prompts/pgcrypto.d.ts +8 -0
- package/dist/adapters/postgresql/prompts/pgcrypto.d.ts.map +1 -0
- package/dist/adapters/postgresql/prompts/pgcrypto.js +299 -0
- package/dist/adapters/postgresql/prompts/pgcrypto.js.map +1 -0
- package/dist/adapters/postgresql/prompts/pgvector.d.ts +8 -0
- package/dist/adapters/postgresql/prompts/pgvector.d.ts.map +1 -0
- package/dist/adapters/postgresql/prompts/pgvector.js +148 -0
- package/dist/adapters/postgresql/prompts/pgvector.js.map +1 -0
- package/dist/adapters/postgresql/prompts/postgis.d.ts +8 -0
- package/dist/adapters/postgresql/prompts/postgis.d.ts.map +1 -0
- package/dist/adapters/postgresql/prompts/postgis.js +200 -0
- package/dist/adapters/postgresql/prompts/postgis.js.map +1 -0
- package/dist/adapters/postgresql/resources/activity.d.ts +9 -0
- package/dist/adapters/postgresql/resources/activity.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/activity.js +118 -0
- package/dist/adapters/postgresql/resources/activity.js.map +1 -0
- package/dist/adapters/postgresql/resources/capabilities.d.ts +9 -0
- package/dist/adapters/postgresql/resources/capabilities.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/capabilities.js +182 -0
- package/dist/adapters/postgresql/resources/capabilities.js.map +1 -0
- package/dist/adapters/postgresql/resources/cron.d.ts +9 -0
- package/dist/adapters/postgresql/resources/cron.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/cron.js +156 -0
- package/dist/adapters/postgresql/resources/cron.js.map +1 -0
- package/dist/adapters/postgresql/resources/crypto.d.ts +9 -0
- package/dist/adapters/postgresql/resources/crypto.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/crypto.js +191 -0
- package/dist/adapters/postgresql/resources/crypto.js.map +1 -0
- package/dist/adapters/postgresql/resources/extensions.d.ts +9 -0
- package/dist/adapters/postgresql/resources/extensions.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/extensions.js +85 -0
- package/dist/adapters/postgresql/resources/extensions.js.map +1 -0
- package/dist/adapters/postgresql/resources/health.d.ts +9 -0
- package/dist/adapters/postgresql/resources/health.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/health.js +185 -0
- package/dist/adapters/postgresql/resources/health.js.map +1 -0
- package/dist/adapters/postgresql/resources/index.d.ts +40 -0
- package/dist/adapters/postgresql/resources/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/index.js +87 -0
- package/dist/adapters/postgresql/resources/index.js.map +1 -0
- package/dist/adapters/postgresql/resources/indexes.d.ts +9 -0
- package/dist/adapters/postgresql/resources/indexes.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/indexes.js +130 -0
- package/dist/adapters/postgresql/resources/indexes.js.map +1 -0
- package/dist/adapters/postgresql/resources/kcache.d.ts +9 -0
- package/dist/adapters/postgresql/resources/kcache.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/kcache.js +219 -0
- package/dist/adapters/postgresql/resources/kcache.js.map +1 -0
- package/dist/adapters/postgresql/resources/locks.d.ts +9 -0
- package/dist/adapters/postgresql/resources/locks.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/locks.js +89 -0
- package/dist/adapters/postgresql/resources/locks.js.map +1 -0
- package/dist/adapters/postgresql/resources/partman.d.ts +9 -0
- package/dist/adapters/postgresql/resources/partman.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/partman.js +149 -0
- package/dist/adapters/postgresql/resources/partman.js.map +1 -0
- package/dist/adapters/postgresql/resources/performance.d.ts +9 -0
- package/dist/adapters/postgresql/resources/performance.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/performance.js +170 -0
- package/dist/adapters/postgresql/resources/performance.js.map +1 -0
- package/dist/adapters/postgresql/resources/pool.d.ts +9 -0
- package/dist/adapters/postgresql/resources/pool.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/pool.js +93 -0
- package/dist/adapters/postgresql/resources/pool.js.map +1 -0
- package/dist/adapters/postgresql/resources/postgis.d.ts +9 -0
- package/dist/adapters/postgresql/resources/postgis.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/postgis.js +232 -0
- package/dist/adapters/postgresql/resources/postgis.js.map +1 -0
- package/dist/adapters/postgresql/resources/replication.d.ts +9 -0
- package/dist/adapters/postgresql/resources/replication.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/replication.js +126 -0
- package/dist/adapters/postgresql/resources/replication.js.map +1 -0
- package/dist/adapters/postgresql/resources/schema.d.ts +10 -0
- package/dist/adapters/postgresql/resources/schema.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/schema.js +80 -0
- package/dist/adapters/postgresql/resources/schema.js.map +1 -0
- package/dist/adapters/postgresql/resources/settings.d.ts +9 -0
- package/dist/adapters/postgresql/resources/settings.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/settings.js +184 -0
- package/dist/adapters/postgresql/resources/settings.js.map +1 -0
- package/dist/adapters/postgresql/resources/stats.d.ts +10 -0
- package/dist/adapters/postgresql/resources/stats.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/stats.js +124 -0
- package/dist/adapters/postgresql/resources/stats.js.map +1 -0
- package/dist/adapters/postgresql/resources/tables.d.ts +9 -0
- package/dist/adapters/postgresql/resources/tables.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/tables.js +20 -0
- package/dist/adapters/postgresql/resources/tables.js.map +1 -0
- package/dist/adapters/postgresql/resources/vacuum.d.ts +9 -0
- package/dist/adapters/postgresql/resources/vacuum.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/vacuum.js +122 -0
- package/dist/adapters/postgresql/resources/vacuum.js.map +1 -0
- package/dist/adapters/postgresql/resources/vector.d.ts +9 -0
- package/dist/adapters/postgresql/resources/vector.d.ts.map +1 -0
- package/dist/adapters/postgresql/resources/vector.js +185 -0
- package/dist/adapters/postgresql/resources/vector.js.map +1 -0
- package/dist/adapters/postgresql/schemas/admin.d.ts +74 -0
- package/dist/adapters/postgresql/schemas/admin.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/admin.js +180 -0
- package/dist/adapters/postgresql/schemas/admin.js.map +1 -0
- package/dist/adapters/postgresql/schemas/backup.d.ts +68 -0
- package/dist/adapters/postgresql/schemas/backup.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/backup.js +114 -0
- package/dist/adapters/postgresql/schemas/backup.js.map +1 -0
- package/dist/adapters/postgresql/schemas/core.d.ts +443 -0
- package/dist/adapters/postgresql/schemas/core.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/core.js +628 -0
- package/dist/adapters/postgresql/schemas/core.js.map +1 -0
- package/dist/adapters/postgresql/schemas/cron.d.ts +131 -0
- package/dist/adapters/postgresql/schemas/cron.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/cron.js +218 -0
- package/dist/adapters/postgresql/schemas/cron.js.map +1 -0
- package/dist/adapters/postgresql/schemas/extensions.d.ts +403 -0
- package/dist/adapters/postgresql/schemas/extensions.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/extensions.js +600 -0
- package/dist/adapters/postgresql/schemas/extensions.js.map +1 -0
- package/dist/adapters/postgresql/schemas/index.d.ts +21 -0
- package/dist/adapters/postgresql/schemas/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/index.js +72 -0
- package/dist/adapters/postgresql/schemas/index.js.map +1 -0
- package/dist/adapters/postgresql/schemas/jsonb.d.ts +94 -0
- package/dist/adapters/postgresql/schemas/jsonb.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/jsonb.js +198 -0
- package/dist/adapters/postgresql/schemas/jsonb.js.map +1 -0
- package/dist/adapters/postgresql/schemas/monitoring.d.ts +28 -0
- package/dist/adapters/postgresql/schemas/monitoring.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/monitoring.js +45 -0
- package/dist/adapters/postgresql/schemas/monitoring.js.map +1 -0
- package/dist/adapters/postgresql/schemas/partitioning.d.ts +152 -0
- package/dist/adapters/postgresql/schemas/partitioning.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/partitioning.js +399 -0
- package/dist/adapters/postgresql/schemas/partitioning.js.map +1 -0
- package/dist/adapters/postgresql/schemas/partman.d.ts +94 -0
- package/dist/adapters/postgresql/schemas/partman.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/partman.js +264 -0
- package/dist/adapters/postgresql/schemas/partman.js.map +1 -0
- package/dist/adapters/postgresql/schemas/performance.d.ts +52 -0
- package/dist/adapters/postgresql/schemas/performance.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/performance.js +57 -0
- package/dist/adapters/postgresql/schemas/performance.js.map +1 -0
- package/dist/adapters/postgresql/schemas/postgis.d.ts +693 -0
- package/dist/adapters/postgresql/schemas/postgis.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/postgis.js +662 -0
- package/dist/adapters/postgresql/schemas/postgis.js.map +1 -0
- package/dist/adapters/postgresql/schemas/schema-mgmt.d.ts +171 -0
- package/dist/adapters/postgresql/schemas/schema-mgmt.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/schema-mgmt.js +235 -0
- package/dist/adapters/postgresql/schemas/schema-mgmt.js.map +1 -0
- package/dist/adapters/postgresql/schemas/stats.d.ts +229 -0
- package/dist/adapters/postgresql/schemas/stats.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/stats.js +587 -0
- package/dist/adapters/postgresql/schemas/stats.js.map +1 -0
- package/dist/adapters/postgresql/schemas/text-search.d.ts +83 -0
- package/dist/adapters/postgresql/schemas/text-search.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/text-search.js +132 -0
- package/dist/adapters/postgresql/schemas/text-search.js.map +1 -0
- package/dist/adapters/postgresql/schemas/vector.d.ts +143 -0
- package/dist/adapters/postgresql/schemas/vector.d.ts.map +1 -0
- package/dist/adapters/postgresql/schemas/vector.js +123 -0
- package/dist/adapters/postgresql/schemas/vector.js.map +1 -0
- package/dist/adapters/postgresql/tools/admin.d.ts +13 -0
- package/dist/adapters/postgresql/tools/admin.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/admin.js +417 -0
- package/dist/adapters/postgresql/tools/admin.js.map +1 -0
- package/dist/adapters/postgresql/tools/backup/dump.d.ts +12 -0
- package/dist/adapters/postgresql/tools/backup/dump.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/backup/dump.js +546 -0
- package/dist/adapters/postgresql/tools/backup/dump.js.map +1 -0
- package/dist/adapters/postgresql/tools/backup/index.d.ts +16 -0
- package/dist/adapters/postgresql/tools/backup/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/backup/index.js +29 -0
- package/dist/adapters/postgresql/tools/backup/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/backup/planning.d.ts +22 -0
- package/dist/adapters/postgresql/tools/backup/planning.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/backup/planning.js +411 -0
- package/dist/adapters/postgresql/tools/backup/planning.js.map +1 -0
- package/dist/adapters/postgresql/tools/citext.d.ts +18 -0
- package/dist/adapters/postgresql/tools/citext.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/citext.js +568 -0
- package/dist/adapters/postgresql/tools/citext.js.map +1 -0
- package/dist/adapters/postgresql/tools/codemode/index.d.ts +27 -0
- package/dist/adapters/postgresql/tools/codemode/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/codemode/index.js +171 -0
- package/dist/adapters/postgresql/tools/codemode/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/core/convenience.d.ts +192 -0
- package/dist/adapters/postgresql/tools/core/convenience.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/core/convenience.js +617 -0
- package/dist/adapters/postgresql/tools/core/convenience.js.map +1 -0
- package/dist/adapters/postgresql/tools/core/health.d.ts +20 -0
- package/dist/adapters/postgresql/tools/core/health.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/core/health.js +360 -0
- package/dist/adapters/postgresql/tools/core/health.js.map +1 -0
- package/dist/adapters/postgresql/tools/core/index.d.ts +15 -0
- package/dist/adapters/postgresql/tools/core/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/core/index.js +40 -0
- package/dist/adapters/postgresql/tools/core/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/core/indexes.d.ts +30 -0
- package/dist/adapters/postgresql/tools/core/indexes.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/core/indexes.js +232 -0
- package/dist/adapters/postgresql/tools/core/indexes.js.map +1 -0
- package/dist/adapters/postgresql/tools/core/objects.d.ts +20 -0
- package/dist/adapters/postgresql/tools/core/objects.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/core/objects.js +361 -0
- package/dist/adapters/postgresql/tools/core/objects.js.map +1 -0
- package/dist/adapters/postgresql/tools/core/query.d.ts +16 -0
- package/dist/adapters/postgresql/tools/core/query.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/core/query.js +87 -0
- package/dist/adapters/postgresql/tools/core/query.js.map +1 -0
- package/dist/adapters/postgresql/tools/core/schemas.d.ts +135 -0
- package/dist/adapters/postgresql/tools/core/schemas.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/core/schemas.js +221 -0
- package/dist/adapters/postgresql/tools/core/schemas.js.map +1 -0
- package/dist/adapters/postgresql/tools/core/tables.d.ts +24 -0
- package/dist/adapters/postgresql/tools/core/tables.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/core/tables.js +219 -0
- package/dist/adapters/postgresql/tools/core/tables.js.map +1 -0
- package/dist/adapters/postgresql/tools/cron.d.ts +16 -0
- package/dist/adapters/postgresql/tools/cron.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/cron.js +440 -0
- package/dist/adapters/postgresql/tools/cron.js.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/advanced.d.ts +33 -0
- package/dist/adapters/postgresql/tools/jsonb/advanced.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/advanced.js +681 -0
- package/dist/adapters/postgresql/tools/jsonb/advanced.js.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/basic.d.ts +20 -0
- package/dist/adapters/postgresql/tools/jsonb/basic.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/basic.js +654 -0
- package/dist/adapters/postgresql/tools/jsonb/basic.js.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/index.d.ts +16 -0
- package/dist/adapters/postgresql/tools/jsonb/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/jsonb/index.js +39 -0
- package/dist/adapters/postgresql/tools/jsonb/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/kcache.d.ts +20 -0
- package/dist/adapters/postgresql/tools/kcache.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/kcache.js +574 -0
- package/dist/adapters/postgresql/tools/kcache.js.map +1 -0
- package/dist/adapters/postgresql/tools/ltree.d.ts +8 -0
- package/dist/adapters/postgresql/tools/ltree.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/ltree.js +390 -0
- package/dist/adapters/postgresql/tools/ltree.js.map +1 -0
- package/dist/adapters/postgresql/tools/monitoring.d.ts +13 -0
- package/dist/adapters/postgresql/tools/monitoring.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/monitoring.js +753 -0
- package/dist/adapters/postgresql/tools/monitoring.js.map +1 -0
- package/dist/adapters/postgresql/tools/partitioning.d.ts +13 -0
- package/dist/adapters/postgresql/tools/partitioning.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/partitioning.js +500 -0
- package/dist/adapters/postgresql/tools/partitioning.js.map +1 -0
- package/dist/adapters/postgresql/tools/partman/index.d.ts +19 -0
- package/dist/adapters/postgresql/tools/partman/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/partman/index.js +33 -0
- package/dist/adapters/postgresql/tools/partman/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/partman/management.d.ts +28 -0
- package/dist/adapters/postgresql/tools/partman/management.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/partman/management.js +563 -0
- package/dist/adapters/postgresql/tools/partman/management.js.map +1 -0
- package/dist/adapters/postgresql/tools/partman/operations.d.ts +28 -0
- package/dist/adapters/postgresql/tools/partman/operations.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/partman/operations.js +632 -0
- package/dist/adapters/postgresql/tools/partman/operations.js.map +1 -0
- package/dist/adapters/postgresql/tools/performance/analysis.d.ts +9 -0
- package/dist/adapters/postgresql/tools/performance/analysis.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/performance/analysis.js +383 -0
- package/dist/adapters/postgresql/tools/performance/analysis.js.map +1 -0
- package/dist/adapters/postgresql/tools/performance/explain.d.ts +13 -0
- package/dist/adapters/postgresql/tools/performance/explain.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/performance/explain.js +71 -0
- package/dist/adapters/postgresql/tools/performance/explain.js.map +1 -0
- package/dist/adapters/postgresql/tools/performance/index.d.ts +13 -0
- package/dist/adapters/postgresql/tools/performance/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/performance/index.js +40 -0
- package/dist/adapters/postgresql/tools/performance/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/performance/monitoring.d.ts +9 -0
- package/dist/adapters/postgresql/tools/performance/monitoring.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/performance/monitoring.js +122 -0
- package/dist/adapters/postgresql/tools/performance/monitoring.js.map +1 -0
- package/dist/adapters/postgresql/tools/performance/optimization.d.ts +9 -0
- package/dist/adapters/postgresql/tools/performance/optimization.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/performance/optimization.js +315 -0
- package/dist/adapters/postgresql/tools/performance/optimization.js.map +1 -0
- package/dist/adapters/postgresql/tools/performance/stats.d.ts +14 -0
- package/dist/adapters/postgresql/tools/performance/stats.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/performance/stats.js +559 -0
- package/dist/adapters/postgresql/tools/performance/stats.js.map +1 -0
- package/dist/adapters/postgresql/tools/pgcrypto.d.ts +8 -0
- package/dist/adapters/postgresql/tools/pgcrypto.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/pgcrypto.js +239 -0
- package/dist/adapters/postgresql/tools/pgcrypto.js.map +1 -0
- package/dist/adapters/postgresql/tools/postgis/advanced.d.ts +21 -0
- package/dist/adapters/postgresql/tools/postgis/advanced.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/postgis/advanced.js +383 -0
- package/dist/adapters/postgresql/tools/postgis/advanced.js.map +1 -0
- package/dist/adapters/postgresql/tools/postgis/basic.d.ts +16 -0
- package/dist/adapters/postgresql/tools/postgis/basic.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/postgis/basic.js +479 -0
- package/dist/adapters/postgresql/tools/postgis/basic.js.map +1 -0
- package/dist/adapters/postgresql/tools/postgis/index.d.ts +17 -0
- package/dist/adapters/postgresql/tools/postgis/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/postgis/index.js +46 -0
- package/dist/adapters/postgresql/tools/postgis/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/postgis/standalone.d.ts +21 -0
- package/dist/adapters/postgresql/tools/postgis/standalone.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/postgis/standalone.js +150 -0
- package/dist/adapters/postgresql/tools/postgis/standalone.js.map +1 -0
- package/dist/adapters/postgresql/tools/schema.d.ts +13 -0
- package/dist/adapters/postgresql/tools/schema.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/schema.js +515 -0
- package/dist/adapters/postgresql/tools/schema.js.map +1 -0
- package/dist/adapters/postgresql/tools/stats/advanced.d.ts +24 -0
- package/dist/adapters/postgresql/tools/stats/advanced.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/stats/advanced.js +876 -0
- package/dist/adapters/postgresql/tools/stats/advanced.js.map +1 -0
- package/dist/adapters/postgresql/tools/stats/basic.d.ts +24 -0
- package/dist/adapters/postgresql/tools/stats/basic.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/stats/basic.js +501 -0
- package/dist/adapters/postgresql/tools/stats/basic.js.map +1 -0
- package/dist/adapters/postgresql/tools/stats/index.d.ts +17 -0
- package/dist/adapters/postgresql/tools/stats/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/stats/index.js +30 -0
- package/dist/adapters/postgresql/tools/stats/index.js.map +1 -0
- package/dist/adapters/postgresql/tools/text.d.ts +13 -0
- package/dist/adapters/postgresql/tools/text.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/text.js +708 -0
- package/dist/adapters/postgresql/tools/text.js.map +1 -0
- package/dist/adapters/postgresql/tools/transactions.d.ts +13 -0
- package/dist/adapters/postgresql/tools/transactions.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/transactions.js +201 -0
- package/dist/adapters/postgresql/tools/transactions.js.map +1 -0
- package/dist/adapters/postgresql/tools/vector/advanced.d.ts +12 -0
- package/dist/adapters/postgresql/tools/vector/advanced.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/vector/advanced.js +902 -0
- package/dist/adapters/postgresql/tools/vector/advanced.js.map +1 -0
- package/dist/adapters/postgresql/tools/vector/basic.d.ts +25 -0
- package/dist/adapters/postgresql/tools/vector/basic.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/vector/basic.js +1000 -0
- package/dist/adapters/postgresql/tools/vector/basic.js.map +1 -0
- package/dist/adapters/postgresql/tools/vector/index.d.ts +13 -0
- package/dist/adapters/postgresql/tools/vector/index.d.ts.map +1 -0
- package/dist/adapters/postgresql/tools/vector/index.js +33 -0
- package/dist/adapters/postgresql/tools/vector/index.js.map +1 -0
- package/dist/auth/AuthorizationServerDiscovery.d.ts +44 -0
- package/dist/auth/AuthorizationServerDiscovery.d.ts.map +1 -0
- package/dist/auth/AuthorizationServerDiscovery.js +117 -0
- package/dist/auth/AuthorizationServerDiscovery.js.map +1 -0
- package/dist/auth/OAuthResourceServer.d.ts +42 -0
- package/dist/auth/OAuthResourceServer.d.ts.map +1 -0
- package/dist/auth/OAuthResourceServer.js +80 -0
- package/dist/auth/OAuthResourceServer.js.map +1 -0
- package/dist/auth/TokenValidator.d.ts +36 -0
- package/dist/auth/TokenValidator.d.ts.map +1 -0
- package/dist/auth/TokenValidator.js +139 -0
- package/dist/auth/TokenValidator.js.map +1 -0
- package/dist/auth/errors.d.ts +63 -0
- package/dist/auth/errors.d.ts.map +1 -0
- package/dist/auth/errors.js +102 -0
- package/dist/auth/errors.js.map +1 -0
- package/dist/auth/index.d.ts +15 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +16 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/middleware.d.ts +61 -0
- package/dist/auth/middleware.d.ts.map +1 -0
- package/dist/auth/middleware.js +156 -0
- package/dist/auth/middleware.js.map +1 -0
- package/dist/auth/scopes.d.ts +65 -0
- package/dist/auth/scopes.d.ts.map +1 -0
- package/dist/auth/scopes.js +189 -0
- package/dist/auth/scopes.js.map +1 -0
- package/dist/auth/types.d.ts +208 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +8 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/cli/args.d.ts +34 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +308 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +7 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +341 -0
- package/dist/cli.js.map +1 -0
- package/dist/codemode/api.d.ts +62 -0
- package/dist/codemode/api.d.ts.map +1 -0
- package/dist/codemode/api.js +1505 -0
- package/dist/codemode/api.js.map +1 -0
- package/dist/codemode/index.d.ts +13 -0
- package/dist/codemode/index.d.ts.map +1 -0
- package/dist/codemode/index.js +17 -0
- package/dist/codemode/index.js.map +1 -0
- package/dist/codemode/sandbox-factory.d.ts +72 -0
- package/dist/codemode/sandbox-factory.d.ts.map +1 -0
- package/dist/codemode/sandbox-factory.js +88 -0
- package/dist/codemode/sandbox-factory.js.map +1 -0
- package/dist/codemode/sandbox.d.ts +96 -0
- package/dist/codemode/sandbox.d.ts.map +1 -0
- package/dist/codemode/sandbox.js +345 -0
- package/dist/codemode/sandbox.js.map +1 -0
- package/dist/codemode/security.d.ts +44 -0
- package/dist/codemode/security.d.ts.map +1 -0
- package/dist/codemode/security.js +149 -0
- package/dist/codemode/security.js.map +1 -0
- package/dist/codemode/types.d.ts +137 -0
- package/dist/codemode/types.d.ts.map +1 -0
- package/dist/codemode/types.js +46 -0
- package/dist/codemode/types.js.map +1 -0
- package/dist/codemode/worker-sandbox.d.ts +82 -0
- package/dist/codemode/worker-sandbox.d.ts.map +1 -0
- package/dist/codemode/worker-sandbox.js +244 -0
- package/dist/codemode/worker-sandbox.js.map +1 -0
- package/dist/codemode/worker-script.d.ts +8 -0
- package/dist/codemode/worker-script.d.ts.map +1 -0
- package/dist/codemode/worker-script.js +113 -0
- package/dist/codemode/worker-script.js.map +1 -0
- package/dist/constants/ServerInstructions.d.ts +13 -0
- package/dist/constants/ServerInstructions.d.ts.map +1 -0
- package/dist/constants/ServerInstructions.js +405 -0
- package/dist/constants/ServerInstructions.js.map +1 -0
- package/dist/filtering/ToolConstants.d.ts +43 -0
- package/dist/filtering/ToolConstants.d.ts.map +1 -0
- package/dist/filtering/ToolConstants.js +352 -0
- package/dist/filtering/ToolConstants.js.map +1 -0
- package/dist/filtering/ToolFilter.d.ts +90 -0
- package/dist/filtering/ToolFilter.d.ts.map +1 -0
- package/dist/filtering/ToolFilter.js +315 -0
- package/dist/filtering/ToolFilter.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/pool/ConnectionPool.d.ts +70 -0
- package/dist/pool/ConnectionPool.d.ts.map +1 -0
- package/dist/pool/ConnectionPool.js +254 -0
- package/dist/pool/ConnectionPool.js.map +1 -0
- package/dist/server/McpServer.d.ts +50 -0
- package/dist/server/McpServer.d.ts.map +1 -0
- package/dist/server/McpServer.js +108 -0
- package/dist/server/McpServer.js.map +1 -0
- package/dist/transports/http.d.ts +126 -0
- package/dist/transports/http.d.ts.map +1 -0
- package/dist/transports/http.js +303 -0
- package/dist/transports/http.js.map +1 -0
- package/dist/transports/index.d.ts +8 -0
- package/dist/transports/index.d.ts.map +1 -0
- package/dist/transports/index.js +7 -0
- package/dist/transports/index.js.map +1 -0
- package/dist/types/adapters.d.ts +136 -0
- package/dist/types/adapters.d.ts.map +1 -0
- package/dist/types/adapters.js +7 -0
- package/dist/types/adapters.js.map +1 -0
- package/dist/types/database.d.ts +204 -0
- package/dist/types/database.d.ts.map +1 -0
- package/dist/types/database.js +7 -0
- package/dist/types/database.js.map +1 -0
- package/dist/types/errors.d.ts +62 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +91 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/filtering.d.ts +39 -0
- package/dist/types/filtering.d.ts.map +1 -0
- package/dist/types/filtering.js +7 -0
- package/dist/types/filtering.js.map +1 -0
- package/dist/types/index.d.ts +16 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +11 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/mcp.d.ts +31 -0
- package/dist/types/mcp.d.ts.map +1 -0
- package/dist/types/mcp.js +7 -0
- package/dist/types/mcp.js.map +1 -0
- package/dist/types/oauth.d.ts +65 -0
- package/dist/types/oauth.d.ts.map +1 -0
- package/dist/types/oauth.js +7 -0
- package/dist/types/oauth.js.map +1 -0
- package/dist/types/schema.d.ts +110 -0
- package/dist/types/schema.d.ts.map +1 -0
- package/dist/types/schema.js +7 -0
- package/dist/types/schema.js.map +1 -0
- package/dist/utils/annotations.d.ts +42 -0
- package/dist/utils/annotations.d.ts.map +1 -0
- package/dist/utils/annotations.js +75 -0
- package/dist/utils/annotations.js.map +1 -0
- package/dist/utils/icons.d.ts +25 -0
- package/dist/utils/icons.d.ts.map +1 -0
- package/dist/utils/icons.js +212 -0
- package/dist/utils/icons.js.map +1 -0
- package/dist/utils/identifiers.d.ts +111 -0
- package/dist/utils/identifiers.d.ts.map +1 -0
- package/dist/utils/identifiers.js +270 -0
- package/dist/utils/identifiers.js.map +1 -0
- package/dist/utils/logger.d.ts +141 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +304 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/promptGenerator.d.ts +20 -0
- package/dist/utils/promptGenerator.d.ts.map +1 -0
- package/dist/utils/promptGenerator.js +81 -0
- package/dist/utils/promptGenerator.js.map +1 -0
- package/dist/utils/resourceAnnotations.d.ts +36 -0
- package/dist/utils/resourceAnnotations.d.ts.map +1 -0
- package/dist/utils/resourceAnnotations.js +57 -0
- package/dist/utils/resourceAnnotations.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,654 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL JSONB Tools - Basic Operations
|
|
3
|
+
*
|
|
4
|
+
* Core JSONB operations including extract, set, insert, delete, contains, path query, aggregation, and type checks.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { readOnly, write } from "../../../../utils/annotations.js";
|
|
8
|
+
import { getToolIcons } from "../../../../utils/icons.js";
|
|
9
|
+
import { JsonbExtractSchema, JsonbSetSchema, JsonbContainsSchema, JsonbPathQuerySchema, JsonbInsertSchema, JsonbDeleteSchema, normalizePathToArray, normalizePathForInsert, parseJsonbValue, } from "../../schemas/index.js";
|
|
10
|
+
/**
|
|
11
|
+
* Convert value to a valid JSON string for PostgreSQL's ::jsonb cast
|
|
12
|
+
* Always uses JSON.stringify to ensure proper encoding
|
|
13
|
+
*/
|
|
14
|
+
function toJsonString(value) {
|
|
15
|
+
return JSON.stringify(value);
|
|
16
|
+
}
|
|
17
|
+
export function createJsonbExtractTool(adapter) {
|
|
18
|
+
return {
|
|
19
|
+
name: "pg_jsonb_extract",
|
|
20
|
+
description: "Extract value from JSONB at specified path. Returns null if path does not exist in data structure. Use select param to include identifying columns.",
|
|
21
|
+
group: "jsonb",
|
|
22
|
+
inputSchema: JsonbExtractSchema,
|
|
23
|
+
annotations: readOnly("JSONB Extract"),
|
|
24
|
+
icons: getToolIcons("jsonb", readOnly("JSONB Extract")),
|
|
25
|
+
handler: async (params, _context) => {
|
|
26
|
+
const parsed = JsonbExtractSchema.parse(params);
|
|
27
|
+
const whereClause = parsed.where ? ` WHERE ${parsed.where}` : "";
|
|
28
|
+
const limitClause = parsed.limit !== undefined ? ` LIMIT ${String(parsed.limit)}` : "";
|
|
29
|
+
// Use normalizePathToArray for PostgreSQL #> operator
|
|
30
|
+
const pathArray = normalizePathToArray(parsed.path);
|
|
31
|
+
// Build select expression with optional additional columns
|
|
32
|
+
let selectExpr = `"${parsed.column}" #> $1 as extracted_value`;
|
|
33
|
+
if (parsed.select !== undefined && parsed.select.length > 0) {
|
|
34
|
+
const additionalCols = parsed.select
|
|
35
|
+
.map((c) => {
|
|
36
|
+
// Handle expressions vs simple column names
|
|
37
|
+
const needsQuote = !c.includes("->") &&
|
|
38
|
+
!c.includes("(") &&
|
|
39
|
+
!c.includes("::") &&
|
|
40
|
+
/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(c);
|
|
41
|
+
return needsQuote ? `"${c}"` : c;
|
|
42
|
+
})
|
|
43
|
+
.join(", ");
|
|
44
|
+
selectExpr = `${additionalCols}, ${selectExpr}`;
|
|
45
|
+
}
|
|
46
|
+
const sql = `SELECT ${selectExpr} FROM "${parsed.table}"${whereClause}${limitClause}`;
|
|
47
|
+
const result = await adapter.executeQuery(sql, [pathArray]);
|
|
48
|
+
// If select columns were provided, return full row objects
|
|
49
|
+
if (parsed.select !== undefined && parsed.select.length > 0) {
|
|
50
|
+
const rows = result.rows?.map((r) => {
|
|
51
|
+
// Rename extracted_value back to 'value' for consistency
|
|
52
|
+
const row = {};
|
|
53
|
+
for (const [key, val] of Object.entries(r)) {
|
|
54
|
+
if (key === "extracted_value") {
|
|
55
|
+
row["value"] = val;
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
row[key] = val;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return row;
|
|
62
|
+
});
|
|
63
|
+
const allNulls = rows?.every((r) => r["value"] === null) ?? false;
|
|
64
|
+
const response = {
|
|
65
|
+
rows,
|
|
66
|
+
count: rows?.length ?? 0,
|
|
67
|
+
};
|
|
68
|
+
if (allNulls && (rows?.length ?? 0) > 0) {
|
|
69
|
+
response.hint =
|
|
70
|
+
"All values are null - path may not exist in data. Use pg_jsonb_typeof to check.";
|
|
71
|
+
}
|
|
72
|
+
return response;
|
|
73
|
+
}
|
|
74
|
+
// Original behavior: return just the extracted values
|
|
75
|
+
// Wrap each value in an object with 'value' key for consistency with select mode
|
|
76
|
+
const rows = result.rows?.map((r) => ({ value: r["extracted_value"] }));
|
|
77
|
+
// Check if all results are null (path may not exist)
|
|
78
|
+
const allNulls = rows?.every((r) => r.value === null) ?? false;
|
|
79
|
+
const response = {
|
|
80
|
+
rows,
|
|
81
|
+
count: rows?.length ?? 0,
|
|
82
|
+
};
|
|
83
|
+
if (allNulls && (rows?.length ?? 0) > 0) {
|
|
84
|
+
response.hint =
|
|
85
|
+
"All values are null - path may not exist in data. Use pg_jsonb_typeof to check.";
|
|
86
|
+
}
|
|
87
|
+
return response;
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
export function createJsonbSetTool(adapter) {
|
|
92
|
+
return {
|
|
93
|
+
name: "pg_jsonb_set",
|
|
94
|
+
description: "Set value in JSONB at path. Uses dot-notation by default; for literal dots in keys use array format [\"key.with.dots\"]. Use empty path ('' or []) to replace entire column value.",
|
|
95
|
+
group: "jsonb",
|
|
96
|
+
inputSchema: JsonbSetSchema,
|
|
97
|
+
annotations: write("JSONB Set"),
|
|
98
|
+
icons: getToolIcons("jsonb", write("JSONB Set")),
|
|
99
|
+
handler: async (params, _context) => {
|
|
100
|
+
const parsed = JsonbSetSchema.parse(params);
|
|
101
|
+
const { table, column, value, where, createMissing } = parsed;
|
|
102
|
+
// Normalize path to array format
|
|
103
|
+
const path = normalizePathToArray(parsed.path);
|
|
104
|
+
// Validate required 'where' parameter
|
|
105
|
+
if (!where || where.trim() === "") {
|
|
106
|
+
throw new Error('pg_jsonb_set requires a WHERE clause to identify rows to update. Example: where: "id = 1"');
|
|
107
|
+
}
|
|
108
|
+
// Validate value is provided (undefined would set column to null)
|
|
109
|
+
if (value === undefined) {
|
|
110
|
+
throw new Error("pg_jsonb_set requires a value parameter. To remove a key, use pg_jsonb_delete instead.");
|
|
111
|
+
}
|
|
112
|
+
const createFlag = createMissing !== false;
|
|
113
|
+
// Handle empty path - replace entire column value
|
|
114
|
+
if (path.length === 0) {
|
|
115
|
+
const sql = `UPDATE "${table}" SET "${column}" = $1::jsonb WHERE ${where}`;
|
|
116
|
+
const result = await adapter.executeQuery(sql, [toJsonString(value)]);
|
|
117
|
+
return {
|
|
118
|
+
rowsAffected: result.rowsAffected,
|
|
119
|
+
hint: "Replaced entire column value (empty path)",
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
// For deep nested paths with createMissing=true, build intermediate objects
|
|
123
|
+
// PostgreSQL's jsonb_set only creates one level, so we nest calls for deep paths
|
|
124
|
+
let sql;
|
|
125
|
+
if (createFlag && path.length > 1) {
|
|
126
|
+
// Build nested jsonb_set calls to ensure each intermediate path exists
|
|
127
|
+
// Start with COALESCE to handle NULL columns
|
|
128
|
+
let expr = `COALESCE("${column}", '{}'::jsonb)`;
|
|
129
|
+
// For each intermediate level, wrap in jsonb_set to initialize to {}
|
|
130
|
+
for (let i = 0; i < path.length - 1; i++) {
|
|
131
|
+
const subPath = path.slice(0, i + 1);
|
|
132
|
+
const pathStr = "{" + subPath.join(",") + "}";
|
|
133
|
+
// Use COALESCE on the extraction from current expr, not original column
|
|
134
|
+
// This properly chains the nested creation
|
|
135
|
+
expr = `jsonb_set(${expr}, '${pathStr}'::text[], COALESCE((${expr}) #> '${pathStr}'::text[], '{}'::jsonb), true)`;
|
|
136
|
+
}
|
|
137
|
+
// Final set with actual value
|
|
138
|
+
const fullPathStr = "{" + path.join(",") + "}";
|
|
139
|
+
expr = `jsonb_set(${expr}, '${fullPathStr}'::text[], $1::jsonb, true)`;
|
|
140
|
+
sql = `UPDATE "${table}" SET "${column}" = ${expr} WHERE ${where}`;
|
|
141
|
+
const result = await adapter.executeQuery(sql, [toJsonString(value)]);
|
|
142
|
+
return {
|
|
143
|
+
rowsAffected: result.rowsAffected,
|
|
144
|
+
hint: "rowsAffected counts matched rows, not path creations",
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
// Use COALESCE to handle NULL columns - initialize to empty object
|
|
149
|
+
sql = `UPDATE "${table}" SET "${column}" = jsonb_set(COALESCE("${column}", '{}'::jsonb), $1, $2::jsonb, $3) WHERE ${where}`;
|
|
150
|
+
const result = await adapter.executeQuery(sql, [
|
|
151
|
+
path,
|
|
152
|
+
toJsonString(value),
|
|
153
|
+
createFlag,
|
|
154
|
+
]);
|
|
155
|
+
const hint = createFlag
|
|
156
|
+
? "NULL columns initialized to {}; createMissing creates path if absent"
|
|
157
|
+
: "createMissing=false: path must exist or value won't be set";
|
|
158
|
+
return { rowsAffected: result.rowsAffected, hint };
|
|
159
|
+
}
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
export function createJsonbInsertTool(adapter) {
|
|
164
|
+
return {
|
|
165
|
+
name: "pg_jsonb_insert",
|
|
166
|
+
description: "Insert value into JSONB array. Index -1 inserts BEFORE last element; use insertAfter:true with -1 to append at end.",
|
|
167
|
+
group: "jsonb",
|
|
168
|
+
inputSchema: JsonbInsertSchema,
|
|
169
|
+
annotations: write("JSONB Insert"),
|
|
170
|
+
icons: getToolIcons("jsonb", write("JSONB Insert")),
|
|
171
|
+
handler: async (params, _context) => {
|
|
172
|
+
const parsed = JsonbInsertSchema.parse(params);
|
|
173
|
+
// Normalize path - convert numeric segments to numbers for PostgreSQL
|
|
174
|
+
const path = normalizePathForInsert(parsed.path);
|
|
175
|
+
// Validate required 'where' parameter
|
|
176
|
+
if (!parsed.where || parsed.where.trim() === "") {
|
|
177
|
+
throw new Error('pg_jsonb_insert requires a WHERE clause to identify rows to update. Example: where: "id = 1"');
|
|
178
|
+
}
|
|
179
|
+
// Check for NULL columns first - jsonb_insert requires existing array context
|
|
180
|
+
const checkSql = `SELECT COUNT(*) as null_count FROM "${parsed.table}" WHERE ${parsed.where} AND "${parsed.column}" IS NULL`;
|
|
181
|
+
const checkResult = await adapter.executeQuery(checkSql);
|
|
182
|
+
const nullCount = Number(checkResult.rows?.[0]?.["null_count"] ?? 0);
|
|
183
|
+
if (nullCount > 0) {
|
|
184
|
+
throw new Error(`pg_jsonb_insert cannot operate on NULL columns. Use pg_jsonb_set to initialize the column first: pg_jsonb_set({table: "${parsed.table}", column: "${parsed.column}", path: "myarray", value: [], where: "..."})`);
|
|
185
|
+
}
|
|
186
|
+
// Validate target path points to an array, not an object
|
|
187
|
+
// Get the parent path (one level up from where we're inserting)
|
|
188
|
+
const parentPath = path.slice(0, -1);
|
|
189
|
+
if (parentPath.length === 0) {
|
|
190
|
+
// Inserting at root level - check column type
|
|
191
|
+
const typeCheckSql = `SELECT jsonb_typeof("${parsed.column}") as type FROM "${parsed.table}" WHERE ${parsed.where} LIMIT 1`;
|
|
192
|
+
const typeResult = await adapter.executeQuery(typeCheckSql);
|
|
193
|
+
const columnType = typeResult.rows?.[0]?.["type"];
|
|
194
|
+
if (columnType && columnType !== "array") {
|
|
195
|
+
throw new Error(`pg_jsonb_insert requires an array target. Column contains '${columnType}'. Use pg_jsonb_set for objects.`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
// Check the parent path type
|
|
200
|
+
const typeCheckSql = `SELECT jsonb_typeof("${parsed.column}" #> $1) as type FROM "${parsed.table}" WHERE ${parsed.where} LIMIT 1`;
|
|
201
|
+
const parentPathStrings = parentPath.map((p) => String(p));
|
|
202
|
+
const typeResult = await adapter.executeQuery(typeCheckSql, [
|
|
203
|
+
parentPathStrings,
|
|
204
|
+
]);
|
|
205
|
+
const targetType = typeResult.rows?.[0]?.["type"];
|
|
206
|
+
if (targetType && targetType !== "array") {
|
|
207
|
+
throw new Error(`pg_jsonb_insert requires an array target. Path '${parentPathStrings.join(".")}' contains '${targetType}'. Use pg_jsonb_set for objects.`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
const sql = `UPDATE "${parsed.table}" SET "${parsed.column}" = jsonb_insert("${parsed.column}", $1, $2::jsonb, $3) WHERE ${parsed.where}`;
|
|
211
|
+
try {
|
|
212
|
+
const result = await adapter.executeQuery(sql, [
|
|
213
|
+
path,
|
|
214
|
+
toJsonString(parsed.value),
|
|
215
|
+
parsed.insertAfter ?? false,
|
|
216
|
+
]);
|
|
217
|
+
return { rowsAffected: result.rowsAffected };
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
// Improve PostgreSQL error messages
|
|
221
|
+
if (error instanceof Error &&
|
|
222
|
+
error.message.includes("cannot replace existing key")) {
|
|
223
|
+
throw new Error(`pg_jsonb_insert is for arrays only. For objects, use pg_jsonb_set. If updating an existing array element, use pg_jsonb_set.`);
|
|
224
|
+
}
|
|
225
|
+
if (error instanceof Error &&
|
|
226
|
+
error.message.includes("path element is not an integer")) {
|
|
227
|
+
throw new Error(`pg_jsonb_insert requires numeric index for array position. Use array format with number: ["tags", 0] not ["tags", "0"] or "tags.0"`);
|
|
228
|
+
}
|
|
229
|
+
throw error;
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
export function createJsonbDeleteTool(adapter) {
|
|
235
|
+
return {
|
|
236
|
+
name: "pg_jsonb_delete",
|
|
237
|
+
description: "Delete a key or array element from a JSONB column. Accepts path as string or array. Note: rowsAffected reflects matched rows, not whether key existed.",
|
|
238
|
+
group: "jsonb",
|
|
239
|
+
inputSchema: JsonbDeleteSchema,
|
|
240
|
+
annotations: write("JSONB Delete"),
|
|
241
|
+
icons: getToolIcons("jsonb", write("JSONB Delete")),
|
|
242
|
+
handler: async (params, _context) => {
|
|
243
|
+
const parsed = JsonbDeleteSchema.parse(params);
|
|
244
|
+
// Validate required 'where' parameter
|
|
245
|
+
if (!parsed.where || parsed.where.trim() === "") {
|
|
246
|
+
throw new Error('pg_jsonb_delete requires a WHERE clause to identify rows to update. Example: where: "id = 1"');
|
|
247
|
+
}
|
|
248
|
+
// Validate path is not empty
|
|
249
|
+
if (parsed.path === "" ||
|
|
250
|
+
(Array.isArray(parsed.path) && parsed.path.length === 0)) {
|
|
251
|
+
throw new Error("pg_jsonb_delete requires a non-empty path. Provide a key name or path to delete.");
|
|
252
|
+
}
|
|
253
|
+
// Determine if path should be treated as nested (array path) or single key
|
|
254
|
+
// - Array paths: ["a", "b"], ["0"], [1]
|
|
255
|
+
// - Bare number: 0, 1 (treat as array index)
|
|
256
|
+
// - Dot notation: "a.b.c"
|
|
257
|
+
// - Numeric string: "0", "1" (treat as array index)
|
|
258
|
+
// - Single key: "mykey" (use - operator, not #-)
|
|
259
|
+
let pathForPostgres;
|
|
260
|
+
let useArrayOperator = false;
|
|
261
|
+
if (typeof parsed.path === "number") {
|
|
262
|
+
// Bare number - treat as array index
|
|
263
|
+
pathForPostgres = [String(parsed.path)];
|
|
264
|
+
useArrayOperator = true;
|
|
265
|
+
}
|
|
266
|
+
else if (Array.isArray(parsed.path)) {
|
|
267
|
+
// Already an array - normalize to string array
|
|
268
|
+
pathForPostgres = normalizePathToArray(parsed.path);
|
|
269
|
+
useArrayOperator = true;
|
|
270
|
+
}
|
|
271
|
+
else if (parsed.path.includes(".")) {
|
|
272
|
+
// Dot notation - convert to array
|
|
273
|
+
pathForPostgres = parsed.path.split(".").filter((p) => p !== "");
|
|
274
|
+
useArrayOperator = true;
|
|
275
|
+
}
|
|
276
|
+
else if (/^\d+$/.test(parsed.path)) {
|
|
277
|
+
// Pure numeric string - treat as array index
|
|
278
|
+
pathForPostgres = [parsed.path];
|
|
279
|
+
useArrayOperator = true;
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
// Single key - use simple - operator
|
|
283
|
+
pathForPostgres = parsed.path;
|
|
284
|
+
useArrayOperator = false;
|
|
285
|
+
}
|
|
286
|
+
const pathExpr = useArrayOperator ? `#- $1` : `- $1`;
|
|
287
|
+
const sql = `UPDATE "${parsed.table}" SET "${parsed.column}" = "${parsed.column}" ${pathExpr} WHERE ${parsed.where}`;
|
|
288
|
+
const result = await adapter.executeQuery(sql, [pathForPostgres]);
|
|
289
|
+
return {
|
|
290
|
+
rowsAffected: result.rowsAffected,
|
|
291
|
+
hint: "rowsAffected counts matched rows, not whether key existed",
|
|
292
|
+
};
|
|
293
|
+
},
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
export function createJsonbContainsTool(adapter) {
|
|
297
|
+
return {
|
|
298
|
+
name: "pg_jsonb_contains",
|
|
299
|
+
description: "Find rows where JSONB column contains the specified value. Note: Empty object {} matches all rows.",
|
|
300
|
+
group: "jsonb",
|
|
301
|
+
inputSchema: JsonbContainsSchema,
|
|
302
|
+
annotations: readOnly("JSONB Contains"),
|
|
303
|
+
icons: getToolIcons("jsonb", readOnly("JSONB Contains")),
|
|
304
|
+
handler: async (params, _context) => {
|
|
305
|
+
const parsed = JsonbContainsSchema.parse(params);
|
|
306
|
+
const { table, column, select, where } = parsed;
|
|
307
|
+
// Parse JSON string values from MCP clients
|
|
308
|
+
const value = parseJsonbValue(parsed.value);
|
|
309
|
+
const selectCols = select !== undefined && select.length > 0
|
|
310
|
+
? select.map((c) => `"${c}"`).join(", ")
|
|
311
|
+
: "*";
|
|
312
|
+
// Build WHERE clause combining containment check with optional filter
|
|
313
|
+
const containsClause = `"${column}" @> $1::jsonb`;
|
|
314
|
+
const whereClause = where ? ` AND ${where}` : "";
|
|
315
|
+
const sql = `SELECT ${selectCols} FROM "${table}" WHERE ${containsClause}${whereClause}`;
|
|
316
|
+
const result = await adapter.executeQuery(sql, [toJsonString(value)]);
|
|
317
|
+
// Warn if empty object was passed (matches all rows)
|
|
318
|
+
const isEmptyObject = typeof value === "object" &&
|
|
319
|
+
value !== null &&
|
|
320
|
+
!Array.isArray(value) &&
|
|
321
|
+
Object.keys(value).length === 0;
|
|
322
|
+
const response = {
|
|
323
|
+
rows: result.rows,
|
|
324
|
+
count: result.rows?.length ?? 0,
|
|
325
|
+
};
|
|
326
|
+
if (isEmptyObject) {
|
|
327
|
+
response.warning =
|
|
328
|
+
"Empty {} matches ALL rows - this is PostgreSQL containment semantics";
|
|
329
|
+
}
|
|
330
|
+
return response;
|
|
331
|
+
},
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
export function createJsonbPathQueryTool(adapter) {
|
|
335
|
+
return {
|
|
336
|
+
name: "pg_jsonb_path_query",
|
|
337
|
+
description: "Query JSONB using SQL/JSON path expressions (PostgreSQL 12+). Note: Recursive descent (..) syntax is not supported by PostgreSQL.",
|
|
338
|
+
group: "jsonb",
|
|
339
|
+
inputSchema: JsonbPathQuerySchema,
|
|
340
|
+
annotations: readOnly("JSONB Path Query"),
|
|
341
|
+
icons: getToolIcons("jsonb", readOnly("JSONB Path Query")),
|
|
342
|
+
handler: async (params, _context) => {
|
|
343
|
+
const { table, column, path, vars, where } = JsonbPathQuerySchema.parse(params);
|
|
344
|
+
const whereClause = where ? ` WHERE ${where}` : "";
|
|
345
|
+
const varsJson = vars ? JSON.stringify(vars) : "{}";
|
|
346
|
+
const sql = `SELECT jsonb_path_query("${column}", $1::jsonpath, $2::jsonb) as result FROM "${table}"${whereClause}`;
|
|
347
|
+
const result = await adapter.executeQuery(sql, [path, varsJson]);
|
|
348
|
+
const results = result.rows?.map((r) => r["result"]);
|
|
349
|
+
return { results, count: results?.length ?? 0 };
|
|
350
|
+
},
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Parse a select expression and extract the alias if present.
|
|
355
|
+
* Handles: "column", "expression AS alias", "expression as alias"
|
|
356
|
+
* Returns: { expr: string, alias: string }
|
|
357
|
+
*/
|
|
358
|
+
function parseSelectAlias(selectItem) {
|
|
359
|
+
// Match " AS " or " as " (case-insensitive) with word boundaries
|
|
360
|
+
const aliasRegex = /^(.+?)\s+[Aa][Ss]\s+([\w]+)$/;
|
|
361
|
+
const aliasMatch = aliasRegex.exec(selectItem);
|
|
362
|
+
if (aliasMatch?.[1] !== undefined && aliasMatch[2] !== undefined) {
|
|
363
|
+
return { expr: aliasMatch[1].trim(), alias: aliasMatch[2].trim() };
|
|
364
|
+
}
|
|
365
|
+
// No alias - use the expression as-is for both
|
|
366
|
+
// For simple column names, use them directly; for expressions, use a sanitized key
|
|
367
|
+
const cleanKey = selectItem.includes("->") || selectItem.includes("(")
|
|
368
|
+
? selectItem
|
|
369
|
+
.replace(/[^\w]/g, "_")
|
|
370
|
+
.replace(/_+/g, "_")
|
|
371
|
+
.replace(/^_|_$/g, "")
|
|
372
|
+
: selectItem;
|
|
373
|
+
return { expr: selectItem, alias: cleanKey };
|
|
374
|
+
}
|
|
375
|
+
export function createJsonbAggTool(adapter) {
|
|
376
|
+
return {
|
|
377
|
+
name: "pg_jsonb_agg",
|
|
378
|
+
description: "Aggregate rows into a JSONB array. With groupBy, returns all groups with their aggregated items.",
|
|
379
|
+
group: "jsonb",
|
|
380
|
+
inputSchema: z.object({
|
|
381
|
+
table: z.string(),
|
|
382
|
+
select: z
|
|
383
|
+
.array(z.string())
|
|
384
|
+
.optional()
|
|
385
|
+
.describe('Columns or expressions to include. Supports AS aliases: ["id", "metadata->\'name\' AS name"]'),
|
|
386
|
+
where: z.string().optional(),
|
|
387
|
+
groupBy: z
|
|
388
|
+
.string()
|
|
389
|
+
.optional()
|
|
390
|
+
.describe("Column or expression to group by. Returns {result: [{group_key, items}], count, grouped: true}"),
|
|
391
|
+
orderBy: z
|
|
392
|
+
.string()
|
|
393
|
+
.optional()
|
|
394
|
+
.describe('ORDER BY clause (e.g., "id DESC", "name ASC")'),
|
|
395
|
+
limit: z
|
|
396
|
+
.number()
|
|
397
|
+
.optional()
|
|
398
|
+
.describe("Maximum number of rows to aggregate"),
|
|
399
|
+
}),
|
|
400
|
+
annotations: readOnly("JSONB Aggregate"),
|
|
401
|
+
icons: getToolIcons("jsonb", readOnly("JSONB Aggregate")),
|
|
402
|
+
handler: async (params, _context) => {
|
|
403
|
+
const parsed = params;
|
|
404
|
+
// Build select expression with proper alias handling
|
|
405
|
+
let selectExpr;
|
|
406
|
+
if (parsed.select !== undefined && parsed.select.length > 0) {
|
|
407
|
+
// Parse each select item for potential aliases
|
|
408
|
+
const selectParts = parsed.select.map((item) => {
|
|
409
|
+
const { expr, alias } = parseSelectAlias(item);
|
|
410
|
+
// Detect if expression needs quoting (simple column names vs expressions)
|
|
411
|
+
const needsQuote = !expr.includes("->") &&
|
|
412
|
+
!expr.includes("(") &&
|
|
413
|
+
!expr.includes("::") &&
|
|
414
|
+
/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(expr);
|
|
415
|
+
const exprStr = needsQuote ? `"${expr}"` : expr;
|
|
416
|
+
return `'${alias}', ${exprStr}`;
|
|
417
|
+
});
|
|
418
|
+
selectExpr = `jsonb_build_object(${selectParts.join(", ")})`;
|
|
419
|
+
}
|
|
420
|
+
else {
|
|
421
|
+
selectExpr = "to_jsonb(t.*)";
|
|
422
|
+
}
|
|
423
|
+
const whereClause = parsed.where ? ` WHERE ${parsed.where}` : "";
|
|
424
|
+
const orderByClause = parsed.orderBy ? ` ORDER BY ${parsed.orderBy}` : "";
|
|
425
|
+
const limitClause = parsed.limit !== undefined ? ` LIMIT ${String(parsed.limit)}` : "";
|
|
426
|
+
// Support raw JSONB expressions (containing -> or ->> operators) without quoting
|
|
427
|
+
const hasJsonbOperator = parsed.groupBy?.includes("->") ?? false;
|
|
428
|
+
if (parsed.groupBy) {
|
|
429
|
+
// Return all groups with their aggregated items
|
|
430
|
+
// For grouped queries, we use a subquery to apply ordering before aggregation
|
|
431
|
+
const groupExpr = hasJsonbOperator
|
|
432
|
+
? parsed.groupBy
|
|
433
|
+
: `"${parsed.groupBy}"`;
|
|
434
|
+
const groupClause = ` GROUP BY ${groupExpr}`;
|
|
435
|
+
// Apply ordering within each group using ORDER BY inside jsonb_agg
|
|
436
|
+
const aggOrderBy = parsed.orderBy ? ` ORDER BY ${parsed.orderBy}` : "";
|
|
437
|
+
const sql = `SELECT ${groupExpr} as group_key, jsonb_agg(${selectExpr}${aggOrderBy}) as items FROM "${parsed.table}" t${whereClause}${groupClause}${limitClause}`;
|
|
438
|
+
const result = await adapter.executeQuery(sql);
|
|
439
|
+
// Return grouped result with group_key and items per group
|
|
440
|
+
return {
|
|
441
|
+
result: result.rows,
|
|
442
|
+
count: result.rows?.length ?? 0,
|
|
443
|
+
grouped: true,
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
else {
|
|
447
|
+
// For non-grouped, use subquery to apply limit/order before aggregation
|
|
448
|
+
const innerSql = `SELECT * FROM "${parsed.table}" t${whereClause}${orderByClause}${limitClause}`;
|
|
449
|
+
const sql = `SELECT jsonb_agg(${selectExpr.replace(/\bt\./g, "sub.")}) as result FROM (${innerSql}) sub`;
|
|
450
|
+
const result = await adapter.executeQuery(sql);
|
|
451
|
+
const arr = result.rows?.[0]?.["result"] ?? [];
|
|
452
|
+
const count = Array.isArray(arr) ? arr.length : 0;
|
|
453
|
+
const response = { result: arr, count, grouped: false };
|
|
454
|
+
if (count === 0) {
|
|
455
|
+
response.hint = "No rows matched - returns empty array []";
|
|
456
|
+
}
|
|
457
|
+
return response;
|
|
458
|
+
}
|
|
459
|
+
},
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
// Schema for pg_jsonb_object - accepts 'data', 'object', or 'pairs' parameter containing key-value pairs
|
|
463
|
+
// For code mode: pg.jsonb.object({name: "John", age: 30}) - passes through OBJECT_WRAP_MAP → {data: {...}}
|
|
464
|
+
// For MCP tools: {data: {name: "John", age: 30}} or {pairs: {...}} or {object: {...}}
|
|
465
|
+
const JsonbObjectSchema = z
|
|
466
|
+
.object({
|
|
467
|
+
data: z
|
|
468
|
+
.record(z.string(), z.unknown())
|
|
469
|
+
.optional()
|
|
470
|
+
.describe('Key-value pairs to build: {name: "John", age: 30}'),
|
|
471
|
+
object: z
|
|
472
|
+
.record(z.string(), z.unknown())
|
|
473
|
+
.optional()
|
|
474
|
+
.describe("Alias for data"),
|
|
475
|
+
pairs: z
|
|
476
|
+
.record(z.string(), z.unknown())
|
|
477
|
+
.optional()
|
|
478
|
+
.describe("Alias for data (legacy)"),
|
|
479
|
+
})
|
|
480
|
+
.describe("Build a JSONB object from key-value pairs. Use data: {key: value} or object: {key: value}.");
|
|
481
|
+
export function createJsonbObjectTool(adapter) {
|
|
482
|
+
return {
|
|
483
|
+
name: "pg_jsonb_object",
|
|
484
|
+
description: 'Build a JSONB object. Use data: {name: "John", age: 30} or object: {name: "John"}. Returns {object: {...}}.',
|
|
485
|
+
group: "jsonb",
|
|
486
|
+
inputSchema: JsonbObjectSchema,
|
|
487
|
+
annotations: readOnly("JSONB Object"),
|
|
488
|
+
icons: getToolIcons("jsonb", readOnly("JSONB Object")),
|
|
489
|
+
handler: async (params, _context) => {
|
|
490
|
+
// Parse the input
|
|
491
|
+
const parsed = JsonbObjectSchema.parse(params);
|
|
492
|
+
// Support multiple parameter names: data, object, pairs (in priority order)
|
|
493
|
+
const pairs = parsed.data ?? parsed.object ?? parsed.pairs ?? {};
|
|
494
|
+
const entries = Object.entries(pairs);
|
|
495
|
+
// Handle empty pairs - return empty object
|
|
496
|
+
if (entries.length === 0) {
|
|
497
|
+
return { object: {} };
|
|
498
|
+
}
|
|
499
|
+
const args = entries.flatMap(([k, v]) => [k, toJsonString(v)]);
|
|
500
|
+
const placeholders = entries
|
|
501
|
+
.map((_, i) => `$${String(i * 2 + 1)}::text, $${String(i * 2 + 2)}::jsonb`)
|
|
502
|
+
.join(", ");
|
|
503
|
+
const sql = `SELECT jsonb_build_object(${placeholders}) as result`;
|
|
504
|
+
const result = await adapter.executeQuery(sql, args);
|
|
505
|
+
return { object: result.rows?.[0]?.["result"] ?? {} };
|
|
506
|
+
},
|
|
507
|
+
};
|
|
508
|
+
}
|
|
509
|
+
// Schema for pg_jsonb_array - accepts values or elements (alias)
|
|
510
|
+
const JsonbArraySchema = z
|
|
511
|
+
.object({
|
|
512
|
+
values: z.array(z.unknown()).optional().describe("Array elements to build"),
|
|
513
|
+
elements: z
|
|
514
|
+
.array(z.unknown())
|
|
515
|
+
.optional()
|
|
516
|
+
.describe("Array elements (alias for values)"),
|
|
517
|
+
})
|
|
518
|
+
.refine((data) => data.values !== undefined || data.elements !== undefined, {
|
|
519
|
+
message: "Either 'values' or 'elements' must be provided",
|
|
520
|
+
});
|
|
521
|
+
export function createJsonbArrayTool(adapter) {
|
|
522
|
+
return {
|
|
523
|
+
name: "pg_jsonb_array",
|
|
524
|
+
description: "Build a JSONB array from values. Accepts {values: [...]} or {elements: [...]}. Returns {array: [...]}.",
|
|
525
|
+
group: "jsonb",
|
|
526
|
+
inputSchema: JsonbArraySchema,
|
|
527
|
+
annotations: readOnly("JSONB Array"),
|
|
528
|
+
icons: getToolIcons("jsonb", readOnly("JSONB Array")),
|
|
529
|
+
handler: async (params, _context) => {
|
|
530
|
+
const parsed = params;
|
|
531
|
+
// Support both 'values' and 'elements' parameter names
|
|
532
|
+
const values = parsed.values ?? parsed.elements ?? [];
|
|
533
|
+
if (values.length === 0) {
|
|
534
|
+
return { array: [] };
|
|
535
|
+
}
|
|
536
|
+
const placeholders = values
|
|
537
|
+
.map((_, i) => `$${String(i + 1)}::jsonb`)
|
|
538
|
+
.join(", ");
|
|
539
|
+
const sql = `SELECT jsonb_build_array(${placeholders}) as result`;
|
|
540
|
+
const result = await adapter.executeQuery(sql, values.map((v) => toJsonString(v)));
|
|
541
|
+
return { array: result.rows?.[0]?.["result"] };
|
|
542
|
+
},
|
|
543
|
+
};
|
|
544
|
+
}
|
|
545
|
+
export function createJsonbKeysTool(adapter) {
|
|
546
|
+
return {
|
|
547
|
+
name: "pg_jsonb_keys",
|
|
548
|
+
description: "Get all unique keys from a JSONB object column (deduplicated across rows).",
|
|
549
|
+
group: "jsonb",
|
|
550
|
+
inputSchema: z.object({
|
|
551
|
+
table: z.string(),
|
|
552
|
+
column: z.string(),
|
|
553
|
+
where: z.string().optional(),
|
|
554
|
+
}),
|
|
555
|
+
annotations: readOnly("JSONB Keys"),
|
|
556
|
+
icons: getToolIcons("jsonb", readOnly("JSONB Keys")),
|
|
557
|
+
handler: async (params, _context) => {
|
|
558
|
+
const parsed = params;
|
|
559
|
+
const whereClause = parsed.where ? ` WHERE ${parsed.where}` : "";
|
|
560
|
+
const sql = `SELECT DISTINCT jsonb_object_keys("${parsed.column}") as key FROM "${parsed.table}"${whereClause}`;
|
|
561
|
+
try {
|
|
562
|
+
const result = await adapter.executeQuery(sql);
|
|
563
|
+
const keys = result.rows?.map((r) => r["key"]);
|
|
564
|
+
return {
|
|
565
|
+
keys,
|
|
566
|
+
count: keys?.length ?? 0,
|
|
567
|
+
hint: "Returns unique keys deduplicated across all matching rows",
|
|
568
|
+
};
|
|
569
|
+
}
|
|
570
|
+
catch (error) {
|
|
571
|
+
// Improve error for array columns
|
|
572
|
+
if (error instanceof Error &&
|
|
573
|
+
error.message.includes("cannot call jsonb_object_keys")) {
|
|
574
|
+
throw new Error(`pg_jsonb_keys requires object columns. For array columns, use pg_jsonb_normalize with mode: 'array'.`);
|
|
575
|
+
}
|
|
576
|
+
throw error;
|
|
577
|
+
}
|
|
578
|
+
},
|
|
579
|
+
};
|
|
580
|
+
}
|
|
581
|
+
export function createJsonbStripNullsTool(adapter) {
|
|
582
|
+
return {
|
|
583
|
+
name: "pg_jsonb_strip_nulls",
|
|
584
|
+
description: "Remove null values from a JSONB column. Use preview=true to see changes without modifying data.",
|
|
585
|
+
group: "jsonb",
|
|
586
|
+
inputSchema: z.object({
|
|
587
|
+
table: z.string(),
|
|
588
|
+
column: z.string(),
|
|
589
|
+
where: z.string(),
|
|
590
|
+
preview: z
|
|
591
|
+
.boolean()
|
|
592
|
+
.optional()
|
|
593
|
+
.describe("Preview what would be stripped without modifying data"),
|
|
594
|
+
}),
|
|
595
|
+
annotations: write("JSONB Strip Nulls"),
|
|
596
|
+
icons: getToolIcons("jsonb", write("JSONB Strip Nulls")),
|
|
597
|
+
handler: async (params, _context) => {
|
|
598
|
+
const parsed = params;
|
|
599
|
+
// Validate required 'where' parameter before SQL execution
|
|
600
|
+
if (!parsed.where || parsed.where.trim() === "") {
|
|
601
|
+
throw new Error('pg_jsonb_strip_nulls requires a WHERE clause to identify rows to update. Example: where: "id = 1"');
|
|
602
|
+
}
|
|
603
|
+
if (parsed.preview === true) {
|
|
604
|
+
// Preview mode - show before/after without modifying
|
|
605
|
+
const previewSql = `SELECT "${parsed.column}" as before, jsonb_strip_nulls("${parsed.column}") as after FROM "${parsed.table}" WHERE ${parsed.where}`;
|
|
606
|
+
const result = await adapter.executeQuery(previewSql);
|
|
607
|
+
return {
|
|
608
|
+
preview: true,
|
|
609
|
+
rows: result.rows,
|
|
610
|
+
count: result.rows?.length ?? 0,
|
|
611
|
+
hint: "No changes made - preview only",
|
|
612
|
+
};
|
|
613
|
+
}
|
|
614
|
+
const sql = `UPDATE "${parsed.table}" SET "${parsed.column}" = jsonb_strip_nulls("${parsed.column}") WHERE ${parsed.where}`;
|
|
615
|
+
const result = await adapter.executeQuery(sql);
|
|
616
|
+
return { rowsAffected: result.rowsAffected };
|
|
617
|
+
},
|
|
618
|
+
};
|
|
619
|
+
}
|
|
620
|
+
export function createJsonbTypeofTool(adapter) {
|
|
621
|
+
return {
|
|
622
|
+
name: "pg_jsonb_typeof",
|
|
623
|
+
description: "Get JSONB type at path. Uses dot-notation (a.b.c), not JSONPath ($). Response includes columnNull to distinguish NULL columns.",
|
|
624
|
+
group: "jsonb",
|
|
625
|
+
inputSchema: z.object({
|
|
626
|
+
table: z.string(),
|
|
627
|
+
column: z.string(),
|
|
628
|
+
path: z
|
|
629
|
+
.union([z.string(), z.array(z.union([z.string(), z.number()]))])
|
|
630
|
+
.optional()
|
|
631
|
+
.describe("Path to check type of nested value (string or array format)"),
|
|
632
|
+
where: z.string().optional(),
|
|
633
|
+
}),
|
|
634
|
+
annotations: readOnly("JSONB Typeof"),
|
|
635
|
+
icons: getToolIcons("jsonb", readOnly("JSONB Typeof")),
|
|
636
|
+
handler: async (params, _context) => {
|
|
637
|
+
const parsed = params;
|
|
638
|
+
const whereClause = parsed.where ? ` WHERE ${parsed.where}` : "";
|
|
639
|
+
// Normalize path to array format (accepts both string and array)
|
|
640
|
+
const pathArray = parsed.path !== undefined
|
|
641
|
+
? normalizePathToArray(parsed.path)
|
|
642
|
+
: undefined;
|
|
643
|
+
const pathExpr = pathArray !== undefined ? ` #> $1` : "";
|
|
644
|
+
// Include column IS NULL check to disambiguate NULL column vs null path result
|
|
645
|
+
const sql = `SELECT jsonb_typeof("${parsed.column}"${pathExpr}) as type, ("${parsed.column}" IS NULL) as column_null FROM "${parsed.table}"${whereClause}`;
|
|
646
|
+
const queryParams = pathArray ? [pathArray] : [];
|
|
647
|
+
const result = await adapter.executeQuery(sql, queryParams);
|
|
648
|
+
const types = result.rows?.map((r) => r["type"]);
|
|
649
|
+
const columnNull = result.rows?.some((r) => r["column_null"] === true) ?? false;
|
|
650
|
+
return { types, count: types?.length ?? 0, columnNull };
|
|
651
|
+
},
|
|
652
|
+
};
|
|
653
|
+
}
|
|
654
|
+
//# sourceMappingURL=basic.js.map
|