Thanks for thinking about contributing. This project is small and opinionated — keeping it that way is part of the point. The guidelines below describe the smallest changes that get a PR merged quickly.
Open a GitHub issue with:
- What you tried (tool name + input args, or the MCP client config).
- What you expected.
- What actually happened (full error output, plus stderr lines starting with
[vergabe-mcp]). node --version,vergabe-mcp --version(ornpm ls vergabe-mcp), OS.
Logs go to stderr because stdout is the MCP wire protocol — capture both when reporting.
Open a feature request issue. Describe the use-case first, the API second. We are biased toward small, composable tools rather than large multi-purpose ones.
- Fork and create a topic branch:
feature/your-thingorfix/your-thing. - Keep the diff focused. One PR = one concern.
- Match the existing code style (see below).
- Run the test plan below and paste the result in the PR description.
- Update
README.mdif you change a public input/output schema.
- TypeScript strict. No
anyunless it is justified in a comment. - ESM only. All relative imports use the
.jssuffix (compiled output), e.g.import { foo } from "../lib/http.js". - Logging to stderr. Never
console.log— useconsole.errorso stdout stays clean for the MCP protocol. - No new runtime dependencies unless they replace something or unlock a clearly requested feature.
- Comments in English. The codebase is English-only; user-facing tool descriptions may be German.
- Zod for input validation. Every tool entry point parses its input through a Zod schema.
# Build cleanly
npm run build
# Smoke-test the server boots
node dist/index.js < /dev/null
# Expect on stderr: "[vergabe-mcp] v0.1.0 ready on stdio (...)"
# Then Ctrl-C.
# (Optional) Wire it into Claude Desktop / Claude Code and run a real
# `vergabe_search_notices` call against your branch.Automated tests are not yet in place — if you add a feature you can reasonably cover with a small script under test/, please do.
Maintainer-only:
npm version patch # or minor / major
npm publish
git push --follow-tagsprepublishOnly runs tsc so the published tarball always contains a fresh dist/.