Skip to main content
Glama
adrielisa

MCP Server: Weather & Upnify Integration

by adrielisa

search-upnify-contacts

Find prospects and clients in Upnify CRM using a name, email, or phone number. Specify search terms and set the number of records to retrieve.

Instructions

Search for contacts (prospects and clients) in Upnify by name, email, or phone

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
buscarYesSearch term: name, email, or phone number
cantidadRegistrosNoNumber of records to return

Implementation Reference

  • The core handler function that authenticates with Upnify, performs a GET request to the search endpoint with parameters 'buscar' and 'cantidadRegistros', parses the JSON response, and returns formatted results or error.
    async def search_contacts(self, search_term: str, limit: int = 10) -> Dict[str, Any]: """Search for contacts (prospects and clients)""" auth_info = await self.auth.get_token_and_user_info() token = auth_info["token"] if not search_term: raise ValueError("El término de búsqueda es obligatorio") if limit > DEFAULTS["MAX_SEARCH_RESULTS"]: limit = DEFAULTS["MAX_SEARCH_RESULTS"] async with httpx.AsyncClient() as client: try: response = await client.get( f"{API_URLS['UPNIFY_BASE']}{ENDPOINTS['SEARCH_CONTACTS']}", headers={ "token": token, "Content-Type": "application/json" }, params={ "buscar": search_term, "cantidadRegistros": limit } ) if not response.is_success: error_text = response.text raise Exception(f"Error en búsqueda: {response.status_code} {response.reason_phrase}. {error_text}") contacts = response.json() return { "success": True, "message": f"Búsqueda completada. {len(contacts)} resultados encontrados", "contacts": contacts, "searchTerm": search_term, "totalResults": len(contacts) } except Exception as error: return { "success": False, "error": f"Error al buscar contactos en Upnify: {str(error)}" }
  • The input schema defining parameters for the search-upnify-contacts tool: 'buscar' (required string) and 'cantidadRegistros' (optional integer, default 10).
    inputSchema={ "type": "object", "properties": { "buscar": {"type": "string", "description": "Search term: name, email, or phone number"}, "cantidadRegistros": {"type": "integer", "description": "Number of records to return", "default": 10, "minimum": 1, "maximum": 100} }, "required": ["buscar"] }
  • Registration of the tool in the MCP server's list_tools handler, including name, description, and schema.
    Tool( name="search-upnify-contacts", description="Search for contacts (prospects and clients) in Upnify by name, email, or phone", inputSchema={ "type": "object", "properties": { "buscar": {"type": "string", "description": "Search term: name, email, or phone number"}, "cantidadRegistros": {"type": "integer", "description": "Number of records to return", "default": 10, "minimum": 1, "maximum": 100} }, "required": ["buscar"] } ),
  • TypeScript implementation of the searchContacts method in ProspectsHandler class. Authenticates, adds 'secciones' param, fetches from Upnify SEARCH endpoint, processes response to filter prospects/clients, formats results with summary.
    async searchContacts(tkIntegracion: string, searchParams: { buscar: string; cantidadRegistros: number }) { try { const { token, userInfo } = await this.auth.getTokenAndUserInfo(tkIntegracion); const queryParams = new URLSearchParams({ buscar: searchParams.buscar, cantidadRegistros: searchParams.cantidadRegistros.toString(), secciones: DEFAULTS.SEARCH_SECTIONS }); const response = await fetch(`${API_URLS.UPNIFY_BASE}${ENDPOINTS.SEARCH}?${queryParams}`, { method: 'GET', headers: { 'token': token, 'Content-Type': 'application/json', 'User-Agent': 'UpnifyMCP/1.0' } }); if (!response.ok) { const errorText = await response.text(); console.error('Parámetros enviados:', searchParams); console.error('Token usado:', token); console.error('Respuesta del servidor:', errorText); throw new Error(`Error al buscar contactos: ${response.status} ${response.statusText}. ${errorText}`); } const resultados = await response.json(); if (!Array.isArray(resultados) || resultados.length < 2) { return { success: true, message: 'Búsqueda completada sin resultados', termino: searchParams.buscar, total: 0, resumen: { prospectos: 0, clientes: 0 }, contactos: [], tkEmpresa: userInfo.tkEmpresa }; } // resultados[0] contiene el resumen, resultados[1] contiene los datos const resumen = resultados[0][0] || {}; const contactosRaw = resultados[1] || []; // Filtrar y formatear solo prospectos y clientes const contactos = contactosRaw .filter((item: any) => item.seccion === 'prospectos' || item.seccion === 'clientes') .map((contacto: any) => ({ seccion: contacto.seccion, tkProspecto: contacto.tkProspecto, contacto: contacto.contacto, correo: contacto.correo, telefono: contacto.telefono, movil: contacto.movil, ejecutivo: contacto.ejecutivo, ejecutivoIniciales: contacto.ejecutivoIniciales, empresa: contacto.empresa || '', id: `${contacto.seccion}-${contacto.tkProspecto}` })); return { success: true, message: 'Búsqueda completada exitosamente', termino: searchParams.buscar, total: contactos.length, resumen: { prospectos: resumen.prospectos || 0, clientes: resumen.clientes || 0 }, contactos: contactos, mensaje: contactos.length > 1 ? `Se encontraron ${contactos.length} contactos. Para crear una oportunidad, especifica el tkProspecto del contacto deseado.` : contactos.length === 1 ? 'Se encontró 1 contacto exacto' : 'No se encontraron contactos', tkEmpresa: userInfo.tkEmpresa }; } catch (error) { throw new Error(`Error al buscar contactos en Upnify: ${error instanceof Error ? error.message : error}`); }
  • main.ts:204-223 (registration)
    Tool registration in the TypeScript MCP server's listTools response, defining name, description, and input schema.
    name: 'search-upnify-contacts', description: 'Search for contacts (prospects and clients) in Upnify by name, email, or phone', inputSchema: { type: 'object', properties: { buscar: { type: 'string', description: 'Search term: name, email, or phone number' }, cantidadRegistros: { type: 'integer', description: 'Number of records to return', default: 10, minimum: 1, maximum: 100 } }, required: ['buscar'] } },

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/adrielisa/MCP'

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