Skip to main content
The Vexlo MCP server is a stdio process your AI agent’s host launches as a child. It holds one API token, calls one Vexlo server’s /v1 read API, and exposes eleven tools. It stores nothing of its own, so installing it means building it and telling the host where it is. The eleven tools sit on three rungs, and an agent pays for what it opens: find names what exists and never returns a captured value, shape returns one trace’s or one function’s full structure, and values returns the captured bytes of the slots you ask for. Every tool wraps one read route, so the process cannot change anything on the server, mint a token, or reach storage directly.

Requirements

  • Node.js 20 or later. package.json declares "node": ">=20"; the build below ran on 26.12.0.
  • A running Vexlo server, reachable from the machine the host launches the child on.
  • A read-role API token for that server.
The token travels in an Authorization header on every call, so a server outside loopback has to be reached over TLS: install and run the server covers that rule and the flag that waives it.

Build from a checkout

@vexlo/mcp is not published to the npm registry yet, so there is no npx form and no npm install @vexlo/mcp:
Build it from a checkout of vexlo-mcp instead. npm ci installs dependencies and writes no dist/; npm run build compiles src/ to dist/ and prepends the shebang that lets the host execute dist/index.js directly:
dist/index.js is the file the host runs, and npm run build is the only build step. The build is tsc, not a bundler: dist/index.js imports @modelcontextprotocol/sdk and zod by name, so it resolves both from the node_modules/ that npm ci wrote beside it. Keep the checkout as it is. Copying dist/ somewhere on its own leaves the process dead before it reaches the handshake, and no exit code in the next page’s table applies:

Mint a read token

Every tool calls a read-role route, so the process refuses to start with any other role. On the machine that holds the server storage directory:
The token prints once and is stored hashed. A read token can span several teams (-team a,b), and that set is the token’s team-set. The tools narrow within it, never past it: a tool asked only for teams outside the team-set sends no request at all and answers with an empty result that carries a scope_note naming what it dropped. An empty result is therefore not by itself proof that the request ran, which find reads in full. Mint the token for every team the agent should see, since the process reads both variables once and never widens its own team-set afterwards. Authentication and tokens covers minting, roles, and revocation.

Configure your client

Point the host at the built file by absolute path, and pass both environment variables:
Both variables are required and neither has a default: Both are read once, at startup, by one module. Changing either means restarting the process.

Verify

Send one initialize request on stdin. The process runs its startup handshake against the server first, so a reply proves the URL, the token, and the server version all check out:
The process exits 0 when stdin closes. A non-zero exit means the handshake failed, and the reason is one line on stderr: startup checks and exit codes has the six codes and what each one means. A host that reports the server as failed with no detail is hiding that line, so read the exit code first and the host’s own child-process log second. tools/list on the same session returns all eleven tools with their argument schemas. Some of the numbers in them are read from the server’s own /v1/capabilities during startup, and some are fixed in this client: A fixed number does not move when the server reports a larger one. The seeded server behind every example on these pages reports search_limit_max: 500, and vexlo_search_traces still refuses limit: 101. The three tool pages give each tool’s bounds as the schemas carry them.