Thank you for your interest in contributing to mcp-awareness!
Before we can accept your contribution, you must agree to the Contributor License Agreement. This is required because mcp-awareness uses dual licensing:
- Open source: AGPL-3.0-or-later (this repository)
- Commercial: A separate commercial license for organizations that cannot use AGPL-licensed software
The CLA grants the project maintainer (Chris Means) the right to sublicense your contributions under any license, including proprietary. This preserves the ability to offer both the open-source AGPL and commercial license options. It does not transfer your copyright — you retain full ownership of your contribution.
The full CLA text lives in CLA.md.
Signing is automated via the CLA Assistant bot. The first time you open a pull request, the bot will:
- Post a comment with a link to read the CLA and a sign-in prompt.
- Set a pull request status check (
license/cla) that blocks merge until you sign.
To sign, comment on the pull request with the exact phrase the bot provides, which is:
I have read the CLA Document and I hereby sign the CLA
The bot will re-check, mark the status green, and allow the PR to proceed. Signing is a one-time action — the same signature applies to all your future pull requests.
Your GitHub username and the timestamp of your signature are recorded in a
public Gist owned by the maintainer; see docs/cla.md for
the signature record location.
pip install -e ".[dev]" # install with dev dependencies
python -m pytest tests/ # run tests (requires Docker for Postgres)
ruff check src/ tests/ # lint
ruff format src/ tests/ # format
mypy src/mcp_awareness/ # type check- One concern per PR — don't mix unrelated changes
- Add changelog entries under
[Unreleased]inCHANGELOG.md - Update
README.mdif your change affects documented features or counts - Update
docs/data-dictionary.mdif schema changed - Every PR must include a
## QAsection with manual test steps - CI runs pytest, ruff, and mypy automatically
- Python 3.10+, strict mypy
- Ruff for linting and formatting (configured in
pyproject.toml) - 100-character line length