IDE & MCP
Upliftr is AI debugging agents, and it ships an MCP server, so the agents show up as a tool inside Cursor and Claude Code (and any MCP-capable editor like VS Code). Your editor's agent can drive a real headless browser to reproduce a bug or walk a flow in plain English, re-run saved checks, and confirm expectations, without leaving the chat. Everything is read-only by design: the agents investigate and diagnose, they never mutate your code, data, or infrastructure. "Debug this URL" becomes a one-liner.
This is the front door to the agents right where you work: you build in your IDE, and the agents debug your app right there.
The four tools
| Tool | What it does |
|---|---|
upliftr_root_cause(url, instructions) | Deep backend root cause. Reproduces a failing flow in a real browser, captures the failing request's trace_id, queries the configured server logs (Loki / Datadog / Elasticsearch / HTTP / file), and synthesizes the server-side cause + a suggested fix. Not "the UI failed" — "the 500 in the pricing service behind it". Configure a log backend via env; with none set it still reports the failing request and how to enable tracing. |
upliftr_test(url, instructions) | Ad-hoc test. Opens url headless, splits instructions into plain-English steps (one per line, or sentence-split), and lets Claude drive each step in a real browser. Returns whether it worked, which step broke, the final URL/page text, and any backend root cause. |
upliftr_run_suite(suite_path) | Run a saved suite. Runs a *.upliftr.yaml suite end-to-end in one shared browser session. Returns the summary plus per-case pass/fail with the reason and any filed root cause. |
upliftr_check(url, expect) | Check one expectation. Opens url headless and decides whether a plain-English expect holds. Obvious URL/text shapes are checked deterministically (no model call); anything subjective is adjudicated against the page text + a screenshot. Returns PASS / FAIL / INCONCLUSIVE. |
All four use Claude as the brain and a headless Playwright Chromium as the hands, so the server needs ANTHROPIC_API_KEY in its environment (it falls back to the key saved in the dashboard's Settings).
Install
cd mcp-server
uv venv && uv pip install -e .
uv run playwright install chromium # if not already installedVerify it's wired up, offline, no browser or key needed:
uv run python smoke_test.py
# -> OK, all 4 expected tools registered.By default the server speaks MCP over stdio (for local editors). To run it directly:
ANTHROPIC_API_KEY=sk-ant-... uv run upliftr-mcpupliftr-mcp is a console script equivalent to uv run python -m upliftr_mcp.server.
Remote / HTTP transport (agentic platforms)
For a remote agentic platform (e.g. the GitLab Duo Agent Platform) that consumes MCP over HTTP rather than stdio, run the same server as a streamable-HTTP service:
UPLIFTR_MCP_TRANSPORT=http \
UPLIFTR_MCP_HOST=0.0.0.0 UPLIFTR_MCP_PORT=8930 \
ANTHROPIC_API_KEY=sk-ant-... uv run upliftr-mcp| Env | Values | Default |
|---|---|---|
UPLIFTR_MCP_TRANSPORT | stdio | http (streamable-http) | sse | stdio |
UPLIFTR_MCP_HOST / UPLIFTR_MCP_PORT | bind address / port (http & sse) | 0.0.0.0 / 8930 |
The MCP server and the browser automation are fully cross-platform (Windows / macOS / Linux).
Register in Claude Code
One command (set the directory to your absolute mcp-server path):
claude mcp add upliftr \
--env ANTHROPIC_API_KEY=sk-ant-... \
-- uv run --directory /ABS/PATH/TO/Upliftr/mcp-server upliftr-mcp…or commit a project .mcp.json (one ships in the repo root, approve the upliftr server when prompted):
{
"mcpServers": {
"upliftr": {
"command": "uv",
"args": ["run", "--directory", "/ABS/PATH/TO/Upliftr/mcp-server", "upliftr-mcp"],
"env": { "ANTHROPIC_API_KEY": "sk-ant-..." }
}
}
}Register in Cursor
Create .cursor/mcp.json in your project (one ships in the repo), then open Cursor Settings → MCP and confirm upliftr is connected with its 4 tools:
{
"mcpServers": {
"upliftr": {
"command": "uv",
"args": ["run", "--directory", "/ABS/PATH/TO/Upliftr/mcp-server", "upliftr-mcp"],
"env": { "ANTHROPIC_API_KEY": "sk-ant-..." }
}
}
}Register in VS Code
VS Code (with MCP support, e.g. Copilot agent mode) reads .vscode/mcp.json:
{
"servers": {
"upliftr": {
"command": "uv",
"args": ["run", "--directory", "/ABS/PATH/TO/Upliftr/mcp-server", "upliftr-mcp"],
"env": { "ANTHROPIC_API_KEY": "sk-ant-..." }
}
}
}Example prompts (once registered)
- "Use
upliftr_root_causeonhttps://example.com/checkout— click Pay and tell me the backend reason it fails, not just the UI symptom." - "Use
upliftr_testonhttps://example.com/loginto log in withuser@example.com / hunter2and confirm it lands on the dashboard." - "Run the suite at
backend/data/suites/checkout.upliftr.yamlwithupliftr_run_suite." - "With
upliftr_check, verifyhttps://example.com/pricingshows the word 'Enterprise'."
Test it with MCP Inspector
To poke the server outside an editor, use the official MCP Inspector:
npx @modelcontextprotocol/inspector \
uv run --directory /ABS/PATH/TO/Upliftr/mcp-server upliftr-mcpThe Inspector launches the server over stdio and gives you a UI to list the four tools, inspect their schemas, and invoke them with arguments, handy for confirming the connection and trying upliftr_check against a URL before wiring it into your editor.
Layout
mcp-server/
├── pyproject.toml # package + deps (mcp SDK, anthropic, playwright, …)
├── smoke_test.py # offline check: server imports + 4 tools registered
└── upliftr_mcp/
├── engine.py # puts backend/app/engine on sys.path; lazy import
└── server.py # FastMCP app + the 4 toolsNext: gate your PRs in CI, or learn the suite format.