Thanks for your interest in contributing! This guide covers the workflow for both human contributors and AI coding agents.
# 1. Fork this repo on GitHub, then clone your fork
git clone https://github.com/<your-username>/<repo-name>.git
cd <repo-name>
# 2. Install dependencies
npm install
# 3. Create a branch
git checkout -b your-branch-name
# 4. Make your changes, then verify everything passes
npm run lint:fix
npm run build
npm test- One PR per change. Keep PRs focused — a bug fix, a new feature, or a refactor, not all three.
- Branch from
main(ormasterif that's the default branch). - Run
npm run lint:fixbefore committing — CI will reject formatting issues. - Run
npm testand confirm all tests pass. - Write a clear PR title and description — explain what changed and why.
- All PRs require approval from a maintainer before merging.
| Command | What it does |
|---|---|
npm install |
Install dependencies |
npm run build |
Compile TypeScript |
npm run dev |
Run in development mode |
npm test |
Run the test suite |
npm run lint |
Check for lint errors |
npm run lint:fix |
Auto-fix lint and formatting |
src/integration.test.ts exercises a handful of read-only tool handlers against a live Tailscale API to catch shape drift that fetch mocks cannot. It is gated behind RUN_INTEGRATION_TESTS=1 + live credentials, so npm test in normal development stays fully offline.
Run locally:
RUN_INTEGRATION_TESTS=1 TAILSCALE_API_KEY=tskey-api-... npm testIn CI, the .github/workflows/integration.yml workflow runs nightly on a schedule, on every tag push (gating publish via release.yml), and on manual dispatch. If a TAILSCALE_TEST_API_KEY repository secret is configured, the suite executes against that tailnet; if not, it emits a notice and skips gracefully — so forks and downstream users don't get blocked CI. The suite is read-only (no mutations), so it is safe to point at any tailnet — though a dedicated test tailnet is recommended.
- TypeScript, strict mode
- Formatting and linting are enforced by the project's linter — run
lint:fixand let the tooling handle it - No unnecessary abstractions — keep code simple and direct
- Add tests for new functionality
If you're an AI agent (Claude Code, Copilot, Cursor, etc.) submitting a PR:
- Fork the repo and work on a branch — direct pushes to the default branch are blocked.
- Always run
npm run lint:fix && npm run build && npm testbefore committing. Do not skip this. - Do not add unrelated changes — no drive-by refactors, no extra comments, no unrelated formatting fixes.
- PR description must explain the change clearly — what problem does it solve, how does it work, how was it tested.
- One logical change per PR. If you're fixing a bug and adding a feature, that's two PRs.
Open an issue on GitHub. Include:
- What you expected to happen
- What actually happened
- Steps to reproduce
- Environment details (OS, Node version, etc.)
The overrides block in package.json pins hono and @hono/node-server to patched versions. These are transitive dependencies pulled in by @modelcontextprotocol/sdk, not direct dependencies of this project. The overrides exist to resolve Dependabot security alerts on the SDK's ^4 / ^1 ranges without forking the SDK. Leave them in place until the MCP SDK updates its hono dependency range to include the patched versions; at that point the overrides can be removed.
By contributing, you agree that your contributions will be licensed under the same license as this project.