@carbonvoice/cv-mcp-server 1.1.3 → 2.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.
Files changed (54) hide show
  1. package/dist/auth/auth.service.js +79 -0
  2. package/dist/auth/auth.service.js.map +1 -0
  3. package/dist/auth/index.js +15 -0
  4. package/dist/auth/index.js.map +1 -1
  5. package/dist/auth/interfaces/auth.types.js +3 -0
  6. package/dist/auth/interfaces/auth.types.js.map +1 -0
  7. package/dist/auth/interfaces/index.js +1 -0
  8. package/dist/auth/interfaces/index.js.map +1 -1
  9. package/dist/cv-api.js +13 -5
  10. package/dist/cv-api.js.map +1 -1
  11. package/dist/server.js +143 -31
  12. package/dist/server.js.map +1 -1
  13. package/dist/transports/http/interfaces/index.js +3 -0
  14. package/dist/transports/http/interfaces/index.js.map +1 -0
  15. package/dist/transports/http/middleware/add-mcp-session-id.middleware.js +20 -13
  16. package/dist/transports/http/middleware/add-mcp-session-id.middleware.js.map +1 -1
  17. package/dist/transports/http/middleware/add-request-id.middlware.js +13 -4
  18. package/dist/transports/http/middleware/add-request-id.middlware.js.map +1 -1
  19. package/dist/transports/http/middleware/log-request.middlware.js +27 -11
  20. package/dist/transports/http/middleware/log-request.middlware.js.map +1 -1
  21. package/dist/transports/http/session/index.js +34 -0
  22. package/dist/transports/http/session/index.js.map +1 -0
  23. package/dist/transports/http/session/session-cleanup.js +60 -0
  24. package/dist/transports/http/session/session-cleanup.js.map +1 -0
  25. package/dist/transports/http/session/session-manager.js +52 -0
  26. package/dist/transports/http/session/session-manager.js.map +1 -0
  27. package/dist/transports/http/session/session.config.js +29 -0
  28. package/dist/transports/http/session/session.config.js.map +1 -0
  29. package/dist/transports/http/session/session.logger.js +68 -0
  30. package/dist/transports/http/session/session.logger.js.map +1 -0
  31. package/dist/transports/http/session/session.service.js +196 -0
  32. package/dist/transports/http/session/session.service.js.map +1 -0
  33. package/dist/transports/http/session/session.types.js +31 -0
  34. package/dist/transports/http/session/session.types.js.map +1 -0
  35. package/dist/transports/http/streamable.js +184 -427
  36. package/dist/transports/http/streamable.js.map +1 -1
  37. package/dist/transports/http/utils/request-context.js +78 -0
  38. package/dist/transports/http/utils/request-context.js.map +1 -0
  39. package/dist/utils/axios-instance.js +34 -22
  40. package/dist/utils/axios-instance.js.map +1 -1
  41. package/dist/utils/get-process-uptime.js +13 -0
  42. package/dist/utils/get-process-uptime.js.map +1 -0
  43. package/dist/utils/index.js +2 -2
  44. package/dist/utils/index.js.map +1 -1
  45. package/dist/utils/logger.js +34 -11
  46. package/dist/utils/logger.js.map +1 -1
  47. package/dist/utils/{format-time-to-human.js → time-to-human.js} +17 -7
  48. package/dist/utils/time-to-human.js.map +1 -0
  49. package/package.json +1 -1
  50. package/dist/auth/auth-middleware.js +0 -203
  51. package/dist/auth/auth-middleware.js.map +0 -1
  52. package/dist/utils/format-time-to-human.js.map +0 -1
  53. package/dist/utils/format-uptime.js +0 -13
  54. package/dist/utils/format-uptime.js.map +0 -1
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.setCarbonVoiceAuthHeader = exports.createOAuthTokenVerifier = void 0;
7
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
8
+ const errors_js_1 = require("@modelcontextprotocol/sdk/server/auth/errors.js");
9
+ const config_1 = require("../config");
10
+ const utils_1 = require("../utils");
11
+ const createOAuthTokenVerifier = () => ({
12
+ async verifyAccessToken(token) {
13
+ var _a;
14
+ if (!token) {
15
+ throw new errors_js_1.InvalidTokenError('No token provided');
16
+ }
17
+ try {
18
+ const decoded = jsonwebtoken_1.default.decode(token);
19
+ // Basic validation
20
+ if (!decoded) {
21
+ throw new errors_js_1.InvalidTokenError('Invalid token format');
22
+ }
23
+ if (!decoded.sub || !decoded.client_id) {
24
+ throw new errors_js_1.InvalidTokenError('Token missing required claims');
25
+ }
26
+ // Check expiration
27
+ // We don't need, since it's validate in requireBearerAuth middleware
28
+ // if (decoded.exp && decoded.exp < Date.now() / 1000) {
29
+ // throw new InvalidTokenError('Token expired');
30
+ // }
31
+ return {
32
+ token,
33
+ clientId: decoded.client_id,
34
+ scopes: ((_a = decoded.scope) === null || _a === void 0 ? void 0 : _a.split(' ')) || [],
35
+ expiresAt: decoded.exp,
36
+ extra: {
37
+ user: {
38
+ id: decoded.sub,
39
+ },
40
+ },
41
+ };
42
+ }
43
+ catch (error) {
44
+ utils_1.logger.error('Error verifying access token', {
45
+ error: {
46
+ error_message: error.message,
47
+ stack: error.stack,
48
+ },
49
+ token: (0, utils_1.removeLastChars)(token),
50
+ });
51
+ if (error instanceof errors_js_1.InvalidTokenError) {
52
+ throw error;
53
+ }
54
+ throw new errors_js_1.InvalidTokenError('Token verification failed');
55
+ }
56
+ },
57
+ });
58
+ exports.createOAuthTokenVerifier = createOAuthTokenVerifier;
59
+ const setCarbonVoiceAuthHeader = (token) => {
60
+ if (!token && !config_1.env.CARBON_VOICE_API_KEY) {
61
+ throw new utils_1.UnauthorizedException('No Bearer token or API key provided');
62
+ }
63
+ // http-transport
64
+ if (token) {
65
+ return {
66
+ headers: {
67
+ Authorization: `Bearer ${token}`,
68
+ },
69
+ };
70
+ }
71
+ // Default to API key for Stdio transport
72
+ return {
73
+ headers: {
74
+ 'x-api-key': `${config_1.env.CARBON_VOICE_API_KEY}`,
75
+ },
76
+ };
77
+ };
78
+ exports.setCarbonVoiceAuthHeader = setCarbonVoiceAuthHeader;
79
+ //# sourceMappingURL=auth.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../src/auth/auth.service.ts"],"names":[],"mappings":";;;;;;AAAA,gEAA+B;AAE/B,+EAAoF;AAMpF,sCAAgC;AAChC,oCAA0E;AAEnE,MAAM,wBAAwB,GAAG,GAAuB,EAAE,CAAC,CAAC;IACjE,KAAK,CAAC,iBAAiB,CAAC,KAAa;;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,6BAAiB,CAAC,mBAAmB,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,sBAAG,CAAC,MAAM,CAAC,KAAK,CAA+B,CAAC;YAEhE,mBAAmB;YACnB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,6BAAiB,CAAC,sBAAsB,CAAC,CAAC;YACtD,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;gBACvC,MAAM,IAAI,6BAAiB,CAAC,+BAA+B,CAAC,CAAC;YAC/D,CAAC;YAED,mBAAmB;YACnB,qEAAqE;YACrE,wDAAwD;YACxD,kDAAkD;YAClD,IAAI;YAEJ,OAAO;gBACL,KAAK;gBACL,QAAQ,EAAE,OAAO,CAAC,SAAS;gBAC3B,MAAM,EAAE,CAAA,MAAA,OAAO,CAAC,KAAK,0CAAE,KAAK,CAAC,GAAG,CAAC,KAAI,EAAE;gBACvC,SAAS,EAAE,OAAO,CAAC,GAAG;gBACtB,KAAK,EAAE;oBACL,IAAI,EAAE;wBACJ,EAAE,EAAE,OAAO,CAAC,GAAG;qBAChB;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,cAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE;gBAC3C,KAAK,EAAE;oBACL,aAAa,EAAG,KAAe,CAAC,OAAO;oBACvC,KAAK,EAAG,KAAe,CAAC,KAAK;iBAC9B;gBACD,KAAK,EAAE,IAAA,uBAAe,EAAC,KAAK,CAAC;aAC9B,CAAC,CAAC;YAEH,IAAI,KAAK,YAAY,6BAAiB,EAAE,CAAC;gBACvC,MAAM,KAAK,CAAC;YACd,CAAC;YAED,MAAM,IAAI,6BAAiB,CAAC,2BAA2B,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAnDU,QAAA,wBAAwB,4BAmDlC;AAEI,MAAM,wBAAwB,GAAG,CACtC,KAAc,EACuB,EAAE;IACvC,IAAI,CAAC,KAAK,IAAI,CAAC,YAAG,CAAC,oBAAoB,EAAE,CAAC;QACxC,MAAM,IAAI,6BAAqB,CAAC,qCAAqC,CAAC,CAAC;IACzE,CAAC;IAED,iBAAiB;IACjB,IAAI,KAAK,EAAE,CAAC;QACV,OAAO;YACL,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,KAAK,EAAE;aACjC;SACF,CAAC;IACJ,CAAC;IAED,yCAAyC;IACzC,OAAO;QACL,OAAO,EAAE;YACP,WAAW,EAAE,GAAG,YAAG,CAAC,oBAAoB,EAAE;SAC3C;KACF,CAAC;AACJ,CAAC,CAAC;AAtBW,QAAA,wBAAwB,4BAsBnC"}
@@ -1,3 +1,18 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
2
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./auth.service"), exports);
3
18
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=auth.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.types.js","sourceRoot":"","sources":["../../../src/auth/interfaces/auth.types.ts"],"names":[],"mappings":""}
@@ -15,4 +15,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./user.interface"), exports);
18
+ __exportStar(require("./auth.types"), exports);
18
19
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/auth/interfaces/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/auth/interfaces/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAiC;AACjC,+CAA6B"}
package/dist/cv-api.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isCarbonVoiceApiWorking = exports.getCarbonVoiceAPI = void 0;
3
+ exports.getCarbonVoiceApiStatus = exports.getCarbonVoiceAPI = void 0;
4
+ const config_1 = require("./config");
4
5
  const utils_1 = require("./utils");
5
6
  const axios_instance_1 = require("./utils/axios-instance");
6
7
  const getCarbonVoiceAPI = () => {
@@ -11,15 +12,22 @@ const getCarbonVoiceAPI = () => {
11
12
  };
12
13
  };
13
14
  exports.getCarbonVoiceAPI = getCarbonVoiceAPI;
14
- const isCarbonVoiceApiWorking = async () => {
15
+ const getCarbonVoiceApiStatus = async () => {
15
16
  try {
16
17
  const response = await (0, axios_instance_1.mutator)({ url: `/health`, method: 'GET' });
17
- return response.status === 'ok';
18
+ return {
19
+ isHealthy: response.status === 'ok',
20
+ apiUrl: config_1.env.CARBON_VOICE_BASE_URL,
21
+ };
18
22
  }
19
23
  catch (error) {
20
24
  utils_1.logger.error('Error getting backend status:', error);
21
- return false;
25
+ return {
26
+ isHealthy: false,
27
+ apiUrl: config_1.env.CARBON_VOICE_BASE_URL,
28
+ error: error instanceof Error ? error.message : 'UNKNOWN_ERROR',
29
+ };
22
30
  }
23
31
  };
24
- exports.isCarbonVoiceApiWorking = isCarbonVoiceApiWorking;
32
+ exports.getCarbonVoiceApiStatus = getCarbonVoiceApiStatus;
25
33
  //# sourceMappingURL=cv-api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cv-api.js","sourceRoot":"","sources":["../src/cv-api.ts"],"names":[],"mappings":";;;AAEA,mCAAiC;AACjC,2DAAiD;AAE1C,MAAM,iBAAiB,GAAG,GAAG,EAAE;IACpC,OAAO;QACL,SAAS,EAAE,KAAK,EAAE,OAA4B,EAAoB,EAAE;YAClE,OAAO,IAAA,wBAAO,EAAC,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;QAC7D,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AANW,QAAA,iBAAiB,qBAM5B;AAEK,MAAM,uBAAuB,GAAG,KAAK,IAAsB,EAAE;IAClE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,IAAA,wBAAO,EAE3B,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAEtC,OAAO,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,cAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;QACrD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAC;AAXW,QAAA,uBAAuB,2BAWlC"}
1
+ {"version":3,"file":"cv-api.js","sourceRoot":"","sources":["../src/cv-api.ts"],"names":[],"mappings":";;;AAEA,qCAA+B;AAC/B,mCAAiC;AACjC,2DAAiD;AAE1C,MAAM,iBAAiB,GAAG,GAAG,EAAE;IACpC,OAAO;QACL,SAAS,EAAE,KAAK,EAAE,OAA4B,EAAoB,EAAE;YAClE,OAAO,IAAA,wBAAO,EAAC,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC,CAAC;QAC7D,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AANW,QAAA,iBAAiB,qBAM5B;AAEK,MAAM,uBAAuB,GAAG,KAAK,IAIzC,EAAE;IACH,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,IAAA,wBAAO,EAE3B,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAEtC,OAAO;YACL,SAAS,EAAE,QAAQ,CAAC,MAAM,KAAK,IAAI;YACnC,MAAM,EAAE,YAAG,CAAC,qBAAqB;SAClC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,cAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;QACrD,OAAO;YACL,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,YAAG,CAAC,qBAAqB;YACjC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAChE,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAtBW,QAAA,uBAAuB,2BAsBlC"}
package/dist/server.js CHANGED
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const zod_1 = require("zod");
4
4
  const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
5
- const auth_middleware_1 = require("./auth/auth-middleware");
5
+ const auth_1 = require("./auth");
6
6
  const constants_1 = require("./constants");
7
7
  const cv_api_1 = require("./cv-api");
8
8
  const generated_1 = require("./generated");
@@ -36,10 +36,14 @@ server.registerTool('list_messages', {
36
36
  'If you want to get messages from a specific workspace, you can use the "workspace_id" parameter. ' +
37
37
  'If you want to get messages for a particular language, you can use the "language" parameter. ',
38
38
  inputSchema: CarbonVoiceSimplifiedAPI_zod_1.listMessagesQueryParams.shape,
39
+ annotations: {
40
+ readOnlyHint: true,
41
+ destructiveHint: false,
42
+ },
39
43
  }, async (params, { authInfo }) => {
40
44
  try {
41
45
  // Fallback to regular API
42
- return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.listMessages(params, (0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
46
+ return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.listMessages(params, (0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
43
47
  }
44
48
  catch (error) {
45
49
  utils_1.logger.error('Error listing messages:', { params, error });
@@ -49,10 +53,14 @@ server.registerTool('list_messages', {
49
53
  server.registerTool('get_message', {
50
54
  description: 'Get a message by its ID.',
51
55
  inputSchema: CarbonVoiceSimplifiedAPI_zod_1.getMessageByIdParams.merge(CarbonVoiceSimplifiedAPI_zod_1.getMessageByIdQueryParams).shape,
56
+ annotations: {
57
+ readOnlyHint: true,
58
+ destructiveHint: false,
59
+ },
52
60
  }, async (args, { authInfo }) => {
53
61
  try {
54
62
  const { id, ...queryParams } = args;
55
- return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.getMessageById(id, queryParams, (0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
63
+ return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.getMessageById(id, queryParams, (0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
56
64
  }
57
65
  catch (error) {
58
66
  utils_1.logger.error('Error getting message by id:', { args, error });
@@ -63,9 +71,13 @@ server.registerTool('get_recent_messages', {
63
71
  description: 'Get most recent messages, including their associated Conversation, Creator, and Labels information. ' +
64
72
  'Returns a maximum of 10 messages.',
65
73
  inputSchema: CarbonVoiceSimplifiedAPI_zod_1.getTenRecentMessagesResponseQueryParams.shape,
74
+ annotations: {
75
+ readOnlyHint: true,
76
+ destructiveHint: false,
77
+ },
66
78
  }, async (args, { authInfo }) => {
67
79
  try {
68
- return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.getTenRecentMessagesResponse(args, (0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
80
+ return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.getTenRecentMessagesResponse(args, (0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
69
81
  }
70
82
  catch (error) {
71
83
  utils_1.logger.error('Error getting recent messages:', { args, error });
@@ -76,9 +88,13 @@ server.registerTool('create_conversation_message', {
76
88
  description: 'Sends a message to an existing conversation or any type with a conversation_id. ' +
77
89
  'To reply as a thread, included a message_id for "parent_id". You must provide a transcript or attachment.',
78
90
  inputSchema: CarbonVoiceSimplifiedAPI_zod_1.createConversationMessageParams.merge(CarbonVoiceSimplifiedAPI_zod_1.createConversationMessageBody).shape,
91
+ annotations: {
92
+ readOnlyHint: false,
93
+ destructiveHint: false,
94
+ },
79
95
  }, async (args, { authInfo }) => {
80
96
  try {
81
- return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.createConversationMessage(args.id, args, (0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
97
+ return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.createConversationMessage(args.id, args, (0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
82
98
  }
83
99
  catch (error) {
84
100
  utils_1.logger.error('Error creating conversation message:', { args, error });
@@ -89,9 +105,13 @@ server.registerTool('create_direct_message', {
89
105
  description: 'Send a Direct Message (DM) to a User or a Group of Users. ' +
90
106
  'In order to create a Direct Message, you must provide transcript or link attachments.',
91
107
  inputSchema: CarbonVoiceSimplifiedAPI_zod_1.sendDirectMessageBody.shape,
108
+ annotations: {
109
+ readOnlyHint: false,
110
+ destructiveHint: false,
111
+ },
92
112
  }, async (args, { authInfo }) => {
93
113
  try {
94
- return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.sendDirectMessage(args, (0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
114
+ return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.sendDirectMessage(args, (0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
95
115
  }
96
116
  catch (error) {
97
117
  utils_1.logger.error('Error creating direct message:', { args, error });
@@ -101,9 +121,13 @@ server.registerTool('create_direct_message', {
101
121
  server.registerTool('create_voicememo_message', {
102
122
  description: 'Create a VoiceMemo Message. In order to create a VoiceMemo Message, you must provide a transcript or link attachments.',
103
123
  inputSchema: CarbonVoiceSimplifiedAPI_zod_1.createVoiceMemoMessageBody.shape,
124
+ annotations: {
125
+ readOnlyHint: false,
126
+ destructiveHint: false,
127
+ },
104
128
  }, async (args, { authInfo }) => {
105
129
  try {
106
- return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.createVoiceMemoMessage(args, (0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
130
+ return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.createVoiceMemoMessage(args, (0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
107
131
  }
108
132
  catch (error) {
109
133
  utils_1.logger.error('Error creating voicememo message:', { args, error });
@@ -113,11 +137,15 @@ server.registerTool('create_voicememo_message', {
113
137
  server.registerTool('add_attachments_to_message', {
114
138
  description: 'Add attachments to a message. In order to add attachments to a message, you must provide a message id and the attachments.',
115
139
  inputSchema: CarbonVoiceSimplifiedAPI_zod_1.addLinkAttachmentsToMessageParams.merge(CarbonVoiceSimplifiedAPI_zod_1.addLinkAttachmentsToMessageBody).shape,
140
+ annotations: {
141
+ readOnlyHint: false,
142
+ destructiveHint: false,
143
+ },
116
144
  }, async (args, { authInfo }) => {
117
145
  try {
118
146
  return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.addLinkAttachmentsToMessage(args.id, {
119
147
  links: args.links,
120
- }, (0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
148
+ }, (0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
121
149
  }
122
150
  catch (error) {
123
151
  utils_1.logger.error('Error adding attachments to message:', { args, error });
@@ -128,9 +156,13 @@ server.registerTool('add_attachments_to_message', {
128
156
  server.registerTool('get_user', {
129
157
  description: 'Get a User by their ID.',
130
158
  inputSchema: CarbonVoiceSimplifiedAPI_zod_1.getUserByIdParams.shape,
159
+ annotations: {
160
+ readOnlyHint: true,
161
+ destructiveHint: false,
162
+ },
131
163
  }, async (args, { authInfo }) => {
132
164
  try {
133
- return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.getUserById(args.id, (0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
165
+ return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.getUserById(args.id, (0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
134
166
  }
135
167
  catch (error) {
136
168
  utils_1.logger.error('Error getting user by id:', { args, error });
@@ -141,9 +173,13 @@ server.registerTool('search_user', {
141
173
  description: 'Search for a User by their phone number or email address. ' +
142
174
  '(In order to search for a User, you must provide a phone number or email address.)',
143
175
  inputSchema: CarbonVoiceSimplifiedAPI_zod_1.searchUserQueryParams.shape,
176
+ annotations: {
177
+ readOnlyHint: true,
178
+ destructiveHint: false,
179
+ },
144
180
  }, async (args, { authInfo }) => {
145
181
  try {
146
- return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.searchUser(args, (0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
182
+ return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.searchUser(args, (0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
147
183
  }
148
184
  catch (error) {
149
185
  utils_1.logger.error('Error searching for user:', { args, error });
@@ -154,21 +190,29 @@ server.registerTool('search_users', {
154
190
  description: 'Search multiple Users by their phone numbers, email addresses or ids. ' +
155
191
  '(In order to search Users, you must provide phone numbers, email addresses or ids.)',
156
192
  inputSchema: CarbonVoiceSimplifiedAPI_zod_1.searchUsersBody.shape,
193
+ annotations: {
194
+ readOnlyHint: true,
195
+ destructiveHint: false,
196
+ },
157
197
  }, async (args, { authInfo }) => {
158
198
  try {
159
- return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.searchUsers(args, (0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
199
+ return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.searchUsers(args, (0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
160
200
  }
161
201
  catch (error) {
162
202
  utils_1.logger.error('Error searching users:', { args, error });
163
203
  return (0, utils_1.formatToMCPToolResponse)(error);
164
204
  }
165
205
  });
166
- server.registerTool('me', {
206
+ server.registerTool('get_current_user', {
167
207
  description: 'Get the current user information. ',
168
208
  inputSchema: zod_1.z.object({}).shape, // Needed in order to have access to authInfo
209
+ annotations: {
210
+ readOnlyHint: true,
211
+ destructiveHint: false,
212
+ },
169
213
  }, async (params, { authInfo }) => {
170
214
  try {
171
- return (0, utils_1.formatToMCPToolResponse)(await cvApi.getWhoAmI((0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
215
+ return (0, utils_1.formatToMCPToolResponse)(await cvApi.getWhoAmI((0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
172
216
  }
173
217
  catch (error) {
174
218
  utils_1.logger.error('Error searching users:', { params, error });
@@ -180,9 +224,13 @@ server.registerTool('list_conversations', {
180
224
  description: 'List all conversations. ' +
181
225
  'Returns a simplified view of user conversations that have had messages sent or received within the last 6 months.',
182
226
  inputSchema: zod_1.z.object({}).shape,
227
+ annotations: {
228
+ readOnlyHint: true,
229
+ destructiveHint: false,
230
+ },
183
231
  }, async (args, { authInfo }) => {
184
232
  try {
185
- return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.getAllConversations((0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
233
+ return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.getAllConversations((0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
186
234
  }
187
235
  catch (error) {
188
236
  utils_1.logger.error('Error listing conversations:', { error });
@@ -192,9 +240,13 @@ server.registerTool('list_conversations', {
192
240
  server.registerTool('get_conversation', {
193
241
  description: 'Get a conversation by its ID.',
194
242
  inputSchema: CarbonVoiceSimplifiedAPI_zod_1.getConversationByIdParams.shape,
243
+ annotations: {
244
+ readOnlyHint: true,
245
+ destructiveHint: false,
246
+ },
195
247
  }, async (args, { authInfo }) => {
196
248
  try {
197
- return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.getConversationById(args.id, (0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
249
+ return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.getConversationById(args.id, (0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
198
250
  }
199
251
  catch (error) {
200
252
  utils_1.logger.error('Error getting conversation by id:', { error });
@@ -204,9 +256,13 @@ server.registerTool('get_conversation', {
204
256
  server.registerTool('get_conversation_users', {
205
257
  description: 'Get users in a conversation.',
206
258
  inputSchema: CarbonVoiceSimplifiedAPI_zod_1.getConversationByIdParams.shape,
259
+ annotations: {
260
+ readOnlyHint: true,
261
+ destructiveHint: false,
262
+ },
207
263
  }, async (args, { authInfo }) => {
208
264
  try {
209
- return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.getConversationUsers(args.id, (0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
265
+ return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.getConversationUsers(args.id, (0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
210
266
  }
211
267
  catch (error) {
212
268
  utils_1.logger.error('Error getting conversation users:', { error });
@@ -216,13 +272,17 @@ server.registerTool('get_conversation_users', {
216
272
  server.registerTool('summarize_conversation', {
217
273
  description: 'Summarize a conversation.',
218
274
  inputSchema: schemas_1.summarizeConversationParams.shape,
275
+ annotations: {
276
+ readOnlyHint: false,
277
+ destructiveHint: false,
278
+ },
219
279
  }, async (args, { authInfo }) => {
220
280
  var _a;
221
281
  try {
222
282
  let message_ids = args.message_ids || [];
223
283
  // If no message ids are provided, get couple of messages from the conversation
224
284
  if (!args.message_ids) {
225
- const messages = await simplifiedApi.listMessages(args, (0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token));
285
+ const messages = await simplifiedApi.listMessages(args, (0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token));
226
286
  message_ids = ((_a = messages.results) === null || _a === void 0 ? void 0 : _a.map((message) => message.id)) || [];
227
287
  }
228
288
  const aiResponse = await simplifiedApi.aIResponseControllerCreateResponse({
@@ -230,7 +290,7 @@ server.registerTool('summarize_conversation', {
230
290
  message_ids: message_ids,
231
291
  channel_id: args.conversation_id,
232
292
  language: args.language,
233
- }, (0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token));
293
+ }, (0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token));
234
294
  return (0, utils_1.formatToMCPToolResponse)(aiResponse);
235
295
  }
236
296
  catch (error) {
@@ -290,9 +350,13 @@ server.registerTool('get_root_folders', {
290
350
  description: 'Lists all root folders for a given workspace, including their names, IDs, and basic structure, ' +
291
351
  'but does not provide aggregate counts.(Required to inform message type:voicememo,prerecorded)',
292
352
  inputSchema: CarbonVoiceSimplifiedAPI_zod_1.getAllRootFoldersQueryParams.shape,
353
+ annotations: {
354
+ readOnlyHint: true,
355
+ destructiveHint: false,
356
+ },
293
357
  }, async (args, { authInfo }) => {
294
358
  try {
295
- return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.getAllRootFolders(args, (0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
359
+ return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.getAllRootFolders(args, (0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
296
360
  }
297
361
  catch (error) {
298
362
  utils_1.logger.error('Error listing root folders:', { error });
@@ -302,9 +366,13 @@ server.registerTool('get_root_folders', {
302
366
  server.registerTool('create_folder', {
303
367
  description: 'Create a new folder.',
304
368
  inputSchema: CarbonVoiceSimplifiedAPI_zod_1.createFolderBody.shape,
369
+ annotations: {
370
+ readOnlyHint: false,
371
+ destructiveHint: false,
372
+ },
305
373
  }, async (args, { authInfo }) => {
306
374
  try {
307
- return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.createFolder(args, (0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
375
+ return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.createFolder(args, (0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
308
376
  }
309
377
  catch (error) {
310
378
  utils_1.logger.error('Error creating folder:', { error });
@@ -314,9 +382,13 @@ server.registerTool('create_folder', {
314
382
  server.registerTool('get_folder', {
315
383
  description: 'Get a folder by its ID.',
316
384
  inputSchema: CarbonVoiceSimplifiedAPI_zod_1.getFolderByIdParams.merge(CarbonVoiceSimplifiedAPI_zod_1.getFolderByIdQueryParams).shape,
385
+ annotations: {
386
+ readOnlyHint: true,
387
+ destructiveHint: false,
388
+ },
317
389
  }, async (args, { authInfo }) => {
318
390
  try {
319
- return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.getFolderById(args.id, args, (0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
391
+ return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.getFolderById(args.id, args, (0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
320
392
  }
321
393
  catch (error) {
322
394
  utils_1.logger.error('Error getting folder by id:', { error });
@@ -326,9 +398,13 @@ server.registerTool('get_folder', {
326
398
  server.registerTool('get_folder_with_messages', {
327
399
  description: 'Get a folder including its messages by its ID. (Only messages at folder level are returned.)',
328
400
  inputSchema: CarbonVoiceSimplifiedAPI_zod_1.getFolderMessagesParams.shape,
401
+ annotations: {
402
+ readOnlyHint: true,
403
+ destructiveHint: false,
404
+ },
329
405
  }, async (args, { authInfo }) => {
330
406
  try {
331
- return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.getFolderMessages(args.id, (0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
407
+ return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.getFolderMessages(args.id, (0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
332
408
  }
333
409
  catch (error) {
334
410
  utils_1.logger.error('Error getting folder with messages:', { error });
@@ -338,9 +414,13 @@ server.registerTool('get_folder_with_messages', {
338
414
  server.registerTool('update_folder_name', {
339
415
  description: 'Update a folder name by its ID.',
340
416
  inputSchema: CarbonVoiceSimplifiedAPI_zod_1.updateFolderNameParams.merge(CarbonVoiceSimplifiedAPI_zod_1.updateFolderNameBody).shape,
417
+ annotations: {
418
+ readOnlyHint: false,
419
+ destructiveHint: false,
420
+ },
341
421
  }, async (args, { authInfo }) => {
342
422
  try {
343
- return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.updateFolderName(args.id, args, (0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
423
+ return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.updateFolderName(args.id, args, (0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
344
424
  }
345
425
  catch (error) {
346
426
  utils_1.logger.error('Error updating folder name:', { error });
@@ -351,9 +431,13 @@ server.registerTool('delete_folder', {
351
431
  description: 'Delete a folder by its ID. Deleting a folder will also delete nested folders and all the messages in referenced folders. ' +
352
432
  '(This is a destructive action and cannot be undone, so please be careful.)',
353
433
  inputSchema: CarbonVoiceSimplifiedAPI_zod_1.deleteFolderParams.shape,
434
+ annotations: {
435
+ readOnlyHint: false,
436
+ destructiveHint: true,
437
+ },
354
438
  }, async (args, { authInfo }) => {
355
439
  try {
356
- return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.deleteFolder(args.id, (0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
440
+ return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.deleteFolder(args.id, (0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
357
441
  }
358
442
  catch (error) {
359
443
  utils_1.logger.error('Error deleting folder:', { error });
@@ -363,9 +447,13 @@ server.registerTool('delete_folder', {
363
447
  server.registerTool('move_folder', {
364
448
  description: 'Move a folder by its ID. Move a Folder into another Folder or into a Workspace.',
365
449
  inputSchema: CarbonVoiceSimplifiedAPI_zod_1.moveFolderParams.merge(CarbonVoiceSimplifiedAPI_zod_1.moveFolderBody).shape,
450
+ annotations: {
451
+ readOnlyHint: false,
452
+ destructiveHint: false,
453
+ },
366
454
  }, async (args, { authInfo }) => {
367
455
  try {
368
- return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.moveFolder(args.id, args, (0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
456
+ return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.moveFolder(args.id, args, (0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
369
457
  }
370
458
  catch (error) {
371
459
  utils_1.logger.error('Error moving folder:', { error });
@@ -376,9 +464,13 @@ server.registerTool('move_message_to_folder', {
376
464
  description: 'Move a message to a folder by its ID. Move a Message into another Folder or into a Workspace. ' +
377
465
  'Only allowed to move messages of type: voicememo,prerecorded.',
378
466
  inputSchema: CarbonVoiceSimplifiedAPI_zod_1.addMessageToFolderOrWorkspaceBody.shape,
467
+ annotations: {
468
+ readOnlyHint: false,
469
+ destructiveHint: false,
470
+ },
379
471
  }, async (args, { authInfo }) => {
380
472
  try {
381
- return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.addMessageToFolderOrWorkspace(args, (0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
473
+ return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.addMessageToFolderOrWorkspace(args, (0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
382
474
  }
383
475
  catch (error) {
384
476
  utils_1.logger.error('Error moving message to folder:', { error });
@@ -389,9 +481,13 @@ server.registerTool('move_message_to_folder', {
389
481
  server.registerTool('get_workspaces_basic_info', {
390
482
  description: 'Get basic information about a workspace.',
391
483
  inputSchema: zod_1.z.object({}).shape,
484
+ annotations: {
485
+ readOnlyHint: true,
486
+ destructiveHint: false,
487
+ },
392
488
  }, async (params, { authInfo }) => {
393
489
  try {
394
- return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.getAllWorkspacesWithBasicInfo((0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
490
+ return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.getAllWorkspacesWithBasicInfo((0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
395
491
  }
396
492
  catch (error) {
397
493
  utils_1.logger.error('Error getting workspaces basic info:', { error });
@@ -404,9 +500,13 @@ server.registerTool('list_ai_actions', {
404
500
  'Filtering by owner type, Possible values: "user", "workspace", "system". ' +
405
501
  'Do not use unless the user explicitly requests it.',
406
502
  inputSchema: CarbonVoiceSimplifiedAPI_zod_1.aIPromptControllerGetPromptsQueryParams.shape,
503
+ annotations: {
504
+ readOnlyHint: true,
505
+ destructiveHint: false,
506
+ },
407
507
  }, async (args, { authInfo }) => {
408
508
  try {
409
- return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.aIPromptControllerGetPrompts(args, (0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
509
+ return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.aIPromptControllerGetPrompts(args, (0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
410
510
  }
411
511
  catch (error) {
412
512
  utils_1.logger.error('Error listing ai actions:', { error });
@@ -416,9 +516,13 @@ server.registerTool('list_ai_actions', {
416
516
  server.registerTool('run_ai_action', {
417
517
  description: 'Run an AI Action (Prompt) for a message. You can run an AI Action for a message by its ID or a list of message IDs.',
418
518
  inputSchema: CarbonVoiceSimplifiedAPI_zod_1.aIResponseControllerCreateResponseBody.shape,
519
+ annotations: {
520
+ readOnlyHint: false,
521
+ destructiveHint: false,
522
+ },
419
523
  }, async (args, { authInfo }) => {
420
524
  try {
421
- return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.aIResponseControllerCreateResponse(args, (0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
525
+ return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.aIResponseControllerCreateResponse(args, (0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
422
526
  }
423
527
  catch (error) {
424
528
  utils_1.logger.error('Error running ai action:', { error });
@@ -429,9 +533,13 @@ server.registerTool('run_ai_action_for_shared_link', {
429
533
  description: 'Run an AI Action (Prompt) for a shared link. You can run an AI Action for a shared link by its ID or a list of shared link IDs. ' +
430
534
  'You can also provide the language of the response.',
431
535
  inputSchema: CarbonVoiceSimplifiedAPI_zod_1.createShareLinkAIResponseBody.shape,
536
+ annotations: {
537
+ readOnlyHint: false,
538
+ destructiveHint: false,
539
+ },
432
540
  }, async (args, { authInfo }) => {
433
541
  try {
434
- return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.createShareLinkAIResponse(args, (0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
542
+ return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.createShareLinkAIResponse(args, (0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
435
543
  }
436
544
  catch (error) {
437
545
  utils_1.logger.error('Error running ai action for shared link:', { error });
@@ -442,9 +550,13 @@ server.registerTool('get_ai_action_responses', {
442
550
  description: 'Retrieve previously generated AI Action (Prompt) responses by filtering for a specific prompt, message, or conversation ID. ' +
443
551
  'Combine filters to narrow results and view all AI-generated responses related to a particular prompt, message, or conversation.',
444
552
  inputSchema: CarbonVoiceSimplifiedAPI_zod_1.aIResponseControllerGetAllResponsesQueryParams.shape,
553
+ annotations: {
554
+ readOnlyHint: true,
555
+ destructiveHint: false,
556
+ },
445
557
  }, async (args, { authInfo }) => {
446
558
  try {
447
- return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.aIResponseControllerGetAllResponses(args, (0, auth_middleware_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
559
+ return (0, utils_1.formatToMCPToolResponse)(await simplifiedApi.aIResponseControllerGetAllResponses(args, (0, auth_1.setCarbonVoiceAuthHeader)(authInfo === null || authInfo === void 0 ? void 0 : authInfo.token)));
448
560
  }
449
561
  catch (error) {
450
562
  utils_1.logger.error('Error getting ai action responses:', { error });