@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,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL pgcrypto Extension Tools
|
|
3
|
+
* 9 tools total.
|
|
4
|
+
*/
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { readOnly, write } from "../../../utils/annotations.js";
|
|
7
|
+
import { getToolIcons } from "../../../utils/icons.js";
|
|
8
|
+
import { PgcryptoHashSchema, PgcryptoHmacSchema, PgcryptoEncryptSchema, PgcryptoEncryptSchemaBase, PgcryptoDecryptSchema, PgcryptoDecryptSchemaBase, PgcryptoRandomBytesSchema, PgcryptoGenSaltSchema, PgcryptoCryptSchema, } from "../schemas/index.js";
|
|
9
|
+
export function getPgcryptoTools(adapter) {
|
|
10
|
+
return [
|
|
11
|
+
createPgcryptoExtensionTool(adapter),
|
|
12
|
+
createPgcryptoHashTool(adapter),
|
|
13
|
+
createPgcryptoHmacTool(adapter),
|
|
14
|
+
createPgcryptoEncryptTool(adapter),
|
|
15
|
+
createPgcryptoDecryptTool(adapter),
|
|
16
|
+
createPgcryptoGenRandomUuidTool(adapter),
|
|
17
|
+
createPgcryptoGenRandomBytesTool(adapter),
|
|
18
|
+
createPgcryptoGenSaltTool(adapter),
|
|
19
|
+
createPgcryptoCryptTool(adapter),
|
|
20
|
+
];
|
|
21
|
+
}
|
|
22
|
+
function createPgcryptoExtensionTool(adapter) {
|
|
23
|
+
return {
|
|
24
|
+
name: "pg_pgcrypto_create_extension",
|
|
25
|
+
description: "Enable the pgcrypto extension for cryptographic functions.",
|
|
26
|
+
group: "pgcrypto",
|
|
27
|
+
inputSchema: z.object({}),
|
|
28
|
+
annotations: write("Create Pgcrypto Extension"),
|
|
29
|
+
icons: getToolIcons("pgcrypto", write("Create Pgcrypto Extension")),
|
|
30
|
+
handler: async (_params, _context) => {
|
|
31
|
+
await adapter.executeQuery("CREATE EXTENSION IF NOT EXISTS pgcrypto");
|
|
32
|
+
return { success: true, message: "pgcrypto extension enabled" };
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function createPgcryptoHashTool(adapter) {
|
|
37
|
+
return {
|
|
38
|
+
name: "pg_pgcrypto_hash",
|
|
39
|
+
description: "Hash data using various algorithms (SHA-256, SHA-512, MD5, etc.).",
|
|
40
|
+
group: "pgcrypto",
|
|
41
|
+
inputSchema: PgcryptoHashSchema,
|
|
42
|
+
annotations: readOnly("Hash Data"),
|
|
43
|
+
icons: getToolIcons("pgcrypto", readOnly("Hash Data")),
|
|
44
|
+
handler: async (params, _context) => {
|
|
45
|
+
const { data, algorithm, encoding } = PgcryptoHashSchema.parse(params);
|
|
46
|
+
const enc = encoding ?? "hex";
|
|
47
|
+
const encodeFunc = enc === "base64"
|
|
48
|
+
? "encode(digest($1, $2), 'base64')"
|
|
49
|
+
: "encode(digest($1, $2), 'hex')";
|
|
50
|
+
const result = await adapter.executeQuery(`SELECT ${encodeFunc} as hash`, [data, algorithm]);
|
|
51
|
+
return {
|
|
52
|
+
success: true,
|
|
53
|
+
algorithm,
|
|
54
|
+
encoding: enc,
|
|
55
|
+
hash: result.rows?.[0]?.["hash"],
|
|
56
|
+
inputLength: data.length,
|
|
57
|
+
};
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function createPgcryptoHmacTool(adapter) {
|
|
62
|
+
return {
|
|
63
|
+
name: "pg_pgcrypto_hmac",
|
|
64
|
+
description: "Compute HMAC for data with a secret key.",
|
|
65
|
+
group: "pgcrypto",
|
|
66
|
+
inputSchema: PgcryptoHmacSchema,
|
|
67
|
+
annotations: readOnly("HMAC"),
|
|
68
|
+
icons: getToolIcons("pgcrypto", readOnly("HMAC")),
|
|
69
|
+
handler: async (params, _context) => {
|
|
70
|
+
const { data, key, algorithm, encoding } = PgcryptoHmacSchema.parse(params);
|
|
71
|
+
const enc = encoding ?? "hex";
|
|
72
|
+
const encodeFunc = enc === "base64"
|
|
73
|
+
? "encode(hmac($1, $2, $3), 'base64')"
|
|
74
|
+
: "encode(hmac($1, $2, $3), 'hex')";
|
|
75
|
+
const result = await adapter.executeQuery(`SELECT ${encodeFunc} as hmac`, [data, key, algorithm]);
|
|
76
|
+
return {
|
|
77
|
+
success: true,
|
|
78
|
+
algorithm,
|
|
79
|
+
encoding: enc,
|
|
80
|
+
hmac: result.rows?.[0]?.["hmac"],
|
|
81
|
+
};
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function createPgcryptoEncryptTool(adapter) {
|
|
86
|
+
return {
|
|
87
|
+
name: "pg_pgcrypto_encrypt",
|
|
88
|
+
description: "Encrypt data using PGP symmetric encryption.",
|
|
89
|
+
group: "pgcrypto",
|
|
90
|
+
// Use base schema for MCP so properties are properly exposed
|
|
91
|
+
inputSchema: PgcryptoEncryptSchemaBase,
|
|
92
|
+
annotations: readOnly("Encrypt Data"),
|
|
93
|
+
icons: getToolIcons("pgcrypto", readOnly("Encrypt Data")),
|
|
94
|
+
handler: async (params, _context) => {
|
|
95
|
+
// Use transformed schema with alias resolution for validation
|
|
96
|
+
const { data, password, options } = PgcryptoEncryptSchema.parse(params);
|
|
97
|
+
const sql = options !== undefined
|
|
98
|
+
? `SELECT encode(pgp_sym_encrypt($1, $2, $3), 'base64') as encrypted`
|
|
99
|
+
: `SELECT encode(pgp_sym_encrypt($1, $2), 'base64') as encrypted`;
|
|
100
|
+
const queryParams = options !== undefined ? [data, password, options] : [data, password];
|
|
101
|
+
const result = await adapter.executeQuery(sql, queryParams);
|
|
102
|
+
return {
|
|
103
|
+
success: true,
|
|
104
|
+
encrypted: result.rows?.[0]?.["encrypted"],
|
|
105
|
+
encoding: "base64",
|
|
106
|
+
};
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function createPgcryptoDecryptTool(adapter) {
|
|
111
|
+
return {
|
|
112
|
+
name: "pg_pgcrypto_decrypt",
|
|
113
|
+
description: "Decrypt data that was encrypted with pg_pgcrypto_encrypt.",
|
|
114
|
+
group: "pgcrypto",
|
|
115
|
+
// Use base schema for MCP so properties are properly exposed
|
|
116
|
+
inputSchema: PgcryptoDecryptSchemaBase,
|
|
117
|
+
annotations: readOnly("Decrypt Data"),
|
|
118
|
+
icons: getToolIcons("pgcrypto", readOnly("Decrypt Data")),
|
|
119
|
+
handler: async (params, _context) => {
|
|
120
|
+
// Use transformed schema with alias resolution for validation
|
|
121
|
+
const { encryptedData, password } = PgcryptoDecryptSchema.parse(params);
|
|
122
|
+
const result = await adapter.executeQuery(`SELECT pgp_sym_decrypt(decode($1, 'base64'), $2) as decrypted`, [encryptedData, password]);
|
|
123
|
+
const decrypted = result.rows?.[0]?.["decrypted"];
|
|
124
|
+
// Throw error for decryption failure (wrong password or corrupted data)
|
|
125
|
+
if (decrypted === undefined || decrypted === null) {
|
|
126
|
+
throw new Error("Decryption failed - wrong password or corrupted data");
|
|
127
|
+
}
|
|
128
|
+
return { success: true, decrypted: decrypted, verified: true };
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
function createPgcryptoGenRandomUuidTool(adapter) {
|
|
133
|
+
// Schema with proper validation
|
|
134
|
+
const GenUuidSchema = z
|
|
135
|
+
.object({
|
|
136
|
+
count: z
|
|
137
|
+
.number()
|
|
138
|
+
.min(1)
|
|
139
|
+
.max(100)
|
|
140
|
+
.optional()
|
|
141
|
+
.describe("Number of UUIDs to generate (default: 1, max: 100)"),
|
|
142
|
+
})
|
|
143
|
+
.default({});
|
|
144
|
+
return {
|
|
145
|
+
name: "pg_pgcrypto_gen_random_uuid",
|
|
146
|
+
description: "Generate a cryptographically secure UUID v4.",
|
|
147
|
+
group: "pgcrypto",
|
|
148
|
+
inputSchema: GenUuidSchema,
|
|
149
|
+
annotations: readOnly("Generate UUID"),
|
|
150
|
+
icons: getToolIcons("pgcrypto", readOnly("Generate UUID")),
|
|
151
|
+
handler: async (params, _context) => {
|
|
152
|
+
// Parse via Zod to enforce count validation (max 100)
|
|
153
|
+
const parsed = GenUuidSchema.parse(params);
|
|
154
|
+
const generateCount = parsed.count ?? 1;
|
|
155
|
+
const result = await adapter.executeQuery(`SELECT gen_random_uuid()::text as uuid FROM generate_series(1, $1)`, [generateCount]);
|
|
156
|
+
const uuids = (result.rows ?? []).map((r) => r["uuid"]);
|
|
157
|
+
// Add convenience 'uuid' property for single UUID requests
|
|
158
|
+
const response = {
|
|
159
|
+
success: true,
|
|
160
|
+
uuids,
|
|
161
|
+
count: uuids.length,
|
|
162
|
+
};
|
|
163
|
+
if (uuids.length === 1) {
|
|
164
|
+
response["uuid"] = uuids[0];
|
|
165
|
+
}
|
|
166
|
+
return response;
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
function createPgcryptoGenRandomBytesTool(adapter) {
|
|
171
|
+
return {
|
|
172
|
+
name: "pg_pgcrypto_gen_random_bytes",
|
|
173
|
+
description: "Generate cryptographically secure random bytes.",
|
|
174
|
+
group: "pgcrypto",
|
|
175
|
+
inputSchema: PgcryptoRandomBytesSchema,
|
|
176
|
+
annotations: readOnly("Generate Random Bytes"),
|
|
177
|
+
icons: getToolIcons("pgcrypto", readOnly("Generate Random Bytes")),
|
|
178
|
+
handler: async (params, _context) => {
|
|
179
|
+
const { length, encoding } = PgcryptoRandomBytesSchema.parse(params);
|
|
180
|
+
const enc = encoding ?? "hex";
|
|
181
|
+
const encodeFormat = enc === "base64" ? "base64" : "hex";
|
|
182
|
+
const result = await adapter.executeQuery(`SELECT encode(gen_random_bytes($1), $2) as random_bytes`, [length, encodeFormat]);
|
|
183
|
+
return {
|
|
184
|
+
success: true,
|
|
185
|
+
randomBytes: result.rows?.[0]?.["random_bytes"],
|
|
186
|
+
length,
|
|
187
|
+
encoding: enc,
|
|
188
|
+
};
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
function createPgcryptoGenSaltTool(adapter) {
|
|
193
|
+
return {
|
|
194
|
+
name: "pg_pgcrypto_gen_salt",
|
|
195
|
+
description: "Generate a salt for use with crypt() password hashing.",
|
|
196
|
+
group: "pgcrypto",
|
|
197
|
+
inputSchema: PgcryptoGenSaltSchema,
|
|
198
|
+
annotations: readOnly("Generate Salt"),
|
|
199
|
+
icons: getToolIcons("pgcrypto", readOnly("Generate Salt")),
|
|
200
|
+
handler: async (params, _context) => {
|
|
201
|
+
const { type, iterations } = PgcryptoGenSaltSchema.parse(params);
|
|
202
|
+
const result = iterations !== undefined && (type === "bf" || type === "xdes")
|
|
203
|
+
? await adapter.executeQuery(`SELECT gen_salt($1, $2) as salt`, [
|
|
204
|
+
type,
|
|
205
|
+
iterations,
|
|
206
|
+
])
|
|
207
|
+
: await adapter.executeQuery(`SELECT gen_salt($1) as salt`, [type]);
|
|
208
|
+
return {
|
|
209
|
+
success: true,
|
|
210
|
+
salt: result.rows?.[0]?.["salt"],
|
|
211
|
+
type,
|
|
212
|
+
};
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
function createPgcryptoCryptTool(adapter) {
|
|
217
|
+
return {
|
|
218
|
+
name: "pg_pgcrypto_crypt",
|
|
219
|
+
description: "Hash a password using crypt() with a salt from gen_salt().",
|
|
220
|
+
group: "pgcrypto",
|
|
221
|
+
inputSchema: PgcryptoCryptSchema,
|
|
222
|
+
annotations: readOnly("Crypt Password"),
|
|
223
|
+
icons: getToolIcons("pgcrypto", readOnly("Crypt Password")),
|
|
224
|
+
handler: async (params, _context) => {
|
|
225
|
+
const { password, salt } = PgcryptoCryptSchema.parse(params);
|
|
226
|
+
const result = await adapter.executeQuery(`SELECT crypt($1, $2) as hash`, [password, salt]);
|
|
227
|
+
const hash = result.rows?.[0]?.["hash"];
|
|
228
|
+
const algorithm = salt.startsWith("$2a$") || salt.startsWith("$2b$")
|
|
229
|
+
? "bcrypt"
|
|
230
|
+
: salt.startsWith("$1$")
|
|
231
|
+
? "md5"
|
|
232
|
+
: salt.startsWith("_")
|
|
233
|
+
? "xdes"
|
|
234
|
+
: "des";
|
|
235
|
+
return { success: true, hash, algorithm };
|
|
236
|
+
},
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=pgcrypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pgcrypto.js","sourceRoot":"","sources":["../../../../src/adapters/postgresql/tools/pgcrypto.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL PostGIS Extension Tools - Advanced Operations
|
|
3
|
+
*
|
|
4
|
+
* Advanced spatial tools: geocode, geo_transform, geo_index_optimize, geo_cluster.
|
|
5
|
+
*/
|
|
6
|
+
import type { PostgresAdapter } from "../../PostgresAdapter.js";
|
|
7
|
+
import type { ToolDefinition } from "../../../../types/index.js";
|
|
8
|
+
export declare function createGeocodeTool(adapter: PostgresAdapter): ToolDefinition;
|
|
9
|
+
/**
|
|
10
|
+
* Transform geometry between coordinate systems
|
|
11
|
+
*/
|
|
12
|
+
export declare function createGeoTransformTool(adapter: PostgresAdapter): ToolDefinition;
|
|
13
|
+
/**
|
|
14
|
+
* Analyze and optimize spatial indexes
|
|
15
|
+
*/
|
|
16
|
+
export declare function createGeoIndexOptimizeTool(adapter: PostgresAdapter): ToolDefinition;
|
|
17
|
+
/**
|
|
18
|
+
* Spatial clustering using ST_ClusterDBSCAN or ST_ClusterKMeans
|
|
19
|
+
*/
|
|
20
|
+
export declare function createGeoClusterTool(adapter: PostgresAdapter): ToolDefinition;
|
|
21
|
+
//# sourceMappingURL=advanced.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advanced.d.ts","sourceRoot":"","sources":["../../../../../src/adapters/postgresql/tools/postgis/advanced.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EACV,cAAc,EAEf,MAAM,4BAA4B,CAAC;AAapC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,CAoC1E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,eAAe,GACvB,cAAc,CA4EhB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,eAAe,GACvB,cAAc,CAwIhB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,cAAc,CAgM7E"}
|
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL PostGIS Extension Tools - Advanced Operations
|
|
3
|
+
*
|
|
4
|
+
* Advanced spatial tools: geocode, geo_transform, geo_index_optimize, geo_cluster.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
import { readOnly } from "../../../../utils/annotations.js";
|
|
8
|
+
import { getToolIcons } from "../../../../utils/icons.js";
|
|
9
|
+
import { GeocodeSchemaBase, GeocodeSchema, GeoTransformSchemaBase, GeoTransformSchema, GeoClusterSchemaBase, GeoClusterSchema, } from "../../schemas/index.js";
|
|
10
|
+
export function createGeocodeTool(adapter) {
|
|
11
|
+
return {
|
|
12
|
+
name: "pg_geocode",
|
|
13
|
+
description: "Create a point geometry from latitude/longitude coordinates. The SRID parameter sets output metadata only; input coordinates are always WGS84 lat/lng.",
|
|
14
|
+
group: "postgis",
|
|
15
|
+
inputSchema: GeocodeSchemaBase, // Base schema for MCP visibility
|
|
16
|
+
annotations: readOnly("Geocode"),
|
|
17
|
+
icons: getToolIcons("postgis", readOnly("Geocode")),
|
|
18
|
+
handler: async (params, _context) => {
|
|
19
|
+
const parsed = GeocodeSchema.parse(params ?? {});
|
|
20
|
+
const srid = parsed.srid ?? 4326;
|
|
21
|
+
const sql = `SELECT
|
|
22
|
+
ST_AsGeoJSON(ST_SetSRID(ST_MakePoint($1, $2), $3)) as geojson,
|
|
23
|
+
ST_AsText(ST_SetSRID(ST_MakePoint($1, $2), $3)) as wkt`;
|
|
24
|
+
const result = await adapter.executeQuery(sql, [
|
|
25
|
+
parsed.lng,
|
|
26
|
+
parsed.lat,
|
|
27
|
+
srid,
|
|
28
|
+
]);
|
|
29
|
+
// Add note about SRID for non-4326 cases
|
|
30
|
+
const row = result.rows?.[0];
|
|
31
|
+
if (row === undefined) {
|
|
32
|
+
return {};
|
|
33
|
+
}
|
|
34
|
+
const response = { ...row };
|
|
35
|
+
if (srid !== 4326) {
|
|
36
|
+
response["note"] =
|
|
37
|
+
`Coordinates are WGS84 lat/lng with SRID ${String(srid)} metadata. Use pg_geo_transform to convert to target CRS.`;
|
|
38
|
+
}
|
|
39
|
+
return response;
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Transform geometry between coordinate systems
|
|
45
|
+
*/
|
|
46
|
+
export function createGeoTransformTool(adapter) {
|
|
47
|
+
return {
|
|
48
|
+
name: "pg_geo_transform",
|
|
49
|
+
description: "Transform geometry from one spatial reference system (SRID) to another.",
|
|
50
|
+
group: "postgis",
|
|
51
|
+
inputSchema: GeoTransformSchemaBase, // Base schema for MCP visibility
|
|
52
|
+
annotations: readOnly("Transform Geometry"),
|
|
53
|
+
icons: getToolIcons("postgis", readOnly("Transform Geometry")),
|
|
54
|
+
handler: async (params, _context) => {
|
|
55
|
+
const parsed = GeoTransformSchema.parse(params ?? {});
|
|
56
|
+
const schemaName = parsed.schema ?? "public";
|
|
57
|
+
const qualifiedTable = schemaName !== "public"
|
|
58
|
+
? `"${schemaName}"."${parsed.table}"`
|
|
59
|
+
: `"${parsed.table}"`;
|
|
60
|
+
const columnName = `"${parsed.column}"`;
|
|
61
|
+
const whereClause = parsed.where !== undefined ? `WHERE ${parsed.where}` : "";
|
|
62
|
+
// Default limit of 50 to prevent large payloads, use limit: 0 for all
|
|
63
|
+
const effectiveLimit = parsed.limit ?? 50;
|
|
64
|
+
const limitClause = effectiveLimit > 0 ? `LIMIT ${String(effectiveLimit)}` : "";
|
|
65
|
+
// Get non-geometry columns to avoid returning raw WKB
|
|
66
|
+
const colQuery = `
|
|
67
|
+
SELECT column_name FROM information_schema.columns
|
|
68
|
+
WHERE table_schema = $1 AND table_name = $2
|
|
69
|
+
AND udt_name NOT IN ('geometry', 'geography')
|
|
70
|
+
ORDER BY ordinal_position
|
|
71
|
+
`;
|
|
72
|
+
const colResult = await adapter.executeQuery(colQuery, [
|
|
73
|
+
schemaName,
|
|
74
|
+
parsed.table,
|
|
75
|
+
]);
|
|
76
|
+
const nonGeomCols = (colResult.rows ?? [])
|
|
77
|
+
.map((row) => `"${String(row["column_name"])}"`)
|
|
78
|
+
.join(", ");
|
|
79
|
+
// Select non-geometry columns + transformed geometry representations
|
|
80
|
+
const selectCols = nonGeomCols.length > 0
|
|
81
|
+
? `${nonGeomCols}, ST_AsGeoJSON(ST_Transform(ST_SetSRID(${columnName}, ${String(parsed.fromSrid)}), ${String(parsed.toSrid)})) as transformed_geojson, ST_AsText(ST_Transform(ST_SetSRID(${columnName}, ${String(parsed.fromSrid)}), ${String(parsed.toSrid)})) as transformed_wkt, ${String(parsed.toSrid)} as output_srid`
|
|
82
|
+
: `ST_AsGeoJSON(ST_Transform(ST_SetSRID(${columnName}, ${String(parsed.fromSrid)}), ${String(parsed.toSrid)})) as transformed_geojson, ST_AsText(ST_Transform(ST_SetSRID(${columnName}, ${String(parsed.fromSrid)}), ${String(parsed.toSrid)})) as transformed_wkt, ${String(parsed.toSrid)} as output_srid`;
|
|
83
|
+
const sql = `SELECT ${selectCols} FROM ${qualifiedTable} ${whereClause} ${limitClause}`;
|
|
84
|
+
const result = await adapter.executeQuery(sql);
|
|
85
|
+
// Build response with truncation indicators if default limit was applied
|
|
86
|
+
const response = {
|
|
87
|
+
results: result.rows,
|
|
88
|
+
count: result.rows?.length ?? 0,
|
|
89
|
+
fromSrid: parsed.fromSrid,
|
|
90
|
+
toSrid: parsed.toSrid,
|
|
91
|
+
};
|
|
92
|
+
// When using default limit, check if more rows exist
|
|
93
|
+
if (parsed.limit === undefined && effectiveLimit > 0) {
|
|
94
|
+
const countSql = `SELECT COUNT(*) as cnt FROM ${qualifiedTable} ${whereClause}`;
|
|
95
|
+
const countResult = await adapter.executeQuery(countSql);
|
|
96
|
+
const totalCount = Number(countResult.rows?.[0]?.["cnt"] ?? 0);
|
|
97
|
+
if (totalCount > effectiveLimit) {
|
|
98
|
+
response["truncated"] = true;
|
|
99
|
+
response["totalCount"] = totalCount;
|
|
100
|
+
response["limit"] = effectiveLimit;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return response;
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Analyze and optimize spatial indexes
|
|
109
|
+
*/
|
|
110
|
+
export function createGeoIndexOptimizeTool(adapter) {
|
|
111
|
+
return {
|
|
112
|
+
name: "pg_geo_index_optimize",
|
|
113
|
+
description: "Analyze spatial indexes and provide optimization recommendations.",
|
|
114
|
+
group: "postgis",
|
|
115
|
+
inputSchema: z.object({
|
|
116
|
+
table: z
|
|
117
|
+
.string()
|
|
118
|
+
.optional()
|
|
119
|
+
.describe("Specific table to analyze (or all spatial tables)"),
|
|
120
|
+
schema: z.string().optional().describe("Schema name"),
|
|
121
|
+
}),
|
|
122
|
+
annotations: readOnly("Geo Index Optimize"),
|
|
123
|
+
icons: getToolIcons("postgis", readOnly("Geo Index Optimize")),
|
|
124
|
+
handler: async (params, _context) => {
|
|
125
|
+
const parsed = params;
|
|
126
|
+
const schemaName = parsed.schema ?? "public";
|
|
127
|
+
const indexQuery = `
|
|
128
|
+
SELECT
|
|
129
|
+
c.relname as table_name,
|
|
130
|
+
i.relname as index_name,
|
|
131
|
+
a.attname as column_name,
|
|
132
|
+
pg_size_pretty(pg_relation_size(i.oid)) as index_size,
|
|
133
|
+
pg_relation_size(i.oid) as index_size_bytes,
|
|
134
|
+
idx_scan as index_scans,
|
|
135
|
+
idx_tup_read as tuples_read,
|
|
136
|
+
idx_tup_fetch as tuples_fetched
|
|
137
|
+
FROM pg_index x
|
|
138
|
+
JOIN pg_class c ON c.oid = x.indrelid
|
|
139
|
+
JOIN pg_class i ON i.oid = x.indexrelid
|
|
140
|
+
JOIN pg_attribute a ON a.attrelid = c.oid AND a.attnum = ANY(x.indkey)
|
|
141
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
142
|
+
JOIN pg_type t ON t.oid = a.atttypid
|
|
143
|
+
LEFT JOIN pg_stat_user_indexes s ON s.indexrelid = i.oid
|
|
144
|
+
WHERE n.nspname = $1
|
|
145
|
+
AND (pg_get_indexdef(i.oid) LIKE '%gist%' OR pg_get_indexdef(i.oid) LIKE '%spgist%')
|
|
146
|
+
AND t.typname IN ('geometry', 'geography')
|
|
147
|
+
${parsed.table !== undefined ? `AND c.relname = '${parsed.table}'` : ""}
|
|
148
|
+
ORDER BY index_size_bytes DESC
|
|
149
|
+
`;
|
|
150
|
+
const [indexes, tableStats] = await Promise.all([
|
|
151
|
+
adapter.executeQuery(indexQuery, [schemaName]),
|
|
152
|
+
adapter.executeQuery(`
|
|
153
|
+
SELECT
|
|
154
|
+
c.relname as table_name,
|
|
155
|
+
n_live_tup as row_count,
|
|
156
|
+
pg_size_pretty(pg_table_size(c.oid)) as table_size
|
|
157
|
+
FROM pg_stat_user_tables t
|
|
158
|
+
JOIN pg_class c ON c.relname = t.relname
|
|
159
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
160
|
+
WHERE n.nspname = $1
|
|
161
|
+
${parsed.table !== undefined ? `AND c.relname = '${parsed.table}'` : ""}
|
|
162
|
+
AND EXISTS (
|
|
163
|
+
SELECT 1 FROM information_schema.columns ic
|
|
164
|
+
WHERE ic.table_schema = n.nspname
|
|
165
|
+
AND ic.table_name = c.relname
|
|
166
|
+
AND ic.udt_name IN ('geometry', 'geography')
|
|
167
|
+
)
|
|
168
|
+
`, [schemaName]),
|
|
169
|
+
]);
|
|
170
|
+
const recommendations = [];
|
|
171
|
+
for (const idx of indexes.rows ?? []) {
|
|
172
|
+
const scans = Number(idx["index_scans"] ?? 0);
|
|
173
|
+
const sizeBytes = Number(idx["index_size_bytes"] ?? 0);
|
|
174
|
+
if (scans === 0 && sizeBytes > 1024 * 1024) {
|
|
175
|
+
recommendations.push(`Index "${String(idx["index_name"])}" on ${String(idx["table_name"])} is unused but takes ${String(idx["index_size"])}. Consider dropping it.`);
|
|
176
|
+
}
|
|
177
|
+
if (scans > 0 && sizeBytes > 100 * 1024 * 1024) {
|
|
178
|
+
recommendations.push(`Large spatial index "${String(idx["index_name"])}" (${String(idx["index_size"])}). Consider partitioning the table for better performance.`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
for (const table of tableStats.rows ?? []) {
|
|
182
|
+
const rowCount = Number(table["row_count"] ?? 0);
|
|
183
|
+
const hasIndex = (indexes.rows ?? []).some((idx) => idx["table_name"] === table["table_name"]);
|
|
184
|
+
if (rowCount > 10000 && !hasIndex) {
|
|
185
|
+
recommendations.push(`Table "${String(table["table_name"])}" has ${String(rowCount)} rows but no spatial index. Consider adding a GiST index.`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// Warn if table filter specified but no results found
|
|
189
|
+
if (parsed.table !== undefined &&
|
|
190
|
+
(indexes.rows?.length ?? 0) === 0 &&
|
|
191
|
+
(tableStats.rows?.length ?? 0) === 0) {
|
|
192
|
+
return {
|
|
193
|
+
warning: `Table "${parsed.table}" not found in schema "${schemaName}" or has no spatial columns/indexes.`,
|
|
194
|
+
table: parsed.table,
|
|
195
|
+
schema: schemaName,
|
|
196
|
+
spatialIndexes: [],
|
|
197
|
+
tableStats: [],
|
|
198
|
+
recommendations: [
|
|
199
|
+
`Verify table "${parsed.table}" exists and has geometry/geography columns.`,
|
|
200
|
+
],
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
spatialIndexes: indexes.rows,
|
|
205
|
+
tableStats: tableStats.rows,
|
|
206
|
+
recommendations: recommendations.length > 0
|
|
207
|
+
? recommendations
|
|
208
|
+
: (indexes.rows?.length ?? 0) === 0
|
|
209
|
+
? [
|
|
210
|
+
"No spatial indexes found in this schema. Consider adding GiST indexes for spatial columns.",
|
|
211
|
+
]
|
|
212
|
+
: ["All spatial indexes appear optimized"],
|
|
213
|
+
tips: [
|
|
214
|
+
"Use GiST indexes for general spatial queries",
|
|
215
|
+
"Consider SP-GiST for point-only data",
|
|
216
|
+
"CLUSTER table by spatial index for range queries",
|
|
217
|
+
"Use BRIN indexes for very large, sorted spatial data",
|
|
218
|
+
],
|
|
219
|
+
};
|
|
220
|
+
},
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Spatial clustering using ST_ClusterDBSCAN or ST_ClusterKMeans
|
|
225
|
+
*/
|
|
226
|
+
export function createGeoClusterTool(adapter) {
|
|
227
|
+
return {
|
|
228
|
+
name: "pg_geo_cluster",
|
|
229
|
+
description: "Perform spatial clustering using DBSCAN or K-Means. DBSCAN defaults: eps=100m, minPoints=3. K-Means default: numClusters=5 (provide explicit value for best results).",
|
|
230
|
+
group: "postgis",
|
|
231
|
+
inputSchema: GeoClusterSchemaBase, // Base schema for MCP visibility
|
|
232
|
+
annotations: readOnly("Geo Cluster"),
|
|
233
|
+
icons: getToolIcons("postgis", readOnly("Geo Cluster")),
|
|
234
|
+
handler: async (params, _context) => {
|
|
235
|
+
const parsed = GeoClusterSchema.parse(params ?? {});
|
|
236
|
+
const method = parsed.method ?? "dbscan";
|
|
237
|
+
const schemaName = parsed.schema ?? "public";
|
|
238
|
+
const qualifiedTable = schemaName !== "public"
|
|
239
|
+
? `"${schemaName}"."${parsed.table}"`
|
|
240
|
+
: `"${parsed.table}"`;
|
|
241
|
+
const whereClause = parsed.where !== undefined ? `WHERE ${parsed.where}` : "";
|
|
242
|
+
const limitClause = parsed.limit !== undefined && parsed.limit > 0
|
|
243
|
+
? `LIMIT ${String(parsed.limit)}`
|
|
244
|
+
: "";
|
|
245
|
+
// Track warning if K > N
|
|
246
|
+
let warning;
|
|
247
|
+
// For K-Means, validate and adjust numClusters
|
|
248
|
+
let effectiveNumClusters = parsed.numClusters ?? 5;
|
|
249
|
+
let rowCount = 0;
|
|
250
|
+
if (method === "kmeans") {
|
|
251
|
+
// Validate numClusters > 0
|
|
252
|
+
if (effectiveNumClusters <= 0) {
|
|
253
|
+
return {
|
|
254
|
+
error: `numClusters must be greater than 0 (received: ${String(effectiveNumClusters)}).`,
|
|
255
|
+
method,
|
|
256
|
+
table: parsed.table,
|
|
257
|
+
numClusters: effectiveNumClusters,
|
|
258
|
+
suggestion: "Provide a positive integer for numClusters (e.g., numClusters: 3)",
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
const countResult = await adapter.executeQuery(`SELECT COUNT(*) as cnt FROM ${qualifiedTable} ${whereClause}`);
|
|
262
|
+
rowCount = Number(countResult.rows?.[0]?.["cnt"] ?? 0);
|
|
263
|
+
if (rowCount === 0) {
|
|
264
|
+
return {
|
|
265
|
+
error: `No rows found in table ${parsed.table}${whereClause !== "" ? " matching filter" : ""}. K-Means requires at least 1 row.`,
|
|
266
|
+
method,
|
|
267
|
+
table: parsed.table,
|
|
268
|
+
rowCount: 0,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
// Clamp K to row count and warn if exceeded
|
|
272
|
+
if (effectiveNumClusters > rowCount) {
|
|
273
|
+
warning = `Requested ${String(parsed.numClusters)} clusters but only ${String(rowCount)} rows available. Using ${String(rowCount)} clusters instead.`;
|
|
274
|
+
effectiveNumClusters = rowCount;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
let clusterFunction;
|
|
278
|
+
if (method === "kmeans") {
|
|
279
|
+
clusterFunction = `ST_ClusterKMeans("${parsed.column}", ${String(effectiveNumClusters)}) OVER ()`;
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
const eps = parsed.eps ?? 100;
|
|
283
|
+
const minPoints = parsed.minPoints ?? 3;
|
|
284
|
+
clusterFunction = `ST_ClusterDBSCAN("${parsed.column}", ${String(eps)}, ${String(minPoints)}) OVER ()`;
|
|
285
|
+
}
|
|
286
|
+
const sql = `
|
|
287
|
+
WITH clustered AS (
|
|
288
|
+
SELECT
|
|
289
|
+
*,
|
|
290
|
+
${clusterFunction} as cluster_id
|
|
291
|
+
FROM ${qualifiedTable}
|
|
292
|
+
${whereClause}
|
|
293
|
+
)
|
|
294
|
+
SELECT
|
|
295
|
+
cluster_id,
|
|
296
|
+
COUNT(*) as point_count,
|
|
297
|
+
ST_AsGeoJSON(ST_Centroid(ST_Collect("${parsed.column}"))) as centroid,
|
|
298
|
+
ST_AsGeoJSON(ST_ConvexHull(ST_Collect("${parsed.column}"))) as hull
|
|
299
|
+
FROM clustered
|
|
300
|
+
WHERE cluster_id IS NOT NULL
|
|
301
|
+
GROUP BY cluster_id
|
|
302
|
+
ORDER BY point_count DESC
|
|
303
|
+
${limitClause}
|
|
304
|
+
`;
|
|
305
|
+
const [clustersResult, summaryResult] = await Promise.all([
|
|
306
|
+
adapter.executeQuery(sql),
|
|
307
|
+
adapter.executeQuery(`
|
|
308
|
+
WITH clustered AS (
|
|
309
|
+
SELECT ${clusterFunction} as cluster_id
|
|
310
|
+
FROM ${qualifiedTable}
|
|
311
|
+
${whereClause}
|
|
312
|
+
)
|
|
313
|
+
SELECT
|
|
314
|
+
COUNT(DISTINCT cluster_id) as num_clusters,
|
|
315
|
+
COUNT(*) FILTER (WHERE cluster_id IS NULL) as noise_points,
|
|
316
|
+
COUNT(*) as total_points
|
|
317
|
+
FROM clustered
|
|
318
|
+
`),
|
|
319
|
+
]);
|
|
320
|
+
// Normalize cluster point_count to numbers
|
|
321
|
+
const normalizedClusters = (clustersResult.rows ?? []).map((row) => ({
|
|
322
|
+
...row,
|
|
323
|
+
point_count: Number(row["point_count"]),
|
|
324
|
+
}));
|
|
325
|
+
// Normalize summary values to numbers for consistency
|
|
326
|
+
const rawSummary = summaryResult.rows?.[0] ?? {};
|
|
327
|
+
const normalizedSummary = {
|
|
328
|
+
num_clusters: Number(rawSummary["num_clusters"] ?? 0),
|
|
329
|
+
noise_points: Number(rawSummary["noise_points"] ?? 0),
|
|
330
|
+
total_points: Number(rawSummary["total_points"] ?? 0),
|
|
331
|
+
};
|
|
332
|
+
// Build response
|
|
333
|
+
const response = {
|
|
334
|
+
method,
|
|
335
|
+
parameters: method === "kmeans"
|
|
336
|
+
? { numClusters: effectiveNumClusters }
|
|
337
|
+
: { eps: parsed.eps ?? 100, minPoints: parsed.minPoints ?? 3 },
|
|
338
|
+
summary: normalizedSummary,
|
|
339
|
+
clusters: normalizedClusters,
|
|
340
|
+
};
|
|
341
|
+
// Add warning if K was clamped
|
|
342
|
+
if (warning !== undefined) {
|
|
343
|
+
response["warning"] = warning;
|
|
344
|
+
response["requestedClusters"] = parsed.numClusters;
|
|
345
|
+
response["actualClusters"] = effectiveNumClusters;
|
|
346
|
+
}
|
|
347
|
+
// Add contextual hints based on method and results
|
|
348
|
+
const numClusters = normalizedSummary.num_clusters;
|
|
349
|
+
const noisePoints = normalizedSummary.noise_points;
|
|
350
|
+
const totalPoints = normalizedSummary.total_points;
|
|
351
|
+
if (method === "dbscan") {
|
|
352
|
+
const eps = parsed.eps ?? 100;
|
|
353
|
+
const minPoints = parsed.minPoints ?? 3;
|
|
354
|
+
// Provide hints about DBSCAN parameter trade-offs
|
|
355
|
+
const hints = [];
|
|
356
|
+
if (numClusters === 1 && totalPoints > 1) {
|
|
357
|
+
hints.push(`All ${String(totalPoints)} points formed a single cluster. Consider decreasing eps (currently ${String(eps)}m) to create more distinct clusters.`);
|
|
358
|
+
}
|
|
359
|
+
if (noisePoints > 0 && noisePoints > totalPoints * 0.5) {
|
|
360
|
+
hints.push(`${String(noisePoints)} of ${String(totalPoints)} points (${String(Math.round((noisePoints / totalPoints) * 100))}%) are noise. Consider increasing eps or decreasing minPoints (currently ${String(minPoints)}).`);
|
|
361
|
+
}
|
|
362
|
+
if (numClusters === 0 && totalPoints > 0) {
|
|
363
|
+
hints.push(`No clusters formed - all points are noise. Try increasing eps (currently ${String(eps)}m) or decreasing minPoints (currently ${String(minPoints)}).`);
|
|
364
|
+
}
|
|
365
|
+
response["notes"] =
|
|
366
|
+
"Noise points (cluster_id = NULL) are points not belonging to any cluster";
|
|
367
|
+
if (hints.length > 0) {
|
|
368
|
+
response["hints"] = hints;
|
|
369
|
+
}
|
|
370
|
+
response["parameterGuide"] = {
|
|
371
|
+
eps: `Distance threshold in meters. Larger values group more distant points together.`,
|
|
372
|
+
minPoints: `Minimum points required to form a cluster. Higher values create fewer, denser clusters.`,
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
else {
|
|
376
|
+
response["notes"] =
|
|
377
|
+
"K-Means will always assign all points to a cluster";
|
|
378
|
+
}
|
|
379
|
+
return response;
|
|
380
|
+
},
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
//# sourceMappingURL=advanced.js.map
|