@prodbeam/mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -0
- package/LICENSE +21 -0
- package/README.md +208 -0
- package/dist/CLAUDE.md +7 -0
- package/dist/adapters/github-mcp.d.ts +25 -0
- package/dist/adapters/github-mcp.d.ts.map +1 -0
- package/dist/adapters/github-mcp.js +307 -0
- package/dist/adapters/github-mcp.js.map +1 -0
- package/dist/adapters/jira-mcp.d.ts +14 -0
- package/dist/adapters/jira-mcp.d.ts.map +1 -0
- package/dist/adapters/jira-mcp.js +159 -0
- package/dist/adapters/jira-mcp.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +256 -0
- package/dist/cli.js.map +1 -0
- package/dist/clients/github-client.d.ts +29 -0
- package/dist/clients/github-client.d.ts.map +1 -0
- package/dist/clients/github-client.js +116 -0
- package/dist/clients/github-client.js.map +1 -0
- package/dist/clients/jira-client.d.ts +30 -0
- package/dist/clients/jira-client.d.ts.map +1 -0
- package/dist/clients/jira-client.js +115 -0
- package/dist/clients/jira-client.js.map +1 -0
- package/dist/clients/types.d.ts +155 -0
- package/dist/clients/types.d.ts.map +1 -0
- package/dist/clients/types.js +2 -0
- package/dist/clients/types.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +426 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/prompt.d.ts +18 -0
- package/dist/commands/prompt.d.ts.map +1 -0
- package/dist/commands/prompt.js +122 -0
- package/dist/commands/prompt.js.map +1 -0
- package/dist/config/credentials.d.ts +9 -0
- package/dist/config/credentials.d.ts.map +1 -0
- package/dist/config/credentials.js +87 -0
- package/dist/config/credentials.js.map +1 -0
- package/dist/config/paths.d.ts +6 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +31 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/team-config.d.ts +204 -0
- package/dist/config/team-config.d.ts.map +1 -0
- package/dist/config/team-config.js +86 -0
- package/dist/config/team-config.js.map +1 -0
- package/dist/config/thresholds.d.ts +15 -0
- package/dist/config/thresholds.d.ts.map +1 -0
- package/dist/config/thresholds.js +18 -0
- package/dist/config/thresholds.js.map +1 -0
- package/dist/config/types.d.ts +42 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/discovery/github-discovery.d.ts +4 -0
- package/dist/discovery/github-discovery.d.ts.map +1 -0
- package/dist/discovery/github-discovery.js +46 -0
- package/dist/discovery/github-discovery.js.map +1 -0
- package/dist/discovery/jira-discovery.d.ts +4 -0
- package/dist/discovery/jira-discovery.d.ts.map +1 -0
- package/dist/discovery/jira-discovery.js +68 -0
- package/dist/discovery/jira-discovery.js.map +1 -0
- package/dist/discovery/types.d.ts +40 -0
- package/dist/discovery/types.d.ts.map +1 -0
- package/dist/discovery/types.js +2 -0
- package/dist/discovery/types.js.map +1 -0
- package/dist/generators/metrics-calculator.d.ts +5 -0
- package/dist/generators/metrics-calculator.d.ts.map +1 -0
- package/dist/generators/metrics-calculator.js +101 -0
- package/dist/generators/metrics-calculator.js.map +1 -0
- package/dist/generators/report-generator.d.ts +25 -0
- package/dist/generators/report-generator.d.ts.map +1 -0
- package/dist/generators/report-generator.js +375 -0
- package/dist/generators/report-generator.js.map +1 -0
- package/dist/generators/sprint-analyzer.d.ts +5 -0
- package/dist/generators/sprint-analyzer.d.ts.map +1 -0
- package/dist/generators/sprint-analyzer.js +88 -0
- package/dist/generators/sprint-analyzer.js.map +1 -0
- package/dist/history/history-store.d.ts +15 -0
- package/dist/history/history-store.d.ts.map +1 -0
- package/dist/history/history-store.js +197 -0
- package/dist/history/history-store.js.map +1 -0
- package/dist/history/snapshot-builder.d.ts +15 -0
- package/dist/history/snapshot-builder.d.ts.map +1 -0
- package/dist/history/snapshot-builder.js +45 -0
- package/dist/history/snapshot-builder.js.map +1 -0
- package/dist/history/types.d.ts +33 -0
- package/dist/history/types.d.ts.map +1 -0
- package/dist/history/types.js +2 -0
- package/dist/history/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +797 -0
- package/dist/index.js.map +1 -0
- package/dist/insights/anomaly-detector.d.ts +28 -0
- package/dist/insights/anomaly-detector.d.ts.map +1 -0
- package/dist/insights/anomaly-detector.js +154 -0
- package/dist/insights/anomaly-detector.js.map +1 -0
- package/dist/insights/team-health.d.ts +24 -0
- package/dist/insights/team-health.d.ts.map +1 -0
- package/dist/insights/team-health.js +151 -0
- package/dist/insights/team-health.js.map +1 -0
- package/dist/insights/trend-analyzer.d.ts +5 -0
- package/dist/insights/trend-analyzer.d.ts.map +1 -0
- package/dist/insights/trend-analyzer.js +79 -0
- package/dist/insights/trend-analyzer.js.map +1 -0
- package/dist/insights/types.d.ts +10 -0
- package/dist/insights/types.d.ts.map +1 -0
- package/dist/insights/types.js +2 -0
- package/dist/insights/types.js.map +1 -0
- package/dist/orchestrator/data-fetcher.d.ts +16 -0
- package/dist/orchestrator/data-fetcher.d.ts.map +1 -0
- package/dist/orchestrator/data-fetcher.js +169 -0
- package/dist/orchestrator/data-fetcher.js.map +1 -0
- package/dist/orchestrator/time-range.d.ts +8 -0
- package/dist/orchestrator/time-range.d.ts.map +1 -0
- package/dist/orchestrator/time-range.js +27 -0
- package/dist/orchestrator/time-range.js.map +1 -0
- package/dist/types/github.d.ts +40 -0
- package/dist/types/github.d.ts.map +1 -0
- package/dist/types/github.js +2 -0
- package/dist/types/github.js.map +1 -0
- package/dist/types/jira.d.ts +18 -0
- package/dist/types/jira.d.ts.map +1 -0
- package/dist/types/jira.js +2 -0
- package/dist/types/jira.js.map +1 -0
- package/dist/types/retrospective.d.ts +38 -0
- package/dist/types/retrospective.d.ts.map +1 -0
- package/dist/types/retrospective.js +2 -0
- package/dist/types/retrospective.js.map +1 -0
- package/dist/types/weekly.d.ts +41 -0
- package/dist/types/weekly.d.ts.map +1 -0
- package/dist/types/weekly.js +2 -0
- package/dist/types/weekly.js.map +1 -0
- package/dist/validators.d.ts +236 -0
- package/dist/validators.d.ts.map +1 -0
- package/dist/validators.js +62 -0
- package/dist/validators.js.map +1 -0
- package/package.json +72 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [0.1.0] - 2026-02-08
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **MCP Server** — stdio-based server compatible with Claude Code, Cursor, Windsurf, and any MCP client
|
|
13
|
+
- **GitHub integration** — direct REST API client with typed responses, rate limiting, and retry logic
|
|
14
|
+
- **Jira integration** — direct REST API client for Cloud instances with basic auth
|
|
15
|
+
- **Daily standup** (`standup`) — personal activity report from the last 24 hours
|
|
16
|
+
- **Team standup** (`team_standup`) — per-member breakdown with aggregate metrics
|
|
17
|
+
- **Weekly summary** (`weekly_summary`) — 7-day engineering summary with repo breakdown and team health scoring
|
|
18
|
+
- **Sprint retrospective** (`sprint_retro`) — sprint-bounded report with merge rate, review coverage, and insights
|
|
19
|
+
- **Team setup** (`setup_team`) — one-time onboarding with auto-discovery of GitHub usernames, repos, Jira accounts, and projects
|
|
20
|
+
- **Team management** — `add_member`, `remove_member`, `refresh_config` tools
|
|
21
|
+
- **Interactive CLI** — `prodbeam init` setup wizard with credential validation and MCP server registration
|
|
22
|
+
- **CLI reports** — `prodbeam standup`, `team-standup`, `weekly`, `sprint-retro`, `status` commands
|
|
23
|
+
- **Intelligence layer** — anomaly detection, team health scoring (velocity, throughput, review coverage, issue flow), trend analysis
|
|
24
|
+
- **History store** — SQLite-backed metrics persistence for trend comparison across reports
|
|
25
|
+
- **Credential resolution** — two-tier system (environment variables > `~/.prodbeam/credentials.json`) with 600 file permissions
|
|
26
|
+
- **Auto-discovery** — resolves GitHub usernames/repos and Jira accounts/projects from email addresses
|
|
27
|
+
- **Stale PR detection** — configurable thresholds for warning and alert levels
|
|
28
|
+
- **CI/CD** — GitHub Actions for build/test (Node 18/20/22), security scanning (npm audit, Gitleaks, CodeQL, license check), conventional commits, and PR size labeling
|
|
29
|
+
- **213 tests** across 18 test suites
|
|
30
|
+
|
|
31
|
+
[0.1.0]: https://github.com/prodbeam/prodbeam-mcp/releases/tag/v0.1.0
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Prodbeam
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
# Prodbeam MCP Server
|
|
2
|
+
|
|
3
|
+
Engineering intelligence reports from GitHub and Jira, delivered through any MCP client or the standalone CLI.
|
|
4
|
+
|
|
5
|
+
- **Daily standups** from your commits, PRs, reviews, and Jira issues
|
|
6
|
+
- **Weekly summaries** with team metrics, repo breakdowns, and insights
|
|
7
|
+
- **Sprint retrospectives** with merge time analysis and completion rates
|
|
8
|
+
- **Team health scoring** with anomaly detection and trend analysis
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Quick Start
|
|
13
|
+
|
|
14
|
+
### Option 1: npx (zero install)
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
claude mcp add prodbeam \
|
|
18
|
+
-e GITHUB_TOKEN=ghp_YOUR_TOKEN \
|
|
19
|
+
-e JIRA_HOST=company.atlassian.net \
|
|
20
|
+
-e JIRA_EMAIL=you@company.com \
|
|
21
|
+
-e JIRA_API_TOKEN=your_jira_token \
|
|
22
|
+
-- npx -y @prodbeam/mcp
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Then set up your team in a Claude Code session:
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
Set up my prodbeam team called "My Team" with emails: alice@company.com, bob@company.com
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Option 2: Global install with setup wizard
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npm install -g @prodbeam/mcp
|
|
35
|
+
prodbeam init
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The wizard detects credentials, validates them, discovers your repos and projects, and registers the MCP server automatically.
|
|
39
|
+
|
|
40
|
+
### Option 3: MCP client config file
|
|
41
|
+
|
|
42
|
+
For Cursor, Windsurf, or other MCP clients that use a JSON config:
|
|
43
|
+
|
|
44
|
+
```json
|
|
45
|
+
{
|
|
46
|
+
"mcpServers": {
|
|
47
|
+
"prodbeam": {
|
|
48
|
+
"command": "npx",
|
|
49
|
+
"args": ["-y", "@prodbeam/mcp"],
|
|
50
|
+
"env": {
|
|
51
|
+
"GITHUB_TOKEN": "ghp_YOUR_TOKEN",
|
|
52
|
+
"JIRA_HOST": "company.atlassian.net",
|
|
53
|
+
"JIRA_EMAIL": "you@company.com",
|
|
54
|
+
"JIRA_API_TOKEN": "your_jira_token"
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Prerequisites
|
|
64
|
+
|
|
65
|
+
| Requirement | How to get it |
|
|
66
|
+
|-------------|---------------|
|
|
67
|
+
| Node.js 18+ | [nodejs.org](https://nodejs.org) |
|
|
68
|
+
| GitHub PAT | [Create token](https://github.com/settings/tokens) — scopes: `repo`, `read:user`, `read:org` |
|
|
69
|
+
| Jira API Token | [Create token](https://id.atlassian.com/manage-profile/security/api-tokens) |
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Usage
|
|
74
|
+
|
|
75
|
+
### In any MCP client
|
|
76
|
+
|
|
77
|
+
Ask naturally — the client invokes the right tool:
|
|
78
|
+
|
|
79
|
+
| Prompt | Tool |
|
|
80
|
+
|--------|------|
|
|
81
|
+
| "Generate my standup" | `standup` |
|
|
82
|
+
| "Generate a team standup" | `team_standup` |
|
|
83
|
+
| "Generate a weekly summary" | `weekly_summary` |
|
|
84
|
+
| "Generate a weekly summary for last week" | `weekly_summary` (weeksAgo: 1) |
|
|
85
|
+
| "Generate a sprint retro" | `sprint_retro` |
|
|
86
|
+
|
|
87
|
+
### CLI
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
prodbeam status # Check config and credentials
|
|
91
|
+
prodbeam standup # Personal standup (last 24h)
|
|
92
|
+
prodbeam standup --email alice@co.com # Standup for a specific member
|
|
93
|
+
prodbeam team-standup # Full team standup
|
|
94
|
+
prodbeam weekly # Weekly summary
|
|
95
|
+
prodbeam weekly --weeks-ago 1 # Last week's summary
|
|
96
|
+
prodbeam sprint-retro # Sprint retro (auto-detect sprint)
|
|
97
|
+
prodbeam sprint-retro --sprint "Sprint 12" # Specific sprint
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## Available Tools
|
|
103
|
+
|
|
104
|
+
### Setup
|
|
105
|
+
|
|
106
|
+
| Tool | Parameters | Description |
|
|
107
|
+
|------|-----------|-------------|
|
|
108
|
+
| `setup_team` | teamName, emails | One-time onboarding with auto-discovery |
|
|
109
|
+
| `add_member` | email | Add a team member |
|
|
110
|
+
| `remove_member` | email | Remove a team member |
|
|
111
|
+
| `refresh_config` | — | Re-scan repos and sprints |
|
|
112
|
+
| `get_capabilities` | — | Show config status and available tools |
|
|
113
|
+
|
|
114
|
+
### Reports
|
|
115
|
+
|
|
116
|
+
| Tool | Parameters | Description |
|
|
117
|
+
|------|-----------|-------------|
|
|
118
|
+
| `standup` | email (optional) | Personal daily standup (last 24h) |
|
|
119
|
+
| `team_standup` | — | Full team standup with per-member breakdown |
|
|
120
|
+
| `weekly_summary` | weeksAgo (optional) | Weekly engineering summary with metrics |
|
|
121
|
+
| `sprint_retro` | sprintName (optional) | Sprint retrospective with completion rates |
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Architecture
|
|
126
|
+
|
|
127
|
+
Prodbeam is **self-sufficient** — it fetches data directly from GitHub and Jira APIs. No separate MCP servers or API keys needed.
|
|
128
|
+
|
|
129
|
+
```
|
|
130
|
+
MCP Client (Claude Code, Cursor, Windsurf, etc.)
|
|
131
|
+
└── Prodbeam MCP Server (stdio)
|
|
132
|
+
├── GitHub REST API (your token)
|
|
133
|
+
├── Jira REST API (your token)
|
|
134
|
+
└── ~/.prodbeam/history.db (local SQLite)
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**One tool call = one complete report.** No multi-step orchestration.
|
|
138
|
+
|
|
139
|
+
### Config directory
|
|
140
|
+
|
|
141
|
+
All data lives in `~/.prodbeam/`:
|
|
142
|
+
|
|
143
|
+
| File | Purpose |
|
|
144
|
+
|------|---------|
|
|
145
|
+
| `team.json` | Team members, repos, Jira projects |
|
|
146
|
+
| `credentials.json` | API tokens (600 permissions) |
|
|
147
|
+
| `history.db` | SQLite metrics for trend comparison |
|
|
148
|
+
|
|
149
|
+
Override location with `PRODBEAM_HOME` env var.
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Development
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
git clone https://github.com/prodbeam/prodbeam-mcp.git
|
|
157
|
+
cd prodbeam-mcp
|
|
158
|
+
npm install
|
|
159
|
+
npm run build
|
|
160
|
+
npm test
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Project Structure
|
|
164
|
+
|
|
165
|
+
```
|
|
166
|
+
src/
|
|
167
|
+
├── index.ts # MCP server entry point
|
|
168
|
+
├── cli.ts # Standalone CLI
|
|
169
|
+
├── clients/ # GitHub and Jira REST API clients
|
|
170
|
+
├── commands/ # CLI commands (init wizard)
|
|
171
|
+
├── config/ # Credentials, team config, paths
|
|
172
|
+
├── discovery/ # GitHub/Jira auto-discovery
|
|
173
|
+
├── generators/ # Report generation
|
|
174
|
+
├── history/ # SQLite metrics persistence
|
|
175
|
+
├── insights/ # Anomaly detection, team health, trends
|
|
176
|
+
├── orchestrator/ # Data fetching and time ranges
|
|
177
|
+
└── validators.ts # Input validation
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Commands
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
npm run build # Compile TypeScript
|
|
184
|
+
npm run dev # Watch mode
|
|
185
|
+
npm test # Run tests (vitest)
|
|
186
|
+
npm run lint # Lint (eslint)
|
|
187
|
+
npm run type-check # Type check (tsc --noEmit)
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Documentation
|
|
193
|
+
|
|
194
|
+
See [docs/prodbeam-mcp-guide.md](docs/prodbeam-mcp-guide.md) for the full setup and usage guide.
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Contributing
|
|
199
|
+
|
|
200
|
+
Bug reports and feature requests welcome via [GitHub Issues](https://github.com/prodbeam/prodbeam-mcp/issues).
|
|
201
|
+
|
|
202
|
+
Pull requests accepted — please follow conventional commit format (`feat:`, `fix:`, `docs:`, etc.).
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## License
|
|
207
|
+
|
|
208
|
+
MIT — See [LICENSE](LICENSE).
|
package/dist/CLAUDE.md
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { GitHubActivity } from '../types/github.js';
|
|
2
|
+
export declare class GitHubMCPAdapter {
|
|
3
|
+
private client;
|
|
4
|
+
private connected;
|
|
5
|
+
private username;
|
|
6
|
+
static isConfigured(): boolean;
|
|
7
|
+
connect(): Promise<void>;
|
|
8
|
+
disconnect(): Promise<void>;
|
|
9
|
+
getCurrentUser(): Promise<string>;
|
|
10
|
+
fetchActivity(hours?: number): Promise<GitHubActivity>;
|
|
11
|
+
isAvailable(): Promise<boolean>;
|
|
12
|
+
private ensureConnected;
|
|
13
|
+
private callTool;
|
|
14
|
+
private extractText;
|
|
15
|
+
private fetchAuthoredPullRequests;
|
|
16
|
+
private fetchReviewedPullRequests;
|
|
17
|
+
private fetchCommitsFromRepos;
|
|
18
|
+
private extractUniqueRepos;
|
|
19
|
+
private convertToReviews;
|
|
20
|
+
private parseCommits;
|
|
21
|
+
private extractCommitFromObject;
|
|
22
|
+
private parsePullRequests;
|
|
23
|
+
private extractPRFromObject;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=github-mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-mcp.d.ts","sourceRoot":"","sources":["../../src/adapters/github-mcp.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,cAAc,EAKf,MAAM,oBAAoB,CAAC;AAE5B,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAM;IAKtB,MAAM,CAAC,YAAY,IAAI,OAAO;IAOxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAwCxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IA4BjC,aAAa,CAAC,KAAK,SAAK,GAAG,OAAO,CAAC,cAAc,CAAC;IAoClD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAYrC,OAAO,CAAC,eAAe;YAMT,QAAQ;IAMtB,OAAO,CAAC,WAAW;YAaL,yBAAyB;YAsBzB,yBAAyB;YAsBzB,qBAAqB;IAkCnC,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,YAAY;IAyCpB,OAAO,CAAC,uBAAuB;IAuB/B,OAAO,CAAC,iBAAiB;IA4CzB,OAAO,CAAC,mBAAmB;CAgC5B"}
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
3
|
+
export class GitHubMCPAdapter {
|
|
4
|
+
client = null;
|
|
5
|
+
connected = false;
|
|
6
|
+
username = '';
|
|
7
|
+
static isConfigured() {
|
|
8
|
+
return Boolean(process.env['GITHUB_PERSONAL_ACCESS_TOKEN']);
|
|
9
|
+
}
|
|
10
|
+
async connect() {
|
|
11
|
+
if (this.connected) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const token = process.env['GITHUB_PERSONAL_ACCESS_TOKEN'];
|
|
15
|
+
if (!token) {
|
|
16
|
+
throw new Error('GITHUB_PERSONAL_ACCESS_TOKEN is not set. ' +
|
|
17
|
+
'Add it to your .claude/mcp.json under the prodbeam server env vars.');
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
this.client = new Client({ name: 'prodbeam-github-adapter', version: '0.1.0' }, { capabilities: {} });
|
|
21
|
+
const transport = new StdioClientTransport({
|
|
22
|
+
command: 'npx',
|
|
23
|
+
args: ['-y', '@modelcontextprotocol/server-github'],
|
|
24
|
+
env: {
|
|
25
|
+
...process.env,
|
|
26
|
+
GITHUB_PERSONAL_ACCESS_TOKEN: token,
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
await this.client.connect(transport);
|
|
30
|
+
this.connected = true;
|
|
31
|
+
console.error('[prodbeam] Connected to GitHub MCP server');
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
35
|
+
throw new Error(`Failed to connect to GitHub MCP: ${message}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async disconnect() {
|
|
39
|
+
if (this.client) {
|
|
40
|
+
try {
|
|
41
|
+
await this.client.close();
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
}
|
|
45
|
+
this.client = null;
|
|
46
|
+
this.connected = false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async getCurrentUser() {
|
|
50
|
+
if (this.username) {
|
|
51
|
+
return this.username;
|
|
52
|
+
}
|
|
53
|
+
const result = await this.callTool('get_me', {});
|
|
54
|
+
const text = this.extractText(result);
|
|
55
|
+
const loginMatch = text.match(/"login"\s*:\s*"([^"]+)"/);
|
|
56
|
+
if (loginMatch?.[1]) {
|
|
57
|
+
this.username = loginMatch[1];
|
|
58
|
+
return this.username;
|
|
59
|
+
}
|
|
60
|
+
const usernameMatch = text.match(/Username:\s*(\S+)/i) ?? text.match(/login:\s*(\S+)/i);
|
|
61
|
+
if (usernameMatch?.[1]) {
|
|
62
|
+
this.username = usernameMatch[1];
|
|
63
|
+
return this.username;
|
|
64
|
+
}
|
|
65
|
+
throw new Error('Could not determine GitHub username from get_me response');
|
|
66
|
+
}
|
|
67
|
+
async fetchActivity(hours = 24) {
|
|
68
|
+
this.ensureConnected();
|
|
69
|
+
const now = new Date();
|
|
70
|
+
const from = new Date(now.getTime() - hours * 60 * 60 * 1000);
|
|
71
|
+
const username = await this.getCurrentUser();
|
|
72
|
+
const sinceDate = from.toISOString().split('T')[0] ?? '';
|
|
73
|
+
const [authoredPRs, reviewedPRs] = await Promise.all([
|
|
74
|
+
this.fetchAuthoredPullRequests(username, sinceDate),
|
|
75
|
+
this.fetchReviewedPullRequests(username, sinceDate),
|
|
76
|
+
]);
|
|
77
|
+
const repos = this.extractUniqueRepos([...authoredPRs, ...reviewedPRs]);
|
|
78
|
+
const commits = await this.fetchCommitsFromRepos(repos, username, from);
|
|
79
|
+
const reviews = this.convertToReviews(reviewedPRs, username);
|
|
80
|
+
return {
|
|
81
|
+
username,
|
|
82
|
+
commits,
|
|
83
|
+
pullRequests: authoredPRs,
|
|
84
|
+
reviews,
|
|
85
|
+
timeRange: {
|
|
86
|
+
from: from.toISOString(),
|
|
87
|
+
to: now.toISOString(),
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
async isAvailable() {
|
|
92
|
+
try {
|
|
93
|
+
await this.connect();
|
|
94
|
+
await this.getCurrentUser();
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
ensureConnected() {
|
|
102
|
+
if (!this.connected || !this.client) {
|
|
103
|
+
throw new Error('Not connected to GitHub MCP. Call connect() first.');
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async callTool(name, args) {
|
|
107
|
+
this.ensureConnected();
|
|
108
|
+
const result = await this.client.callTool({ name, arguments: args });
|
|
109
|
+
return result;
|
|
110
|
+
}
|
|
111
|
+
extractText(response) {
|
|
112
|
+
if (!response.content || response.content.length === 0) {
|
|
113
|
+
return '';
|
|
114
|
+
}
|
|
115
|
+
return response.content
|
|
116
|
+
.filter((c) => c.type === 'text' && c.text)
|
|
117
|
+
.map((c) => c.text ?? '')
|
|
118
|
+
.join('\n');
|
|
119
|
+
}
|
|
120
|
+
async fetchAuthoredPullRequests(username, sinceDate) {
|
|
121
|
+
try {
|
|
122
|
+
const result = await this.callTool('search_pull_requests', {
|
|
123
|
+
q: `author:${username} updated:>=${sinceDate}`,
|
|
124
|
+
sort: 'updated',
|
|
125
|
+
order: 'desc',
|
|
126
|
+
perPage: 20,
|
|
127
|
+
});
|
|
128
|
+
return this.parsePullRequests(result);
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
console.error('[prodbeam] Error fetching authored PRs:', error);
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async fetchReviewedPullRequests(username, sinceDate) {
|
|
136
|
+
try {
|
|
137
|
+
const result = await this.callTool('search_pull_requests', {
|
|
138
|
+
q: `reviewed-by:${username} -author:${username} updated:>=${sinceDate}`,
|
|
139
|
+
sort: 'updated',
|
|
140
|
+
order: 'desc',
|
|
141
|
+
perPage: 20,
|
|
142
|
+
});
|
|
143
|
+
return this.parsePullRequests(result);
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
console.error('[prodbeam] Error fetching reviewed PRs:', error);
|
|
147
|
+
return [];
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async fetchCommitsFromRepos(repos, username, since) {
|
|
151
|
+
const allCommits = [];
|
|
152
|
+
for (const repo of repos.slice(0, 5)) {
|
|
153
|
+
try {
|
|
154
|
+
const [owner, name] = repo.split('/');
|
|
155
|
+
if (!owner || !name)
|
|
156
|
+
continue;
|
|
157
|
+
const result = await this.callTool('list_commits', {
|
|
158
|
+
owner,
|
|
159
|
+
repo: name,
|
|
160
|
+
author: username,
|
|
161
|
+
since: since.toISOString(),
|
|
162
|
+
perPage: 20,
|
|
163
|
+
});
|
|
164
|
+
const commits = this.parseCommits(result, repo);
|
|
165
|
+
allCommits.push(...commits);
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
console.error(`[prodbeam] Error fetching commits for ${repo}:`, error);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return allCommits;
|
|
172
|
+
}
|
|
173
|
+
extractUniqueRepos(prs) {
|
|
174
|
+
const repos = new Set();
|
|
175
|
+
for (const pr of prs) {
|
|
176
|
+
if (pr.repo) {
|
|
177
|
+
repos.add(pr.repo);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return Array.from(repos);
|
|
181
|
+
}
|
|
182
|
+
convertToReviews(reviewedPRs, _username) {
|
|
183
|
+
return reviewedPRs.map((pr) => ({
|
|
184
|
+
pullRequestNumber: pr.number,
|
|
185
|
+
pullRequestTitle: pr.title,
|
|
186
|
+
author: pr.author,
|
|
187
|
+
state: 'COMMENTED',
|
|
188
|
+
submittedAt: pr.updatedAt,
|
|
189
|
+
repo: pr.repo,
|
|
190
|
+
}));
|
|
191
|
+
}
|
|
192
|
+
parseCommits(response, repo) {
|
|
193
|
+
const text = this.extractText(response);
|
|
194
|
+
if (!text)
|
|
195
|
+
return [];
|
|
196
|
+
const commits = [];
|
|
197
|
+
try {
|
|
198
|
+
const data = JSON.parse(text);
|
|
199
|
+
if (Array.isArray(data)) {
|
|
200
|
+
for (const item of data) {
|
|
201
|
+
const commit = this.extractCommitFromObject(item, repo);
|
|
202
|
+
if (commit)
|
|
203
|
+
commits.push(commit);
|
|
204
|
+
}
|
|
205
|
+
return commits;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
}
|
|
210
|
+
const lines = text.split('\n');
|
|
211
|
+
for (const line of lines) {
|
|
212
|
+
const shaMatch = line.match(/[`]?([a-f0-9]{7,40})[`]?\s*[-:]\s*(.+)/i);
|
|
213
|
+
if (shaMatch?.[1] && shaMatch[2]) {
|
|
214
|
+
commits.push({
|
|
215
|
+
sha: shaMatch[1],
|
|
216
|
+
message: shaMatch[2].trim().replace(/\s*\(.*\)\s*$/, ''),
|
|
217
|
+
author: '',
|
|
218
|
+
date: '',
|
|
219
|
+
repo,
|
|
220
|
+
url: '',
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
return commits;
|
|
225
|
+
}
|
|
226
|
+
extractCommitFromObject(obj, repo) {
|
|
227
|
+
const sha = obj['sha'] ?? '';
|
|
228
|
+
const commit = obj['commit'];
|
|
229
|
+
const message = commit?.['message'] ?? obj['message'] ?? '';
|
|
230
|
+
if (!sha && !message)
|
|
231
|
+
return null;
|
|
232
|
+
const author = commit?.['author']?.['name'] ??
|
|
233
|
+
obj['author']?.['login'] ??
|
|
234
|
+
'';
|
|
235
|
+
const date = commit?.['author']?.['date'] ??
|
|
236
|
+
obj['date'] ??
|
|
237
|
+
'';
|
|
238
|
+
const url = obj['html_url'] ?? '';
|
|
239
|
+
return { sha: sha.slice(0, 7), message: message.split('\n')[0] ?? '', author, date, repo, url };
|
|
240
|
+
}
|
|
241
|
+
parsePullRequests(response) {
|
|
242
|
+
const text = this.extractText(response);
|
|
243
|
+
if (!text)
|
|
244
|
+
return [];
|
|
245
|
+
const prs = [];
|
|
246
|
+
try {
|
|
247
|
+
const data = JSON.parse(text);
|
|
248
|
+
const items = Array.isArray(data)
|
|
249
|
+
? data
|
|
250
|
+
: (data['items'] ?? []);
|
|
251
|
+
for (const item of items) {
|
|
252
|
+
const pr = this.extractPRFromObject(item);
|
|
253
|
+
if (pr)
|
|
254
|
+
prs.push(pr);
|
|
255
|
+
}
|
|
256
|
+
return prs;
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
}
|
|
260
|
+
const lines = text.split('\n');
|
|
261
|
+
for (const line of lines) {
|
|
262
|
+
const prMatch = line.match(/#(\d+)\s*[-:]\s*(.+?)(?:\s*\[(open|closed|merged)\])?/i);
|
|
263
|
+
if (prMatch?.[1] && prMatch[2]) {
|
|
264
|
+
const repoMatch = line.match(/(?:in|repo[:\s]+)\s*(\S+\/\S+)/i);
|
|
265
|
+
prs.push({
|
|
266
|
+
number: parseInt(prMatch[1], 10),
|
|
267
|
+
title: prMatch[2].trim(),
|
|
268
|
+
state: prMatch[3]?.toLowerCase() ?? 'open',
|
|
269
|
+
author: '',
|
|
270
|
+
createdAt: '',
|
|
271
|
+
updatedAt: '',
|
|
272
|
+
repo: repoMatch?.[1] ?? '',
|
|
273
|
+
url: '',
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return prs;
|
|
278
|
+
}
|
|
279
|
+
extractPRFromObject(obj) {
|
|
280
|
+
const number = obj['number'];
|
|
281
|
+
const title = obj['title'];
|
|
282
|
+
if (!number && !title)
|
|
283
|
+
return null;
|
|
284
|
+
const repoUrl = obj['repository_url'] ?? obj['html_url'] ?? '';
|
|
285
|
+
const repoMatch = repoUrl.match(/repos\/(.+\/.+?)(?:\/|$)/) ?? repoUrl.match(/github\.com\/(.+?\/.+?)(?:\/|$)/);
|
|
286
|
+
let state = obj['state']?.toLowerCase() ?? 'open';
|
|
287
|
+
const mergedAt = obj['merged_at'] ??
|
|
288
|
+
obj['pull_request']?.['merged_at'];
|
|
289
|
+
if (mergedAt) {
|
|
290
|
+
state = 'merged';
|
|
291
|
+
}
|
|
292
|
+
return {
|
|
293
|
+
number: number ?? 0,
|
|
294
|
+
title: title ?? '',
|
|
295
|
+
state,
|
|
296
|
+
author: obj['user']?.['login'] ?? '',
|
|
297
|
+
createdAt: obj['created_at'] ?? '',
|
|
298
|
+
updatedAt: obj['updated_at'] ?? '',
|
|
299
|
+
mergedAt: obj['merged_at'] ?? undefined,
|
|
300
|
+
repo: repoMatch?.[1] ?? '',
|
|
301
|
+
url: obj['html_url'] ?? '',
|
|
302
|
+
additions: obj['additions'],
|
|
303
|
+
deletions: obj['deletions'],
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
//# sourceMappingURL=github-mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-mcp.js","sourceRoot":"","sources":["../../src/adapters/github-mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { JiraActivity } from '../types/jira.js';
|
|
2
|
+
export declare class JiraMCPAdapter {
|
|
3
|
+
private client;
|
|
4
|
+
private connected;
|
|
5
|
+
static isConfigured(): boolean;
|
|
6
|
+
connect(): Promise<void>;
|
|
7
|
+
disconnect(): Promise<void>;
|
|
8
|
+
fetchActivity(hours?: number): Promise<JiraActivity>;
|
|
9
|
+
isAvailable(): Promise<boolean>;
|
|
10
|
+
private extractText;
|
|
11
|
+
private parseIssues;
|
|
12
|
+
private extractIssueFromObject;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=jira-mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jira-mcp.d.ts","sourceRoot":"","sources":["../../src/adapters/jira-mcp.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,kBAAkB,CAAC;AAGhE,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,SAAS,CAAS;IAK1B,MAAM,CAAC,YAAY,IAAI,OAAO;IASxB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA4CxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B,aAAa,CAAC,KAAK,SAAK,GAAG,OAAO,CAAC,YAAY,CAAC;IAyChD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAWrC,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,WAAW;IA4CnB,OAAO,CAAC,sBAAsB;CAmB/B"}
|