Skip to main content
Glama
zoho-helper.js8.89 kB
import axios from "axios"; import fs from 'fs'; import os from 'os'; import path from 'path'; //constants let tokenFilePath = ''; if(process.env.NODE_ENV == 'development') { tokenFilePath = process.env.DEV_TOKEN_PATH; console.error(`development environment tokenFilePath: ${tokenFilePath}`); } else { tokenFilePath = path.join(process.cwd(), 'data', 'refreshToken.txt'); console.error(`production environment tokenFilePath: ${tokenFilePath}`); } //get a refresh token export async function getZohoRefreshToken(authCode) { console.error(`[${new Date().toISOString()}] GetRefreshToken - trying now with ${authCode}`); console.error(`[${new Date().toISOString()}] GetRefreshToken - trying now in folder ${process.cwd()}`); return new Promise((resolve, reject) => { const url = `https://accounts.zoho.com/oauth/v2/token?code=${authCode}&redirect_uri=http://localhost:3000/authRedirect&client_id=${process.env.ZOHO_CLIENT_ID}&client_secret=${process.env.ZOHO_CLIENT_SECRET}&grant_type=authorization_code`; console.error('trying ' + url); axios({ method: 'POST', url: url }) .then(response => { if(response.data.error) { reject(response.data.error); } else { fs.writeFile(tokenFilePath, response.data.refresh_token, (err) => { if (err) throw err; console.error(`[${new Date().toISOString()}] GetRefreshToken - token written successfully`); }); resolve({token: response.data.refresh_token , path: tokenFilePath }); } }) .catch(err => reject(err)); }); } //get a Zoho auth token export async function getZohoAccessToken() { return new Promise((resolve, reject) => { fs.readFile(tokenFilePath, 'utf8', (err, refreshToken) => { if (err) { console.error('No file found: ', err); reject(err); } console.error('File content:', refreshToken); const accessTokenURL = `https://accounts.zoho.com/oauth/v2/token?refresh_token=${refreshToken}&client_id=${process.env.ZOHO_CLIENT_ID}&client_secret=${process.env.ZOHO_CLIENT_SECRET}&grant_type=refresh_token`; try{ //console.error(accessTokenURL); axios.post(accessTokenURL, {headers: {'Content-Type' : 'application/json' }}) .then(postResponse => { //console.error(postResponse); const accessToken = postResponse.data.access_token; resolve(accessToken); }) .catch((err) => { reject('zoho token fail: ' + err); }); } catch(err){ reject(err); } }); }); } export async function listZohoModules(accessToken) { const authHeaders = {'Content-Type' : 'application/json' , 'Authorization' : `Zoho-oauthtoken ${accessToken}`}; const url = `https://www.zohoapis.com/crm/v8/settings/modules`; return new Promise((resolve, reject) => { axios({ method: 'GET', url: url, headers: authHeaders }) .then((response) => { const moduleData = response.data.modules; moduleData.forEach(mod => { delete mod.show_as_tab; delete mod.feeds_required; delete mod.business_card_field_limit; delete mod.access_type; delete mod.sub_menu_available; delete mod.actual_singular_label; delete mod.actual_plural_label; delete mod.profile_count; delete mod.arguments; delete mod.has_more_profile; delete mod.deletable; delete mod.web_link; delete mod.public_fields_configured; delete mod.sequence_number; delete mod.singular_label; delete mod.lookupable; delete mod.recycle_bin_on_delete; delete mod.visibility; delete mod.convertable; delete mod.api_supported; delete mod.quick_create; delete mod.presence_sub_menu; delete mod.has_more_profiles; mod.module_label = mod.plural_label; delete mod.plural_label; mod.module_type = mod.generated_type; delete mod.generated_type; //console.error(mod); }); resolve(response.data.modules); }) .catch(err => reject(err)); }); } export async function listZohoModuleFields(accessToken, moduleApiName) { const authHeaders = {'Content-Type' : 'application/json' , 'Authorization' : `Zoho-oauthtoken ${accessToken}`}; const url = `https://www.zohoapis.com/crm/v8/settings/fields?module=${moduleApiName}`; return new Promise((resolve, reject) => { axios({ method: 'GET', url: url, headers: authHeaders }) .then((response) => { const fieldData = response.data.fields; fieldData.forEach(field => { delete field.webhook; delete field.colour_code_enabled_by_system; delete field.operation_type; delete field.customizable_properties; delete field.tooltip; delete field.display_format_properties; delete field.businesscard_supported; delete field.filterable; delete field.view_type; delete field.separator; delete field.history_tracking_enabled; delete field.external; delete field.enable_colour_code; delete field.crypt; delete field.created_source; delete field.display_type; delete field.ui_type; delete field.convert_mapping; delete field.pick_list_values_sorted_lexically; delete field.layout_associations; delete field.sortable; delete field.email_parser; delete field.json_type; delete field.unique; delete field.auto_number; delete field.display_format; delete field.profiles; delete field.association_details; delete field.modified_time; delete field.mass_update; delete field.searchable; delete field.type; delete field.virtual_field; delete field.history_tracking; delete field.quick_sequence_number; delete field.global_picklist; delete field.rollup_summary; }); resolve(fieldData); }) .catch(err => reject(err)); }); } export async function searchZohoRecords(accessToken, searchModule, searchString) { const authHeaders = {'Content-Type' : 'application/json' , 'Authorization' : `Zoho-oauthtoken ${accessToken}`}; const url = `https://zohoapis.com/crm/v8/${searchModule}/search?word=${searchString}`; try { const response = await axios({ method: 'GET', url: url, headers: authHeaders }); //console.error(response.data); return response.data.data; } catch(err) { //console.error(err); return err; } } export async function countZohoRecords(accessToken, moduleApiName, countType, searchString) { const authHeaders = {'Content-Type' : 'application/json' , 'Authorization' : `Zoho-oauthtoken ${accessToken}`}; let url; if(countType === 'total') { url = `https://www.zohoapis.com/crm/v8/${moduleApiName}/actions/count`; } else { url = `https://www.zohoapis.com/crm/v8/${moduleApiName}/actions/count?${countType}=${searchString}`; } try { const response = await axios({ method: 'GET', url: url, headers: authHeaders }); return response.data; } catch(err) { console.error(err); return err; } } export async function getZohoRecordById(accessToken, moduleName, recordId) { const authHeaders = {'Content-Type' : 'application/json' , 'Authorization' : `Zoho-oauthtoken ${accessToken}`}; const url = `https://www.zohoapis.com/crm/v8/${moduleName}/${recordId}`; try { const response = await axios({ method: 'GET', url: url, headers: authHeaders }); return response.data.data[0]; } catch(err) { return err; } } function getLastPathSegment (urlString) { // Find the last occurrence of "/" const lastSlashIndex = urlString.lastIndexOf('/'); // If no slash is found, return the original string if (lastSlashIndex === -1) { return urlString; } // Extract everything to the right of the last slash return urlString.substring(lastSlashIndex + 1); }

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/creatrcollective/zohocrm-mcp-server'

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