Use Vediqx from your agent
Two steps: make a key, then paste one setup into your agent.
1Make a key
A key is shown once, when it is made. Put it in your environment as
VEDIQX_API_KEY, never in a file you commit.Sign in to make a key here. Sign in
2Paste one setup
Claude Code
Run against the client itselfRun it once in a terminal, in your project. The single quotes matter: .mcp.json then holds ${VEDIQX_API_KEY}, never the key, and Claude Code reads the variable when it starts. Start Claude Code from a shell where VEDIQX_API_KEY is set, approve the vediqx server when it asks, and /mcp lists it with five tools: check_app, get_report, list_apps, list_fixes and verify_fix.
bash
claude mcp add --transport http --scope project vediqx https://vediqx.com/api/mcp \ --header 'Authorization: Bearer ${VEDIQX_API_KEY}'Cursor
From the client's documentation; not run against it yetPut it in .cursor/mcp.json in the project, or ~/.cursor/mcp.json for every project. ${env:NAME} is Cursor's documented form, but an open report says a remote server's headers are sent as written: if the key is rejected, Cursor sent that text, and pasting the key in means treating mcp.json as a secret.
json
View · 10 lines
{ "mcpServers": { "vediqx": { "url": "https://vediqx.com/api/mcp", "headers": { "Authorization": "Bearer ${env:VEDIQX_API_KEY}" } } } }Codex
From the client's documentation; not run against it yetAdd it to ~/.codex/config.toml, then start a new session.
toml
[mcp_servers.vediqx] url = "https://vediqx.com/api/mcp" bearer_token_env_var = "VEDIQX_API_KEY"Any MCP client
From the client's documentation; not run against it yetOne POST, JSON-RPC 2.0, protocol 2025-06-18. Five tools: check_app, get_report, list_apps, list_fixes, verify_fix.
http
POST https://vediqx.com/api/mcp Authorization: Bearer $VEDIQX_API_KEY Content-Type: application/json {"jsonrpc":"2.0","id":1,"method":"tools/list"}Command line
From the client's documentation; not run against it yetAnywhere node 20 or newer runs. The key is read from $VEDIQX_API_KEY, never an argument.
bash
export VEDIQX_API_KEY=… npx @vediqx/cli check https://your-app.example.com --wait --fail-on=highGitHub Actions
From the client's documentation; not run against it yetOne step in a workflow. Exit 1 is a finding at or above fail-on; exit 2 is Vediqx could not look.
bash
- uses: vediqx/action@v1 with: url: https://your-app.example.com api-key: ${{ secrets.VEDIQX_API_KEY }} fail-on: high
What your agent can ask
check_app- Run Vediqx's outside check on a URL, the one a visitor's free check runs: it reads the app from the internet and never connects to its database. It returns an id, not a run id. The check takes a while: call get_report with the id until its status is finished. Its report never carries fixes or a link; checks of a database's rules and their fixes come from the checks Vediqx runs on a saved app.
get_report- The report for one check: its status, every finding with its tier, and what could not be checked with the sentence that would unlock each one, in structuredContent. For an id from check_app, fixes is empty and runId and reportUrl are null: that check is a visitor's. For a run id of a saved app's check, each fix carries its findingId and, when the fix is SQL, every statement of it; call verify_fix once one is applied.
list_apps- The apps this key's org has saved, with the id and the level each is connected at: the lowest reads the app from outside only, and the next also checks its database's rules as the app's own test accounts. Also the quickest way to confirm the key works.
list_fixes- The fixes from one of a saved app's runs, each with its findingId, its finding's fingerprint (the report's findings carry the same fingerprint and that id) and, when the fix is SQL, every statement of it, in structuredContent; a fix Vediqx could not prove safe carries no statements and says why in notShown; runs lists the app's newest runs. When the run looked from outside only, notChecked says what it did not look at, such as your tables' access rules, which need the Inside check. Without run_id it reads the newest whole run that finished. Until the app's address is proven, a run's details are locked: it says so, and an empty list then is not the same as nothing to fix. app_id comes from list_apps.
verify_fix- Re-check one finding after its fix is applied. A finding from an outside check re-runs for any organisation; one from a deeper check needs this organisation's deeper checks open, and until then is refused as beyond_level_0_closed with nothing re-run. When it runs it answers started; the verdict is shown on that finding's card in Vediqx and as a verify_fix run in list_fixes' runs, and the card closes only on a clean, controlled result. app_id comes from list_apps; finding_id is a fix's findingId in list_fixes.
The REST API
Send the key as Authorization: Bearer.
| Method | Path | What it does |
|---|---|---|
| POST | /api/v1/checks | Starts a check of one address. Body: An |
| GET | /api/v1/checks/:id | Reads a check: its status, its report and, for a run of an app you have saved, its fixes. The same report the page shows, with no row values in it. Ask again until the status is finished. |
| GET | /api/v1/apps | Lists the apps your organisation has saved. Each app's id, name, address and level. |
| GET | /api/v1/apps/:id/fixes | Reads the fixes from one of a saved app's runs: the newest whole run, or `?run=` one of its `runs`. Each fix with its |
| POST | /api/v1/apps/:id/findings/:fid/verify | Re-checks one finding after a fix.
|
When it says no
| Refusal | What it means |
|---|---|
401 no_key | This needs an API key. Create one in Settings, then send it as Authorization: Bearer wk_…. |
401 key_not_live | That key is not in use any more. Create a new one in Settings; keys are shown once and cannot be read back. |
403 not_this_orgs_app | Vediqx only looks inside a database for apps your own organisation has saved and connected. Save this app and connect it, then this works on it. |
403 beyond_level_0_closed | Looking inside your database is not open yet while Vediqx's own security review is finishing, so nothing was re-run and nothing was changed. This one is ours: it opens when that review lands, not from anything on your side. |
404 not_found | We could not find that on this key's organisation. |
400 url_refused | That address could not be checked. Send a plain https:// address with no username, password or token in it. |
503 checks_paused | Free checks are paused right now, so nothing was started. Try again later; this one is ours. |
503 ours | Something of ours was not ready, so nothing was started. Try again in a moment; this one is ours. |
Limits
| Checks per key, per day | 10 |
|---|---|
| Checks of one host, per hour | 6 |
| Runs of one saved app, per hour | 6 |
A check past a limit still starts, and comes back with nothing checked and a sentence saying which limit it met. Nothing is requested from your app, and the command line exits 2.
Command line exit codes
| Exit code | What it means |
|---|---|
| 0 | The check ran, read a whole report, and found nothing at or above --fail-on (default high), and nothing it could not check. |
| 1 | The check ran and found something at or above --fail-on. |
| 2 | Vediqx could not look: no key, a refusal, a timeout, an inconclusive or failed check, a report it could not read, or anything left unchecked. |