@hvgllc/hvgerp-mcp 3.6.0 → 3.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.
Files changed (2) hide show
  1. package/hvgerp-mcp.mjs +38 -2
  2. package/package.json +1 -1
package/hvgerp-mcp.mjs CHANGED
@@ -50691,6 +50691,27 @@ function endFollowsStart(start, end, allDay) {
50691
50691
  function isNullableOf(value, check) {
50692
50692
  return value === null || typeof value === "string" && check(value);
50693
50693
  }
50694
+ var MEETING_TITLE_MAX_CODE_POINTS = 500;
50695
+ var MEETING_URL_MAX_LENGTH = 2048;
50696
+ var VISIBLE_CHARACTER = /(?![\p{Default_Ignorable_Code_Point}⠀])[\p{L}\p{N}\p{P}\p{S}]/u;
50697
+ var URL_HIDDEN_CHARACTER = /[\s\p{Cc}\p{Cf}]/u;
50698
+ function isMeetingTitle(value) {
50699
+ return VISIBLE_CHARACTER.test(value) && codePointLength2(value) <= MEETING_TITLE_MAX_CODE_POINTS;
50700
+ }
50701
+ function canonicalMeetingUrl(value) {
50702
+ if (value.length > MEETING_URL_MAX_LENGTH * 2) return void 0;
50703
+ if (codePointLength2(value) > MEETING_URL_MAX_LENGTH) return void 0;
50704
+ if (URL_HIDDEN_CHARACTER.test(value)) return void 0;
50705
+ let parsed;
50706
+ try {
50707
+ parsed = new URL(value);
50708
+ } catch {
50709
+ return void 0;
50710
+ }
50711
+ const valid = parsed.protocol === "https:" && parsed.hostname !== "" && parsed.username === "" && parsed.password === "";
50712
+ if (!valid) return void 0;
50713
+ return parsed.href.length <= MEETING_URL_MAX_LENGTH ? parsed.href : null;
50714
+ }
50694
50715
  function validateRecurrence(recurrence, firstDate) {
50695
50716
  const picked = pickKeys(recurrence, RECURRENCE_KEYS);
50696
50717
  assertShape(
@@ -50867,6 +50888,21 @@ function pickMeetingFields(result, args) {
50867
50888
  assertShape(typeof picked[key] === "string" && picked[key] !== "");
50868
50889
  }
50869
50890
  for (const key of forbidden) assertShape(picked[key] == null);
50891
+ if (Object.hasOwn(result, "title")) {
50892
+ assertShape(isNullableOf(result.title, isMeetingTitle));
50893
+ picked.title = result.title;
50894
+ }
50895
+ if (Object.hasOwn(result, "meeting_url")) {
50896
+ const raw2 = result.meeting_url;
50897
+ if (raw2 === null) {
50898
+ picked.meeting_url = null;
50899
+ } else {
50900
+ assertShape(typeof raw2 === "string");
50901
+ const url = canonicalMeetingUrl(raw2);
50902
+ assertShape(url !== void 0);
50903
+ picked.meeting_url = url;
50904
+ }
50905
+ }
50870
50906
  const [startKey, endKey] = picked.all_day ? ["start_date", "end_date_exclusive"] : ["starts_at", "ends_at"];
50871
50907
  if (typeof picked[endKey] === "string") {
50872
50908
  assertShape(
@@ -50981,7 +51017,7 @@ function readTemporal(input, key) {
50981
51017
  var calendarTools = [
50982
51018
  {
50983
51019
  name: "erpnext_meeting_get",
50984
- description: "Freshly read one calendar meeting from ERPNext (schedule, recurrence and occurrences in a window). Use it after a meeting event to fetch the current state. Returns no title, description, participants or links. A deleted meeting returns only event_id, revision and deleted=true. Always reads live data; results are never cached.",
51020
+ description: "Freshly read one calendar meeting from ERPNext: schedule, recurrence and occurrences in a window, plus the title and meeting link (meeting_url) when ERPNext provides them; either may be null or absent. Use it after a meeting event to fetch the current state. Name the meeting only from a non-null title and share a link only from a non-null meeting_url; never invent either. Returns no description or participants. A deleted meeting returns only event_id, revision and deleted=true. Always reads live data; results are never cached.",
50985
51021
  category: "operations",
50986
51022
  inputSchema: {
50987
51023
  type: "object",
@@ -55910,7 +55946,7 @@ function installClaudeCodeStdioCompat(cacheHints) {
55910
55946
  }
55911
55947
 
55912
55948
  // src/version.ts
55913
- var SERVER_VERSION = "3.6.0";
55949
+ var SERVER_VERSION = "3.7.0";
55914
55950
 
55915
55951
  // src/instructions.ts
55916
55952
  var HEADER_OPENING = `This server exposes a live ERPNext/Frappe instance (HVG Group).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hvgllc/hvgerp-mcp",
3
- "version": "3.6.0",
3
+ "version": "3.7.0",
4
4
  "description": "MCP server for ERPNext with interactive UI viewers",
5
5
  "type": "module",
6
6
  "bin": {