Skip to main content
Glama
lists.tsβ€’17 kB
/** * List operation handlers for tool execution * * Handles list-related operations including adding/removing records from lists */ import { CallToolRequest } from '@modelcontextprotocol/sdk/types.js'; import { createErrorResult } from '../../../../utils/error-handler.js'; import { ToolConfig, GetListsToolConfig } from '../../../tool-types.js'; import { formatResponse } from '../../formatters.js'; import { hasResponseData } from '../../error-types.js'; /** * Handle getLists operations */ export async function handleGetListsOperation( request: CallToolRequest, toolConfig: GetListsToolConfig ) { try { const lists = await toolConfig.handler(); const formattedResult = toolConfig.formatResult!(lists); return formatResponse(formattedResult); } catch (error: unknown) { return createErrorResult( error instanceof Error ? error : new Error('Unknown error'), '/lists', 'GET', hasResponseData(error) ? error.response.data : {} ); } } /** * Handle addRecordToList operations * * This function extracts parameters from the tool request and passes them to the handler. * It supports both required parameters (listId, recordId) and optional parameters * (objectType, initialValues) needed for proper API payload construction. * * @param request - The tool request containing parameters * @param toolConfig - The tool configuration with handler function * @returns Formatted response with success or error information */ export async function handleAddRecordToListOperation( request: CallToolRequest, toolConfig: ToolConfig ) { const listId = request.params.arguments?.listId as string; const recordId = request.params.arguments?.recordId as string; const objectType = request.params.arguments?.objectType as string | undefined; const initialValues = request.params.arguments?.initialValues as | Record<string, unknown> | undefined; if (!listId) { return createErrorResult( new Error('listId parameter is required'), '/lists', 'POST', { status: 400, message: 'Missing required parameter: listId' } ); } if (!recordId) { return createErrorResult( new Error('recordId parameter is required'), `/lists/${listId}/records`, 'POST', { status: 400, message: 'Missing required parameter: recordId' } ); } try { // Pass objectType and initialValues to the handler function const result = await toolConfig.handler( listId, recordId, objectType, initialValues ); const formattedResult = toolConfig.formatResult ? toolConfig.formatResult(result) : `Successfully added record ${recordId} to list ${listId}`; return formatResponse(formattedResult); } catch (error: unknown) { return createErrorResult( error instanceof Error ? error : new Error('Unknown error'), `/lists/${listId}/records`, 'POST', hasResponseData(error) ? error.response.data : {} ); } } /** * Handle removeRecordFromList operations */ export async function handleRemoveRecordFromListOperation( request: CallToolRequest, toolConfig: ToolConfig ) { const listId = request.params.arguments?.listId as string; const entryId = request.params.arguments?.entryId as string; if (!listId) { return createErrorResult( new Error('listId parameter is required'), '/lists', 'DELETE', { status: 400, message: 'Missing required parameter: listId' } ); } if (!entryId) { return createErrorResult( new Error('entryId parameter is required'), `/lists/${listId}/entries`, 'DELETE', { status: 400, message: 'Missing required parameter: entryId' } ); } try { const result = await toolConfig.handler(listId, entryId); const formattedResult = toolConfig.formatResult ? toolConfig.formatResult(result) : `Successfully removed entry ${entryId} from list ${listId}`; return formatResponse(formattedResult); } catch (error: unknown) { return createErrorResult( error instanceof Error ? error : new Error('Unknown error'), `/lists/${listId}/entries/${entryId}`, 'DELETE', hasResponseData(error) ? error.response.data : {} ); } } /** * Handle updateListEntry operations */ export async function handleUpdateListEntryOperation( request: CallToolRequest, toolConfig: ToolConfig ) { const listId = request.params.arguments?.listId as string; const entryId = request.params.arguments?.entryId as string; const attributes = request.params.arguments?.attributes; if (!listId) { return createErrorResult( new Error('listId parameter is required'), '/lists', 'PUT', { status: 400, message: 'Missing required parameter: listId' } ); } if (!entryId) { return createErrorResult( new Error('entryId parameter is required'), `/lists/${listId}/entries`, 'PUT', { status: 400, message: 'Missing required parameter: entryId' } ); } if (!attributes || typeof attributes !== 'object') { return createErrorResult( new Error('attributes parameter is required and must be an object'), `/lists/${listId}/entries/${entryId}`, 'PUT', { status: 400, message: 'Missing or invalid attributes parameter' } ); } try { const result = await toolConfig.handler(listId, entryId, attributes); const formattedResult = toolConfig.formatResult ? toolConfig.formatResult(result) : result; return formatResponse(formattedResult); } catch (error: unknown) { return createErrorResult( error instanceof Error ? error : new Error('Unknown error'), `/lists/${listId}/entries/${entryId}`, 'PUT', hasResponseData(error) ? error.response.data : {} ); } } /** * Handle filterListEntriesByParent operations * * This handler extracts the required parameters from the tool request and passes them * to the handler function for filtering list entries based on parent record properties. */ export async function handleFilterListEntriesByParentOperation( request: CallToolRequest, toolConfig: ToolConfig ) { const listId = request.params.arguments?.listId as string; const parentObjectType = request.params.arguments?.parentObjectType as string; const parentAttributeSlug = request.params.arguments ?.parentAttributeSlug as string; const condition = request.params.arguments?.condition as string; const value = request.params.arguments?.value; const limit = request.params.arguments?.limit as number; const offset = request.params.arguments?.offset as number; // Validate required parameters if (!listId) { return createErrorResult( new Error('listId parameter is required'), '/lists', 'GET', { status: 400, message: 'Missing required parameter: listId' } ); } if (!parentObjectType) { return createErrorResult( new Error('parentObjectType parameter is required'), `/lists/${listId}/entries`, 'GET', { status: 400, message: 'Missing required parameter: parentObjectType' } ); } if (!parentAttributeSlug) { return createErrorResult( new Error('parentAttributeSlug parameter is required'), `/lists/${listId}/entries`, 'GET', { status: 400, message: 'Missing required parameter: parentAttributeSlug', } ); } if (!condition) { return createErrorResult( new Error('condition parameter is required'), `/lists/${listId}/entries`, 'GET', { status: 400, message: 'Missing required parameter: condition' } ); } if (value === undefined) { return createErrorResult( new Error('value parameter is required'), `/lists/${listId}/entries`, 'GET', { status: 400, message: 'Missing required parameter: value' } ); } try { // Call the handler function with all parameters const result = await toolConfig.handler( listId, parentObjectType, parentAttributeSlug, condition, value, limit, offset ); // Format the result using the configured formatter const formattedResult = toolConfig.formatResult ? toolConfig.formatResult(result) : result; return formatResponse(formattedResult); } catch (error: unknown) { return createErrorResult( error instanceof Error ? error : new Error('Unknown error'), `/lists/${listId}/entries`, 'GET', hasResponseData(error) ? error.response.data : {} ); } } /** * Handle filterListEntriesByParentId operations * * This handler extracts the required parameters from the tool request and passes them * to the handler function for filtering list entries by parent record ID. */ export async function handleFilterListEntriesByParentIdOperation( request: CallToolRequest, toolConfig: ToolConfig ) { const listId = request.params.arguments?.listId as string; const recordId = request.params.arguments?.recordId as string; const limit = request.params.arguments?.limit as number; const offset = request.params.arguments?.offset as number; // Validate required parameters if (!listId) { return createErrorResult( new Error('listId parameter is required'), '/lists', 'GET', { status: 400, message: 'Missing required parameter: listId' } ); } if (!recordId) { return createErrorResult( new Error('recordId parameter is required'), `/lists/${listId}/entries`, 'GET', { status: 400, message: 'Missing required parameter: recordId' } ); } try { // Call the handler function with all parameters const result = await toolConfig.handler(listId, recordId, limit, offset); // Format the result using the configured formatter const formattedResult = toolConfig.formatResult ? toolConfig.formatResult(result) : result; return formatResponse(formattedResult); } catch (error: unknown) { return createErrorResult( error instanceof Error ? error : new Error('Unknown error'), `/lists/${listId}/entries`, 'GET', hasResponseData(error) ? error.response.data : {} ); } } /** * Handle getListDetails operations */ export async function handleGetListDetailsOperation( request: CallToolRequest, toolConfig: ToolConfig ) { const listId = request.params.arguments?.listId as string; if (!listId) { return createErrorResult( new Error('listId parameter is required'), '/lists', 'GET', { status: 400, message: 'Missing required parameter: listId' } ); } try { const result = await toolConfig.handler(listId); const formattedResult = toolConfig.formatResult ? toolConfig.formatResult(result) : result; return formatResponse(formattedResult); } catch (error: unknown) { return createErrorResult( error instanceof Error ? error : new Error('Unknown error'), `/lists/${listId}`, 'GET', hasResponseData(error) ? error.response.data : {} ); } } /** * Handle getListEntries operations */ export async function handleGetListEntriesOperation( request: CallToolRequest, toolConfig: ToolConfig ) { const listId = request.params.arguments?.listId as string; const limit = request.params.arguments?.limit as number; const offset = request.params.arguments?.offset as number; const filters = request.params.arguments?.filters; if (!listId) { return createErrorResult( new Error('listId parameter is required'), '/lists', 'GET', { status: 400, message: 'Missing required parameter: listId' } ); } try { const result = await toolConfig.handler(listId, limit, offset, filters); const formattedResult = toolConfig.formatResult ? toolConfig.formatResult(result) : result; return formatResponse(formattedResult); } catch (error: unknown) { return createErrorResult( error instanceof Error ? error : new Error('Unknown error'), `/lists/${listId}/entries`, 'GET', hasResponseData(error) ? error.response.data : {} ); } } /** * Handle filterListEntries operations */ export async function handleFilterListEntriesOperation( request: CallToolRequest, toolConfig: ToolConfig ) { const listId = request.params.arguments?.listId as string; const attributeSlug = request.params.arguments?.attributeSlug as string; const condition = request.params.arguments?.condition as string; const value = request.params.arguments?.value; const limit = request.params.arguments?.limit as number; const offset = request.params.arguments?.offset as number; if (!listId) { return createErrorResult( new Error('listId parameter is required'), '/lists', 'GET', { status: 400, message: 'Missing required parameter: listId' } ); } if (!attributeSlug) { return createErrorResult( new Error('attributeSlug parameter is required'), `/lists/${listId}/entries`, 'GET', { status: 400, message: 'Missing required parameter: attributeSlug' } ); } if (!condition) { return createErrorResult( new Error('condition parameter is required'), `/lists/${listId}/entries`, 'GET', { status: 400, message: 'Missing required parameter: condition' } ); } if (value === undefined) { return createErrorResult( new Error('value parameter is required'), `/lists/${listId}/entries`, 'GET', { status: 400, message: 'Missing required parameter: value' } ); } try { const result = await toolConfig.handler( listId, attributeSlug, condition, value, limit, offset ); const formattedResult = toolConfig.formatResult ? toolConfig.formatResult(result) : result; return formatResponse(formattedResult); } catch (error: unknown) { return createErrorResult( error instanceof Error ? error : new Error('Unknown error'), `/lists/${listId}/entries`, 'GET', hasResponseData(error) ? error.response.data : {} ); } } /** * Handle advancedFilterListEntries operations */ export async function handleAdvancedFilterListEntriesOperation( request: CallToolRequest, toolConfig: ToolConfig ) { const listId = request.params.arguments?.listId as string; const filters = request.params.arguments?.filters; const limit = request.params.arguments?.limit as number; const offset = request.params.arguments?.offset as number; if (!listId) { return createErrorResult( new Error('listId parameter is required'), '/lists', 'GET', { status: 400, message: 'Missing required parameter: listId' } ); } if (!filters || typeof filters !== 'object') { return createErrorResult( new Error('filters parameter is required and must be an object'), `/lists/${listId}/entries`, 'GET', { status: 400, message: 'Missing or invalid filters parameter' } ); } try { const result = await toolConfig.handler(listId, filters, limit, offset); const formattedResult = toolConfig.formatResult ? toolConfig.formatResult(result) : result; return formatResponse(formattedResult); } catch (error: unknown) { return createErrorResult( error instanceof Error ? error : new Error('Unknown error'), `/lists/${listId}/entries`, 'GET', hasResponseData(error) ? error.response.data : {} ); } } /** * Handle getRecordListMemberships operations * * This handler extracts the required parameters from the tool request and passes them * to the handler function for finding all lists that contain a specific record. */ export async function handleGetRecordListMembershipsOperation( request: CallToolRequest, toolConfig: ToolConfig ) { const recordId = request.params.arguments?.recordId as string; const objectType = request.params.arguments?.objectType as string; const includeEntryValues = request.params.arguments ?.includeEntryValues as boolean; const batchSize = request.params.arguments?.batchSize as number; if (!recordId) { return createErrorResult( new Error('recordId parameter is required'), '/lists/memberships', 'GET', { status: 400, message: 'Missing required parameter: recordId' } ); } try { const result = await toolConfig.handler( recordId, objectType, includeEntryValues, batchSize ); const formattedResult = toolConfig.formatResult ? toolConfig.formatResult(result) : result; return formatResponse(formattedResult); } catch (error: unknown) { return createErrorResult( error instanceof Error ? error : new Error('Unknown error'), '/lists/memberships', 'GET', hasResponseData(error) ? error.response.data : {} ); } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/kesslerio/attio-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server