@utilix-tech/mcp 0.51.0 → 0.52.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 CHANGED
@@ -2,6 +2,9 @@
2
2
 
3
3
  Full release notes for all Utilix surfaces (browser tools, REST API, SDKs, MCP server) live at [utilix.tech/changelog](https://utilix.tech/changelog). This file tracks just this package.
4
4
 
5
+ ## 0.52.0
6
+ - Add `calculate_gpa` tool: compute a weighted GPA from a list of courses, each with a letter grade and credit hours, using the standard 4.0-capped scale.
7
+
5
8
  ## 0.51.0
6
9
  - Add `calculate_moving_averages` tool: compute SMA and EMA series from a list of numbers and a window size.
7
10
  - Add `calculate_markdown_task_list_progress` tool: parse a Markdown document's checkbox task list and report completion percentage overall and per section.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @utilix-tech/mcp
2
2
 
3
- MCP server exposing 191 developer utility tools to Claude, Cursor, VS Code Copilot, and any [Model Context Protocol](https://modelcontextprotocol.io) compatible AI assistant.
3
+ MCP server exposing 192 developer utility tools to Claude, Cursor, VS Code Copilot, and any [Model Context Protocol](https://modelcontextprotocol.io) compatible AI assistant.
4
4
 
5
5
  No API key required. All tools run locally. Requires Node.js 18 or later.
6
6
 
@@ -160,7 +160,7 @@ claude mcp add utilix -- npx -y @utilix-tech/mcp
160
160
  | `convert_timezone` | Convert a date/time between timezones |
161
161
  | `convert_iso8601_duration` | Parse an ISO 8601 duration into components and total seconds, or format seconds into a duration string |
162
162
 
163
- ### Units (31 tools)
163
+ ### Units (32 tools)
164
164
  | Tool | Description |
165
165
  |------|-------------|
166
166
  | `convert_bytes` | Convert between B, KB, MB, GB, TB, KiB, MiB, GiB, TiB |
@@ -194,6 +194,7 @@ claude mcp add utilix -- npx -y @utilix-tech/mcp
194
194
  | `calculate_depreciation_schedule` | Build a year-by-year fixed-asset depreciation schedule from cost, salvage value, and useful life, using straight-line, double-declining-balance, or sum-of-years-digits |
195
195
  | `calculate_cash_rounding` | Round a cashless total to the nearest payable cash denomination ("Swedish rounding"), with round-nearest, round-up, and round-down modes |
196
196
  | `calculate_moving_averages` | Compute simple moving average (SMA) and exponential moving average (EMA) series from a list of numbers and a window size |
197
+ | `calculate_gpa` | Compute a weighted GPA from a list of courses, each with a letter grade and credit hours, using the standard 4.0-capped scale |
197
198
 
198
199
  ### API / Network (28 tools)
199
200
  | Tool | Description |
package/dist/index.js CHANGED
@@ -8440,5 +8440,71 @@ server.tool(
8440
8440
  return text(JSON.stringify(result, null, 2));
8441
8441
  }
8442
8442
  );
8443
+ var GPA_GRADE_POINTS_MCP = {
8444
+ "A+": 4,
8445
+ A: 4,
8446
+ "A-": 3.7,
8447
+ "B+": 3.3,
8448
+ B: 3,
8449
+ "B-": 2.7,
8450
+ "C+": 2.3,
8451
+ C: 2,
8452
+ "C-": 1.7,
8453
+ "D+": 1.3,
8454
+ D: 1,
8455
+ "D-": 0.7,
8456
+ F: 0
8457
+ };
8458
+ function _calculateGpaMcp(courses) {
8459
+ if (!Array.isArray(courses) || courses.length === 0) {
8460
+ return { error: "courses must be a non-empty array" };
8461
+ }
8462
+ const round2 = (n) => Math.round(n * 100) / 100;
8463
+ let totalCredits = 0;
8464
+ let totalQualityPoints = 0;
8465
+ const results = [];
8466
+ for (let i = 0; i < courses.length; i++) {
8467
+ const course = courses[i];
8468
+ if (typeof course.credits !== "number" || !Number.isFinite(course.credits) || course.credits <= 0) {
8469
+ return { error: `course ${i + 1}: credits must be a finite number greater than zero` };
8470
+ }
8471
+ const gradeKey = typeof course.grade === "string" ? course.grade.trim().toUpperCase() : "";
8472
+ const points = GPA_GRADE_POINTS_MCP[gradeKey];
8473
+ if (points === void 0) {
8474
+ return { error: `course ${i + 1}: unrecognized grade "${course.grade}" (expected one of ${Object.keys(GPA_GRADE_POINTS_MCP).join(", ")})` };
8475
+ }
8476
+ const qualityPoints = round2(points * course.credits);
8477
+ totalCredits += course.credits;
8478
+ totalQualityPoints += qualityPoints;
8479
+ results.push({
8480
+ name: course.name?.trim() || `Course ${i + 1}`,
8481
+ grade: gradeKey,
8482
+ credits: course.credits,
8483
+ qualityPoints
8484
+ });
8485
+ }
8486
+ return {
8487
+ courses: results,
8488
+ totalCredits: round2(totalCredits),
8489
+ totalQualityPoints: round2(totalQualityPoints),
8490
+ gpa: round2(totalQualityPoints / totalCredits)
8491
+ };
8492
+ }
8493
+ server.tool(
8494
+ "calculate_gpa",
8495
+ "Compute a weighted GPA from a list of courses, each with a letter grade and credit hours, using the standard 4.0-capped scale (A+ counts the same as A).",
8496
+ {
8497
+ courses: z.array(z.object({
8498
+ name: z.string().optional().describe("Optional course name/label"),
8499
+ grade: z.string().describe('Letter grade, e.g. "A", "B+", "C-"'),
8500
+ credits: z.number().positive().describe("Credit hours for this course, must be greater than zero")
8501
+ })).min(1).describe("A non-empty list of courses to average")
8502
+ },
8503
+ async ({ courses }) => {
8504
+ const result = _calculateGpaMcp(courses);
8505
+ if ("error" in result) return errText(result);
8506
+ return text(JSON.stringify(result, null, 2));
8507
+ }
8508
+ );
8443
8509
  var transport = new StdioServerTransport();
8444
8510
  await server.connect(transport);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@utilix-tech/mcp",
3
- "version": "0.51.0",
3
+ "version": "0.52.0",
4
4
  "description": "MCP server exposing 188 Utilix developer tools to Claude, Cursor, VS Code Copilot, and any MCP-compatible AI assistant.",
5
5
  "author": "Utilix <hello@utilix.tech>",
6
6
  "license": "MIT",