Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .github/CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Code of Conduct

The Stackrox code of conduct can be found [here](https://stackrox.io/code-conduct).
71 changes: 71 additions & 0 deletions .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# Contributing to StackRox MCP

Thank you for your interest in contributing to StackRox MCP! This document provides guidelines and instructions for contributing to the project.

## Development Guidelines

### Code Quality Standards

All code must pass the following checks before being merged:

- **Formatting:** Run `go fmt ./...` to format your code
- **Linting:** Run `golint ./...` to check for style issues
- **Vetting:** Run `go vet ./...` to check for suspicious constructs
- **Testing:** All tests must pass with `go test ./...`

These checks are automatically run in CI for all pull requests.

### Testing

- Write unit tests for all new functionality
- Aim for 80% code coverage
- All error paths tested
- Run tests with coverage:
```bash
go test -cover ./...
```
- Generate detailed coverage report:
```bash
go test -coverprofile=coverage.out ./...
go tool cover -html=coverage.out
```

## Pull Request Guidelines

### Creating a PR

- **Title:**
- The title of your PR should be clear and descriptive.
- It should be short enough to fit into the title box.
- **PR addresses JIRA ticket:** `ROX-1234: Add feature ABC`
- **Otherwise use conventional commit style:** `<type>(<scope>): <description>`
- Types: `fix`, `docs`, `test`, `refactor`, `chore`, `ci`
- Example: `fix(builds): Fix builds for ABC architecture`

- **Description:**
- Describe the motivation for this change, or why some things were done a certain way.
- Focus on what cannot be extracted from the code, e.g., alternatives considered and dismissed (and why), performance concerns, non-evident edge cases.

- **Validation:**
- Provide information that can help the PR reviewer test changes and validate they are correct.
- In some cases, it will be sufficient to mention that unit tests are added and they cover the changes.
- In other cases, testing may be more complex, and providing steps on how to set up and test everything will be very valuable for reviewers.

### Merging a PR

- Make sure that **all CI statuses are green**.
- Always use `Squash and merge` as the merging mode (default).
- Double-check that the title of the commit ("subject line") is **your PR title**, followed by the PR number prefixed with a `#` in parentheses.
- Merge commit message example: `ROX-1234: Add feature ABC (#5678)`.
- The body of the commit message should be empty. If GitHub pre-populates it, delete it.

## Code Review Process

- All PRs require at least one approval before merging
- Address all reviewer comments and suggestions
- Keep PRs focused and reasonably sized
- Respond to feedback in a timely manner

## License

By contributing to StackRox MCP, you agree that your contributions will be licensed under the Apache License 2.0.
7 changes: 7 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
### Description

<!-- Please provide information on what this PR changes. -->

### Validation

<!-- Please provide information on how changes have been validated and tested. -->
10 changes: 10 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# IDE and editor files
.vscode/
.idea/
.DS_Store

# Test coverage output
/*.out

# Build output
/stackrox-mcp
41 changes: 41 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# StackRox MCP

## Project Overview

StackRox MCP is a Model Context Protocol (MCP) server that provides AI assistants with access to StackRox.

## Quick Start

Clone the repository:
```bash
git clone https://github.com/stackrox/stackrox-mcp.git
cd stackrox-mcp
```

Build the project:
```bash
go build -o stackrox-mcp ./cmd/stackrox-mcp
```

Run the server:
```bash
./stackrox-mcp
```

## How to Run Tests

Run all unit tests:
```bash
go test ./...
```

Run tests with coverage:
```bash
go test -cover ./...
```

Generate detailed coverage report:
```bash
go test -coverprofile=coverage.out ./...
go tool cover -html=coverage.out
```
16 changes: 16 additions & 0 deletions cmd/stackrox-mcp/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package main

import (
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)

func setupLogging() {
zerolog.SetGlobalLevel(zerolog.InfoLevel)
}

func main() {
setupLogging()

log.Info().Msg("Starting Stackrox MCP server")
}
13 changes: 13 additions & 0 deletions cmd/stackrox-mcp/main_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package main

import (
"testing"

"github.com/rs/zerolog"
"github.com/stretchr/testify/assert"
)

func TestSetupLogging(t *testing.T) {
setupLogging()
assert.Equal(t, zerolog.InfoLevel, zerolog.GlobalLevel())
}
17 changes: 17 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
module github.com/stackrox/stackrox-mcp

go 1.24

require (
github.com/rs/zerolog v1.33.0
github.com/stretchr/testify v1.11.1
)

require (
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.19 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
golang.org/x/sys v0.12.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
25 changes: 25 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
github.com/rs/zerolog v1.33.0 h1:1cU2KZkvPxNyfgEmhHAz/1A9Bz+llsdYzklWFzgp0r8=
github.com/rs/zerolog v1.33.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss=
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=