Skip to content
AutomotiveMCP
SandboxDemo service scheduler on the open AutomotiveMCP gateway, hosted by PromptGraph. Service appointments are sandbox records; nothing reaches the dealer.

Castle Kia of McHenry · Service

Service scheduler

No service scheduler is connected to the store’s gateway right now. The dealer can sign in and add their own by URL, or connect the in-house scheduler. Once one is connected, service appointments from any AI agent land here.

Service drive, next open days

No calendar to show yet

Open times come from the scheduler the dealer connects. Connect one and its calendar appears here.

Upcoming service appointments

No service appointments yet

When a scheduler is connected, service appointments AI agents schedule on it land here.

No scheduler connected

Agents are told the store has not connected a service scheduler.

Service appointments need a scheduler on the store’s gateway. Sign in as the dealer and add one by URL, or connect the in-house scheduler from the catalog. Sandbox connections last 3 hours.

Sign in and add one by URL

How a service appointment gets here

  1. A shopper asks an AI agent for service.
  2. The agent asks the gateway; the gateway asks the connected scheduler for open times.
  3. The shopper picks a time and approves sharing contact, on a consent page they control.
  4. The scheduler schedules it and the visit appears on this board.

The builder story

See how it was built

The in-house scheduler in the catalog was built by the dealership’s own developer in an afternoon with the open AutomotiveMCP kit. Once the dealer connects it (or adds their own by URL), any agent that reaches the gateway can see open service times and schedule a service appointment, and the shopper decides what contact details the scheduler may receive.

  1. Step 1

    Start from the open kit

    One command creates a working gateway member with the right tool names, consent handling and tests.

    Show the command
    node packages/create-automotivemcp-server/bin/create-amcp-server.mjs service-scheduler \
      --member --tools leads.create_appointment,leads.get_appointment \
      --contact email --role service_scheduler --name "Service scheduler (built in-house, sandbox)"
  2. Step 2

    Prove it follows the rules

    The member probe runs the conformance checks and signs a report the dealer sees before approving.

    Show the command
    node bin/amcp-testkit.mjs probe service-scheduler
  3. Step 3

    Try it with a real gateway

    A local gateway starts with the scheduler connected for the demo store, so any agent can schedule against it.

    Show the command
    node bin/amcp-testkit.mjs up --connect service-scheduler
  4. Step 4

    Run the tests

    The kit's tests cover tokens, consent and the entity schema.

    Show the command
    npm test

What it tells the gateway

Its manifest says it is a service scheduler, schedules service appointments only, can list open times without knowing who is asking, and needs the shopper’s verified consent before it schedules.

Show the manifest excerpt
{
  "member_id": "https://gateway.automotivemcp.ai/members/service-scheduler",
  "display_name": "Service scheduler (built in-house, sandbox)",
  "role": "service_scheduler",
  "tools": [
    {
      "name": "leads.create_appointment",
      "read_only": false,
      "scopes": ["amcp:leads:write"],
      "required_amcp_level": "contact_verified",
      "appointment_types": ["service"],
      "preview_when_missing": "start_at",
      "returns_entity": "appointment"
    },
    { "name": "leads.get_appointment", "read_only": true, "scopes": ["amcp:leads:read"] }
  ],
  "identity": { "contact_access": "via_receipt" }
}

The only code the developer wrote

Two handlers replaced the kit’s samples: one reads the store’s service calendar, one lists times or schedules a visit. Everything else (tokens, consent receipts, audit) came from the kit.

Show the two handlers
// Replaced handler 1: the store's service calendar.
// A real scheduler asks its own system for open bays; the sandbox builds
// slots from the store's posted hours.
function serviceSlots(ctx) {
  const { bundle } = ctx.store.get();
  const tz = ctx.services.timeZoneFor(ctx.locationId);
  return slotGrid(bundle.dealer.hours, tz, { department: 'service', times: SERVICE_TIMES, perDay: 3 });
}
// Replaced handler 2: list open slots, or schedule one.
handler: async (a, ctx) => {
  const slots = serviceSlots(ctx);
  if (!a.start_at) return { data: { open_slots: slots } };      // preview: no identity needed
  const slot = inGrid(a.start_at, slots);
  const { release } = useReceipt(ctx, { channel: 'email' });    // contact only under the shopper's receipt
  const item = { type: 'service', status: 'scheduled', start_at: slot.start_at, service_details: { ... } };
  ctx.services.sandbox.write({ kind: 'appointment', item });   // SANDBOX: recorded, not sent
  return { entity: 'appointment', item };
}

Bring your own tool: the full guide · A signed-in dealer can also add their own public https scheduler by URL.