Thanks for taking the time to contribute! This guide covers everything you need to get from a fresh clone to an open pull request.
- Prerequisites
- Getting Set Up
- Project Structure
- Running the Server Locally
- Running Tests
- Making Changes
- Commit Messages
- Opening a Pull Request
- Releasing
- Python 3.12 (see
.python-version) uvfor dependency management and running scripts- Docker (optional, only needed if you're changing the
Dockerfileor testing the container image) - Git
The fastest way to start: click the "Open in GitHub Codespaces" badge in the README, or open the repo in VS Code with the Dev Containers extension. The .devcontainer config installs Python, uv, and syncs dependencies for you automatically.
-
Fork the repo, then clone your fork:
git clone https://github.com/<your-username>/mcp-wordle-python.git cd mcp-wordle-python
-
Install dependencies (this creates a
.venvand installs both runtime and dev dependencies):uv sync
-
Create a branch for your change:
git checkout -b your-branch-name
.
├── src/mcp_wordle/main.py # The MCP server: tool definitions and Wordle API logic
├── tests/ # pytest regression tests
├── Dockerfile # Multi-stage build used by the published image
├── fastmcp.json # FastMCP CLI entrypoint config
└── .github/workflows/ # CI (tests/uvx/Docker validation) and release automation
The server itself is intentionally small: one FastMCP tool (get_wordle_solution) that validates a requested date and fetches the corresponding solution from the NYT Wordle API. Keep additions consistent with that — this project favors small, direct functions over added abstraction.
You can run the server directly to confirm it starts:
uv run mcp-wordleIt communicates over stdio, so it won't print much beyond a startup banner until an MCP client (e.g. the MCP Inspector, Claude Desktop, or Claude Code) connects to it. To try it against a real client, point your MCP client config at your local checkout instead of the published package, e.g.:
{
"mcpServers": {
"Wordle MCP (dev)": {
"command": "uv",
"args": ["--directory", "/path/to/your/clone", "run", "mcp-wordle"]
}
}
}uv run pytestTests use pytest with respx to mock the Wordle API's HTTP responses, so they run offline and don't hit the real API. If you add or change behavior in src/mcp_wordle/main.py, add or update a corresponding test in tests/test_main.py.
Every push and pull request also runs through the CI workflow, which runs the test suite, verifies the package installs and starts via uvx, and confirms the Docker image still builds. A pull request needs this to pass before it can be merged.
-
Keep changes focused — unrelated cleanup or refactoring should be a separate PR.
-
Match the existing style: plain functions over unnecessary classes, no comments explaining what code does (only why, when it's non-obvious).
-
If you're changing the Dockerfile, validate it builds locally before pushing:
docker build -t mcp-wordle:dev .
This project follows Conventional Commits. Prefix your commit message with the type of change, e.g.:
feat: add support for Xfix: correct date validation off-by-onetest: add coverage for Ydocs: update READMEci: adjust workflow triggerchore: bump dependency
- Push your branch to your fork.
- Open a Pull Request against
master. - Describe what changed and why. Link any related issues.
- Make sure CI is green before requesting review.
Releases are maintainer-triggered via git tags, not part of a typical contribution — see the README's Releasing section if you need the details.