> ## Documentation Index
> Fetch the complete documentation index at: https://veryfront.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# List project alerts

> List the alert episodes represented in the last 30 days of retained state history for the current project, including episodes already firing when that history begins, firing and resolved, newest first.

export const McpToolCall = ({tool, initialArguments = {}, requiresConfirmation = false}) => {
  const validateCall = function validateReferenceToolCall(token, text, requiresConfirmation, confirmed) {
    if (!token.trim()) return {
      error: "Paste a bearer token first."
    };
    let value;
    try {
      value = JSON.parse(text.trim() || "{}");
    } catch {
      return {
        error: "Arguments must be valid JSON."
      };
    }
    if (!value || typeof value !== "object" || Array.isArray(value)) return {
      error: "Arguments must be a JSON object."
    };
    if (requiresConfirmation && !confirmed) return {
      error: "Confirm the tool call before running it."
    };
    return {
      arguments: value
    };
  };
  const endpoint = "https://api.veryfront.com/mcp";
  const tokenStorageKey = 'veryfront.docs.mcpBearerToken';
  const escapeHtml = value => value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
  const highlightJson = value => {
    const escaped = escapeHtml(value);
    return escaped.replace(/("(?:\\u[a-fA-F0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\btrue\b|\bfalse\b|\bnull\b|-?\d+(?:\.\d+)?(?:[eE][+\-]?\d+)?)/g, match => {
      let color = '#f3f4f6';
      if (match.endsWith(':')) {
        color = '#7dd3fc';
      } else if (match.startsWith('"')) {
        color = '#86efac';
      } else if ((/true|false/).test(match)) {
        color = '#c4b5fd';
      } else if ((/null/).test(match)) {
        color = '#fcd34d';
      } else {
        color = '#67e8f9';
      }
      return `<span style="color: ${color}">${match}</span>`;
    });
  };
  const expandJsonStrings = value => {
    if (typeof value === 'string') {
      const trimmed = value.trim();
      if (trimmed.startsWith('{') && trimmed.endsWith('}') || trimmed.startsWith('[') && trimmed.endsWith(']')) {
        try {
          return expandJsonStrings(JSON.parse(trimmed));
        } catch {}
      }
      return value;
    }
    if (Array.isArray(value)) {
      return value.map(expandJsonStrings);
    }
    if (value && typeof value === 'object') {
      return Object.fromEntries(Object.entries(value).map(([key, nestedValue]) => [key, expandJsonStrings(nestedValue)]));
    }
    return value;
  };
  const formatJson = value => {
    try {
      return JSON.stringify(expandJsonStrings(value), null, 2);
    } catch {
      return String(value);
    }
  };
  const formatResponseText = text => {
    const trimmed = text.trim();
    if (!trimmed) return 'No response body.';
    try {
      return formatJson(JSON.parse(trimmed));
    } catch {}
    const ssePayloads = trimmed.split(/\n\n+/).flatMap(chunk => chunk.split('\n').filter(line => line.startsWith('data:')).map(line => line.slice(5).trim()).filter(Boolean));
    for (let index = ssePayloads.length - 1; index >= 0; index -= 1) {
      try {
        return formatJson(JSON.parse(ssePayloads[index]));
      } catch {}
    }
    return trimmed;
  };
  const readStoredToken = () => {
    if (typeof window === 'undefined') return '';
    try {
      return window.sessionStorage.getItem(tokenStorageKey) || '';
    } catch {
      return '';
    }
  };
  const writeStoredToken = value => {
    if (typeof window === 'undefined') return;
    try {
      if (value) {
        window.sessionStorage.setItem(tokenStorageKey, value);
      } else {
        window.sessionStorage.removeItem(tokenStorageKey);
      }
    } catch {}
  };
  const [token, setToken] = useState(readStoredToken);
  const [argumentText, setArgumentText] = useState(formatJson(initialArguments));
  const [status, setStatus] = useState('Ready');
  const [response, setResponse] = useState('No response yet.');
  const [copied, setCopied] = useState(false);
  const [confirmed, setConfirmed] = useState(false);
  const callTool = async () => {
    const validation = validateCall(token, argumentText, requiresConfirmation, confirmed);
    if (('error' in validation)) {
      setStatus(validation.error);
      return;
    }
    const parsedArguments = validation.arguments;
    setConfirmed(false);
    const body = {
      jsonrpc: '2.0',
      id: Date.now(),
      method: 'tools/call',
      params: {
        name: tool,
        arguments: parsedArguments
      }
    };
    setStatus('Calling tool...');
    setResponse(formatJson(body));
    try {
      const result = await fetch(endpoint, {
        method: 'POST',
        headers: {
          accept: 'application/json, text/event-stream',
          'content-type': 'application/json',
          authorization: `Bearer ${token.trim()}`,
          'x-veryfront-origin': 'docs-mcp-tool-page'
        },
        body: JSON.stringify(body)
      });
      const text = await result.text();
      setStatus(result.ok ? 'Response received.' : `Request failed with HTTP ${result.status}.`);
      setResponse(formatResponseText(text));
    } catch (error) {
      setStatus('Request failed.');
      setResponse(error instanceof Error ? error.message : String(error));
    }
  };
  const copyResponse = async () => {
    try {
      await navigator.clipboard.writeText(response);
      setCopied(true);
      setTimeout(() => setCopied(false), 1500);
    } catch {
      setStatus('Copy failed.');
    }
  };
  return <details className="api-try-operation not-prose">
    <summary>Try this tool</summary>
    <p>Replace sample arguments with values for your project or connected account. Calls run only when you select Run tool.</p>
    <div className="api-request-playground not-prose my-6 rounded-xl border border-gray-200 bg-white p-4 dark:border-gray-800 dark:bg-gray-950">
      <div className="mb-4">
        <div className="text-sm font-semibold text-gray-900 dark:text-gray-100">MCP tool call</div>
        <div className="mt-1 text-sm text-gray-600 dark:text-gray-400">
          Call <code>{tool}</code> against the Veryfront MCP endpoint.
        </div>
      </div>

      <label className="mb-2 block text-sm font-medium text-gray-900 dark:text-gray-100" htmlFor={`${tool}-token`}>
        Bearer token or API key
      </label>
      <input id={`${tool}-token`} className="mb-4 w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100" type="password" value={token} onChange={event => {
    const value = event.target.value;
    setToken(value);
    setConfirmed(false);
    writeStoredToken(value);
  }} placeholder="Paste API key or JWT" />

      <label className="mb-2 block text-sm font-medium text-gray-900 dark:text-gray-100" htmlFor={`${tool}-arguments`}>
        Arguments (JSON)
      </label>
      <textarea id={`${tool}-arguments`} className="mb-4 min-h-40 w-full rounded-md border border-gray-300 bg-white px-3 py-2 font-mono text-sm text-gray-900 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100" value={argumentText} onChange={event => {
    setArgumentText(event.target.value);
    setConfirmed(false);
  }} spellCheck={false} />

      {requiresConfirmation && <label className="api-request-confirmation mb-4 flex items-start gap-2 text-sm">
        <input type="checkbox" checked={confirmed} onChange={event => setConfirmed(event.target.checked)} />
        <span>{tool === 'veryfront__set_project_inference_policy' ? 'Replace the project inference policy with these arguments. Omitted constraints will be removed.' : 'Run this tool with these arguments.'}</span>
      </label>}
      <button disabled={status === 'Calling tool...' || requiresConfirmation && !confirmed} className="disabled:opacity-50 disabled:cursor-not-allowed rounded-md bg-gray-900 px-3 py-2 text-sm font-medium text-white hover:bg-gray-700 dark:bg-gray-100 dark:text-gray-950 dark:hover:bg-gray-300" type="button" onClick={callTool}>
        Run tool
      </button>

      <div className="mt-4 text-sm font-medium text-gray-900 dark:text-gray-100">{status}</div>
      <div className="mt-3 overflow-hidden rounded-md border border-gray-300 dark:border-gray-700">
        <div className="flex items-center justify-between bg-gray-100 px-3 py-2 text-sm font-medium text-gray-900 dark:bg-gray-900 dark:text-gray-100">
          <span>Output JSON</span>
          <button className="rounded border border-gray-300 bg-white px-2 py-1 text-xs text-gray-900 hover:bg-gray-50 dark:border-gray-700 dark:bg-gray-950 dark:text-gray-100 dark:hover:bg-gray-800" type="button" onClick={copyResponse}>
            {copied ? 'Copied' : 'Copy'}
          </button>
        </div>
      <pre className="max-h-96 overflow-auto whitespace-pre-wrap break-words bg-gray-950 p-4 text-sm text-gray-100">
        <code dangerouslySetInnerHTML={{
    __html: highlightJson(response)
  }} />
      </pre>
      </div>
    </div>
    </details>;
};

<div className="api-operation-signature">
  `veryfront__list_project_alerts`
</div>

Each alert is one firing of a Veryfront alert rule, such as failing agent or task runs, with the run's error code and links to the project's error logs and traces for the time it covers.

Follow up with [`search_project_logs`](/docs/cloud/mcp/tools/search-project-logs) or [`search_project_traces`](/docs/cloud/mcp/tools/search-project-traces) over that window.

## Access

No external-service connection is required. Use a Veryfront credential with access to the requested resources.

**Call type:** Read-only.

## Arguments

| Field | Type | Required | Description and constraints |
| - | - | - | - |
| `project_reference` | `string` | No | Project ID or slug |
| `status` | `string[]` | No | Only alerts in one of these statuses. Omit for firing and resolved alerts. |
| `sort_order` | `string` | No | desc lists the newest alert first. Default: `"desc"`. Values: `"asc"`, `"desc"`. |
| `limit` | `integer` | No | Max alerts to return (default 20). Default: `20`. Minimum: `1`. Maximum: `100`. |
| `cursor` | `string` | No | `page_info`.next from a previous response. Minimum length: `1`. |

## Example request

Send this JSON-RPC request through an initialized MCP client. Replace sample identifiers and values before calling the tool. See [MCP client setup](/docs/cloud/getting-started/connect-mcp).

```json title="request.json" theme={null}
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "veryfront__list_project_alerts",
    "arguments": {}
  }
}
```

## Result

The published output shape is summarized below. Inspect both the MCP response content and `isError` when handling a call.

| Field | Type | Required | Description and constraints |
| - | - | - | - |
| `data` | `object[]` | Yes | Primary result records returned by the tool. |
| `page_info` | `object` | Yes | Pagination cursor values for traversing the result set. |

## Full schemas

<CodeGroup>
  ```json title="input-schema.json" theme={null}
  {
    "type": "object",
    "properties": {
      "project_reference": {
        "type": "string",
        "description": "Project ID or slug"
      },
      "status": {
        "type": "array",
        "items": {
          "type": "string",
          "enum": [
            "firing",
            "resolved"
          ],
          "description": "One statu item supplied to the tool."
        },
        "minItems": 1,
        "description": "Only alerts in one of these statuses. Omit for firing and resolved alerts."
      },
      "sort_order": {
        "type": "string",
        "enum": [
          "asc",
          "desc"
        ],
        "description": "desc lists the newest alert first.",
        "default": "desc"
      },
      "limit": {
        "type": "integer",
        "minimum": 1,
        "maximum": 100,
        "description": "Max alerts to return (default 20).",
        "default": 20
      },
      "cursor": {
        "type": "string",
        "minLength": 1,
        "description": "page_info.next from a previous response."
      }
    },
    "additionalProperties": false,
    "description": "Arguments for the list_project_alerts tool.",
    "$schema": "http://json-schema.org/draft-07/schema#"
  }
  ```

  ```json title="output-schema.json" theme={null}
  {
    "type": "object",
    "properties": {
      "data": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "description": "Identifies this firing of the alert."
            },
            "rule_id": {
              "type": "string",
              "description": "UID of the Grafana alert rule, for example project-agent-run-failures."
            },
            "title": {
              "type": "string",
              "description": "Short human-readable title returned by the tool."
            },
            "status": {
              "type": "string",
              "enum": [
                "firing",
                "resolved"
              ],
              "description": "Lifecycle status for the returned record."
            },
            "error_code": {
              "type": [
                "string",
                "null"
              ],
              "description": "Terminal error code of the failed runs; null for rules without one."
            },
            "run_kind": {
              "type": [
                "string",
                "null"
              ],
              "description": "Kind of the runs the alert is about, when the rule tells them apart."
            },
            "run_status": {
              "type": [
                "string",
                "null"
              ],
              "description": "Status of the unfinished runs the alert is about."
            },
            "started_at": {
              "type": [
                "string",
                "null"
              ],
              "description": "When the alert fired; null when it fired before the 30 days of retained history."
            },
            "resolved_at": {
              "type": [
                "string",
                "null"
              ]
            },
            "_links": {
              "type": "object",
              "properties": {
                "logs": {
                  "type": "object",
                  "properties": {
                    "href": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "href"
                  ],
                  "additionalProperties": false
                },
                "traces": {
                  "$ref": "#/properties/data/items/properties/_links/properties/logs"
                }
              },
              "additionalProperties": false,
              "description": "Investigation links clipped to retained telemetry; omitted when the episode is outside the available window."
            }
          },
          "required": [
            "id",
            "rule_id",
            "title",
            "status",
            "error_code",
            "run_kind",
            "run_status",
            "started_at",
            "resolved_at",
            "_links"
          ],
          "additionalProperties": false
        },
        "description": "Primary result records returned by the tool."
      },
      "page_info": {
        "type": "object",
        "properties": {
          "self": {
            "type": [
              "string",
              "null"
            ],
            "description": "Cursor that refers to the current page."
          },
          "first": {
            "type": "null"
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "description": "Cursor for the next page when pagination is available."
          },
          "prev": {
            "type": [
              "string",
              "null"
            ],
            "description": "Cursor for the previous page when pagination is available."
          }
        },
        "required": [
          "self",
          "first",
          "next",
          "prev"
        ],
        "additionalProperties": false,
        "description": "Pagination cursor values for traversing the result set."
      }
    },
    "required": [
      "data",
      "page_info"
    ],
    "additionalProperties": false,
    "description": "Structured result returned by the list_project_alerts tool.",
    "$schema": "http://json-schema.org/draft-07/schema#"
  }
  ```
</CodeGroup>

<McpToolCall tool="veryfront__list_project_alerts" initialArguments={{}} />


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.