amu-pgvector MCP server
Lineage-gated agent memory tools on Postgres + pgvector, enforced by row-level security.
0 stars2.6k downloads/wk
Reviews
Write oneNobody has reviewed amu-pgvector yet.
If you have run it, two minutes of your experience saves the next person an afternoon.
amu-pgvector tools (3)
write = sends, deletes, buys or postsRead from the package source without running it. The installed server may list more.
amu_check_conflictamu_recordamu_search
Public scan report
scanner v0.1.10 · 2026-10-01 · same rubric, same numbers if you re-run it
- Code scan6 source files scanned25/25
- –Live reliabilityno gateway calls yet and no remote to proben/a
- –Tool poisoningtools not inspected (local package is not executed); not countedn/a
- Auth qualitystatic API keys via environment variables6/15
- Maintenancelast push 0 days ago15/15
- Maintainer identityregistry namespace matches repository owner6/10
Install amu-pgvector in Claude Code, Cursor or VS Code
claude mcp add amu-pgvector -- uvx amu-pgvector
What the publisher says
From the amu-pgvector repository's README, as published. We do not edit it. Read it on GitHub
amu-pgvector
Reference implementation of Lineage-Aware Memory Governance (Sangaraju & Vissa, IEEE Access, 10.1109/ACCESS.2026.3730363) on PostgreSQL + pgvector.
The problem
Say Finance computes avg(income) for a customer segment and caches the result so the next agent that asks the same question doesn't have to recompute it. Later, a Marketing agent asks a semantically similar question -- "what's the average customer income by segment?" -- and a naive shared memory, gated only on the metric's name or content tags, serves back Finance's cached result. Marketing was never permitted to see income. The result itself doesn't look like income -- it's a number -- but it was derived from a column Marketing isn't permitted to touch, and nothing about matching on metric name or content catches that. That's the leak this project closes: gating reuse on how a result was derived, not on what it looks like.
60-second quickstart
git clone https://github.com/sangaraju1988/amu-pgvector.git
cd amu-pgvector
docker compose up -d
psql -h localhost -p 5433 -U amu_owner -d amu_dev -f sql/amu_pgvector.sql
# password: amu_owner_passworduv sync --all-packages --all-extras # or: pip install amu-pgvectorfrom amu_pgvector import AMUStore
from amu_pgvector.embeddings import fake_embedder
DSN = "postgresql://amu_owner:amu_owner_password@localhost:5433/amu_dev"
embed = fake_embedder(dim=1536) # swap for a real embedding model in production
admin = AMUStore(DSN)
admin.register_sensitive_column("income")
admin.grant_department_permission("Finance", "income")
admin.create_agent_role("finance_agent", "Finance", "finance_pw")
admin.create_agent_role("marketing_agent", "Marketing", "marketing_pw")
admin.record(
"SELECT avg(income) FROM customers",
{"avg": 82000},
metric_name="avg_income",
description="average customer income",
owner_department="Finance",
embed_fn=embed,
)
finance_dsn = "postgresql://finance_agent:finance_pw@localhost:5433/amu_dev"
marketing_dsn = "postgresql://marketing_agent:marketing_pw@localhost:5433/amu_dev"
AMUStore(finance_dsn).search("average customer income", k=5, embed_fn=embed)
# -> [SearchResult(metric_name='avg_income', ...)]
AMUStore(marketing_dsn).search("average customer income", k=5, embed_fn=embed)
# -> [] -- Marketing was never granted `income`, so Postgres itself
# never returns the row, regardless of how the query Every line above was run against this exact repo before being written here (see docs/design.md for what a from-scratch install actually looks like). amuowner/amuowner_password is the docker-compose default -- change it for anything beyond local development.
How the gate works
amu.memoryunits is a normal Postgres table with FORCE ROW LEVEL SECURITY enabled. Every write goes through a trigger that extracts the lineage of the SQL that actually produced the cached result (via amu-governance's sqllineage module -- not self-reported by the agent), closes it over any registered materialized-view/derived-table edges, and computes S(a): the set of sensitive columns that lineage actually touches. A SELECT policy enforces S(a) ⊆ P(d) -- the row is visible only if every column in S(a) is in the requesting role's permitted set P(d) -- for every query against the table, from every client: raw SQL, amu.search(), the Python client, the LangChain integration, and the MCP server all go through the same policy, because it's the table's policy, not any one client's filter.
Shortened. The full README is on GitHub.
Nothing above is checked by us. What we check is on the safety report.
amu-pgvector: common questions
- Is amu-pgvector MCP server safe?
- Mostly: it is graded B (80/100). Read the amu-pgvector safety report
- How do I install amu-pgvector?
- It runs on your machine. Copy the Claude Code, Cursor, VS Code or Claude Desktop config from the install section.
- Does amu-pgvector need an API key?
- Yes. The registry entry asks for
AMU_PGVECTOR_DSN. - Is amu-pgvector maintained?
- The last commit was 13 days ago (2026-09-30). The latest release is v0.1.3.
- What can I use instead of amu-pgvector?
- Servers from other publishers that do the same job: Memory Vault MCP server, hmem — Humanlike Memory for AI Agents MCP server and Memtether MCP server. Compare all amu-pgvector alternatives.
Alternatives to amu-pgvector
Same job from other publishers: the closest match first, then the best rated.
- Memory VaultLocal-first AI memory layer with hybrid search. Postgres + pgvector. Self-hosted, MIT.not reviewedGrowingB
- hmem — Humanlike Memory for AI AgentsPersistent 5-level hierarchical memory for AI agents. SQLite-backed, lazy-loaded.not reviewedGrowingA
- MemtetherCross-client AI memory hub: agents share one SQLite memory.db via file-level pointers.not reviewedGrowingA
- Run402x402 pay-per-call infra for agents: $0.03 image generation, Postgres, auth, storage, functions.not reviewedEstablishedB
- NeonOfficial Neon MCP server for managing Neon projects and Lakebase Postgres databases.not reviewedEstablishedA