@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,708 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL Text & Full-Text Search Tools
|
|
3
|
+
*
|
|
4
|
+
* Text processing, FTS, trigrams, and fuzzy matching.
|
|
5
|
+
* 14 tools total.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
import { readOnly, write } from "../../../utils/annotations.js";
|
|
9
|
+
import { getToolIcons } from "../../../utils/icons.js";
|
|
10
|
+
import { sanitizeIdentifier, sanitizeIdentifiers, } from "../../../utils/identifiers.js";
|
|
11
|
+
import { TextSearchSchema, TextSearchSchemaBase, TrigramSimilaritySchema, TrigramSimilaritySchemaBase, RegexpMatchSchema, RegexpMatchSchemaBase, preprocessTextParams, } from "../schemas/index.js";
|
|
12
|
+
/**
|
|
13
|
+
* Get all text processing tools
|
|
14
|
+
*/
|
|
15
|
+
export function getTextTools(adapter) {
|
|
16
|
+
return [
|
|
17
|
+
createTextSearchTool(adapter),
|
|
18
|
+
createTextRankTool(adapter),
|
|
19
|
+
createTrigramSimilarityTool(adapter),
|
|
20
|
+
createFuzzyMatchTool(adapter),
|
|
21
|
+
createRegexpMatchTool(adapter),
|
|
22
|
+
createLikeSearchTool(adapter),
|
|
23
|
+
createTextHeadlineTool(adapter),
|
|
24
|
+
createFtsIndexTool(adapter),
|
|
25
|
+
createTextNormalizeTool(adapter),
|
|
26
|
+
createTextSentimentTool(adapter),
|
|
27
|
+
createTextToVectorTool(adapter),
|
|
28
|
+
createTextToQueryTool(adapter),
|
|
29
|
+
createTextSearchConfigTool(adapter),
|
|
30
|
+
];
|
|
31
|
+
}
|
|
32
|
+
function createTextSearchTool(adapter) {
|
|
33
|
+
return {
|
|
34
|
+
name: "pg_text_search",
|
|
35
|
+
description: "Full-text search using tsvector and tsquery.",
|
|
36
|
+
group: "text",
|
|
37
|
+
inputSchema: TextSearchSchemaBase, // Base schema for MCP visibility
|
|
38
|
+
annotations: readOnly("Full-Text Search"),
|
|
39
|
+
icons: getToolIcons("text", readOnly("Full-Text Search")),
|
|
40
|
+
handler: async (params, _context) => {
|
|
41
|
+
const parsed = TextSearchSchema.parse(params);
|
|
42
|
+
const cfg = parsed.config ?? "english";
|
|
43
|
+
// Handle both column (string) and columns (array) parameters
|
|
44
|
+
// The preprocessor converts column → columns, but we handle both for safety
|
|
45
|
+
let cols;
|
|
46
|
+
if (parsed.columns !== undefined && parsed.columns.length > 0) {
|
|
47
|
+
cols = parsed.columns;
|
|
48
|
+
}
|
|
49
|
+
else if (parsed.column !== undefined) {
|
|
50
|
+
cols = [parsed.column];
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
throw new Error("Either 'columns' (array) or 'column' (string) is required");
|
|
54
|
+
}
|
|
55
|
+
// Build qualified table name with schema support
|
|
56
|
+
// The preprocessor guarantees table is set (converts tableName → table)
|
|
57
|
+
const schemaPrefix = parsed.schema ? `"${parsed.schema}".` : "";
|
|
58
|
+
const resolvedTable = parsed.table ?? parsed.tableName;
|
|
59
|
+
if (!resolvedTable) {
|
|
60
|
+
throw new Error("Either 'table' or 'tableName' is required");
|
|
61
|
+
}
|
|
62
|
+
const tableName = `${schemaPrefix}"${resolvedTable}"`;
|
|
63
|
+
const sanitizedCols = sanitizeIdentifiers(cols);
|
|
64
|
+
const selectCols = parsed.select !== undefined && parsed.select.length > 0
|
|
65
|
+
? sanitizeIdentifiers(parsed.select).join(", ")
|
|
66
|
+
: "*";
|
|
67
|
+
const tsvector = sanitizedCols
|
|
68
|
+
.map((c) => `coalesce(${c}, '')`)
|
|
69
|
+
.join(" || ' ' || ");
|
|
70
|
+
const limitClause = parsed.limit !== undefined && parsed.limit > 0
|
|
71
|
+
? ` LIMIT ${String(parsed.limit)}`
|
|
72
|
+
: "";
|
|
73
|
+
const sql = `SELECT ${selectCols}, ts_rank_cd(to_tsvector('${cfg}', ${tsvector}), plainto_tsquery('${cfg}', $1)) as rank
|
|
74
|
+
FROM ${tableName}
|
|
75
|
+
WHERE to_tsvector('${cfg}', ${tsvector}) @@ plainto_tsquery('${cfg}', $1)
|
|
76
|
+
ORDER BY rank DESC${limitClause}`;
|
|
77
|
+
const result = await adapter.executeQuery(sql, [parsed.query]);
|
|
78
|
+
return { rows: result.rows, count: result.rows?.length ?? 0 };
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function createTextRankTool(adapter) {
|
|
83
|
+
// Base schema for MCP visibility (no preprocess)
|
|
84
|
+
const TextRankSchemaBase = z
|
|
85
|
+
.object({
|
|
86
|
+
table: z.string().optional().describe("Table name"),
|
|
87
|
+
tableName: z.string().optional().describe("Table name (alias for table)"),
|
|
88
|
+
column: z.string().optional().describe("Single column to search"),
|
|
89
|
+
columns: z
|
|
90
|
+
.array(z.string())
|
|
91
|
+
.optional()
|
|
92
|
+
.describe("Multiple columns to search (alternative to column)"),
|
|
93
|
+
query: z.string(),
|
|
94
|
+
config: z.string().optional(),
|
|
95
|
+
normalization: z.number().optional(),
|
|
96
|
+
select: z.array(z.string()).optional().describe("Columns to return"),
|
|
97
|
+
limit: z.number().optional().describe("Max results"),
|
|
98
|
+
schema: z.string().optional().describe("Schema name (default: public)"),
|
|
99
|
+
})
|
|
100
|
+
.refine((data) => data.table !== undefined || data.tableName !== undefined, {
|
|
101
|
+
message: "Either 'table' or 'tableName' is required",
|
|
102
|
+
});
|
|
103
|
+
// Full schema with preprocess for handler parsing
|
|
104
|
+
const TextRankSchema = z.preprocess(preprocessTextParams, TextRankSchemaBase);
|
|
105
|
+
return {
|
|
106
|
+
name: "pg_text_rank",
|
|
107
|
+
description: "Get relevance ranking for full-text search results. Returns matching rows only with rank score.",
|
|
108
|
+
group: "text",
|
|
109
|
+
inputSchema: TextRankSchemaBase, // Base schema for MCP visibility
|
|
110
|
+
annotations: readOnly("Text Rank"),
|
|
111
|
+
icons: getToolIcons("text", readOnly("Text Rank")),
|
|
112
|
+
handler: async (params, _context) => {
|
|
113
|
+
const parsed = TextRankSchema.parse(params);
|
|
114
|
+
const cfg = parsed.config ?? "english";
|
|
115
|
+
const norm = parsed.normalization ?? 0;
|
|
116
|
+
// Handle both column (string) and columns (array) parameters
|
|
117
|
+
let cols;
|
|
118
|
+
if (parsed.columns !== undefined && parsed.columns.length > 0) {
|
|
119
|
+
cols = parsed.columns;
|
|
120
|
+
}
|
|
121
|
+
else if (parsed.column !== undefined) {
|
|
122
|
+
cols = [parsed.column];
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
throw new Error("Either column or columns parameter is required");
|
|
126
|
+
}
|
|
127
|
+
// The preprocessor guarantees table is set (converts tableName → table)
|
|
128
|
+
const schemaPrefix = parsed.schema ? `"${parsed.schema}".` : "";
|
|
129
|
+
const resolvedTable = parsed.table ?? parsed.tableName;
|
|
130
|
+
if (!resolvedTable) {
|
|
131
|
+
throw new Error("Either 'table' or 'tableName' is required");
|
|
132
|
+
}
|
|
133
|
+
const tableName = `${schemaPrefix}"${resolvedTable}"`;
|
|
134
|
+
const sanitizedCols = sanitizeIdentifiers(cols);
|
|
135
|
+
const selectCols = parsed.select !== undefined && parsed.select.length > 0
|
|
136
|
+
? sanitizeIdentifiers(parsed.select).join(", ")
|
|
137
|
+
: "*";
|
|
138
|
+
const tsvector = sanitizedCols
|
|
139
|
+
.map((c) => `coalesce(${c}, '')`)
|
|
140
|
+
.join(" || ' ' || ");
|
|
141
|
+
const limitClause = parsed.limit !== undefined && parsed.limit > 0
|
|
142
|
+
? ` LIMIT ${String(parsed.limit)}`
|
|
143
|
+
: "";
|
|
144
|
+
const sql = `SELECT ${selectCols}, ts_rank_cd(to_tsvector('${cfg}', ${tsvector}), plainto_tsquery('${cfg}', $1), ${String(norm)}) as rank
|
|
145
|
+
FROM ${tableName}
|
|
146
|
+
WHERE to_tsvector('${cfg}', ${tsvector}) @@ plainto_tsquery('${cfg}', $1)
|
|
147
|
+
ORDER BY rank DESC${limitClause}`;
|
|
148
|
+
const result = await adapter.executeQuery(sql, [parsed.query]);
|
|
149
|
+
return { rows: result.rows, count: result.rows?.length ?? 0 };
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
function createTrigramSimilarityTool(adapter) {
|
|
154
|
+
return {
|
|
155
|
+
name: "pg_trigram_similarity",
|
|
156
|
+
description: "Find similar strings using pg_trgm trigram matching. Returns similarity score (0-1). Default threshold 0.3; use lower (e.g., 0.1) for partial matches.",
|
|
157
|
+
group: "text",
|
|
158
|
+
inputSchema: TrigramSimilaritySchemaBase, // Base schema for MCP visibility
|
|
159
|
+
annotations: readOnly("Trigram Similarity"),
|
|
160
|
+
icons: getToolIcons("text", readOnly("Trigram Similarity")),
|
|
161
|
+
handler: async (params, _context) => {
|
|
162
|
+
const parsed = TrigramSimilaritySchema.parse(params);
|
|
163
|
+
const thresh = parsed.threshold ?? 0.3;
|
|
164
|
+
// Default limit to 100 to prevent large payloads
|
|
165
|
+
const limitVal = parsed.limit !== undefined && parsed.limit > 0 ? parsed.limit : 100;
|
|
166
|
+
// The preprocessor guarantees table is set (converts tableName → table)
|
|
167
|
+
const schemaPrefix = parsed.schema ? `"${parsed.schema}".` : "";
|
|
168
|
+
const resolvedTable = parsed.table ?? parsed.tableName;
|
|
169
|
+
if (!resolvedTable) {
|
|
170
|
+
throw new Error("Either 'table' or 'tableName' is required");
|
|
171
|
+
}
|
|
172
|
+
const tableName = `${schemaPrefix}"${resolvedTable}"`;
|
|
173
|
+
const columnName = sanitizeIdentifier(parsed.column);
|
|
174
|
+
const selectCols = parsed.select !== undefined && parsed.select.length > 0
|
|
175
|
+
? sanitizeIdentifiers(parsed.select).join(", ")
|
|
176
|
+
: "*";
|
|
177
|
+
const additionalWhere = parsed.where ? ` AND (${parsed.where})` : "";
|
|
178
|
+
const sql = `SELECT ${selectCols}, similarity(${columnName}, $1) as similarity
|
|
179
|
+
FROM ${tableName}
|
|
180
|
+
WHERE similarity(${columnName}, $1) > ${String(thresh)}${additionalWhere}
|
|
181
|
+
ORDER BY similarity DESC LIMIT ${String(limitVal)}`;
|
|
182
|
+
const result = await adapter.executeQuery(sql, [parsed.value]);
|
|
183
|
+
return { rows: result.rows, count: result.rows?.length ?? 0 };
|
|
184
|
+
},
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
function createFuzzyMatchTool(adapter) {
|
|
188
|
+
// Base schema for MCP visibility (no preprocess)
|
|
189
|
+
const FuzzyMatchSchemaBase = z
|
|
190
|
+
.object({
|
|
191
|
+
table: z.string().optional().describe("Table name"),
|
|
192
|
+
tableName: z.string().optional().describe("Table name (alias for table)"),
|
|
193
|
+
column: z.string(),
|
|
194
|
+
value: z.string(),
|
|
195
|
+
method: z.enum(["soundex", "levenshtein", "metaphone"]).optional(),
|
|
196
|
+
maxDistance: z
|
|
197
|
+
.number()
|
|
198
|
+
.optional()
|
|
199
|
+
.describe("Max Levenshtein distance (default: 3, use 5+ for longer strings)"),
|
|
200
|
+
select: z.array(z.string()).optional().describe("Columns to return"),
|
|
201
|
+
limit: z
|
|
202
|
+
.number()
|
|
203
|
+
.optional()
|
|
204
|
+
.describe("Max results (default: 100 to prevent large payloads)"),
|
|
205
|
+
where: z.string().optional().describe("Additional WHERE clause filter"),
|
|
206
|
+
schema: z.string().optional().describe("Schema name (default: public)"),
|
|
207
|
+
})
|
|
208
|
+
.refine((data) => data.table !== undefined || data.tableName !== undefined, {
|
|
209
|
+
message: "Either 'table' or 'tableName' is required",
|
|
210
|
+
});
|
|
211
|
+
// Full schema with preprocess for handler parsing
|
|
212
|
+
const FuzzyMatchSchema = z.preprocess(preprocessTextParams, FuzzyMatchSchemaBase);
|
|
213
|
+
return {
|
|
214
|
+
name: "pg_fuzzy_match",
|
|
215
|
+
description: "Fuzzy string matching using fuzzystrmatch extension. Levenshtein (default): returns distance; use maxDistance=5+ for longer strings. Soundex/metaphone: returns phonetic code for exact matches only.",
|
|
216
|
+
group: "text",
|
|
217
|
+
inputSchema: FuzzyMatchSchemaBase, // Base schema for MCP visibility
|
|
218
|
+
annotations: readOnly("Fuzzy Match"),
|
|
219
|
+
icons: getToolIcons("text", readOnly("Fuzzy Match")),
|
|
220
|
+
handler: async (params, _context) => {
|
|
221
|
+
const parsed = FuzzyMatchSchema.parse(params);
|
|
222
|
+
// Method is already validated by zod enum, default to levenshtein if not provided
|
|
223
|
+
const method = parsed.method ?? "levenshtein";
|
|
224
|
+
const maxDist = parsed.maxDistance ?? 3;
|
|
225
|
+
// Default limit to 100 to prevent large payloads
|
|
226
|
+
const limitVal = parsed.limit !== undefined && parsed.limit > 0 ? parsed.limit : 100;
|
|
227
|
+
// The preprocessor guarantees table is set (converts tableName → table)
|
|
228
|
+
const schemaPrefix = parsed.schema ? `"${parsed.schema}".` : "";
|
|
229
|
+
const resolvedTable = parsed.table ?? parsed.tableName;
|
|
230
|
+
if (!resolvedTable) {
|
|
231
|
+
throw new Error("Either 'table' or 'tableName' is required");
|
|
232
|
+
}
|
|
233
|
+
const tableName = `${schemaPrefix}"${resolvedTable}"`;
|
|
234
|
+
const columnName = sanitizeIdentifier(parsed.column);
|
|
235
|
+
const selectCols = parsed.select !== undefined && parsed.select.length > 0
|
|
236
|
+
? sanitizeIdentifiers(parsed.select).join(", ")
|
|
237
|
+
: "*";
|
|
238
|
+
const additionalWhere = parsed.where ? ` AND (${parsed.where})` : "";
|
|
239
|
+
let sql;
|
|
240
|
+
if (method === "soundex") {
|
|
241
|
+
sql = `SELECT ${selectCols}, soundex(${columnName}) as code FROM ${tableName} WHERE soundex(${columnName}) = soundex($1)${additionalWhere} LIMIT ${String(limitVal)}`;
|
|
242
|
+
}
|
|
243
|
+
else if (method === "metaphone") {
|
|
244
|
+
sql = `SELECT ${selectCols}, metaphone(${columnName}, 10) as code FROM ${tableName} WHERE metaphone(${columnName}, 10) = metaphone($1, 10)${additionalWhere} LIMIT ${String(limitVal)}`;
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
sql = `SELECT ${selectCols}, levenshtein(${columnName}, $1) as distance FROM ${tableName} WHERE levenshtein(${columnName}, $1) <= ${String(maxDist)}${additionalWhere} ORDER BY distance LIMIT ${String(limitVal)}`;
|
|
248
|
+
}
|
|
249
|
+
const result = await adapter.executeQuery(sql, [parsed.value]);
|
|
250
|
+
return { rows: result.rows, count: result.rows?.length ?? 0 };
|
|
251
|
+
},
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
function createRegexpMatchTool(adapter) {
|
|
255
|
+
return {
|
|
256
|
+
name: "pg_regexp_match",
|
|
257
|
+
description: "Match text using POSIX regular expressions.",
|
|
258
|
+
group: "text",
|
|
259
|
+
inputSchema: RegexpMatchSchemaBase, // Base schema for MCP visibility
|
|
260
|
+
annotations: readOnly("Regexp Match"),
|
|
261
|
+
icons: getToolIcons("text", readOnly("Regexp Match")),
|
|
262
|
+
handler: async (params, _context) => {
|
|
263
|
+
const parsed = RegexpMatchSchema.parse(params);
|
|
264
|
+
// The preprocessor guarantees table is set (converts tableName → table)
|
|
265
|
+
const schemaPrefix = parsed.schema ? `"${parsed.schema}".` : "";
|
|
266
|
+
const resolvedTable = parsed.table ?? parsed.tableName;
|
|
267
|
+
if (!resolvedTable) {
|
|
268
|
+
throw new Error("Either 'table' or 'tableName' is required");
|
|
269
|
+
}
|
|
270
|
+
const tableName = `${schemaPrefix}"${resolvedTable}"`;
|
|
271
|
+
const columnName = sanitizeIdentifier(parsed.column);
|
|
272
|
+
const selectCols = parsed.select !== undefined && parsed.select.length > 0
|
|
273
|
+
? sanitizeIdentifiers(parsed.select).join(", ")
|
|
274
|
+
: "*";
|
|
275
|
+
const op = parsed.flags?.includes("i") ? "~*" : "~";
|
|
276
|
+
const additionalWhere = parsed.where ? ` AND (${parsed.where})` : "";
|
|
277
|
+
const limitClause = parsed.limit !== undefined ? ` LIMIT ${String(parsed.limit)}` : "";
|
|
278
|
+
const sql = `SELECT ${selectCols} FROM ${tableName} WHERE ${columnName} ${op} $1${additionalWhere}${limitClause}`;
|
|
279
|
+
const result = await adapter.executeQuery(sql, [parsed.pattern]);
|
|
280
|
+
return { rows: result.rows, count: result.rows?.length ?? 0 };
|
|
281
|
+
},
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
function createLikeSearchTool(adapter) {
|
|
285
|
+
// Base schema for MCP visibility (no preprocess)
|
|
286
|
+
const LikeSearchSchemaBase = z
|
|
287
|
+
.object({
|
|
288
|
+
table: z.string().optional().describe("Table name"),
|
|
289
|
+
tableName: z.string().optional().describe("Table name (alias for table)"),
|
|
290
|
+
column: z.string(),
|
|
291
|
+
pattern: z.string(),
|
|
292
|
+
caseSensitive: z
|
|
293
|
+
.boolean()
|
|
294
|
+
.optional()
|
|
295
|
+
.describe("Use case-sensitive LIKE (default: false, uses ILIKE)"),
|
|
296
|
+
select: z.array(z.string()).optional(),
|
|
297
|
+
limit: z.number().optional(),
|
|
298
|
+
where: z.string().optional().describe("Additional WHERE clause filter"),
|
|
299
|
+
schema: z.string().optional().describe("Schema name (default: public)"),
|
|
300
|
+
})
|
|
301
|
+
.refine((data) => data.table !== undefined || data.tableName !== undefined, {
|
|
302
|
+
message: "Either 'table' or 'tableName' is required",
|
|
303
|
+
});
|
|
304
|
+
// Full schema with preprocess for handler parsing
|
|
305
|
+
const LikeSearchSchema = z.preprocess(preprocessTextParams, LikeSearchSchemaBase);
|
|
306
|
+
return {
|
|
307
|
+
name: "pg_like_search",
|
|
308
|
+
description: "Search text using LIKE patterns. Case-insensitive (ILIKE) by default.",
|
|
309
|
+
group: "text",
|
|
310
|
+
inputSchema: LikeSearchSchemaBase, // Base schema for MCP visibility
|
|
311
|
+
annotations: readOnly("LIKE Search"),
|
|
312
|
+
icons: getToolIcons("text", readOnly("LIKE Search")),
|
|
313
|
+
handler: async (params, _context) => {
|
|
314
|
+
const parsed = LikeSearchSchema.parse(params);
|
|
315
|
+
// The preprocessor guarantees table is set (converts tableName → table)
|
|
316
|
+
const schemaPrefix = parsed.schema ? `"${parsed.schema}".` : "";
|
|
317
|
+
const resolvedTable = parsed.table ?? parsed.tableName;
|
|
318
|
+
if (!resolvedTable) {
|
|
319
|
+
throw new Error("Either 'table' or 'tableName' is required");
|
|
320
|
+
}
|
|
321
|
+
const tableName = `${schemaPrefix}"${resolvedTable}"`;
|
|
322
|
+
const columnName = sanitizeIdentifier(parsed.column);
|
|
323
|
+
const selectCols = parsed.select !== undefined && parsed.select.length > 0
|
|
324
|
+
? sanitizeIdentifiers(parsed.select).join(", ")
|
|
325
|
+
: "*";
|
|
326
|
+
const op = parsed.caseSensitive === true ? "LIKE" : "ILIKE";
|
|
327
|
+
const additionalWhere = parsed.where ? ` AND (${parsed.where})` : "";
|
|
328
|
+
const limitClause = parsed.limit !== undefined && parsed.limit > 0
|
|
329
|
+
? ` LIMIT ${String(parsed.limit)}`
|
|
330
|
+
: "";
|
|
331
|
+
const sql = `SELECT ${selectCols} FROM ${tableName} WHERE ${columnName} ${op} $1${additionalWhere}${limitClause}`;
|
|
332
|
+
const result = await adapter.executeQuery(sql, [parsed.pattern]);
|
|
333
|
+
return { rows: result.rows, count: result.rows?.length ?? 0 };
|
|
334
|
+
},
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
function createTextHeadlineTool(adapter) {
|
|
338
|
+
// Base schema for MCP visibility (no preprocess)
|
|
339
|
+
const HeadlineSchemaBase = z
|
|
340
|
+
.object({
|
|
341
|
+
table: z.string().optional().describe("Table name"),
|
|
342
|
+
tableName: z.string().optional().describe("Table name (alias for table)"),
|
|
343
|
+
column: z.string(),
|
|
344
|
+
query: z.string(),
|
|
345
|
+
config: z.string().optional(),
|
|
346
|
+
options: z
|
|
347
|
+
.string()
|
|
348
|
+
.optional()
|
|
349
|
+
.describe('Headline options (e.g., "MaxWords=20, MinWords=5"). Note: MinWords must be < MaxWords.'),
|
|
350
|
+
startSel: z
|
|
351
|
+
.string()
|
|
352
|
+
.optional()
|
|
353
|
+
.describe("Start selection marker (default: <b>)"),
|
|
354
|
+
stopSel: z
|
|
355
|
+
.string()
|
|
356
|
+
.optional()
|
|
357
|
+
.describe("Stop selection marker (default: </b>)"),
|
|
358
|
+
maxWords: z.number().optional().describe("Maximum words in headline"),
|
|
359
|
+
minWords: z.number().optional().describe("Minimum words in headline"),
|
|
360
|
+
select: z
|
|
361
|
+
.array(z.string())
|
|
362
|
+
.optional()
|
|
363
|
+
.describe('Columns to return for row identification (e.g., ["id"])'),
|
|
364
|
+
limit: z.number().optional().describe("Max results"),
|
|
365
|
+
schema: z.string().optional().describe("Schema name (default: public)"),
|
|
366
|
+
})
|
|
367
|
+
.refine((data) => data.table !== undefined || data.tableName !== undefined, {
|
|
368
|
+
message: "Either 'table' or 'tableName' is required",
|
|
369
|
+
});
|
|
370
|
+
// Full schema with preprocess for handler parsing
|
|
371
|
+
const HeadlineSchema = z.preprocess(preprocessTextParams, HeadlineSchemaBase);
|
|
372
|
+
return {
|
|
373
|
+
name: "pg_text_headline",
|
|
374
|
+
description: "Generate highlighted snippets from full-text search matches. Use select param for stable row identification (e.g., primary key).",
|
|
375
|
+
group: "text",
|
|
376
|
+
inputSchema: HeadlineSchemaBase, // Base schema for MCP visibility
|
|
377
|
+
annotations: readOnly("Text Headline"),
|
|
378
|
+
icons: getToolIcons("text", readOnly("Text Headline")),
|
|
379
|
+
handler: async (params, _context) => {
|
|
380
|
+
const parsed = HeadlineSchema.parse(params);
|
|
381
|
+
const cfg = parsed.config ?? "english";
|
|
382
|
+
// Build options string from individual params or use provided options
|
|
383
|
+
let opts;
|
|
384
|
+
if (parsed.options) {
|
|
385
|
+
opts = parsed.options;
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
const optParts = [];
|
|
389
|
+
optParts.push(`StartSel=${parsed.startSel ?? "<b>"}`);
|
|
390
|
+
optParts.push(`StopSel=${parsed.stopSel ?? "</b>"}`);
|
|
391
|
+
optParts.push(`MaxWords=${String(parsed.maxWords ?? 35)}`);
|
|
392
|
+
optParts.push(`MinWords=${String(parsed.minWords ?? 15)}`);
|
|
393
|
+
opts = optParts.join(", ");
|
|
394
|
+
}
|
|
395
|
+
// The preprocessor guarantees table is set (converts tableName → table)
|
|
396
|
+
const schemaPrefix = parsed.schema ? `"${parsed.schema}".` : "";
|
|
397
|
+
const resolvedTable = parsed.table ?? parsed.tableName;
|
|
398
|
+
if (!resolvedTable) {
|
|
399
|
+
throw new Error("Either 'table' or 'tableName' is required");
|
|
400
|
+
}
|
|
401
|
+
const tableName = `${schemaPrefix}"${resolvedTable}"`;
|
|
402
|
+
const columnName = sanitizeIdentifier(parsed.column);
|
|
403
|
+
// Use provided select columns, or default to * (user should specify PK for stable identification)
|
|
404
|
+
const selectCols = parsed.select !== undefined && parsed.select.length > 0
|
|
405
|
+
? sanitizeIdentifiers(parsed.select).join(", ") + ", "
|
|
406
|
+
: "";
|
|
407
|
+
const limitClause = parsed.limit !== undefined && parsed.limit > 0
|
|
408
|
+
? ` LIMIT ${String(parsed.limit)}`
|
|
409
|
+
: "";
|
|
410
|
+
const sql = `SELECT ${selectCols}ts_headline('${cfg}', ${columnName}, plainto_tsquery('${cfg}', $1), '${opts}') as headline
|
|
411
|
+
FROM ${tableName}
|
|
412
|
+
WHERE to_tsvector('${cfg}', ${columnName}) @@ plainto_tsquery('${cfg}', $1)${limitClause}`;
|
|
413
|
+
const result = await adapter.executeQuery(sql, [parsed.query]);
|
|
414
|
+
return { rows: result.rows, count: result.rows?.length ?? 0 };
|
|
415
|
+
},
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
function createFtsIndexTool(adapter) {
|
|
419
|
+
// Base schema for MCP visibility (no preprocess)
|
|
420
|
+
const FtsIndexSchemaBase = z
|
|
421
|
+
.object({
|
|
422
|
+
table: z.string().optional().describe("Table name"),
|
|
423
|
+
tableName: z.string().optional().describe("Table name (alias for table)"),
|
|
424
|
+
column: z.string(),
|
|
425
|
+
name: z.string().optional(),
|
|
426
|
+
config: z.string().optional(),
|
|
427
|
+
ifNotExists: z
|
|
428
|
+
.boolean()
|
|
429
|
+
.optional()
|
|
430
|
+
.describe("Skip if index already exists (default: true)"),
|
|
431
|
+
schema: z.string().optional().describe("Schema name (default: public)"),
|
|
432
|
+
})
|
|
433
|
+
.refine((data) => data.table !== undefined || data.tableName !== undefined, {
|
|
434
|
+
message: "Either 'table' or 'tableName' is required",
|
|
435
|
+
});
|
|
436
|
+
// Full schema with preprocess for handler parsing
|
|
437
|
+
const FtsIndexSchema = z.preprocess(preprocessTextParams, FtsIndexSchemaBase);
|
|
438
|
+
return {
|
|
439
|
+
name: "pg_create_fts_index",
|
|
440
|
+
description: "Create a GIN index for full-text search on a column.",
|
|
441
|
+
group: "text",
|
|
442
|
+
inputSchema: FtsIndexSchemaBase, // Base schema for MCP visibility
|
|
443
|
+
annotations: write("Create FTS Index"),
|
|
444
|
+
icons: getToolIcons("text", write("Create FTS Index")),
|
|
445
|
+
handler: async (params, _context) => {
|
|
446
|
+
const parsed = FtsIndexSchema.parse(params);
|
|
447
|
+
const cfg = parsed.config ?? "english";
|
|
448
|
+
// The preprocessor guarantees table is set (converts tableName → table)
|
|
449
|
+
const resolvedTable = parsed.table ?? parsed.tableName;
|
|
450
|
+
if (!resolvedTable) {
|
|
451
|
+
throw new Error("Either 'table' or 'tableName' is required");
|
|
452
|
+
}
|
|
453
|
+
const defaultIndexName = `idx_${resolvedTable}_${parsed.column}_fts`;
|
|
454
|
+
const resolvedIndexName = parsed.name ?? defaultIndexName;
|
|
455
|
+
const indexName = sanitizeIdentifier(resolvedIndexName);
|
|
456
|
+
// Default to IF NOT EXISTS for safer operation (skip existing indexes)
|
|
457
|
+
const useIfNotExists = parsed.ifNotExists !== false;
|
|
458
|
+
const ifNotExists = useIfNotExists ? "IF NOT EXISTS " : "";
|
|
459
|
+
// Build qualified table name with schema support
|
|
460
|
+
const schemaPrefix = parsed.schema ? `"${parsed.schema}".` : "";
|
|
461
|
+
const tableName = `${schemaPrefix}"${resolvedTable}"`;
|
|
462
|
+
const columnName = sanitizeIdentifier(parsed.column);
|
|
463
|
+
// Check if index exists before creation (to accurately report 'skipped')
|
|
464
|
+
let existedBefore = false;
|
|
465
|
+
if (useIfNotExists) {
|
|
466
|
+
const checkResult = await adapter.executeQuery(`SELECT 1 FROM pg_indexes WHERE indexname = $1 LIMIT 1`, [resolvedIndexName]);
|
|
467
|
+
existedBefore = (checkResult.rows?.length ?? 0) > 0;
|
|
468
|
+
}
|
|
469
|
+
const sql = `CREATE INDEX ${ifNotExists}${indexName} ON ${tableName} USING gin(to_tsvector('${cfg}', ${columnName}))`;
|
|
470
|
+
await adapter.executeQuery(sql);
|
|
471
|
+
return {
|
|
472
|
+
success: true,
|
|
473
|
+
index: resolvedIndexName,
|
|
474
|
+
config: cfg,
|
|
475
|
+
skipped: existedBefore,
|
|
476
|
+
};
|
|
477
|
+
},
|
|
478
|
+
};
|
|
479
|
+
}
|
|
480
|
+
function createTextNormalizeTool(adapter) {
|
|
481
|
+
const NormalizeSchema = z.object({
|
|
482
|
+
text: z.string().describe("Text to remove accent marks from"),
|
|
483
|
+
});
|
|
484
|
+
return {
|
|
485
|
+
name: "pg_text_normalize",
|
|
486
|
+
description: "Remove accent marks (diacritics) from text using PostgreSQL unaccent extension. Note: Does NOT lowercase or trim—use LOWER()/TRIM() in a query for those operations.",
|
|
487
|
+
group: "text",
|
|
488
|
+
inputSchema: NormalizeSchema,
|
|
489
|
+
annotations: readOnly("Text Normalize"),
|
|
490
|
+
icons: getToolIcons("text", readOnly("Text Normalize")),
|
|
491
|
+
handler: async (params, _context) => {
|
|
492
|
+
const parsed = NormalizeSchema.parse(params ?? {});
|
|
493
|
+
// Ensure unaccent extension is available
|
|
494
|
+
await adapter.executeQuery("CREATE EXTENSION IF NOT EXISTS unaccent");
|
|
495
|
+
const result = await adapter.executeQuery(`SELECT unaccent($1) as normalized`, [parsed.text]);
|
|
496
|
+
return { normalized: result.rows?.[0]?.["normalized"] };
|
|
497
|
+
},
|
|
498
|
+
};
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Basic sentiment analysis using word matching
|
|
502
|
+
*/
|
|
503
|
+
function createTextSentimentTool(_adapter) {
|
|
504
|
+
const SentimentSchema = z.object({
|
|
505
|
+
text: z.string().describe("Text to analyze"),
|
|
506
|
+
returnWords: z
|
|
507
|
+
.boolean()
|
|
508
|
+
.optional()
|
|
509
|
+
.describe("Return matched sentiment words"),
|
|
510
|
+
});
|
|
511
|
+
return {
|
|
512
|
+
name: "pg_text_sentiment",
|
|
513
|
+
description: "Perform basic sentiment analysis on text using keyword matching.",
|
|
514
|
+
group: "text",
|
|
515
|
+
inputSchema: SentimentSchema,
|
|
516
|
+
annotations: readOnly("Text Sentiment"),
|
|
517
|
+
icons: getToolIcons("text", readOnly("Text Sentiment")),
|
|
518
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
519
|
+
handler: async (params, _context) => {
|
|
520
|
+
const parsed = SentimentSchema.parse(params ?? {});
|
|
521
|
+
const text = parsed.text.toLowerCase();
|
|
522
|
+
const positiveWords = [
|
|
523
|
+
"good",
|
|
524
|
+
"great",
|
|
525
|
+
"excellent",
|
|
526
|
+
"amazing",
|
|
527
|
+
"wonderful",
|
|
528
|
+
"fantastic",
|
|
529
|
+
"love",
|
|
530
|
+
"happy",
|
|
531
|
+
"positive",
|
|
532
|
+
"best",
|
|
533
|
+
"beautiful",
|
|
534
|
+
"awesome",
|
|
535
|
+
"perfect",
|
|
536
|
+
"nice",
|
|
537
|
+
"helpful",
|
|
538
|
+
"thank",
|
|
539
|
+
"thanks",
|
|
540
|
+
"pleased",
|
|
541
|
+
"satisfied",
|
|
542
|
+
"recommend",
|
|
543
|
+
"enjoy",
|
|
544
|
+
"impressive",
|
|
545
|
+
"brilliant",
|
|
546
|
+
];
|
|
547
|
+
const negativeWords = [
|
|
548
|
+
"bad",
|
|
549
|
+
"terrible",
|
|
550
|
+
"awful",
|
|
551
|
+
"horrible",
|
|
552
|
+
"worst",
|
|
553
|
+
"hate",
|
|
554
|
+
"angry",
|
|
555
|
+
"disappointed",
|
|
556
|
+
"poor",
|
|
557
|
+
"wrong",
|
|
558
|
+
"problem",
|
|
559
|
+
"issue",
|
|
560
|
+
"fail",
|
|
561
|
+
"failed",
|
|
562
|
+
"broken",
|
|
563
|
+
"useless",
|
|
564
|
+
"waste",
|
|
565
|
+
"frustrating",
|
|
566
|
+
"annoyed",
|
|
567
|
+
"unhappy",
|
|
568
|
+
"negative",
|
|
569
|
+
"complaint",
|
|
570
|
+
"slow",
|
|
571
|
+
];
|
|
572
|
+
const words = text.split(/\s+/);
|
|
573
|
+
const matchedPositive = words
|
|
574
|
+
.map((w) => w.replace(/[^a-z]/g, ""))
|
|
575
|
+
.filter((w) => positiveWords.includes(w));
|
|
576
|
+
const matchedNegative = words
|
|
577
|
+
.map((w) => w.replace(/[^a-z]/g, ""))
|
|
578
|
+
.filter((w) => negativeWords.includes(w));
|
|
579
|
+
const positiveScore = matchedPositive.length;
|
|
580
|
+
const negativeScore = matchedNegative.length;
|
|
581
|
+
const totalScore = positiveScore - negativeScore;
|
|
582
|
+
let sentiment;
|
|
583
|
+
if (totalScore > 2)
|
|
584
|
+
sentiment = "very_positive";
|
|
585
|
+
else if (totalScore > 0)
|
|
586
|
+
sentiment = "positive";
|
|
587
|
+
else if (totalScore < -2)
|
|
588
|
+
sentiment = "very_negative";
|
|
589
|
+
else if (totalScore < 0)
|
|
590
|
+
sentiment = "negative";
|
|
591
|
+
else
|
|
592
|
+
sentiment = "neutral";
|
|
593
|
+
const result = {
|
|
594
|
+
sentiment,
|
|
595
|
+
score: totalScore,
|
|
596
|
+
positiveCount: positiveScore,
|
|
597
|
+
negativeCount: negativeScore,
|
|
598
|
+
confidence: positiveScore + negativeScore > 3
|
|
599
|
+
? "high"
|
|
600
|
+
: positiveScore + negativeScore > 1
|
|
601
|
+
? "medium"
|
|
602
|
+
: "low",
|
|
603
|
+
};
|
|
604
|
+
if (parsed.returnWords) {
|
|
605
|
+
result.matchedPositive = matchedPositive;
|
|
606
|
+
result.matchedNegative = matchedNegative;
|
|
607
|
+
}
|
|
608
|
+
return result;
|
|
609
|
+
},
|
|
610
|
+
};
|
|
611
|
+
}
|
|
612
|
+
/**
|
|
613
|
+
* Convert text to tsvector for full-text search
|
|
614
|
+
*/
|
|
615
|
+
function createTextToVectorTool(adapter) {
|
|
616
|
+
const ToVectorSchema = z.object({
|
|
617
|
+
text: z.string().describe("Text to convert to tsvector"),
|
|
618
|
+
config: z
|
|
619
|
+
.string()
|
|
620
|
+
.optional()
|
|
621
|
+
.describe("Text search configuration (default: english)"),
|
|
622
|
+
});
|
|
623
|
+
return {
|
|
624
|
+
name: "pg_text_to_vector",
|
|
625
|
+
description: "Convert text to tsvector representation for full-text search operations.",
|
|
626
|
+
group: "text",
|
|
627
|
+
inputSchema: ToVectorSchema,
|
|
628
|
+
annotations: readOnly("Text to Vector"),
|
|
629
|
+
icons: getToolIcons("text", readOnly("Text to Vector")),
|
|
630
|
+
handler: async (params, _context) => {
|
|
631
|
+
const parsed = ToVectorSchema.parse(params ?? {});
|
|
632
|
+
const cfg = parsed.config ?? "english";
|
|
633
|
+
const result = await adapter.executeQuery(`SELECT to_tsvector($1, $2) as vector`, [cfg, parsed.text]);
|
|
634
|
+
return { vector: result.rows?.[0]?.["vector"] };
|
|
635
|
+
},
|
|
636
|
+
};
|
|
637
|
+
}
|
|
638
|
+
/**
|
|
639
|
+
* Convert text to tsquery for full-text search
|
|
640
|
+
*/
|
|
641
|
+
function createTextToQueryTool(adapter) {
|
|
642
|
+
const ToQuerySchema = z.object({
|
|
643
|
+
text: z.string().describe("Text to convert to tsquery"),
|
|
644
|
+
config: z
|
|
645
|
+
.string()
|
|
646
|
+
.optional()
|
|
647
|
+
.describe("Text search configuration (default: english)"),
|
|
648
|
+
mode: z
|
|
649
|
+
.enum(["plain", "phrase", "websearch"])
|
|
650
|
+
.optional()
|
|
651
|
+
.describe("Query parsing mode: plain (default), phrase (proximity), websearch (Google-like)"),
|
|
652
|
+
});
|
|
653
|
+
return {
|
|
654
|
+
name: "pg_text_to_query",
|
|
655
|
+
description: "Convert text to tsquery for full-text search. Modes: plain (default), phrase (proximity matching), websearch (Google-like syntax with AND/OR/-).",
|
|
656
|
+
group: "text",
|
|
657
|
+
inputSchema: ToQuerySchema,
|
|
658
|
+
annotations: readOnly("Text to Query"),
|
|
659
|
+
icons: getToolIcons("text", readOnly("Text to Query")),
|
|
660
|
+
handler: async (params, _context) => {
|
|
661
|
+
const parsed = ToQuerySchema.parse(params ?? {});
|
|
662
|
+
const cfg = parsed.config ?? "english";
|
|
663
|
+
const mode = parsed.mode ?? "plain";
|
|
664
|
+
let fn;
|
|
665
|
+
switch (mode) {
|
|
666
|
+
case "phrase":
|
|
667
|
+
fn = "phraseto_tsquery";
|
|
668
|
+
break;
|
|
669
|
+
case "websearch":
|
|
670
|
+
fn = "websearch_to_tsquery";
|
|
671
|
+
break;
|
|
672
|
+
default:
|
|
673
|
+
fn = "plainto_tsquery";
|
|
674
|
+
}
|
|
675
|
+
const result = await adapter.executeQuery(`SELECT ${fn}($1, $2) as query`, [cfg, parsed.text]);
|
|
676
|
+
return { query: result.rows?.[0]?.["query"], mode };
|
|
677
|
+
},
|
|
678
|
+
};
|
|
679
|
+
}
|
|
680
|
+
/**
|
|
681
|
+
* List available full-text search configurations
|
|
682
|
+
*/
|
|
683
|
+
function createTextSearchConfigTool(adapter) {
|
|
684
|
+
return {
|
|
685
|
+
name: "pg_text_search_config",
|
|
686
|
+
description: "List available full-text search configurations (e.g., english, german, simple).",
|
|
687
|
+
group: "text",
|
|
688
|
+
inputSchema: z.object({}).default({}),
|
|
689
|
+
annotations: readOnly("Search Configurations"),
|
|
690
|
+
icons: getToolIcons("text", readOnly("Search Configurations")),
|
|
691
|
+
handler: async (_params, _context) => {
|
|
692
|
+
const result = await adapter.executeQuery(`
|
|
693
|
+
SELECT
|
|
694
|
+
c.cfgname as name,
|
|
695
|
+
n.nspname as schema,
|
|
696
|
+
obj_description(c.oid, 'pg_ts_config') as description
|
|
697
|
+
FROM pg_ts_config c
|
|
698
|
+
JOIN pg_namespace n ON n.oid = c.cfgnamespace
|
|
699
|
+
ORDER BY c.cfgname
|
|
700
|
+
`);
|
|
701
|
+
return {
|
|
702
|
+
configs: result.rows ?? [],
|
|
703
|
+
count: result.rows?.length ?? 0,
|
|
704
|
+
};
|
|
705
|
+
},
|
|
706
|
+
};
|
|
707
|
+
}
|
|
708
|
+
//# sourceMappingURL=text.js.map
|