Thanks for helping out. This server is a thin adapter over the DeckProbe engine, and most of its value comes from staying that way.
npm install
npm testnpm test runs the typecheck, the linter, the build, and the full suite. The
tests spawn the real engine, so no mocking layer has to be kept in sync with it.
Useful during development:
npm run test:watch
npm run lint:fix
npm run build && node dist/main.js --help| Change | Where |
|---|---|
| A new target, format, or report field | Upstream. It reaches this server for free. |
| A new tool, or a new option on one | Here — see the design constraints below. |
| Report wording, confidence semantics, exit codes | Upstream. This server passes them through verbatim. |
These are what keep the server small, and a pull request that crosses one needs to say why in the description.
- The report is passed through unmodified. Reshaping engine output would
make this server a second, drifting contract. The two deliberate exceptions
are the batch wrapper, which adds the requested
pathto each entry because the engine's error envelope has no way to say which file failed, and the compactlist_targetsview, which is opt-out viadetail: "full". - Every tool field costs tokens in every session.
tools/listis re-sent to the model on every conversation, so a new option has to earn its schema and description. That is why-o,-O,--plan,--strict, and--telemetryare not exposed. partialis a success. It means a target was unresolved, not that the document is broken. Do not map it toisError.- stdout belongs to the MCP transport. Everything else goes to stderr.
- The engine is spawned, not linked. Untrusted parsing stays in its own process, with a deadline that can kill it.
- Put the zod schema in
src/schemas.tsif any part of it is shared. - Register the tool in
src/tools/, wrapping the body inguard()so failures come back in the one error grammar. - Mark it
readOnlyHint: trueandopenWorldHint: false— this server only reads local files. - Cover it in
tests/tools.test.ts, including at least one failure path.
Keep commits focused and their subject in the imperative mood. In the pull request, say what an agent can do afterwards that it could not before, and note any change to the engine dependency range.
Include the server version, the engine version (both are on the startup line this server writes to stderr), the client you are using, the tool arguments, and the result you got back. A vulnerability goes privately to the address in SECURITY.md instead.