projectpulse-mcp 1.6.13 → 1.7.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/README.md CHANGED
@@ -27,15 +27,76 @@ This [Model Context Protocol](https://modelcontextprotocol.io/) (MCP) server giv
27
27
  - ⚙️ **CI/CD Status** — recent GitHub Actions workflow runs and conclusions
28
28
  - 📋 **Repository Info** — stars, forks, language, license, and general metadata
29
29
 
30
- ## 📸 Example
30
+ ## 📸 Examples
31
31
 
32
- ### MCP Inspector — `get_repo_health`
32
+ > All screenshots taken live from [MCP Inspector](https://modelcontextprotocol.io/docs/tools/inspector).
33
33
 
34
- ![MCP Inspector Demo](https://raw.githubusercontent.com/alexbypa/github-projectpulse-mcp/main/docs/images/projectpulse-inspector-demo.png)
34
+ <details open>
35
+ <summary><strong>get_health_score</strong> — A-F grade with category breakdown</summary>
35
36
 
36
- ### Code Scanning — `analyze_code_scanning`
37
+ ![get_health_score](https://raw.githubusercontent.com/alexbypa/github-projectpulse-mcp/main/docs/images/get_health_score_Use_Case.png)
38
+ </details>
37
39
 
38
- ![Code Scanning Example](https://raw.githubusercontent.com/alexbypa/github-projectpulse-mcp/main/docs/images/code-scanning-example.png)
40
+ <details>
41
+ <summary><strong>get_dora_metrics</strong> — DORA delivery metrics from GitHub data</summary>
42
+
43
+ ![get_dora_metrics](https://raw.githubusercontent.com/alexbypa/github-projectpulse-mcp/main/docs/images/get_dora_metrics_Use_Case.png)
44
+ </details>
45
+
46
+ <details>
47
+ <summary><strong>compare_repos</strong> — Side-by-side health score ranking</summary>
48
+
49
+ ![compare_repos](https://raw.githubusercontent.com/alexbypa/github-projectpulse-mcp/main/docs/images/compare_repos_Use_Case.png)
50
+ </details>
51
+
52
+ <details>
53
+ <summary><strong>check_ci_status</strong> — Recent GitHub Actions workflow runs</summary>
54
+
55
+ ![check_ci_status](https://raw.githubusercontent.com/alexbypa/github-projectpulse-mcp/main/docs/images/check_ci_status_Use_Case.png)
56
+ </details>
57
+
58
+ <details>
59
+ <summary><strong>get_repo_health</strong> — Repository metadata and stats</summary>
60
+
61
+ ![get_repo_health](https://raw.githubusercontent.com/alexbypa/github-projectpulse-mcp/main/docs/images/get_repo_health_Use_Case.png)
62
+ </details>
63
+
64
+ <details>
65
+ <summary><strong>analyze_dependencies</strong> — Dependabot vulnerability alerts</summary>
66
+
67
+ ![analyze_dependencies](https://raw.githubusercontent.com/alexbypa/github-projectpulse-mcp/main/docs/images/analyze_dependencies_Use_Case.png)
68
+ </details>
69
+
70
+ ## 💡 Use Cases
71
+
72
+ > Copy-paste these prompts into Claude, Cursor, Windsurf, or any MCP-compatible assistant.
73
+
74
+ ### Due Diligence — Library Adoption
75
+ > "Evaluate whether `facebook/react` is production-ready. Check the health score, security vulnerabilities (Dependabot and CodeQL), and whether the CI pipeline passes consistently."
76
+
77
+ *Tools used: `get_health_score`, `analyze_dependencies`, `analyze_code_scanning`, `check_ci_status`*
78
+
79
+ ### Compare Alternatives
80
+ > "I need to choose between `expressjs/express`, `fastify/fastify`, and `koajs/koa`. Compare their health scores and tell me which one has the lowest technical risk."
81
+
82
+ *Tools used: `compare_repos`*
83
+
84
+ ### Sprint Review — DORA Metrics
85
+ > "Calculate the DORA metrics for `vercel/next.js` over the last 30 days. I want to present delivery performance at our sprint review."
86
+
87
+ *Tools used: `get_dora_metrics`*
88
+
89
+ ### Trend Monitoring
90
+ > "Check the health score of `microsoft/vscode`. Has it improved or worsened since the last time we checked?"
91
+
92
+ *Tools used: `get_health_score` (includes trend comparison on repeated calls)*
93
+
94
+ ### Quick Security Audit
95
+ > "Run a security audit of `pallets/flask`: Dependabot alerts, CodeQL vulnerabilities, and CI build status. Give me a complete picture."
96
+
97
+ *Tools used: `analyze_dependencies`, `analyze_code_scanning`, `check_ci_status`*
98
+
99
+ ---
39
100
 
40
101
  ## 🚀 Quick Start
41
102
 
@@ -160,6 +221,37 @@ Simple connectivity check. Returns "pong" with your message. Use to verify the M
160
221
 
161
222
  ## 🆕 What's New
162
223
 
224
+ ### HTTP Transport (v1.7.0)
225
+
226
+ ProjectPulse now supports **Streamable HTTP transport** in addition to stdio. This enables running as a standalone HTTP server — ideal for Docker containers, remote deployments, and cross-runtime integrations (e.g., .NET clients consuming Node.js MCP tools over the network).
227
+
228
+ **Default behavior is unchanged** — `npx projectpulse-mcp` still uses stdio. To activate HTTP mode:
229
+
230
+ ```bash
231
+ MCP_TRANSPORT=http MCP_PORT=3000 node dist/index.js
232
+ ```
233
+
234
+ | Env Variable | Default | Description |
235
+ | --- | --- | --- |
236
+ | `MCP_TRANSPORT` | `stdio` | Transport mode: `stdio` or `http` |
237
+ | `MCP_PORT` | `3000` | HTTP server port (only used when `MCP_TRANSPORT=http`) |
238
+
239
+ **Docker example:**
240
+
241
+ ```yaml
242
+ projectpulse:
243
+ image: node:22-slim
244
+ command: >-
245
+ sh -c "npm install -g projectpulse-mcp &&
246
+ node /usr/local/lib/node_modules/projectpulse-mcp/dist/index.js"
247
+ environment:
248
+ - MCP_TRANSPORT=http
249
+ - MCP_PORT=3000
250
+ - GITHUB_TOKEN=${GITHUB_TOKEN}
251
+ ```
252
+
253
+ Health check endpoint available at `GET /` (returns JSON with server name and version). MCP protocol endpoint at `POST /mcp`.
254
+
163
255
  ### OpenSSF Scorecard Integration
164
256
 
165
257
  Security score now blends **Dependabot alerts** (60%) with **OpenSSF Scorecard** checks (40%) for a more complete picture. 12 security-relevant checks are evaluated — repos without a scorecard gracefully fall back to Dependabot-only scoring.
package/dist/index.js CHANGED
@@ -1,5 +1,9 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
4
+ import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js";
5
+ import { createServer } from "node:http";
6
+ import { randomUUID } from "node:crypto";
3
7
  import { registerCheckCiStatus } from "./tools/check-ci-status.js";
4
8
  import { registerGetRepoHealth } from "./tools/get-repo-health.js";
5
9
  import { registerAnalyzeDependencies } from "./tools/analyze-dependencies.js";
@@ -12,14 +16,102 @@ import { join, dirname } from "path";
12
16
  import { fileURLToPath } from "url";
13
17
  const __dirname = dirname(fileURLToPath(import.meta.url));
14
18
  const pkg = JSON.parse(readFileSync(join(__dirname, "../package.json"), "utf-8"));
15
- const server = new McpServer({ name: "projectpulse-mcp", version: pkg.version });
16
- registerCheckCiStatus(server);
17
- registerGetRepoHealth(server);
18
- registerAnalyzeDependencies(server);
19
- registerAnalyzeCodeScanning(server);
20
- registerGetHealthScore(server);
21
- registerGetDoraMetrics(server);
22
- registerCompareRepos(server);
23
- const transport = new StdioServerTransport();
24
- await server.connect(transport);
19
+ function createMcpServer() {
20
+ const server = new McpServer({ name: "projectpulse-mcp", version: pkg.version });
21
+ registerCheckCiStatus(server);
22
+ registerGetRepoHealth(server);
23
+ registerAnalyzeDependencies(server);
24
+ registerAnalyzeCodeScanning(server);
25
+ registerGetHealthScore(server);
26
+ registerGetDoraMetrics(server);
27
+ registerCompareRepos(server);
28
+ return server;
29
+ }
30
+ // --- Transport selection ---
31
+ // Default: stdio (backward compatible, per uso locale e npx)
32
+ // MCP_TRANSPORT=http: Streamable HTTP server (per Docker e remote clients)
33
+ const transportMode = (process.env.MCP_TRANSPORT ?? "stdio").toLowerCase();
34
+ if (transportMode === "http") {
35
+ const port = parseInt(process.env.MCP_PORT ?? "3000", 10);
36
+ const transports = new Map();
37
+ const httpServer = createServer(async (req, res) => {
38
+ const url = new URL(req.url ?? "/", `http://localhost:${port}`);
39
+ // Only handle /mcp path — MCP protocol endpoint
40
+ if (url.pathname !== "/mcp") {
41
+ // Health check on root
42
+ if (url.pathname === "/" && req.method === "GET") {
43
+ res.writeHead(200, { "Content-Type": "application/json" });
44
+ res.end(JSON.stringify({ status: "ok", server: "projectpulse-mcp", version: pkg.version }));
45
+ return;
46
+ }
47
+ res.writeHead(404);
48
+ res.end("Not Found");
49
+ return;
50
+ }
51
+ // Parse JSON body for POST requests
52
+ if (req.method === "POST") {
53
+ const chunks = [];
54
+ for await (const chunk of req)
55
+ chunks.push(chunk);
56
+ const body = JSON.parse(Buffer.concat(chunks).toString());
57
+ req.body = body;
58
+ const sessionId = req.headers["mcp-session-id"];
59
+ if (sessionId && transports.has(sessionId)) {
60
+ // Existing session — reuse transport
61
+ await transports.get(sessionId).handleRequest(req, res, body);
62
+ }
63
+ else if (!sessionId && isInitializeRequest(body)) {
64
+ // New session — create transport + server
65
+ const transport = new StreamableHTTPServerTransport({
66
+ sessionIdGenerator: () => randomUUID(),
67
+ onsessioninitialized: (sid) => {
68
+ transports.set(sid, transport);
69
+ },
70
+ });
71
+ transport.onclose = () => {
72
+ const sid = transport.sessionId;
73
+ if (sid)
74
+ transports.delete(sid);
75
+ };
76
+ const server = createMcpServer();
77
+ await server.connect(transport);
78
+ await transport.handleRequest(req, res, body);
79
+ }
80
+ else {
81
+ res.writeHead(400, { "Content-Type": "application/json" });
82
+ res.end(JSON.stringify({ jsonrpc: "2.0", error: { code: -32000, message: "Bad Request: No valid session ID" }, id: null }));
83
+ }
84
+ }
85
+ else if (req.method === "GET" || req.method === "DELETE") {
86
+ const sessionId = req.headers["mcp-session-id"];
87
+ if (!sessionId || !transports.has(sessionId)) {
88
+ res.writeHead(400);
89
+ res.end("Invalid or missing session ID");
90
+ return;
91
+ }
92
+ await transports.get(sessionId).handleRequest(req, res);
93
+ }
94
+ else {
95
+ res.writeHead(405);
96
+ res.end("Method Not Allowed");
97
+ }
98
+ });
99
+ httpServer.listen(port, "0.0.0.0", () => {
100
+ console.log(`ProjectPulse MCP server (HTTP) listening on http://0.0.0.0:${port}/mcp`);
101
+ });
102
+ process.on("SIGINT", async () => {
103
+ for (const [, transport] of transports) {
104
+ await transport.close();
105
+ }
106
+ transports.clear();
107
+ httpServer.close();
108
+ process.exit(0);
109
+ });
110
+ }
111
+ else {
112
+ // Default: stdio transport (backward compatible)
113
+ const server = createMcpServer();
114
+ const transport = new StdioServerTransport();
115
+ await server.connect(transport);
116
+ }
25
117
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAEhF,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;AAElF,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;AAEjF,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAC9B,2BAA2B,CAAC,MAAM,CAAC,CAAC;AACpC,2BAA2B,CAAC,MAAM,CAAC,CAAC;AACpC,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC/B,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAC/B,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAE7B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAA;AAC5C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { Grade, CategoryScore, HealthReport } from "../types/health.js";
1
+ import { Grade, CategoryScore, HealthReport, Recommendation, RecommendationContext } from "../types/health.js";
2
2
  export declare function scoreToGrade(score: number): Grade;
3
3
  export declare function calculateCiScore(runs: Array<{
4
4
  conclusion: string | null;
@@ -13,4 +13,6 @@ export declare function calculateSecurityScore(alertCounts: {
13
13
  export declare function calculateCommunityScore(openIssues: number, forks: number): CategoryScore;
14
14
  export declare function calculateMaintenanceScore(hasLicense: boolean, hasDescription: boolean, archived: boolean): CategoryScore;
15
15
  export declare function calculateHealthScore(repo: string, categories: Record<string, CategoryScore>): HealthReport;
16
+ export declare function generateRecommendations(categories: Record<string, CategoryScore>, context: RecommendationContext): Recommendation[];
17
+ export declare function generateBadgeSnippet(score: number): string;
16
18
  //# sourceMappingURL=health-score.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"health-score.d.ts","sourceRoot":"","sources":["../../src/scoring/health-score.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAWxE,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAMjD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC;IAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,GAAG,aAAa,CAK1F;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAQvE;AAED,wBAAgB,sBAAsB,CAAC,WAAW,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,aAAa,CAuBzJ;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CAQxF;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,aAAa,CAMxH;AAED,wBAAgB,oBAAoB,CAChC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAC1C,YAAY,CAQd"}
1
+ {"version":3,"file":"health-score.d.ts","sourceRoot":"","sources":["../../src/scoring/health-score.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAW/G,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAMjD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC;IAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,GAAG,aAAa,CAK1F;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAQvE;AAED,wBAAgB,sBAAsB,CAAC,WAAW,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,aAAa,CAuBzJ;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CAQxF;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,aAAa,CAMxH;AAED,wBAAgB,oBAAoB,CAChC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAC1C,YAAY,CAQd;AAED,wBAAgB,uBAAuB,CACnC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,EACzC,OAAO,EAAE,qBAAqB,GAC/B,cAAc,EAAE,CAuGlB;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAqB1D"}
@@ -86,6 +86,130 @@ export function calculateHealthScore(repo, categories) {
86
86
  .map(cat => `Improve ${cat.detail} (score: ${cat.score}/100)`);
87
87
  return { repo, score, grade, breakdown: categories, suggestions, checkedAt: new Date().toISOString(), gradeMeaning: gradeToMeaning(grade) };
88
88
  }
89
+ export function generateRecommendations(categories, context) {
90
+ const recs = [];
91
+ // CI
92
+ if (context.ciTotal > 0) {
93
+ const failed = context.ciTotal - context.ciPassed;
94
+ const failRate = failed / context.ciTotal;
95
+ if (failRate > 0.3) {
96
+ recs.push({
97
+ category: "ci",
98
+ priority: "high",
99
+ message: `Stabilize CI pipeline: ${failed}/${context.ciTotal} recent runs failed`,
100
+ impact: "Score +10-20 points",
101
+ });
102
+ }
103
+ }
104
+ else {
105
+ recs.push({
106
+ category: "ci",
107
+ priority: "medium",
108
+ message: "Set up CI/CD with GitHub Actions to automate testing and builds",
109
+ impact: "Score +15-25 points",
110
+ });
111
+ }
112
+ // Freshness
113
+ if (context.daysSinceLastPush > 90) {
114
+ recs.push({
115
+ category: "freshness",
116
+ priority: "high",
117
+ message: `Repository appears inactive — last push was ${Math.round(context.daysSinceLastPush)} days ago`,
118
+ impact: "Score +15-25 points",
119
+ });
120
+ }
121
+ else if (context.daysSinceLastPush > 30) {
122
+ recs.push({
123
+ category: "freshness",
124
+ priority: "medium",
125
+ message: `Last push was ${Math.round(context.daysSinceLastPush)} days ago — consider more frequent updates`,
126
+ impact: "Score +5-10 points",
127
+ });
128
+ }
129
+ // Security — critical
130
+ if (context.alerts.critical > 0) {
131
+ recs.push({
132
+ category: "security",
133
+ priority: "high",
134
+ message: `Fix ${context.alerts.critical} critical Dependabot alert(s) to reduce security risk`,
135
+ impact: "Score +10-25 points",
136
+ });
137
+ }
138
+ // Security — high
139
+ if (context.alerts.high > 0) {
140
+ recs.push({
141
+ category: "security",
142
+ priority: "medium",
143
+ message: `Address ${context.alerts.high} high-severity Dependabot alert(s)`,
144
+ impact: "Score +5-15 points",
145
+ });
146
+ }
147
+ // Maintenance — license
148
+ if (!context.hasLicense) {
149
+ recs.push({
150
+ category: "maintenance",
151
+ priority: "high",
152
+ message: "Add a LICENSE file — without one, the code is legally unusable by others",
153
+ impact: "Score +5 points",
154
+ });
155
+ }
156
+ // Maintenance — description
157
+ if (!context.hasDescription) {
158
+ recs.push({
159
+ category: "maintenance",
160
+ priority: "medium",
161
+ message: "Add a repository description to improve discoverability",
162
+ impact: "Score +5 points",
163
+ });
164
+ }
165
+ // Maintenance — archived
166
+ if (context.archived) {
167
+ recs.push({
168
+ category: "maintenance",
169
+ priority: "high",
170
+ message: "Repository is archived — unarchive it if the project is still active",
171
+ impact: "Score +5 points",
172
+ });
173
+ }
174
+ // Community — issue backlog
175
+ if (context.openIssues > 50) {
176
+ recs.push({
177
+ category: "community",
178
+ priority: "medium",
179
+ message: `${context.openIssues} open issues — consider triaging or closing stale ones`,
180
+ impact: "Score +5-10 points",
181
+ });
182
+ }
183
+ // Sort: high → medium → low
184
+ const priorityOrder = { high: 0, medium: 1, low: 2 };
185
+ recs.sort((a, b) => priorityOrder[a.priority] - priorityOrder[b.priority]);
186
+ return recs;
187
+ }
188
+ export function generateBadgeSnippet(score) {
189
+ let color;
190
+ if (score >= 90)
191
+ color = "brightgreen";
192
+ else if (score >= 70)
193
+ color = "green";
194
+ else if (score >= 50)
195
+ color = "yellow";
196
+ else if (score >= 30)
197
+ color = "orange";
198
+ else
199
+ color = "red";
200
+ const now = new Date();
201
+ const monthYear = now.toLocaleDateString("en-US", { month: "short", year: "numeric" });
202
+ const label = encodeURIComponent("ProjectPulse Health");
203
+ const value = encodeURIComponent(`${score}/100 · ${monthYear}`);
204
+ return [
205
+ `### Badge for your README`,
206
+ `\`\`\`markdown`,
207
+ `![ProjectPulse Health](https://img.shields.io/badge/${label}-${value}-${color})`,
208
+ `\`\`\``,
209
+ ``,
210
+ `Powered by [projectpulse-mcp](https://www.npmjs.com/package/projectpulse-mcp)`,
211
+ ].join("\n");
212
+ }
89
213
  function gradeToMeaning(grade) {
90
214
  switch (grade) {
91
215
  case "A":
@@ -1 +1 @@
1
- {"version":3,"file":"health-score.js","sourceRoot":"","sources":["../../src/scoring/health-score.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"health-score.js","sourceRoot":"","sources":["../../src/scoring/health-score.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,15 @@ export declare function executeAnalyzeDependencies({ owner, repo, severity }: {
8
8
  type: "text";
9
9
  text: string;
10
10
  }[];
11
- structuredContent: Record<string, unknown>;
11
+ structuredContent: {
12
+ alerts: {
13
+ summary: string;
14
+ severity: "critical" | "high" | "medium" | "low";
15
+ package_name: string | undefined;
16
+ state: "open" | "auto_dismissed" | "dismissed" | "fixed";
17
+ html_url: string;
18
+ }[];
19
+ };
12
20
  }>;
13
21
  export declare function registerAnalyzeDependencies(server: McpServer): void;
14
22
  //# sourceMappingURL=analyze-dependencies.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"analyze-dependencies.d.ts","sourceRoot":"","sources":["../../src/tools/analyze-dependencies.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiBpE,wBAAsB,0BAA0B,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;uBAiB5E,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;GAExE;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwBnE"}
1
+ {"version":3,"file":"analyze-dependencies.d.ts","sourceRoot":"","sources":["../../src/tools/analyze-dependencies.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmBpE,wBAAsB,0BAA0B,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;;;;;GAoB7H;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwBnE"}
@@ -5,13 +5,15 @@ const inputSchema = z.object({
5
5
  repo: z.string().describe("GitHub repository name (e.g., 'sdk')"),
6
6
  severity: z.enum(["critical", "high", "medium", "low"]).optional()
7
7
  });
8
- const outputSchema = z.array(z.object({
9
- summary: z.string(),
10
- severity: z.string(),
11
- package_name: z.string().optional(),
12
- state: z.string(),
13
- html_url: z.string()
14
- }));
8
+ const outputSchema = z.object({
9
+ alerts: z.array(z.object({
10
+ summary: z.string(),
11
+ severity: z.string(),
12
+ package_name: z.string().optional(),
13
+ state: z.string(),
14
+ html_url: z.string()
15
+ }))
16
+ });
15
17
  export async function executeAnalyzeDependencies({ owner, repo, severity }) {
16
18
  const { data } = await getOctokit().dependabot.listAlertsForRepo({ owner, repo });
17
19
  const result = data.map((alert) => ({
@@ -22,12 +24,13 @@ export async function executeAnalyzeDependencies({ owner, repo, severity }) {
22
24
  html_url: alert.html_url
23
25
  }));
24
26
  const filtered = severity ? result.filter((alert) => alert.severity === severity) : result;
27
+ const response = { alerts: filtered };
25
28
  return {
26
29
  content: [{
27
30
  type: "text",
28
- text: JSON.stringify(filtered, null, 2)
31
+ text: JSON.stringify(response, null, 2)
29
32
  }],
30
- structuredContent: filtered
33
+ structuredContent: response
31
34
  };
32
35
  }
33
36
  export function registerAnalyzeDependencies(server) {
@@ -1 +1 @@
1
- {"version":3,"file":"analyze-dependencies.js","sourceRoot":"","sources":["../../src/tools/analyze-dependencies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IACzB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;IACpF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IACjE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE;CACrE,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IAClC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;CACvB,CAAC,CAAC,CAAC;AAEJ,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAsD;IAC1H,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAChC,OAAO,EAAE,KAAK,CAAC,iBAAiB,CAAC,OAAO;QACxC,QAAQ,EAAE,KAAK,CAAC,iBAAiB,CAAC,QAAQ;QAC1C,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI;QAC5C,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;KAC3B,CAAC,CAAC,CAAC;IAEJ,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAE3F,OAAO;QACH,OAAO,EAAE,CAAC;gBACN,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;aAC1C,CAAC;QACF,iBAAiB,EAAE,QAA8C;KACpE,CAAC;AACN,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,MAAiB;IACzD,MAAM,CAAC,YAAY,CACf,sBAAsB,EACtB;QACI,WAAW,EAAE;;;;;;;;6EAQoD;QACjE,WAAW;QACX,YAAY;QACZ,WAAW,EAAE;YACT,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACtB;KACJ,EACD,0BAA0B,CAC7B,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"analyze-dependencies.js","sourceRoot":"","sources":["../../src/tools/analyze-dependencies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IACzB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;IACpF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IACjE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE;CACrE,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACrB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;QACpB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACnC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;KACvB,CAAC,CAAC;CACN,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAsD;IAC1H,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAClF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAChC,OAAO,EAAE,KAAK,CAAC,iBAAiB,CAAC,OAAO;QACxC,QAAQ,EAAE,KAAK,CAAC,iBAAiB,CAAC,QAAQ;QAC1C,YAAY,EAAE,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI;QAC5C,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;KAC3B,CAAC,CAAC,CAAC;IAEJ,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAE3F,MAAM,QAAQ,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACtC,OAAO;QACH,OAAO,EAAE,CAAC;gBACN,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;aAC1C,CAAC;QACF,iBAAiB,EAAE,QAAQ;KAC9B,CAAC;AACN,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,MAAiB;IACzD,MAAM,CAAC,YAAY,CACf,sBAAsB,EACtB;QACI,WAAW,EAAE;;;;;;;;6EAQoD;QACjE,WAAW;QACX,YAAY;QACZ,WAAW,EAAE;YACT,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACtB;KACJ,EACD,0BAA0B,CAC7B,CAAC;AACN,CAAC"}
@@ -8,7 +8,17 @@ export declare function executeCheckCiStatus({ owner, repo, limit }: {
8
8
  type: "text";
9
9
  text: string;
10
10
  }[];
11
- structuredContent: Record<string, unknown>;
11
+ structuredContent: {
12
+ runs: {
13
+ name: string | null | undefined;
14
+ status: string | null;
15
+ conclusion: string | null;
16
+ head_branch: string | null;
17
+ created_at: string;
18
+ updated_at: string;
19
+ html_url: string;
20
+ }[];
21
+ };
12
22
  }>;
13
23
  export declare function registerCheckCiStatus(server: McpServer): void;
14
24
  //# sourceMappingURL=check-ci-status.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"check-ci-status.d.ts","sourceRoot":"","sources":["../../src/tools/check-ci-status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmBpE,wBAAsB,oBAAoB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;;;;;uBAiBjE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;GAEtE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyB7D"}
1
+ {"version":3,"file":"check-ci-status.d.ts","sourceRoot":"","sources":["../../src/tools/check-ci-status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAqBpE,wBAAsB,oBAAoB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;;;;;;;GAoBhH;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyB7D"}
@@ -5,15 +5,17 @@ const inputSchema = z.object({
5
5
  repo: z.string().describe("GitHub repository name (e.g., 'sdk')"),
6
6
  limit: z.number().min(1).max(30).default(10).describe("Number of runs to return"),
7
7
  });
8
- const outputSchema = z.array(z.object({
9
- name: z.string().nullable(),
10
- status: z.string().nullable(),
11
- conclusion: z.string().nullable(),
12
- head_branch: z.string().nullable(),
13
- created_at: z.string(),
14
- updated_at: z.string(),
15
- html_url: z.string()
16
- }));
8
+ const outputSchema = z.object({
9
+ runs: z.array(z.object({
10
+ name: z.string().nullable(),
11
+ status: z.string().nullable(),
12
+ conclusion: z.string().nullable(),
13
+ head_branch: z.string().nullable(),
14
+ created_at: z.string(),
15
+ updated_at: z.string(),
16
+ html_url: z.string()
17
+ }))
18
+ });
17
19
  export async function executeCheckCiStatus({ owner, repo, limit }) {
18
20
  const { data } = await getOctokit().actions.listWorkflowRunsForRepo({ owner, repo, per_page: limit });
19
21
  const result = data.workflow_runs.map((run) => ({
@@ -25,12 +27,13 @@ export async function executeCheckCiStatus({ owner, repo, limit }) {
25
27
  updated_at: run.updated_at,
26
28
  html_url: run.html_url,
27
29
  }));
30
+ const response = { runs: result };
28
31
  return {
29
32
  content: [{
30
33
  type: "text",
31
- text: JSON.stringify(result, null, 2),
34
+ text: JSON.stringify(response, null, 2),
32
35
  }],
33
- structuredContent: result
36
+ structuredContent: response
34
37
  };
35
38
  }
36
39
  export function registerCheckCiStatus(server) {
@@ -1 +1 @@
1
- {"version":3,"file":"check-ci-status.js","sourceRoot":"","sources":["../../src/tools/check-ci-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IACzB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;IACpF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IACjE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC;CACpF,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IAClC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;CACvB,CAAC,CAAC,CAAC;AAEJ,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAkD;IAC7G,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IACtG,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;KACzB,CAAC,CAAC,CAAC;IAEJ,OAAO;QACH,OAAO,EAAE,CAAC;gBACN,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;aACxC,CAAC;QACF,iBAAiB,EAAE,MAA4C;KAClE,CAAC;AACN,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACnD,MAAM,CAAC,YAAY,CACf,iBAAiB,EACjB;QACI,WAAW,EAAE;;;;;;;;;iEASwC;QACrD,WAAW;QACX,YAAY;QACZ,WAAW,EAAE;YACT,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACtB;KACJ,EACD,oBAAoB,CACvB,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"check-ci-status.js","sourceRoot":"","sources":["../../src/tools/check-ci-status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IACzB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;IACpF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IACjE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC;CACpF,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC3B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC7B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QACjC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAClC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;QACtB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;QACtB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;KACvB,CAAC,CAAC;CACN,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAkD;IAC7G,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IACtG,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,QAAQ,EAAE,GAAG,CAAC,QAAQ;KACzB,CAAC,CAAC,CAAC;IAEJ,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAClC,OAAO;QACH,OAAO,EAAE,CAAC;gBACN,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;aAC1C,CAAC;QACF,iBAAiB,EAAE,QAAQ;KAC9B,CAAC;AACN,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACnD,MAAM,CAAC,YAAY,CACf,iBAAiB,EACjB;QACI,WAAW,EAAE;;;;;;;;;iEASwC;QACrD,WAAW;QACX,YAAY;QACZ,WAAW,EAAE;YACT,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,IAAI;YACpB,aAAa,EAAE,IAAI;SACtB;KACJ,EACD,oBAAoB,CACvB,CAAC;AACN,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"compare-repos.d.ts","sourceRoot":"","sources":["../../src/tools/compare-repos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAAgB,MAAM,oBAAoB,CAAC;AAEpE,eAAO,MAAM,WAAW;;;;;iBAWtB,CAAC;AA2BH,wBAAsB,mBAAmB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;KAAE,EAAE,CAAA;CAAE;;;;;;GAqEjG;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwB5D"}
1
+ {"version":3,"file":"compare-repos.d.ts","sourceRoot":"","sources":["../../src/tools/compare-repos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,gBAAgB,EAAgB,MAAM,oBAAoB,CAAC;AAEpE,eAAO,MAAM,WAAW;;;;;iBAWtB,CAAC;AA2BH,wBAAsB,mBAAmB,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;KAAE,EAAE,CAAA;CAAE;;;;;;GAsEjG;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwB5D"}
@@ -37,7 +37,8 @@ export async function executeCompareRepos({ repos }) {
37
37
  const reposResults = await Promise.all(repos.map(async (repo) => {
38
38
  try {
39
39
  const result = await executeGetHealthScore(repo);
40
- const report = JSON.parse(result.content[0].text);
40
+ const parsed = JSON.parse(result.content[0].text);
41
+ const report = parsed.report;
41
42
  return {
42
43
  owner: repo.owner,
43
44
  repo: repo.repo,
@@ -1 +1 @@
1
- {"version":3,"file":"compare-repos.js","sourceRoot":"","sources":["../../src/tools/compare-repos.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compare-repos.js","sourceRoot":"","sources":["../../src/tools/compare-repos.ts"],"names":[],"mappings":"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"}
@@ -16,6 +16,8 @@ export declare function executeGetHealthScore({ owner, repo }: {
16
16
  scoreDiff: number;
17
17
  direction: string;
18
18
  } | null;
19
+ recommendations: import("../types/health.js").Recommendation[];
20
+ badgeSnippet: string;
19
21
  };
20
22
  }>;
21
23
  export declare function registerGetHealthScore(server: McpServer): void;
@@ -1 +1 @@
1
- {"version":3,"file":"get-health-score.d.ts","sourceRoot":"","sources":["../../src/tools/get-health-score.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA4CpE,wBAAsB,qBAAqB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;;;;;;GA2D3F;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0B9D"}
1
+ {"version":3,"file":"get-health-score.d.ts","sourceRoot":"","sources":["../../src/tools/get-health-score.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAuDpE,wBAAsB,qBAAqB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;;;;;;;;GA8E3F;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0B9D"}
@@ -2,7 +2,7 @@ import { z } from "zod";
2
2
  import { getOctokit } from "../github/client.js";
3
3
  import { fetchOpenSSFScore } from "../security/openssf-client.js";
4
4
  import { saveSnapshot, getLastSnapshot } from "../analytics/trend-tracker.js";
5
- import { calculateCiScore, calculateFreshnessScore, calculateSecurityScore, calculateCommunityScore, calculateMaintenanceScore, calculateHealthScore, } from "../scoring/health-score.js";
5
+ import { calculateCiScore, calculateFreshnessScore, calculateSecurityScore, calculateCommunityScore, calculateMaintenanceScore, calculateHealthScore, generateRecommendations, generateBadgeSnippet, } from "../scoring/health-score.js";
6
6
  const inputSchema = z.object({
7
7
  owner: z.string().describe("GitHub repository owner (e.g., 'modelcontextprotocol')"),
8
8
  repo: z.string().describe("GitHub repository name (e.g., 'sdk')"),
@@ -20,6 +20,12 @@ const healthReportSchema = z.object({
20
20
  checkedAt: z.string(),
21
21
  gradeMeaning: z.string()
22
22
  });
23
+ const recommendationSchema = z.object({
24
+ category: z.string(),
25
+ priority: z.enum(["high", "medium", "low"]),
26
+ message: z.string(),
27
+ impact: z.string(),
28
+ });
23
29
  const outputSchema = z.object({
24
30
  report: healthReportSchema,
25
31
  trend: z.object({
@@ -28,7 +34,9 @@ const outputSchema = z.object({
28
34
  previousCheckedAt: z.string(),
29
35
  scoreDiff: z.number(),
30
36
  direction: z.string()
31
- }).nullable()
37
+ }).nullable(),
38
+ recommendations: z.array(recommendationSchema),
39
+ badgeSnippet: z.string(),
32
40
  });
33
41
  export async function executeGetHealthScore({ owner, repo }) {
34
42
  const octokit = getOctokit();
@@ -60,6 +68,20 @@ export async function executeGetHealthScore({ owner, repo }) {
60
68
  };
61
69
  const previousSnapshot = await getLastSnapshot(owner, repo);
62
70
  const report = calculateHealthScore(`${owner}/${repo}`, categories);
71
+ const daysSinceLastPush = (Date.now() - new Date(repoData.data.pushed_at ?? new Date().toISOString()).getTime()) / (1000 * 60 * 60 * 24);
72
+ const ciPassed = runsData.data.workflow_runs.filter(r => r.conclusion === "success").length;
73
+ const recommendations = generateRecommendations(categories, {
74
+ ciPassed,
75
+ ciTotal: runsData.data.workflow_runs.length,
76
+ daysSinceLastPush,
77
+ alerts: alertCounts,
78
+ hasLicense: repoData.data.license !== null,
79
+ hasDescription: repoData.data.description !== null,
80
+ archived: repoData.data.archived,
81
+ openIssues: repoData.data.open_issues_count,
82
+ forks: repoData.data.forks_count,
83
+ });
84
+ const badgeSnippet = generateBadgeSnippet(report.score);
63
85
  const response = {
64
86
  report,
65
87
  trend: previousSnapshot ? {
@@ -68,7 +90,9 @@ export async function executeGetHealthScore({ owner, repo }) {
68
90
  previousCheckedAt: previousSnapshot.checkedAt,
69
91
  scoreDiff: report.score - previousSnapshot.score,
70
92
  direction: report.score < previousSnapshot.score ? "↓" : report.score > previousSnapshot.score ? "↑" : "→"
71
- } : null
93
+ } : null,
94
+ recommendations,
95
+ badgeSnippet,
72
96
  };
73
97
  await saveSnapshot(owner, repo, report);
74
98
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"get-health-score.js","sourceRoot":"","sources":["../../src/tools/get-health-score.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"get-health-score.js","sourceRoot":"","sources":["../../src/tools/get-health-score.ts"],"names":[],"mappings":"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"}
@@ -28,5 +28,27 @@ export type TrendSnapshot = {
28
28
  grade: Grade;
29
29
  checkedAt: string;
30
30
  };
31
- export { Grade, CategoryScore, HealthReport, ComparisonResult };
31
+ type Recommendation = {
32
+ category: string;
33
+ priority: "high" | "medium" | "low";
34
+ message: string;
35
+ impact: string;
36
+ };
37
+ export type RecommendationContext = {
38
+ ciPassed: number;
39
+ ciTotal: number;
40
+ daysSinceLastPush: number;
41
+ alerts: {
42
+ critical: number;
43
+ high: number;
44
+ medium: number;
45
+ low: number;
46
+ };
47
+ hasLicense: boolean;
48
+ hasDescription: boolean;
49
+ archived: boolean;
50
+ openIssues: number;
51
+ forks: number;
52
+ };
53
+ export { Grade, CategoryScore, HealthReport, ComparisonResult, Recommendation };
32
54
  //# sourceMappingURL=health.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/types/health.ts"],"names":[],"mappings":"AACA,KAAK,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAGzC,KAAK,aAAa,GAAG;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAA;AAGD,KAAK,YAAY,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACzC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAA;AAED,KAAK,gBAAgB,GAAG;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,KAAK,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;QAC5B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;KACtB,CAAC,CAAC;CAEJ,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,CAAA;AAED,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC"}
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/types/health.ts"],"names":[],"mappings":"AACA,KAAK,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAGzC,KAAK,aAAa,GAAG;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAA;AAGD,KAAK,YAAY,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACzC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAA;AAED,KAAK,gBAAgB,GAAG;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,KAAK,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;QAC5B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;KACtB,CAAC,CAAC;CAEJ,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,KAAK,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB,CAAA;AAED,KAAK,cAAc,GAAG;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACxE,UAAU,EAAE,OAAO,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf,CAAA;AAED,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "projectpulse-mcp",
3
3
  "description": "MCP Server for GitHub repository health monitoring",
4
- "version": "1.6.13",
4
+ "version": "1.7.0",
5
5
  "mcpName": "io.github.alexbypa/github-projectpulse-mcp",
6
6
  "main": "dist/index.js",
7
7
  "scripts": {