Skip to main content
Glama
ghl-mcp-server-v2

ghl-mcp-server-v2

by zackscriven

ghl_voice_ai_update_action

Idempotent

Updates an existing voice AI agent action's behavior and configuration, including call transfers, data extraction, SMS, appointment booking, workflows, and custom API calls.

Instructions

Update Agent Action Update an existing action for a voice AI agent. Modifies the behavior and configuration of an agent action. Endpoint: PUT /voice-ai/actions/{actionId} (Version header: v3; source: v3/voice-ai-v3.json) OAuth scopes: voice-ai-agent-goals.write

Input Schema

NameRequiredDescriptionDefault
bodyYesRequest body (schema carried verbatim from the official OpenAPI spec).
actionIdYesUnique identifier for the action

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changedv2.1.0
    • changedInput schema / properties / body / properties / actionParameters / oneOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "hearWhisperMessage": {
      -        "description": "Whether to play whisper message to the receiving party",
      -        "example": true,
      -        "type": "boolean"
      -      },
      -      "transferToType": {
      -        "description": "Type of transfer destination (currently only \"number\" is supported)",
      -        "enum": [
      -          "number"
      -        ],
      -        "example": "number",
      -        "type": "string"
      -      },
      -      "transferToValue": {
      -        "description": "Phone number to transfer to. Must start with +, include country code, contain only numbers, and be 11-16 characters long (e.g., +12345678901).",
      -        "example": "+12345678901",
      -        "type": "string"
      -      },
      -      "triggerMessage": {
      -        "description": "Message to tell the caller before transferring",
      -        "example": "Let me transfer you to a manager right away",
      -        "type": "string"
      -      },
      -      "triggerPrompt": {
      -        "description": "When to trigger this action during the call",
      -        "example": "When the caller asks to speak to a manager",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "triggerPrompt",
      -      "transferToType",
      -      "transferToValue",
      -      "triggerMessage"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "contactFieldId": {
      -        "description": "ID of the contact field to be updated with the extracted data",
      -        "example": "507f1f77bcf86cd799439011",
      -        "type": "string"
      -      },
      -      "description": {
      -        "description": "Description of what data to extract",
      -        "example": "Caller's phone number",
      -        "type": "string"
      -      },
      -      "examples": {
      -        "description": "Example values to help Agent understand the expected format. At least one example is required, maximum 5 examples allowed.",
      -        "example": [
      -          "+1234567890",
      -          "+9876543210"
      -        ],
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "overwriteExistingValue": {
      -        "default": false,
      -        "description": "Whether to overwrite existing field value if already set, default is false",
      -        "example": false,
      -        "type": "boolean"
      -      }
      -    },
      -    "required": [
      -      "contactFieldId",
      -      "description",
      -      "examples"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "contactFieldId": {
      -        "description": "ID of the contact field to be updated with the extracted data",
      -        "example": "507f1f77bcf86cd799439011",
      -        "type": "string"
      -      },
      -      "description": {
      -        "description": "Description of what data to extract",
      -        "example": "Caller's phone number",
      -        "type": "string"
      -      },
      -      "examples": {
      -        "description": "Example values to help Agent understand the expected format. At least one example is required, maximum 5 examples allowed.",
      -        "example": [
      -          "+1234567890",
      -          "+9876543210"
      -        ],
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "overwriteExistingValue": {
      -        "default": false,
      -        "description": "Whether to overwrite existing field value if already set, default is false",
      -        "example": false,
      -        "type": "boolean"
      -      }
      -    },
      -    "required": [
      -      "contactFieldId",
      -      "description",
      -      "examples"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "triggerMessage": {
      -        "description": "Message to tell the caller",
      -        "example": "Let me start that process for you",
      -        "type": "string"
      -      },
      -      "triggerPrompt": {
      -        "description": "When to trigger this workflow",
      -        "example": "When caller requests a quote",
      -        "type": "string"
      -      },
      -      "workflowId": {
      -        "description": "Workflow ID to trigger",
      -        "example": "507f1f77bcf86cd799439011",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "triggerPrompt",
      -      "triggerMessage",
      -      "workflowId"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "messageBody": {
      -        "description": "SMS message content to send",
      -        "example": "Your appointment is confirmed for tomorrow at 2 PM",
      -        "type": "string"
      -      },
      -      "triggerMessage": {
      -        "description": "Message to tell the caller",
      -        "example": "I'll send you a confirmation text",
      -        "type": "string"
      -      },
      -      "triggerPrompt": {
      -        "description": "When to send the SMS",
      -        "example": "When caller asks for booking confirmation",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "triggerPrompt",
      -      "triggerMessage",
      -      "messageBody"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "calendarId": {
      -        "description": "Calendar ID to book appointments in",
      -        "example": "507f1f77bcf86cd799439011",
      -        "type": "string"
      -      },
      -      "daysOfOfferingDates": {
      -        "description": "Number of days ahead to offer booking dates",
      -        "example": 3,
      -        "type": "number"
      -      },
      -      "hoursBetweenSlots": {
      -        "description": "Hours between available slots",
      -        "example": 1,
      -        "type": "number"
      -      },
      -      "slotsPerDay": {
      -        "description": "Number of available slots per day",
      -        "example": 3,
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "calendarId",
      -      "daysOfOfferingDates",
      -      "slotsPerDay",
      -      "hoursBetweenSlots"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "apiDetails": {
      -        "allOf": [
      -          {
      -            "properties": {
      -              "authenticationRequired": {
      -                "description": "Whether authentication is required",
      -                "example": true,
      -                "type": "boolean"
      -              },
      -              "authenticationValue": {
      -                "description": "Authentication token or API key (required if authenticationRequired is true)",
      -                "example": "token123",
      -                "type": "string"
      -              },
      -              "headers": {
      -                "description": "HTTP headers to include",
      -                "items": {
      -                  "properties": {
      -                    "key": {
      -                      "description": "HTTP header name",
      -                      "example": "id",
      -                      "type": "string"
      -                    },
      -                    "value": {
      -                      "description": "HTTP header value",
      -                      "example": "1234567890",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "key",
      -                    "value"
      -                  ],
      -                  "type": "object"
      -                },
      -                "type": "array"
      -              },
      -              "method": {
      -                "description": "HTTP method",
      -                "enum": [
      -                  "POST",
      -                  "GET"
      -                ],
      -                "example": "GET",
      -                "type": "string"
      -              },
      -              "parameters": {
      -                "description": "API parameters to send",
      -                "items": {
      -                  "properties": {
      -                    "description": {
      -                      "description": "Parameter description",
      -                      "example": "Order ID to look up",
      -                      "type": "string"
      -                    },
      -                    "example": {
      -                      "description": "Example parameter value",
      -                      "example": "ORD-12345",
      -                      "type": "string"
      -                    },
      -                    "name": {
      -                      "description": "Parameter name",
      -                      "example": "orderId",
      -                      "type": "string"
      -                    },
      -                    "type": {
      -                      "description": "Parameter type",
      -                      "example": "string",
      -                      "type": "string"
      -                    }
      -                  },
      -                  "required": [
      -                    "name"
      -                  ],
      -                  "type": "object"
      -                },
      -                "type": "array"
      -              },
      -              "url": {
      -                "description": "API endpoint URL",
      -                "example": "https://api.example.com/orders",
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "url",
      -              "method"
      -            ],
      -            "type": "object"
      -          }
      -        ],
      -        "description": "API endpoint configuration"
      -      },
      -      "selectedPaths": {
      -        "description": "Selected response paths to extract from API response. Required: at least 1 value if the method is GET. Should be empty if the method is POST.",
      -        "example": [
      -          "data.orderId",
      -          "status"
      -        ],
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "triggerMessage": {
      -        "description": "Message to tell the caller",
      -        "example": "Let me check that order status",
      -        "type": "string"
      -      },
      -      "triggerPrompt": {
      -        "description": "When to call the custom API",
      -        "example": "When caller provides order number",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "triggerPrompt",
      -      "triggerMessage",
      -      "apiDetails"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "knowledgeBaseId": {
      -        "description": "Knowledge base ID to query",
      -        "example": "507f1f77bcf86cd799439011",
      -        "type": "string"
      -      },
      -      "triggerPrompt": {
      -        "description": "When to query the knowledge base",
      -        "example": "When caller asks about pricing",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "triggerPrompt",
      -      "knowledgeBaseId"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "properties": {
      +      "hearWhisperMessage": {
      +        "description": "Whether to play whisper message to the receiving party",
      +        "example": true,
      +        "type": "boolean"
      +      },
      +      "transferToType": {
      +        "description": "Type of transfer destination (currently only \"number\" is supported)",
      +        "enum": [
      +          "number"
      +        ],
      +        "example": "number",
      +        "type": "string"
      +      },
      +      "transferToValue": {
      +        "description": "Phone number to transfer to. Must start with +, include country code, contain only numbers, and be 11-16 characters long (e.g., +12345678901).",
      +        "example": "+12345678901",
      +        "type": "string"
      +      },
      +      "triggerMessage": {
      +        "description": "Message to tell the caller before transferring",
      +        "example": "Let me transfer you to a manager right away",
      +        "type": "string"
      +      },
      +      "triggerPrompt": {
      +        "description": "When to trigger this action during the call",
      +        "example": "When the caller asks to speak to a manager",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "triggerPrompt",
      +      "transferToType",
      +      "transferToValue",
      +      "triggerMessage"
      +    ],
      +    "title": "CallTransferActionParameters",
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "contactFieldId": {
      +        "description": "ID of the contact field to be updated with the extracted data",
      +        "example": "507f1f77bcf86cd799439011",
      +        "type": "string"
      +      },
      +      "description": {
      +        "description": "Description of what data to extract",
      +        "example": "Caller's phone number",
      +        "type": "string"
      +      },
      +      "examples": {
      +        "description": "Example values to help Agent understand the expected format. At least one example is required, maximum 5 examples allowed.",
      +        "example": [
      +          "+1234567890",
      +          "+9876543210"
      +        ],
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "overwriteExistingValue": {
      +        "default": false,
      +        "description": "Whether to overwrite existing field value if already set, default is false",
      +        "example": false,
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "contactFieldId",
      +      "description",
      +      "examples"
      +    ],
      +    "title": "DataExtractionActionParameters",
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "contactFieldId": {
      +        "description": "ID of the contact field to be updated with the extracted data",
      +        "example": "507f1f77bcf86cd799439011",
      +        "type": "string"
      +      },
      +      "description": {
      +        "description": "Description of what data to extract",
      +        "example": "Caller's phone number",
      +        "type": "string"
      +      },
      +      "examples": {
      +        "description": "Example values to help Agent understand the expected format. At least one example is required, maximum 5 examples allowed.",
      +        "example": [
      +          "+1234567890",
      +          "+9876543210"
      +        ],
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "overwriteExistingValue": {
      +        "default": false,
      +        "description": "Whether to overwrite existing field value if already set, default is false",
      +        "example": false,
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "contactFieldId",
      +      "description",
      +      "examples"
      +    ],
      +    "title": "InCallDataExtractionActionParameters",
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "triggerMessage": {
      +        "description": "Message to tell the caller",
      +        "example": "Let me start that process for you",
      +        "type": "string"
      +      },
      +      "triggerPrompt": {
      +        "description": "When to trigger this workflow",
      +        "example": "When caller requests a quote",
      +        "type": "string"
      +      },
      +      "workflowId": {
      +        "description": "Workflow ID to trigger",
      +        "example": "507f1f77bcf86cd799439011",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "triggerPrompt",
      +      "triggerMessage",
      +      "workflowId"
      +    ],
      +    "title": "WorkflowTriggerParameters",
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "messageBody": {
      +        "description": "SMS message content to send",
      +        "example": "Your appointment is confirmed for tomorrow at 2 PM",
      +        "type": "string"
      +      },
      +      "triggerMessage": {
      +        "description": "Message to tell the caller",
      +        "example": "I'll send you a confirmation text",
      +        "type": "string"
      +      },
      +      "triggerPrompt": {
      +        "description": "When to send the SMS",
      +        "example": "When caller asks for booking confirmation",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "triggerPrompt",
      +      "triggerMessage",
      +      "messageBody"
      +    ],
      +    "title": "SMSParameters",
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "calendarId": {
      +        "description": "Calendar ID to book appointments in",
      +        "example": "507f1f77bcf86cd799439011",
      +        "type": "string"
      +      },
      +      "daysOfOfferingDates": {
      +        "description": "Number of days ahead to offer booking dates",
      +        "example": 3,
      +        "type": "number"
      +      },
      +      "hoursBetweenSlots": {
      +        "description": "Hours between available slots",
      +        "example": 1,
      +        "type": "number"
      +      },
      +      "slotsPerDay": {
      +        "description": "Number of available slots per day",
      +        "example": 3,
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "calendarId",
      +      "daysOfOfferingDates",
      +      "slotsPerDay",
      +      "hoursBetweenSlots"
      +    ],
      +    "title": "AppointmentBookingActionParameters",
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "apiDetails": {
      +        "allOf": [
      +          {
      +            "properties": {
      +              "authenticationRequired": {
      +                "description": "Whether authentication is required",
      +                "example": true,
      +                "type": "boolean"
      +              },
      +              "authenticationValue": {
      +                "description": "Authentication token or API key (required if authenticationRequired is true)",
      +                "example": "token123",
      +                "type": "string"
      +              },
      +              "headers": {
      +                "description": "HTTP headers to include",
      +                "items": {
      +                  "properties": {
      +                    "key": {
      +                      "description": "HTTP header name",
      +                      "example": "id",
      +                      "type": "string"
      +                    },
      +                    "value": {
      +                      "description": "HTTP header value",
      +                      "example": "1234567890",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "key",
      +                    "value"
      +                  ],
      +                  "title": "CustomActionHeaderDTO",
      +                  "type": "object"
      +                },
      +                "type": "array"
      +              },
      +              "method": {
      +                "description": "HTTP method",
      +                "enum": [
      +                  "POST",
      +                  "GET"
      +                ],
      +                "example": "GET",
      +                "type": "string"
      +              },
      +              "parameters": {
      +                "description": "API parameters to send",
      +                "items": {
      +                  "properties": {
      +                    "description": {
      +                      "description": "Parameter description",
      +                      "example": "Order ID to look up",
      +                      "type": "string"
      +                    },
      +                    "example": {
      +                      "description": "Example parameter value",
      +                      "example": "ORD-12345",
      +                      "type": "string"
      +                    },
      +                    "name": {
      +                      "description": "Parameter name",
      +                      "example": "orderId",
      +                      "type": "string"
      +                    },
      +                    "type": {
      +                      "description": "Parameter type",
      +                      "example": "string",
      +                      "type": "string"
      +                    }
      +                  },
      +                  "required": [
      +                    "name"
      +                  ],
      +                  "title": "CustomActionParameterDTO",
      +                  "type": "object"
      +                },
      +                "type": "array"
      +              },
      +              "url": {
      +                "description": "API endpoint URL",
      +                "example": "https://api.example.com/orders",
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "url",
      +              "method"
      +            ],
      +            "title": "CustomActionApiDetailsDTO",
      +            "type": "object"
      +          }
      +        ],
      +        "description": "API endpoint configuration"
      +      },
      +      "selectedPaths": {
      +        "description": "Selected response paths to extract from API response. Required: at least 1 value if the method is GET. Should be empty if the method is POST.",
      +        "example": [
      +          "data.orderId",
      +          "status"
      +        ],
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "triggerMessage": {
      +        "description": "Message to tell the caller",
      +        "example": "Let me check that order status",
      +        "type": "string"
      +      },
      +      "triggerPrompt": {
      +        "description": "When to call the custom API",
      +        "example": "When caller provides order number",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "triggerPrompt",
      +      "triggerMessage",
      +      "apiDetails"
      +    ],
      +    "title": "CustomActionParameters",
      +    "type": "object"
      +  },
      +  {
      +    "properties": {
      +      "knowledgeBaseId": {
      +        "description": "Knowledge base ID to query",
      +        "example": "507f1f77bcf86cd799439011",
      +        "type": "string"
      +      },
      +      "triggerPrompt": {
      +        "description": "When to query the knowledge base",
      +        "example": "When caller asks about pricing",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "triggerPrompt",
      +      "knowledgeBaseId"
      +    ],
      +    "title": "KnowledgeBaseParameters",
      +    "type": "object"
      +  }
      +]
    • addedInput schema / properties / body / title
      Added value: +"UpdateSingleActionDTO"
  2. First observedv2.0.0

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover safety (readOnlyHint=false, idempotentHint=true, destructiveHint=false), and the description adds real context beyond them: the PUT HTTP semantics, the v3 API version header, and the required OAuth scope voice-ai-agent-goals.write. It does not state whether the update is a full replace versus partial merge, which would matter for a PUT with a required actionParameters object.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the operation summary, then supporting endpoint and scope metadata in one compact block. The OpenAPI source-file reference ('v3/voice-ai-v3.json') is provenance noise rather than agent-useful content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a fully documented nested schema, no output schema, and annotations that already carry the safety profile, the description supplies what the structured fields cannot: endpoint, version header, and required OAuth scope. Nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the nested actionParameters union is documented in detail, so the schema does the heavy lifting. The description only surfaces the {actionId} path parameter and adds no guidance beyond it, matching the baseline for high-coverage schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Update an existing action for a voice AI agent', and clarifies the effect ('Modifies the behavior and configuration'). It is distinguishable from create/delete/get action siblings by the verb alone, though it never names them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use guidance, no mention of alternatives (e.g. create vs update, or the separate conversation_ai_update_action tool), and no statement about what happens when the action does not exist. Only the implicit precondition that an existing actionId is required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Deploy Server

Other Tools