Skip to main content
Glama

Create or Update Customer

createCustomer
Destructive

Create or Update Customer

Upsert a customer by contact identity. When both email and phone are sent, match email first; if no email match, fall through to phone (E.164, then raw). Email-only or phone-only keep that single-field match. Matched rows are updated; otherwise a customer is created. Returns 409 when email and phone match two different existing customers.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "first_name": "<first_name>"
    },
    "name": "createCustomer"
  }
}

Input Schema

NameRequiredDescriptionDefault
cityNoCity for the address.
emailNoEmail used for upsert matching. When both email and phone are provided, email is tried first; a match updates that customer. When only email is provided, match is by email only.
notesNoInternal notes about the customer.
phoneNoPhone used for upsert matching (E.164 when parseable, otherwise raw). When both email and phone are provided and email does not match, phone is tried next. When only phone is provided, match is by phone only.
stateNoState, province, or region for the address.
companyNoCompany or organization name associated with the customer.
address1NoPrimary street address line.
address2NoSecondary street address line, such as suite or apartment.
last_nameNoCustomer last name.
photo_urlNoPublic image URL downloaded and stored as the customer photo before the record is created. Returns 400 if the URL cannot be fetched or is not a valid image. Accepts at most 500 characters.
tag_slugsNoTag slugs to attach to the customer.
first_nameYesCustomer first name.
postal_codeNoPostal or ZIP code for the address.
signed_up_atNoWhen the customer signed up. Optional instant for request bodies: Unix timestamp as integer (seconds), or a date/time string of at most 50 characters that PHP Carbon can parse. For strings, ISO-8601 / RFC 3339 (for example 2026-04-28T15:30:00Z) is the recommended format in examples and client integrations. Invalid values fail validation. When the field is omitted or null, the API uses the current server time where that behavior is documented on the operation.
location_slugNoSlug of an existing project location. Returns 404 if the slug is not found. Accepts at most 100 characters.

Output Schema

NameRequiredDescriptionDefault
codeNoShort code or application-level status code for this resource.
dataNoResponse payload for the request.
successNoIndicates whether the request completed successfully.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / location_slug / description
      Previous value: -"Slug of an existing project location. Returns 404 if the slug is not found."New value: +"Slug of an existing project location. Returns 404 if the slug is not found. Accepts at most 100 characters."
    • changedOutput schema / properties / data / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": {},
      -    "properties": {
      -      "address1": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Primary street address line."
      -      },
      -      "address2": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Secondary street address line, such as suite or apartment."
      -      },
      -      "archived_at": {
      -        "anyOf": [
      -          {
      -            "maximum": 9007199254740991,
      -            "minimum": -9007199254740991,
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Unix timestamp when the customer was archived, if applicable."
      -      },
      -      "charges_avg": {
      -        "anyOf": [
      -          {
      -            "maximum": 9007199254740991,
      -            "minimum": -9007199254740991,
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Average charge amount for the customer in the smallest currency unit."
      -      },
      -      "charges_count": {
      -        "anyOf": [
      -          {
      -            "maximum": 9007199254740991,
      -            "minimum": -9007199254740991,
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Number of charge records associated with the customer."
      -      },
      -      "charges_sum": {
      -        "anyOf": [
      -          {
      -            "maximum": 9007199254740991,
      -            "minimum": -9007199254740991,
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Total amount charged to the customer in the smallest currency unit."
      -      },
      -      "city": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "City for the address."
      -      },
      -      "color": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Hex color associated with the resource."
      -      },
      -      "company": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Company or organization name associated with the customer."
      -      },
      -      "created_at": {
      -        "anyOf": [
      -          {
      -            "maximum": 9007199254740991,
      -            "minimum": -9007199254740991,
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Unix timestamp when this resource was created."
      -      },
      -      "email": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Email address for the person or customer."
      -      },
      -      "first_asked_at": {
      -        "anyOf": [
      -          {
      -            "maximum": 9007199254740991,
      -            "minimum": -9007199254740991,
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Unix timestamp of the first review request sent to the customer."
      -      },
      -      "first_charged_at": {
      -        "anyOf": [
      -          {
      -            "maximum": 9007199254740991,
      -            "minimum": -9007199254740991,
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Unix timestamp of the customer's first charge."
      -      },
      -      "first_messaged_at": {
      -        "anyOf": [
      -          {
      -            "maximum": 9007199254740991,
      -            "minimum": -9007199254740991,
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Unix timestamp of the first message sent to the customer."
      -      },
      -      "first_name": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Customer first name."
      -      },
      -      "first_reviewed_at": {
      -        "anyOf": [
      -          {
      -            "maximum": 9007199254740991,
      -            "minimum": -9007199254740991,
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Unix timestamp of the customer's first review."
      -      },
      -      "gravatar": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Gravatar image URL for the email address."
      -      },
      -      "id": {
      -        "anyOf": [
      -          {
      -            "maximum": 9007199254740991,
      -            "minimum": -9007199254740991,
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Unique numeric identifier for this resource."
      -      },
      -      "is_validated": {
      -        "anyOf": [
      -          {
      -            "type": "boolean"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Tri-state suitability for outreach after validation—null when no verdict applies, true when the Mailgun result is deliverable, unknown, or catch-all, and false otherwise (including undeliverable and do-not-send)."
      -      },
      -      "lang": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Preferred language code."
      -      },
      -      "last_asked_at": {
      -        "anyOf": [
      -          {
      -            "maximum": 9007199254740991,
      -            "minimum": -9007199254740991,
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Unix timestamp of the most recent review request sent to the customer."
      -      },
      -      "last_charged_at": {
      -        "anyOf": [
      -          {
      -            "maximum": 9007199254740991,
      -            "minimum": -9007199254740991,
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Unix timestamp of the customer's most recent charge."
      -      },
      -      "last_messaged_at": {
      -        "anyOf": [
      -          {
      -            "maximum": 9007199254740991,
      -            "minimum": -9007199254740991,
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Unix timestamp of the most recent message sent to the customer."
      -      },
      -      "last_name": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Customer last name."
      -      },
      -      "last_reviewed_at": {
      -        "anyOf": [
      -          {
      -            "maximum": 9007199254740991,
      -            "minimum": -9007199254740991,
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Unix timestamp of the customer's most recent review."
      -      },
      -      "location": {
      -        "anyOf": [
      -          {
      -            "additionalProperties": {},
      -            "properties": {
      -              "address": {
      -                "anyOf": [
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ],
      -                "description": "Address for this resource."
      -              },
      -              "address1": {
      -                "anyOf": [
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ],
      -                "description": "Primary street address line."
      -              },
      -              "address2": {
      -                "anyOf": [
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ],
      -                "description": "Secondary street address line, such as suite or apartment."
      -              },
      -              "city": {
      -                "anyOf": [
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ],
      -                "description": "City for the address."
      -              },
      -              "code": {
      -                "anyOf": [
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ],
      -                "description": "Short code or application-level status code for this resource."
      -              },
      -              "display_name": {
      -                "anyOf": [
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ],
      -                "description": "Public display name for this resource."
      -              },
      -              "id": {
      -                "anyOf": [
      -                  {
      -                    "maximum": 9007199254740991,
      -                    "minimum": -9007199254740991,
      -                    "type": "integer"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ],
      -                "description": "Unique numeric identifier for this resource."
      -              },
      -              "name": {
      -                "anyOf": [
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ],
      -                "description": "Display name for this resource."
      -              },
      -              "postal_code": {
      -                "anyOf": [
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ],
      -                "description": "Postal or ZIP code for the address."
      -              },
      -              "project_id": {
      -                "anyOf": [
      -                  {
      -                    "maximum": 9007199254740991,
      -                    "minimum": -9007199254740991,
      -                    "type": "integer"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ],
      -                "description": "Unique numeric identifier for the project."
      -              },
      -              "slug": {
      -                "anyOf": [
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ],
      -                "description": "URL-friendly identifier for this resource."
      -              },
      -              "state": {
      -                "anyOf": [
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ],
      -                "description": "State, province, or region for the address."
      -              },
      -              "title": {
      -                "anyOf": [
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ],
      -                "description": "Title or headline for the resource."
      -              },
      -              "uuid": {
      -                "anyOf": [
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ],
      -                "description": "Stable UUID for this resource."
      -              }
      -            },
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Location for this resource."
      -      },
      -      "location_id": {
      -        "anyOf": [
      -          {
      -            "maximum": 9007199254740991,
      -            "minimum": -9007199254740991,
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Unique numeric identifier for the location."
      -      },
      -      "name": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Display name for this resource."
      -      },
      -      "notes": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Internal notes about the customer."
      -      },
      -      "phone": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Phone number for the person or customer."
      -      },
      -      "phone_e164": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Phone number normalized to E.164 format."
      -      },
      -      "phone_formatted": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Human-readable formatted phone number."
      -      },
      -      "photo": {
      -        "anyOf": [
      -          {
      -            "additionalProperties": {},
      -            "properties": {
      -              "id": {
      -                "anyOf": [
      -                  {
      -                    "maximum": 9007199254740991,
      -                    "minimum": -9007199254740991,
      -                    "type": "integer"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ],
      -                "description": "Unique numeric identifier for the image record."
      -              },
      -              "link": {
      -                "anyOf": [
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ],
      -                "description": "Resolved CDN or app URL for the image asset."
      -              },
      -              "uuid": {
      -                "anyOf": [
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ],
      -                "description": "Stable UUID for the image record."
      -              }
      -            },
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Customer profile image from ImageTransformer when present; omitted in JSON when the customer has no photo."
      -      },
      -      "platform_url": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Absolute URL to this customer in the web console; uses the agency white-label host when configured."
      -      },
      -      "postal_code": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Postal or ZIP code for the address."
      -      },
      -      "project_id": {
      -        "anyOf": [
      -          {
      -            "maximum": 9007199254740991,
      -            "minimum": -9007199254740991,
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Unique numeric identifier for the project."
      -      },
      -      "review_link": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Public link used by the customer to leave a review."
      -      },
      -      "signed_up_at": {
      -        "anyOf": [
      -          {
      -            "maximum": 9007199254740991,
      -            "minimum": -9007199254740991,
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Unix timestamp when the customer signed up."
      -      },
      -      "state": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "State, province, or region for the address."
      -      },
      -      "tags": {
      -        "anyOf": [
      -          {
      -            "items": {
      -              "additionalProperties": {},
      -              "properties": {
      -                "color": {
      -                  "anyOf": [
      -                    {
      -                      "type": "string"
      -                    },
      -                    {
      -                      "type": "null"
      -                    }
      -                  ],
      -                  "description": "Hex color associated with the resource."
      -                },
      -                "id": {
      -                  "anyOf": [
      -                    {
      -                      "maximum": 9007199254740991,
      -                      "minimum": -9007199254740991,
      -                      "type": "integer"
      -                    },
      -                    {
      -                      "type": "null"
      -                    }
      -                  ],
      -                  "description": "Unique numeric identifier for this resource."
      -                },
      -                "name": {
      -                  "anyOf": [
      -                    {
      -                      "type": "string"
      -                    },
      -                    {
      -                      "type": "null"
      -                    }
      -                  ],
      -                  "description": "Display name for this resource."
      -                },
      -                "slug": {
      -                  "anyOf": [
      -                    {
      -                      "type": "string"
      -                    },
      -                    {
      -                      "type": "null"
      -                    }
      -                  ],
      -                  "description": "URL-friendly identifier for this resource."
      -                },
      -                "uuid": {
      -                  "anyOf": [
      -                    {
      -                      "type": "string"
      -                    },
      -                    {
      -                      "type": "null"
      -                    }
      -                  ],
      -                  "description": "Stable UUID for this resource."
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "type": "array"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Maximum or current allowance for tag records."
      -      },
      -      "unsubscribe_link": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Link the customer can use to unsubscribe from outreach."
      -      },
      -      "unsubscribed_at": {
      -        "anyOf": [
      -          {
      -            "maximum": 9007199254740991,
      -            "minimum": -9007199254740991,
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Unix timestamp when the customer unsubscribed, if applicable."
      -      },
      -      "updated_at": {
      -        "anyOf": [
      -          {
      -            "maximum": 9007199254740991,
      -            "minimum": -9007199254740991,
      -            "type": "integer"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Unix timestamp when this resource was last updated."
      -      },
      -      "uuid": {
      -        "anyOf": [
      -          {
      -            "type": "string"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Stable UUID for this resource."
      -      },
      -      "validation": {
      -        "anyOf": [
      -          {
      -            "additionalProperties": {},
      -            "properties": {
      -              "result": {
      -                "anyOf": [
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ],
      -                "description": "Mailgun address-validation result type when a verdict is stored."
      -              },
      -              "risk": {
      -                "anyOf": [
      -                  {
      -                    "type": "string"
      -                  },
      -                  {
      -                    "type": "null"
      -                  }
      -                ],
      -                "description": "Mailgun aggregate risk level when a verdict is stored."
      -              }
      -            },
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ],
      -        "description": "Mailgun email validation verdict returned by the API; only normalized result and risk fields from the stored payload."
      -      }
      -    },
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": {},
      +    "properties": {
      +      "address1": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Primary street address line."
      +      },
      +      "address2": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Secondary street address line, such as suite or apartment."
      +      },
      +      "archived_at": {
      +        "anyOf": [
      +          {
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Unix timestamp when the customer was archived, if applicable."
      +      },
      +      "charges_avg": {
      +        "anyOf": [
      +          {
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Average charge amount for the customer in the smallest currency unit."
      +      },
      +      "charges_count": {
      +        "anyOf": [
      +          {
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Number of charge records associated with the customer."
      +      },
      +      "charges_sum": {
      +        "anyOf": [
      +          {
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Total amount charged to the customer in the smallest currency unit."
      +      },
      +      "city": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "City for the address."
      +      },
      +      "color": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Hex color associated with the resource."
      +      },
      +      "company": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Company or organization name associated with the customer."
      +      },
      +      "created_at": {
      +        "anyOf": [
      +          {
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Unix timestamp when this resource was created."
      +      },
      +      "email": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Email address for the person or customer."
      +      },
      +      "first_asked_at": {
      +        "anyOf": [
      +          {
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Unix timestamp of the first review request sent to the customer."
      +      },
      +      "first_charged_at": {
      +        "anyOf": [
      +          {
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Unix timestamp of the customer's first charge."
      +      },
      +      "first_messaged_at": {
      +        "anyOf": [
      +          {
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Unix timestamp of the first message sent to the customer."
      +      },
      +      "first_name": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Customer first name."
      +      },
      +      "first_reviewed_at": {
      +        "anyOf": [
      +          {
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Unix timestamp of the customer's first review."
      +      },
      +      "gravatar": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Gravatar image URL for the email address."
      +      },
      +      "id": {
      +        "anyOf": [
      +          {
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Unique numeric identifier for this resource."
      +      },
      +      "is_validated": {
      +        "anyOf": [
      +          {
      +            "type": "boolean"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Tri-state suitability for outreach after validation—null when no verdict applies, true when the Mailgun result is deliverable, unknown, or catch-all, and false otherwise (including undeliverable and do-not-send)."
      +      },
      +      "lang": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Preferred language code."
      +      },
      +      "last_asked_at": {
      +        "anyOf": [
      +          {
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Unix timestamp of the most recent review request sent to the customer."
      +      },
      +      "last_charged_at": {
      +        "anyOf": [
      +          {
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Unix timestamp of the customer's most recent charge."
      +      },
      +      "last_messaged_at": {
      +        "anyOf": [
      +          {
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Unix timestamp of the most recent message sent to the customer."
      +      },
      +      "last_name": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Customer last name."
      +      },
      +      "last_reviewed_at": {
      +        "anyOf": [
      +          {
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Unix timestamp of the customer's most recent review."
      +      },
      +      "location": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": {},
      +            "properties": {
      +              "address": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "Address for this resource."
      +              },
      +              "address1": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "Primary street address line."
      +              },
      +              "address2": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "Secondary street address line, such as suite or apartment."
      +              },
      +              "city": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "City for the address."
      +              },
      +              "code": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "Short code or application-level status code for this resource."
      +              },
      +              "display_name": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "Public display name for this resource."
      +              },
      +              "has_replies": {
      +                "anyOf": [
      +                  {
      +                    "type": "boolean"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "When false, public replies are disabled for reviews at this location."
      +              },
      +              "id": {
      +                "anyOf": [
      +                  {
      +                    "maximum": 9007199254740991,
      +                    "minimum": -9007199254740991,
      +                    "type": "integer"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "Unique numeric identifier for this resource."
      +              },
      +              "name": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "Display name for this resource."
      +              },
      +              "notes": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "Internal notes about the location."
      +              },
      +              "postal_code": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "Postal or ZIP code for the address."
      +              },
      +              "project_id": {
      +                "anyOf": [
      +                  {
      +                    "maximum": 9007199254740991,
      +                    "minimum": -9007199254740991,
      +                    "type": "integer"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "Unique numeric identifier for the project."
      +              },
      +              "reply_instructions": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "Extra instructions for AI replies to reviews at this location."
      +              },
      +              "review_instructions": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "Extra instructions for AI review suggestions at this location."
      +              },
      +              "slug": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "URL-friendly identifier for this resource."
      +              },
      +              "state": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "State, province, or region for the address."
      +              },
      +              "title": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "Title or headline for the resource."
      +              },
      +              "uuid": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "Stable UUID for this resource."
      +              }
      +            },
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Location for this resource."
      +      },
      +      "location_id": {
      +        "anyOf": [
      +          {
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Unique numeric identifier for the location."
      +      },
      +      "name": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Display name for this resource."
      +      },
      +      "notes": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Internal notes about the customer."
      +      },
      +      "phone": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Phone number for the person or customer."
      +      },
      +      "phone_e164": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Phone number normalized to E.164 format."
      +      },
      +      "phone_formatted": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Human-readable formatted phone number."
      +      },
      +      "photo": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": {},
      +            "properties": {
      +              "id": {
      +                "anyOf": [
      +                  {
      +                    "maximum": 9007199254740991,
      +                    "minimum": -9007199254740991,
      +                    "type": "integer"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "Unique numeric identifier for the image record."
      +              },
      +              "link": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "Resolved CDN or app URL for the image asset."
      +              },
      +              "uuid": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "Stable UUID for the image record."
      +              }
      +            },
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Customer profile image from ImageTransformer when present; omitted in JSON when the customer has no photo."
      +      },
      +      "platform_url": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Absolute URL to this customer in the web console; uses the agency white-label host when configured."
      +      },
      +      "postal_code": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Postal or ZIP code for the address."
      +      },
      +      "project_id": {
      +        "anyOf": [
      +          {
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Unique numeric identifier for the project."
      +      },
      +      "review_link": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Public link used by the customer to leave a review."
      +      },
      +      "signed_up_at": {
      +        "anyOf": [
      +          {
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Unix timestamp when the customer signed up."
      +      },
      +      "state": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "State, province, or region for the address."
      +      },
      +      "tags": {
      +        "anyOf": [
      +          {
      +            "items": {
      +              "additionalProperties": {},
      +              "properties": {
      +                "color": {
      +                  "anyOf": [
      +                    {
      +                      "type": "string"
      +                    },
      +                    {
      +                      "type": "null"
      +                    }
      +                  ],
      +                  "description": "Hex color associated with the resource."
      +                },
      +                "id": {
      +                  "anyOf": [
      +                    {
      +                      "maximum": 9007199254740991,
      +                      "minimum": -9007199254740991,
      +                      "type": "integer"
      +                    },
      +                    {
      +                      "type": "null"
      +                    }
      +                  ],
      +                  "description": "Unique numeric identifier for this resource."
      +                },
      +                "name": {
      +                  "anyOf": [
      +                    {
      +                      "type": "string"
      +                    },
      +                    {
      +                      "type": "null"
      +                    }
      +                  ],
      +                  "description": "Display name for this resource."
      +                },
      +                "slug": {
      +                  "anyOf": [
      +                    {
      +                      "type": "string"
      +                    },
      +                    {
      +                      "type": "null"
      +                    }
      +                  ],
      +                  "description": "URL-friendly identifier for this resource."
      +                },
      +                "uuid": {
      +                  "anyOf": [
      +                    {
      +                      "type": "string"
      +                    },
      +                    {
      +                      "type": "null"
      +                    }
      +                  ],
      +                  "description": "Stable UUID for this resource."
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Maximum or current allowance for tag records."
      +      },
      +      "unsubscribe_link": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Link the customer can use to unsubscribe from outreach."
      +      },
      +      "unsubscribed_at": {
      +        "anyOf": [
      +          {
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Unix timestamp when the customer unsubscribed, if applicable."
      +      },
      +      "updated_at": {
      +        "anyOf": [
      +          {
      +            "maximum": 9007199254740991,
      +            "minimum": -9007199254740991,
      +            "type": "integer"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Unix timestamp when this resource was last updated."
      +      },
      +      "uuid": {
      +        "anyOf": [
      +          {
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Stable UUID for this resource."
      +      },
      +      "validation": {
      +        "anyOf": [
      +          {
      +            "additionalProperties": {},
      +            "properties": {
      +              "result": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "Mailgun address-validation result type when a verdict is stored."
      +              },
      +              "risk": {
      +                "anyOf": [
      +                  {
      +                    "type": "string"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ],
      +                "description": "Mailgun aggregate risk level when a verdict is stored."
      +              }
      +            },
      +            "type": "object"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "Mailgun email validation verdict returned by the API; only normalized result and risk fields from the stored payload."
      +      }
      +    },
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  2. Changed2 schema fields changed
    • changedInput schema / properties / email / description
      Previous value: -"Email address for the person or customer."New value: +"Email used for upsert matching. When both email and phone are provided, email is tried first; a match updates that customer. When only email is provided, match is by email only."
    • changedInput schema / properties / phone / description
      Previous value: -"Phone number for the person or customer."New value: +"Phone used for upsert matching (E.164 when parseable, otherwise raw). When both email and phone are provided and email does not match, phone is tried next. When only phone is provided, match is by phone only."
  3. First observed

TDQS

A4.1/5.0
Behavior4/5

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

Annotations declare a non-read-only, destructive, non-idempotent write; the description earns its keep by adding the upsert matching algorithm and the specific 409 condition where email and phone resolve to two different customers. That conflict behavior is not derivable from the annotations. It still doesn't cover permission requirements, whether partial update semantics apply to omitted fields, or rate limits.

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-loads the core 'upsert by contact identity' claim, then layers match order, then the conflict case, which is a sensible order. The leading repetition of the title text ('Create or Update Customer') is wasted space, keeping it from a 5.

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

Completeness4/5

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

For a 15-parameter upsert whose schema is fully described and which has an output schema, the description covers the operationally risky parts: what gets matched, what gets mutated, and the ambiguity error. It leaves out required-field expectations (first_name), side effects like photo download before creation, and update-vs-replace semantics for omitted fields.

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%, so email/phone precedence and photo_url failure modes are already documented in the schema; the description largely restates them. The added value is the cross-parameter 409 conflict rule, which is behavioral rather than per-parameter meaning, so the baseline 3 holds.

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

Purpose5/5

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

States a specific verb and resource ('Upsert a customer by contact identity') and spells out the match semantics, which implicitly distinguishes it from the ID-based updateCustomer sibling. An agent can tell what this does and how it decides create-vs-update without opening the schema.

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

Usage Guidelines4/5

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

Gives clear context for the match order (email first, then phone, E.164 then raw), the single-field cases, and the 409 conflict case, so the agent knows when the call creates versus updates. It stops short of naming an alternative (e.g. updateCustomer when an ID is already known), so it does not reach a 5.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources