{"apiVersion":"v1","directorySlug":"vconnectsg-mcp-b8924deee2","title":"VConnect Technologies","description":"VConnect Technologies Singapore - Technology consulting, product updates, and innovation.","pageUrl":"https://www.mcpbundles.com/skills/vconnectsg-mcp-b8924deee2","connectPath":"importable","connectAction":"import_server","catalogListing":false,"bundleSlug":null,"listingKind":"remote_mcp","kind":"provider","transportUrl":"https://mcp.vconnectsg.com/mcp","hostedMcpUrl":null,"toolCount":94,"toolInventoryStatus":"observed","refreshedAt":"2026-11-03T13:26:00.516172+00:00","registryName":"com.vconnectsg/vconnectsg-mcp-b8924deee2","registryVersion":"2026.11.3","registryEligible":true,"tools":[{"name":"create_ticket","description":"","inputSchema":{"type":"object","required":["crm","payload"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"payload":{"type":"object","additionalProperties":true}}},"logicalName":"create_ticket","displayName":"create_ticket","title":"create_ticket","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_ticket_by_email","description":"","inputSchema":{"type":"object","required":["crm","email"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"type":"string"}}},"logicalName":"get_ticket_by_email","displayName":"get_ticket_by_email","title":"get_ticket_by_email","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"update_ticket","description":"","inputSchema":{"type":"object","required":["crm","ticket_id","payload"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"payload":{"type":"object","additionalProperties":true},"ticket_id":{"type":"string"}}},"logicalName":"update_ticket","displayName":"update_ticket","title":"update_ticket","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"delete_ticket","description":"","inputSchema":{"type":"object","required":["crm","ticket_id"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"ticket_id":{"type":"string"}}},"logicalName":"delete_ticket","displayName":"delete_ticket","title":"delete_ticket","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"crm_health_check","description":"","inputSchema":{"type":"object","required":["crm"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"logicalName":"crm_health_check","displayName":"crm_health_check","title":"crm_health_check","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"fs_list_roots","description":"List filesystem roots that this MCP server is allowed to inspect.","inputSchema":{"type":"object","required":["crm"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"logicalName":"fs_list_roots","displayName":"fs_list_roots","title":"fs_list_roots","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"fs_list_files","description":"List files under an allowed root. Paths outside configured roots are rejected.","inputSchema":{"type":"object","required":["crm"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"cwd":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"path":{"type":"string","default":""},"limit":{"type":"integer","default":200}}},"logicalName":"fs_list_files","displayName":"fs_list_files","title":"fs_list_files","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"fs_read_file","description":"Read a UTF-8 text file under an allowed root, with a byte limit.","inputSchema":{"type":"object","required":["crm","path"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"cwd":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"path":{"type":"string"},"max_bytes":{"type":"integer","default":20000}}},"logicalName":"fs_read_file","displayName":"fs_read_file","title":"fs_read_file","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"fs_file_info","description":"Get file metadata for a path under an allowed root.","inputSchema":{"type":"object","required":["crm","path"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"cwd":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"path":{"type":"string"}}},"logicalName":"fs_file_info","displayName":"fs_file_info","title":"fs_file_info","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"fs_search","description":"Search text under an allowed root using ripgrep.","inputSchema":{"type":"object","required":["crm","pattern"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"cwd":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"path":{"type":"string","default":""},"pattern":{"type":"string"},"max_results":{"type":"integer","default":200}}},"logicalName":"fs_search","displayName":"fs_search","title":"fs_search","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"fs_write_file","description":"Request approval to write a UTF-8 file under an allowed root.","inputSchema":{"type":"object","required":["crm","path","content"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"cwd":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"path":{"type":"string"},"append":{"type":"boolean","default":false},"content":{"type":"string"},"request_approval":{"type":"boolean","default":true}}},"logicalName":"fs_write_file","displayName":"fs_write_file","title":"fs_write_file","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"fs_mkdir","description":"Request approval to create a directory under an allowed root.","inputSchema":{"type":"object","required":["crm","path"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"cwd":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"path":{"type":"string"},"request_approval":{"type":"boolean","default":true}}},"logicalName":"fs_mkdir","displayName":"fs_mkdir","title":"fs_mkdir","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"fs_move_file","description":"Request approval to move or rename a file under allowed roots.","inputSchema":{"type":"object","required":["crm","source","destination"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"cwd":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"source":{"type":"string"},"destination":{"type":"string"},"request_approval":{"type":"boolean","default":true}}},"logicalName":"fs_move_file","displayName":"fs_move_file","title":"fs_move_file","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"fs_copy_file","description":"Request approval to copy a file under allowed roots.","inputSchema":{"type":"object","required":["crm","source","destination"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"cwd":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"source":{"type":"string"},"destination":{"type":"string"},"request_approval":{"type":"boolean","default":true}}},"logicalName":"fs_copy_file","displayName":"fs_copy_file","title":"fs_copy_file","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"fs_delete_file","description":"Request approval to delete a file under an allowed root. Directories are rejected.","inputSchema":{"type":"object","required":["crm","path"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"cwd":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"path":{"type":"string"},"request_approval":{"type":"boolean","default":true}}},"logicalName":"fs_delete_file","displayName":"fs_delete_file","title":"fs_delete_file","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"service_restart","description":"Request approval to restart an allowlisted systemd service.","inputSchema":{"type":"object","required":["crm","service_name"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"service_name":{"type":"string"},"request_approval":{"type":"boolean","default":true}}},"logicalName":"service_restart","displayName":"service_restart","title":"service_restart","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"service_status","description":"Get systemd status for an allowlisted service.","inputSchema":{"type":"object","required":["crm","service_name"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"service_name":{"type":"string"}}},"logicalName":"service_status","displayName":"service_status","title":"service_status","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"service_logs","description":"Read recent journal logs for an allowlisted service.","inputSchema":{"type":"object","required":["crm","service_name"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"lines":{"type":"integer","default":100},"service_name":{"type":"string"}}},"logicalName":"service_logs","displayName":"service_logs","title":"service_logs","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"fs_list_commands","description":"List named commands available to run on the server.","inputSchema":{"type":"object","required":["crm"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"logicalName":"fs_list_commands","displayName":"fs_list_commands","title":"fs_list_commands","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"fs_run_command","description":"Run or request approval for a named allowlisted command. Arbitrary shell commands are not accepted.","inputSchema":{"type":"object","required":["crm","command_name"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"cwd":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"args":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"default":null},"command_name":{"type":"string"},"request_approval":{"type":"boolean","default":false}}},"logicalName":"fs_run_command","displayName":"fs_run_command","title":"fs_run_command","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"fs_get_job","description":"Get the status/result of a server execution job.","inputSchema":{"type":"object","required":["crm","job_id"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"job_id":{"type":"string"}}},"logicalName":"fs_get_job","displayName":"fs_get_job","title":"fs_get_job","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"fs_list_jobs","description":"List recent server execution jobs.","inputSchema":{"type":"object","required":["crm"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"limit":{"type":"integer","default":20}}},"logicalName":"fs_list_jobs","displayName":"fs_list_jobs","title":"fs_list_jobs","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"fs_approve_job","description":"Approve and execute a pending server job.","inputSchema":{"type":"object","required":["crm","job_id"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"job_id":{"type":"string"}}},"logicalName":"fs_approve_job","displayName":"fs_approve_job","title":"fs_approve_job","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"zd_get_ticket","description":"Get a Zendesk ticket by ticket number, requester email, or caller phone number.\n    Use for both voice bot (phone) and chat bot (email) lookups.\n    Priority: identifier (ticket #) > email > phone.","inputSchema":{"type":"object","required":["crm"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"identifier":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}}},"logicalName":"zd_get_ticket","displayName":"zd_get_ticket","title":"zd_get_ticket","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"zd_list_tickets","description":"List all tickets for a contact identified by email or phone number.\n    Optionally filter by status: new, open, pending, hold, solved, closed.\n    Ideal for voice bot (phone) and chat bot (email) to show ticket history.","inputSchema":{"type":"object","required":["crm"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"limit":{"type":"integer","default":5},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}}},"logicalName":"zd_list_tickets","displayName":"zd_list_tickets","title":"zd_list_tickets","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"zd_update_ticket","description":"Update a Zendesk ticket.\n    - comment: adds a public reply visible to the customer\n    - internal_note: adds a private internal note for agents only\n    - status: new, open, pending, hold, solved, closed\n    - priority: low, normal, high, urgent","inputSchema":{"type":"object","required":["crm","ticket_id"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"tags":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"default":null},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"priority":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"ticket_id":{"type":"string"},"internal_note":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}}},"logicalName":"zd_update_ticket","displayName":"zd_update_ticket","title":"zd_update_ticket","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"zd_add_public_comment","description":"Add a public reply to a ticket visible to the customer.\n    Use when the virtual agent sends a message back to the caller or chatter.","inputSchema":{"type":"object","required":["crm","ticket_id","body"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"body":{"type":"string"},"ticket_id":{"type":"string"}}},"logicalName":"zd_add_public_comment","displayName":"zd_add_public_comment","title":"zd_add_public_comment","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"zd_add_internal_note","description":"Add a private internal note to a ticket, visible only to agents.\n    Use for logging AI actions, call summaries, or handoff context.","inputSchema":{"type":"object","required":["crm","ticket_id","body"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"body":{"type":"string"},"ticket_id":{"type":"string"}}},"logicalName":"zd_add_internal_note","displayName":"zd_add_internal_note","title":"zd_add_internal_note","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"zd_get_latest_notes","description":"Get the latest comments and notes on a ticket (newest first).\n    Returns author name, role, timestamp, and public/internal flag.\n    Use to brief the agent or voice bot on recent ticket activity before a handoff.","inputSchema":{"type":"object","required":["crm","ticket_id"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"limit":{"type":"integer","default":5},"ticket_id":{"type":"string"}}},"logicalName":"zd_get_latest_notes","displayName":"zd_get_latest_notes","title":"zd_get_latest_notes","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"zd_close_ticket","description":"Close or solve a Zendesk ticket.\n    - resolution_note: optional message sent to customer on close\n    - status: 'solved' (default) or 'closed'\n    Use at the end of a voice or chat bot session when issue is resolved.","inputSchema":{"type":"object","required":["crm","ticket_id"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"type":"string","default":"solved"},"ticket_id":{"type":"string"},"resolution_note":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}}},"logicalName":"zd_close_ticket","displayName":"zd_close_ticket","title":"zd_close_ticket","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"zd_add_tags","description":"Append tags to a ticket (keeps existing tags).\n    E.g. ['voice_bot'], ['chat_bot'], ['escalated'], ['zoom_va'].","inputSchema":{"type":"object","required":["crm","ticket_id","tags"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"tags":{"type":"array","items":{"type":"string"}},"ticket_id":{"type":"string"}}},"logicalName":"zd_add_tags","displayName":"zd_add_tags","title":"zd_add_tags","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"zd_set_tags","description":"Overwrite all tags on a ticket with a new set.","inputSchema":{"type":"object","required":["crm","ticket_id","tags"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"tags":{"type":"array","items":{"type":"string"}},"ticket_id":{"type":"string"}}},"logicalName":"zd_set_tags","displayName":"zd_set_tags","title":"zd_set_tags","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"zd_search_tickets","description":"Search Zendesk tickets using full query syntax.\n    Examples: \"status:open priority:high\", \"subject:billing type:ticket\"","inputSchema":{"type":"object","required":["crm","query"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"query":{"type":"string"}}},"logicalName":"zd_search_tickets","displayName":"zd_search_tickets","title":"zd_search_tickets","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"zd_delete_ticket","description":"Permanently delete a Zendesk ticket. This action cannot be undone.","inputSchema":{"type":"object","required":["crm","ticket_id"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"ticket_id":{"type":"string"}}},"logicalName":"zd_delete_ticket","displayName":"zd_delete_ticket","title":"zd_delete_ticket","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"zd_get_ticket_status","description":"Get the current status of a ticket by ticket number, email, or phone.\n    Returns status, subject, last updated time, and the latest comment/note.\n    Perfect for voice bot 'check my ticket status' intent.","inputSchema":{"type":"object","required":["crm"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"identifier":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}}},"logicalName":"zd_get_ticket_status","displayName":"zd_get_ticket_status","title":"zd_get_ticket_status","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"gs_read_range","description":"Read cell values from a range of a Google Sheet. Returns the rows found in the range.","inputSchema":{"type":"object","required":["crm","spreadsheet_id","range_name"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"range_name":{"type":"string"},"spreadsheet_id":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"logicalName":"gs_read_range","displayName":"gs_read_range","title":"gs_read_range","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"gs_append_rows","description":"Append one or more new rows after the last filled row of a Google Sheet table. Use this to log collected details (e.g. caller name, phone number, issue) as a new row.","inputSchema":{"type":"object","required":["crm","spreadsheet_id","range_name","values"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"values":{"anyOf":[{"type":"array","items":{}},{"type":"string"}]},"range_name":{"type":"string"},"spreadsheet_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"value_input_option":{"type":"string","default":"RAW"}}},"logicalName":"gs_append_rows","displayName":"gs_append_rows","title":"gs_append_rows","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"gs_update_range","description":"Overwrite the cells in an exact range of a Google Sheet. Use to correct or fill in existing rows, not to add new ones.","inputSchema":{"type":"object","required":["crm","spreadsheet_id","range_name","values"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"values":{"anyOf":[{"type":"array","items":{}},{"type":"string"}]},"range_name":{"type":"string"},"spreadsheet_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"value_input_option":{"type":"string","default":"RAW"}}},"logicalName":"gs_update_range","displayName":"gs_update_range","title":"gs_update_range","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"gs_create_tab","description":"Add a new empty tab (worksheet) to an existing Google Sheet.","inputSchema":{"type":"object","required":["crm","spreadsheet_id","title"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"spreadsheet_id":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"logicalName":"gs_create_tab","displayName":"gs_create_tab","title":"gs_create_tab","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"gs_create_spreadsheet","description":"Create a brand-new Google Sheets spreadsheet in the connected Google account's Drive. Returns its spreadsheetId for use in later calls.","inputSchema":{"type":"object","required":["crm","title"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"sheet_title":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}}},"logicalName":"gs_create_spreadsheet","displayName":"gs_create_spreadsheet","title":"gs_create_spreadsheet","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"gs_get_sheet_info","description":"Get a spreadsheet's metadata: its title and the list of tabs (each tab's title and sheetId). Use first when the tab names are unknown.","inputSchema":{"type":"object","required":["crm","spreadsheet_id"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"spreadsheet_id":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"logicalName":"gs_get_sheet_info","displayName":"gs_get_sheet_info","title":"gs_get_sheet_info","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"gs_find_rows","description":"Find rows in a Google Sheet that contain a value - e.g. look up a caller's existing reports by mobile number. Returns each matching row with its sheet row_number, so a follow-up update can target that exact row.","inputSchema":{"type":"object","required":["crm","spreadsheet_id","range_name","search_value"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"column":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"range_name":{"type":"string"},"max_results":{"type":"integer","default":20},"search_value":{"type":"string"},"spreadsheet_id":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"logicalName":"gs_find_rows","displayName":"gs_find_rows","title":"gs_find_rows","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"gs_update_row_by_match","description":"Find the row that matches a value (e.g. the caller's mobile number) and write new_value into update_column of that row. If several rows match, the LAST (most recent) one is updated. Use to add feedback or a status update to an existing report.","inputSchema":{"type":"object","required":["crm","spreadsheet_id","range_name","search_value","update_column","new_value"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"new_value":{"type":"string"},"range_name":{"type":"string"},"search_value":{"type":"string"},"search_column":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"update_column":{"type":"string"},"spreadsheet_id":{"anyOf":[{"type":"string"},{"type":"null"}]}}},"logicalName":"gs_update_row_by_match","displayName":"gs_update_row_by_match","title":"gs_update_row_by_match","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sfdc_create_case","description":"Create a Salesforce Case with explicit fields.","inputSchema":{"type":"object","required":["crm","subject","description"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"origin":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"payload":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"default":null},"subject":{"type":"string"},"contact_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"supplied_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"supplied_email":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"supplied_phone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}}},"logicalName":"sfdc_create_case","displayName":"sfdc_create_case","title":"sfdc_create_case","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sfdc_get_case_by_email","description":"","inputSchema":{"type":"object","required":["crm","email"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"type":"string"}}},"logicalName":"sfdc_get_case_by_email","displayName":"sfdc_get_case_by_email","title":"sfdc_get_case_by_email","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sfdc_update_case","description":"","inputSchema":{"type":"object","required":["crm","case_id","payload"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"case_id":{"type":"string"},"payload":{"type":"object","additionalProperties":true}}},"logicalName":"sfdc_update_case","displayName":"sfdc_update_case","title":"sfdc_update_case","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sfdc_delete_case","description":"","inputSchema":{"type":"object","required":["crm","case_id"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"case_id":{"type":"string"}}},"logicalName":"sfdc_delete_case","displayName":"sfdc_delete_case","title":"sfdc_delete_case","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sfdc_get_case_latest_update","description":"","inputSchema":{"type":"object","required":["crm","case_number"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"case_number":{"type":"string"}}},"logicalName":"sfdc_get_case_latest_update","displayName":"sfdc_get_case_latest_update","title":"sfdc_get_case_latest_update","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sfdc_get_case_status","description":"","inputSchema":{"type":"object","required":["crm"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"identifier":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}}},"logicalName":"sfdc_get_case_status","displayName":"sfdc_get_case_status","title":"sfdc_get_case_status","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sfdc_create_lead","description":"","inputSchema":{"type":"object","required":["crm","payload"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"payload":{"type":"object","additionalProperties":true}}},"logicalName":"sfdc_create_lead","displayName":"sfdc_create_lead","title":"sfdc_create_lead","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sfdc_create_contact","description":"","inputSchema":{"type":"object","required":["crm","payload"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"payload":{"type":"object","additionalProperties":true}}},"logicalName":"sfdc_create_contact","displayName":"sfdc_create_contact","title":"sfdc_create_contact","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sfdc_get_contact","description":"","inputSchema":{"type":"object","required":["crm"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"mobile":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}}},"logicalName":"sfdc_get_contact","displayName":"sfdc_get_contact","title":"sfdc_get_contact","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sfdc_upsert_contact","description":"","inputSchema":{"type":"object","required":["crm","payload"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"payload":{"type":"object","additionalProperties":true}}},"logicalName":"sfdc_upsert_contact","displayName":"sfdc_upsert_contact","title":"sfdc_upsert_contact","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sfdc_create_case_by_contact","description":"Create a Salesforce Case linked to a Contact resolved via email/phone/mobile.","inputSchema":{"type":"object","required":["crm","subject","description"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"mobile":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"origin":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"payload":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"default":null},"subject":{"type":"string"},"contact_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"supplied_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}}},"logicalName":"sfdc_create_case_by_contact","displayName":"sfdc_create_case_by_contact","title":"sfdc_create_case_by_contact","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sfdc_update_case_by_contact","description":"Update a Salesforce Case located by `identifier` (CaseNumber/Id) or by\n    the latest open Case for the given email/phone/mobile.","inputSchema":{"type":"object","required":["crm"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"mobile":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"payload":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}],"default":null},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"identifier":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}}},"logicalName":"sfdc_update_case_by_contact","displayName":"sfdc_update_case_by_contact","title":"sfdc_update_case_by_contact","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sfdc_list_cases","description":"","inputSchema":{"type":"object","required":["crm"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"limit":{"type":"integer","default":10},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"mobile":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}}},"logicalName":"sfdc_list_cases","displayName":"sfdc_list_cases","title":"sfdc_list_cases","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sfdc_get_case_update","description":"","inputSchema":{"type":"object","required":["crm"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"mobile":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"identifier":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}}},"logicalName":"sfdc_get_case_update","displayName":"sfdc_get_case_update","title":"sfdc_get_case_update","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sfdc_close_case","description":"","inputSchema":{"type":"object","required":["crm"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"mobile":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"identifier":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"closed_status":{"type":"string","default":"Closed"}}},"logicalName":"sfdc_close_case","displayName":"sfdc_close_case","title":"sfdc_close_case","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sn_get_incident","description":"Get a ServiceNow incident by incident number (INC0001234), email, or phone.\n    Priority: identifier (INC#/sys_id) > email > phone > mobile.\n    Use for voice bot (phone) and chat bot (email) lookups.","inputSchema":{"type":"object","required":["crm"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"mobile":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"identifier":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}}},"logicalName":"sn_get_incident","displayName":"sn_get_incident","title":"sn_get_incident","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sn_list_incidents","description":"List incidents for a caller identified by email, phone, or mobile number.","inputSchema":{"type":"object","required":["crm"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"limit":{"type":"integer","default":10},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"mobile":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"active_only":{"type":"boolean","default":true}}},"logicalName":"sn_list_incidents","displayName":"sn_list_incidents","title":"sn_list_incidents","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sn_add_work_note","description":"Add a private work note to an incident — visible to agents only, NOT the end user.\n    Use for logging AI actions, call summaries, troubleshooting steps, or handoff context.\n    incident_id: INC number or sys_id.","inputSchema":{"type":"object","required":["crm","incident_id","note"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"note":{"type":"string"},"incident_id":{"type":"string"}}},"logicalName":"sn_add_work_note","displayName":"sn_add_work_note","title":"sn_add_work_note","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sn_add_comment","description":"Add a customer-visible comment to an incident.\n    Use when the virtual agent sends an update back to the end user.\n    incident_id: INC number or sys_id.","inputSchema":{"type":"object","required":["crm","incident_id","comment"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"comment":{"type":"string"},"incident_id":{"type":"string"}}},"logicalName":"sn_add_comment","displayName":"sn_add_comment","title":"sn_add_comment","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sn_get_latest_notes","description":"Get the latest work notes and comments on an incident (newest first).\n    Returns type (work_note/comment), author, timestamp, and body.\n    Use to brief the agent or voice bot before a handoff.\n    incident_id: INC number or sys_id.","inputSchema":{"type":"object","required":["crm","incident_id"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"limit":{"type":"integer","default":5},"incident_id":{"type":"string"}}},"logicalName":"sn_get_latest_notes","displayName":"sn_get_latest_notes","title":"sn_get_latest_notes","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sn_resolve_incident","description":"Resolve or close a ServiceNow incident.\n    - incident_id: INC number or sys_id\n    - resolution_notes: required — explanation of how the issue was resolved\n    - close_code: 'Solved (Permanently)', 'Solved (Work Around)',\n                  'Closed/Resolved by Caller', 'Not Solved (Too Costly)'\n    - state: 'resolved' (default) or 'closed'\n    Use at the end of a voice/chat bot session when the IT issue is fixed.","inputSchema":{"type":"object","required":["crm","incident_id","resolution_notes"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"state":{"type":"string","default":"resolved"},"close_code":{"type":"string","default":"Solved (Permanently)"},"incident_id":{"type":"string"},"resolution_notes":{"type":"string"}}},"logicalName":"sn_resolve_incident","displayName":"sn_resolve_incident","title":"sn_resolve_incident","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sn_get_incident_status","description":"Get the current status of an incident + latest note in one call.\n    Accepts incident number, email, or phone.\n    Perfect for voice bot \"check my ticket status\" or \"any update on my issue?\" intents.","inputSchema":{"type":"object","required":["crm"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"mobile":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"identifier":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}}},"logicalName":"sn_get_incident_status","displayName":"sn_get_incident_status","title":"sn_get_incident_status","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sn_search_incidents","description":"Search incidents by caller email, phone, or mobile number.\n    Returns all matching incidents sorted by most recently updated.","inputSchema":{"type":"object","required":["crm"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"mobile":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}}},"logicalName":"sn_search_incidents","displayName":"sn_search_incidents","title":"sn_search_incidents","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"vc_get_customer","description":"Search and retrieve full customer contact details from the VConnect CRM.\n    Look up by caller phone number (voice bot) or email address (chat/email bot).\n    Returns: customer name, email, phone, company, product/plan, segment, account\n    number, plus `cases` (all their cases with case_number and status),\n    `open_cases` (count not Resolved/Closed) and `total_cases`.\n    THIS is the tool to find a caller's cases by phone — then pass the case id\n    to vc_get_case / vc_get_case_notes for detai","inputSchema":{"type":"object","required":["crm"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}}},"logicalName":"vc_get_customer","displayName":"vc_get_customer","title":"vc_get_customer","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"vc_get_open_case","description":"Get the caller's CURRENT OPEN case directly by phone number or email.\n    Returns: open_case (the most recently updated case that is not Resolved/Closed,\n    with id, case_number, subject, status, priority and latest update), plus\n    open_case_count and any other_open_cases. open_case is null when the\n    customer has no open cases — offer to create a new case in that situation.\n    Use this first on a call when the caller asks about \"my case\" / an existing\n    issue; it needs only the caller's","inputSchema":{"type":"object","required":["crm"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}}},"logicalName":"vc_get_open_case","displayName":"vc_get_open_case","title":"vc_get_open_case","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"vc_get_case","description":"Get case details. Look up by:\n    - case_id: case number (e.g. '1015') — returns single case details with notes\n    - phone: customer phone number — returns ALL cases for that customer\n    - email: customer email — returns ALL cases for that customer\n    Priority: case_id > phone > email.\n    Returns: case number, subject, status, priority, channel, assigned agent,\n    current update, customer input, escalation status.\n    Tip: for just the caller's CURRENT OPEN case, prefer vc_get_open_case.","inputSchema":{"type":"object","required":["crm"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"case_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}}},"logicalName":"vc_get_case","displayName":"vc_get_case","title":"vc_get_case","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"vc_get_case_notes","description":"Get the latest engagement notes and updates for a specific case.\n    Returns all timestamped notes with note number, agent name, and content.\n    Each note represents an interaction (call, chat, email) logged by an agent.\n    Use to brief the AI agent on recent case activity before speaking to the caller.","inputSchema":{"type":"object","required":["crm","case_id"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"case_id":{"type":"string"}}},"logicalName":"vc_get_case_notes","displayName":"vc_get_case_notes","title":"vc_get_case_notes","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"vc_get_service_history","description":"Get the service status & history timeline for a customer (telco/ISP vertical).\n    Returns chronological service events (Provisioned, SpeedChange, Suspended,\n    FaultRaised, Restored, Terminated) with detail, resulting status, and timestamp.\n    Use to brief the AI agent on a broadband line's history before assisting the caller\n    (e.g. \"When was my service suspended?\" or \"Was my speed upgrade applied?\").","inputSchema":{"type":"object","required":["crm","customer_id"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"customer_id":{"type":"string"}}},"logicalName":"vc_get_service_history","displayName":"vc_get_service_history","title":"vc_get_service_history","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"vc_get_products","description":"List the plan/product catalog so you can recommend or compare options.\n    - vertical: optional filter, e.g. 'telco' (broadband plans) or 'insurance'.\n    Each product returns code, name, category, description, price_from/price_to,\n    and attributes. Telco plans include speed/contract; PROMO plans include\n    `promo: true`, `promo_price`, and `usual_price` for upsell pitches\n    (e.g. recommend the 10Gbps promo at $42/mo, usual $60).","inputSchema":{"type":"object","required":["crm"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"vertical":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}}},"logicalName":"vc_get_products","displayName":"vc_get_products","title":"vc_get_products","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"vc_change_plan","description":"Change a telco/broadband customer's plan (e.g. upgrade 1Gbps -> 10Gbps).\n    Identify the new plan by `plan_code` (e.g. 'FB10G') or `plan_name`\n    (e.g. 'Fibre Broadband 10Gbps'); list options first with vc_get_products.\n    Updates the customer's plan, monthly fee, and speeds, and logs a 'PlanChange'\n    service event. Use AFTER the customer confirms they want to switch.\n    Promo plans bill at the promo price. Returns the from/to plan and updated customer.","inputSchema":{"type":"object","required":["crm","customer_id"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"plan_code":{"type":"string","default":""},"plan_name":{"type":"string","default":""},"customer_id":{"type":"string"}}},"logicalName":"vc_change_plan","displayName":"vc_change_plan","title":"vc_change_plan","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"vc_create_customer","description":"Create a new customer contact in the VConnect CRM.\n    Use when a new caller/chatter is not found in the system.\n    - Voice bot: provide phone number from caller ID\n    - Chat bot: provide email from chat session\n    Returns the created customer profile with ID for case creation.","inputSchema":{"type":"object","required":["crm","first_name"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"type":"string","default":""},"phone":{"type":"string","default":""},"company":{"type":"string","default":""},"product":{"type":"string","default":""},"segment":{"type":"string","default":"General"},"last_name":{"type":"string","default":""},"first_name":{"type":"string"}}},"logicalName":"vc_create_customer","displayName":"vc_create_customer","title":"vc_create_customer","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"vc_update_customer","description":"Update an existing customer's contact details.\n    Only supply the fields you want to change.\n    Use when the customer provides updated information during a call or chat.","inputSchema":{"type":"object","required":["crm","customer_id"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"company":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"product":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"segment":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"customer_id":{"type":"integer"}}},"logicalName":"vc_update_customer","displayName":"vc_update_customer","title":"vc_update_customer","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"vc_create_case","description":"Create a new case/ticket for a customer.\n    Use when the caller or chatter reports a new issue, request, or enquiry.\n    - customer_id: VConnect CRM customer ID (get from vc_get_customer)\n    - subject: brief summary (e.g. 'Service/plan enquiry', 'Billing enquiry', 'Fault report')\n    - description: detailed description of the issue\n    - priority: Low, Medium, High\n    - channel: Phone, Email, Chat, WhatsApp\n    - customer_input: what the customer said or requested (verbatim or summarised)","inputSchema":{"type":"object","required":["crm","customer_id","subject"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"channel":{"type":"string","default":"Phone"},"subject":{"type":"string"},"priority":{"type":"string","default":"Medium"},"customer_id":{"type":"integer"},"customer_input":{"type":"string","default":""}}},"logicalName":"vc_create_case","displayName":"vc_create_case","title":"vc_create_case","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"vc_update_case","description":"Record customer input on a case. Each input is timestamped and appended\n    to the case history (not overwritten). Use when the customer provides\n    additional information, feedback, or a request during a voice call or chat.\n    - case_id: the case ID to update\n    - customer_input: what the customer said or requested (verbatim or summarised)\n    Returns the updated case with full customer input history.","inputSchema":{"type":"object","required":["crm","case_id"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"case_id":{"type":"string"},"customer_input":{"type":"string","default":""}}},"logicalName":"vc_update_case","displayName":"vc_update_case","title":"vc_update_case","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"vc_close_case","description":"Close/resolve a case.\n    Use at the end of a voice or chat session when the issue is fully resolved.\n    Closing AUTOMATICALLY notifies the customer via WhatsApp (\"Your case has been\n    closed.\"), so you normally only need to pass `resolution`.\n    - resolution: internal resolution summary for agents (also appended to the\n      customer's WhatsApp closure message).\n    - current_update: LEAVE EMPTY in the normal case. Only set this if the customer\n      needs a SEPARATE customer-facing message","inputSchema":{"type":"object","required":["crm","case_id"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"case_id":{"type":"string"},"resolution":{"type":"string","default":""},"current_update":{"type":"string","default":""}}},"logicalName":"vc_close_case","displayName":"vc_close_case","title":"vc_close_case","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"vc_get_bookings","description":"Get upcoming appointment bookings for a customer.\n    Look up by phone (voice bot) or email (chat bot).\n    Optionally filter by date (YYYY-MM-DD format).\n    Returns booking details: date, time, duration, location, status, and subject.","inputSchema":{"type":"object","required":["crm"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"phone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}}},"logicalName":"vc_get_bookings","displayName":"vc_get_bookings","title":"vc_get_bookings","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"vc_get_booking","description":"Read a single appointment booking by id.\n    - booking_id: numeric booking id (the integer id, not the BK-xxxx number)\n    Returns the full booking record (customer_id, booking_date, booking_time, status, etc.).","inputSchema":{"type":"object","required":["crm","booking_id"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"booking_id":{"type":"integer"}}},"logicalName":"vc_get_booking","displayName":"vc_get_booking","title":"vc_get_booking","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"vc_cancel_booking","description":"Cancel an appointment booking (soft-delete).","inputSchema":{"type":"object","required":["crm","booking_id"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"reason":{"type":"string","default":""},"booking_id":{"type":"integer"}}},"logicalName":"vc_cancel_booking","displayName":"vc_cancel_booking","title":"vc_cancel_booking","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"vc_create_lead","description":"Create a new lead in VConnect CRM. Automatically checks for duplicates:\n    - If phone or email matches an existing CONTACT, returns the existing contact (no lead created)\n    - If phone or email matches an existing LEAD, returns the existing lead (no duplicate created)\n    - If no match found, creates a new lead with status 'New'\n    Use when a new caller/chatter is not found in contacts. Captures their info for follow-up.\n    - source: Voice Bot, Chat Bot, Email, Web, Referral\n    - notes: wha","inputSchema":{"type":"object","required":["crm","first_name"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"email":{"type":"string","default":""},"notes":{"type":"string","default":""},"phone":{"type":"string","default":""},"source":{"type":"string","default":"Voice Bot"},"last_name":{"type":"string","default":""},"first_name":{"type":"string"}}},"logicalName":"vc_create_lead","displayName":"vc_create_lead","title":"vc_create_lead","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"vc_get_leads","description":"List leads from VConnect CRM. Optionally filter by status or search.\n    - status: New, Contacted, Qualified, Converted, Lost\n    - query: search by name, email, phone, or lead number","inputSchema":{"type":"object","required":["crm"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"query":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}}},"logicalName":"vc_get_leads","displayName":"vc_get_leads","title":"vc_get_leads","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"vc_convert_lead","description":"Convert a lead into a full contact in VConnect CRM.\n    Creates a new customer record from the lead data and marks the lead as 'Converted'.\n    Use when a lead has been qualified and is ready to become a customer.","inputSchema":{"type":"object","required":["crm","lead_id"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"lead_id":{"type":"string"}}},"logicalName":"vc_convert_lead","displayName":"vc_convert_lead","title":"vc_convert_lead","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"vc_escalate_case","description":"Escalate a case. Sets escalation flag to Yes and records the reason.\n    Use when the AI agent or human agent determines a case needs supervisor attention,\n    e.g. customer complaint, complex issue, high-value account, or unresolved dispute.\n    - case_id: the case ID to escalate\n    - reason: why this case is being escalated (e.g. 'Customer dissatisfied with resolution')\n    Returns the updated case with escalation status.","inputSchema":{"type":"object","required":["crm","case_id"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"reason":{"type":"string","default":""},"case_id":{"type":"string"}}},"logicalName":"vc_escalate_case","displayName":"vc_escalate_case","title":"vc_escalate_case","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"vc_get_case_update","description":"Get the latest customer-facing update for a case by case number.\n    Returns the most recent Current Update entry with timestamp and agent name.\n    Use when the caller asks 'What is the latest update on my case?'\n    - case_id: the case number (e.g. 1015)","inputSchema":{"type":"object","required":["crm","case_id"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"case_id":{"type":"string"}}},"logicalName":"vc_get_case_update","displayName":"vc_get_case_update","title":"vc_get_case_update","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"vc_send_sms","description":"Send an SMS message to a customer via Zoom CC.\n    - phone: customer phone number (e.g. +6587092407)\n    - message: text message content\n    Use for quick notifications, reminders, or case updates.","inputSchema":{"type":"object","required":["crm"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"phone":{"type":"string","default":""},"message":{"type":"string","default":""}}},"logicalName":"vc_send_sms","displayName":"vc_send_sms","title":"vc_send_sms","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"vc_get_available_slots","description":"Get available appointment booking slots for a specific date.\n    Use BEFORE vc_create_booking or vc_update_booking to check what times are available.\n    - date: date in YYYY-MM-DD format (e.g. '2026-04-20')\n    Returns: list of time slots with availability status, total_booked_today, max_per_day.\n    If the date is not a working day or is blocked, available=false with a reason.","inputSchema":{"type":"object","required":["crm","date"],"properties":{"crm":{"anyOf":[{"type":"string"},{"type":"null"}]},"date":{"type":"string"},"exclude_booking_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null}}},"logicalName":"vc_get_available_slots","displayName":"vc_get_available_slots","title":"vc_get_available_slots","annotations":{"untrustedContentHint":true,"readOnlyHint":true}}],"toolSource":"directory_preview","agentAction":"both","installLinks":[{"id":"cursor","label":"Cursor","href":"cursor://anysphere.cursor-deeplink/mcp/install?name=VConnect-Technologies&config=eyJ1cmwiOiAiaHR0cHM6Ly9tY3AudmNvbm5lY3RzZy5jb20vbWNwIn0%3D"},{"id":"vscode","label":"VS Code","href":"vscode:mcp/install?%7B%22name%22%3A%22VConnect-Technologies%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.vconnectsg.com%2Fmcp%22%7D"},{"id":"vscode-insiders","label":"VS Code Insiders","href":"vscode-insiders:mcp/install?%7B%22name%22%3A%22VConnect-Technologies%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.vconnectsg.com%2Fmcp%22%7D"},{"id":"claude-web","label":"Claude.ai","href":"https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=VConnect+Technologies&connectorUrl=https%3A%2F%2Fmcp.vconnectsg.com%2Fmcp"},{"id":"codex","label":"Codex","copyText":"codex mcp add \"VConnect-Technologies\" --url \"https://mcp.vconnectsg.com/mcp\""},{"id":"chatgpt","label":"ChatGPT","href":"https://www.mcpbundles.com/docs/integrations/chatgpt"}],"catalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/vconnectsg-mcp-b8924deee2","callUrl":"https://www.mcpbundles.com/api/directory/v1/servers/vconnectsg-mcp-b8924deee2/tools/{tool}","mcpServerUrl":"https://mcp.vconnectsg.com/mcp","liveCatalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/vconnectsg-mcp-b8924deee2?live=1"}