@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,753 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PostgreSQL Monitoring Tools
|
|
3
|
+
*
|
|
4
|
+
* Database health, sizes, connections, and replication status.
|
|
5
|
+
* 11 tools total.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
import { readOnly } from "../../../utils/annotations.js";
|
|
9
|
+
import { getToolIcons } from "../../../utils/icons.js";
|
|
10
|
+
import { DatabaseSizeSchema, TableSizesSchema, ShowSettingsSchema, } from "../schemas/index.js";
|
|
11
|
+
/**
|
|
12
|
+
* Get all monitoring tools
|
|
13
|
+
*/
|
|
14
|
+
export function getMonitoringTools(adapter) {
|
|
15
|
+
return [
|
|
16
|
+
createDatabaseSizeTool(adapter),
|
|
17
|
+
createTableSizesTool(adapter),
|
|
18
|
+
createConnectionStatsTool(adapter),
|
|
19
|
+
createReplicationStatusTool(adapter),
|
|
20
|
+
createServerVersionTool(adapter),
|
|
21
|
+
createShowSettingsTool(adapter),
|
|
22
|
+
createUptimeTool(adapter),
|
|
23
|
+
createRecoveryStatusTool(adapter),
|
|
24
|
+
createCapacityPlanningTool(adapter),
|
|
25
|
+
createResourceUsageAnalyzeTool(adapter),
|
|
26
|
+
createAlertThresholdSetTool(adapter),
|
|
27
|
+
];
|
|
28
|
+
}
|
|
29
|
+
function createDatabaseSizeTool(adapter) {
|
|
30
|
+
return {
|
|
31
|
+
name: "pg_database_size",
|
|
32
|
+
description: "Get the size of a database.",
|
|
33
|
+
group: "monitoring",
|
|
34
|
+
inputSchema: DatabaseSizeSchema,
|
|
35
|
+
annotations: readOnly("Database Size"),
|
|
36
|
+
icons: getToolIcons("monitoring", readOnly("Database Size")),
|
|
37
|
+
handler: async (params, _context) => {
|
|
38
|
+
const { database } = DatabaseSizeSchema.parse(params);
|
|
39
|
+
const sql = database
|
|
40
|
+
? `SELECT pg_database_size($1) as bytes, pg_size_pretty(pg_database_size($1)) as size`
|
|
41
|
+
: `SELECT pg_database_size(current_database()) as bytes, pg_size_pretty(pg_database_size(current_database())) as size`;
|
|
42
|
+
const result = await adapter.executeQuery(sql, database ? [database] : []);
|
|
43
|
+
const row = result.rows?.[0];
|
|
44
|
+
if (!row)
|
|
45
|
+
return row;
|
|
46
|
+
return {
|
|
47
|
+
...row,
|
|
48
|
+
bytes: parseInt(String(row.bytes), 10),
|
|
49
|
+
};
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function createTableSizesTool(adapter) {
|
|
54
|
+
return {
|
|
55
|
+
name: "pg_table_sizes",
|
|
56
|
+
description: "Get sizes of all tables with indexes and total.",
|
|
57
|
+
group: "monitoring",
|
|
58
|
+
inputSchema: TableSizesSchema,
|
|
59
|
+
annotations: readOnly("Table Sizes"),
|
|
60
|
+
icons: getToolIcons("monitoring", readOnly("Table Sizes")),
|
|
61
|
+
handler: async (params, _context) => {
|
|
62
|
+
const { schema, limit } = TableSizesSchema.parse(params);
|
|
63
|
+
const schemaClause = schema ? `AND n.nspname = '${schema}'` : "";
|
|
64
|
+
// Apply limit (default 50)
|
|
65
|
+
const effectiveLimit = limit !== undefined && limit > 0 ? limit : 50;
|
|
66
|
+
const limitClause = ` LIMIT ${String(effectiveLimit)}`;
|
|
67
|
+
const sql = `SELECT n.nspname as schema, c.relname as table_name,
|
|
68
|
+
pg_size_pretty(pg_table_size(c.oid)) as table_size,
|
|
69
|
+
pg_size_pretty(pg_indexes_size(c.oid)) as indexes_size,
|
|
70
|
+
pg_size_pretty(pg_total_relation_size(c.oid)) as total_size,
|
|
71
|
+
pg_total_relation_size(c.oid) as total_bytes
|
|
72
|
+
FROM pg_class c
|
|
73
|
+
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
74
|
+
WHERE c.relkind IN ('r', 'p')
|
|
75
|
+
AND n.nspname NOT IN ('pg_catalog', 'information_schema')
|
|
76
|
+
${schemaClause}
|
|
77
|
+
ORDER BY pg_total_relation_size(c.oid) DESC${limitClause}`;
|
|
78
|
+
const result = await adapter.executeQuery(sql);
|
|
79
|
+
// Coerce total_bytes to number for each table row
|
|
80
|
+
const tables = (result.rows ?? []).map((row) => {
|
|
81
|
+
const totalBytes = row["total_bytes"];
|
|
82
|
+
return {
|
|
83
|
+
...row,
|
|
84
|
+
total_bytes: typeof totalBytes === "number"
|
|
85
|
+
? totalBytes
|
|
86
|
+
: typeof totalBytes === "string"
|
|
87
|
+
? parseInt(totalBytes, 10)
|
|
88
|
+
: 0,
|
|
89
|
+
};
|
|
90
|
+
});
|
|
91
|
+
// If limit was applied and we hit the limit, get total count to indicate truncation
|
|
92
|
+
if (tables.length === effectiveLimit) {
|
|
93
|
+
const countSql = `SELECT count(*) as total
|
|
94
|
+
FROM pg_class c
|
|
95
|
+
LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
96
|
+
WHERE c.relkind IN ('r', 'p')
|
|
97
|
+
AND n.nspname NOT IN ('pg_catalog', 'information_schema')
|
|
98
|
+
${schemaClause}`;
|
|
99
|
+
const countResult = await adapter.executeQuery(countSql);
|
|
100
|
+
const totalCount = Number(countResult.rows?.[0]?.["total"] ?? 0);
|
|
101
|
+
return {
|
|
102
|
+
tables,
|
|
103
|
+
count: tables.length,
|
|
104
|
+
totalCount,
|
|
105
|
+
truncated: totalCount > tables.length,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return { tables, count: tables.length };
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function createConnectionStatsTool(adapter) {
|
|
113
|
+
return {
|
|
114
|
+
name: "pg_connection_stats",
|
|
115
|
+
description: "Get connection statistics by database and state.",
|
|
116
|
+
group: "monitoring",
|
|
117
|
+
inputSchema: z.object({}),
|
|
118
|
+
annotations: readOnly("Connection Stats"),
|
|
119
|
+
icons: getToolIcons("monitoring", readOnly("Connection Stats")),
|
|
120
|
+
handler: async (_params, _context) => {
|
|
121
|
+
const sql = `SELECT datname, state, count(*) as connections
|
|
122
|
+
FROM pg_stat_activity
|
|
123
|
+
WHERE pid != pg_backend_pid()
|
|
124
|
+
GROUP BY datname, state
|
|
125
|
+
ORDER BY datname, state`;
|
|
126
|
+
const result = await adapter.executeQuery(sql);
|
|
127
|
+
const maxResult = await adapter.executeQuery(`SHOW max_connections`);
|
|
128
|
+
const maxConnections = maxResult.rows?.[0]?.["max_connections"];
|
|
129
|
+
const totalResult = await adapter.executeQuery(`SELECT count(*) as total FROM pg_stat_activity`);
|
|
130
|
+
// Coerce connection counts to numbers
|
|
131
|
+
const byDatabaseAndState = (result.rows ?? []).map((row) => {
|
|
132
|
+
const connCount = row["connections"];
|
|
133
|
+
return {
|
|
134
|
+
...row,
|
|
135
|
+
connections: typeof connCount === "number"
|
|
136
|
+
? connCount
|
|
137
|
+
: typeof connCount === "string"
|
|
138
|
+
? parseInt(connCount, 10)
|
|
139
|
+
: 0,
|
|
140
|
+
};
|
|
141
|
+
});
|
|
142
|
+
const totalRaw = totalResult.rows?.[0]?.["total"];
|
|
143
|
+
const maxRaw = maxConnections;
|
|
144
|
+
return {
|
|
145
|
+
byDatabaseAndState,
|
|
146
|
+
totalConnections: typeof totalRaw === "number"
|
|
147
|
+
? totalRaw
|
|
148
|
+
: typeof totalRaw === "string"
|
|
149
|
+
? parseInt(totalRaw, 10)
|
|
150
|
+
: 0,
|
|
151
|
+
maxConnections: typeof maxRaw === "number"
|
|
152
|
+
? maxRaw
|
|
153
|
+
: typeof maxRaw === "string"
|
|
154
|
+
? parseInt(maxRaw, 10)
|
|
155
|
+
: 0,
|
|
156
|
+
};
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
function createReplicationStatusTool(adapter) {
|
|
161
|
+
return {
|
|
162
|
+
name: "pg_replication_status",
|
|
163
|
+
description: "Check replication status and lag.",
|
|
164
|
+
group: "monitoring",
|
|
165
|
+
inputSchema: z.object({}),
|
|
166
|
+
annotations: readOnly("Replication Status"),
|
|
167
|
+
icons: getToolIcons("monitoring", readOnly("Replication Status")),
|
|
168
|
+
handler: async (_params, _context) => {
|
|
169
|
+
const recoveryResult = await adapter.executeQuery(`SELECT pg_is_in_recovery() as is_replica`);
|
|
170
|
+
const isReplica = recoveryResult.rows?.[0]?.["is_replica"];
|
|
171
|
+
if (isReplica === true) {
|
|
172
|
+
const sql = `SELECT
|
|
173
|
+
now() - pg_last_xact_replay_timestamp() as replay_lag,
|
|
174
|
+
pg_last_wal_receive_lsn() as receive_lsn,
|
|
175
|
+
pg_last_wal_replay_lsn() as replay_lsn`;
|
|
176
|
+
const result = await adapter.executeQuery(sql);
|
|
177
|
+
return { role: "replica", ...result.rows?.[0] };
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
const sql = `SELECT client_addr, state, sent_lsn, write_lsn, flush_lsn, replay_lsn,
|
|
181
|
+
now() - backend_start as connection_duration
|
|
182
|
+
FROM pg_stat_replication`;
|
|
183
|
+
const result = await adapter.executeQuery(sql);
|
|
184
|
+
return { role: "primary", replicas: result.rows };
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
function createServerVersionTool(adapter) {
|
|
190
|
+
return {
|
|
191
|
+
name: "pg_server_version",
|
|
192
|
+
description: "Get PostgreSQL server version information.",
|
|
193
|
+
group: "monitoring",
|
|
194
|
+
inputSchema: z.object({}),
|
|
195
|
+
annotations: readOnly("Server Version"),
|
|
196
|
+
icons: getToolIcons("monitoring", readOnly("Server Version")),
|
|
197
|
+
handler: async (_params, _context) => {
|
|
198
|
+
const sql = `SELECT version() as full_version,
|
|
199
|
+
current_setting('server_version') as version,
|
|
200
|
+
current_setting('server_version_num') as version_num`;
|
|
201
|
+
const result = await adapter.executeQuery(sql);
|
|
202
|
+
const row = result.rows?.[0];
|
|
203
|
+
if (!row)
|
|
204
|
+
return row;
|
|
205
|
+
return {
|
|
206
|
+
...row,
|
|
207
|
+
version_num: parseInt(row.version_num, 10),
|
|
208
|
+
};
|
|
209
|
+
},
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
function createShowSettingsTool(adapter) {
|
|
213
|
+
return {
|
|
214
|
+
name: "pg_show_settings",
|
|
215
|
+
description: "Show current PostgreSQL configuration settings. Filter by name pattern or exact setting name. Accepts: pattern, setting, or name parameter.",
|
|
216
|
+
group: "monitoring",
|
|
217
|
+
inputSchema: ShowSettingsSchema,
|
|
218
|
+
annotations: readOnly("Show Settings"),
|
|
219
|
+
icons: getToolIcons("monitoring", readOnly("Show Settings")),
|
|
220
|
+
handler: async (params, _context) => {
|
|
221
|
+
const { pattern, limit } = ShowSettingsSchema.parse(params);
|
|
222
|
+
// Auto-detect if user passed exact name vs LIKE pattern
|
|
223
|
+
// If no wildcards, try exact match first, fall back to LIKE with wildcards
|
|
224
|
+
let whereClause = "";
|
|
225
|
+
let queryParams = [];
|
|
226
|
+
if (pattern !== undefined) {
|
|
227
|
+
if (pattern.includes("%") || pattern.includes("_")) {
|
|
228
|
+
// User specified LIKE pattern explicitly
|
|
229
|
+
whereClause = "WHERE name LIKE $1";
|
|
230
|
+
queryParams = [pattern];
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
// Exact name - try exact match first, or pattern match with auto-wildcards
|
|
234
|
+
whereClause = "WHERE name = $1 OR name LIKE $2";
|
|
235
|
+
queryParams = [pattern, `%${pattern}%`];
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
// Build LIMIT clause if limit is specified
|
|
239
|
+
const limitClause = limit !== undefined && limit > 0 ? ` LIMIT ${String(limit)}` : "";
|
|
240
|
+
const sql = `SELECT name, setting, unit, category, short_desc
|
|
241
|
+
FROM pg_settings
|
|
242
|
+
${whereClause}
|
|
243
|
+
ORDER BY category, name${limitClause}`;
|
|
244
|
+
const result = await adapter.executeQuery(sql, queryParams);
|
|
245
|
+
const rows = result.rows ?? [];
|
|
246
|
+
// If limit was applied, get total count to indicate truncation
|
|
247
|
+
if (limit !== undefined && limit > 0 && rows.length === limit) {
|
|
248
|
+
const countSql = `SELECT count(*) as total FROM pg_settings ${whereClause}`;
|
|
249
|
+
const countResult = await adapter.executeQuery(countSql, queryParams);
|
|
250
|
+
const totalCount = Number(countResult.rows?.[0]?.["total"] ?? 0);
|
|
251
|
+
return {
|
|
252
|
+
settings: rows,
|
|
253
|
+
count: rows.length,
|
|
254
|
+
totalCount,
|
|
255
|
+
truncated: totalCount > rows.length,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
return {
|
|
259
|
+
settings: rows,
|
|
260
|
+
count: rows.length,
|
|
261
|
+
};
|
|
262
|
+
},
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
function createUptimeTool(adapter) {
|
|
266
|
+
return {
|
|
267
|
+
name: "pg_uptime",
|
|
268
|
+
description: "Get server uptime and startup time.",
|
|
269
|
+
group: "monitoring",
|
|
270
|
+
inputSchema: z.object({}),
|
|
271
|
+
annotations: readOnly("Server Uptime"),
|
|
272
|
+
icons: getToolIcons("monitoring", readOnly("Server Uptime")),
|
|
273
|
+
handler: async (_params, _context) => {
|
|
274
|
+
const sql = `SELECT
|
|
275
|
+
pg_postmaster_start_time() as start_time,
|
|
276
|
+
EXTRACT(EPOCH FROM (now() - pg_postmaster_start_time())) as total_seconds`;
|
|
277
|
+
const result = await adapter.executeQuery(sql);
|
|
278
|
+
const row = result.rows?.[0];
|
|
279
|
+
if (!row)
|
|
280
|
+
return row;
|
|
281
|
+
// Parse total seconds into components
|
|
282
|
+
const totalSeconds = Number(row.total_seconds);
|
|
283
|
+
const days = Math.floor(totalSeconds / 86400);
|
|
284
|
+
const hours = Math.floor((totalSeconds % 86400) / 3600);
|
|
285
|
+
const minutes = Math.floor((totalSeconds % 3600) / 60);
|
|
286
|
+
const seconds = Math.floor(totalSeconds % 60);
|
|
287
|
+
const milliseconds = parseFloat(((totalSeconds % 1) * 1000).toFixed(3));
|
|
288
|
+
return {
|
|
289
|
+
start_time: row.start_time,
|
|
290
|
+
uptime: {
|
|
291
|
+
days,
|
|
292
|
+
hours,
|
|
293
|
+
minutes,
|
|
294
|
+
seconds,
|
|
295
|
+
milliseconds,
|
|
296
|
+
},
|
|
297
|
+
};
|
|
298
|
+
},
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
function createRecoveryStatusTool(adapter) {
|
|
302
|
+
return {
|
|
303
|
+
name: "pg_recovery_status",
|
|
304
|
+
description: "Check if server is in recovery mode (replica).",
|
|
305
|
+
group: "monitoring",
|
|
306
|
+
inputSchema: z.object({}),
|
|
307
|
+
annotations: readOnly("Recovery Status"),
|
|
308
|
+
icons: getToolIcons("monitoring", readOnly("Recovery Status")),
|
|
309
|
+
handler: async (_params, _context) => {
|
|
310
|
+
const sql = `SELECT pg_is_in_recovery() as in_recovery,
|
|
311
|
+
CASE WHEN pg_is_in_recovery()
|
|
312
|
+
THEN pg_last_xact_replay_timestamp()
|
|
313
|
+
ELSE NULL
|
|
314
|
+
END as last_replay_timestamp`;
|
|
315
|
+
const result = await adapter.executeQuery(sql);
|
|
316
|
+
return result.rows?.[0];
|
|
317
|
+
},
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Capacity planning analysis
|
|
322
|
+
*/
|
|
323
|
+
function createCapacityPlanningTool(adapter) {
|
|
324
|
+
// Schema with alias support and validation for non-negative days
|
|
325
|
+
const CapacityPlanningSchema = z
|
|
326
|
+
.object({
|
|
327
|
+
projectionDays: z
|
|
328
|
+
.number()
|
|
329
|
+
.optional()
|
|
330
|
+
.describe("Days to project growth (default: 90)"),
|
|
331
|
+
days: z.number().optional().describe("Alias for projectionDays"),
|
|
332
|
+
})
|
|
333
|
+
.refine((data) => {
|
|
334
|
+
const val = data.projectionDays ?? data.days;
|
|
335
|
+
return val === undefined || val >= 0;
|
|
336
|
+
}, {
|
|
337
|
+
message: "Projection days must be a non-negative number",
|
|
338
|
+
path: ["days"],
|
|
339
|
+
})
|
|
340
|
+
.transform((data) => ({
|
|
341
|
+
projectionDays: data.projectionDays ?? data.days ?? 90,
|
|
342
|
+
}));
|
|
343
|
+
return {
|
|
344
|
+
name: "pg_capacity_planning",
|
|
345
|
+
description: "Analyze database growth trends and provide capacity planning forecasts. Note: Growth estimates are based on pg_stat_user_tables counters since last stats reset; accuracy depends on how long stats have been accumulating.",
|
|
346
|
+
group: "monitoring",
|
|
347
|
+
inputSchema: z.object({
|
|
348
|
+
projectionDays: z
|
|
349
|
+
.number()
|
|
350
|
+
.optional()
|
|
351
|
+
.describe("Days to project growth (default: 90)"),
|
|
352
|
+
days: z.number().optional().describe("Alias for projectionDays"),
|
|
353
|
+
}),
|
|
354
|
+
annotations: readOnly("Capacity Planning"),
|
|
355
|
+
icons: getToolIcons("monitoring", readOnly("Capacity Planning")),
|
|
356
|
+
handler: async (params, _context) => {
|
|
357
|
+
const parsed = CapacityPlanningSchema.parse(params ?? {});
|
|
358
|
+
const projectionDays = parsed.projectionDays;
|
|
359
|
+
const [dbSize, tableStats, connStats, statsAge] = await Promise.all([
|
|
360
|
+
adapter.executeQuery(`
|
|
361
|
+
SELECT
|
|
362
|
+
pg_database_size(current_database()) as current_size_bytes,
|
|
363
|
+
pg_size_pretty(pg_database_size(current_database())) as current_size
|
|
364
|
+
`),
|
|
365
|
+
adapter.executeQuery(`
|
|
366
|
+
SELECT
|
|
367
|
+
count(*) as table_count,
|
|
368
|
+
sum(n_live_tup) as total_rows,
|
|
369
|
+
sum(n_tup_ins) as total_inserts,
|
|
370
|
+
sum(n_tup_del) as total_deletes
|
|
371
|
+
FROM pg_stat_user_tables
|
|
372
|
+
`),
|
|
373
|
+
adapter.executeQuery(`
|
|
374
|
+
SELECT
|
|
375
|
+
current_setting('max_connections')::int as max_connections,
|
|
376
|
+
count(*) as current_connections
|
|
377
|
+
FROM pg_stat_activity
|
|
378
|
+
WHERE backend_type = 'client backend'
|
|
379
|
+
`),
|
|
380
|
+
// Get time since stats reset for accurate daily rate calculation
|
|
381
|
+
// Use pg_stat_database.stats_reset (works in all PG versions including 17+)
|
|
382
|
+
// Fall back to server start time if stats_reset is NULL
|
|
383
|
+
adapter.executeQuery(`
|
|
384
|
+
SELECT
|
|
385
|
+
COALESCE(
|
|
386
|
+
(SELECT stats_reset FROM pg_stat_database WHERE datname = current_database()),
|
|
387
|
+
pg_postmaster_start_time()
|
|
388
|
+
) as stats_since,
|
|
389
|
+
EXTRACT(EPOCH FROM (now() - COALESCE(
|
|
390
|
+
(SELECT stats_reset FROM pg_stat_database WHERE datname = current_database()),
|
|
391
|
+
pg_postmaster_start_time()
|
|
392
|
+
))) / 86400.0 as days_of_data
|
|
393
|
+
`),
|
|
394
|
+
]);
|
|
395
|
+
const currentBytes = Number(dbSize.rows?.[0]?.["current_size_bytes"] ?? 0);
|
|
396
|
+
const tableData = tableStats.rows?.[0];
|
|
397
|
+
const connData = connStats.rows?.[0];
|
|
398
|
+
const ageData = statsAge.rows?.[0];
|
|
399
|
+
const totalInserts = Number(tableData?.["total_inserts"] ?? 0);
|
|
400
|
+
const totalDeletes = Number(tableData?.["total_deletes"] ?? 0);
|
|
401
|
+
const netRowGrowth = totalInserts - totalDeletes;
|
|
402
|
+
const totalRows = Number(tableData?.["total_rows"] ?? 1);
|
|
403
|
+
const avgRowSize = currentBytes / Math.max(totalRows, 1);
|
|
404
|
+
// Use actual days of data for accurate daily growth rate
|
|
405
|
+
const daysOfData = Number(ageData?.["days_of_data"] ?? 1);
|
|
406
|
+
const dailyRowGrowth = daysOfData > 0.01 ? netRowGrowth / daysOfData : 0;
|
|
407
|
+
const dailyGrowthBytes = dailyRowGrowth * avgRowSize;
|
|
408
|
+
const projectedGrowthBytes = dailyGrowthBytes * projectionDays;
|
|
409
|
+
const projectedTotalBytes = currentBytes + projectedGrowthBytes;
|
|
410
|
+
// Determine estimation quality based on data availability
|
|
411
|
+
const estimationQuality = daysOfData < 1
|
|
412
|
+
? "Low confidence - less than 1 day of data"
|
|
413
|
+
: daysOfData < 7
|
|
414
|
+
? "Moderate confidence - less than 1 week of data"
|
|
415
|
+
: daysOfData < 30
|
|
416
|
+
? "Good confidence - more than 1 week of data"
|
|
417
|
+
: "High confidence - more than 30 days of data";
|
|
418
|
+
// Coerce numeric fields
|
|
419
|
+
const dbSizeRow = dbSize.rows?.[0];
|
|
420
|
+
const coercedDbSize = dbSizeRow
|
|
421
|
+
? {
|
|
422
|
+
current_size_bytes: typeof dbSizeRow.current_size_bytes === "number"
|
|
423
|
+
? dbSizeRow.current_size_bytes
|
|
424
|
+
: typeof dbSizeRow.current_size_bytes === "string"
|
|
425
|
+
? parseInt(dbSizeRow.current_size_bytes, 10)
|
|
426
|
+
: 0,
|
|
427
|
+
current_size: dbSizeRow.current_size,
|
|
428
|
+
}
|
|
429
|
+
: undefined;
|
|
430
|
+
const tableCountRaw = tableData?.["table_count"];
|
|
431
|
+
const totalRowsRaw = tableData?.["total_rows"];
|
|
432
|
+
const totalInsertsRaw = tableData?.["total_inserts"];
|
|
433
|
+
const totalDeletesRaw = tableData?.["total_deletes"];
|
|
434
|
+
return {
|
|
435
|
+
current: {
|
|
436
|
+
databaseSize: coercedDbSize,
|
|
437
|
+
tableCount: typeof tableCountRaw === "number"
|
|
438
|
+
? tableCountRaw
|
|
439
|
+
: typeof tableCountRaw === "string"
|
|
440
|
+
? parseInt(tableCountRaw, 10)
|
|
441
|
+
: 0,
|
|
442
|
+
totalRows: typeof totalRowsRaw === "number"
|
|
443
|
+
? totalRowsRaw
|
|
444
|
+
: typeof totalRowsRaw === "string"
|
|
445
|
+
? parseInt(totalRowsRaw, 10)
|
|
446
|
+
: 0,
|
|
447
|
+
connections: `${String(Number(connData?.["current_connections"] ?? 0))}/${String(Number(connData?.["max_connections"] ?? 0))}`,
|
|
448
|
+
},
|
|
449
|
+
growth: {
|
|
450
|
+
totalInserts: typeof totalInsertsRaw === "number"
|
|
451
|
+
? totalInsertsRaw
|
|
452
|
+
: typeof totalInsertsRaw === "string"
|
|
453
|
+
? parseInt(totalInsertsRaw, 10)
|
|
454
|
+
: 0,
|
|
455
|
+
totalDeletes: typeof totalDeletesRaw === "number"
|
|
456
|
+
? totalDeletesRaw
|
|
457
|
+
: typeof totalDeletesRaw === "string"
|
|
458
|
+
? parseInt(totalDeletesRaw, 10)
|
|
459
|
+
: 0,
|
|
460
|
+
netRowGrowth,
|
|
461
|
+
daysOfData: parseFloat(daysOfData.toFixed(1)),
|
|
462
|
+
statsSince: ageData?.["stats_since"],
|
|
463
|
+
estimatedDailyRowGrowth: Math.round(dailyRowGrowth),
|
|
464
|
+
estimatedDailyGrowthBytes: Math.round(dailyGrowthBytes),
|
|
465
|
+
estimationQuality,
|
|
466
|
+
},
|
|
467
|
+
projection: {
|
|
468
|
+
days: projectionDays,
|
|
469
|
+
projectedSizeBytes: Math.round(projectedTotalBytes),
|
|
470
|
+
projectedSizePretty: `${(projectedTotalBytes / (1024 * 1024 * 1024)).toFixed(2)} GB`,
|
|
471
|
+
growthPercentage: currentBytes > 0
|
|
472
|
+
? parseFloat(((projectedGrowthBytes / currentBytes) * 100).toFixed(1))
|
|
473
|
+
: 0.0,
|
|
474
|
+
},
|
|
475
|
+
recommendations: [
|
|
476
|
+
projectedTotalBytes > 100 * 1024 * 1024 * 1024
|
|
477
|
+
? "Consider archiving old data or implementing table partitioning"
|
|
478
|
+
: null,
|
|
479
|
+
Number(connData?.["current_connections"] ?? 0) >
|
|
480
|
+
Number(connData?.["max_connections"] ?? 100) * 0.7
|
|
481
|
+
? "Connection usage is high, consider increasing max_connections"
|
|
482
|
+
: null,
|
|
483
|
+
daysOfData < 7
|
|
484
|
+
? "Wait for more data accumulation for more accurate projections"
|
|
485
|
+
: null,
|
|
486
|
+
].filter(Boolean),
|
|
487
|
+
};
|
|
488
|
+
},
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
/**
|
|
492
|
+
* Resource usage analysis
|
|
493
|
+
*/
|
|
494
|
+
function createResourceUsageAnalyzeTool(adapter) {
|
|
495
|
+
return {
|
|
496
|
+
name: "pg_resource_usage_analyze",
|
|
497
|
+
description: "Analyze current resource usage including CPU, memory, and I/O patterns.",
|
|
498
|
+
group: "monitoring",
|
|
499
|
+
inputSchema: z.object({}),
|
|
500
|
+
annotations: readOnly("Resource Usage Analysis"),
|
|
501
|
+
icons: getToolIcons("monitoring", readOnly("Resource Usage Analysis")),
|
|
502
|
+
handler: async (_params, _context) => {
|
|
503
|
+
// Detect PostgreSQL version for checkpoint stats compatibility
|
|
504
|
+
const versionResult = await adapter.executeQuery(`SELECT current_setting('server_version_num')::int as version_num`);
|
|
505
|
+
const versionNum = Number(versionResult.rows?.[0]?.["version_num"] ?? 0);
|
|
506
|
+
const isPg17Plus = versionNum >= 170000;
|
|
507
|
+
const [bgWriter, checkpoints, connections, buffers, activity] = await Promise.all([
|
|
508
|
+
// PG17+ moved buffers_checkpoint to pg_stat_checkpointer as buffers_written
|
|
509
|
+
isPg17Plus
|
|
510
|
+
? adapter.executeQuery(`
|
|
511
|
+
SELECT
|
|
512
|
+
buffers_clean, maxwritten_clean, buffers_alloc
|
|
513
|
+
FROM pg_stat_bgwriter
|
|
514
|
+
`)
|
|
515
|
+
: adapter.executeQuery(`
|
|
516
|
+
SELECT
|
|
517
|
+
buffers_checkpoint, buffers_clean, buffers_backend,
|
|
518
|
+
maxwritten_clean, buffers_alloc
|
|
519
|
+
FROM pg_stat_bgwriter
|
|
520
|
+
`),
|
|
521
|
+
// PG17+ moved checkpoint stats to pg_stat_checkpointer with renamed columns
|
|
522
|
+
isPg17Plus
|
|
523
|
+
? adapter.executeQuery(`
|
|
524
|
+
SELECT
|
|
525
|
+
num_timed as checkpoints_timed,
|
|
526
|
+
num_requested as checkpoints_req,
|
|
527
|
+
write_time as checkpoint_write_time,
|
|
528
|
+
sync_time as checkpoint_sync_time,
|
|
529
|
+
buffers_written as buffers_checkpoint
|
|
530
|
+
FROM pg_stat_checkpointer
|
|
531
|
+
`)
|
|
532
|
+
: adapter.executeQuery(`
|
|
533
|
+
SELECT
|
|
534
|
+
checkpoints_timed, checkpoints_req,
|
|
535
|
+
checkpoint_write_time, checkpoint_sync_time
|
|
536
|
+
FROM pg_stat_bgwriter
|
|
537
|
+
`),
|
|
538
|
+
adapter.executeQuery(`
|
|
539
|
+
SELECT
|
|
540
|
+
state, wait_event_type, wait_event,
|
|
541
|
+
count(*) as count
|
|
542
|
+
FROM pg_stat_activity
|
|
543
|
+
WHERE backend_type = 'client backend'
|
|
544
|
+
GROUP BY state, wait_event_type, wait_event
|
|
545
|
+
`),
|
|
546
|
+
adapter.executeQuery(`
|
|
547
|
+
SELECT
|
|
548
|
+
sum(heap_blks_read) as heap_reads,
|
|
549
|
+
sum(heap_blks_hit) as heap_hits,
|
|
550
|
+
sum(idx_blks_read) as index_reads,
|
|
551
|
+
sum(idx_blks_hit) as index_hits
|
|
552
|
+
FROM pg_statio_user_tables
|
|
553
|
+
`),
|
|
554
|
+
adapter.executeQuery(`
|
|
555
|
+
SELECT
|
|
556
|
+
count(*) FILTER (WHERE state = 'active') as active_queries,
|
|
557
|
+
count(*) FILTER (WHERE state = 'idle') as idle_connections,
|
|
558
|
+
count(*) FILTER (WHERE wait_event_type = 'Lock') as lock_waiting,
|
|
559
|
+
count(*) FILTER (WHERE wait_event_type = 'IO') as io_waiting
|
|
560
|
+
FROM pg_stat_activity
|
|
561
|
+
WHERE backend_type = 'client backend'
|
|
562
|
+
`),
|
|
563
|
+
]);
|
|
564
|
+
const bufferData = buffers.rows?.[0];
|
|
565
|
+
const heapHits = Number(bufferData?.["heap_hits"] ?? 0);
|
|
566
|
+
const heapReads = Number(bufferData?.["heap_reads"] ?? 0);
|
|
567
|
+
const indexHits = Number(bufferData?.["index_hits"] ?? 0);
|
|
568
|
+
const indexReads = Number(bufferData?.["index_reads"] ?? 0);
|
|
569
|
+
// Calculate hit rates
|
|
570
|
+
const heapHitRate = heapHits + heapReads > 0
|
|
571
|
+
? (heapHits / (heapHits + heapReads)) * 100
|
|
572
|
+
: null;
|
|
573
|
+
const indexHitRate = indexHits + indexReads > 0
|
|
574
|
+
? (indexHits / (indexHits + indexReads)) * 100
|
|
575
|
+
: null;
|
|
576
|
+
// Interpret buffer hit rates
|
|
577
|
+
const getHitRateAnalysis = (rate, type) => {
|
|
578
|
+
if (rate === null)
|
|
579
|
+
return `No ${type} activity recorded yet - run some queries first`;
|
|
580
|
+
if (rate >= 99)
|
|
581
|
+
return `Excellent (${rate.toFixed(2)}%) - nearly all ${type} data served from cache`;
|
|
582
|
+
if (rate >= 95)
|
|
583
|
+
return `Good (${rate.toFixed(2)}%) - most ${type} reads from cache`;
|
|
584
|
+
if (rate >= 80)
|
|
585
|
+
return `Fair (${rate.toFixed(2)}%) - consider increasing shared_buffers`;
|
|
586
|
+
return `Poor (${rate.toFixed(2)}%) - significant disk I/O; increase shared_buffers or optimize queries`;
|
|
587
|
+
};
|
|
588
|
+
// Helper to coerce value to number
|
|
589
|
+
const toNum = (val) => typeof val === "number"
|
|
590
|
+
? val
|
|
591
|
+
: typeof val === "string"
|
|
592
|
+
? parseInt(val, 10)
|
|
593
|
+
: 0;
|
|
594
|
+
// Coerce backgroundWriter fields
|
|
595
|
+
const bgWriterRaw = bgWriter.rows?.[0];
|
|
596
|
+
const coercedBgWriter = bgWriterRaw
|
|
597
|
+
? {
|
|
598
|
+
buffers_clean: toNum(bgWriterRaw["buffers_clean"]),
|
|
599
|
+
maxwritten_clean: toNum(bgWriterRaw["maxwritten_clean"]),
|
|
600
|
+
buffers_alloc: toNum(bgWriterRaw["buffers_alloc"]),
|
|
601
|
+
...(bgWriterRaw["buffers_checkpoint"] !== undefined && {
|
|
602
|
+
buffers_checkpoint: toNum(bgWriterRaw["buffers_checkpoint"]),
|
|
603
|
+
}),
|
|
604
|
+
...(bgWriterRaw["buffers_backend"] !== undefined && {
|
|
605
|
+
buffers_backend: toNum(bgWriterRaw["buffers_backend"]),
|
|
606
|
+
}),
|
|
607
|
+
}
|
|
608
|
+
: undefined;
|
|
609
|
+
// Coerce checkpoints fields
|
|
610
|
+
const checkpointsRaw = checkpoints.rows?.[0];
|
|
611
|
+
const coercedCheckpoints = checkpointsRaw
|
|
612
|
+
? {
|
|
613
|
+
checkpoints_timed: toNum(checkpointsRaw["checkpoints_timed"]),
|
|
614
|
+
checkpoints_req: toNum(checkpointsRaw["checkpoints_req"]),
|
|
615
|
+
checkpoint_write_time: toNum(checkpointsRaw["checkpoint_write_time"]),
|
|
616
|
+
checkpoint_sync_time: toNum(checkpointsRaw["checkpoint_sync_time"]),
|
|
617
|
+
...(checkpointsRaw["buffers_checkpoint"] !== undefined && {
|
|
618
|
+
buffers_checkpoint: toNum(checkpointsRaw["buffers_checkpoint"]),
|
|
619
|
+
}),
|
|
620
|
+
}
|
|
621
|
+
: undefined;
|
|
622
|
+
// Coerce connectionDistribution count fields
|
|
623
|
+
const coercedConnDist = (connections.rows ?? []).map((row) => ({
|
|
624
|
+
...row,
|
|
625
|
+
count: toNum(row["count"]),
|
|
626
|
+
}));
|
|
627
|
+
// Coerce activity fields
|
|
628
|
+
const activityRaw = activity.rows?.[0];
|
|
629
|
+
const coercedActivity = activityRaw
|
|
630
|
+
? {
|
|
631
|
+
active_queries: toNum(activityRaw["active_queries"]),
|
|
632
|
+
idle_connections: toNum(activityRaw["idle_connections"]),
|
|
633
|
+
lock_waiting: toNum(activityRaw["lock_waiting"]),
|
|
634
|
+
io_waiting: toNum(activityRaw["io_waiting"]),
|
|
635
|
+
}
|
|
636
|
+
: undefined;
|
|
637
|
+
return {
|
|
638
|
+
backgroundWriter: coercedBgWriter,
|
|
639
|
+
checkpoints: coercedCheckpoints,
|
|
640
|
+
connectionDistribution: coercedConnDist,
|
|
641
|
+
bufferUsage: {
|
|
642
|
+
heap_reads: heapReads,
|
|
643
|
+
heap_hits: heapHits,
|
|
644
|
+
index_reads: indexReads,
|
|
645
|
+
index_hits: indexHits,
|
|
646
|
+
heapHitRate: heapHitRate !== null ? heapHitRate.toFixed(2) + "%" : "N/A",
|
|
647
|
+
indexHitRate: indexHitRate !== null ? indexHitRate.toFixed(2) + "%" : "N/A",
|
|
648
|
+
},
|
|
649
|
+
activity: coercedActivity,
|
|
650
|
+
analysis: {
|
|
651
|
+
heapCachePerformance: getHitRateAnalysis(heapHitRate, "heap"),
|
|
652
|
+
indexCachePerformance: getHitRateAnalysis(indexHitRate, "index"),
|
|
653
|
+
checkpointPressure: (coercedCheckpoints?.checkpoints_req ?? 0) >
|
|
654
|
+
(coercedCheckpoints?.checkpoints_timed ?? 0)
|
|
655
|
+
? "HIGH - More forced checkpoints than scheduled"
|
|
656
|
+
: "Normal",
|
|
657
|
+
ioPattern: (coercedActivity?.io_waiting ?? 0) > 0
|
|
658
|
+
? "Some queries waiting on I/O"
|
|
659
|
+
: "No I/O wait bottlenecks detected",
|
|
660
|
+
lockContention: (coercedActivity?.lock_waiting ?? 0) > 0
|
|
661
|
+
? `${String(coercedActivity?.lock_waiting ?? 0)} queries waiting on locks`
|
|
662
|
+
: "No lock contention",
|
|
663
|
+
},
|
|
664
|
+
};
|
|
665
|
+
},
|
|
666
|
+
};
|
|
667
|
+
}
|
|
668
|
+
/**
|
|
669
|
+
* Alert threshold recommendations (informational)
|
|
670
|
+
*/
|
|
671
|
+
function createAlertThresholdSetTool(_adapter) {
|
|
672
|
+
return {
|
|
673
|
+
name: "pg_alert_threshold_set",
|
|
674
|
+
description: "Get recommended alert thresholds for monitoring key database metrics. Note: This is informational only - returns suggested warning/critical thresholds for external monitoring tools. Does not configure alerts in PostgreSQL itself.",
|
|
675
|
+
group: "monitoring",
|
|
676
|
+
inputSchema: z.object({
|
|
677
|
+
metric: z
|
|
678
|
+
.enum([
|
|
679
|
+
"connection_usage",
|
|
680
|
+
"cache_hit_ratio",
|
|
681
|
+
"replication_lag",
|
|
682
|
+
"dead_tuples",
|
|
683
|
+
"long_running_queries",
|
|
684
|
+
"lock_wait_time",
|
|
685
|
+
])
|
|
686
|
+
.optional()
|
|
687
|
+
.describe("Specific metric to get thresholds for, or all if not specified"),
|
|
688
|
+
}),
|
|
689
|
+
annotations: readOnly("Get Alert Thresholds"),
|
|
690
|
+
icons: getToolIcons("monitoring", readOnly("Get Alert Thresholds")),
|
|
691
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
692
|
+
handler: async (params, _context) => {
|
|
693
|
+
// Schema with validated enum for metric
|
|
694
|
+
const AlertThresholdSchema = z.object({
|
|
695
|
+
metric: z
|
|
696
|
+
.enum([
|
|
697
|
+
"connection_usage",
|
|
698
|
+
"cache_hit_ratio",
|
|
699
|
+
"replication_lag",
|
|
700
|
+
"dead_tuples",
|
|
701
|
+
"long_running_queries",
|
|
702
|
+
"lock_wait_time",
|
|
703
|
+
])
|
|
704
|
+
.optional()
|
|
705
|
+
.describe("Specific metric to get thresholds for, or all if not specified"),
|
|
706
|
+
});
|
|
707
|
+
const parsed = AlertThresholdSchema.parse(params ?? {});
|
|
708
|
+
const thresholds = {
|
|
709
|
+
connection_usage: {
|
|
710
|
+
warning: "70%",
|
|
711
|
+
critical: "90%",
|
|
712
|
+
description: "Percentage of max_connections in use",
|
|
713
|
+
},
|
|
714
|
+
cache_hit_ratio: {
|
|
715
|
+
warning: "< 95%",
|
|
716
|
+
critical: "< 80%",
|
|
717
|
+
description: "Buffer cache hit ratio - lower is worse",
|
|
718
|
+
},
|
|
719
|
+
replication_lag: {
|
|
720
|
+
warning: "> 1 minute",
|
|
721
|
+
critical: "> 5 minutes",
|
|
722
|
+
description: "Replication lag from primary to replica",
|
|
723
|
+
},
|
|
724
|
+
dead_tuples: {
|
|
725
|
+
warning: "> 10% of live tuples",
|
|
726
|
+
critical: "> 25% of live tuples",
|
|
727
|
+
description: "Dead tuples indicating need for VACUUM",
|
|
728
|
+
},
|
|
729
|
+
long_running_queries: {
|
|
730
|
+
warning: "> 5 minutes",
|
|
731
|
+
critical: "> 30 minutes",
|
|
732
|
+
description: "Queries running longer than threshold",
|
|
733
|
+
},
|
|
734
|
+
lock_wait_time: {
|
|
735
|
+
warning: "> 30 seconds",
|
|
736
|
+
critical: "> 5 minutes",
|
|
737
|
+
description: "Time spent waiting for locks",
|
|
738
|
+
},
|
|
739
|
+
};
|
|
740
|
+
if (parsed.metric && thresholds[parsed.metric]) {
|
|
741
|
+
return {
|
|
742
|
+
metric: parsed.metric,
|
|
743
|
+
threshold: thresholds[parsed.metric],
|
|
744
|
+
};
|
|
745
|
+
}
|
|
746
|
+
return {
|
|
747
|
+
thresholds,
|
|
748
|
+
note: "These are recommended starting thresholds. Adjust based on your specific workload and requirements.",
|
|
749
|
+
};
|
|
750
|
+
},
|
|
751
|
+
};
|
|
752
|
+
}
|
|
753
|
+
//# sourceMappingURL=monitoring.js.map
|