Thank you for your interest in contributing to SMCP. This project has three contribution tracks:
- RFC Protocol Changes — changes to the wire format or protocol semantics
- Python SDK
- TypeScript SDK
Read the relevant section below before opening a PR. All contributions are subject to the Code of Conduct.
-
Use Conventional Commits for all commit messages:
feat:— new capabilityfix:— bug fixdocs:— documentation onlyrefactor:— code restructure without behavior changetest:— adding or updating testschore:— build/tooling changes
-
Open an issue before starting significant work so we can discuss the approach.
-
Keep PRs focused. One logical change per PR.
-
All PRs require at least one review from a maintainer.
The RFC/smcp-v1-specification.md document is the canonical definition of the SMCP wire format. SDKs conform to it.
Important naming note: The wire format field is security_token (RFC-authoritative). Internal implementations may alias this field name in their type systems as needed, but must serialize to security_token on the wire. SDK implementations (Python, TypeScript) and all external/wire usage use security_token.
- Open an issue describing the protocol change, the problem it solves, and any backward-compatibility implications.
- Wait for maintainer acknowledgment before drafting RFC text.
- Submit a PR to
RFC/smcp-v1-specification.mdwith your changes clearly marked with the section being modified. - RFC changes require consensus from at least two maintainers before merge, given the protocol stability implications.
- Protocol changes that break backward compatibility must include a migration path and bump the protocol version.
- Python 3.11 or higher
hatchling(installed viapip)
# Clone the repo
git clone https://github.com/100monkeys-ai/secure-model-context-protocol.git
cd secure-model-context-protocol
# Create and activate a virtual environment
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
# Install the Python SDK in editable mode with dev deps
pip install -e "sdk/python[dev]"pytest sdk/python/tests/- Follow PEP 8.
- All public functions and classes must have docstrings.
- Use type hints throughout.
- Security-sensitive values (tokens, private key bytes) must never appear in log output or exception messages.
Ed25519Key.erase()must be called when a key is no longer needed. Ensure it is called in__del__as a safety net.
Tests live in sdk/python/tests/. Add a file named test_<module>.py. Use pytest conventions.
- Node.js 20 or higher
- npm 10 or higher
cd sdk/typescript
npm installnpm run buildnpm testKnown issue: One test (
envelope creation) currently fails due to asha512Syncconfiguration requirement in@noble/ed25519v2. See sdk/typescript/README.md for details and a workaround. The canonical message test passes.
- Strict TypeScript (
strict: trueintsconfig.json). Noanywithout a comment explaining why. - All public API surface must have JSDoc comments.
- Security-sensitive values (tokens, private key bytes) must never appear in thrown error messages or console output.
- Call
key.erase()/client.dispose()when keys are no longer needed. Usetry/finallyin tests. async/awaitover raw Promises.
Tests live in sdk/typescript/__tests__/. Use jest conventions with ts-jest.
Documentation lives in docs/. Docs changes can be submitted as standalone PRs without a code change. Ensure all internal links (docs/, SDK READMEs, RFC section anchors) remain valid.
Do not open a public issue for security vulnerabilities. Email security@100monkeys.ai instead. See SECURITY.md for details.