Thank you for your interest in contributing!
git clone https://github.com/paradoxbound/bookstack-mcp.git
cd bookstack-mcp
npm install
npm run build
npm run type-checkpackages/core/— BookStack API client and shared types (no runtime dependencies)packages/stdio/— MCP server with stdio transport
All commits must include a Signed-off-by line asserting that you are legally authorised to make the contribution under the project's MIT License (see the Developer Certificate of Origin).
Sign off automatically with:
git commit -s -m "your commit message"This adds Signed-off-by: Your Name <your@email.com> to the commit message. A CI check enforces this on every pull request.
To fix unsigned commits before opening a PR:
git rebase --signoff HEAD~<number-of-commits>- Fork the repository and create a branch from
main - Make your changes
- Ensure
npm run type-checkandnpm run buildpass - If you have a BookStack instance available, run
npm testwith the required environment variables (see below) - Sign off all commits (see DCO section above)
- Open a pull request against
main
Unit and fuzz tests run without a BookStack instance:
npm testFunctional tests require a live BookStack instance:
export TEST_BOOKSTACK_URL=https://your-bookstack.example.com
export TEST_BOOKSTACK_TOKEN_ID=your-token-id
export TEST_BOOKSTACK_TOKEN_SECRET=your-token-secret
npm testPlease do not open a public issue for security vulnerabilities. Use the process described in SECURITY.md.
All pull requests must meet these requirements before they will be merged:
- DCO sign-off — every commit must have a
Signed-off-byline (see above) - Type-check passes —
npm run type-checkmust succeed with no errors - Build passes —
npm run buildmust succeed - Tests pass —
npm testmust pass (unit and fuzz tests run without credentials; functional tests require a live BookStack instance) - No new HIGH/CRITICAL vulnerabilities —
npm audit --audit-level=highmust pass - Code style — follow the conventions below
- Tests for new functionality — if you add a new public API method or MCP tool, include a corresponding unit test in
packages/core/tests/api-methods.test.tsand, where applicable, a functional test intests/read-tools.test.tsortests/write-tools.test.ts
- TypeScript strict mode
- Native
fetchonly — no axios or other HTTP clients - Zod schemas for all MCP tool inputs
- Error handling via
error.status/error.response(not axios patterns)