Look up appointments, clients, services, staff and orders, and update clients in Boulevard.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Apply an existing tag (from boulevard_list_tags) to a taggable record such as a client or appointment. GraphQL: addTag.
The Tag id, e.g. urn:blvd:Tag:<uuid>.
Global id of the record to tag, e.g. urn:blvd:Client:<uuid>.
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
Apply an existing tag (from boulevard_list_tags) to a taggable record such as a client or appointment. GraphQL: addTag.
| Argument | Type | Description |
|---|---|---|
| tag_id* | string | The Tag id, e.g. urn:blvd:Tag:<uuid>. |
| entity_id* | string | Global id of the record to tag, e.g. urn:blvd:Client:<uuid>. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"entity_id",
"tag_id"
],
"properties": {
"tag_id": {
"type": "string",
"minLength": 1,
"description": "The Tag id, e.g. urn:blvd:Tag:<uuid>."
},
"entity_id": {
"type": "string",
"minLength": 1,
"description": "Global id of the record to tag, e.g. urn:blvd:Client:<uuid>."
}
}
}Create a new client profile. Check boulevard_list_clients by email or phone first to avoid a duplicate. GraphQL: createClient.
| Argument | Type | Description |
|---|---|---|
| dob | string | Date of birth, YYYY-MM-DD. |
| string | Email address. | |
| pronoun | string | Pronoun, e.g. she/her. |
| last_name | string | Last name. |
| first_name | string | First name. |
| external_id | string | Your own id for this client. |
| mobile_phone | string | Mobile phone in E.164 form, e.g. +15551234567. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"dob": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Date of birth, YYYY-MM-DD."
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "Email address."
},
"pronoun": {
"type": "string",
"description": "Pronoun, e.g. she/her."
},
"last_name": {
"type": "string",
"description": "Last name."
},
"first_name": {
"type": "string",
"description": "First name."
},
"external_id": {
"type": "string",
"description": "Your own id for this client."
},
"mobile_phone": {
"type": "string",
"description": "Mobile phone in E.164 form, e.g. +15551234567."
}
}
}Add an internal note to a client's profile (visible to staff, e.g. formulas, preferences, allergies). GraphQL: createClientNote.
| Argument | Type | Description |
|---|---|---|
| text* | string | The note text. |
| client_id* | string | The Client id, e.g. urn:blvd:Client:<uuid>. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"client_id",
"text"
],
"properties": {
"text": {
"type": "string",
"minLength": 1,
"description": "The note text."
},
"client_id": {
"type": "string",
"minLength": 1,
"description": "The Client id, e.g. urn:blvd:Client:<uuid>."
}
}
}Block time on one staff member's calendar at a location (a break, meeting or personal time) so it cannot be booked. One-off only. GraphQL: createTimeblock.
| Argument | Type | Description |
|---|---|---|
| title | string | Title shown on the calendar. |
| reason | string | Why the time is blocked. |
| duration* | integer | Length in minutes. |
| staff_id* | string | The Staff id, e.g. urn:blvd:Staff:<uuid>. |
| start_time* | string | Start, ISO 8601 datetime with offset, e.g. 2026-10-02T13:00:00-07:00. |
| location_id* | string | Location id, e.g. urn:blvd:Location:<uuid> (from boulevard_list_locations). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"location_id",
"staff_id",
"start_time",
"duration"
],
"properties": {
"title": {
"type": "string",
"description": "Title shown on the calendar."
},
"reason": {
"enum": [
"BUSINESS",
"PERSONAL"
],
"type": "string",
"description": "Why the time is blocked."
},
"duration": {
"type": "integer",
"maximum": 1440,
"minimum": 1,
"description": "Length in minutes."
},
"staff_id": {
"type": "string",
"minLength": 1,
"description": "The Staff id, e.g. urn:blvd:Staff:<uuid>."
},
"start_time": {
"type": "string",
"minLength": 1,
"description": "Start, ISO 8601 datetime with offset, e.g. 2026-10-02T13:00:00-07:00."
},
"location_id": {
"type": "string",
"minLength": 1,
"description": "Location id, e.g. urn:blvd:Location:<uuid> (from boulevard_list_locations)."
}
}
}Fetch one appointment by id — time, state, notes, client, each booked service with its staff and price (in cents), cancellation details and tags. GraphQL: appointment.
| Argument | Type | Description |
|---|---|---|
| appointment_id* | string | The Appointment id, e.g. urn:blvd:Appointment:<uuid>. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"appointment_id"
],
"properties": {
"appointment_id": {
"type": "string",
"minLength": 1,
"description": "The Appointment id, e.g. urn:blvd:Appointment:<uuid>."
}
}
}Fetch the Boulevard business the credentials act for — name, timezone, address, phone, website. A cheap way to confirm the setup works. GraphQL: business.
No arguments.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {}
}Fetch one client by id, including contact details, appointment count, account balance (cents), scheduling alert, tags and notes. GraphQL: client.
| Argument | Type | Description |
|---|---|---|
| client_id* | string | The Client id, e.g. urn:blvd:Client:<uuid>. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"client_id"
],
"properties": {
"client_id": {
"type": "string",
"minLength": 1,
"description": "The Client id, e.g. urn:blvd:Client:<uuid>."
}
}
}Fetch one order by id with its totals and line items (services, products, gratuity, gift cards), amounts in cents. GraphQL: order.
| Argument | Type | Description |
|---|---|---|
| order_id* | string | The Order id, e.g. urn:blvd:Order:<uuid>. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"order_id"
],
"properties": {
"order_id": {
"type": "string",
"minLength": 1,
"description": "The Order id, e.g. urn:blvd:Order:<uuid>."
}
}
}List appointments at one location, optionally for one client and filtered by a query such as a date range or staff member. Each appointment includes its client, services, staff, state and cancellation. GraphQL: appointments.
| Argument | Type | Description |
|---|---|---|
| after | string | Cursor: pageInfo.endCursor from the previous page. Omit for the first page. |
| first | integer | Page size, 1-100 (default 25). |
| query | string | Boulevard filter expression (QueryString) over: id, startAt, createdAt, cancelled, staffId. Comparisons joined with AND/OR, strings in single quotes, ISO 8601 datetimes, e.g. "startAt >= '2026-10-01T00:00:00Z' AND cancelled = false". Field names are case sensitive. |
| client_id | string | Only this client's appointments (urn:blvd:Client:<uuid>). |
| location_id* | string | Location id, e.g. urn:blvd:Location:<uuid> (from boulevard_list_locations). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"location_id"
],
"properties": {
"after": {
"type": "string",
"description": "Cursor: pageInfo.endCursor from the previous page. Omit for the first page."
},
"first": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100 (default 25)."
},
"query": {
"type": "string",
"description": "Boulevard filter expression (QueryString) over: id, startAt, createdAt, cancelled, staffId. Comparisons joined with AND/OR, strings in single quotes, ISO 8601 datetimes, e.g. \"startAt >= '2026-10-01T00:00:00Z' AND cancelled = false\". Field names are case sensitive."
},
"client_id": {
"type": "string",
"description": "Only this client's appointments (urn:blvd:Client:<uuid>)."
},
"location_id": {
"type": "string",
"minLength": 1,
"description": "Location id, e.g. urn:blvd:Location:<uuid> (from boulevard_list_locations)."
}
}
}List the business's clients, or find them by email, id list, or a query (e.g. name = 'Jane Doe', mobilePhone = '+15551234567'). GraphQL: clients.
| Argument | Type | Description |
|---|---|---|
| after | string | Cursor: pageInfo.endCursor from the previous page. Omit for the first page. |
| first | integer | Page size, 1-100 (default 25). |
| query | string | Boulevard filter expression (QueryString) over: id, email, name, mobilePhone, active, externalId, primaryLocation, createdAt, updatedAt. Comparisons joined with AND/OR, strings in single quotes, ISO 8601 datetimes, e.g. "startAt >= '2026-10-01T00:00:00Z' AND cancelled = false". Field names are case sensitive. |
| emails | array | Only clients with these email addresses. |
| client_ids | array | Only these client ids. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"after": {
"type": "string",
"description": "Cursor: pageInfo.endCursor from the previous page. Omit for the first page."
},
"first": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100 (default 25)."
},
"query": {
"type": "string",
"description": "Boulevard filter expression (QueryString) over: id, email, name, mobilePhone, active, externalId, primaryLocation, createdAt, updatedAt. Comparisons joined with AND/OR, strings in single quotes, ISO 8601 datetimes, e.g. \"startAt >= '2026-10-01T00:00:00Z' AND cancelled = false\". Field names are case sensitive."
},
"emails": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only clients with these email addresses."
},
"client_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only these client ids."
}
}
}List the business's locations with id, name, timezone and address. Most other tools need a location id from here. GraphQL: locations.
| Argument | Type | Description |
|---|---|---|
| after | string | Cursor: pageInfo.endCursor from the previous page. Omit for the first page. |
| first | integer | Page size, 1-100 (default 25). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"after": {
"type": "string",
"description": "Cursor: pageInfo.endCursor from the previous page. Omit for the first page."
},
"first": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100 (default 25)."
}
}
}List client memberships sold by the business — status (ACTIVE, PAUSED, PAST_DUE, CANCELLED), client, price (cents), interval, term and next charge date. GraphQL: memberships.
| Argument | Type | Description |
|---|---|---|
| after | string | Cursor: pageInfo.endCursor from the previous page. Omit for the first page. |
| first | integer | Page size, 1-100 (default 25). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"after": {
"type": "string",
"description": "Cursor: pageInfo.endCursor from the previous page. Omit for the first page."
},
"first": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100 (default 25)."
}
}
}List checkout orders at one location with totals (cents: subtotal, discount, tax, gratuity, total, refunds), optionally filtered e.g. by closedAt range or clientId. GraphQL: orders.
| Argument | Type | Description |
|---|---|---|
| after | string | Cursor: pageInfo.endCursor from the previous page. Omit for the first page. |
| first | integer | Page size, 1-100 (default 25). |
| query | string | Boulevard filter expression (QueryString) over: id, clientId, closedAt, updatedAt, createdAt. Comparisons joined with AND/OR, strings in single quotes, ISO 8601 datetimes, e.g. "startAt >= '2026-10-01T00:00:00Z' AND cancelled = false". Field names are case sensitive. |
| location_id* | string | Location id, e.g. urn:blvd:Location:<uuid> (from boulevard_list_locations). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"location_id"
],
"properties": {
"after": {
"type": "string",
"description": "Cursor: pageInfo.endCursor from the previous page. Omit for the first page."
},
"first": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100 (default 25)."
},
"query": {
"type": "string",
"description": "Boulevard filter expression (QueryString) over: id, clientId, closedAt, updatedAt, createdAt. Comparisons joined with AND/OR, strings in single quotes, ISO 8601 datetimes, e.g. \"startAt >= '2026-10-01T00:00:00Z' AND cancelled = false\". Field names are case sensitive."
},
"location_id": {
"type": "string",
"minLength": 1,
"description": "Location id, e.g. urn:blvd:Location:<uuid> (from boulevard_list_locations)."
}
}
}List retail products — brand, SKU, barcode, unit price and cost (cents), category. Set include_inactive to include retired products. GraphQL: products.
| Argument | Type | Description |
|---|---|---|
| after | string | Cursor: pageInfo.endCursor from the previous page. Omit for the first page. |
| first | integer | Page size, 1-100 (default 25). |
| query | string | Boulevard filter expression (QueryString) over: id, categoryId, externalId. Comparisons joined with AND/OR, strings in single quotes, ISO 8601 datetimes, e.g. "startAt >= '2026-10-01T00:00:00Z' AND cancelled = false". Field names are case sensitive. |
| include_inactive | boolean | Also return inactive products. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"after": {
"type": "string",
"description": "Cursor: pageInfo.endCursor from the previous page. Omit for the first page."
},
"first": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100 (default 25)."
},
"query": {
"type": "string",
"description": "Boulevard filter expression (QueryString) over: id, categoryId, externalId. Comparisons joined with AND/OR, strings in single quotes, ISO 8601 datetimes, e.g. \"startAt >= '2026-10-01T00:00:00Z' AND cancelled = false\". Field names are case sensitive."
},
"include_inactive": {
"type": "boolean",
"description": "Also return inactive products."
}
}
}List the service menu — name, category, default duration (minutes) and default price (cents), and whether it is an add-on. GraphQL: services.
| Argument | Type | Description |
|---|---|---|
| after | string | Cursor: pageInfo.endCursor from the previous page. Omit for the first page. |
| first | integer | Page size, 1-100 (default 25). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"after": {
"type": "string",
"description": "Cursor: pageInfo.endCursor from the previous page. Omit for the first page."
},
"first": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100 (default 25)."
}
}
}List staff working shifts at one location for a date range — clock-in/out times, weekday, availability and recurrence. GraphQL: shifts.
| Argument | Type | Description |
|---|---|---|
| end_date* | string | Last date, YYYY-MM-DD. |
| staff_ids | array | Only these staff ids. |
| start_date* | string | First date, YYYY-MM-DD. |
| location_id* | string | Location id, e.g. urn:blvd:Location:<uuid> (from boulevard_list_locations). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"location_id",
"start_date",
"end_date"
],
"properties": {
"end_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Last date, YYYY-MM-DD."
},
"staff_ids": {
"type": "array",
"items": {
"type": "string"
},
"description": "Only these staff ids."
},
"start_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "First date, YYYY-MM-DD."
},
"location_id": {
"type": "string",
"minLength": 1,
"description": "Location id, e.g. urn:blvd:Location:<uuid> (from boulevard_list_locations)."
}
}
}List staff members with their role, locations, contact details and whether they are bookable online, optionally filtered by a query. GraphQL: staff.
| Argument | Type | Description |
|---|---|---|
| after | string | Cursor: pageInfo.endCursor from the previous page. Omit for the first page. |
| first | integer | Page size, 1-100 (default 25). |
| query | string | Boulevard filter expression (QueryString) over: id, email, name, mobilePhone, active. Comparisons joined with AND/OR, strings in single quotes, ISO 8601 datetimes, e.g. "startAt >= '2026-10-01T00:00:00Z' AND cancelled = false". Field names are case sensitive. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"after": {
"type": "string",
"description": "Cursor: pageInfo.endCursor from the previous page. Omit for the first page."
},
"first": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100 (default 25)."
},
"query": {
"type": "string",
"description": "Boulevard filter expression (QueryString) over: id, email, name, mobilePhone, active. Comparisons joined with AND/OR, strings in single quotes, ISO 8601 datetimes, e.g. \"startAt >= '2026-10-01T00:00:00Z' AND cancelled = false\". Field names are case sensitive."
}
}
}List the tags defined for the business (ids to use with boulevard_add_tag). GraphQL: tags.
| Argument | Type | Description |
|---|---|---|
| after | string | Cursor: pageInfo.endCursor from the previous page. Omit for the first page. |
| first | integer | Page size, 1-100 (default 25). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"after": {
"type": "string",
"description": "Cursor: pageInfo.endCursor from the previous page. Omit for the first page."
},
"first": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100 (default 25)."
}
}
}List blocked time on staff calendars at one location (breaks, meetings, personal time). GraphQL: timeblocks.
| Argument | Type | Description |
|---|---|---|
| after | string | Cursor: pageInfo.endCursor from the previous page. Omit for the first page. |
| first | integer | Page size, 1-100 (default 25). |
| query | string | Boulevard filter expression (QueryString) over: staffId, startAt, cancelled. Comparisons joined with AND/OR, strings in single quotes, ISO 8601 datetimes, e.g. "startAt >= '2026-10-01T00:00:00Z' AND cancelled = false". Field names are case sensitive. |
| location_id* | string | Location id, e.g. urn:blvd:Location:<uuid> (from boulevard_list_locations). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"location_id"
],
"properties": {
"after": {
"type": "string",
"description": "Cursor: pageInfo.endCursor from the previous page. Omit for the first page."
},
"first": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100 (default 25)."
},
"query": {
"type": "string",
"description": "Boulevard filter expression (QueryString) over: staffId, startAt, cancelled. Comparisons joined with AND/OR, strings in single quotes, ISO 8601 datetimes, e.g. \"startAt >= '2026-10-01T00:00:00Z' AND cancelled = false\". Field names are case sensitive."
},
"location_id": {
"type": "string",
"minLength": 1,
"description": "Location id, e.g. urn:blvd:Location:<uuid> (from boulevard_list_locations)."
}
}
}Replace an appointment's internal notes and/or move its state to BOOKED, CONFIRMED, ARRIVED or ACTIVE (e.g. confirm, or check the client in). Does not cancel or reschedule. GraphQL: updateAppointment.
| Argument | Type | Description |
|---|---|---|
| notes | string | New internal notes (replaces the existing notes). |
| state | string | New appointment state. |
| appointment_id* | string | The Appointment id, e.g. urn:blvd:Appointment:<uuid>. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"appointment_id"
],
"properties": {
"notes": {
"type": "string",
"description": "New internal notes (replaces the existing notes)."
},
"state": {
"enum": [
"BOOKED",
"CONFIRMED",
"ARRIVED",
"ACTIVE"
],
"type": "string",
"description": "New appointment state."
},
"appointment_id": {
"type": "string",
"minLength": 1,
"description": "The Appointment id, e.g. urn:blvd:Appointment:<uuid>."
}
}
}Change a client's name, email, mobile phone, date of birth, pronoun or external id. Only the fields you pass change. GraphQL: updateClient.
| Argument | Type | Description |
|---|---|---|
| dob | string | Date of birth, YYYY-MM-DD. |
| string | Email address. | |
| pronoun | string | Pronoun, e.g. she/her. |
| client_id* | string | The Client id, e.g. urn:blvd:Client:<uuid>. |
| last_name | string | Last name. |
| first_name | string | First name. |
| external_id | string | Your own id for this client. |
| mobile_phone | string | Mobile phone in E.164 form, e.g. +15551234567. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"client_id"
],
"properties": {
"dob": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Date of birth, YYYY-MM-DD."
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"description": "Email address."
},
"pronoun": {
"type": "string",
"description": "Pronoun, e.g. she/her."
},
"client_id": {
"type": "string",
"minLength": 1,
"description": "The Client id, e.g. urn:blvd:Client:<uuid>."
},
"last_name": {
"type": "string",
"description": "Last name."
},
"first_name": {
"type": "string",
"description": "First name."
},
"external_id": {
"type": "string",
"description": "Your own id for this client."
},
"mobile_phone": {
"type": "string",
"description": "Mobile phone in E.164 form, e.g. +15551234567."
}
}
}