
pgvector
io.github.mittalpkPublished by GitHub account mittalpkv0.1.0Updated Nov 3, 2026
Similarity search, hybrid search, and index management for pgvector-backed PostgreSQL tables
Overview
MCP server for pgvector-backed PostgreSQL tables: similarity and hybrid search, embedding upserts, and ANN index management.
- What you can do
- Discover vector columns and inspect table columns, indexes and row counts
- Run k-NN similarity search with cosine, L2 or inner product metrics and structured metadata filters
- Blend vector similarity with Postgres full-text search in a weighted hybrid search
- Insert or update a row's embedding and metadata
- Create HNSW or IVFFlat indexes with tunable parameters and EXPLAIN ANALYZE a similarity query to confirm the index is used
- When to use it
- Useful when an assistant needs to query or maintain embedding tables stored in PostgreSQL with pgvector, for example semantic retrieval over existing data or tuning approximate-nearest-neighbor indexes, without hand-writing SQL.
- Requirements
- Runs locally as a Python package (uvx or pip install mcp-server-pgvector). Needs a PostgreSQL database with the pgvector extension and a connection string in DATABASE_URL (or PGVECTOR_DATABASE_URL). Optional MCP_PGVECTOR_READ_ONLY and MCP_PGVECTOR_COMMAND_TIMEOUT_SECONDS settings.
Installation
In SourceWeft
- Open pgvector in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
mcp-server-pgvector
An MCP server that gives LLM agents first-class access to pgvector-backed embedding tables in PostgreSQL: similarity search, hybrid (vector + full-text) search, upserts, and HNSW/IVFFlat index management.
Generic Postgres MCP servers expose raw SQL or schema introspection; this one speaks pgvector specifically — nearest-neighbor search, distance metrics, and ANN index tuning are first-class tools, not something the model has to hand-write SQL for.
Tools
Safety
- Every table/column name is validated against
information_schema/pg_catalogbefore being interpolated into SQL — an LLM can only ever reference identifiers that already exist. Values are always bound parameters. - Metadata filters are a closed
{column, op, value}allowlist, not a raw SQL fragment. - Set
MCP_PGVECTOR_READ_ONLY=trueto disableupsert_embeddingandcreate_vector_index, leaving only read/search tools available — useful when pointing the server at a production database. - Every query runs with a per-command timeout (
MCP_PGVECTOR_COMMAND_TIMEOUT_SECONDS, default 30s) so one expensive query can't occupy a pool connection — and stall every other caller — indefinitely. Set it to0to disable.
Installation
Or with pip:
Configuration
The server reads its connection string from DATABASE_URL (or PGVECTOR_DATABASE_URL):
Production readiness
Covered:
- Identifier-safe SQL (every table/column checked against
pg_catalogbefore use) and a closed filter-operator allowlist — no path from tool arguments to raw SQL. - Per-query timeout, so one runaway query can't monopolize the (small, 5-connection) pool.
- 60+ tests, including dimension-mismatch and injection-attempt regressions, run in CI on every
push/PR against a real pgvector container across Python 3.10–3.13. A separate CI job builds the
package and runs
twine checkon the result. - Connection failures surface as plain
ConnectionRefusedError/asyncpgexceptions — verified these don't leak the DSN's credentials into error text.
Known limitations, honestly:
- No per-tool authorization — access control is whatever the Postgres role in
DATABASE_URLcan do. If you need different agents to have different permissions, give them different connection strings backed by different Postgres roles, not different server instances of this same DSN. hybrid_search's full-text side is hardcoded to Postgres's'english'text search configuration; there's no parameter to change it yet.- No structured logging — failures are exceptions surfaced through the MCP error channel, not written to a log you can tail. Fine for a single-user desktop MCP client, a real gap if you're running this as a shared service.
- The connection pool is fixed at 1–5 connections and isn't configurable via environment variable yet.
Development
Contributing
See CONTRIBUTING.md. See CHANGELOG.md for release history.
License
MIT — see LICENSE.
Source: README.md at commit f4e086d
Tools
0Version history
1- v0.1.0LatestSep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts