# v1.2.0 - Stabilization & Quality Hardening
**Release Date:** February 10, 2026
## Highlights
π‘οΈ **Object existence verification** for convenience tools, **metadata caching** for high-frequency schema queries, **systematic eslint-disable elimination**, and **60+ bug fixes** across vector, kcache, partitioning, PostGIS, and text search tool groups.
## What's New
### Object Existence Verification (P154)
Convenience tools (`pg_count`, `pg_exists`, `pg_upsert`, `pg_batch_insert`, `pg_truncate`) and 11 vector tools now perform pre-flight table/column existence checks before executing queries. Returns high-signal error messages (e.g., `Table "public.nonexistent" does not exist`) instead of raw PostgreSQL errors.
### New Parameters
- **`pg_list_tables` `exclude`** β Filter out extension/system schemas (e.g., `exclude: ['cron', 'topology', 'partman']`)
- **`--server-host` CLI argument** β Bind address configuration for containerized deployments (default: `localhost`, Dockerfile defaults to `0.0.0.0`)
- **`pg_analyze_workload_indexes` `queryPreviewLength`** β Configurable max characters for query preview (default: 200)
- **`pg_kcache_top_cpu` / `pg_kcache_top_io` `queryPreviewLength`** β Configurable query preview length (default: 100, max: 500)
- **`pg_regexp_match` / `pg_like_search` default limit** β Both tools now default to `LIMIT 100`, preventing unbounded result sets
- **`pg_geo_transform` SRID auto-detection** β `fromSrid` is now optional; auto-detects source SRID from catalog tables
## Bug Fixes
### Response Consistency
- **`pg_upsert`** β Removed `sql` field from default response to prevent SQL leakage and reduce token usage
- **`pg_ltree_convert_column`** β Already-ltree response now includes `table` and `previousType` fields
- **`pg_ltree_create_index`** β Already-exists response now includes `table`, `column`, and `indexType` fields
- **`pg_drop_schema`** β Renamed response key `dropped` β `schema` to align with sibling drop tools
- **`pg_list_tables` / `pg_describe_table` `rowCount`** β Returns `0` for empty tables instead of being silently omitted
- **`pg_stat_statements`** β Response now includes `count` field, consistent with all other paginated performance tools
- **`pg_write_query`** β DDL statements no longer fail output schema validation; `rowsAffected` defaults to `0`
### Correctness
- **`pg_kcache_top_io`** β Now filters by type-specific I/O column when `ioType` is `reads` or `writes`
- **Kcache race condition guard** β All 4 kcache count-then-query tools use `Math.max(totalCount, rowCount)` to prevent misleading `truncated` flags
- **`pg_kcache_query_stats` / `pg_kcache_resource_analysis`** β Default limit reduced from 50 to 20 (use `limit: 50` to restore)
- **`pg_pgcrypto_gen_random_uuid` `count` parameter** β Now visible to MCP clients via Split Schema pattern
- **`pg_buffer` / `pg_geo_transform` truncation** β Correctly return `truncated: true` + `totalCount` for explicit limits
- **`pg_hybrid_search` tsvector support** β `textColumn` auto-detects column type; tsvector columns used directly without wrapping
- **`pg_vector_batch_insert` tool filtering** β Fixed missing registration in `ToolConstants.ts` tool filtering registry
- **`pg_list_functions` extension aliases** β `pgvector`, `partman`, `fuzzymatch`, `fuzzy` aliases now correctly filter extension functions
- **`runningQueries` Code Mode alias** β Now correctly routes to `longRunningQueries()` instead of `statActivity()`
### Partitioning
- **`pg_create_partition` / `pg_attach_partition` / `pg_detach_partition`** β Return structured `{success: false, error}` instead of raw PostgreSQL errors for missing/non-partitioned tables
## Performance
- **Metadata caching** β `listTables` and `describeTable` now use TTL-based metadata cache (default 30s, configurable via `METADATA_CACHE_TTL_MS`), reducing database load for repeated schema queries
## Code Quality
- **Systematic `eslint-disable` elimination** β Removed ~43 `eslint-disable` comments. Only 7 justified suppressions remain (5 `no-deprecated` for SDK limitations, 2 `no-control-regex` for security patterns), all with inline justification
- Refactored `require-await` (~30 handlers), `no-misused-promises`, `no-unused-vars`, and `no-unsafe-argument` suppressions with proper fixes
## Documentation
- **Code Mode token efficiency guidance** β Added recommendations to README, Docker README, and Code Mode wiki
- **Tool count synchronization** β Reconciled counts across `ToolConstants.ts`, README, Docker README, and 7 wiki pages (total: 206 tools)
- **Docker README corrections** β Fixed 6 prompt names, 1 resource URI, and added 3 missing extensions
- **Code Mode wiki expansion** β Full API documentation for all 19 `pg.{group}.{method}()` groups
- **ServerInstructions.ts** β Comprehensive updates for response structures, parameter descriptions, help() consistency, and PostGIS code mode aliases
- **Troubleshooting wiki** β Fixed `pg_cancel_query` β `pg_cancel_backend` tool name reference
## Dependencies
- `@modelcontextprotocol/sdk` 1.25.3 β 1.26.0
- `@types/node` 25.1.0 β 25.2.3
- `commander` 14.0.2 β 14.0.3
- `globals` 17.2.0 β 17.3.0
- `pg` 8.17.2 β 8.18.0
- `typescript-eslint` 8.54.0 β 8.55.0
- Skipped `eslint` 10.0.0 β major version blocked by `typescript-eslint` v8.55
## Links
- [GitHub Repository](https://github.com/neverinfamous/postgresql-mcp)
- [Docker Hub](https://hub.docker.com/r/writenotenow/postgres-mcp)
- [npm Package](https://www.npmjs.com/package/@neverinfamous/postgres-mcp)
- [Full Changelog](https://github.com/neverinfamous/postgresql-mcp/blob/master/CHANGELOG.md)