Some checks failed
CI / Format (push) Successful in 3s
CI / Clippy (push) Successful in 4m4s
CI / Security Audit (push) Successful in 1m42s
CI / Tests (push) Successful in 4m38s
CI / Deploy Agent (push) Successful in 2s
CI / Deploy Dashboard (push) Successful in 1s
CI / Deploy MCP (push) Failing after 2s
CI / Detect Changes (push) Successful in 7s
CI / Deploy Docs (push) Successful in 2s
New `compliance-mcp` crate providing a Model Context Protocol server with 7 tools: list/get/summarize findings, list SBOM packages, SBOM vulnerability report, list DAST findings, and DAST scan summary. Supports stdio (local dev) and Streamable HTTP (deployment via MCP_PORT). Includes Dockerfile, CI clippy check, and Coolify deploy job. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: Sharang Parnerkar <parnerkarsharang@gmail.com> Reviewed-on: #5
156 lines
5.0 KiB
Markdown
156 lines
5.0 KiB
Markdown
# MCP Server
|
|
|
|
The Model Context Protocol (MCP) server exposes compliance data to external LLMs and AI agents. Any MCP-compatible client — such as Claude, Cursor, or a custom agent — can connect and query findings, SBOM data, and DAST results without direct database access.
|
|
|
|
## How It Works
|
|
|
|
The `compliance-mcp` crate runs as a standalone service that connects to the same MongoDB database as the agent and dashboard. It registers a set of **tools** that LLM clients can discover and call through the MCP protocol.
|
|
|
|
```
|
|
LLM Client ──MCP──▶ compliance-mcp ──MongoDB──▶ compliance_scanner DB
|
|
```
|
|
|
|
The server supports two transport modes:
|
|
|
|
| Transport | Use Case | How to Enable |
|
|
|-----------|----------|---------------|
|
|
| **Stdio** | Local development, piped to a CLI tool | Default (no `MCP_PORT` set) |
|
|
| **Streamable HTTP** | Remote deployment, multiple clients | Set `MCP_PORT=8090` |
|
|
|
|
## Available Tools
|
|
|
|
The MCP server exposes seven tools:
|
|
|
|
### Findings
|
|
|
|
| Tool | Description |
|
|
|------|-------------|
|
|
| `list_findings` | Query findings with optional filters for repository, severity, status, and scan type. Returns up to 200 results (default 50). |
|
|
| `get_finding` | Retrieve a single finding by its MongoDB ObjectId. |
|
|
| `findings_summary` | Get finding counts grouped by severity and status, optionally filtered by repository. |
|
|
|
|
### SBOM
|
|
|
|
| Tool | Description |
|
|
|------|-------------|
|
|
| `list_sbom_packages` | List SBOM packages with filters for repository, vulnerabilities, package manager, and license. |
|
|
| `sbom_vuln_report` | Generate a vulnerability report for a repository showing all packages with known CVEs. |
|
|
|
|
### DAST
|
|
|
|
| Tool | Description |
|
|
|------|-------------|
|
|
| `list_dast_findings` | Query DAST findings with filters for target, scan run, severity, exploitability, and vulnerability type. |
|
|
| `dast_scan_summary` | Get a summary of recent DAST scan runs and finding counts. |
|
|
|
|
## Running Locally
|
|
|
|
### Stdio Mode
|
|
|
|
Run the MCP server directly — it reads from stdin and writes to stdout:
|
|
|
|
```bash
|
|
cd compliance-mcp
|
|
cargo run
|
|
```
|
|
|
|
Configure your MCP client to launch it as a subprocess. For example, in a Claude Code `mcp.json`:
|
|
|
|
```json
|
|
{
|
|
"mcpServers": {
|
|
"compliance": {
|
|
"command": "cargo",
|
|
"args": ["run", "-p", "compliance-mcp"],
|
|
"cwd": "/path/to/compliance-scanner"
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### HTTP Mode
|
|
|
|
Set `MCP_PORT` to start the Streamable HTTP server:
|
|
|
|
```bash
|
|
MCP_PORT=8090 cargo run -p compliance-mcp
|
|
```
|
|
|
|
The server listens on `http://0.0.0.0:8090/mcp`. Point your MCP client to this endpoint.
|
|
|
|
## Configuration
|
|
|
|
| Variable | Description | Default |
|
|
|----------|-------------|---------|
|
|
| `MONGODB_URI` | MongoDB connection string | `mongodb://localhost:27017` |
|
|
| `MONGODB_DATABASE` | Database name | `compliance_scanner` |
|
|
| `MCP_PORT` | Port for HTTP transport (omit for stdio) | — |
|
|
| `RUST_LOG` | Log level filter | `compliance_mcp=info` |
|
|
|
|
Create a `.env` file in the project root or set these as environment variables.
|
|
|
|
## Deploying with Docker
|
|
|
|
The `Dockerfile.mcp` builds and runs the MCP server in HTTP mode on port 8090.
|
|
|
|
```bash
|
|
docker build -f Dockerfile.mcp -t compliance-mcp .
|
|
docker run -p 8090:8090 \
|
|
-e MONGODB_URI=mongodb://mongo:27017 \
|
|
-e MONGODB_DATABASE=compliance_scanner \
|
|
-e MCP_PORT=8090 \
|
|
compliance-mcp
|
|
```
|
|
|
|
### Coolify Deployment
|
|
|
|
1. Create a new service in your Coolify project
|
|
2. Set the **Dockerfile path** to `Dockerfile.mcp`
|
|
3. Set the **exposed port** to `8090`
|
|
4. Add environment variables: `MONGODB_URI`, `MONGODB_DATABASE`, `MCP_PORT=8090`
|
|
5. The MCP endpoint will be available at your configured domain under `/mcp`
|
|
|
|
The CI pipeline automatically deploys on changes to `compliance-core/`, `compliance-mcp/`, `Dockerfile.mcp`, or `Cargo.toml`/`Cargo.lock`. Add the `COOLIFY_WEBHOOK_MCP` secret to your Gitea repository.
|
|
|
|
## Managing MCP Servers in the Dashboard
|
|
|
|
Navigate to **MCP Servers** in the dashboard sidebar to:
|
|
|
|
- **Register** MCP server instances with their endpoint URL, transport type, port, and database connection
|
|
- **View** server configuration, enabled tools, and status
|
|
- **Manage access tokens** — reveal, copy, or regenerate bearer tokens for authentication
|
|
- **Delete** servers that are no longer needed
|
|
|
|
Each registered server is assigned a random access token on creation. Use this token in your MCP client configuration for authenticated access.
|
|
|
|
## Example: Querying Findings from an LLM
|
|
|
|
Once connected, an LLM can call any of the registered tools. For example:
|
|
|
|
**"Show me all critical findings"** triggers `list_findings` with `severity: "critical"`:
|
|
|
|
```json
|
|
{
|
|
"tool": "list_findings",
|
|
"arguments": {
|
|
"severity": "critical",
|
|
"limit": 10
|
|
}
|
|
}
|
|
```
|
|
|
|
**"What vulnerable packages does repo X have?"** triggers `sbom_vuln_report`:
|
|
|
|
```json
|
|
{
|
|
"tool": "sbom_vuln_report",
|
|
"arguments": {
|
|
"repo_id": "683abc..."
|
|
}
|
|
}
|
|
```
|
|
|
|
::: tip
|
|
The MCP server is read-only — it only queries data from MongoDB. It cannot modify findings, trigger scans, or change configuration. This makes it safe to expose to external LLM clients.
|
|
:::
|