What you need
You do not need bun, and you do not need to build the CLI from source. You need
@pipeshub-ai/mcp 2.3.2 or later — 2.3.1 still writes a sandbox/Dockerfile that Sprites never boot.
Stand up QM
Skip this section if QM already runs.target: docker runs QM’s own services on your machine. Agents still execute on Sprites.
Set the sandbox backend in both places in qm.config.jsonc:
SPRITES_TOKEN when env.core.SANDBOX_BACKEND is "sprites". If you set it only under sandbox, qm check still passes and core fails at provision time. Confirm with npx qm plan — look for .env keys not forwarded to any container.
qm setup writes empty placeholders for values you skip. If you later append the real value, the key can appear twice. Search .env for duplicates before debugging anything else. The first qm up can take 10–40 minutes (large image pulls). When it finishes it prints URLs.Connect PipesHub
From the QM deployment directory:sandbox/Dockerfile on Sprites: Sprites cannot boot a custom image (qm#272), so the file would look like the install path while never running — the skill’s first-run step is what actually installs the CLI.
If you already ran init-qm from 2.3.1, delete sandbox/Dockerfile. Sprites never used it, and qm#427 will start rejecting leftover Dockerfiles.
Re-running is safe: existing files are kept. Do not re-run 2.3.1 after deleting the file, or it will write it again. Confirm pipeshub --version is 2.3.2 or later before init-qm.
Set egress in sandbox/tools/pipeshub/tool.json to your PipesHub hostname only — for example pipeshub.your-company.com or your-subdomain.trycloudflare.com. No scheme, no path.
Then:
Each person: PAT and keychain
1
Create a personal access token
In PipesHub: Developer Settings → Personal Access Tokens → New token. Accept the defaults. Keep the
phpat_ prefix if the token has one; it is for secret scanners, not a second secret.Do not add semantic:read if the agent asks for it — that scope is search history, not search, and it is not on a stock instance. Search is semantic:write, and the CLI already uses it.See Personal Access Tokens for expiry, revocation, and the admin API.2
Add two personal keychain credentials
In QM, add two personal keychain credentials (same form twice). Never paste the token into chat.
Service must be exactly
pipeshub. The environment-variable field is marked optional; fill it in. If you leave it blank on the token entry, QM derives PIPESHUB_TOKEN from the service name. It will not derive PIPESHUB_BASE_URL.The create-token paste block (
PIPESHUB_MCP_URL= / PIPESHUB_MCP_TOKEN=) is for a local MCP client, not for this keychain.First message
In a new QM chat: “What do we know about X? Cite the document.” Ifpipeshub is missing on that Sprite, the agent should run, once:
pipeshub CLI (ask, search, get, sources). Do not call GET /api/v1/search, and do not reissue the PAT with semantic:read.
A grounded answer includes citations with recordId and webUrl. An ask with no citations came back with no sources, so nothing in it can be verified. If it says the documents do not contain it, relay that. If it asserts facts, do not repeat them — say it came back unsourced. Ignore confidence — it takes every value on both sides. Do not invent a source.
If the CLI says it is not connected, have the agent run pipeshub auth connect-help and follow that. Never paste a token into the thread.
Check that it worked
If something fails
Do not
- Put a PAT in
sandbox.secretEnvor in the prompt - Mint
semantic:readorconversation:read(unmintable on stockMCP_SCOPES) - Point the sandbox at
http://localhost:… - Treat an uncited
askas a retrieved fact - Expect
qm sandbox publishto putpipeshubon PATH (Sprites) - Paste the MCP create-token block (
PIPESHUB_MCP_URL/PIPESHUB_MCP_TOKEN) into the QM keychain