Skip to content

GitHub Action

The toolproof Action installs toolproof, runs it, uploads the reports and adds a summary to the workflow run. It's listed on the GitHub Marketplace as MCP toolproof.

.github/workflows/mcp.yml
name: MCP server tests
on: [push, pull_request]

jobs:
  toolproof:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
      - uses: actions/setup-python@v7
        with:
          python-version: "3.12"
      - run: pip install -e .      # your server and its dependencies

      - uses: NilkanthSuthar/toolproof@v0.3.1
        with:
          config: toolproof.yaml
          python-version: ""       # use the Python set up above

The run page then shows a summary like this, and the reports are attached as the toolproof-report artifact:

Phase Result
✅ Static checks 0 errors, 0 warnings
✅ Tests 7/7 passed
✅ Bench 4/4 within limits
✅ Fuzz 0 findings (seed 1)

Inputs

Input Default Description
command run run, fuzz, bench or eval.
config toolproof.yaml Path to the config, relative to working-directory.
args Extra arguments, for example --strict --skip-fuzz or --examples 200.
working-directory . Where to run.
python-version 3.12 Python to set up. Set it to "" to use one your job already set up, which you need when toolproof should run in the same environment as your server.
version latest toolproof version to install, for example 0.3.1. Pin it for reproducible builds.
extras Optional extras, for example anthropic or openai for evals.
report-name toolproof-report Name of the uploaded artifact.
upload-report true Upload report.xml, report.json and report.html.
job-summary true Add the summary to the run page.

Outputs

Output Description
passed "true" or "false".
report-dir Folder with the three report files.

The step fails when toolproof fails, like any test step. To keep going and decide yourself, add continue-on-error: true and read steps.<id>.outputs.passed.

Examples

Evals with a secret key:

      - uses: NilkanthSuthar/toolproof@v0.3.1
        with:
          command: eval
          extras: anthropic
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}

Nightly deep fuzzing:

on:
  schedule:
    - cron: "0 3 * * *"
jobs:
  fuzz:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
      - uses: NilkanthSuthar/toolproof@v0.3.1
        with:
          command: fuzz
          args: --examples 500 --max-time 300

A Node server:

      - uses: actions/setup-node@v7
        with:
          node-version: "22"
      - run: npm ci && npm run build
      - uses: NilkanthSuthar/toolproof@v0.3.1

Versions

Reference a release tag such as @v0.3.1. Tags never move, so a pinned workflow keeps working the same way. The version input pins the toolproof package separately; leave it empty to get the latest release with a given Action version.