Skip to content

Development Guide

ts-mcp/
├── src/
│ ├── index.ts # MCP server + tool definitions (3,936 lines)
│ ├── jira-client.ts # Jira REST API client (1,948 lines)
│ ├── confluence-client.ts # Confluence REST API client (663 lines)
│ ├── account-manager.ts # Multi-account management (287 lines)
│ ├── rate-limiter.ts # Rate limiting + backoff (351 lines)
│ ├── operation-verifier.ts # Post-mutation verification (350 lines)
│ ├── logger.ts # Structured logging + metrics (408 lines)
│ ├── types.ts # Jira TypeScript interfaces (295 lines)
│ └── confluence-types.ts # Confluence TypeScript interfaces (75 lines)
├── tests/
│ ├── jira-client.test.ts
│ ├── confluence-client.test.ts
│ ├── account-manager.test.ts
│ ├── rate-limiter.test.ts
│ ├── operation-verifier.test.ts
│ └── logger.test.ts
├── package.json
├── tsconfig.json
├── vitest.config.ts
└── README.md
Terminal window
# Clone the repository
git clone https://github.com/mottysisam/bodywave-jira.git
cd bodywave-jira/ts-mcp
# Install dependencies
npm install
# Build TypeScript
npm run build
# Run tests
npm test
# Start dev mode (watch for changes)
npm run dev
CommandDescription
npm run buildCompile TypeScript to dist/
npm run devWatch mode — recompile on changes
npm startRun the compiled MCP server
npm testRun tests with Vitest
npm run lintRun ESLint

Tests use Vitest with mocked HTTP responses. No Jira instance required for testing.

vitest.config.ts
coverage: {
provider: 'v8',
thresholds: {
lines: 60,
functions: 60,
branches: 60,
statements: 60,
},
}
Terminal window
# Run all tests
npm test
# Run with coverage
npm test -- --coverage
# Run specific test file
npm test -- tests/jira-client.test.ts
# Watch mode
npm test -- --watch
PackageVersionPurpose
@modelcontextprotocol/sdk^1.12.0MCP protocol implementation
axios^1.7.0HTTP client for Jira/Confluence APIs
zod^3.23.0Runtime input validation
form-data^4.0.5File upload support (attachments)
Terminal window
# Build and publish to npm
npm run prepublishOnly # Runs tsc
npm publish

The package is published as @bodywave/jira-mcp on npm.