Thank you for your interest in contributing to better-godot-mcp! This guide will help you get started.
- mise (recommended) or Node.js 24+ and Bun
- Git
- A GitHub account
Recommended: Use mise to automatically manage Node.js and Bun versions from .mise.toml.
- Fork the repository and clone your fork
git clone https://github.com/YOUR_USERNAME/better-godot-mcp
cd better-godot-mcp- Install tools and dependencies
If using mise (recommended):
mise run setupWithout mise, ensure you have Node.js 24+ and Bun installed:
bun install
bun run pre-commit install- Run checks
bun run check # Biome lint + type check
bun test # Run tests# Run the server in dev mode (with watch)
bun run dev- Create a new branch:
git checkout -b feature/your-feature-name - Make your changes
- Run checks:
bun run check - Run tests:
bun test - Commit your changes (see Commit Convention)
- Push to your fork:
git push origin feature/your-feature-name - Open a Pull Request
We use Conventional Commits:
<type>[optional scope]: <description>
Only feat and fix are accepted (enforced by the commit-message hook):
feat: New featurefix: Bug fix (also used for docs, tests, chores, and other maintenance changes)
feat: add new tool action for shader compilation
fix: correct scene parser regex for nested resources
Releases are automated using python-semantic-release (PSR) v10. We strictly follow the Conventional Commits specification to determine version bumps and generate changelogs automatically.
- Create a Pull Request with your changes.
- Ensure your commit messages follow the convention above.
- Merge the PR to
main. - A maintainer triggers the CD workflow manually via workflow_dispatch:
- Choose
betaorstablerelease type. - PSR analyzes commits since the last release.
- Bumps version, updates
CHANGELOG.md, creates a tag. - Publishes to npm.
- Creates a GitHub Release.
- Builds and pushes Docker images.
- Choose
You do not need to create manual tags or changelog entries.
- Keep PRs focused on a single feature or fix
- Update documentation if needed
- Add tests for new functionality
- Ensure all checks pass
Before submitting your PR, ensure:
- Code follows TypeScript best practices
- All tests pass (
bun test) - Linting passes (
bun run check) - Commit messages follow Conventional Commits
- Documentation updated (if needed)
This project uses Biome for formatting and linting.
bun run check # Check for issues (lint + type check)
bun run check:fix # Auto-fix issues- Indent: 2 spaces
- Quotes: Single quotes
- Semicolons: As needed
- Line width: 120 characters
- TypeScript: Strict mode enabled
bun test # Run all tests
bun run test:watch # Watch mode- Write tests for all new functionality
- Place unit tests in
tests/helpers/ - Place integration tests in
tests/composite/ - Use factory functions from
tests/fixtures.ts - Use Vitest as the test framework
better-godot-mcp/
├── src/
│ ├── init-server.ts # MCP server initialization
│ ├── godot/ # Godot detection, types, version checks
│ └── tools/
│ ├── registry.ts # Tool registration and routing
│ ├── composite/ # Composite tool handlers (scenes, nodes, shader, etc.)
│ └── helpers/ # Shared helpers (scene-parser, godot-types, etc.)
├── tests/
│ ├── helpers/ # Unit tests for helpers
│ ├── composite/ # Integration tests for composite tools
│ └── fixtures.ts # Shared test fixtures and factory functions
├── biome.json
├── tsconfig.json
├── package.json
├── README.md
├── CONTRIBUTING.md # This guide
├── LICENSE # Apache-2.0
├── Dockerfile # Docker build configuration
├── AGENTS.md # Agent-specific instructions
└── CLAUDE.md # Development notes and known bugs
Before opening a new issue, please check the Known bugs section in CLAUDE.md.
Feel free to open an issue for:
- Bug reports
- Feature requests
- Questions about the codebase
- Discussion about architecture
By contributing, you agree that your contributions will be licensed under the Apache License, Version 2.0.
Thank you for contributing!