Run security checks against your own MCP server in CI, and see the findings in GitHub
Description and use
The protocolprobe-selftest tool runs your own MCP server, connects as a client, performs runtime checks, and outputs results that can be integrated into GitHub Actions via SARIF.
Problem
Most MCP security tooling only reads server tool descriptions and cannot observe actual runtime behavior of a server when a client calls it.
Outcome
The tool provides a runtime check of an MCP server, reporting passed, failed, and not-run checks, and can integrate findings into GitHub code scanning via SARIF.
Workflow
- 1. Install the tool via npx protocolprobe-selftest.
- 2. Run the tool with --i-own-this-server and --stdio followed by the server command (e.g., node ./dist/server.js).
- 3. For mutating or fuzzing checks, add --allow-mutating and --allow-fuzzing and output to a JSON file.
- 4. In CI, add --fail-on-finding and --sarif to generate a SARIF file and fail the job on vulnerabilities.
- 5. Upload the SARIF file with github/codeql-action/upload-sarif@v3 using if: always() to ensure upload even on failures.
- 6. For deployed servers, use --url to prove ownership, add the proof line to the server’s instructions, and re-run within 30 minutes.
Evidence
Most MCP security tooling reads a server's tool descriptions. That finds text that looks suspicious. It does not tell you what your server does when a client calls it.
This post is about a small command-line tool that does the second thing, for a server you run: it starts your server, connects as an MCP client, calls it, and reports what it observed.
npx protocolprobe-selftest --i-own-this-server --stdio node ./dist/server.js
--fail-on-finding makes the job exit with code 5 when a check needs attention (VULNERABLE or FOUND). Without it the exit code is 0 whatever the result.
I have not run this exact workflow end to end for this post; the command line and the exit-code behaviour are from the tool's tests and documentation.
- Record date: 2026-11-02T04:14:09.757Z