Skip to content

feat: add MCP conformance workflow - #76

Merged
nickytonline merged 1 commit into
mainfrom
feat/mcp-conformance-workflow
Jun 30, 2026
Merged

feat: add MCP conformance workflow#76
nickytonline merged 1 commit into
mainfrom
feat/mcp-conformance-workflow

Conversation

@nickytonline

@nickytonline nickytonline commented Jun 30, 2026

Copy link
Copy Markdown
Owner

Summary

Adds a GitHub Actions conformance job that builds and starts the server
via Docker Compose (with a native health check) and runs the active
suite via modelcontextprotocol/conformance@v0.1.10.

Also adds docker-compose.yml with a Node.js-based health check (avoids
adding curl to the image) and an empty conformance-baseline.yml for
tracking expected failures.

Generated with Devin

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>

Related Issues

Closes #75

Post Merge TODO

  • Once the PR merges and the job has run once on main, add "conformance"
    as a required status check in branch protection settings.

AI Disclosure

Chatted with Devin who implemented the the majority of this and I reviewed it all.

Adds a GitHub Actions conformance job that builds and starts the server
via Docker Compose (with a native health check) and runs the active
suite via modelcontextprotocol/conformance@v0.1.10.

Also adds docker-compose.yml with a Node.js-based health check (avoids
adding curl to the image) and an empty conformance-baseline.yml for
tracking expected failures.

Once the PR merges and the job has run once on main, add "conformance"
as a required status check in branch protection settings.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Copilot AI review requested due to automatic review settings June 30, 2026 20:27
@coderabbitai

coderabbitai Bot commented Jun 30, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@nickytonline, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 24 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 2f11eca9-1723-49c5-a574-a3dc92b87081

📥 Commits

Reviewing files that changed from the base of the PR and between 8d8c917 and f795d8e.

📒 Files selected for processing (4)
  • .github/workflows/conformance.yml
  • README.md
  • conformance-baseline.yml
  • docker-compose.yml
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/mcp-conformance-workflow

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@nickytonline
nickytonline enabled auto-merge (squash) June 30, 2026 20:28
@nickytonline
nickytonline merged commit bc445e0 into main Jun 30, 2026
12 checks passed
@nickytonline
nickytonline deleted the feat/mcp-conformance-workflow branch June 30, 2026 20:28
@github-actions

Copy link
Copy Markdown

🎉 This PR is included in version 1.1.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds MCP conformance testing to the template’s CI by bringing up the server via Docker Compose (with a healthcheck) and running the active conformance suite against the /mcp endpoint, along with documentation and an expected-failures baseline file.

Changes:

  • Add a GitHub Actions workflow to run MCP conformance tests against the running containerized server.
  • Add docker-compose.yml with a Node-based healthcheck and conformance-baseline.yml for expected failures.
  • Update README with instructions for CI/local conformance testing and simplify the Docker Compose documentation.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

File Description
README.md Documents MCP conformance testing usage in CI and locally; updates Docker Compose instructions.
docker-compose.yml Adds Compose definition for running the server with a healthcheck for readiness.
conformance-baseline.yml Introduces an expected-failures baseline for unimplemented MCP features.
.github/workflows/conformance.yml Adds CI job to start the server via Compose and run the conformance suite.

Comment thread docker-compose.yml
Comment thread .github/workflows/conformance.yml
@greptile-apps

greptile-apps Bot commented Jun 30, 2026

Copy link
Copy Markdown

Greptile Summary

This PR introduces a GitHub Actions conformance workflow that builds the MCP server via Docker Compose, waits for its health check to pass, then runs the modelcontextprotocol/conformance active test suite against it. A conformance-baseline.yml captures all currently-expected failures so CI enforces only what the template implements.

  • .github/workflows/conformance.yml — new conformance job triggered on push to main and on PRs; uses docker compose up -d --wait so the job only proceeds once the container is healthy.
  • docker-compose.yml — new file with a Node.js inline health check on GET /mcp (no curl dependency); parameters give the server up to ~40 s to become ready.
  • conformance-baseline.yml — lists expected failures (resources, prompts, elicitation, logging, DNS rebinding protection) with comments instructing template users to remove entries as they implement features.

Confidence Score: 4/5

Safe to merge — the workflow wires together correctly and the health check matches the server's actual GET /mcp behaviour.

The overall logic is sound: the Docker health check correctly targets a GET /mcp endpoint that the Express server serves with 200, --wait ensures the job only proceeds once the container is up, and the baseline cleanly tracks unimplemented features. The three comments are housekeeping items (tag vs SHA pinning, missing job timeout, implicit --build) that don't affect whether conformance tests pass today but could bite if caching or long-running jobs become an issue.

.github/workflows/conformance.yml — worth adding a timeout-minutes, an explicit --build, and pinning the conformance action to a SHA.

Important Files Changed

Filename Overview
.github/workflows/conformance.yml New conformance CI workflow. Core logic is correct — Docker Compose health check, --wait flag, and the conformance action all wire together properly. Minor housekeeping: no job timeout, action pinned by semver tag instead of SHA, and --build not explicit.
docker-compose.yml New Docker Compose file with a Node.js-based health check targeting GET /mcp. Health check parameters (2s interval, 15 retries, 10s start_period) are reasonable for a build-then-start scenario, and the server's GET handler returns 200 confirming the check will pass once the server is ready.
conformance-baseline.yml Baseline of expected conformance failures, well-organized with comments explaining each group. Accurately reflects what the template does not yet implement (resources, prompts, elicitation, logging control, DNS rebinding protection).
README.md Adds a clear MCP Conformance Testing section documenting the CI setup and local run command. Also removes the now-redundant inline docker-compose snippet in the Docker Compose section, replacing it with a pointer to the included file.

Sequence Diagram

%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
    participant GHA as GitHub Actions
    participant DC as Docker Compose
    participant Srv as MCP Server (container)
    participant HC as Health Check (node -e)
    participant CF as modelcontextprotocol/conformance

    GHA->>DC: docker compose up -d --wait
    DC->>Srv: "build & start container"
    loop until healthy (up to ~40s)
        DC->>HC: run health check (GET /mcp)
        HC-->>Srv: HTTP GET localhost:3000/mcp
        Srv-->>HC: 200 OK (server info JSON)
        HC-->>DC: exit 0 (healthy)
    end
    DC-->>GHA: all services healthy
    GHA->>CF: "uses modelcontextprotocol/conformance@v0.1.11"
    CF->>Srv: MCP protocol messages (active suite)
    Srv-->>CF: responses
    CF-->>GHA: pass / fail with expected-failures baseline
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
    participant GHA as GitHub Actions
    participant DC as Docker Compose
    participant Srv as MCP Server (container)
    participant HC as Health Check (node -e)
    participant CF as modelcontextprotocol/conformance

    GHA->>DC: docker compose up -d --wait
    DC->>Srv: "build & start container"
    loop until healthy (up to ~40s)
        DC->>HC: run health check (GET /mcp)
        HC-->>Srv: HTTP GET localhost:3000/mcp
        Srv-->>HC: 200 OK (server info JSON)
        HC-->>DC: exit 0 (healthy)
    end
    DC-->>GHA: all services healthy
    GHA->>CF: "uses modelcontextprotocol/conformance@v0.1.11"
    CF->>Srv: MCP protocol messages (active suite)
    Srv-->>CF: responses
    CF-->>GHA: pass / fail with expected-failures baseline
Loading

Reviews (1): Last reviewed commit: "feat: add MCP conformance workflow" | Re-trigger Greptile

run: docker compose up -d --wait

- name: Run MCP conformance tests
uses: modelcontextprotocol/conformance@v0.1.11

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Action pinned by mutable tag, not commit SHA

modelcontextprotocol/conformance@v0.1.11 uses a semver tag that can be force-pushed, so a future tag overwrite would silently change what runs in CI without any diff visible in this repo. The GitHub Actions hardening recommendation is to pin third-party actions to a full commit SHA (e.g. modelcontextprotocol/conformance@<sha>) and record the version in a comment.

Comment on lines +12 to +14
conformance:
runs-on: ubuntu-latest

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 No job-level timeout configured

Without a timeout-minutes on the job, GitHub Actions defaults to 6 hours. If docker compose up -d --wait hangs (e.g., a build regression causes the health check to never pass), the job will consume runner minutes for up to 6 hours before it is killed. A timeout of 15–20 minutes would catch stuck builds promptly and keep billing predictable.

Comment on lines +19 to +20
- name: Start MCP server
run: docker compose up -d --wait

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Adding --build ensures Docker always rebuilds the image from the current source rather than relying on a cached layer. Without it, if Docker layer caching is ever enabled on this runner (e.g., via docker/setup-buildx-action), a stale image could be used and the conformance test would not reflect the current code.

Suggested change
- name: Start MCP server
run: docker compose up -d --wait
- name: Start MCP server
run: docker compose up -d --wait --build

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

nickytonline added a commit that referenced this pull request Jun 30, 2026
- Remove trailing comma from docker-compose.yml health check test array
- Add --wait-timeout 60 to docker compose up to prevent hung CI runs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: add MCP conformance testing workflow

2 participants