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.
The gateway runs the member probe before it connects anything.
How a service appointment gets here
- A shopper asks an AI agent for service.
- The agent asks the gateway; the gateway asks the connected scheduler for open times.
- The shopper picks a time and approves sharing contact, on a consent page they control.
- 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.
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)"
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
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
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.