# The tools

> The six tools of the MCP server, their parameters and what they cost. Reading is free, unlocking a fix uses one fix.

Every tool description reminds the agent of the rules: Rustine only scans the sites of the user's projects, read-only, never a site that is not theirs, and never edits code.

## list_projects

Your projects and their sites: verified or not, score out of 100, grade A to F, last scan, open issues. **Free.** Permission `scans:read`.

No parameters.

## run_scan

Scans a site **already in your projects** and waits for the result (up to about a minute): score, grade and issues by severity. If the scan is still running, the agent calls the tool again with the same target to keep waiting. **One scan from your quota**; a scan of the same kind within the hour returns the recent result without charging anything. Permission `scans:run`.

| Parameter | Type | | Description |
| --- | --- | --- | --- |
| `target` | string | required | site id, project id (if it has a single site) or URL of a site in your projects |
| `kind` | `quick` \| `audit` | default `quick` | `audit` only on a proved site |

## list_issues

The issues, worst first, with their confidence; for a repository, the file, line and commit. Issues of an unproved site stay hidden (only their count shows). **Free.** Permission `scans:read`.

| Parameter | Type | | Description |
| --- | --- | --- | --- |
| `project` | string | optional | project id |
| `target` | string | optional | site id or URL |
| `status` | `open` \| `all` | default `open` | `all` adds fixed issues, false positives and accepted risks, with the reason and the agent that marked them |

## get_fix

Returns the fix of an issue: instructions written for a coding agent. **One fix from your plan on the first call** for that issue, free afterwards. The agent is asked to check with you before unlocking many. Permission `fixes:unlock`.

| Parameter | Type | | Description |
| --- | --- | --- | --- |
| `issue_id` | string (UUID) | required | id from `list_issues` |

## recheck_issue

Rechecks an issue: on the live site, or for a repository by starting an analysis of the default branch (at most one per quarter of an hour). Answers `fixed`, `stillOpen` with the evidence, or `pending` (analysis not finished: `run_scan` on the repository a little later). **Free**, up to 60 per project and per day. Permission `scans:run`.

| Parameter | Type | | Description |
| --- | --- | --- | --- |
| `issue_id` | string (UUID) | required | id from `list_issues` |

## set_issue_status

Marks an issue as a false positive (it leaves the score) or an accepted risk (it stays in it), or opens it again. The reason shows in the app with the agent's name. The agent must only mark a false positive after checking the value is fake or unreachable, and use `recheck_issue` for a fixed issue. **Free.** Permission `issues:write`.

| Parameter | Type | | Description |
| --- | --- | --- | --- |
| `issue` | string (UUID) | required | id from `list_issues` |
| `status` | `falsePositive` \| `acceptedRisk` \| `open` | required | `open` undoes a mark |
| `reason` | string | required | 10 to 500 characters: what was checked (file, line, why the value is fake) |

An OAuth connection allowed before 13/10/2026 lacks `issues:write`: `set_issue_status` asks it to disconnect and reconnect Rustine.

## When the plan does not allow it

A used-up quota or a plan without MCP never gives a `403`: the tool answers with a readable error (`isError: true`), in the user's language, with the link to change plans.

## Examples

### tools/call

```json
{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "tools/call",
  "params": {
    "name": "run_scan",
    "arguments": { "target": "https://mysaas.com", "kind": "quick" }
  }
}
```
