n8n-nodes-clientify 0.2.4 → 0.2.5

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 (185) hide show
  1. package/README.md +31 -338
  2. package/dist/README.md +31 -338
  3. package/dist/appmixer/clientify/crm/AddCompanyAddress/AddCompanyAddress.js +33 -0
  4. package/dist/appmixer/clientify/crm/AddCompanyAddress/component.json +115 -0
  5. package/dist/appmixer/clientify/crm/AddCompanyCall/AddCompanyCall.js +32 -0
  6. package/dist/appmixer/clientify/crm/AddCompanyCall/component.json +109 -0
  7. package/dist/appmixer/clientify/crm/AddCompanyCheckin/AddCompanyCheckin.js +31 -0
  8. package/dist/appmixer/clientify/crm/AddCompanyCheckin/component.json +98 -0
  9. package/dist/appmixer/clientify/crm/AddCompanyEmail/AddCompanyEmail.js +25 -0
  10. package/dist/appmixer/clientify/crm/AddCompanyEmail/component.json +84 -0
  11. package/dist/appmixer/clientify/crm/AddCompanyEmployee/AddCompanyEmployee.js +22 -0
  12. package/dist/appmixer/clientify/crm/AddCompanyEmployee/component.json +65 -0
  13. package/dist/appmixer/clientify/crm/AddCompanyNote/AddCompanyNote.js +25 -0
  14. package/dist/appmixer/clientify/crm/AddCompanyNote/component.json +75 -0
  15. package/dist/appmixer/clientify/crm/AddCompanyPhone/AddCompanyPhone.js +25 -0
  16. package/dist/appmixer/clientify/crm/AddCompanyPhone/component.json +87 -0
  17. package/dist/appmixer/clientify/crm/AddCompanyTag/AddCompanyTag.js +23 -0
  18. package/dist/appmixer/clientify/crm/AddCompanyTag/component.json +71 -0
  19. package/dist/appmixer/clientify/crm/AddCompanyWebsite/AddCompanyWebsite.js +23 -0
  20. package/dist/appmixer/clientify/crm/AddCompanyWebsite/component.json +65 -0
  21. package/dist/appmixer/clientify/crm/AddContactAddress/AddContactAddress.js +33 -0
  22. package/dist/appmixer/clientify/crm/AddContactAddress/component.json +115 -0
  23. package/dist/appmixer/clientify/crm/AddContactCall/AddContactCall.js +20 -0
  24. package/dist/appmixer/clientify/crm/AddContactCall/component.json +55 -0
  25. package/dist/appmixer/clientify/crm/AddContactCheckin/AddContactCheckin.js +33 -0
  26. package/dist/appmixer/clientify/crm/AddContactCheckin/component.json +109 -0
  27. package/dist/appmixer/clientify/crm/AddContactEmail/AddContactEmail.js +25 -0
  28. package/dist/appmixer/clientify/crm/AddContactEmail/component.json +85 -0
  29. package/dist/appmixer/clientify/crm/AddContactNote/AddContactNote.js +25 -0
  30. package/dist/appmixer/clientify/crm/AddContactNote/component.json +75 -0
  31. package/dist/appmixer/clientify/crm/AddContactOtherCompany/AddContactOtherCompany.js +23 -0
  32. package/dist/appmixer/clientify/crm/AddContactOtherCompany/component.json +65 -0
  33. package/dist/appmixer/clientify/crm/AddContactPhone/AddContactPhone.js +25 -0
  34. package/dist/appmixer/clientify/crm/AddContactPhone/component.json +88 -0
  35. package/dist/appmixer/clientify/crm/AddContactTag/AddContactTag.js +23 -0
  36. package/dist/appmixer/clientify/crm/AddContactTag/component.json +71 -0
  37. package/dist/appmixer/clientify/crm/AssignContactOwner/AssignContactOwner.js +23 -0
  38. package/dist/appmixer/clientify/crm/AssignContactOwner/component.json +93 -0
  39. package/dist/appmixer/clientify/crm/BatchCreateContacts/BatchCreateContacts.js +23 -0
  40. package/dist/appmixer/clientify/crm/BatchCreateContacts/component.json +90 -0
  41. package/dist/appmixer/clientify/crm/CompleteTask/CompleteTask.js +24 -0
  42. package/dist/appmixer/clientify/crm/CompleteTask/component.json +69 -0
  43. package/dist/appmixer/clientify/crm/CreateCompany/CreateCompany.js +19 -0
  44. package/dist/appmixer/clientify/crm/CreateCompany/component.json +58 -0
  45. package/dist/appmixer/clientify/crm/CreateContact/CreateContact.js +19 -0
  46. package/dist/appmixer/clientify/crm/CreateContact/component.json +88 -0
  47. package/dist/appmixer/clientify/crm/CreateTask/CreateTask.js +19 -0
  48. package/dist/appmixer/clientify/crm/CreateTask/component.json +167 -0
  49. package/dist/appmixer/clientify/crm/DeleteCompany/DeleteCompany.js +22 -0
  50. package/dist/appmixer/clientify/crm/DeleteCompany/component.json +51 -0
  51. package/dist/appmixer/clientify/crm/DeleteCompanyAddress/DeleteCompanyAddress.js +22 -0
  52. package/dist/appmixer/clientify/crm/DeleteCompanyAddress/component.json +62 -0
  53. package/dist/appmixer/clientify/crm/DeleteCompanyEmail/DeleteCompanyEmail.js +22 -0
  54. package/dist/appmixer/clientify/crm/DeleteCompanyEmail/component.json +62 -0
  55. package/dist/appmixer/clientify/crm/DeleteCompanyPhone/DeleteCompanyPhone.js +22 -0
  56. package/dist/appmixer/clientify/crm/DeleteCompanyPhone/component.json +62 -0
  57. package/dist/appmixer/clientify/crm/DeleteCompanyWebsite/DeleteCompanyWebsite.js +22 -0
  58. package/dist/appmixer/clientify/crm/DeleteCompanyWebsite/component.json +62 -0
  59. package/dist/appmixer/clientify/crm/DeleteContact/DeleteContact.js +22 -0
  60. package/dist/appmixer/clientify/crm/DeleteContact/component.json +51 -0
  61. package/dist/appmixer/clientify/crm/DeleteContactAddress/DeleteContactAddress.js +22 -0
  62. package/dist/appmixer/clientify/crm/DeleteContactAddress/component.json +62 -0
  63. package/dist/appmixer/clientify/crm/DeleteContactEmail/DeleteContactEmail.js +22 -0
  64. package/dist/appmixer/clientify/crm/DeleteContactEmail/component.json +62 -0
  65. package/dist/appmixer/clientify/crm/DeleteContactOtherCompany/DeleteContactOtherCompany.js +22 -0
  66. package/dist/appmixer/clientify/crm/DeleteContactOtherCompany/component.json +62 -0
  67. package/dist/appmixer/clientify/crm/DeleteContactPhone/DeleteContactPhone.js +22 -0
  68. package/dist/appmixer/clientify/crm/DeleteContactPhone/component.json +62 -0
  69. package/dist/appmixer/clientify/crm/GetCompany/GetCompany.js +24 -0
  70. package/dist/appmixer/clientify/crm/GetCompany/component.json +69 -0
  71. package/dist/appmixer/clientify/crm/GetContact/GetContact.js +24 -0
  72. package/dist/appmixer/clientify/crm/GetContact/component.json +90 -0
  73. package/dist/appmixer/clientify/crm/GetCurrentUser/GetCurrentUser.js +17 -0
  74. package/dist/appmixer/clientify/crm/GetCurrentUser/component.json +49 -0
  75. package/dist/appmixer/clientify/crm/GetTask/GetTask.js +24 -0
  76. package/dist/appmixer/clientify/crm/GetTask/component.json +78 -0
  77. package/dist/appmixer/clientify/crm/ListAllCompanyTags/ListAllCompanyTags.js +16 -0
  78. package/dist/appmixer/clientify/crm/ListAllCompanyTags/component.json +67 -0
  79. package/dist/appmixer/clientify/crm/ListAllContactTags/ListAllContactTags.js +16 -0
  80. package/dist/appmixer/clientify/crm/ListAllContactTags/component.json +67 -0
  81. package/dist/appmixer/clientify/crm/ListCompanies/ListCompanies.js +26 -0
  82. package/dist/appmixer/clientify/crm/ListCompanies/component.json +117 -0
  83. package/dist/appmixer/clientify/crm/ListCompanyAddresses/ListCompanyAddresses.js +20 -0
  84. package/dist/appmixer/clientify/crm/ListCompanyAddresses/component.json +79 -0
  85. package/dist/appmixer/clientify/crm/ListCompanyCustomfields/ListCompanyCustomfields.js +20 -0
  86. package/dist/appmixer/clientify/crm/ListCompanyCustomfields/component.json +79 -0
  87. package/dist/appmixer/clientify/crm/ListCompanyEmails/ListCompanyEmails.js +20 -0
  88. package/dist/appmixer/clientify/crm/ListCompanyEmails/component.json +88 -0
  89. package/dist/appmixer/clientify/crm/ListCompanyEmployees/ListCompanyEmployees.js +20 -0
  90. package/dist/appmixer/clientify/crm/ListCompanyEmployees/component.json +79 -0
  91. package/dist/appmixer/clientify/crm/ListCompanyPhones/ListCompanyPhones.js +20 -0
  92. package/dist/appmixer/clientify/crm/ListCompanyPhones/component.json +91 -0
  93. package/dist/appmixer/clientify/crm/ListCompanySectors/ListCompanySectors.js +16 -0
  94. package/dist/appmixer/clientify/crm/ListCompanySectors/component.json +64 -0
  95. package/dist/appmixer/clientify/crm/ListCompanyTags/ListCompanyTags.js +20 -0
  96. package/dist/appmixer/clientify/crm/ListCompanyTags/component.json +85 -0
  97. package/dist/appmixer/clientify/crm/ListCompanyTasks/ListCompanyTasks.js +20 -0
  98. package/dist/appmixer/clientify/crm/ListCompanyTasks/component.json +79 -0
  99. package/dist/appmixer/clientify/crm/ListCompanyWallentries/ListCompanyWallentries.js +20 -0
  100. package/dist/appmixer/clientify/crm/ListCompanyWallentries/component.json +79 -0
  101. package/dist/appmixer/clientify/crm/ListCompanyWebsites/ListCompanyWebsites.js +20 -0
  102. package/dist/appmixer/clientify/crm/ListCompanyWebsites/component.json +79 -0
  103. package/dist/appmixer/clientify/crm/ListContactAddresses/ListContactAddresses.js +20 -0
  104. package/dist/appmixer/clientify/crm/ListContactAddresses/component.json +79 -0
  105. package/dist/appmixer/clientify/crm/ListContactCustomfields/ListContactCustomfields.js +20 -0
  106. package/dist/appmixer/clientify/crm/ListContactCustomfields/component.json +79 -0
  107. package/dist/appmixer/clientify/crm/ListContactEmails/ListContactEmails.js +20 -0
  108. package/dist/appmixer/clientify/crm/ListContactEmails/component.json +88 -0
  109. package/dist/appmixer/clientify/crm/ListContactOtherCompanies/ListContactOtherCompanies.js +20 -0
  110. package/dist/appmixer/clientify/crm/ListContactOtherCompanies/component.json +85 -0
  111. package/dist/appmixer/clientify/crm/ListContactPhones/ListContactPhones.js +20 -0
  112. package/dist/appmixer/clientify/crm/ListContactPhones/component.json +91 -0
  113. package/dist/appmixer/clientify/crm/ListContactTags/ListContactTags.js +20 -0
  114. package/dist/appmixer/clientify/crm/ListContactTags/component.json +85 -0
  115. package/dist/appmixer/clientify/crm/ListContactTasks/ListContactTasks.js +20 -0
  116. package/dist/appmixer/clientify/crm/ListContactTasks/component.json +79 -0
  117. package/dist/appmixer/clientify/crm/ListContactWallentries/ListContactWallentries.js +20 -0
  118. package/dist/appmixer/clientify/crm/ListContactWallentries/component.json +79 -0
  119. package/dist/appmixer/clientify/crm/ListContacts/ListContacts.js +26 -0
  120. package/dist/appmixer/clientify/crm/ListContacts/component.json +138 -0
  121. package/dist/appmixer/clientify/crm/ListCustomFieldValues/ListCustomFieldValues.js +19 -0
  122. package/dist/appmixer/clientify/crm/ListCustomFieldValues/component.json +77 -0
  123. package/dist/appmixer/clientify/crm/ListCustomFields/ListCustomFields.js +19 -0
  124. package/dist/appmixer/clientify/crm/ListCustomFields/component.json +77 -0
  125. package/dist/appmixer/clientify/crm/ListTaskStages/ListTaskStages.js +19 -0
  126. package/dist/appmixer/clientify/crm/ListTaskStages/component.json +87 -0
  127. package/dist/appmixer/clientify/crm/ListTaskTypes/ListTaskTypes.js +19 -0
  128. package/dist/appmixer/clientify/crm/ListTaskTypes/component.json +87 -0
  129. package/dist/appmixer/clientify/crm/ListTasks/ListTasks.js +25 -0
  130. package/dist/appmixer/clientify/crm/ListTasks/component.json +102 -0
  131. package/dist/appmixer/clientify/crm/ListUsers/ListUsers.js +24 -0
  132. package/dist/appmixer/clientify/crm/ListUsers/component.json +93 -0
  133. package/dist/appmixer/clientify/crm/RemoveCompanyEmployee/RemoveCompanyEmployee.js +22 -0
  134. package/dist/appmixer/clientify/crm/RemoveCompanyEmployee/component.json +62 -0
  135. package/dist/appmixer/clientify/crm/RemoveCompanyTag/RemoveCompanyTag.js +22 -0
  136. package/dist/appmixer/clientify/crm/RemoveCompanyTag/component.json +62 -0
  137. package/dist/appmixer/clientify/crm/RemoveContactTag/RemoveContactTag.js +22 -0
  138. package/dist/appmixer/clientify/crm/RemoveContactTag/component.json +62 -0
  139. package/dist/appmixer/clientify/crm/SearchCompanies/SearchCompanies.js +29 -0
  140. package/dist/appmixer/clientify/crm/SearchCompanies/component.json +111 -0
  141. package/dist/appmixer/clientify/crm/UpdateCompany/UpdateCompany.js +24 -0
  142. package/dist/appmixer/clientify/crm/UpdateCompany/component.json +60 -0
  143. package/dist/appmixer/clientify/crm/UpdateCompanyAddress/UpdateCompanyAddress.js +35 -0
  144. package/dist/appmixer/clientify/crm/UpdateCompanyAddress/component.json +131 -0
  145. package/dist/appmixer/clientify/crm/UpdateCompanyEmail/UpdateCompanyEmail.js +27 -0
  146. package/dist/appmixer/clientify/crm/UpdateCompanyEmail/component.json +91 -0
  147. package/dist/appmixer/clientify/crm/UpdateCompanyPhone/UpdateCompanyPhone.js +27 -0
  148. package/dist/appmixer/clientify/crm/UpdateCompanyPhone/component.json +91 -0
  149. package/dist/appmixer/clientify/crm/UpdateCompanyWebsite/UpdateCompanyWebsite.js +25 -0
  150. package/dist/appmixer/clientify/crm/UpdateCompanyWebsite/component.json +81 -0
  151. package/dist/appmixer/clientify/crm/UpdateContact/UpdateContact.js +24 -0
  152. package/dist/appmixer/clientify/crm/UpdateContact/component.json +81 -0
  153. package/dist/appmixer/clientify/crm/UpdateContactAddress/UpdateContactAddress.js +35 -0
  154. package/dist/appmixer/clientify/crm/UpdateContactAddress/component.json +152 -0
  155. package/dist/appmixer/clientify/crm/UpdateContactEmail/UpdateContactEmail.js +27 -0
  156. package/dist/appmixer/clientify/crm/UpdateContactEmail/component.json +112 -0
  157. package/dist/appmixer/clientify/crm/UpdateContactMarketingStatus/UpdateContactMarketingStatus.js +25 -0
  158. package/dist/appmixer/clientify/crm/UpdateContactMarketingStatus/component.json +92 -0
  159. package/dist/appmixer/clientify/crm/UpdateContactOtherCompany/UpdateContactOtherCompany.js +25 -0
  160. package/dist/appmixer/clientify/crm/UpdateContactOtherCompany/component.json +102 -0
  161. package/dist/appmixer/clientify/crm/UpdateContactPhone/UpdateContactPhone.js +27 -0
  162. package/dist/appmixer/clientify/crm/UpdateContactPhone/component.json +112 -0
  163. package/dist/appmixer/clientify/crm/UpdateTask/UpdateTask.js +24 -0
  164. package/dist/appmixer/clientify/crm/UpdateTask/component.json +69 -0
  165. package/dist/appmixer/clientify/crm/clientify.js +49 -0
  166. package/dist/appmixer/clientify/crm/fields.js +24 -0
  167. package/dist/appmixer/clientify/crm/module.json +7 -0
  168. package/dist/credentials/{ClientifyMcpApi.credentials.d.ts → ClientifyApi.credentials.d.ts} +1 -1
  169. package/dist/credentials/ClientifyApi.credentials.js +33 -0
  170. package/dist/nodes/{ClientifyMcp/ClientifyMcpDynamic.node.d.ts → ClientifyApi/ClientifyApi.node.d.ts} +1 -1
  171. package/dist/nodes/ClientifyApi/ClientifyApi.node.js +139 -0
  172. package/dist/nodes/ClientifyApi/ClientifyApiCatalog.d.ts +23 -0
  173. package/dist/nodes/ClientifyApi/ClientifyApiCatalog.js +217 -0
  174. package/dist/nodes/{ClientifyMcp/ClientifyMcpTrigger.node.d.ts → ClientifyTrigger/ClientifyTrigger.node.d.ts} +1 -1
  175. package/dist/nodes/{ClientifyMcp/ClientifyMcpTrigger.node.js → ClientifyTrigger/ClientifyTrigger.node.js} +6 -12
  176. package/dist/nodes/ClientifyTrigger/clientify.png +0 -0
  177. package/dist/nodes/ClientifyTrigger/clientify.svg +5 -0
  178. package/dist/package.json +13 -6
  179. package/package.json +13 -6
  180. package/dist/credentials/ClientifyMcpApi.credentials.js +0 -25
  181. package/dist/nodes/ClientifyMcp/ClientifyMcpDynamic.node.js +0 -211
  182. package/dist/nodes/ClientifyMcp/ClientifyMcpFields.d.ts +0 -15
  183. package/dist/nodes/ClientifyMcp/ClientifyMcpFields.js +0 -894
  184. /package/dist/nodes/{ClientifyMcp → ClientifyApi}/clientify.png +0 -0
  185. /package/dist/nodes/{ClientifyMcp → ClientifyApi}/clientify.svg +0 -0
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ClientifyApi = void 0;
4
+ class ClientifyApi {
5
+ constructor() {
6
+ this.name = 'clientifyApi';
7
+ this.displayName = 'Clientify API';
8
+ this.documentationUrl = 'https://newapi.clientify.com/';
9
+ this.properties = [
10
+ {
11
+ displayName: 'API Key',
12
+ name: 'apiKey',
13
+ type: 'string',
14
+ typeOptions: {
15
+ password: true,
16
+ },
17
+ default: '',
18
+ required: true,
19
+ placeholder: 'Enter your Clientify API key',
20
+ description: 'Clientify API key (used as \"Authorization: Token <apiKey>\")',
21
+ },
22
+ {
23
+ displayName: 'Base URL',
24
+ name: 'baseUrl',
25
+ type: 'string',
26
+ default: 'https://api-plus.clientify.com/v2',
27
+ placeholder: 'https://api-plus.clientify.com/v2',
28
+ description: 'Optional override for the Clientify API base URL',
29
+ },
30
+ ];
31
+ }
32
+ }
33
+ exports.ClientifyApi = ClientifyApi;
@@ -1,5 +1,5 @@
1
1
  import { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow';
2
- export declare class ClientifyMcpDynamic implements INodeType {
2
+ export declare class ClientifyApi implements INodeType {
3
3
  description: INodeTypeDescription;
4
4
  execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
5
5
  }
@@ -0,0 +1,139 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ClientifyApi = void 0;
4
+ const n8n_workflow_1 = require("n8n-workflow");
5
+ const api_client_1 = require("@clientify/api-client");
6
+ const ClientifyApiCatalog_1 = require("./ClientifyApiCatalog");
7
+ class ClientifyApi {
8
+ constructor() {
9
+ this.description = {
10
+ displayName: 'Clientify',
11
+ name: 'clientifyApi',
12
+ icon: 'file:clientify.svg',
13
+ group: ['transform'],
14
+ version: 1,
15
+ subtitle: '={{$parameter["operation"]}}',
16
+ description: 'Clientify CRM (direct API via @clientify/api-client)',
17
+ defaults: {
18
+ name: 'Clientify',
19
+ },
20
+ inputs: ['main'],
21
+ outputs: ['main'],
22
+ credentials: [
23
+ {
24
+ name: 'clientifyApi',
25
+ required: true,
26
+ },
27
+ ],
28
+ properties: (() => {
29
+ const props = [
30
+ {
31
+ displayName: 'Action',
32
+ name: 'operation',
33
+ type: 'options',
34
+ options: ClientifyApiCatalog_1.operationOptions,
35
+ default: 'GetCurrentUser',
36
+ required: true,
37
+ noDataExpression: true,
38
+ description: 'Select the Clientify action to execute (mirrors the AppMixer connector action list)',
39
+ },
40
+ ...ClientifyApiCatalog_1.operationFields,
41
+ ];
42
+ return props;
43
+ })(),
44
+ };
45
+ }
46
+ async execute() {
47
+ const items = this.getInputData();
48
+ const returnData = [];
49
+ const credentials = await this.getCredentials('clientifyApi');
50
+ const apiKey = credentials.apiKey;
51
+ const baseUrl = credentials.baseUrl || 'https://api-plus.clientify.com/v2';
52
+ const client = new api_client_1.ClientifyClient({ apiKey, baseUrl });
53
+ const http = client.getHttpClient();
54
+ for (let itemIndex = 0; itemIndex < items.length; itemIndex++) {
55
+ const operation = this.getNodeParameter('operation', itemIndex);
56
+ const def = ClientifyApiCatalog_1.operationDefinitions[operation];
57
+ if (!def) {
58
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Unknown operation "${operation}". Ensure the AppMixer CRM catalog is present in this node package build output.`);
59
+ }
60
+ try {
61
+ const input = {};
62
+ for (const fieldName of def.fieldNames) {
63
+ let value;
64
+ try {
65
+ value = this.getNodeParameter(fieldName, itemIndex);
66
+ }
67
+ catch (_a) {
68
+ continue;
69
+ }
70
+ // Apply per-operation defaults if user left the field empty.
71
+ if ((value === '' || value === null || value === undefined) && fieldName in def.fieldDefaults) {
72
+ value = def.fieldDefaults[fieldName];
73
+ }
74
+ // Avoid accidentally sending empty optional values (n8n defaults).
75
+ const isRequired = def.requiredFieldNames.includes(fieldName);
76
+ if (!isRequired) {
77
+ if (value === '' || value === null || value === undefined)
78
+ continue;
79
+ if (typeof value === 'number' && value === 0)
80
+ continue;
81
+ if (typeof value === 'boolean' && value === false)
82
+ continue;
83
+ }
84
+ input[fieldName] = value;
85
+ }
86
+ // Validate required fields are present (avoid confusing API errors).
87
+ for (const fieldName of def.requiredFieldNames) {
88
+ const value = input[fieldName];
89
+ if (value === undefined || value === null || value === '') {
90
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `${fieldName} is required`);
91
+ }
92
+ if (typeof value === 'number' && value <= 0) {
93
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `${fieldName} must be a positive number`);
94
+ }
95
+ }
96
+ const url = (0, ClientifyApiCatalog_1.renderPathTemplate)(def.pathTemplate, input);
97
+ const rest = (0, ClientifyApiCatalog_1.omitKeys)(input, def.pathParamNames);
98
+ const isQueryMethod = def.method === 'GET' || def.method === 'DELETE';
99
+ const params = isQueryMethod ? Object.assign(Object.assign({}, def.fixedQuery), rest) : undefined;
100
+ const data = !isQueryMethod && Object.keys(rest).length > 0 ? rest : undefined;
101
+ const result = await http.request({
102
+ method: def.method,
103
+ url,
104
+ params,
105
+ data,
106
+ });
107
+ const normalized = result === undefined || result === null || result === ''
108
+ ? { ok: true }
109
+ : typeof result === 'object'
110
+ ? result
111
+ : { data: result };
112
+ returnData.push({
113
+ json: Object.assign(Object.assign({}, normalized), { _meta: {
114
+ operation,
115
+ method: def.method,
116
+ path: url,
117
+ } }),
118
+ pairedItem: itemIndex,
119
+ });
120
+ }
121
+ catch (error) {
122
+ if (this.continueOnFail()) {
123
+ returnData.push({
124
+ json: {
125
+ success: false,
126
+ operation,
127
+ error: error instanceof Error ? error.message : String(error),
128
+ },
129
+ pairedItem: itemIndex,
130
+ });
131
+ continue;
132
+ }
133
+ throw error;
134
+ }
135
+ }
136
+ return [returnData];
137
+ }
138
+ }
139
+ exports.ClientifyApi = ClientifyApi;
@@ -0,0 +1,23 @@
1
+ import { INodeProperties } from 'n8n-workflow';
2
+ export type ClientifyHttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
3
+ export interface ClientifyOperationDefinition {
4
+ operation: string;
5
+ label: string;
6
+ description: string;
7
+ method: ClientifyHttpMethod;
8
+ pathTemplate: string;
9
+ pathParamNames: string[];
10
+ fixedQuery: Record<string, unknown>;
11
+ fieldNames: string[];
12
+ requiredFieldNames: string[];
13
+ fieldDefaults: Record<string, unknown>;
14
+ }
15
+ export declare const operationDefinitions: Record<string, ClientifyOperationDefinition>;
16
+ export declare const operationOptions: {
17
+ name: string;
18
+ value: string;
19
+ description: string;
20
+ }[];
21
+ export declare const operationFields: INodeProperties[];
22
+ export declare function renderPathTemplate(pathTemplate: string, input: Record<string, unknown>): string;
23
+ export declare function omitKeys<T extends Record<string, unknown>>(obj: T, keys: string[]): Record<string, unknown>;
@@ -0,0 +1,217 @@
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.operationFields = exports.operationOptions = exports.operationDefinitions = void 0;
7
+ exports.renderPathTemplate = renderPathTemplate;
8
+ exports.omitKeys = omitKeys;
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const path_1 = __importDefault(require("path"));
11
+ function safeReadJson(filePath) {
12
+ try {
13
+ return JSON.parse(fs_1.default.readFileSync(filePath, 'utf8'));
14
+ }
15
+ catch (_a) {
16
+ return null;
17
+ }
18
+ }
19
+ function extractMethodAndPath(jsSource) {
20
+ var _a;
21
+ const methodMatch = jsSource.match(/\bmethod:\s*'([A-Z]+)'\s*,/);
22
+ const pathMatch = jsSource.match(/\bpath:\s*(?:'([^']+)'|\"([^\"]+)\"|`([^`]+)`)\s*,?/);
23
+ const rawMethod = methodMatch === null || methodMatch === void 0 ? void 0 : methodMatch[1];
24
+ const pathTemplate = (_a = ((pathMatch === null || pathMatch === void 0 ? void 0 : pathMatch[1]) || (pathMatch === null || pathMatch === void 0 ? void 0 : pathMatch[2]) || (pathMatch === null || pathMatch === void 0 ? void 0 : pathMatch[3]))) === null || _a === void 0 ? void 0 : _a.trim();
25
+ if (!rawMethod || !pathTemplate)
26
+ return null;
27
+ if (!['GET', 'POST', 'PUT', 'PATCH', 'DELETE'].includes(rawMethod))
28
+ return null;
29
+ return { method: rawMethod, pathTemplate };
30
+ }
31
+ function extractFixedQuery(jsSource) {
32
+ // We only extract simple, literal query values (e.g. GetCurrentUser sets `fields: 'id,email'`).
33
+ const queryBlock = jsSource.match(/\bquery:\s*\{([\s\S]*?)\}\s*,/);
34
+ if (!queryBlock)
35
+ return {};
36
+ const content = queryBlock[1];
37
+ const out = {};
38
+ const fieldsMatch = content.match(/\bfields:\s*'([^']+)'/) || content.match(/\bfields:\s*\"([^\"]+)\"/);
39
+ if (fieldsMatch)
40
+ out.fields = fieldsMatch[1];
41
+ return out;
42
+ }
43
+ function getPathParamNames(pathTemplate) {
44
+ var _a;
45
+ const names = new Set();
46
+ const re = /\$\{([^}]+)\}/g;
47
+ let match;
48
+ while ((match = re.exec(pathTemplate))) {
49
+ const expr = (_a = match[1]) === null || _a === void 0 ? void 0 : _a.trim();
50
+ if (expr && /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(expr)) {
51
+ names.add(expr);
52
+ }
53
+ }
54
+ return Array.from(names);
55
+ }
56
+ function mapInspectorTypeToN8nType(type) {
57
+ if (type === 'number')
58
+ return 'number';
59
+ if (type === 'toggle')
60
+ return 'boolean';
61
+ return 'string';
62
+ }
63
+ function loadAppmixerFieldsModule() {
64
+ try {
65
+ // In dist, we copy `appmixer/clientify/crm` to `dist/appmixer/clientify/crm`.
66
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
67
+ return require(path_1.default.resolve(__dirname, '../../appmixer/clientify/crm/fields.js'));
68
+ }
69
+ catch (_a) {
70
+ return null;
71
+ }
72
+ }
73
+ function getDefaultFieldsValue(operation, pathTemplate) {
74
+ var _a, _b, _c, _d, _e, _f, _g, _h;
75
+ const fields = loadAppmixerFieldsModule();
76
+ if (!fields)
77
+ return undefined;
78
+ const isContact = pathTemplate.startsWith('/contacts/');
79
+ const isCompany = pathTemplate.startsWith('/companies/');
80
+ const isTask = pathTemplate.startsWith('/tasks/');
81
+ const isUser = pathTemplate.startsWith('/users/');
82
+ if (operation === 'ListContacts' && isContact)
83
+ return (_a = fields.contacts) === null || _a === void 0 ? void 0 : _a.list;
84
+ if (operation === 'GetContact' && isContact)
85
+ return (_b = fields.contacts) === null || _b === void 0 ? void 0 : _b.detail;
86
+ if (operation === 'ListCompanies' && isCompany)
87
+ return (_c = fields.companies) === null || _c === void 0 ? void 0 : _c.list;
88
+ if (operation === 'SearchCompanies' && isCompany)
89
+ return (_d = fields.companies) === null || _d === void 0 ? void 0 : _d.list;
90
+ if (operation === 'GetCompany' && isCompany)
91
+ return (_e = fields.companies) === null || _e === void 0 ? void 0 : _e.detail;
92
+ if (operation === 'ListTasks' && isTask)
93
+ return (_f = fields.tasks) === null || _f === void 0 ? void 0 : _f.list;
94
+ if (operation === 'GetTask' && isTask)
95
+ return (_g = fields.tasks) === null || _g === void 0 ? void 0 : _g.detail;
96
+ if (operation === 'ListUsers' && isUser)
97
+ return (_h = fields.users) === null || _h === void 0 ? void 0 : _h.list;
98
+ return undefined;
99
+ }
100
+ function discoverOperations() {
101
+ var _a, _b, _c, _d, _e, _f, _g;
102
+ const catalog = {};
103
+ const crmDir = path_1.default.resolve(__dirname, '../../appmixer/clientify/crm');
104
+ if (!fs_1.default.existsSync(crmDir)) {
105
+ // Don’t throw — allow n8n to boot, but the node will have no operations.
106
+ // eslint-disable-next-line no-console
107
+ console.warn(`[Clientify n8n] Missing AppMixer CRM catalog at ${crmDir}.`);
108
+ return catalog;
109
+ }
110
+ const entries = fs_1.default.readdirSync(crmDir, { withFileTypes: true }).filter((d) => d.isDirectory());
111
+ for (const entry of entries) {
112
+ const operation = entry.name;
113
+ const componentPath = path_1.default.join(crmDir, operation, 'component.json');
114
+ const jsPath = path_1.default.join(crmDir, operation, `${operation}.js`);
115
+ const componentJson = safeReadJson(componentPath);
116
+ if (!componentJson || !fs_1.default.existsSync(jsPath))
117
+ continue;
118
+ const jsSource = fs_1.default.readFileSync(jsPath, 'utf8');
119
+ const methodAndPath = extractMethodAndPath(jsSource);
120
+ if (!methodAndPath)
121
+ continue;
122
+ const fixedQuery = extractFixedQuery(jsSource);
123
+ const inPort = (_b = (_a = componentJson.inPorts) === null || _a === void 0 ? void 0 : _a.find((p) => (p === null || p === void 0 ? void 0 : p.name) === 'in')) !== null && _b !== void 0 ? _b : (_c = componentJson.inPorts) === null || _c === void 0 ? void 0 : _c[0];
124
+ const requiredFieldNames = ((_e = (_d = inPort === null || inPort === void 0 ? void 0 : inPort.schema) === null || _d === void 0 ? void 0 : _d.required) !== null && _e !== void 0 ? _e : []).filter((k) => typeof k === 'string');
125
+ const inspectorInputs = (_g = (_f = inPort === null || inPort === void 0 ? void 0 : inPort.inspector) === null || _f === void 0 ? void 0 : _f.inputs) !== null && _g !== void 0 ? _g : {};
126
+ const sortedFieldEntries = Object.entries(inspectorInputs).sort((a, b) => {
127
+ var _a, _b, _c, _d;
128
+ const ai = (_b = (_a = a[1]) === null || _a === void 0 ? void 0 : _a.index) !== null && _b !== void 0 ? _b : 9999;
129
+ const bi = (_d = (_c = b[1]) === null || _c === void 0 ? void 0 : _c.index) !== null && _d !== void 0 ? _d : 9999;
130
+ return ai - bi;
131
+ });
132
+ const fieldNames = sortedFieldEntries.map(([key]) => key);
133
+ const pathParamNames = getPathParamNames(methodAndPath.pathTemplate);
134
+ const fieldDefaults = {};
135
+ if (fieldNames.includes('fields')) {
136
+ const defaultFields = getDefaultFieldsValue(operation, methodAndPath.pathTemplate);
137
+ if (defaultFields)
138
+ fieldDefaults.fields = defaultFields;
139
+ }
140
+ catalog[operation] = {
141
+ operation,
142
+ label: componentJson.label || operation,
143
+ description: componentJson.description || '',
144
+ method: methodAndPath.method,
145
+ pathTemplate: methodAndPath.pathTemplate,
146
+ pathParamNames,
147
+ fixedQuery,
148
+ fieldNames,
149
+ requiredFieldNames,
150
+ fieldDefaults,
151
+ };
152
+ }
153
+ return catalog;
154
+ }
155
+ exports.operationDefinitions = discoverOperations();
156
+ exports.operationOptions = Object.values(exports.operationDefinitions)
157
+ .sort((a, b) => a.label.localeCompare(b.label))
158
+ .map((def) => ({
159
+ name: def.label,
160
+ value: def.operation,
161
+ description: def.description,
162
+ }));
163
+ exports.operationFields = (() => {
164
+ var _a, _b, _c, _d, _e, _f;
165
+ const fields = [];
166
+ for (const def of Object.values(exports.operationDefinitions)) {
167
+ const crmDir = path_1.default.resolve(__dirname, '../../appmixer/clientify/crm');
168
+ const componentPath = path_1.default.join(crmDir, def.operation, 'component.json');
169
+ const componentJson = safeReadJson(componentPath);
170
+ const inPort = (_b = (_a = componentJson === null || componentJson === void 0 ? void 0 : componentJson.inPorts) === null || _a === void 0 ? void 0 : _a.find((p) => (p === null || p === void 0 ? void 0 : p.name) === 'in')) !== null && _b !== void 0 ? _b : (_c = componentJson === null || componentJson === void 0 ? void 0 : componentJson.inPorts) === null || _c === void 0 ? void 0 : _c[0];
171
+ const inspectorInputs = (_e = (_d = inPort === null || inPort === void 0 ? void 0 : inPort.inspector) === null || _d === void 0 ? void 0 : _d.inputs) !== null && _e !== void 0 ? _e : {};
172
+ const sortedFieldEntries = Object.entries(inspectorInputs).sort((a, b) => {
173
+ var _a, _b, _c, _d;
174
+ const ai = (_b = (_a = a[1]) === null || _a === void 0 ? void 0 : _a.index) !== null && _b !== void 0 ? _b : 9999;
175
+ const bi = (_d = (_c = b[1]) === null || _c === void 0 ? void 0 : _c.index) !== null && _d !== void 0 ? _d : 9999;
176
+ return ai - bi;
177
+ });
178
+ for (const [fieldName, inputDef] of sortedFieldEntries) {
179
+ const isRequired = def.requiredFieldNames.includes(fieldName);
180
+ const n8nType = mapInspectorTypeToN8nType(inputDef === null || inputDef === void 0 ? void 0 : inputDef.type);
181
+ const defaultValue = (_f = def.fieldDefaults[fieldName]) !== null && _f !== void 0 ? _f : (n8nType === 'number' ? 0 : n8nType === 'boolean' ? false : '');
182
+ fields.push({
183
+ displayName: (inputDef === null || inputDef === void 0 ? void 0 : inputDef.label) || fieldName,
184
+ name: fieldName,
185
+ type: n8nType,
186
+ default: defaultValue,
187
+ required: isRequired,
188
+ description: (inputDef === null || inputDef === void 0 ? void 0 : inputDef.tooltip) || '',
189
+ displayOptions: {
190
+ show: {
191
+ operation: [def.operation],
192
+ },
193
+ },
194
+ });
195
+ }
196
+ }
197
+ return fields;
198
+ })();
199
+ function renderPathTemplate(pathTemplate, input) {
200
+ return pathTemplate.replace(/\$\{([^}]+)\}/g, (_m, expr) => {
201
+ const key = String(expr).trim();
202
+ const value = input[key];
203
+ if (value === undefined || value === null)
204
+ return '';
205
+ return encodeURIComponent(String(value));
206
+ });
207
+ }
208
+ function omitKeys(obj, keys) {
209
+ const omit = new Set(keys);
210
+ const out = {};
211
+ for (const [k, v] of Object.entries(obj)) {
212
+ if (omit.has(k))
213
+ continue;
214
+ out[k] = v;
215
+ }
216
+ return out;
217
+ }
@@ -1,5 +1,5 @@
1
1
  import { IWebhookFunctions, INodeType, INodeTypeDescription, IWebhookResponseData } from 'n8n-workflow';
2
- export declare class ClientifyMcpTrigger implements INodeType {
2
+ export declare class ClientifyTrigger implements INodeType {
3
3
  description: INodeTypeDescription;
4
4
  webhook(this: IWebhookFunctions): Promise<IWebhookResponseData>;
5
5
  }
@@ -1,27 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ClientifyMcpTrigger = void 0;
4
- class ClientifyMcpTrigger {
3
+ exports.ClientifyTrigger = void 0;
4
+ class ClientifyTrigger {
5
5
  constructor() {
6
6
  this.description = {
7
7
  displayName: 'Clientify Trigger',
8
- name: 'clientifyMcpTrigger',
8
+ name: 'clientifyTrigger',
9
9
  icon: 'file:clientify.svg',
10
10
  group: ['trigger'],
11
11
  version: 1,
12
12
  subtitle: '={{$parameter["event"]}}',
13
- description: 'Starts workflow when Clientify CRM events occur',
13
+ description: 'Starts workflow when a Clientify webhook payload is received',
14
14
  defaults: {
15
15
  name: 'Clientify Trigger',
16
16
  },
17
17
  inputs: [],
18
- outputs: ["main" /* NodeConnectionType.Main */],
19
- credentials: [
20
- {
21
- name: 'clientifyMcpApi',
22
- required: true,
23
- },
24
- ],
18
+ outputs: ['main'],
25
19
  webhooks: [
26
20
  {
27
21
  name: 'default',
@@ -210,4 +204,4 @@ class ClientifyMcpTrigger {
210
204
  };
211
205
  }
212
206
  }
213
- exports.ClientifyMcpTrigger = ClientifyMcpTrigger;
207
+ exports.ClientifyTrigger = ClientifyTrigger;
@@ -0,0 +1,5 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 60" fill="none">
2
+ <rect width="60" height="60" rx="8" fill="#4A90E2"/>
3
+ <path d="M30 15C22.268 15 16 21.268 16 29C16 36.732 22.268 43 30 43C37.732 43 44 36.732 44 29C44 21.268 37.732 15 30 15ZM30 19C35.523 19 40 23.477 40 29C40 34.523 35.523 39 30 39C24.477 39 20 34.523 20 29C20 23.477 24.477 19 30 19Z" fill="white"/>
4
+ <path d="M30 23C26.686 23 24 25.686 24 29C24 32.314 26.686 35 30 35C33.314 35 36 32.314 36 29C36 25.686 33.314 23 30 23Z" fill="white"/>
5
+ </svg>
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n8n-nodes-clientify",
3
- "version": "0.2.4",
3
+ "version": "0.2.5",
4
4
  "description": "N8N node for Clientify CRM integration",
5
5
  "keywords": [
6
6
  "n8n-node",
@@ -23,7 +23,7 @@
23
23
  },
24
24
  "main": "index.js",
25
25
  "scripts": {
26
- "build": "rm -rf dist && tsc && cp package.json dist/ && cp README.md dist/ && cp TRIGGERS_REFERENCE.md dist/ && cp nodes/ClientifyMcp/*.png dist/nodes/ClientifyMcp/ 2>/dev/null || true && cp nodes/ClientifyMcp/*.svg dist/nodes/ClientifyMcp/ 2>/dev/null || true",
26
+ "build": "rm -rf dist && tsc && cp package.json dist/ && cp README.md dist/ && cp TRIGGERS_REFERENCE.md dist/ && mkdir -p dist/nodes/ClientifyApi dist/nodes/ClientifyTrigger && cp nodes/ClientifyMcp/*.png dist/nodes/ClientifyApi/ 2>/dev/null || true && cp nodes/ClientifyMcp/*.svg dist/nodes/ClientifyApi/ 2>/dev/null || true && cp nodes/ClientifyMcp/*.png dist/nodes/ClientifyTrigger/ 2>/dev/null || true && cp nodes/ClientifyMcp/*.svg dist/nodes/ClientifyTrigger/ 2>/dev/null || true && mkdir -p dist/appmixer/clientify && cp -R appmixer/clientify/crm dist/appmixer/clientify/",
27
27
  "dev": "tsc --watch",
28
28
  "lint": "eslint nodes credentials --ext .ts",
29
29
  "lintfix": "eslint nodes credentials --ext .ts --fix",
@@ -35,13 +35,19 @@
35
35
  "n8n": {
36
36
  "n8nNodesApiVersion": 1,
37
37
  "credentials": [
38
- "dist/credentials/ClientifyMcpApi.credentials.js"
38
+ "dist/credentials/ClientifyApi.credentials.js"
39
39
  ],
40
40
  "nodes": [
41
- "dist/nodes/ClientifyMcp/ClientifyMcpDynamic.node.js",
42
- "dist/nodes/ClientifyMcp/ClientifyMcpTrigger.node.js"
41
+ "dist/nodes/ClientifyApi/ClientifyApi.node.js",
42
+ "dist/nodes/ClientifyTrigger/ClientifyTrigger.node.js"
43
43
  ]
44
44
  },
45
+ "dependencies": {
46
+ "@clientify/api-client": "^0.1.1"
47
+ },
48
+ "overrides": {
49
+ "form-data": "^4.0.4"
50
+ },
45
51
  "devDependencies": {
46
52
  "@types/node": "^20.0.0",
47
53
  "@typescript-eslint/eslint-plugin": "^5.45.0",
@@ -49,8 +55,9 @@
49
55
  "eslint": "^8.28.0",
50
56
  "eslint-config-prettier": "^8.5.0",
51
57
  "eslint-plugin-n8n-nodes-base": "^1.11.0",
58
+ "n8n-workflow": "^2.2.1",
52
59
  "prettier": "^2.8.0",
53
- "typescript": "^4.9.3"
60
+ "typescript": "^5.6.3"
54
61
  },
55
62
  "peerDependencies": {
56
63
  "n8n-workflow": "*"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n8n-nodes-clientify",
3
- "version": "0.2.4",
3
+ "version": "0.2.5",
4
4
  "description": "N8N node for Clientify CRM integration",
5
5
  "keywords": [
6
6
  "n8n-node",
@@ -23,7 +23,7 @@
23
23
  },
24
24
  "main": "index.js",
25
25
  "scripts": {
26
- "build": "rm -rf dist && tsc && cp package.json dist/ && cp README.md dist/ && cp TRIGGERS_REFERENCE.md dist/ && cp nodes/ClientifyMcp/*.png dist/nodes/ClientifyMcp/ 2>/dev/null || true && cp nodes/ClientifyMcp/*.svg dist/nodes/ClientifyMcp/ 2>/dev/null || true",
26
+ "build": "rm -rf dist && tsc && cp package.json dist/ && cp README.md dist/ && cp TRIGGERS_REFERENCE.md dist/ && mkdir -p dist/nodes/ClientifyApi dist/nodes/ClientifyTrigger && cp nodes/ClientifyMcp/*.png dist/nodes/ClientifyApi/ 2>/dev/null || true && cp nodes/ClientifyMcp/*.svg dist/nodes/ClientifyApi/ 2>/dev/null || true && cp nodes/ClientifyMcp/*.png dist/nodes/ClientifyTrigger/ 2>/dev/null || true && cp nodes/ClientifyMcp/*.svg dist/nodes/ClientifyTrigger/ 2>/dev/null || true && mkdir -p dist/appmixer/clientify && cp -R appmixer/clientify/crm dist/appmixer/clientify/",
27
27
  "dev": "tsc --watch",
28
28
  "lint": "eslint nodes credentials --ext .ts",
29
29
  "lintfix": "eslint nodes credentials --ext .ts --fix",
@@ -35,13 +35,19 @@
35
35
  "n8n": {
36
36
  "n8nNodesApiVersion": 1,
37
37
  "credentials": [
38
- "dist/credentials/ClientifyMcpApi.credentials.js"
38
+ "dist/credentials/ClientifyApi.credentials.js"
39
39
  ],
40
40
  "nodes": [
41
- "dist/nodes/ClientifyMcp/ClientifyMcpDynamic.node.js",
42
- "dist/nodes/ClientifyMcp/ClientifyMcpTrigger.node.js"
41
+ "dist/nodes/ClientifyApi/ClientifyApi.node.js",
42
+ "dist/nodes/ClientifyTrigger/ClientifyTrigger.node.js"
43
43
  ]
44
44
  },
45
+ "dependencies": {
46
+ "@clientify/api-client": "^0.1.1"
47
+ },
48
+ "overrides": {
49
+ "form-data": "^4.0.4"
50
+ },
45
51
  "devDependencies": {
46
52
  "@types/node": "^20.0.0",
47
53
  "@typescript-eslint/eslint-plugin": "^5.45.0",
@@ -49,8 +55,9 @@
49
55
  "eslint": "^8.28.0",
50
56
  "eslint-config-prettier": "^8.5.0",
51
57
  "eslint-plugin-n8n-nodes-base": "^1.11.0",
58
+ "n8n-workflow": "^2.2.1",
52
59
  "prettier": "^2.8.0",
53
- "typescript": "^4.9.3"
60
+ "typescript": "^5.6.3"
54
61
  },
55
62
  "peerDependencies": {
56
63
  "n8n-workflow": "*"
@@ -1,25 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ClientifyMcpApi = void 0;
4
- class ClientifyMcpApi {
5
- constructor() {
6
- this.name = 'clientifyMcpApi';
7
- this.displayName = 'Clientify MCP API';
8
- this.documentationUrl = 'https://mcp.clientify.com/docs';
9
- this.properties = [
10
- {
11
- displayName: 'Authentication Token',
12
- name: 'authToken',
13
- type: 'string',
14
- typeOptions: {
15
- password: true,
16
- },
17
- default: '',
18
- required: true,
19
- placeholder: 'Enter your JWT token',
20
- description: 'The x-end-user-token for authentication with Clientify MCP server',
21
- },
22
- ];
23
- }
24
- }
25
- exports.ClientifyMcpApi = ClientifyMcpApi;