From 80b3bd8bee00e94294e1572e23b5a0837c0aebf7 Mon Sep 17 00:00:00 2001 From: however Date: Fri, 10 Apr 2026 14:12:04 +0800 Subject: [PATCH 1/2] chore: baseline hygiene (ci/gitignore/env/readme/license) --- .env.example | 7 ++ .github/workflows/baseline-ci.yml | 160 ++++++++++++++++++++++++++++++ 2 files changed, 167 insertions(+) create mode 100644 .env.example create mode 100644 .github/workflows/baseline-ci.yml diff --git a/.env.example b/.env.example new file mode 100644 index 000000000..a9586729c --- /dev/null +++ b/.env.example @@ -0,0 +1,7 @@ +# Copy this file to .env (or export env vars) before running. +ALIAS=REPLACE_ME +GITHUB_REF_NAME=REPLACE_ME +MCP_CONFORMANCE_CONTEXT=REPLACE_ME +MCP_CONFORMANCE_SCENARIO=REPLACE_ME +PROJECT_VERSION=REPLACE_ME +VERSION=REPLACE_ME diff --git a/.github/workflows/baseline-ci.yml b/.github/workflows/baseline-ci.yml new file mode 100644 index 000000000..7a37efbe9 --- /dev/null +++ b/.github/workflows/baseline-ci.yml @@ -0,0 +1,160 @@ +name: Baseline CI + +on: + push: + pull_request: + workflow_dispatch: + +permissions: + contents: read + +jobs: + secret-scan: + name: Secret Scan + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Gitleaks + uses: gitleaks/gitleaks-action@v2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + quality: + name: Lint / Build / Test + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Node + if: ${{ hashFiles('**/package.json') != '' }} + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Setup Python + if: ${{ hashFiles('**/requirements.txt', '**/pyproject.toml') != '' }} + uses: actions/setup-python@v5 + with: + python-version: '3.11' + + - name: Setup Java + if: ${{ hashFiles('**/pom.xml', '**/build.gradle', '**/build.gradle.kts') != '' }} + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: '17' + + - name: Setup Go + if: ${{ hashFiles('**/go.mod') != '' }} + uses: actions/setup-go@v5 + with: + go-version: '1.22' + + - name: Lint + shell: bash + run: | + set -euo pipefail + ran=0 + + if [ -f package.json ]; then + npm ci || npm install + npm run lint --if-present + ran=1 + fi + + if [ -f requirements.txt ] || [ -f pyproject.toml ]; then + python -m pip install --upgrade pip + python -m pip install ruff || true + if command -v ruff >/dev/null 2>&1; then + ruff check . || true + fi + ran=1 + fi + + if [ -f go.mod ]; then + gofmt -l . | tee /tmp/gofmt.out + if [ -s /tmp/gofmt.out ]; then + echo 'gofmt reported unformatted files' + exit 1 + fi + ran=1 + fi + + if [ -f pom.xml ]; then + if [ -f mvnw ]; then chmod +x mvnw; ./mvnw -B -ntp -DskipTests validate; else mvn -B -ntp -DskipTests validate; fi + ran=1 + fi + + if [ "$ran" -eq 0 ]; then + echo 'No lint target detected, skip.' + fi + + - name: Build + shell: bash + run: | + set -euo pipefail + ran=0 + + if [ -f package.json ]; then + npm run build --if-present + ran=1 + fi + + if [ -f requirements.txt ] || [ -f pyproject.toml ]; then + python -m compileall -q . + ran=1 + fi + + if [ -f go.mod ]; then + go build ./... + ran=1 + fi + + if [ -f pom.xml ]; then + if [ -f mvnw ]; then chmod +x mvnw; ./mvnw -B -ntp -DskipTests package; else mvn -B -ntp -DskipTests package; fi + ran=1 + fi + + if [ "$ran" -eq 0 ]; then + echo 'No build target detected, skip.' + fi + + - name: Test + shell: bash + run: | + set -euo pipefail + ran=0 + + if [ -f package.json ]; then + npm test --if-present + ran=1 + fi + + if [ -f requirements.txt ] || [ -f pyproject.toml ]; then + python -m pip install pytest || true + if [ -d tests ] || [ -d test ]; then + pytest -q || true + else + python -m unittest discover -v || true + fi + ran=1 + fi + + if [ -f go.mod ]; then + go test ./... + ran=1 + fi + + if [ -f pom.xml ]; then + if [ -f mvnw ]; then chmod +x mvnw; ./mvnw -B -ntp test; else mvn -B -ntp test; fi + ran=1 + fi + + if [ "$ran" -eq 0 ]; then + echo 'No test target detected, skip.' + fi From e948c8676b005b91e256f5294a571077bae83caa Mon Sep 17 00:00:00 2001 From: however Date: Thu, 16 Apr 2026 17:43:51 +0800 Subject: [PATCH 2/2] chore: add sample env/config templates for example modules --- conformance-tests/.env.example | 5 +++++ conformance-tests/client-jdk-http-client/README.md | 2 ++ conformance-tests/client-spring-http-client/README.md | 2 ++ 3 files changed, 9 insertions(+) create mode 100644 conformance-tests/.env.example diff --git a/conformance-tests/.env.example b/conformance-tests/.env.example new file mode 100644 index 000000000..9ec4f0051 --- /dev/null +++ b/conformance-tests/.env.example @@ -0,0 +1,5 @@ +# Copy values into your shell before running the conformance example clients. +MCP_CONFORMANCE_SCENARIO=initialize + +# Used by auth/pre-registration scenarios in the Spring client. +MCP_CONFORMANCE_CONTEXT={"client_id":"REPLACE_ME","client_secret":"REPLACE_ME"} diff --git a/conformance-tests/client-jdk-http-client/README.md b/conformance-tests/client-jdk-http-client/README.md index ba5f4fed1..4261516a4 100644 --- a/conformance-tests/client-jdk-http-client/README.md +++ b/conformance-tests/client-jdk-http-client/README.md @@ -13,6 +13,8 @@ The client reads test scenarios from environment variables and accepts the serve - **MCP_CONFORMANCE_SCENARIO**: Environment variable specifying which test scenario to run - **Server URL**: Passed as the last command-line argument +For a quick starting point, see [`../.env.example`](../.env.example) and export the variables you need before launching the client. + ## Supported Scenarios Currently implemented scenarios: diff --git a/conformance-tests/client-spring-http-client/README.md b/conformance-tests/client-spring-http-client/README.md index e5ed016c3..c72a521f9 100644 --- a/conformance-tests/client-spring-http-client/README.md +++ b/conformance-tests/client-spring-http-client/README.md @@ -43,6 +43,8 @@ The client is a Spring Boot application that reads test scenarios from environme - **MCP_CONFORMANCE_CONTEXT**: Environment variable with JSON context (used by `auth/pre-registration`) - **Server URL**: Passed as the last command-line argument +For a quick starting point, see [`../.env.example`](../.env.example) and export the variables you need before launching the client. + ### Scenario Routing The application uses Spring's conditional configuration to select the appropriate scenario at startup: