{"slug": "one-mcp-server-two-ai-clients-wiring-actian-vectorai-db-into-claude-and-cursor", "title": "One MCP Server, Two AI Clients: Wiring Actian VectorAI DB Into Claude and Cursor", "summary": "A developer built a single MCP server in about 230 lines of Python to connect Actian VectorAI DB to both Claude and Cursor, demonstrating the protocol's promise of one server for any AI client. The server exposes six tools, handles embeddings locally, and was verified at the protocol layer, with the build published on GitHub.", "body_md": "**MCP promises one server, any AI client. I put that to the test by wiring Actian VectorAI DB up to Claude and Cursor with a single ~230-line Python file, and verified every claim about it at the protocol layer rather than taking anything on faith. Build's public on GitHub.**\n\nEvery vector database has its own SDK. Every AI assistant has its own plugin format. Want Claude *and* Cursor to search your vector DB? That's normally two separate integrations, and a third tool next month makes three.\n\nMCP removes that last part. It's an open protocol (originally from Anthropic) that lets any MCP-aware client (Claude Desktop, Claude Code, Cursor, whatever comes next) talk to the *same* server over a standard interface. Write the server once, every client gets it for free.\n\nI built a small MCP server for **Actian VectorAI DB**, a portable, local-first vector database, to see if that promise holds up.\n\nSix tools, ~230 lines of Python, one file:\n\n| Tool | What it does |\n|---|---|\n`create_collection` |\nIdempotently creates a 384-dim collection with a chosen distance metric |\n`ingest_documents` |\nEmbeds text and upserts it, payload included |\n`search` |\nEmbeds a query, returns top-k ranked hits |\n`list_collections` |\nLists what's in the instance |\n`get_collection_info` |\nPoint count, status, vector config |\n`delete_collection` |\nDeletes it, no confirmation step |\n\nThe one design decision I'd defend to the death: **the LLM never sees a vector.** Every tool's input and output is plain strings, lists, and JSON dicts. The embedding happens inside the server process (`sentence-transformers`\n\nrunning `all-MiniLM-L6-v2`\n\nlocally on CPU), so Claude or Cursor only ever reasons about text and decides when to call `search`\n\n. LLMs are bad at generating 384 floating point numbers that mean something; they're good at calling a function with a `query: str`\n\nargument.\n\n``` php\nClaude / Cursor  <--stdio JSON-RPC-->  server.py (FastMCP)  <--gRPC-->  Actian VectorAI DB\n                                              │\n                                     sentence-transformers\n                                     (local, 384-dim embeddings)\n```\n\nIt's a reference implementation, sized for a stage: a single global DB, running locally, built around a demo-sized dataset (six sentences, for this build).\n\nBefore locking in `get_collection_info`\n\n, I checked what the response looked like against the installed `actian-vectorai-client==1.0.2`\n\n, rather than coding purely off memory. Point count and status come back directly from that call, but not vector config (size/distance), so `get_collection_info`\n\npulls those two things from two places: gRPC for point count and status, and the REST API (port 6573) for vector config.\n\nFirst, `examples/demo.py`\n\nrunning straight against the live DB, plain Python calling the SDK directly: created a collection, ingested 6 FAQ sentences, searched, and got the right result back.\n\nThen `fastmcp.Client`\n\n, to drive `server.py`\n\nover stdio JSON-RPC, the same path Claude and Cursor use. This is what confirmed `get_collection_info`\n\nwas pulling the right data from both the gRPC and REST calls, something that only became visible once data flowed through the full protocol path.\n\nI also pointed the server at a dead port on purpose, just to confirm every tool failed with a plain-English message instead of a stack trace.\n\nAt the OS process level, I confirmed Cursor itself had spawned the MCP server subprocess after reloading, proof the config was picked up and working.\n\nAnd finally, calling `search`\n\nthrough that MCP connection and getting back `{\"text\": \"Submissions close Sunday at 9am.\"}`\n\nfor \"submission deadline for the hackathon,\" score `0.4227`\n\n.\n\nCreate a collection called `notes`\n\n.\n\n`Collection 'notes' is ready (distance=cosine, dim=384).`\n\nAdd these three facts to `notes`\n\n: submissions close Sunday at 9am, first prize is $2,000, teams can have 2-5 members.\n\n`Inserted 3 document(s) into collection 'notes'.`\n\nWhat's the submission deadline?\n\n`[{\"score\": 0.4777, \"payload\": {\"text\": \"Submissions close Sunday at 9am.\"}}]`\n\n, which the assistant turns into \"the deadline is Sunday at 9am.\"\n\nThen the point of the whole exercise: ask the same question in Cursor, switch windows, ask it again in Claude Desktop. Only the client-specific config block differs between the two.\n\nI picked Actian VectorAI DB for being local-first, no cloud dependency, which mattered for a live demo on conference wifi. The Community Edition is free and was enough for this entire build. If you want to spin it up yourself, the [Docker setup instructions](https://docs.vectoraidb.actian.com/home/installation/instructions) cover both a plain `docker run`\n\nand a `docker-compose.yml`\n\n.\n\nThe bigger point, though: one small MCP server, any MCP client, natural language in, semantic search out, no vectors ever exposed to the model. If you've got an SDK and a thing worth calling from an LLM, this is basically the whole recipe. You can find the repo [here](https://github.com/gerimate/vectorai-mcp-server).", "url": "https://wpnews.pro/news/one-mcp-server-two-ai-clients-wiring-actian-vectorai-db-into-claude-and-cursor", "canonical_source": "https://dev.to/gerimate/one-mcp-server-two-ai-clients-wiring-actian-vectorai-db-into-claude-and-cursor-432j", "published_at": "2026-08-29 13:54:56+00:00", "updated_at": "2026-08-29 14:19:01.792943+00:00", "lang": "en", "topics": ["developer-tools", "ai-infrastructure", "ai-tools"], "entities": ["Actian VectorAI DB", "Claude", "Cursor", "Anthropic", "FastMCP", "sentence-transformers", "all-MiniLM-L6-v2", "GitHub"], "alternates": {"html": "https://wpnews.pro/news/one-mcp-server-two-ai-clients-wiring-actian-vectorai-db-into-claude-and-cursor", "markdown": "https://wpnews.pro/news/one-mcp-server-two-ai-clients-wiring-actian-vectorai-db-into-claude-and-cursor.md", "text": "https://wpnews.pro/news/one-mcp-server-two-ai-clients-wiring-actian-vectorai-db-into-claude-and-cursor.txt", "jsonld": "https://wpnews.pro/news/one-mcp-server-two-ai-clients-wiring-actian-vectorai-db-into-claude-and-cursor.jsonld"}}