Skip to main content
Glama

monica_manage_contact_field_type

Manage custom contact field types in Monica CRM to store social media handles, email addresses, or other custom data by creating, updating, listing, or deleting field definitions.

Instructions

List, inspect, create, update, or delete contact field types (e.g., Email, Twitter, Instagram). Use this when you need new field types for social accounts or custom data.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
actionYes
contactFieldTypeIdNo
limitNo
pageNo
payloadNo

Implementation Reference

  • Registers the 'monica_manage_contact_field_type' tool with server.registerTool, including title, description, inputSchema reference, and the full handler function that handles CRUD operations for contact field types.
    server.registerTool(
      'monica_manage_contact_field_type',
      {
        title: 'Manage contact field types',
        description:
          'List, inspect, create, update, or delete contact field types (e.g., Email, Twitter, Instagram). Use this when you need new field types for social accounts or custom data.',
        inputSchema: contactFieldTypeInputShape
      },
      async (rawInput) => {
        const input = contactFieldTypeInputSchema.parse(rawInput);
    
        switch (input.action) {
          case 'list': {
            const response = await client.listContactFieldTypes({
              limit: input.limit,
              page: input.page
            });
            const contactFieldTypes = response.data.map(normalizeContactFieldType);
            const summary = generateListSummary({
              count: contactFieldTypes.length,
              itemName: 'contact field type'
            });
    
            return buildListResponse({
              items: contactFieldTypes,
              itemName: 'contact field type',
              summaryText: summary,
              structuredData: {
                action: input.action,
                contactFieldTypes
              },
              pagination: extractPagination(response)
            });
          }
    
          case 'get': {
            const typedInput = input as IdInput;
            const response = await client.getContactFieldType(typedInput.contactFieldTypeId);
            const contactFieldType = normalizeContactFieldType(response.data);
    
            return buildGetResponse({
              item: contactFieldType,
              summaryText: `Contact field type ${contactFieldType.name} (ID ${contactFieldType.id}).`,
              structuredData: {
                action: input.action,
                contactFieldTypeId: typedInput.contactFieldTypeId,
                contactFieldType
              }
            });
          }
    
          case 'create': {
            const typedInput = input as CreateInput;
            const response = await client.createContactFieldType(typedInput.payload);
            const contactFieldType = normalizeContactFieldType(response.data);
            logger.info({ contactFieldTypeId: contactFieldType.id }, 'Created Monica contact field type');
    
            return buildMutationResponse({
              action: 'create',
              summaryText: generateCreateSummary({
                itemName: 'contact field type',
                itemId: contactFieldType.id,
                itemLabel: contactFieldType.name
              }),
              structuredData: {
                contactFieldType
              }
            });
          }
    
          case 'update': {
            const typedInput = input as UpdateInput;
            const response = await client.updateContactFieldType(
              typedInput.contactFieldTypeId,
              typedInput.payload
            );
            const contactFieldType = normalizeContactFieldType(response.data);
            logger.info({ contactFieldTypeId: contactFieldType.id }, 'Updated Monica contact field type');
    
            return buildMutationResponse({
              action: 'update',
              summaryText: generateUpdateSummary({
                itemName: 'contact field type',
                itemId: contactFieldType.id,
                itemLabel: contactFieldType.name
              }),
              structuredData: {
                contactFieldTypeId: contactFieldType.id,
                contactFieldType
              }
            });
          }
    
          case 'delete': {
            const typedInput = input as IdInput;
            await client.deleteContactFieldType(typedInput.contactFieldTypeId);
            logger.info({ contactFieldTypeId: typedInput.contactFieldTypeId }, 'Deleted Monica contact field type');
    
            return buildMutationResponse({
              action: 'delete',
              summaryText: generateDeleteSummary({
                itemName: 'contact field type',
                itemId: typedInput.contactFieldTypeId
              }),
              structuredData: {
                contactFieldTypeId: typedInput.contactFieldTypeId,
                deleted: true
              }
            });
          }
    
          default:
            throw new Error(`Unsupported action: ${String((input as ContactFieldTypeInput).action)}`);
        }
      }
    );
  • The anonymous async handler function for the tool. It validates input with Zod, then switches on 'action' to perform list, get, create, update, or delete operations using the client API, normalizing responses and building standardized output.
    async (rawInput) => {
      const input = contactFieldTypeInputSchema.parse(rawInput);
    
      switch (input.action) {
        case 'list': {
          const response = await client.listContactFieldTypes({
            limit: input.limit,
            page: input.page
          });
          const contactFieldTypes = response.data.map(normalizeContactFieldType);
          const summary = generateListSummary({
            count: contactFieldTypes.length,
            itemName: 'contact field type'
          });
    
          return buildListResponse({
            items: contactFieldTypes,
            itemName: 'contact field type',
            summaryText: summary,
            structuredData: {
              action: input.action,
              contactFieldTypes
            },
            pagination: extractPagination(response)
          });
        }
    
        case 'get': {
          const typedInput = input as IdInput;
          const response = await client.getContactFieldType(typedInput.contactFieldTypeId);
          const contactFieldType = normalizeContactFieldType(response.data);
    
          return buildGetResponse({
            item: contactFieldType,
            summaryText: `Contact field type ${contactFieldType.name} (ID ${contactFieldType.id}).`,
            structuredData: {
              action: input.action,
              contactFieldTypeId: typedInput.contactFieldTypeId,
              contactFieldType
            }
          });
        }
    
        case 'create': {
          const typedInput = input as CreateInput;
          const response = await client.createContactFieldType(typedInput.payload);
          const contactFieldType = normalizeContactFieldType(response.data);
          logger.info({ contactFieldTypeId: contactFieldType.id }, 'Created Monica contact field type');
    
          return buildMutationResponse({
            action: 'create',
            summaryText: generateCreateSummary({
              itemName: 'contact field type',
              itemId: contactFieldType.id,
              itemLabel: contactFieldType.name
            }),
            structuredData: {
              contactFieldType
            }
          });
        }
    
        case 'update': {
          const typedInput = input as UpdateInput;
          const response = await client.updateContactFieldType(
            typedInput.contactFieldTypeId,
            typedInput.payload
          );
          const contactFieldType = normalizeContactFieldType(response.data);
          logger.info({ contactFieldTypeId: contactFieldType.id }, 'Updated Monica contact field type');
    
          return buildMutationResponse({
            action: 'update',
            summaryText: generateUpdateSummary({
              itemName: 'contact field type',
              itemId: contactFieldType.id,
              itemLabel: contactFieldType.name
            }),
            structuredData: {
              contactFieldTypeId: contactFieldType.id,
              contactFieldType
            }
          });
        }
    
        case 'delete': {
          const typedInput = input as IdInput;
          await client.deleteContactFieldType(typedInput.contactFieldTypeId);
          logger.info({ contactFieldTypeId: typedInput.contactFieldTypeId }, 'Deleted Monica contact field type');
    
          return buildMutationResponse({
            action: 'delete',
            summaryText: generateDeleteSummary({
              itemName: 'contact field type',
              itemId: typedInput.contactFieldTypeId
            }),
            structuredData: {
              contactFieldTypeId: typedInput.contactFieldTypeId,
              deleted: true
            }
          });
        }
    
        default:
          throw new Error(`Unsupported action: ${String((input as ContactFieldTypeInput).action)}`);
      }
    }
  • Full Zod input schema with action-based superRefine validation ensuring required fields like contactFieldTypeId and payload are present for specific actions.
    const contactFieldTypeInputSchema = z.object(contactFieldTypeInputShape).superRefine((data, ctx) => {
      switch (data.action) {
        case 'list':
          return;
    
        case 'get':
        case 'delete':
          if (data.contactFieldTypeId == null) {
            ctx.addIssue({
              code: z.ZodIssueCode.custom,
              path: ['contactFieldTypeId'],
              message: 'Provide contactFieldTypeId for this action.'
            });
          }
          return;
    
        case 'create':
          if (!data.payload) {
            ctx.addIssue({
              code: z.ZodIssueCode.custom,
              path: ['payload'],
              message: 'Provide payload when creating a contact field type.'
            });
          }
          return;
    
        case 'update':
          if (data.contactFieldTypeId == null) {
            ctx.addIssue({
              code: z.ZodIssueCode.custom,
              path: ['contactFieldTypeId'],
              message: 'Provide contactFieldTypeId when updating a contact field type.'
            });
          }
          if (!data.payload) {
            ctx.addIssue({
              code: z.ZodIssueCode.custom,
              path: ['payload'],
              message: 'Provide payload when updating a contact field type.'
            });
          }
          return;
    
        default:
          ctx.addIssue({
            code: z.ZodIssueCode.custom,
            message: `Unsupported action: ${String(data.action)}`
          });
      }
    });
  • Zod schema for the payload object used in create and update actions, defining fields like name, fontawesomeIcon, protocol, delible, and kind.
    const contactFieldTypePayloadSchema = z.object({
      name: z.string().min(1).max(255),
      fontawesomeIcon: z.string().max(255).optional().nullable(),
      protocol: z.string().max(255).optional().nullable(),
      delible: z.boolean().optional(),
      kind: z.string().max(255).optional().nullable()
    });

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/Jacob-Stokes/monica-mcp'

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