* Add Playwright E2E tests with screenshot golden testing - Add E2E tests for all 8 MCP server examples - Screenshot golden images for visual regression testing - CI workflow for running E2E tests - npm scripts: test:e2e, test:e2e:update, test:e2e:ui 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Add default demo code for Three.js example When no code is provided, show a rotating green cube demo. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Add E2E testing documentation to CONTRIBUTING.md 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Update Three.js golden screenshot with 3D cube 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Add explicit permissions to CI workflow Set minimal read-only permissions for security best practices. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Fix test.setTimeout() to be inside describe blocks Playwright requires setTimeout to be called within a test or describe block. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Simplify E2E tests - remove excessive timeouts - Remove explicit setTimeout calls (default 30s is sufficient) - Replace waitForTimeout(5000/6000) with proper waitForAppLoad() - Wait for inner iframe visibility instead of fixed delays - Keep only 500ms stabilization for screenshot animations 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Auto-generate missing snapshots in CI Use updateSnapshots: 'missing' in CI to handle cross-platform screenshot differences (macOS vs Linux). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Use platform-agnostic golden screenshots - Remove -chromium-darwin suffix from snapshot filenames - Configure snapshotPathTemplate for cross-platform compatibility - Increase tolerance to 5% for rendering differences between platforms 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Refactor tests to use forEach instead of for-of loop May help with Playwright test discovery issues in CI. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Use npm ci and list reporter in CI - Use npm ci for exact package versions - Use --reporter=list instead of html to avoid potential re-evaluation issues - Only upload test-results on failure 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Exclude e2e tests from bun test Run bun test only on src/ directory to avoid running Playwright tests with Bun's test runner. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Fix prettier formatting 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Add interaction tests for basic server apps Test that clicking buttons in the MCP App triggers the corresponding host callbacks: - Send Message → host logs "Message from MCP App" - Send Log → host logs "Log message from MCP App" - Open Link → host logs "Open link request" Tests both React and Vanilla JS implementations. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Mask dynamic content in E2E screenshot tests Add Playwright mask option to handle servers with dynamic/random content: - basic-react/vanillajs: mask server time display - system-monitor: mask CPU chart, memory stats, uptime - cohort-heatmap: mask heatmap grid (random data) - customer-segmentation: mask scatter chart (random data) This addresses PR feedback about handling examples with non-deterministic output. Masking replaces the previous 10% tolerance with proper exclusion of dynamic elements, allowing tighter 1% tolerance for the rest of the UI. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Add wiki-explorer to E2E tests with default URL param - Add default URL "https://en.wikipedia.org/wiki/Model_Context_Protocol" to wiki-explorer-server's get-first-degree-links tool inputSchema - Update basic-host to automatically populate input field with tool defaults extracted from inputSchema.properties - Add wiki-explorer-server to E2E test suite with dynamic masking for the force-directed graph 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Use .default() for threejs tool schema instead of .optional() This exposes the default code and height values in the JSON Schema, allowing basic-host to auto-populate the input field with defaults. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Enable parallel E2E tests with timeouts and canvas masking - Enable fullyParallel with 4 workers locally (2 in CI) - Add 30s timeout per test - Mask threejs canvas for stable screenshots - Update snapshots to reflect default values in input fields 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Add pre-commit check for private registry URLs in package-lock.json Same check as in CI to catch issues before push. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Increase screenshot diff tolerance to 6% for cross-platform rendering Font rendering differs between macOS and Linux, causing ~5% pixel differences. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Revert pre-commit artifactory check (moved to separate PR #133) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Format threejs server.ts 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * Update CONTRIBUTING.md to reflect platform-agnostic screenshots 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * fix(e2e): use factory pattern for MCP servers to support parallel connections McpServer only supports one transport at a time. When multiple browser contexts connected in parallel, calling server.connect(transport) for each session overwrote the previous transport's callbacks, causing connection corruption and test timeouts. Changes: - server-utils.ts: accept factory function instead of single instance - All 9 example servers: wrap server creation in createServer() function - playwright.config.ts: re-enable parallel execution (4 workers) - servers.spec.ts: add toBeEnabled wait for server connection - Update screenshot baselines for basic-vanillajs and cohort-heatmap 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
184 lines
5.3 KiB
Markdown
184 lines
5.3 KiB
Markdown
# Contributing to MCP Apps SDK
|
|
|
|
We welcome contributions to the MCP Apps SDK! This document outlines the process for contributing to the project.
|
|
|
|
## Getting Started
|
|
|
|
1. Fork the repository
|
|
2. Clone your fork: `git clone https://github.com/YOUR-USERNAME/ext-apps.git`
|
|
3. Install dependencies: `npm install`
|
|
4. Build the project: `npm run build`
|
|
5. Run tests: `npm test`
|
|
|
|
## Development Process
|
|
|
|
1. Create a new branch for your changes
|
|
2. Make your changes
|
|
3. Run `npm run prettier` to ensure code style compliance
|
|
4. Run `npm test` to verify all tests pass
|
|
5. Submit a pull request
|
|
|
|
## Pull Request Guidelines
|
|
|
|
- Follow the existing code style
|
|
- Include tests for new functionality
|
|
- Update documentation as needed
|
|
- Keep changes focused and atomic
|
|
- Provide a clear description of changes
|
|
|
|
## Running Examples
|
|
|
|
Start the development environment with hot reloading:
|
|
|
|
```bash
|
|
npm run examples:dev
|
|
```
|
|
|
|
Or build and run examples:
|
|
|
|
```bash
|
|
npm run examples:start
|
|
```
|
|
|
|
## Testing
|
|
|
|
### Unit Tests
|
|
|
|
Run unit tests with Bun:
|
|
|
|
```bash
|
|
npm test
|
|
```
|
|
|
|
### E2E Tests
|
|
|
|
E2E tests use Playwright to verify all example servers work correctly with screenshot comparisons.
|
|
|
|
```bash
|
|
# Run all E2E tests
|
|
npm run test:e2e
|
|
|
|
# Run a specific server's tests
|
|
npm run test:e2e -- --grep "Budget Allocator"
|
|
|
|
# Run tests in interactive UI mode
|
|
npm run test:e2e:ui
|
|
```
|
|
|
|
### Updating Golden Screenshots
|
|
|
|
When UI changes are intentional, update the golden screenshots:
|
|
|
|
```bash
|
|
# Update all screenshots
|
|
npm run test:e2e:update
|
|
|
|
# Update screenshots for a specific server
|
|
npm run test:e2e:update -- --grep "Three.js"
|
|
```
|
|
|
|
**Note**: Golden screenshots are platform-agnostic. Tests use canvas masking and tolerance thresholds to handle minor cross-platform rendering differences.
|
|
|
|
## Code of Conduct
|
|
|
|
This project follows our [Code of Conduct](CODE_OF_CONDUCT.md). Please review it before contributing.
|
|
|
|
## Reporting Issues
|
|
|
|
- Use the [GitHub issue tracker](https://github.com/modelcontextprotocol/ext-apps/issues)
|
|
- Search existing issues before creating a new one
|
|
- Provide clear reproduction steps
|
|
|
|
## Security Issues
|
|
|
|
Please review our [Security Policy](SECURITY.md) for reporting security vulnerabilities.
|
|
|
|
---
|
|
|
|
## For Maintainers
|
|
|
|
### Repository Setup
|
|
|
|
This repository uses [npm trusted publishing](https://docs.npmjs.com/trusted-publishers/) with OIDC - no secrets required.
|
|
|
|
Before publishing releases, ensure the following are configured:
|
|
|
|
1. **Trusted publisher on npm**: Configure the package to trust this GitHub repository
|
|
- Go to https://www.npmjs.com/package/@modelcontextprotocol/ext-apps/access
|
|
- Under "Trusted Publishers", click "Add trusted publisher"
|
|
- Select "GitHub Actions"
|
|
- Repository: `modelcontextprotocol/ext-apps`
|
|
- Workflow filename: `npm-publish.yml`
|
|
- Environment: `Release` (optional, for additional protection)
|
|
|
|
2. **`Release` environment** (optional): Create a protected environment for additional safeguards
|
|
- Go to Settings > Environments > New environment
|
|
- Name it `Release`
|
|
- Add required reviewers or other protection rules as needed
|
|
|
|
### Publishing a Release
|
|
|
|
Releases are published automatically via GitHub Actions when a GitHub Release is created.
|
|
|
|
#### Steps to publish:
|
|
|
|
1. **Update the version** in `package.json`:
|
|
|
|
```bash
|
|
# For a regular release
|
|
npm version patch # or minor, or major
|
|
|
|
# For a beta release
|
|
npm version prerelease --preid=beta
|
|
```
|
|
|
|
2. **Commit the version bump** (if not done by `npm version`):
|
|
|
|
```bash
|
|
git add package.json
|
|
git commit -m "Bump version to X.Y.Z"
|
|
git push origin main
|
|
```
|
|
|
|
3. **Create a GitHub Release**:
|
|
- Go to [Releases](https://github.com/modelcontextprotocol/ext-apps/releases)
|
|
- Click "Draft a new release"
|
|
- Create a new tag matching the version (e.g., `v0.1.0`)
|
|
- Set the target branch (usually `main`)
|
|
- Write release notes describing the changes
|
|
- Click "Publish release"
|
|
|
|
4. **Monitor the workflow**:
|
|
- The [npm-publish workflow](https://github.com/modelcontextprotocol/ext-apps/actions/workflows/npm-publish.yml) will trigger automatically
|
|
- It runs build and test jobs before publishing
|
|
- On success, the package is published to npm with provenance
|
|
|
|
#### npm Tags
|
|
|
|
The workflow automatically determines the npm dist-tag:
|
|
|
|
| Version Pattern | npm Tag | Install Command |
|
|
| ----------------------------- | ------------- | -------------------------------------------------------- |
|
|
| `X.Y.Z` (from main) | `latest` | `npm install @modelcontextprotocol/ext-apps` |
|
|
| `X.Y.Z-beta.N` | `beta` | `npm install @modelcontextprotocol/ext-apps@beta` |
|
|
| `X.Y.Z` (from release branch) | `release-X.Y` | `npm install @modelcontextprotocol/ext-apps@release-X.Y` |
|
|
|
|
#### Maintenance Releases
|
|
|
|
To release a patch for an older version:
|
|
|
|
1. Create a release branch from the tag: `git checkout -b release-0.1 v0.1.0`
|
|
2. Cherry-pick or apply fixes
|
|
3. Bump the patch version
|
|
4. Create a GitHub Release targeting the release branch
|
|
5. The package will be published with tag `release-0.1`
|
|
|
|
### Testing Pre-releases
|
|
|
|
Every commit and PR automatically publishes a preview package via [pkg-pr-new](https://github.com/pkg-pr-new/pkg-pr-new). Check the PR comments or workflow logs for the install command.
|
|
|
|
---
|
|
|
|
## License
|
|
|
|
By contributing, you agree that your contributions will be licensed under the MIT License.
|