docs/stateless-lifecycle.md walks the revision end to end - per-request _meta, server/discover, multi round-trip requests, caching and subscriptions - and a runnable example on each side shows what that looks like in code. CI matrixes both conformance roles over both revisions. --spec-version is cumulative across the dated revisions, so 2025-11-25 covers the two before it; 2026-07-28 is not cumulative with them and needs its own run against its own baseline. The runner is pinned so a PR only goes red for reasons in the PR, and conformance-weekly tracks the moving target instead - on both revisions, since the draft scenarios ship only on the alpha dist-tag. The Inspector cannot reach a modern-lifecycle server (it opens with initialize), so the example is covered by integration tests instead: one drives it with hand-built HTTP the way a conforming client would, one drives it with this SDK's client, and one drives the single endpoint from both eras.
248 lines
6.8 KiB
YAML
248 lines
6.8 KiB
YAML
name: pipeline
|
|
on: pull_request
|
|
|
|
permissions:
|
|
contents: read
|
|
pull-requests: write
|
|
|
|
env:
|
|
# Pinned exact version; conformance-weekly.yaml tracks upstream releases.
|
|
CONFORMANCE_PKG: "@modelcontextprotocol/conformance@0.2.0-alpha.11"
|
|
|
|
jobs:
|
|
unit:
|
|
runs-on: ubuntu-latest
|
|
strategy:
|
|
matrix:
|
|
php: ['8.1', '8.2', '8.3', '8.4', '8.5']
|
|
dependencies: ['lowest', 'highest']
|
|
symfony-version: ['']
|
|
include:
|
|
- symfony-version: '5.4.*'
|
|
dependencies: 'highest'
|
|
php: '8.2'
|
|
- symfony-version: '6.4.*'
|
|
dependencies: 'highest'
|
|
php: '8.2'
|
|
- symfony-version: '7.4.*'
|
|
dependencies: 'highest'
|
|
php: '8.4'
|
|
- symfony-version: '8.0.*'
|
|
dependencies: 'highest'
|
|
php: '8.4'
|
|
|
|
env:
|
|
SYMFONY_REQUIRE: ${{ matrix.symfony-version || '>=6.4' }}
|
|
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v7
|
|
|
|
- name: Setup PHP
|
|
uses: shivammathur/setup-php@v2
|
|
with:
|
|
php-version: ${{ matrix.php }}
|
|
tools: flex
|
|
coverage: "none"
|
|
|
|
- name: Install Composer
|
|
uses: "ramsey/composer-install@v4"
|
|
with:
|
|
dependency-versions: "${{ matrix.dependencies }}"
|
|
|
|
- name: Tests
|
|
run: vendor/bin/phpunit --testsuite=unit
|
|
|
|
integration:
|
|
runs-on: ubuntu-latest
|
|
strategy:
|
|
matrix:
|
|
php: ['8.1', '8.2', '8.3', '8.4', '8.5']
|
|
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v7
|
|
|
|
- name: Setup PHP
|
|
uses: shivammathur/setup-php@v2
|
|
with:
|
|
php-version: ${{ matrix.php }}
|
|
coverage: "none"
|
|
|
|
- name: Install Composer
|
|
uses: "ramsey/composer-install@v4"
|
|
|
|
- name: Tests
|
|
run: vendor/bin/phpunit --testsuite=integration
|
|
|
|
inspector:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v7
|
|
|
|
- name: Setup PHP
|
|
uses: shivammathur/setup-php@v2
|
|
with:
|
|
php-version: '8.4'
|
|
coverage: "none"
|
|
|
|
- name: Setup Node
|
|
uses: actions/setup-node@v7
|
|
with:
|
|
node-version: '22'
|
|
|
|
- name: Install Composer
|
|
uses: "ramsey/composer-install@v4"
|
|
|
|
- name: Tests
|
|
run: vendor/bin/phpunit --testsuite=inspector
|
|
|
|
conformance-server:
|
|
name: conformance / server (${{ matrix.spec-version }})
|
|
runs-on: ubuntu-latest
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- spec-version: '2025-11-25'
|
|
path: '/'
|
|
baseline: conformance-baseline-2025-11-25.yml
|
|
- spec-version: '2026-07-28'
|
|
path: '/'
|
|
baseline: conformance-baseline-2026-07-28.yml
|
|
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v7
|
|
|
|
- name: Setup Node
|
|
uses: actions/setup-node@v7
|
|
with:
|
|
node-version: '22'
|
|
|
|
- name: Install Composer
|
|
uses: "ramsey/composer-install@v4"
|
|
|
|
- name: Start conformance server
|
|
run: |
|
|
mkdir -p tests/Conformance/sessions tests/Conformance/logs
|
|
chmod -R 777 tests/Conformance/sessions tests/Conformance/logs
|
|
docker compose -f tests/Conformance/Fixtures/docker-compose.yml up -d
|
|
sleep 5
|
|
|
|
- name: Run conformance tests
|
|
working-directory: ./tests/Conformance
|
|
run: >-
|
|
npx --yes ${{ env.CONFORMANCE_PKG }} server
|
|
--url http://localhost:8000${{ matrix.path }}
|
|
--suite all
|
|
--spec-version ${{ matrix.spec-version }}
|
|
--expected-failures ${{ matrix.baseline }}
|
|
|
|
- name: Show logs on failure
|
|
if: failure()
|
|
run: |
|
|
echo "=== Docker Compose Logs ==="
|
|
docker compose -f tests/Conformance/Fixtures/docker-compose.yml logs
|
|
echo ""
|
|
echo "=== Conformance Log ==="
|
|
cat tests/Conformance/logs/conformance.log 2>/dev/null || echo "No conformance log found"
|
|
echo ""
|
|
echo "=== Test Results (first failed test) ==="
|
|
find tests/Conformance/results -name "checks.json" 2>/dev/null | head -3 | while read f; do
|
|
echo "--- $f ---"
|
|
cat "$f"
|
|
echo ""
|
|
done || echo "No results found"
|
|
echo ""
|
|
echo "=== Directory permissions ==="
|
|
ls -la tests/Conformance/
|
|
ls -la tests/Conformance/logs/ 2>/dev/null || echo "logs dir issue"
|
|
ls -la tests/Conformance/sessions/ 2>/dev/null || echo "sessions dir issue"
|
|
|
|
- name: Cleanup
|
|
if: always()
|
|
run: docker compose -f tests/Conformance/Fixtures/docker-compose.yml down
|
|
|
|
conformance-client:
|
|
name: conformance / client (${{ matrix.spec-version }})
|
|
runs-on: ubuntu-latest
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
include:
|
|
- spec-version: '2025-11-25'
|
|
baseline: conformance-baseline-2025-11-25.yml
|
|
- spec-version: '2026-07-28'
|
|
baseline: conformance-baseline-2026-07-28.yml
|
|
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v7
|
|
|
|
- name: Setup PHP
|
|
uses: shivammathur/setup-php@v2
|
|
with:
|
|
php-version: '8.4'
|
|
coverage: "none"
|
|
|
|
- name: Setup Node
|
|
uses: actions/setup-node@v7
|
|
with:
|
|
node-version: '22'
|
|
|
|
- name: Install Composer
|
|
uses: "ramsey/composer-install@v4"
|
|
|
|
- name: Create log directory
|
|
run: mkdir -p tests/Conformance/logs
|
|
|
|
- name: Run client conformance tests
|
|
working-directory: ./tests/Conformance
|
|
run: >-
|
|
npx --yes ${{ env.CONFORMANCE_PKG }} client
|
|
--command "php ${{ github.workspace }}/tests/Conformance/client.php"
|
|
--suite all
|
|
--spec-version ${{ matrix.spec-version }}
|
|
--expected-failures ${{ matrix.baseline }}
|
|
|
|
- name: Show logs on failure
|
|
if: failure()
|
|
run: |
|
|
echo "=== Client Conformance Log ==="
|
|
cat tests/Conformance/logs/client-conformance.log 2>/dev/null || echo "No client conformance log found"
|
|
echo ""
|
|
echo "=== Test Results ==="
|
|
find tests/Conformance/results -name "checks.json" 2>/dev/null | head -3 | while read f; do
|
|
echo "--- $f ---"
|
|
cat "$f"
|
|
echo ""
|
|
done || echo "No results found"
|
|
|
|
qa:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v7
|
|
|
|
- name: Setup PHP
|
|
uses: shivammathur/setup-php@v2
|
|
with:
|
|
php-version: '8.1'
|
|
coverage: "none"
|
|
|
|
- name: Composer Validation
|
|
run: composer validate --strict
|
|
|
|
- name: Install Composer
|
|
uses: "ramsey/composer-install@v4"
|
|
|
|
- name: Code Style PHP
|
|
run: vendor/bin/php-cs-fixer fix --dry-run
|
|
|
|
- name: PHPStan
|
|
run: vendor/bin/phpstan analyse
|
|
|
|
- name: Documentation
|
|
run: make docs
|