Vextro
The official WhatsApp Business API, set up for you: we connect your number and build your first campaign and chatbot with you. Pricing tailored to your business.
This listing identifies a third-party MCP server. MCPBundles is not affiliated with, sponsored by, or endorsed by the service or its operator unless stated on this page.
https://vextro.nethttps://mcp.vextro.net/mcpLast probed Nov 3, 2026 · mcp.vextro.net
17tools discovered
Get
Save
List
Validate
Other capabilities
Flow node catalog
get_flow_node_catalogThe node types a Vextro flow is built from: each one's settings (configFields), what it does, whether it waits for the customer, its outputs (which edges it needs and their branchKeys), and whether this workspace may use it (every node reads as available before the member signs in). Also the graph rules every flow must follow. Read this before writing a flow. Pass `types` to get those nodes' full config JSON Schemas.
Add to workspace[
{
"name": "get_flow_node_catalog",
"title": "Flow node catalog",
"annotations": {
"readOnlyHint": true
},
"description": "The node types a Vextro flow is built from: each one's settings (configFields), what it does, whether it waits for the customer, its outputs (which edges it needs and their branchKeys), and whether this workspace may use it (every node reads as available before the member signs in). Also the graph rules every flow must follow. Read this before writing a flow. Pass `types` to get those nodes' full config JSON Schemas.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"types": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60
},
"maxItems": 30,
"description": "Node types to return with their full config JSON Schema"
},
"category": {
"enum": [
"trigger",
"logic",
"action"
],
"type": "string"
}
},
"additionalProperties": false
}
},
{
"name": "get_flow_resources",
"title": "Workspace resources for flows",
"annotations": {
"readOnlyHint": true
},
"description": "The workspace's own things a flow can point at — never invent these: approved WhatsApp templates (with the variable slots send_template's `variables` must fill), custom fields (keys for contact_update and {{contact.<key>}}), tags, lifecycle stages, published forms (with the formVersionId a form node pins), team members (userId for assign_agent), existing flows (ids for get_flow_draft), media library files (libraryMediaId for send_media), WhatsApp numbers, WhatsApp Flows (needs whatsappId) and appointment types. Needs the member signed in to Vextro: called before they are, it asks them to sign in.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"kinds"
],
"properties": {
"kinds": {
"type": "array",
"items": {
"enum": [
"templates",
"custom_fields",
"tags",
"lifecycle_stages",
"forms",
"team_members",
"flows",
"media",
"whatsapp_numbers",
"whatsapp_flows",
"appointment_types"
],
"type": "string"
},
"maxItems": 11,
"minItems": 1
},
"search": {
"type": "string",
"maxLength": 100,
"description": "Case-insensitive name filter"
},
"whatsappId": {
"type": "string",
"format": "uuid",
"description": "From whatsapp_numbers. Required for whatsapp_flows; narrows templates to that number's WhatsApp account — pass it when the flow runs on one number"
}
},
"additionalProperties": false
}
},
{
"name": "get_flow_draft",
"title": "Read a flow",
"annotations": {
"readOnlyHint": true
},
"description": "One flow's current draft (or its published version when it has no draft), with the `revision` save_flow_draft needs to save over it. Find flow ids with get_flow_resources kind 'flows'. Needs the member signed in to Vextro.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"flowId"
],
"properties": {
"flowId": {
"type": "string",
"format": "uuid",
"description": "A flow id, from get_flow_resources kind 'flows'"
}
},
"additionalProperties": false
}
},
{
"name": "generate_flow_draft",
"title": "Prepare a new flow",
"annotations": {
"readOnlyHint": true
},
"description": "Take a flow you wrote from the member's description and put it in Vextro's stored shape (labels, edge ids, startNodeId, positions — every repair listed), then check it exactly as publishing would. Saves nothing and sends nothing. Use get_flow_node_catalog first, and get_flow_resources for any template, field, form, team member or file. Before the member signs in, leave those blank: they come back in needsInput.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"graph"
],
"properties": {
"name": {
"type": "string",
"maxLength": 120,
"description": "What the flow will be called"
},
"graph": {
"type": "object",
"required": [
"nodes"
],
"properties": {
"edges": {
"type": "array",
"items": {
"type": "object",
"required": [
"source",
"target"
],
"properties": {
"id": {
"type": "string",
"maxLength": 120
},
"source": {
"$ref": "#/properties/graph/properties/startNodeId"
},
"target": {
"$ref": "#/properties/graph/properties/startNodeId"
},
"branchKey": {
"type": "string",
"maxLength": 80,
"description": "Omit for a node's default next step; otherwise exactly as the node's outputs rule says"
}
},
"additionalProperties": true
},
"maxItems": 1800
},
"nodes": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"type"
],
"properties": {
"id": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "Unique, short, readable: e.g. ask_email"
},
"data": {
"type": "object",
"description": "UI only: {\"label\"} (and \"position\" if you have one)",
"additionalProperties": {}
},
"type": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "A type from get_flow_node_catalog"
},
"config": {
"type": "object",
"description": "The node's settings, per its catalog configFields",
"additionalProperties": {}
}
},
"additionalProperties": true
},
"maxItems": 150
},
"settings": {
"type": "object",
"description": "Flow settings as the builder stores them; leave out unless asked",
"additionalProperties": {}
},
"startNodeId": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "The trigger node's id. Filled in when left out."
}
},
"description": "A Vextro flow in the builder's stored shape",
"additionalProperties": true
},
"notes": {
"type": "string",
"maxLength": 2000,
"description": "Assumptions you made, to hand back with the result"
},
"description": {
"type": "string",
"maxLength": 500,
"description": "One or two sentences on what the flow does — shown under its name in Vextro"
}
},
"additionalProperties": false
}
},
{
"name": "edit_flow_draft",
"title": "Edit a flow",
"annotations": {
"readOnlyHint": true
},
"description": "Apply explicit operations to a flow — add_node, update_node (config merges; null removes a key), remove_node (also removes its edges), connect (re-points an output if it already has an edge), disconnect — then check the result as publishing would. Untouched nodes stay exactly as they were. If one operation is wrong, nothing changes. Saves nothing.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"graph",
"operations"
],
"properties": {
"name": {
"type": "string",
"maxLength": 120,
"description": "The flow's name, for the returned file"
},
"graph": {
"type": "object",
"required": [
"nodes"
],
"properties": {
"edges": {
"type": "array",
"items": {
"type": "object",
"required": [
"source",
"target"
],
"properties": {
"id": {
"type": "string",
"maxLength": 120
},
"source": {
"$ref": "#/properties/graph/properties/startNodeId"
},
"target": {
"$ref": "#/properties/graph/properties/startNodeId"
},
"branchKey": {
"type": "string",
"maxLength": 80,
"description": "Omit for a node's default next step; otherwise exactly as the node's outputs rule says"
}
},
"additionalProperties": true
},
"maxItems": 1800
},
"nodes": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"type"
],
"properties": {
"id": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "Unique, short, readable: e.g. ask_email"
},
"data": {
"type": "object",
"description": "UI only: {\"label\"} (and \"position\" if you have one)",
"additionalProperties": {}
},
"type": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "A type from get_flow_node_catalog"
},
"config": {
"type": "object",
"description": "The node's settings, per its catalog configFields",
"additionalProperties": {}
}
},
"additionalProperties": true
},
"maxItems": 150
},
"settings": {
"type": "object",
"description": "Flow settings as the builder stores them; leave out unless asked",
"additionalProperties": {}
},
"startNodeId": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "The trigger node's id. Filled in when left out."
}
},
"description": "The flow to edit, e.g. from get_flow_draft",
"additionalProperties": true
},
"operations": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"required": [
"op",
"node"
],
"properties": {
"op": {
"type": "string",
"const": "add_node"
},
"node": {
"type": "object",
"required": [
"type"
],
"properties": {
"id": {
"$ref": "#/properties/graph/properties/startNodeId"
},
"type": {
"type": "string",
"maxLength": 60,
"minLength": 1
},
"label": {
"type": "string",
"maxLength": 120
},
"config": {
"type": "object",
"additionalProperties": {}
}
},
"additionalProperties": false
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"op",
"id"
],
"properties": {
"id": {
"$ref": "#/properties/graph/properties/startNodeId"
},
"op": {
"type": "string",
"const": "update_node"
},
"label": {
"type": "string",
"maxLength": 120
},
"config": {
"type": "object",
"description": "Merged into the node's config; a key set to null is removed",
"additionalProperties": {}
},
"replaceConfig": {
"type": "boolean",
"description": "Replace config whole instead of merging"
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"op",
"id"
],
"properties": {
"id": {
"$ref": "#/properties/graph/properties/startNodeId"
},
"op": {
"type": "string",
"const": "remove_node"
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"op",
"source",
"target"
],
"properties": {
"id": {
"type": "string",
"maxLength": 120
},
"op": {
"type": "string",
"const": "connect"
},
"source": {
"$ref": "#/properties/graph/properties/startNodeId"
},
"target": {
"$ref": "#/properties/graph/properties/startNodeId"
},
"branchKey": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
],
"description": "Omit or null for the default next step"
}
},
"additionalProperties": false
},
{
"type": "object",
"required": [
"op"
],
"properties": {
"op": {
"type": "string",
"const": "disconnect"
},
"edgeId": {
"type": "string",
"maxLength": 120
},
"source": {
"$ref": "#/properties/graph/properties/startNodeId"
},
"branchKey": {
"anyOf": [
{
"type": "string",
"maxLength": 80
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
}
]
},
"maxItems": 100,
"minItems": 1
},
"description": {
"type": "string",
"maxLength": 500,
"description": "The flow's description, for the returned file"
}
},
"additionalProperties": false
}
},
{
"name": "validate_flow_draft",
"title": "Check a flow",
"annotations": {
"readOnlyHint": true
},
"description": "Check a flow exactly as Vextro's Publish button would for this workspace: structure, every node's settings, WhatsApp limits, the workspace's templates, fields, stages, sheets and media, and modules. Errors name the node (or edge) they are about. Before the member signs in, everything but the workspace is checked, and blank workspace references are listed in needsInput instead of failing.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"graph"
],
"properties": {
"graph": {
"type": "object",
"required": [
"nodes"
],
"properties": {
"edges": {
"type": "array",
"items": {
"type": "object",
"required": [
"source",
"target"
],
"properties": {
"id": {
"type": "string",
"maxLength": 120
},
"source": {
"$ref": "#/properties/graph/properties/startNodeId"
},
"target": {
"$ref": "#/properties/graph/properties/startNodeId"
},
"branchKey": {
"type": "string",
"maxLength": 80,
"description": "Omit for a node's default next step; otherwise exactly as the node's outputs rule says"
}
},
"additionalProperties": true
},
"maxItems": 1800
},
"nodes": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"type"
],
"properties": {
"id": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "Unique, short, readable: e.g. ask_email"
},
"data": {
"type": "object",
"description": "UI only: {\"label\"} (and \"position\" if you have one)",
"additionalProperties": {}
},
"type": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "A type from get_flow_node_catalog"
},
"config": {
"type": "object",
"description": "The node's settings, per its catalog configFields",
"additionalProperties": {}
}
},
"additionalProperties": true
},
"maxItems": 150
},
"settings": {
"type": "object",
"description": "Flow settings as the builder stores them; leave out unless asked",
"additionalProperties": {}
},
"startNodeId": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "The trigger node's id. Filled in when left out."
}
},
"description": "A Vextro flow in the builder's stored shape",
"additionalProperties": true
}
},
"additionalProperties": false
}
},
{
"name": "preview_flow_draft",
"title": "Test a flow",
"annotations": {
"readOnlyHint": true
},
"description": "Run a flow through Vextro's real engine with sample customer replies and return what each step would do — the messages it would send, the variables it would set, where it stops. Nothing is sent and nothing is saved. Inputs: {kind:'text',text}, {kind:'tap',id} for a button or list row, {kind:'timer',reason:'delay_elapsed'|'session_timeout'}, {kind:'http',outcome:'success'|'error'}, {kind:'form',outcome:'submitted'|'rejected'}, {kind:'flow_submit',values}.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"graph"
],
"properties": {
"graph": {
"type": "object",
"required": [
"nodes"
],
"properties": {
"edges": {
"type": "array",
"items": {
"type": "object",
"required": [
"source",
"target"
],
"properties": {
"id": {
"type": "string",
"maxLength": 120
},
"source": {
"$ref": "#/properties/graph/properties/startNodeId"
},
"target": {
"$ref": "#/properties/graph/properties/startNodeId"
},
"branchKey": {
"type": "string",
"maxLength": 80,
"description": "Omit for a node's default next step; otherwise exactly as the node's outputs rule says"
}
},
"additionalProperties": true
},
"maxItems": 1800
},
"nodes": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"type"
],
"properties": {
"id": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "Unique, short, readable: e.g. ask_email"
},
"data": {
"type": "object",
"description": "UI only: {\"label\"} (and \"position\" if you have one)",
"additionalProperties": {}
},
"type": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "A type from get_flow_node_catalog"
},
"config": {
"type": "object",
"description": "The node's settings, per its catalog configFields",
"additionalProperties": {}
}
},
"additionalProperties": true
},
"maxItems": 150
},
"settings": {
"type": "object",
"description": "Flow settings as the builder stores them; leave out unless asked",
"additionalProperties": {}
},
"startNodeId": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "The trigger node's id. Filled in when left out."
}
},
"description": "A Vextro flow in the builder's stored shape",
"additionalProperties": true
},
"start": {
"type": "object",
"properties": {
"text": {
"type": "string",
"maxLength": 4096
},
"buttonId": {
"type": "string",
"maxLength": 256
}
},
"description": "The customer's first message, as the trigger sees it",
"additionalProperties": false
},
"inputs": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": {}
},
"maxItems": 60,
"description": "What the customer does next, in order"
},
"contact": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 200
},
"phone": {
"type": "string",
"maxLength": 32
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}
},
{
"name": "save_flow_draft",
"title": "Save a flow as a draft",
"annotations": {
"readOnlyHint": false
},
"description": "Save a valid flow to the member's Vextro workspace as a DRAFT — only when the member has asked you to. Every save needs the member's approval in Vextro: the call first opens an approval page for them, then runs; one approval covers one saved draft, and a save refused for errors or a changed revision can be fixed and retried without approving again. It is checked again first and refused if it has errors. To save over an existing flow pass flowId and the expectedRevision from get_flow_draft (null if it had none); if someone changed it since, the save is refused with the current revision. Without flowId, a new flow is created with `name`. The draft is not published: a person publishes it in the flow builder. Needs the member signed in to Vextro: called before they are, it asks them to sign in.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"graph"
],
"properties": {
"name": {
"type": "string",
"maxLength": 120,
"description": "Required for a new flow"
},
"graph": {
"type": "object",
"required": [
"nodes"
],
"properties": {
"edges": {
"type": "array",
"items": {
"type": "object",
"required": [
"source",
"target"
],
"properties": {
"id": {
"type": "string",
"maxLength": 120
},
"source": {
"$ref": "#/properties/graph/properties/startNodeId"
},
"target": {
"$ref": "#/properties/graph/properties/startNodeId"
},
"branchKey": {
"type": "string",
"maxLength": 80,
"description": "Omit for a node's default next step; otherwise exactly as the node's outputs rule says"
}
},
"additionalProperties": true
},
"maxItems": 1800
},
"nodes": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"type"
],
"properties": {
"id": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "Unique, short, readable: e.g. ask_email"
},
"data": {
"type": "object",
"description": "UI only: {\"label\"} (and \"position\" if you have one)",
"additionalProperties": {}
},
"type": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "A type from get_flow_node_catalog"
},
"config": {
"type": "object",
"description": "The node's settings, per its catalog configFields",
"additionalProperties": {}
}
},
"additionalProperties": true
},
"maxItems": 150
},
"settings": {
"type": "object",
"description": "Flow settings as the builder stores them; leave out unless asked",
"additionalProperties": {}
},
"startNodeId": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "The trigger node's id. Filled in when left out."
}
},
"description": "A Vextro flow in the builder's stored shape",
"additionalProperties": true
},
"flowId": {
"type": "string",
"format": "uuid",
"description": "A flow id, from get_flow_resources kind 'flows'"
},
"description": {
"type": "string",
"maxLength": 500,
"description": "Stored on a new flow, shown under its name; ignored when saving over an existing flow"
},
"expectedRevision": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
}
},
{
"name": "get_template_rules",
"title": "WhatsApp template rules",
"annotations": {
"readOnlyHint": true
},
"description": "Meta's rules for WhatsApp message templates as Vextro enforces them: categories and when each applies, components and their limits, variables, buttons, carousels, the fixed authentication shape and the validity period. Read it before writing a template.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"category": {
"enum": [
"MARKETING",
"UTILITY",
"AUTHENTICATION"
],
"type": "string"
}
},
"additionalProperties": false
}
},
{
"name": "validate_template_draft",
"title": "Check a WhatsApp template",
"annotations": {
"readOnlyHint": true
},
"description": "Check a template against the rules saving uses, without saving it or sending anything to Meta. Every error names the part it belongs to. A media header or carousel card written without its file is fine: it is listed in needsInput for the member to add in Vextro. When the member is signed in, the name is also checked against the workspace's templates.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"template"
],
"properties": {
"template": {
"type": "object",
"required": [
"name",
"language",
"category",
"components"
],
"properties": {
"name": {
"type": "string",
"maxLength": 512,
"minLength": 1,
"description": "Lowercase letters, digits and underscores, e.g. order_shipped"
},
"category": {
"type": "string",
"description": "MARKETING, UTILITY or AUTHENTICATION"
},
"language": {
"type": "string",
"maxLength": 20,
"minLength": 2,
"description": "A Meta locale code, e.g. en, en_US, hi"
},
"components": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": {}
},
"maxItems": 20,
"description": "Meta template components: HEADER, BODY, FOOTER, BUTTONS, CAROUSEL — see get_template_rules"
},
"messageSendTtlSeconds": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"description": "Validity period in seconds; leave out for the category's default"
}
},
"description": "A WhatsApp message template, in Meta's component format",
"additionalProperties": false
},
"whatsappId": {
"type": "string",
"format": "uuid",
"description": "A WhatsApp number, from get_flow_resources kind whatsapp_numbers — the template belongs to that number's WhatsApp account"
}
},
"additionalProperties": false
}
},
{
"name": "list_templates",
"title": "List the workspace's WhatsApp templates",
"annotations": {
"readOnlyHint": true
},
"description": "The workspace's WhatsApp templates with their status (APPROVED, PENDING, REJECTED with the reason, PAUSED, DRAFT) and whether each is on WhatsApp. Filter by number, status, category or name. Needs the member signed in to Vextro.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"page": {
"type": "integer",
"maximum": 1000,
"minimum": 1
},
"search": {
"type": "string",
"maxLength": 100
},
"status": {
"enum": [
"APPROVED",
"PENDING",
"REJECTED",
"PAUSED",
"DRAFT"
],
"type": "string"
},
"category": {
"enum": [
"MARKETING",
"UTILITY",
"AUTHENTICATION"
],
"type": "string"
},
"whatsappId": {
"type": "string",
"format": "uuid",
"description": "A WhatsApp number, from get_flow_resources kind whatsapp_numbers — the template belongs to that number's WhatsApp account"
}
},
"additionalProperties": false
}
},
{
"name": "get_template",
"title": "Read a WhatsApp template",
"annotations": {
"readOnlyHint": true
},
"description": "One template in full: its components, status and the `revision` save_template_draft needs to update it. `editable` is true only for a draft that was never submitted; anything on WhatsApp is copied, not changed. Needs the member signed in to Vextro.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"templateId"
],
"properties": {
"templateId": {
"type": "string",
"format": "uuid",
"description": "A template id, from list_templates"
}
},
"additionalProperties": false
}
},
{
"name": "save_template_draft",
"title": "Save a WhatsApp template as a draft",
"annotations": {
"readOnlyHint": false
},
"description": "Save a template to the member's Vextro workspace as a DRAFT — only when the member has asked you to. Nothing is submitted to Meta: the member submits it in Vextro's template builder. Every save needs the member's approval in Vextro: the call first opens an approval page for them, then runs; a flow approval does not cover it, and a save refused for errors or a changed revision can be fixed and retried without approving again. Three ways: no ids makes a new draft (pass whatsappId when the workspace has several WhatsApp accounts); templateId with expectedRevision (from get_template) updates a draft; copyOf makes a new draft copy of any template — the only way to change one that is on WhatsApp. Checked first and refused if it has errors. Needs the member signed in to Vextro.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"template"
],
"properties": {
"copyOf": {
"$ref": "#/properties/templateId",
"description": "Make a new draft copy of this template"
},
"template": {
"type": "object",
"required": [
"name",
"language",
"category",
"components"
],
"properties": {
"name": {
"type": "string",
"maxLength": 512,
"minLength": 1,
"description": "Lowercase letters, digits and underscores, e.g. order_shipped"
},
"category": {
"type": "string",
"description": "MARKETING, UTILITY or AUTHENTICATION"
},
"language": {
"type": "string",
"maxLength": 20,
"minLength": 2,
"description": "A Meta locale code, e.g. en, en_US, hi"
},
"components": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": {}
},
"maxItems": 20,
"description": "Meta template components: HEADER, BODY, FOOTER, BUTTONS, CAROUSEL — see get_template_rules"
},
"messageSendTtlSeconds": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"description": "Validity period in seconds; leave out for the category's default"
}
},
"description": "A WhatsApp message template, in Meta's component format",
"additionalProperties": false
},
"templateId": {
"type": "string",
"format": "uuid",
"description": "Update this draft (never one on WhatsApp)"
},
"whatsappId": {
"type": "string",
"format": "uuid",
"description": "A WhatsApp number, from get_flow_resources kind whatsapp_numbers — the template belongs to that number's WhatsApp account"
},
"expectedRevision": {
"type": "string",
"maxLength": 100,
"description": "From get_template; required with templateId"
}
},
"additionalProperties": false
}
},
{
"name": "search_knowledge",
"title": "Search the knowledge base",
"annotations": {
"readOnlyHint": true
},
"description": "Search the workspace's knowledge base articles by keyword — only those the member can see in Vextro. Returns published and draft articles (filter with status); archived ones are left out. Use it before writing a flow, template or article that states a policy, price or process. Needs the member signed in to Vextro.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"description": "Keywords; leave out to list the most recently updated"
},
"limit": {
"type": "integer",
"maximum": 25,
"minimum": 1
},
"status": {
"enum": [
"published",
"draft"
],
"type": "string"
},
"collectionId": {
"type": "string",
"format": "uuid"
}
},
"additionalProperties": false
}
},
{
"name": "list_knowledge_collections",
"title": "List knowledge base collections",
"annotations": {
"readOnlyHint": true
},
"description": "The knowledge base's collections the member can see, each with its path (\"Policies / Refunds\"), for choosing where a new article goes. Archived collections are left out. Needs the member signed in to Vextro.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}
},
{
"name": "get_knowledge_entry",
"title": "Read a knowledge base article",
"annotations": {
"readOnlyHint": true
},
"description": "One article the member can see: title, summary, type, status, collection, and the body as Markdown, with the `revision` save_knowledge_draft needs to update it. `editable` is true only for a draft the member may edit; a published article is copied, not changed. A body holding something Markdown here can't carry comes back as null, with what it holds. Needs the member signed in to Vextro.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"entryId"
],
"properties": {
"entryId": {
"type": "string",
"format": "uuid",
"description": "An article id, from search_knowledge"
}
},
"additionalProperties": false
}
},
{
"name": "save_knowledge_draft",
"title": "Save a knowledge base article as a draft",
"annotations": {
"readOnlyHint": false
},
"description": "Save an article to the member's Vextro knowledge base as a DRAFT — only when the member has asked you to. Nothing is published: a person reviews and publishes it in Vextro, because a published article feeds AI replies to customers. Every save needs the member's approval in Vextro: the call first opens an approval page for them, then runs; a flow or template approval does not cover it, and a save refused for errors or a changed revision can be fixed and retried without approving again. Three ways: no ids makes a new draft; entryId with expectedRevision (from get_knowledge_entry) updates a draft; copyOf makes a new draft copy of any article — the only way to change a published one. Needs the member signed in to Vextro.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"entry"
],
"properties": {
"entry": {
"type": "object",
"required": [
"title",
"body"
],
"properties": {
"body": {
"type": "string",
"maxLength": 20000,
"description": "Markdown: headings, paragraphs, lists, quotes, code blocks, rules, **bold**, *italic*, ~~strike~~, `code`, <u>underline</u>, [links](https://…). No images, tables or HTML."
},
"type": {
"enum": [
"rich_text",
"faq",
"saved_reply",
"product_info",
"policy",
"procedure"
],
"type": "string",
"description": "Default rich_text"
},
"title": {
"type": "string",
"maxLength": 300,
"minLength": 1
},
"tagIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid"
},
"maxItems": 50
},
"summary": {
"anyOf": [
{
"type": "string",
"maxLength": 2000
},
{
"type": "null"
}
],
"description": "One or two sentences; shown in lists and used by search"
},
"categoryIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid"
},
"maxItems": 50
},
"collectionId": {
"anyOf": [
{
"type": "string",
"format": "uuid"
},
{
"type": "null"
}
],
"description": "An existing collection, from list_knowledge_collections"
}
},
"description": "A knowledge base article",
"additionalProperties": false
},
"copyOf": {
"$ref": "#/properties/entryId",
"description": "Make a new draft copy of this article"
},
"entryId": {
"type": "string",
"format": "uuid",
"description": "Update this draft (never a published article)"
},
"expectedRevision": {
"type": "integer",
"minimum": 1,
"description": "From get_knowledge_entry; required with entryId"
}
},
"additionalProperties": false
}
}
]Get your MCP into directories
A working endpoint is step one. Directory coverage is the coordinated launch across ChatGPT, Claude, Cursor, the MCP Registry, and community indexes.
Directory coverage for brandsThe official WhatsApp Business API, set up for you: we connect your number and build your first campaign and chatbot with you. Pricing tailored to your business.
Use the MCP endpoint listed on this page in your MCP client configuration. One-click install pills support Claude, Cursor, VS Code, and other hosts. Copy the remote MCP URL if your client needs a manual entry.
Request removal if you do not want Vextro listed here, or claim the listing if you want to manage it on MCPBundles.
This server appears in the MCPBundles directory. Verify you operate it to take over the listing — name, description, logo, contact email, and skill content. We email a 6-digit code to a maintainer address your server publishes in /.well-known/security.txt or /.well-known/mcpbundles.json. Free, takes about a minute.
MCPBundles publishes this directory for MCP discovery. Except where we host or operate an offering, third-party services run under their own terms. Product and company names on this page are used in a descriptive, identifying way (including under nominative fair use where applicable); they remain the property of their owners. Nothing here grants you rights in those marks, and nothing here is an offer to sell a third party's services. Terms · Request removal
Other MCP servers in this category from the directory index
MCPBundles probed 17 tools on the live server. The tool list on this page reflects what was discovered at the last refresh — connect your client to see the full set available to your session.
No provider sign-in was required during MCPBundles' probe. Your client may still need MCPBundles credentials depending on how you connect.
Request removal from the MCPBundles directory. We stop publishing this listing on mcpbundles.com.
MCPBundles is an independent platform built on the open Model Context Protocol standard. MCPBundles is not affiliated with, sponsored by, or endorsed by Anthropic PBC.