@app-connect/core 1.7.24 → 1.7.26
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/.env.test +5 -5
- package/README.md +441 -441
- package/connector/developerPortal.js +31 -42
- package/connector/mock.js +84 -77
- package/connector/proxy/engine.js +164 -163
- package/connector/proxy/index.js +500 -500
- package/connector/registry.js +252 -252
- package/docs/README.md +50 -50
- package/docs/architecture.md +93 -93
- package/docs/connectors.md +116 -117
- package/docs/handlers.md +125 -125
- package/docs/libraries.md +101 -101
- package/docs/models.md +144 -144
- package/docs/routes.md +115 -115
- package/docs/tests.md +73 -73
- package/handlers/admin.js +523 -523
- package/handlers/appointment.js +193 -0
- package/handlers/auth.js +296 -296
- package/handlers/calldown.js +99 -99
- package/handlers/contact.js +280 -280
- package/handlers/disposition.js +82 -80
- package/handlers/log.js +984 -973
- package/handlers/managedAuth.js +446 -446
- package/handlers/plugin.js +208 -208
- package/handlers/user.js +142 -142
- package/index.js +3140 -2652
- package/jest.config.js +56 -56
- package/lib/analytics.js +54 -54
- package/lib/authSession.js +109 -109
- package/lib/cacheCleanup.js +21 -0
- package/lib/callLogComposer.js +898 -898
- package/lib/callLogLookup.js +34 -0
- package/lib/constants.js +8 -8
- package/lib/debugTracer.js +177 -177
- package/lib/encode.js +30 -30
- package/lib/errorHandler.js +218 -206
- package/lib/generalErrorMessage.js +41 -41
- package/lib/jwt.js +18 -18
- package/lib/logger.js +190 -190
- package/lib/migrateCallLogsSchema.js +116 -0
- package/lib/ringcentral.js +266 -266
- package/lib/s3ErrorLogReport.js +65 -65
- package/lib/sharedSMSComposer.js +471 -471
- package/lib/util.js +67 -67
- package/mcp/README.md +412 -395
- package/mcp/lib/validator.js +91 -91
- package/mcp/mcpHandler.js +425 -425
- package/mcp/tools/cancelAppointment.js +101 -0
- package/mcp/tools/checkAuthStatus.js +105 -105
- package/mcp/tools/confirmAppointment.js +101 -0
- package/mcp/tools/createAppointment.js +157 -0
- package/mcp/tools/createCallLog.js +327 -316
- package/mcp/tools/createContact.js +117 -117
- package/mcp/tools/createMessageLog.js +287 -287
- package/mcp/tools/doAuth.js +60 -60
- package/mcp/tools/findContactByName.js +93 -93
- package/mcp/tools/findContactByPhone.js +101 -101
- package/mcp/tools/getCallLog.js +111 -102
- package/mcp/tools/getGoogleFilePicker.js +99 -99
- package/mcp/tools/getHelp.js +43 -43
- package/mcp/tools/getPublicConnectors.js +94 -94
- package/mcp/tools/getSessionInfo.js +90 -90
- package/mcp/tools/index.js +51 -41
- package/mcp/tools/listAppointments.js +163 -0
- package/mcp/tools/logout.js +96 -96
- package/mcp/tools/rcGetCallLogs.js +65 -65
- package/mcp/tools/updateAppointment.js +154 -0
- package/mcp/tools/updateCallLog.js +130 -126
- package/mcp/ui/App/App.tsx +358 -358
- package/mcp/ui/App/components/AuthInfoForm.tsx +113 -113
- package/mcp/ui/App/components/AuthSuccess.tsx +22 -22
- package/mcp/ui/App/components/ConnectorList.tsx +82 -82
- package/mcp/ui/App/components/DebugPanel.tsx +43 -43
- package/mcp/ui/App/components/OAuthConnect.tsx +270 -270
- package/mcp/ui/App/lib/callTool.ts +130 -130
- package/mcp/ui/App/lib/debugLog.ts +41 -41
- package/mcp/ui/App/lib/developerPortal.ts +111 -111
- package/mcp/ui/App/main.css +5 -5
- package/mcp/ui/App/root.tsx +13 -13
- package/mcp/ui/index.html +13 -13
- package/mcp/ui/package-lock.json +6356 -6356
- package/mcp/ui/package.json +25 -25
- package/mcp/ui/tsconfig.json +26 -26
- package/mcp/ui/vite.config.ts +16 -16
- package/models/accountDataModel.js +33 -33
- package/models/adminConfigModel.js +35 -35
- package/models/cacheModel.js +30 -26
- package/models/callDownListModel.js +34 -34
- package/models/callLogModel.js +33 -27
- package/models/dynamo/connectorSchema.js +146 -146
- package/models/dynamo/lockSchema.js +24 -24
- package/models/dynamo/noteCacheSchema.js +29 -29
- package/models/llmSessionModel.js +17 -17
- package/models/messageLogModel.js +25 -25
- package/models/sequelize.js +16 -16
- package/models/userModel.js +45 -45
- package/package.json +72 -72
- package/releaseNotes.json +1093 -1073
- package/test/connector/proxy/engine.test.js +126 -93
- package/test/connector/proxy/index.test.js +279 -279
- package/test/connector/proxy/sample.json +161 -161
- package/test/connector/registry.test.js +415 -415
- package/test/handlers/admin.test.js +616 -616
- package/test/handlers/auth.test.js +1018 -1015
- package/test/handlers/contact.test.js +1014 -1014
- package/test/handlers/log.test.js +1298 -1160
- package/test/handlers/managedAuth.test.js +458 -458
- package/test/handlers/plugin.test.js +380 -380
- package/test/index.test.js +105 -105
- package/test/lib/cacheCleanup.test.js +42 -0
- package/test/lib/callLogComposer.test.js +1231 -1231
- package/test/lib/debugTracer.test.js +328 -328
- package/test/lib/jwt.test.js +176 -176
- package/test/lib/logger.test.js +206 -206
- package/test/lib/oauth.test.js +359 -359
- package/test/lib/ringcentral.test.js +467 -467
- package/test/lib/sharedSMSComposer.test.js +1084 -1084
- package/test/lib/util.test.js +329 -329
- package/test/mcp/tools/checkAuthStatus.test.js +83 -82
- package/test/mcp/tools/createCallLog.test.js +436 -436
- package/test/mcp/tools/createContact.test.js +58 -58
- package/test/mcp/tools/createMessageLog.test.js +595 -595
- package/test/mcp/tools/doAuth.test.js +113 -113
- package/test/mcp/tools/findContactByName.test.js +275 -275
- package/test/mcp/tools/findContactByPhone.test.js +296 -296
- package/test/mcp/tools/getCallLog.test.js +298 -298
- package/test/mcp/tools/getGoogleFilePicker.test.js +281 -281
- package/test/mcp/tools/getPublicConnectors.test.js +107 -107
- package/test/mcp/tools/getSessionInfo.test.js +127 -127
- package/test/mcp/tools/logout.test.js +233 -233
- package/test/mcp/tools/rcGetCallLogs.test.js +56 -56
- package/test/mcp/tools/updateCallLog.test.js +360 -360
- package/test/models/accountDataModel.test.js +98 -98
- package/test/models/dynamo/connectorSchema.test.js +189 -189
- package/test/models/models.test.js +568 -539
- package/test/routes/managedAuthRoutes.test.js +104 -129
- package/test/setup.js +178 -178
package/mcp/tools/doAuth.js
CHANGED
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
const { createAuthSession } = require('../../lib/authSession');
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* MCP Tool: Do Authentication (widget-only)
|
|
5
|
-
*
|
|
6
|
-
* Creates a server-side OAuth session for the given sessionId.
|
|
7
|
-
* The widget generates the sessionId and authUri client-side for instant display,
|
|
8
|
-
* then calls this endpoint in the background to register the session in the DB
|
|
9
|
-
* so the OAuth callback can resolve it.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
const toolDefinition = {
|
|
13
|
-
name: 'doAuth',
|
|
14
|
-
description: 'Create a server-side OAuth session. Widget-only — not called by AI model.',
|
|
15
|
-
inputSchema: {
|
|
16
|
-
type: 'object',
|
|
17
|
-
properties: {
|
|
18
|
-
connectorName: {
|
|
19
|
-
type: 'string',
|
|
20
|
-
description: 'Connector platform name'
|
|
21
|
-
},
|
|
22
|
-
hostname: {
|
|
23
|
-
type: 'string',
|
|
24
|
-
description: 'Resolved hostname for the CRM instance'
|
|
25
|
-
}
|
|
26
|
-
},
|
|
27
|
-
required: ['connectorName']
|
|
28
|
-
},
|
|
29
|
-
annotations: {
|
|
30
|
-
readOnlyHint: false,
|
|
31
|
-
openWorldHint: false,
|
|
32
|
-
destructiveHint: false
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
async function execute(args) {
|
|
37
|
-
try {
|
|
38
|
-
const { sessionId, connectorName, hostname = '' } = args;
|
|
39
|
-
|
|
40
|
-
if (!sessionId || !connectorName) {
|
|
41
|
-
return { success: false, error: 'Missing required fields: sessionId, connectorName' };
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
await createAuthSession(sessionId, {
|
|
45
|
-
platform: connectorName,
|
|
46
|
-
hostname,
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
return { success: true };
|
|
50
|
-
} catch (error) {
|
|
51
|
-
return {
|
|
52
|
-
success: false,
|
|
53
|
-
error: error.message || 'Unknown error occurred',
|
|
54
|
-
errorDetails: error.stack,
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
exports.definition = toolDefinition;
|
|
60
|
-
exports.execute = execute;
|
|
1
|
+
const { createAuthSession } = require('../../lib/authSession');
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* MCP Tool: Do Authentication (widget-only)
|
|
5
|
+
*
|
|
6
|
+
* Creates a server-side OAuth session for the given sessionId.
|
|
7
|
+
* The widget generates the sessionId and authUri client-side for instant display,
|
|
8
|
+
* then calls this endpoint in the background to register the session in the DB
|
|
9
|
+
* so the OAuth callback can resolve it.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const toolDefinition = {
|
|
13
|
+
name: 'doAuth',
|
|
14
|
+
description: 'Create a server-side OAuth session. Widget-only — not called by AI model.',
|
|
15
|
+
inputSchema: {
|
|
16
|
+
type: 'object',
|
|
17
|
+
properties: {
|
|
18
|
+
connectorName: {
|
|
19
|
+
type: 'string',
|
|
20
|
+
description: 'Connector platform name'
|
|
21
|
+
},
|
|
22
|
+
hostname: {
|
|
23
|
+
type: 'string',
|
|
24
|
+
description: 'Resolved hostname for the CRM instance'
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
required: ['connectorName']
|
|
28
|
+
},
|
|
29
|
+
annotations: {
|
|
30
|
+
readOnlyHint: false,
|
|
31
|
+
openWorldHint: false,
|
|
32
|
+
destructiveHint: false
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
async function execute(args) {
|
|
37
|
+
try {
|
|
38
|
+
const { sessionId, connectorName, hostname = '' } = args;
|
|
39
|
+
|
|
40
|
+
if (!sessionId || !connectorName) {
|
|
41
|
+
return { success: false, error: 'Missing required fields: sessionId, connectorName' };
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
await createAuthSession(sessionId, {
|
|
45
|
+
platform: connectorName,
|
|
46
|
+
hostname,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
return { success: true };
|
|
50
|
+
} catch (error) {
|
|
51
|
+
return {
|
|
52
|
+
success: false,
|
|
53
|
+
error: error.message || 'Unknown error occurred',
|
|
54
|
+
errorDetails: error.stack,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
exports.definition = toolDefinition;
|
|
60
|
+
exports.execute = execute;
|
|
@@ -1,93 +1,93 @@
|
|
|
1
|
-
const jwt = require('../../lib/jwt');
|
|
2
|
-
const connectorRegistry = require('../../connector/registry');
|
|
3
|
-
const contactCore = require('../../handlers/contact');
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* MCP Tool: Find Contact With Name
|
|
7
|
-
*
|
|
8
|
-
* This tool searches for a contact in the CRM platform by name.
|
|
9
|
-
* It uses the platform-specific connector to find matching contacts.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
const toolDefinition = {
|
|
13
|
-
name: 'findContactByName',
|
|
14
|
-
description: '⚠️ REQUIRES CRM CONNECTION. | Search for a contact in the CRM platform by name. Returns contact details if found.',
|
|
15
|
-
inputSchema: {
|
|
16
|
-
type: 'object',
|
|
17
|
-
properties: {
|
|
18
|
-
name: {
|
|
19
|
-
type: 'string',
|
|
20
|
-
description: 'Name to search for'
|
|
21
|
-
}
|
|
22
|
-
},
|
|
23
|
-
required: ['name']
|
|
24
|
-
},
|
|
25
|
-
annotations: {
|
|
26
|
-
readOnlyHint: true,
|
|
27
|
-
openWorldHint: true,
|
|
28
|
-
destructiveHint: false
|
|
29
|
-
}
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Execute the findContactByName tool
|
|
34
|
-
* @param {Object} args - The tool arguments
|
|
35
|
-
* @param {string} args.name - Name to search for
|
|
36
|
-
* @returns {Object} Result object with contact information
|
|
37
|
-
*/
|
|
38
|
-
async function execute(args) {
|
|
39
|
-
try {
|
|
40
|
-
const { name, jwtToken } = args;
|
|
41
|
-
if (!jwtToken) {
|
|
42
|
-
throw new Error('Not authenticated. Please connect to your CRM first.');
|
|
43
|
-
}
|
|
44
|
-
// Decode JWT to get userId and platform
|
|
45
|
-
const decodedToken = jwt.decodeJwt(jwtToken);
|
|
46
|
-
if (!decodedToken) {
|
|
47
|
-
throw new Error('Invalid JWT token');
|
|
48
|
-
}
|
|
49
|
-
const { id: userId, platform } = decodedToken;
|
|
50
|
-
|
|
51
|
-
if (!userId) {
|
|
52
|
-
throw new Error('Invalid JWT token: userId not found');
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
// Get the platform connector module
|
|
56
|
-
const platformModule = connectorRegistry.getConnector(platform);
|
|
57
|
-
|
|
58
|
-
if (!platformModule) {
|
|
59
|
-
throw new Error(`Platform connector not found for: ${platform}`);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// Check if findContactByName is implemented
|
|
63
|
-
if (!platformModule.findContactWithName) {
|
|
64
|
-
throw new Error(`findContactByName is not implemented for platform: ${platform}`);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// Call the findContactByName method
|
|
68
|
-
const { successful, returnMessage, contact } = await contactCore.findContactWithName({ platform, userId, name });
|
|
69
|
-
if (successful) {
|
|
70
|
-
return {
|
|
71
|
-
success: true,
|
|
72
|
-
data: contact,
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
else {
|
|
76
|
-
return {
|
|
77
|
-
success: false,
|
|
78
|
-
error: returnMessage.message,
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
catch (error) {
|
|
83
|
-
return {
|
|
84
|
-
success: false,
|
|
85
|
-
error: error.message || 'Unknown error occurred',
|
|
86
|
-
errorDetails: error.stack
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
exports.definition = toolDefinition;
|
|
92
|
-
exports.execute = execute;
|
|
93
|
-
|
|
1
|
+
const jwt = require('../../lib/jwt');
|
|
2
|
+
const connectorRegistry = require('../../connector/registry');
|
|
3
|
+
const contactCore = require('../../handlers/contact');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* MCP Tool: Find Contact With Name
|
|
7
|
+
*
|
|
8
|
+
* This tool searches for a contact in the CRM platform by name.
|
|
9
|
+
* It uses the platform-specific connector to find matching contacts.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const toolDefinition = {
|
|
13
|
+
name: 'findContactByName',
|
|
14
|
+
description: '⚠️ REQUIRES CRM CONNECTION. | Search for a contact in the CRM platform by name. Returns contact details if found.',
|
|
15
|
+
inputSchema: {
|
|
16
|
+
type: 'object',
|
|
17
|
+
properties: {
|
|
18
|
+
name: {
|
|
19
|
+
type: 'string',
|
|
20
|
+
description: 'Name to search for'
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
required: ['name']
|
|
24
|
+
},
|
|
25
|
+
annotations: {
|
|
26
|
+
readOnlyHint: true,
|
|
27
|
+
openWorldHint: true,
|
|
28
|
+
destructiveHint: false
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Execute the findContactByName tool
|
|
34
|
+
* @param {Object} args - The tool arguments
|
|
35
|
+
* @param {string} args.name - Name to search for
|
|
36
|
+
* @returns {Object} Result object with contact information
|
|
37
|
+
*/
|
|
38
|
+
async function execute(args) {
|
|
39
|
+
try {
|
|
40
|
+
const { name, jwtToken } = args;
|
|
41
|
+
if (!jwtToken) {
|
|
42
|
+
throw new Error('Not authenticated. Please connect to your CRM first.');
|
|
43
|
+
}
|
|
44
|
+
// Decode JWT to get userId and platform
|
|
45
|
+
const decodedToken = jwt.decodeJwt(jwtToken);
|
|
46
|
+
if (!decodedToken) {
|
|
47
|
+
throw new Error('Invalid JWT token');
|
|
48
|
+
}
|
|
49
|
+
const { id: userId, platform } = decodedToken;
|
|
50
|
+
|
|
51
|
+
if (!userId) {
|
|
52
|
+
throw new Error('Invalid JWT token: userId not found');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Get the platform connector module
|
|
56
|
+
const platformModule = connectorRegistry.getConnector(platform);
|
|
57
|
+
|
|
58
|
+
if (!platformModule) {
|
|
59
|
+
throw new Error(`Platform connector not found for: ${platform}`);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Check if findContactByName is implemented
|
|
63
|
+
if (!platformModule.findContactWithName) {
|
|
64
|
+
throw new Error(`findContactByName is not implemented for platform: ${platform}`);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Call the findContactByName method
|
|
68
|
+
const { successful, returnMessage, contact } = await contactCore.findContactWithName({ platform, userId, name });
|
|
69
|
+
if (successful) {
|
|
70
|
+
return {
|
|
71
|
+
success: true,
|
|
72
|
+
data: contact,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
return {
|
|
77
|
+
success: false,
|
|
78
|
+
error: returnMessage.message,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
return {
|
|
84
|
+
success: false,
|
|
85
|
+
error: error.message || 'Unknown error occurred',
|
|
86
|
+
errorDetails: error.stack
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
exports.definition = toolDefinition;
|
|
92
|
+
exports.execute = execute;
|
|
93
|
+
|
|
@@ -1,101 +1,101 @@
|
|
|
1
|
-
const jwt = require('../../lib/jwt');
|
|
2
|
-
const connectorRegistry = require('../../connector/registry');
|
|
3
|
-
const contactCore = require('../../handlers/contact');
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* MCP Tool: Find Contact
|
|
7
|
-
*
|
|
8
|
-
* This tool searches for a contact in the CRM platform by phone number.
|
|
9
|
-
* It uses the platform-specific connector to find matching contacts.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
const toolDefinition = {
|
|
13
|
-
name: 'findContactByPhone',
|
|
14
|
-
description: '⚠️ REQUIRES CRM CONNECTION. | Search for a contact in the CRM platform by phone number. Returns contact details if found.',
|
|
15
|
-
inputSchema: {
|
|
16
|
-
type: 'object',
|
|
17
|
-
properties: {
|
|
18
|
-
phoneNumber: {
|
|
19
|
-
type: 'string',
|
|
20
|
-
description: 'Phone number to search for, if not in E.164 format, convert it to E.164 format'
|
|
21
|
-
},
|
|
22
|
-
overridingFormat: {
|
|
23
|
-
type: 'string',
|
|
24
|
-
description: 'Overriding format to search for'
|
|
25
|
-
},
|
|
26
|
-
isExtension: {
|
|
27
|
-
type: 'boolean',
|
|
28
|
-
description: 'Whether the request is from an extension'
|
|
29
|
-
}
|
|
30
|
-
},
|
|
31
|
-
required: ['phoneNumber']
|
|
32
|
-
},
|
|
33
|
-
annotations: {
|
|
34
|
-
readOnlyHint: true,
|
|
35
|
-
openWorldHint: true,
|
|
36
|
-
destructiveHint: false
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Execute the findContactByPhone tool
|
|
42
|
-
* @param {Object} args - The tool arguments
|
|
43
|
-
* @param {string} args.jwtToken - JWT token with user and platform info
|
|
44
|
-
* @param {string} [args.phoneNumber] - Phone number to search for
|
|
45
|
-
* @param {string} [args.overridingFormat] - Overriding format to search for
|
|
46
|
-
* @param {string} [args.isExtension] - Whether the request is from an extension
|
|
47
|
-
* @returns {Object} Result object with contact information
|
|
48
|
-
*/
|
|
49
|
-
async function execute(args) {
|
|
50
|
-
try {
|
|
51
|
-
const { jwtToken, phoneNumber, overridingFormat, isExtension } = args;
|
|
52
|
-
|
|
53
|
-
// Decode JWT to get userId and platform
|
|
54
|
-
const decodedToken = jwt.decodeJwt(jwtToken);
|
|
55
|
-
if (!decodedToken) {
|
|
56
|
-
throw new Error('Invalid JWT token');
|
|
57
|
-
}
|
|
58
|
-
const { id: userId, platform } = decodedToken;
|
|
59
|
-
|
|
60
|
-
if (!userId) {
|
|
61
|
-
throw new Error('Invalid JWT token: userId not found');
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// Get the platform connector module
|
|
65
|
-
const platformModule = connectorRegistry.getConnector(platform);
|
|
66
|
-
|
|
67
|
-
if (!platformModule) {
|
|
68
|
-
throw new Error(`Platform connector not found for: ${platform}`);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// Check if findContactByPhone is implemented
|
|
72
|
-
if (!platformModule.findContact) {
|
|
73
|
-
throw new Error(`findContactByPhone is not implemented for platform: ${platform}`);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// Call the findContactByPhone method
|
|
77
|
-
const { successful, returnMessage, contact } = await contactCore.findContact({ platform, userId, phoneNumber, overridingFormat: overridingFormat ?? '', isExtension: isExtension ?? false });
|
|
78
|
-
if (successful) {
|
|
79
|
-
return {
|
|
80
|
-
success: true,
|
|
81
|
-
data: contact,
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
return {
|
|
86
|
-
success: false,
|
|
87
|
-
error: returnMessage.message,
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
catch (error) {
|
|
92
|
-
return {
|
|
93
|
-
success: false,
|
|
94
|
-
error: error.message || 'Unknown error occurred',
|
|
95
|
-
errorDetails: error.stack
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
exports.definition = toolDefinition;
|
|
101
|
-
exports.execute = execute;
|
|
1
|
+
const jwt = require('../../lib/jwt');
|
|
2
|
+
const connectorRegistry = require('../../connector/registry');
|
|
3
|
+
const contactCore = require('../../handlers/contact');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* MCP Tool: Find Contact
|
|
7
|
+
*
|
|
8
|
+
* This tool searches for a contact in the CRM platform by phone number.
|
|
9
|
+
* It uses the platform-specific connector to find matching contacts.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const toolDefinition = {
|
|
13
|
+
name: 'findContactByPhone',
|
|
14
|
+
description: '⚠️ REQUIRES CRM CONNECTION. | Search for a contact in the CRM platform by phone number. Returns contact details if found.',
|
|
15
|
+
inputSchema: {
|
|
16
|
+
type: 'object',
|
|
17
|
+
properties: {
|
|
18
|
+
phoneNumber: {
|
|
19
|
+
type: 'string',
|
|
20
|
+
description: 'Phone number to search for, if not in E.164 format, convert it to E.164 format'
|
|
21
|
+
},
|
|
22
|
+
overridingFormat: {
|
|
23
|
+
type: 'string',
|
|
24
|
+
description: 'Overriding format to search for'
|
|
25
|
+
},
|
|
26
|
+
isExtension: {
|
|
27
|
+
type: 'boolean',
|
|
28
|
+
description: 'Whether the request is from an extension'
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
required: ['phoneNumber']
|
|
32
|
+
},
|
|
33
|
+
annotations: {
|
|
34
|
+
readOnlyHint: true,
|
|
35
|
+
openWorldHint: true,
|
|
36
|
+
destructiveHint: false
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Execute the findContactByPhone tool
|
|
42
|
+
* @param {Object} args - The tool arguments
|
|
43
|
+
* @param {string} args.jwtToken - JWT token with user and platform info
|
|
44
|
+
* @param {string} [args.phoneNumber] - Phone number to search for
|
|
45
|
+
* @param {string} [args.overridingFormat] - Overriding format to search for
|
|
46
|
+
* @param {string} [args.isExtension] - Whether the request is from an extension
|
|
47
|
+
* @returns {Object} Result object with contact information
|
|
48
|
+
*/
|
|
49
|
+
async function execute(args) {
|
|
50
|
+
try {
|
|
51
|
+
const { jwtToken, phoneNumber, overridingFormat, isExtension } = args;
|
|
52
|
+
|
|
53
|
+
// Decode JWT to get userId and platform
|
|
54
|
+
const decodedToken = jwt.decodeJwt(jwtToken);
|
|
55
|
+
if (!decodedToken) {
|
|
56
|
+
throw new Error('Invalid JWT token');
|
|
57
|
+
}
|
|
58
|
+
const { id: userId, platform } = decodedToken;
|
|
59
|
+
|
|
60
|
+
if (!userId) {
|
|
61
|
+
throw new Error('Invalid JWT token: userId not found');
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Get the platform connector module
|
|
65
|
+
const platformModule = connectorRegistry.getConnector(platform);
|
|
66
|
+
|
|
67
|
+
if (!platformModule) {
|
|
68
|
+
throw new Error(`Platform connector not found for: ${platform}`);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Check if findContactByPhone is implemented
|
|
72
|
+
if (!platformModule.findContact) {
|
|
73
|
+
throw new Error(`findContactByPhone is not implemented for platform: ${platform}`);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Call the findContactByPhone method
|
|
77
|
+
const { successful, returnMessage, contact } = await contactCore.findContact({ platform, userId, phoneNumber, overridingFormat: overridingFormat ?? '', isExtension: isExtension ?? false });
|
|
78
|
+
if (successful) {
|
|
79
|
+
return {
|
|
80
|
+
success: true,
|
|
81
|
+
data: contact,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
return {
|
|
86
|
+
success: false,
|
|
87
|
+
error: returnMessage.message,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
return {
|
|
93
|
+
success: false,
|
|
94
|
+
error: error.message || 'Unknown error occurred',
|
|
95
|
+
errorDetails: error.stack
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
exports.definition = toolDefinition;
|
|
101
|
+
exports.execute = execute;
|