@carbonvoice/cv-mcp-server 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bootstrap.js +3 -0
- package/dist/carbon-voice.js +20 -0
- package/dist/config/env.js +28 -0
- package/dist/config/index.js +17 -0
- package/dist/constants.js +9 -0
- package/dist/generated/carbon-voice-api/CarbonVoiceSimplifiedAPI.zod.js +1416 -0
- package/dist/generated/carbon-voice-api.js +377 -0
- package/dist/generated/index.js +17 -0
- package/dist/generated/models/AIPrompt.js +2 -0
- package/dist/generated/models/AIPromptControllerGetPromptsOwnerType.js +87 -0
- package/dist/generated/models/AIPromptControllerGetPromptsParams.js +2 -0
- package/dist/generated/models/AIPromptOwnerType.js +87 -0
- package/dist/generated/models/AIPromptResponseFormat.js +86 -0
- package/dist/generated/models/AIPromptWithMessagesResponse.js +2 -0
- package/dist/generated/models/AIPromptWithMessagesResult.js +2 -0
- package/dist/generated/models/AIResponse.js +2 -0
- package/dist/generated/models/AIResponseControllerGetAllResponsesDirection.js +86 -0
- package/dist/generated/models/AIResponseControllerGetAllResponsesParams.js +2 -0
- package/dist/generated/models/AIShareLinkResponse.js +2 -0
- package/dist/generated/models/AddAttachmentsResponse.js +2 -0
- package/dist/generated/models/AddLinkAttachmentPayload.js +80 -0
- package/dist/generated/models/AddMessageToFolderPayload.js +80 -0
- package/dist/generated/models/AllConversationsResponse.js +2 -0
- package/dist/generated/models/App.js +2 -0
- package/dist/generated/models/AppWebhooksAuthenticationHeader.js +80 -0
- package/dist/generated/models/AppWebhooksUrlMode.js +86 -0
- package/dist/generated/models/AsyncConversationStats.js +2 -0
- package/dist/generated/models/Attachment.js +2 -0
- package/dist/generated/models/AttachmentLocation.js +80 -0
- package/dist/generated/models/AttachmentType.js +87 -0
- package/dist/generated/models/AudioModelV2.js +80 -0
- package/dist/generated/models/Conversation.js +2 -0
- package/dist/generated/models/ConversationResponse.js +2 -0
- package/dist/generated/models/ConversationResponseType.js +88 -0
- package/dist/generated/models/ConversationType.js +88 -0
- package/dist/generated/models/ConversationVisibility.js +87 -0
- package/dist/generated/models/CreateAIPrompt.js +2 -0
- package/dist/generated/models/CreateAIPromptOwnerType.js +87 -0
- package/dist/generated/models/CreateAIPromptResponseFormat.js +86 -0
- package/dist/generated/models/CreateAIResponse.js +80 -0
- package/dist/generated/models/CreateConversationMessage.js +2 -0
- package/dist/generated/models/CreateConversationMessageFromMessageType.js +87 -0
- package/dist/generated/models/CreateFolderPayload.js +2 -0
- package/dist/generated/models/CreateFolderPayloadType.js +86 -0
- package/dist/generated/models/CreateShareLinkAIResponse.js +80 -0
- package/dist/generated/models/CreateVoicememoMessage.js +80 -0
- package/dist/generated/models/Folder.js +2 -0
- package/dist/generated/models/FolderType.js +86 -0
- package/dist/generated/models/FolderWithMessages.js +2 -0
- package/dist/generated/models/GetAllRootFoldersParams.js +2 -0
- package/dist/generated/models/GetAllRootFoldersSortBy.js +87 -0
- package/dist/generated/models/GetAllRootFoldersSortDirection.js +86 -0
- package/dist/generated/models/GetAllRootFoldersType.js +86 -0
- package/dist/generated/models/GetByIdDirection.js +85 -0
- package/dist/generated/models/GetByIdParams.js +2 -0
- package/dist/generated/models/GetCountsGroupedByWorkspaceParams.js +2 -0
- package/dist/generated/models/GetCountsGroupedByWorkspaceType.js +86 -0
- package/dist/generated/models/GetFolderByIdDirection.js +86 -0
- package/dist/generated/models/GetFolderByIdParams.js +2 -0
- package/dist/generated/models/GetMessageByIdParams.js +80 -0
- package/dist/generated/models/GetMessageResponse.js +2 -0
- package/dist/generated/models/GetTenRecentAIPromptResponse.js +2 -0
- package/dist/generated/models/GetTenRecentMessagesResponse.js +2 -0
- package/dist/generated/models/GetTenRecentMessagesResponseParams.js +80 -0
- package/dist/generated/models/Label.js +2 -0
- package/dist/generated/models/LabelBehavior.js +87 -0
- package/dist/generated/models/LabelType.js +88 -0
- package/dist/generated/models/Language.js +2 -0
- package/dist/generated/models/ListCountFoldersGroupedByWorkspace.js +2 -0
- package/dist/generated/models/ListFoldersResponse.js +2 -0
- package/dist/generated/models/ListFoldersResponseSortBy.js +87 -0
- package/dist/generated/models/ListFoldersResponseSortDirection.js +86 -0
- package/dist/generated/models/ListFoldersResponseType.js +86 -0
- package/dist/generated/models/ListMessagesFilter.js +2 -0
- package/dist/generated/models/ListMessagesFilterType.js +89 -0
- package/dist/generated/models/ListMessagesParams.js +2 -0
- package/dist/generated/models/ListMessagesResponse.js +2 -0
- package/dist/generated/models/ListMessagesResponseSortDirection.js +86 -0
- package/dist/generated/models/ListMessagesSortDirection.js +86 -0
- package/dist/generated/models/ListMessagesType.js +89 -0
- package/dist/generated/models/Message.js +2 -0
- package/dist/generated/models/MessageStatus.js +95 -0
- package/dist/generated/models/MessageType.js +89 -0
- package/dist/generated/models/MessageV2.js +2 -0
- package/dist/generated/models/MessageV2AudioDelivery.js +86 -0
- package/dist/generated/models/MessageV2Status.js +95 -0
- package/dist/generated/models/MessageV2Type.js +89 -0
- package/dist/generated/models/MessageV2UsersCaughtUp.js +87 -0
- package/dist/generated/models/MessageV2UtmData.js +2 -0
- package/dist/generated/models/MoveFolderPayload.js +80 -0
- package/dist/generated/models/PromptResponse.js +2 -0
- package/dist/generated/models/ReactionSummary.js +2 -0
- package/dist/generated/models/ReactionSummaryReactionCounts.js +80 -0
- package/dist/generated/models/ResponseByLanguage.js +2 -0
- package/dist/generated/models/ResponseByLanguageJson.js +80 -0
- package/dist/generated/models/SearchUserParams.js +80 -0
- package/dist/generated/models/SearchUsersBody.js +80 -0
- package/dist/generated/models/SendDirectMessage.js +2 -0
- package/dist/generated/models/SendDirectMessageFromMessageType.js +87 -0
- package/dist/generated/models/SimplifiedAIPrompt.js +80 -0
- package/dist/generated/models/Stats.js +80 -0
- package/dist/generated/models/SubFolder.js +2 -0
- package/dist/generated/models/SubFolderType.js +86 -0
- package/dist/generated/models/SubscribeUserPayload.js +2 -0
- package/dist/generated/models/SubscribeUserPayloadSubscriptionsItem.js +116 -0
- package/dist/generated/models/SubscribedUser.js +2 -0
- package/dist/generated/models/SubscribedUserSubscriptionsItem.js +116 -0
- package/dist/generated/models/SubscriptionAction.js +2 -0
- package/dist/generated/models/SubscriptionActionActionId.js +85 -0
- package/dist/generated/models/SubscriptionActionEntityType.js +85 -0
- package/dist/generated/models/SubscriptionFilter.js +2 -0
- package/dist/generated/models/SubscriptionFilterOperator.js +87 -0
- package/dist/generated/models/SubscriptionFilterValue.js +80 -0
- package/dist/generated/models/TextModel.js +2 -0
- package/dist/generated/models/TextModelType.js +89 -0
- package/dist/generated/models/TimedText.js +80 -0
- package/dist/generated/models/ToRecipient.js +80 -0
- package/dist/generated/models/UpdateFolderNamePayload.js +80 -0
- package/dist/generated/models/User.js +80 -0
- package/dist/generated/models/UserReaction.js +80 -0
- package/dist/generated/models/UserStats.js +80 -0
- package/dist/generated/models/UsersNotAllowedReceiveNotifications.js +80 -0
- package/dist/generated/models/UsersNotAllowedReceiveNotificationsV2.js +80 -0
- package/dist/generated/models/UtmData.js +80 -0
- package/dist/generated/models/Voice.js +2 -0
- package/dist/generated/models/VoiceGender.js +86 -0
- package/dist/generated/models/VoiceQuality.js +87 -0
- package/dist/generated/models/VoiceType.js +88 -0
- package/dist/generated/models/WorkspaceBasicInfo.js +80 -0
- package/dist/generated/models/index.js +215 -0
- package/dist/index-v1.js +80 -0
- package/dist/interfaces/folder.interface.js +2 -0
- package/dist/interfaces/get-by-id.interface.js +2 -0
- package/dist/interfaces/index.js +20 -0
- package/dist/interfaces/mcp-tool-response.interface.js +2 -0
- package/dist/interfaces/message.interface.js +2 -0
- package/dist/schemas/index.js +17 -0
- package/dist/schemas/message.js +10 -0
- package/dist/server-delete.js +624 -0
- package/dist/server-test.js +93 -0
- package/dist/server.js +365 -0
- package/dist/sse.js +134 -0
- package/dist/sse.v2.js +29 -0
- package/dist/stdio.js +39 -0
- package/dist/utils/axios-instance.js +234 -0
- package/dist/utils/errors.js +22 -0
- package/dist/utils/format-to-mcp-tool-response.js +40 -0
- package/dist/utils/index.js +19 -0
- package/dist/utils/logger.js +111 -0
- package/dist/utils/zod-schema-transformer.js +66 -0
- package/dist/utils/zod-transformer.js +24 -0
- package/package.json +66 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// import express from 'express';
|
|
3
|
+
// import { randomUUID } from 'node:crypto';
|
|
4
|
+
// import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
5
|
+
// import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
6
|
+
// import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
7
|
+
// import { z } from 'zod';
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
// const app = express();
|
|
10
|
+
// app.use(express.json());
|
|
11
|
+
// // Map to store transports by session ID
|
|
12
|
+
// const transports: { [sessionId: string]: StreamableHTTPServerTransport } = {};
|
|
13
|
+
// // Handle POST requests for client-to-server communication
|
|
14
|
+
// app.post('/mcp', async (req, res) => {
|
|
15
|
+
// console.log('🚀 POST request received');
|
|
16
|
+
// // Check for existing session ID
|
|
17
|
+
// const sessionId = req.headers['mcp-session-id'] as string | undefined;
|
|
18
|
+
// let transport: StreamableHTTPServerTransport;
|
|
19
|
+
// if (sessionId && transports[sessionId]) {
|
|
20
|
+
// // Reuse existing transport
|
|
21
|
+
// transport = transports[sessionId];
|
|
22
|
+
// } else if (!sessionId && isInitializeRequest(req.body)) {
|
|
23
|
+
// // New initialization request
|
|
24
|
+
// transport = new StreamableHTTPServerTransport({
|
|
25
|
+
// sessionIdGenerator: () => randomUUID(),
|
|
26
|
+
// onsessioninitialized: (sessionId) => {
|
|
27
|
+
// // Store the transport by session ID
|
|
28
|
+
// transports[sessionId] = transport;
|
|
29
|
+
// },
|
|
30
|
+
// });
|
|
31
|
+
// // Clean up transport when closed
|
|
32
|
+
// transport.onclose = () => {
|
|
33
|
+
// if (transport.sessionId) {
|
|
34
|
+
// console.log('🚀 Disconnecting from MCP server');
|
|
35
|
+
// delete transports[transport.sessionId];
|
|
36
|
+
// }
|
|
37
|
+
// };
|
|
38
|
+
// const server = new McpServer({
|
|
39
|
+
// name: 'example-server',
|
|
40
|
+
// version: '1.0.0',
|
|
41
|
+
// });
|
|
42
|
+
// // ... set up server resources, tools, and prompts ...
|
|
43
|
+
// server.tool(
|
|
44
|
+
// 'hello_world',
|
|
45
|
+
// 'Simple Hello World tool',
|
|
46
|
+
// {
|
|
47
|
+
// name: z.string().optional().describe('Your name'),
|
|
48
|
+
// },
|
|
49
|
+
// async ({ name }) => ({
|
|
50
|
+
// content: [
|
|
51
|
+
// {
|
|
52
|
+
// type: 'text',
|
|
53
|
+
// text: `Hello, ${name ?? 'World'}! This response comes from an SSE MCP server.`,
|
|
54
|
+
// },
|
|
55
|
+
// ],
|
|
56
|
+
// }),
|
|
57
|
+
// );
|
|
58
|
+
// // Connect to the MCP server
|
|
59
|
+
// console.log('🚀 Connecting to MCP server');
|
|
60
|
+
// await server.connect(transport);
|
|
61
|
+
// } else {
|
|
62
|
+
// // Invalid request
|
|
63
|
+
// res.status(400).json({
|
|
64
|
+
// jsonrpc: '2.0',
|
|
65
|
+
// error: {
|
|
66
|
+
// code: -32000,
|
|
67
|
+
// message: 'Bad Request: No valid session ID provided',
|
|
68
|
+
// },
|
|
69
|
+
// id: null,
|
|
70
|
+
// });
|
|
71
|
+
// return;
|
|
72
|
+
// }
|
|
73
|
+
// // Handle the request
|
|
74
|
+
// await transport.handleRequest(req, res, req.body);
|
|
75
|
+
// });
|
|
76
|
+
// // Reusable handler for GET and DELETE requests
|
|
77
|
+
// const handleSessionRequest = async (
|
|
78
|
+
// req: express.Request,
|
|
79
|
+
// res: express.Response,
|
|
80
|
+
// ) => {
|
|
81
|
+
// const sessionId = req.headers['mcp-session-id'] as string | undefined;
|
|
82
|
+
// if (!sessionId || !transports[sessionId]) {
|
|
83
|
+
// res.status(400).send('Invalid or missing session ID');
|
|
84
|
+
// return;
|
|
85
|
+
// }
|
|
86
|
+
// const transport = transports[sessionId];
|
|
87
|
+
// await transport.handleRequest(req, res);
|
|
88
|
+
// };
|
|
89
|
+
// // Handle GET requests for server-to-client notifications via SSE
|
|
90
|
+
// app.get('/mcp', handleSessionRequest);
|
|
91
|
+
// // Handle DELETE requests for session termination
|
|
92
|
+
// app.delete('/mcp', handleSessionRequest);
|
|
93
|
+
// app.listen(4000);
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
4
|
+
const constants_1 = require("./constants");
|
|
5
|
+
const generated_1 = require("./generated");
|
|
6
|
+
const CarbonVoiceSimplifiedAPI_zod_1 = require("./generated/carbon-voice-api/CarbonVoiceSimplifiedAPI.zod");
|
|
7
|
+
const utils_1 = require("./utils");
|
|
8
|
+
// Create server instance
|
|
9
|
+
const server = new mcp_js_1.McpServer({
|
|
10
|
+
name: constants_1.SERVICE_NAME,
|
|
11
|
+
version: constants_1.SERVICE_VERSION,
|
|
12
|
+
capabilities: {
|
|
13
|
+
resources: {},
|
|
14
|
+
tools: {},
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
const api = (0, generated_1.getCarbonVoiceSimplifiedAPI)();
|
|
18
|
+
// type GetMessageInput = z.infer<typeof getMessageByIdParams> &
|
|
19
|
+
// z.infer<typeof getMessageByIdQueryParams>;
|
|
20
|
+
/**********************
|
|
21
|
+
* Tools
|
|
22
|
+
*********************/
|
|
23
|
+
// Messages
|
|
24
|
+
server.registerTool('list_messages', {
|
|
25
|
+
description: 'List Messages. By default returns messages created in last 5 days. The maximum allowed range between dates is 31 days.',
|
|
26
|
+
inputSchema: CarbonVoiceSimplifiedAPI_zod_1.listMessagesQueryParams.shape,
|
|
27
|
+
}, async (params) => {
|
|
28
|
+
try {
|
|
29
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.listMessages(params));
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
utils_1.logger.error('Error listing messages:', { params, error });
|
|
33
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
server.registerTool('get_message', {
|
|
37
|
+
description: 'Get a message by its ID.',
|
|
38
|
+
inputSchema: CarbonVoiceSimplifiedAPI_zod_1.getMessageByIdParams.merge(CarbonVoiceSimplifiedAPI_zod_1.getMessageByIdQueryParams).shape,
|
|
39
|
+
}, async (args) => {
|
|
40
|
+
try {
|
|
41
|
+
const { id, ...queryParams } = args;
|
|
42
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.getMessageById(id, queryParams));
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
utils_1.logger.error('Error getting message by id:', { args, error });
|
|
46
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
server.registerTool('get_recent_messages', {
|
|
50
|
+
description: 'Get most recent messages, including their associated Conversation, Creator, and Labels information. ' +
|
|
51
|
+
'Returns a maximum of 10 messages.',
|
|
52
|
+
inputSchema: CarbonVoiceSimplifiedAPI_zod_1.getTenRecentMessagesResponseQueryParams.shape,
|
|
53
|
+
}, async (args) => {
|
|
54
|
+
try {
|
|
55
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.getTenRecentMessagesResponse(args));
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
utils_1.logger.error('Error getting recent messages:', { args, error });
|
|
59
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
server.registerTool('create_conversation_message', {
|
|
63
|
+
description: 'Send a message to a conversation. In order to create a Message, you must provide transcript or link attachments.',
|
|
64
|
+
inputSchema: CarbonVoiceSimplifiedAPI_zod_1.createConversationMessageParams.merge(CarbonVoiceSimplifiedAPI_zod_1.createConversationMessageBody).shape,
|
|
65
|
+
}, async (args) => {
|
|
66
|
+
try {
|
|
67
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.createConversationMessage(args.id, args));
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
utils_1.logger.error('Error creating conversation message:', { args, error });
|
|
71
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
server.registerTool('create_direct_message', {
|
|
75
|
+
description: 'Send a Direct Message (DM) to a User or a Group of Users. ' +
|
|
76
|
+
'In order to create a Direct Message, you must provide transcript or link attachments.',
|
|
77
|
+
inputSchema: CarbonVoiceSimplifiedAPI_zod_1.sendDirectMessageBody.shape,
|
|
78
|
+
}, async (args) => {
|
|
79
|
+
try {
|
|
80
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.sendDirectMessage(args));
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
utils_1.logger.error('Error creating direct message:', { args, error });
|
|
84
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
server.registerTool('create_voicememo_message', {
|
|
88
|
+
description: 'Create a VoiceMemo Message. In order to create a VoiceMemo Message, you must provide a transcript or link attachments.',
|
|
89
|
+
inputSchema: CarbonVoiceSimplifiedAPI_zod_1.createVoiceMemoMessageBody.shape,
|
|
90
|
+
}, async (args) => {
|
|
91
|
+
try {
|
|
92
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.createVoiceMemoMessage(args));
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
utils_1.logger.error('Error creating voicememo message:', { args, error });
|
|
96
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
server.registerTool('add_attachments_to_message', {
|
|
100
|
+
description: 'Add attachments to a message. In order to add attachments to a message, you must provide a message id and the attachments.',
|
|
101
|
+
inputSchema: CarbonVoiceSimplifiedAPI_zod_1.addLinkAttachmentsToMessageParams.merge(CarbonVoiceSimplifiedAPI_zod_1.addLinkAttachmentsToMessageBody).shape,
|
|
102
|
+
}, async (args) => {
|
|
103
|
+
try {
|
|
104
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.addLinkAttachmentsToMessage(args.id, { links: args.links }));
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
utils_1.logger.error('Error adding attachments to message:', { args, error });
|
|
108
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
// Users
|
|
112
|
+
server.registerTool('get_user', {
|
|
113
|
+
description: 'Get a User by their ID.',
|
|
114
|
+
inputSchema: CarbonVoiceSimplifiedAPI_zod_1.getUserByIdParams.shape,
|
|
115
|
+
}, async (args) => {
|
|
116
|
+
try {
|
|
117
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.getUserById(args.id));
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
utils_1.logger.error('Error getting user by id:', { args, error });
|
|
121
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
server.registerTool('search_user', {
|
|
125
|
+
description: 'Search for a User by their phone number or email address. ' +
|
|
126
|
+
'(In order to search for a User, you must provide a phone number or email address.)',
|
|
127
|
+
inputSchema: CarbonVoiceSimplifiedAPI_zod_1.searchUserQueryParams.shape,
|
|
128
|
+
}, async (args) => {
|
|
129
|
+
try {
|
|
130
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.searchUser(args));
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
utils_1.logger.error('Error searching for user:', { args, error });
|
|
134
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
server.registerTool('search_users', {
|
|
138
|
+
description: 'Search multiple Users by their phone numbers, email addresses or ids. ' +
|
|
139
|
+
'(In order to search Users, you must provide phone numbers, email addresses or ids.)',
|
|
140
|
+
inputSchema: CarbonVoiceSimplifiedAPI_zod_1.searchUsersBody.shape,
|
|
141
|
+
}, async (args) => {
|
|
142
|
+
try {
|
|
143
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.searchUsers(args));
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
utils_1.logger.error('Error searching users:', { args, error });
|
|
147
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
// Conversations
|
|
151
|
+
server.registerTool('list_conversations', {
|
|
152
|
+
description: 'List all conversations. ' +
|
|
153
|
+
'Returns a simplified view of user conversations that have had messages sent or received within the last 6 months.',
|
|
154
|
+
}, async () => {
|
|
155
|
+
try {
|
|
156
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.getAllConversations());
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
utils_1.logger.error('Error listing conversations:', { error });
|
|
160
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
server.registerTool('get_conversation', {
|
|
164
|
+
description: 'Get a conversation by its ID.',
|
|
165
|
+
inputSchema: CarbonVoiceSimplifiedAPI_zod_1.getConversationByIdParams.shape,
|
|
166
|
+
}, async (args) => {
|
|
167
|
+
try {
|
|
168
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.getConversationById(args.id));
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
utils_1.logger.error('Error getting conversation by id:', { error });
|
|
172
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
server.registerTool('get_conversation_users', {
|
|
176
|
+
description: 'Get users in a conversation.',
|
|
177
|
+
inputSchema: CarbonVoiceSimplifiedAPI_zod_1.getConversationByIdParams.shape,
|
|
178
|
+
}, async (args) => {
|
|
179
|
+
try {
|
|
180
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.getConversationUsers(args.id));
|
|
181
|
+
}
|
|
182
|
+
catch (error) {
|
|
183
|
+
utils_1.logger.error('Error getting conversation users:', { error });
|
|
184
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
// Folders
|
|
188
|
+
server.registerTool('get_workspace_folders_and_message_counts', {
|
|
189
|
+
description: 'Returns, for each workspace, the total number of folders and messages, as well as a breakdown of folders, ' +
|
|
190
|
+
'messages, and messages not in any folder.(Required to inform message type:voicememo,prerecorded)',
|
|
191
|
+
inputSchema: CarbonVoiceSimplifiedAPI_zod_1.getCountsGroupedByWorkspaceQueryParams.shape,
|
|
192
|
+
}, async (args) => {
|
|
193
|
+
try {
|
|
194
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.getCountsGroupedByWorkspace(args));
|
|
195
|
+
}
|
|
196
|
+
catch (error) {
|
|
197
|
+
utils_1.logger.error('Error listing workspace folders:', { error });
|
|
198
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
server.registerTool('get_root_folders', {
|
|
202
|
+
description: 'Lists all root folders for a given workspace, including their names, IDs, and basic structure, ' +
|
|
203
|
+
'but does not provide aggregate counts.(Required to inform message type:voicememo,prerecorded)',
|
|
204
|
+
inputSchema: CarbonVoiceSimplifiedAPI_zod_1.getAllRootFoldersQueryParams.shape,
|
|
205
|
+
}, async (args) => {
|
|
206
|
+
try {
|
|
207
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.getAllRootFolders(args));
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
utils_1.logger.error('Error listing root folders:', { error });
|
|
211
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
212
|
+
}
|
|
213
|
+
});
|
|
214
|
+
server.registerTool('create_folder', {
|
|
215
|
+
description: 'Create a new folder.',
|
|
216
|
+
inputSchema: CarbonVoiceSimplifiedAPI_zod_1.createFolderBody.shape,
|
|
217
|
+
}, async (args) => {
|
|
218
|
+
try {
|
|
219
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.createFolder(args));
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
utils_1.logger.error('Error creating folder:', { error });
|
|
223
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
server.registerTool('get_folder', {
|
|
227
|
+
description: 'Get a folder by its ID.',
|
|
228
|
+
inputSchema: CarbonVoiceSimplifiedAPI_zod_1.getFolderByIdParams.merge(CarbonVoiceSimplifiedAPI_zod_1.getFolderByIdQueryParams).shape,
|
|
229
|
+
}, async (args) => {
|
|
230
|
+
try {
|
|
231
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.getFolderById(args.id, args));
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
utils_1.logger.error('Error getting folder by id:', { error });
|
|
235
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
server.registerTool('get_folder_with_messages', {
|
|
239
|
+
description: 'Get a folder including its messages by its ID. (Only messages at folder level are returned.)',
|
|
240
|
+
inputSchema: CarbonVoiceSimplifiedAPI_zod_1.getFolderMessagesParams.shape,
|
|
241
|
+
}, async (args) => {
|
|
242
|
+
try {
|
|
243
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.getFolderMessages(args.id));
|
|
244
|
+
}
|
|
245
|
+
catch (error) {
|
|
246
|
+
utils_1.logger.error('Error getting folder with messages:', { error });
|
|
247
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
server.registerTool('update_folder_name', {
|
|
251
|
+
description: 'Update a folder name by its ID.',
|
|
252
|
+
inputSchema: CarbonVoiceSimplifiedAPI_zod_1.updateFolderNameParams.merge(CarbonVoiceSimplifiedAPI_zod_1.updateFolderNameBody).shape,
|
|
253
|
+
}, async (args) => {
|
|
254
|
+
try {
|
|
255
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.updateFolderName(args.id, args));
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
utils_1.logger.error('Error updating folder name:', { error });
|
|
259
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
server.registerTool('delete_folder', {
|
|
263
|
+
description: 'Delete a folder by its ID. Deleting a folder will also delete nested folders and all the messages in referenced folders. ' +
|
|
264
|
+
'(This is a destructive action and cannot be undone, so please be careful.)',
|
|
265
|
+
inputSchema: CarbonVoiceSimplifiedAPI_zod_1.deleteFolderParams.shape,
|
|
266
|
+
}, async (args) => {
|
|
267
|
+
try {
|
|
268
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.deleteFolder(args.id));
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
utils_1.logger.error('Error deleting folder:', { error });
|
|
272
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
server.registerTool('move_folder', {
|
|
276
|
+
description: 'Move a folder by its ID. Move a Folder into another Folder or into a Workspace.',
|
|
277
|
+
inputSchema: CarbonVoiceSimplifiedAPI_zod_1.moveFolderParams.merge(CarbonVoiceSimplifiedAPI_zod_1.moveFolderBody).shape,
|
|
278
|
+
}, async (args) => {
|
|
279
|
+
try {
|
|
280
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.moveFolder(args.id, args));
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
utils_1.logger.error('Error moving folder:', { error });
|
|
284
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
server.registerTool('move_message_to_folder', {
|
|
288
|
+
description: 'Move a message to a folder by its ID. Move a Message into another Folder or into a Workspace. ' +
|
|
289
|
+
'Only allowed to move messages of type: voicememo,prerecorded.',
|
|
290
|
+
inputSchema: CarbonVoiceSimplifiedAPI_zod_1.addMessageToFolderOrWorkspaceBody.shape,
|
|
291
|
+
}, async (args) => {
|
|
292
|
+
try {
|
|
293
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.addMessageToFolderOrWorkspace(args));
|
|
294
|
+
}
|
|
295
|
+
catch (error) {
|
|
296
|
+
utils_1.logger.error('Error moving message to folder:', { error });
|
|
297
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
// Workspace
|
|
301
|
+
server.registerTool('get_workspaces_basic_info', {
|
|
302
|
+
description: 'Get basic information about a workspace.',
|
|
303
|
+
}, async () => {
|
|
304
|
+
try {
|
|
305
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.getAllWorkspacesWithBasicInfo());
|
|
306
|
+
}
|
|
307
|
+
catch (error) {
|
|
308
|
+
utils_1.logger.error('Error getting workspaces basic info:', { error });
|
|
309
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
310
|
+
}
|
|
311
|
+
});
|
|
312
|
+
// AI Magic
|
|
313
|
+
server.registerTool('list_ai_actions', {
|
|
314
|
+
description: 'List AI Actions (Prompts). Optionally, you can filter by owner type and workspace id. ' +
|
|
315
|
+
'Filtering by owner type, Possible values: "user", "workspace", "system". ' +
|
|
316
|
+
'Do not use unless the user explicitly requests it.',
|
|
317
|
+
inputSchema: CarbonVoiceSimplifiedAPI_zod_1.aIPromptControllerGetPromptsQueryParams.shape,
|
|
318
|
+
}, async (args) => {
|
|
319
|
+
try {
|
|
320
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.aIPromptControllerGetPrompts(args));
|
|
321
|
+
}
|
|
322
|
+
catch (error) {
|
|
323
|
+
utils_1.logger.error('Error listing ai actions:', { error });
|
|
324
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
server.registerTool('run_ai_action', {
|
|
328
|
+
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.',
|
|
329
|
+
inputSchema: CarbonVoiceSimplifiedAPI_zod_1.aIResponseControllerCreateResponseBody.shape,
|
|
330
|
+
}, async (args) => {
|
|
331
|
+
try {
|
|
332
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.aIResponseControllerCreateResponse(args));
|
|
333
|
+
}
|
|
334
|
+
catch (error) {
|
|
335
|
+
utils_1.logger.error('Error running ai action:', { error });
|
|
336
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
server.registerTool('run_ai_action_for_shared_link', {
|
|
340
|
+
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. ' +
|
|
341
|
+
'You can also provide the language of the response.',
|
|
342
|
+
inputSchema: CarbonVoiceSimplifiedAPI_zod_1.createShareLinkAIResponseBody.shape,
|
|
343
|
+
}, async (args) => {
|
|
344
|
+
try {
|
|
345
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.createShareLinkAIResponse(args));
|
|
346
|
+
}
|
|
347
|
+
catch (error) {
|
|
348
|
+
utils_1.logger.error('Error running ai action for shared link:', { error });
|
|
349
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
server.registerTool('get_ai_action_responses', {
|
|
353
|
+
description: 'Retrieve previously generated AI Action (Prompt) responses by filtering for a specific prompt, message, or conversation ID. ' +
|
|
354
|
+
'Combine filters to narrow results and view all AI-generated responses related to a particular prompt, message, or conversation.',
|
|
355
|
+
inputSchema: CarbonVoiceSimplifiedAPI_zod_1.aIResponseControllerGetAllResponsesQueryParams.shape,
|
|
356
|
+
}, async (args) => {
|
|
357
|
+
try {
|
|
358
|
+
return (0, utils_1.formatToMCPToolResponse)(await api.aIResponseControllerGetAllResponses(args));
|
|
359
|
+
}
|
|
360
|
+
catch (error) {
|
|
361
|
+
utils_1.logger.error('Error getting ai action responses:', { error });
|
|
362
|
+
return (0, utils_1.formatToMCPToolResponse)(error);
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
exports.default = server;
|
package/dist/sse.js
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// #!/usr/bin/env node
|
|
3
|
+
// import express, { Request, Response } from 'express';
|
|
4
|
+
// import cors from 'cors';
|
|
5
|
+
// import dotenv from 'dotenv';
|
|
6
|
+
// import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
7
|
+
// import { z } from 'zod';
|
|
8
|
+
// import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
// // Load .env
|
|
11
|
+
// dotenv.config();
|
|
12
|
+
// // Environment variables
|
|
13
|
+
// const CV_API_BASE_URL = 'https://wf5whhzd-8081.brs.devtunnels.ms';
|
|
14
|
+
// const CV_API_SIMPLIFIED_BASE_URL = `${CV_API_BASE_URL}/simplified`;
|
|
15
|
+
// const API_KEY = process.env.CARBON_VOICE_API_KEY;
|
|
16
|
+
// if (!API_KEY) {
|
|
17
|
+
// console.error('❌ Missing CARBON_VOICE_API_KEY');
|
|
18
|
+
// process.exit(1);
|
|
19
|
+
// }
|
|
20
|
+
// // ---- API CLIENT ---- //
|
|
21
|
+
// class CarbonVoiceClient {
|
|
22
|
+
// constructor(private apiKey: string) {}
|
|
23
|
+
// async listChannels(limit = 100, cursor = '') {
|
|
24
|
+
// try {
|
|
25
|
+
// const res = await fetch(
|
|
26
|
+
// `${CV_API_SIMPLIFIED_BASE_URL}/conversations/all`,
|
|
27
|
+
// {
|
|
28
|
+
// headers: {
|
|
29
|
+
// 'x-api-key': this.apiKey,
|
|
30
|
+
// 'Content-Type': 'application/json',
|
|
31
|
+
// },
|
|
32
|
+
// },
|
|
33
|
+
// );
|
|
34
|
+
// if (!res.ok) throw new Error(`Failed with status ${res.status}`);
|
|
35
|
+
// return await res.json();
|
|
36
|
+
// } catch (error) {
|
|
37
|
+
// console.error('🔴 Error in listChannels:', error);
|
|
38
|
+
// return null;
|
|
39
|
+
// }
|
|
40
|
+
// }
|
|
41
|
+
// }
|
|
42
|
+
// const client = new CarbonVoiceClient(API_KEY);
|
|
43
|
+
// // ---- MCP SERVER ---- //
|
|
44
|
+
// const server = new McpServer({
|
|
45
|
+
// name: 'Carbon Voice MCP Server (SSE)',
|
|
46
|
+
// version: '1.0.0',
|
|
47
|
+
// capabilities: {
|
|
48
|
+
// resources: {},
|
|
49
|
+
// tools: {},
|
|
50
|
+
// },
|
|
51
|
+
// });
|
|
52
|
+
// server.tool(
|
|
53
|
+
// 'list_channels',
|
|
54
|
+
// 'List channels',
|
|
55
|
+
// {
|
|
56
|
+
// workspace_id: z.string().optional().describe('Carbon Voice workspace ID'),
|
|
57
|
+
// },
|
|
58
|
+
// async ({ workspace_id }) => {
|
|
59
|
+
// const channelsData = await client.listChannels(100, '');
|
|
60
|
+
// if (!channelsData) {
|
|
61
|
+
// return {
|
|
62
|
+
// content: [
|
|
63
|
+
// {
|
|
64
|
+
// type: 'text',
|
|
65
|
+
// text: 'Failed to retrieve channels data',
|
|
66
|
+
// },
|
|
67
|
+
// ],
|
|
68
|
+
// };
|
|
69
|
+
// }
|
|
70
|
+
// return {
|
|
71
|
+
// content: [
|
|
72
|
+
// {
|
|
73
|
+
// type: 'text',
|
|
74
|
+
// text: JSON.stringify(channelsData),
|
|
75
|
+
// },
|
|
76
|
+
// ],
|
|
77
|
+
// };
|
|
78
|
+
// },
|
|
79
|
+
// );
|
|
80
|
+
// // ---- EXPRESS + SSE ---- //
|
|
81
|
+
// async function run() {
|
|
82
|
+
// const app = express();
|
|
83
|
+
// app.use(cors());
|
|
84
|
+
// app.use(express.json());
|
|
85
|
+
// const transports = new Map<string, SSEServerTransport>();
|
|
86
|
+
// app.get('/mcp/stream', async (req: Request, res: Response) => {
|
|
87
|
+
// const clientId = crypto.randomUUID();
|
|
88
|
+
// const transport = new SSEServerTransport('/mcp/stream', res);
|
|
89
|
+
// transports.set(clientId, transport);
|
|
90
|
+
// // Connect the SSE transport (this writes SSE headers) BEFORE writing any response
|
|
91
|
+
// await server.connect(transport);
|
|
92
|
+
// // Send a "clientId" event (so the client knows its ID)
|
|
93
|
+
// res.write(`event: clientId\ndata: ${clientId}\n\n`);
|
|
94
|
+
// // Send a "list_tools" event (so the client sees available tools) – mimicking MCP protocol's tool discovery
|
|
95
|
+
// const toolsList = {
|
|
96
|
+
// type: 'list_tools',
|
|
97
|
+
// tools: [
|
|
98
|
+
// {
|
|
99
|
+
// name: 'list_channels',
|
|
100
|
+
// description: 'List channels',
|
|
101
|
+
// args_schema: { workspace_id: 'string (optional)' },
|
|
102
|
+
// },
|
|
103
|
+
// ],
|
|
104
|
+
// };
|
|
105
|
+
// res.write(`event: list_tools\ndata: ${JSON.stringify(toolsList)}\n\n`);
|
|
106
|
+
// req.on('close', () => transports.delete(clientId));
|
|
107
|
+
// console.log('✅ SSE MCP server connected (transport started)');
|
|
108
|
+
// });
|
|
109
|
+
// app.post('/mcp/message', async (req: any, res: any) => {
|
|
110
|
+
// // if (!transport) {
|
|
111
|
+
// // return res.status(400).send('❌ SSE transport not initialized');
|
|
112
|
+
// // }
|
|
113
|
+
// // await transport.handlePostMessage(req, res, req.body);
|
|
114
|
+
// const { clientId, ...body } = req.body;
|
|
115
|
+
// const transport = transports.get(clientId);
|
|
116
|
+
// if (!transport) {
|
|
117
|
+
// return res.status(400).send('❌ SSE connection not established');
|
|
118
|
+
// }
|
|
119
|
+
// try {
|
|
120
|
+
// return await transport.handlePostMessage(req, res, body);
|
|
121
|
+
// } catch (error) {
|
|
122
|
+
// console.error('🔴 Error in handlePostMessage:', error);
|
|
123
|
+
// return res.status(500).send('❌ Error processing message');
|
|
124
|
+
// }
|
|
125
|
+
// });
|
|
126
|
+
// const PORT = process.env.PORT ?? 3333;
|
|
127
|
+
// app.listen(PORT, () =>
|
|
128
|
+
// console.log(`✅ SSE MCP server listening at http://localhost:${PORT}/mcp`),
|
|
129
|
+
// );
|
|
130
|
+
// }
|
|
131
|
+
// run().catch((err) => {
|
|
132
|
+
// console.error('🛑 Fatal server error:', err);
|
|
133
|
+
// process.exit(1);
|
|
134
|
+
// });
|
package/dist/sse.v2.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
|
|
3
|
+
// import { createServer } from './server.js';
|
|
4
|
+
// import express from 'express';
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
// // Create Express app and MCP server
|
|
7
|
+
// const app = express();
|
|
8
|
+
// const mcpServer = createServer();
|
|
9
|
+
// // Handle SSE connections
|
|
10
|
+
// app.get('/mcp', (req, res) => {
|
|
11
|
+
// const transport = new SSEServerTransport('/mcp', res);
|
|
12
|
+
// // Set SSE headers
|
|
13
|
+
// res.setHeader('Content-Type', 'text/event-stream');
|
|
14
|
+
// res.setHeader('Cache-Control', 'no-cache');
|
|
15
|
+
// res.setHeader('Connection', 'keep-alive');
|
|
16
|
+
// res.setHeader('Access-Control-Allow-Origin', '*'); // For development, restrict in production
|
|
17
|
+
// transport.handleMessage(req);
|
|
18
|
+
// // Handle the SSE connection using the MCP server's connect method
|
|
19
|
+
// mcpServer.connect(transport);
|
|
20
|
+
// // Handle client disconnect
|
|
21
|
+
// req.on('close', () => {
|
|
22
|
+
// console.log('Client disconnected');
|
|
23
|
+
// });
|
|
24
|
+
// });
|
|
25
|
+
// // Start the server
|
|
26
|
+
// const PORT = process.env.PORT || 3000;
|
|
27
|
+
// app.listen(PORT, () => {
|
|
28
|
+
// console.log(`Server running on port ${PORT}`);
|
|
29
|
+
// });
|
package/dist/stdio.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
8
|
+
const constants_1 = require("./constants");
|
|
9
|
+
const server_1 = __importDefault(require("./server"));
|
|
10
|
+
const utils_1 = require("./utils");
|
|
11
|
+
// Set stdio mode for logger (Needed for the logger to work in stdio mode)
|
|
12
|
+
process.env.MCP_STDIO_MODE = 'true';
|
|
13
|
+
const logArgs = {
|
|
14
|
+
name: constants_1.SERVICE_NAME,
|
|
15
|
+
version: constants_1.SERVICE_VERSION,
|
|
16
|
+
};
|
|
17
|
+
async function runServer() {
|
|
18
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
19
|
+
// Log startup information
|
|
20
|
+
utils_1.logger.debug('🚀 Starting stdio server...', logArgs);
|
|
21
|
+
try {
|
|
22
|
+
await server_1.default.connect(transport);
|
|
23
|
+
utils_1.logger.info('✅ MCP server connected to stdio transport', logArgs);
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
utils_1.logger.error('❌ Failed to connect server to stdio transport', {
|
|
27
|
+
error,
|
|
28
|
+
...logArgs,
|
|
29
|
+
});
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
runServer().catch((error) => {
|
|
34
|
+
utils_1.logger.error('❌ Fatal server error', {
|
|
35
|
+
error,
|
|
36
|
+
...logArgs,
|
|
37
|
+
});
|
|
38
|
+
process.exit(1);
|
|
39
|
+
});
|