@sinch/mcp
Version:
Sinch MCP server
75 lines • 4.29 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.listRentedNumbersHandler = exports.registerListRentedNumbers = void 0;
const zod_1 = require("zod");
const types_1 = require("../../types");
const utils_1 = require("../../utils");
const numbers_tools_helper_1 = require("./utils/numbers-tools-helper");
const TOOL_KEY = 'listRentedNumbers';
const TOOL_NAME = (0, numbers_tools_helper_1.getToolName)(TOOL_KEY);
const registerListRentedNumbers = (server, tags) => {
if (!(0, utils_1.matchesAnyTag)(tags, numbers_tools_helper_1.toolsConfig[TOOL_KEY].tags))
return;
server.tool(TOOL_NAME, 'Lists all active numbers for a project.', {
regionCode: zod_1.z.string().optional().describe('Region code to filter by. ISO 3166-1 alpha-2 country code of the phone number. Example: US, GB or SE.'),
type: zod_1.z.enum(['MOBILE', 'LOCAL', 'TOLL_FREE']).optional().describe('Number type to filter by. Options include, MOBILE, LOCAL or TOLL_FREE.'),
searchPattern: zod_1.z.string().optional().describe('Sequence of digits to search for. If you prefer or need certain digits in sequential order, you can enter the sequence of numbers here. For example, `2020`.'),
patternPosition: zod_1.z.enum(['START', 'CONTAINS', 'END']).optional().describe('Position of the search pattern. Options include START, END or CONTAINS. If you want the search pattern to be at the beginning of the phone number, select START. If you want it at the end, select END. If you want it to be anywhere in the phone number, select CONTAINS.'),
capability: zod_1.z.enum(['SMS', 'VOICE']).optional().describe('Number capabilities to filter by SMS and/or VOICE.'),
size: zod_1.z.number().optional().describe('Maximum number of phone numbers to return.'),
}, exports.listRentedNumbersHandler);
};
exports.registerListRentedNumbers = registerListRentedNumbers;
const listRentedNumbersHandler = async ({ regionCode, type, searchPattern, patternPosition, capability, size }) => {
const projectId = process.env.PROJECT_ID;
const keyId = process.env.KEY_ID;
const keySecret = process.env.KEY_SECRET;
if (!projectId || !keyId || !keySecret) {
return new types_1.PromptResponse(JSON.stringify({
success: false,
error: 'Missing env vars: PROJECT_ID, KEY_ID, KEY_SECRET.'
})).promptResponse;
}
try {
const queryParams = new URLSearchParams();
if (regionCode)
queryParams.append('regionCode', regionCode);
if (type)
queryParams.append('type', type);
if (searchPattern)
queryParams.append('numberPattern.pattern', searchPattern);
if (patternPosition)
queryParams.append('numberPattern.searchPattern', patternPosition);
if (capability)
queryParams.append('capability', capability);
if (size)
queryParams.append('pageSize', size.toString());
const response = await fetch(`https://numbers.api.sinch.com/v1/projects/${projectId}/activeNumbers${queryParams.toString() ? '?' + queryParams.toString() : ''}`, {
method: 'GET',
headers: {
Authorization: 'Basic ' + Buffer.from(`${keyId}:${keySecret}`).toString('base64'),
'User-Agent': (0, utils_1.formatUserAgent)(TOOL_NAME, projectId),
},
});
if (!response.ok) {
const errorText = await response.text();
return new types_1.PromptResponse(JSON.stringify({
success: false,
error: `(${response.status} - ${response.statusText}) Failed to list the rented numbers: ${errorText}`
})).promptResponse;
}
const parsedResponse = await response.json();
return new types_1.PromptResponse(JSON.stringify({
success: true,
data: parsedResponse.activeNumbers
})).promptResponse;
}
catch (error) {
return new types_1.PromptResponse(JSON.stringify({
success: false,
error: (error instanceof Error ? error.message : String(error))
})).promptResponse;
}
};
exports.listRentedNumbersHandler = listRentedNumbersHandler;
//# sourceMappingURL=list-rented-numbers.js.map