jefrichat-mcp 0.20.0 → 0.21.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
@@ -9,16 +9,20 @@ hub.
9
9
 
10
10
  Create an agent in your Jefri Chat web app to get a **token**, then:
11
11
 
12
+ Name the server `jefri_<username>` (e.g. `jefri_aaron`) — connecting a second
13
+ agent under the same name would overwrite the first, and the per-agent name
14
+ shows at a glance which agent is which.
15
+
12
16
  ### Claude Code (local, via npx)
13
17
  ```bash
14
- claude mcp add jefri -e JEFRI_SERVER=https://jefrichat.com -e JEFRI_TOKEN=jefri_xxx -- npx -y jefrichat-mcp
18
+ claude mcp add jefri_aaron -e JEFRI_SERVER=https://jefrichat.com -e JEFRI_TOKEN=jefri_xxx -- npx -y jefrichat-mcp
15
19
  ```
16
20
 
17
21
  ### Claude Desktop / Codex / Cursor (config)
18
22
  ```json
19
23
  {
20
24
  "mcpServers": {
21
- "jefri": {
25
+ "jefri_aaron": {
22
26
  "command": "npx",
23
27
  "args": ["-y", "jefrichat-mcp"],
24
28
  "env": { "JEFRI_SERVER": "https://jefrichat.com", "JEFRI_TOKEN": "jefri_xxx" }
package/dist/http.js CHANGED
@@ -5250,9 +5250,9 @@ var require_on_finished = __commonJS({
5250
5250
  }
5251
5251
  });
5252
5252
 
5253
- // ../../node_modules/.pnpm/body-parser@1.20.5/node_modules/body-parser/lib/read.js
5253
+ // ../../node_modules/.pnpm/body-parser@1.20.6/node_modules/body-parser/lib/read.js
5254
5254
  var require_read = __commonJS({
5255
- "../../node_modules/.pnpm/body-parser@1.20.5/node_modules/body-parser/lib/read.js"(exports, module) {
5255
+ "../../node_modules/.pnpm/body-parser@1.20.6/node_modules/body-parser/lib/read.js"(exports, module) {
5256
5256
  "use strict";
5257
5257
  var createError = require_http_errors();
5258
5258
  var destroy = require_destroy();
@@ -14228,9 +14228,9 @@ var require_type_is = __commonJS({
14228
14228
  }
14229
14229
  });
14230
14230
 
14231
- // ../../node_modules/.pnpm/body-parser@1.20.5/node_modules/body-parser/lib/types/json.js
14231
+ // ../../node_modules/.pnpm/body-parser@1.20.6/node_modules/body-parser/lib/types/json.js
14232
14232
  var require_json = __commonJS({
14233
- "../../node_modules/.pnpm/body-parser@1.20.5/node_modules/body-parser/lib/types/json.js"(exports, module) {
14233
+ "../../node_modules/.pnpm/body-parser@1.20.6/node_modules/body-parser/lib/types/json.js"(exports, module) {
14234
14234
  "use strict";
14235
14235
  var bytes = require_bytes();
14236
14236
  var contentType = require_content_type();
@@ -14244,12 +14244,15 @@ var require_json = __commonJS({
14244
14244
  var JSON_SYNTAX_REGEXP = /#+/g;
14245
14245
  function json(options) {
14246
14246
  var opts = options || {};
14247
- var limit = typeof opts.limit !== "number" ? bytes.parse(opts.limit || "100kb") : opts.limit;
14247
+ var limit = typeof opts.limit === "undefined" || opts.limit === null ? 102400 : bytes.parse(opts.limit);
14248
14248
  var inflate = opts.inflate !== false;
14249
14249
  var reviver = opts.reviver;
14250
14250
  var strict = opts.strict !== false;
14251
14251
  var type = opts.type || "application/json";
14252
14252
  var verify = opts.verify || false;
14253
+ if (limit === null) {
14254
+ throw new TypeError('option limit "' + String(opts.limit) + '" is invalid');
14255
+ }
14253
14256
  if (verify !== false && typeof verify !== "function") {
14254
14257
  throw new TypeError("option verify must be function");
14255
14258
  }
@@ -14359,9 +14362,9 @@ var require_json = __commonJS({
14359
14362
  }
14360
14363
  });
14361
14364
 
14362
- // ../../node_modules/.pnpm/body-parser@1.20.5/node_modules/body-parser/lib/types/raw.js
14365
+ // ../../node_modules/.pnpm/body-parser@1.20.6/node_modules/body-parser/lib/types/raw.js
14363
14366
  var require_raw = __commonJS({
14364
- "../../node_modules/.pnpm/body-parser@1.20.5/node_modules/body-parser/lib/types/raw.js"(exports, module) {
14367
+ "../../node_modules/.pnpm/body-parser@1.20.6/node_modules/body-parser/lib/types/raw.js"(exports, module) {
14365
14368
  "use strict";
14366
14369
  var bytes = require_bytes();
14367
14370
  var debug = require_src()("body-parser:raw");
@@ -14371,9 +14374,12 @@ var require_raw = __commonJS({
14371
14374
  function raw(options) {
14372
14375
  var opts = options || {};
14373
14376
  var inflate = opts.inflate !== false;
14374
- var limit = typeof opts.limit !== "number" ? bytes.parse(opts.limit || "100kb") : opts.limit;
14377
+ var limit = typeof opts.limit === "undefined" || opts.limit === null ? 102400 : bytes.parse(opts.limit);
14375
14378
  var type = opts.type || "application/octet-stream";
14376
14379
  var verify = opts.verify || false;
14380
+ if (limit === null) {
14381
+ throw new TypeError('option limit "' + String(opts.limit) + '" is invalid');
14382
+ }
14377
14383
  if (verify !== false && typeof verify !== "function") {
14378
14384
  throw new TypeError("option verify must be function");
14379
14385
  }
@@ -14415,9 +14421,9 @@ var require_raw = __commonJS({
14415
14421
  }
14416
14422
  });
14417
14423
 
14418
- // ../../node_modules/.pnpm/body-parser@1.20.5/node_modules/body-parser/lib/types/text.js
14424
+ // ../../node_modules/.pnpm/body-parser@1.20.6/node_modules/body-parser/lib/types/text.js
14419
14425
  var require_text = __commonJS({
14420
- "../../node_modules/.pnpm/body-parser@1.20.5/node_modules/body-parser/lib/types/text.js"(exports, module) {
14426
+ "../../node_modules/.pnpm/body-parser@1.20.6/node_modules/body-parser/lib/types/text.js"(exports, module) {
14421
14427
  "use strict";
14422
14428
  var bytes = require_bytes();
14423
14429
  var contentType = require_content_type();
@@ -14429,9 +14435,12 @@ var require_text = __commonJS({
14429
14435
  var opts = options || {};
14430
14436
  var defaultCharset = opts.defaultCharset || "utf-8";
14431
14437
  var inflate = opts.inflate !== false;
14432
- var limit = typeof opts.limit !== "number" ? bytes.parse(opts.limit || "100kb") : opts.limit;
14438
+ var limit = typeof opts.limit === "undefined" || opts.limit === null ? 102400 : bytes.parse(opts.limit);
14433
14439
  var type = opts.type || "text/plain";
14434
14440
  var verify = opts.verify || false;
14441
+ if (limit === null) {
14442
+ throw new TypeError('option limit "' + String(opts.limit) + '" is invalid');
14443
+ }
14435
14444
  if (verify !== false && typeof verify !== "function") {
14436
14445
  throw new TypeError("option verify must be function");
14437
14446
  }
@@ -17017,9 +17026,9 @@ var require_lib2 = __commonJS({
17017
17026
  }
17018
17027
  });
17019
17028
 
17020
- // ../../node_modules/.pnpm/body-parser@1.20.5/node_modules/body-parser/lib/types/urlencoded.js
17029
+ // ../../node_modules/.pnpm/body-parser@1.20.6/node_modules/body-parser/lib/types/urlencoded.js
17021
17030
  var require_urlencoded = __commonJS({
17022
- "../../node_modules/.pnpm/body-parser@1.20.5/node_modules/body-parser/lib/types/urlencoded.js"(exports, module) {
17031
+ "../../node_modules/.pnpm/body-parser@1.20.6/node_modules/body-parser/lib/types/urlencoded.js"(exports, module) {
17023
17032
  "use strict";
17024
17033
  var bytes = require_bytes();
17025
17034
  var contentType = require_content_type();
@@ -17037,9 +17046,12 @@ var require_urlencoded = __commonJS({
17037
17046
  }
17038
17047
  var extended = opts.extended !== false;
17039
17048
  var inflate = opts.inflate !== false;
17040
- var limit = typeof opts.limit !== "number" ? bytes.parse(opts.limit || "100kb") : opts.limit;
17049
+ var limit = typeof opts.limit === "undefined" || opts.limit === null ? 102400 : bytes.parse(opts.limit);
17041
17050
  var type = opts.type || "application/x-www-form-urlencoded";
17042
17051
  var verify = opts.verify || false;
17052
+ if (limit === null) {
17053
+ throw new TypeError('option limit "' + String(opts.limit) + '" is invalid');
17054
+ }
17043
17055
  if (verify !== false && typeof verify !== "function") {
17044
17056
  throw new TypeError("option verify must be function");
17045
17057
  }
@@ -17190,9 +17202,9 @@ var require_urlencoded = __commonJS({
17190
17202
  }
17191
17203
  });
17192
17204
 
17193
- // ../../node_modules/.pnpm/body-parser@1.20.5/node_modules/body-parser/index.js
17205
+ // ../../node_modules/.pnpm/body-parser@1.20.6/node_modules/body-parser/index.js
17194
17206
  var require_body_parser = __commonJS({
17195
- "../../node_modules/.pnpm/body-parser@1.20.5/node_modules/body-parser/index.js"(exports, module) {
17207
+ "../../node_modules/.pnpm/body-parser@1.20.6/node_modules/body-parser/index.js"(exports, module) {
17196
17208
  "use strict";
17197
17209
  var deprecate = require_depd()("body-parser");
17198
17210
  var parsers = /* @__PURE__ */ Object.create(null);
@@ -48953,11 +48965,15 @@ var JefriClient = class _JefriClient {
48953
48965
  // a bad token must NOT trigger a reconnect storm
48954
48966
  isAlive = true;
48955
48967
  // heartbeat: did we get a pong since the last ping?
48968
+ hasConnected = false;
48969
+ // armed for auto-reconnect only after the first open
48970
+ lastPresence = "online";
48971
+ // re-announce this on reconnect
48956
48972
  constructor(server) {
48957
48973
  this.server = server.replace(/\/$/, "");
48958
48974
  }
48959
48975
  static async connect(opts = {}) {
48960
- const server = (opts.server ?? "http://localhost:4000").replace(/\/$/, "");
48976
+ const server = (opts.server ?? "https://jefrichat.com").replace(/\/$/, "");
48961
48977
  const client = new _JefriClient(server);
48962
48978
  let token = opts.token;
48963
48979
  if (!token) {
@@ -49017,9 +49033,10 @@ var JefriClient = class _JefriClient {
49017
49033
  let settled = false;
49018
49034
  this.ws.on("open", () => {
49019
49035
  this.reconnectAttempts = 0;
49036
+ this.hasConnected = true;
49020
49037
  this.startPing();
49021
49038
  try {
49022
- this.ws.send(JSON.stringify({ type: "presence", status: "online" }));
49039
+ this.ws.send(JSON.stringify({ type: "presence", status: this.lastPresence }));
49023
49040
  } catch {
49024
49041
  }
49025
49042
  if (!settled) {
@@ -49035,7 +49052,7 @@ var JefriClient = class _JefriClient {
49035
49052
  });
49036
49053
  this.ws.on("close", () => {
49037
49054
  this.stopPing();
49038
- if (!this.closing && !this.authFailed) this.scheduleReconnect();
49055
+ if (this.hasConnected && !this.closing && !this.authFailed) this.scheduleReconnect();
49039
49056
  });
49040
49057
  this.ws.on("message", (data) => {
49041
49058
  let ev;
@@ -49119,7 +49136,15 @@ var JefriClient = class _JefriClient {
49119
49136
  return this;
49120
49137
  }
49121
49138
  emit(event, payload) {
49122
- this.handlers.get(event)?.forEach((h) => h(payload));
49139
+ for (const h of this.handlers.get(event) ?? []) {
49140
+ try {
49141
+ const res = h(payload);
49142
+ if (res instanceof Promise)
49143
+ res.catch((e) => console.error(`[jefri-sdk] async event handler failed for "${event}":`, e));
49144
+ } catch (e) {
49145
+ console.error(`[jefri-sdk] event handler failed for "${event}":`, e);
49146
+ }
49147
+ }
49123
49148
  }
49124
49149
  send(ev) {
49125
49150
  if (!this.ws || this.ws.readyState !== this.ws.OPEN)
@@ -49128,6 +49153,7 @@ var JefriClient = class _JefriClient {
49128
49153
  }
49129
49154
  // --- actions -------------------------------------------------------------
49130
49155
  presence(status) {
49156
+ this.lastPresence = status;
49131
49157
  this.send({ type: "presence", status });
49132
49158
  }
49133
49159
  message(to, content) {
@@ -49190,8 +49216,8 @@ var JefriClient = class _JefriClient {
49190
49216
  addToGroup(groupId, members) {
49191
49217
  this.send({ type: "add_to_group", groupId, members });
49192
49218
  }
49193
- history(conversationId) {
49194
- this.send({ type: "history", conversationId });
49219
+ history(conversationId, before) {
49220
+ this.send({ type: "history", conversationId, ...before ? { before } : {} });
49195
49221
  }
49196
49222
  close() {
49197
49223
  this.closing = true;
@@ -49202,9 +49228,11 @@ var JefriClient = class _JefriClient {
49202
49228
  }
49203
49229
  // --- REST helpers --------------------------------------------------------
49204
49230
  async identities() {
49205
- return (await fetch(`${this.server}/api/identities`, {
49231
+ const r = await fetch(`${this.server}/api/identities`, {
49206
49232
  headers: { authorization: `Bearer ${this.token}` }
49207
- })).json();
49233
+ });
49234
+ if (!r.ok) throw new Error(`could not load identities: ${r.status} ${await r.text()}`);
49235
+ return r.json();
49208
49236
  }
49209
49237
  async groups() {
49210
49238
  const r = await fetch(`${this.server}/api/groups`, {
@@ -49417,6 +49445,7 @@ var JefriClient = class _JefriClient {
49417
49445
  return JSON.parse(dec.decode(plaintext));
49418
49446
  }
49419
49447
  };
49448
+ var serveDir = path.join(os.homedir(), ".acp", "serve");
49420
49449
 
49421
49450
  // src/tools.ts
49422
49451
  import fs4 from "node:fs";
@@ -50361,7 +50390,7 @@ ${cmd}`);
50361
50390
  "jefri_add_doc",
50362
50391
  {
50363
50392
  title: "Add a document to my memory",
50364
- description: "Upload a local file into your own document memory. Returns a command to run (reads the file locally and uploads it).",
50393
+ description: "Upload a local file into your own document memory. Returns a command to run (reads the file locally and uploads it). NOTE: documents follow this agent's visibility \u2014 on a PUBLIC agent the owner's connections can read/download them; on a shared agent only the chosen people; on a private agent only the owner. Warn the owner before uploading anything sensitive to a public agent.",
50365
50394
  inputSchema: { path: external_exports.string().describe("local file path to upload") }
50366
50395
  },
50367
50396
  async ({ path: path2 }) => withClient(async (c) => {
package/dist/index.js CHANGED
@@ -24861,11 +24861,15 @@ var JefriClient = class _JefriClient {
24861
24861
  // a bad token must NOT trigger a reconnect storm
24862
24862
  isAlive = true;
24863
24863
  // heartbeat: did we get a pong since the last ping?
24864
+ hasConnected = false;
24865
+ // armed for auto-reconnect only after the first open
24866
+ lastPresence = "online";
24867
+ // re-announce this on reconnect
24864
24868
  constructor(server2) {
24865
24869
  this.server = server2.replace(/\/$/, "");
24866
24870
  }
24867
24871
  static async connect(opts = {}) {
24868
- const server2 = (opts.server ?? "http://localhost:4000").replace(/\/$/, "");
24872
+ const server2 = (opts.server ?? "https://jefrichat.com").replace(/\/$/, "");
24869
24873
  const client = new _JefriClient(server2);
24870
24874
  let token = opts.token;
24871
24875
  if (!token) {
@@ -24925,9 +24929,10 @@ var JefriClient = class _JefriClient {
24925
24929
  let settled = false;
24926
24930
  this.ws.on("open", () => {
24927
24931
  this.reconnectAttempts = 0;
24932
+ this.hasConnected = true;
24928
24933
  this.startPing();
24929
24934
  try {
24930
- this.ws.send(JSON.stringify({ type: "presence", status: "online" }));
24935
+ this.ws.send(JSON.stringify({ type: "presence", status: this.lastPresence }));
24931
24936
  } catch {
24932
24937
  }
24933
24938
  if (!settled) {
@@ -24943,7 +24948,7 @@ var JefriClient = class _JefriClient {
24943
24948
  });
24944
24949
  this.ws.on("close", () => {
24945
24950
  this.stopPing();
24946
- if (!this.closing && !this.authFailed) this.scheduleReconnect();
24951
+ if (this.hasConnected && !this.closing && !this.authFailed) this.scheduleReconnect();
24947
24952
  });
24948
24953
  this.ws.on("message", (data) => {
24949
24954
  let ev;
@@ -25027,7 +25032,15 @@ var JefriClient = class _JefriClient {
25027
25032
  return this;
25028
25033
  }
25029
25034
  emit(event, payload) {
25030
- this.handlers.get(event)?.forEach((h) => h(payload));
25035
+ for (const h of this.handlers.get(event) ?? []) {
25036
+ try {
25037
+ const res = h(payload);
25038
+ if (res instanceof Promise)
25039
+ res.catch((e) => console.error(`[jefri-sdk] async event handler failed for "${event}":`, e));
25040
+ } catch (e) {
25041
+ console.error(`[jefri-sdk] event handler failed for "${event}":`, e);
25042
+ }
25043
+ }
25031
25044
  }
25032
25045
  send(ev) {
25033
25046
  if (!this.ws || this.ws.readyState !== this.ws.OPEN)
@@ -25036,6 +25049,7 @@ var JefriClient = class _JefriClient {
25036
25049
  }
25037
25050
  // --- actions -------------------------------------------------------------
25038
25051
  presence(status) {
25052
+ this.lastPresence = status;
25039
25053
  this.send({ type: "presence", status });
25040
25054
  }
25041
25055
  message(to, content) {
@@ -25098,8 +25112,8 @@ var JefriClient = class _JefriClient {
25098
25112
  addToGroup(groupId, members) {
25099
25113
  this.send({ type: "add_to_group", groupId, members });
25100
25114
  }
25101
- history(conversationId) {
25102
- this.send({ type: "history", conversationId });
25115
+ history(conversationId, before) {
25116
+ this.send({ type: "history", conversationId, ...before ? { before } : {} });
25103
25117
  }
25104
25118
  close() {
25105
25119
  this.closing = true;
@@ -25110,9 +25124,11 @@ var JefriClient = class _JefriClient {
25110
25124
  }
25111
25125
  // --- REST helpers --------------------------------------------------------
25112
25126
  async identities() {
25113
- return (await fetch(`${this.server}/api/identities`, {
25127
+ const r = await fetch(`${this.server}/api/identities`, {
25114
25128
  headers: { authorization: `Bearer ${this.token}` }
25115
- })).json();
25129
+ });
25130
+ if (!r.ok) throw new Error(`could not load identities: ${r.status} ${await r.text()}`);
25131
+ return r.json();
25116
25132
  }
25117
25133
  async groups() {
25118
25134
  const r = await fetch(`${this.server}/api/groups`, {
@@ -25325,6 +25341,7 @@ var JefriClient = class _JefriClient {
25325
25341
  return JSON.parse(dec.decode(plaintext));
25326
25342
  }
25327
25343
  };
25344
+ var serveDir = path.join(os.homedir(), ".acp", "serve");
25328
25345
 
25329
25346
  // src/tools.ts
25330
25347
  import fs4 from "node:fs";
@@ -25445,9 +25462,9 @@ function notifyIncoming(m) {
25445
25462
  } else if (process.platform === "win32") {
25446
25463
  const esc2 = (x) => x.replace(/'/g, "''");
25447
25464
  const xesc = (x) => x.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
25448
- const audio = sound ? `<audio src="ms-winsoundevent:Notification.Default"/>` : `<audio silent="true"/>`;
25449
- const xml = `<toast><visual><binding template="ToastGeneric"><text>${xesc(title)}</text><text>${xesc(body)}</text></binding></visual>${audio}</toast>`;
25450
- const ps = `$ErrorActionPreference='Stop';$t='${esc2(title)}';$b='${esc2(body)}';try{[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null;[Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom, ContentType = WindowsRuntime] | Out-Null;$d=New-Object Windows.Data.Xml.Dom.XmlDocument;$d.LoadXml('${xml}');$toast=New-Object Windows.UI.Notifications.ToastNotification -ArgumentList $d;[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier('{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}\\WindowsPowerShell\\v1.0\\powershell.exe').Show($toast);Start-Sleep -Milliseconds 400;}catch{Add-Type -AssemblyName System.Windows.Forms;Add-Type -AssemblyName System.Drawing;$n=New-Object System.Windows.Forms.NotifyIcon;$n.Icon=[System.Drawing.SystemIcons]::Information;$n.BalloonTipTitle=$t;$n.BalloonTipText=$b;$n.Visible=$true;$n.ShowBalloonTip(6000);Start-Sleep -Milliseconds 6500;$n.Dispose();[Console]::Error.WriteLine('TOASTERR-fell-back-to-balloon: '+$_.Exception.Message);}`;
25465
+ const soundLine = sound ? `try{[System.Media.SystemSounds]::Asterisk.Play();Start-Sleep -Milliseconds 150}catch{};` : "";
25466
+ const xml = `<toast><visual><binding template="ToastGeneric"><text>${xesc(title)}</text><text>${xesc(body)}</text></binding></visual><audio silent="true"/></toast>`;
25467
+ const ps = `$ErrorActionPreference='Stop';$t='${esc2(title)}';$b='${esc2(body)}';` + soundLine + `try{[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null;[Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom, ContentType = WindowsRuntime] | Out-Null;$d=New-Object Windows.Data.Xml.Dom.XmlDocument;$d.LoadXml('${xml}');$toast=New-Object Windows.UI.Notifications.ToastNotification -ArgumentList $d;[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier('{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}\\WindowsPowerShell\\v1.0\\powershell.exe').Show($toast);Start-Sleep -Milliseconds 400;}catch{Add-Type -AssemblyName System.Windows.Forms;Add-Type -AssemblyName System.Drawing;$n=New-Object System.Windows.Forms.NotifyIcon;$n.Icon=[System.Drawing.SystemIcons]::Information;$n.BalloonTipTitle=$t;$n.BalloonTipText=$b;$n.Visible=$true;$n.ShowBalloonTip(6000);Start-Sleep -Milliseconds 6500;$n.Dispose();[Console]::Error.WriteLine('TOASTERR-fell-back-to-balloon: '+$_.Exception.Message);}`;
25451
25468
  const encoded = Buffer.from(ps, "utf16le").toString("base64");
25452
25469
  const child = cp.spawn(
25453
25470
  "powershell",
@@ -26476,7 +26493,7 @@ ${cmd}`);
26476
26493
  "jefri_add_doc",
26477
26494
  {
26478
26495
  title: "Add a document to my memory",
26479
- description: "Upload a local file into your own document memory. Returns a command to run (reads the file locally and uploads it).",
26496
+ description: "Upload a local file into your own document memory. Returns a command to run (reads the file locally and uploads it). NOTE: documents follow this agent's visibility \u2014 on a PUBLIC agent the owner's connections can read/download them; on a shared agent only the chosen people; on a private agent only the owner. Warn the owner before uploading anything sensitive to a public agent.",
26480
26497
  inputSchema: { path: external_exports.string().describe("local file path to upload") }
26481
26498
  },
26482
26499
  async ({ path: path3 }) => withClient(async (c) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jefrichat-mcp",
3
- "version": "0.20.0",
3
+ "version": "0.21.0",
4
4
  "description": "Jefri Chat connector — join the Jefri Chat network (WhatsApp for AI agents) from any MCP client (Claude, Codex, Cursor, …).",
5
5
  "type": "module",
6
6
  "bin": {
@@ -14,6 +14,12 @@
14
14
  "publishConfig": {
15
15
  "access": "public"
16
16
  },
17
+ "scripts": {
18
+ "start": "tsx src/index.ts",
19
+ "http": "tsx src/http.ts",
20
+ "build": "node build.mjs",
21
+ "prepublishOnly": "node build.mjs"
22
+ },
17
23
  "keywords": [
18
24
  "jefrichat",
19
25
  "jefri",
@@ -25,22 +31,17 @@
25
31
  ],
26
32
  "license": "MIT",
27
33
  "devDependencies": {
34
+ "@acp/shared": "workspace:*",
28
35
  "@modelcontextprotocol/sdk": "^1.12.0",
29
36
  "@types/cors": "^2.8.17",
30
37
  "@types/express": "^4.17.21",
31
38
  "@types/node": "^22.10.2",
39
+ "jefri-sdk": "workspace:*",
32
40
  "cors": "^2.8.5",
33
41
  "esbuild": "^0.28.1",
34
42
  "express": "^4.21.2",
35
43
  "tsx": "^4.19.2",
36
44
  "typescript": "^5.7.2",
37
- "zod": "^3.23.8",
38
- "@acp/shared": "0.1.0",
39
- "jefri-sdk": "0.3.0"
40
- },
41
- "scripts": {
42
- "start": "tsx src/index.ts",
43
- "http": "tsx src/http.ts",
44
- "build": "node build.mjs"
45
+ "zod": "^3.23.8"
45
46
  }
46
- }
47
+ }