See Architecture first for how the code is laid out; this page covers building, testing, and exercising the server directly.
make build # compile ./bin/ado
make test # go test -race ./...
make cover # run tests and print a coverage summary
make vet # go vet ./...
make fmt-check # gofmt verification (make fmt to apply)
make lint # golangci-lint (config in .golangci.yml)
make all # fmt-check + vet + lint + test + build, in one pass
make run builds and runs the binary directly (expects ADO_ORG_URL and ADO_PAT in the environment). make tidy runs go mod tidy, and make clean removes bin/, dist/, and coverage.out.
List the tools over stdio without an MCP client:
printf '%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"s","version":"0"}}}' \
'{"jsonrpc":"2.0","method":"notifications/initialized"}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}' \
| ADO_ORG_URL=https://dev.azure.com/myorg ADO_PAT=$ADO_PAT ./bin/ado mcp
Or browse interactively with the MCP Inspector:
npx @modelcontextprotocol/inspector ./bin/ado mcp
Releases are tag-triggered: pushing a vX.Y.Z tag runs GoReleaser in CI to publish archives and a GitHub Release for the platforms listed in Install.
make next # print the next version svu would compute, from conventional commits
make bump # tag that version locally (override with BUMP=major|minor|patch or TAG=vX.Y.Z)
Then git push origin the tag make bump created to trigger the release workflow. make snapshot builds release artifacts locally with GoReleaser, without publishing anything.