Dette er arbeidslista for workshopen. Skallet du har klonet kjører allerede og
eksponerer ett eksempel-verktøy (about_application). Jobben din er å plukke oppgaver
herfra, én etter én, og gradvis bygge ut MCP-serveren til en fungerende ferie-booking-tjeneste.
Hver oppgave har Mål, Akseptkriterier, Hint og Slik tester du. Ta dem
gjerne i rekkefølge — senere epics bygger på tidligere. Fasiten ligger på solution-branchen
(prøv selv først!).
Domenemodell (allerede i
schema.sql+data.sql):destinations(meny av reisemål) ·availability(perioder + kapasitet + sesongpris) ·bookings(kunde, reisemål, datoer, antall reisende, totalpris, status). Status-flyt:PENDING → CONFIRMED → PAID → COMPLETED(+CANCELLED).
Forretningslogikken er ferdig — fokuset er MCP, ikke business-kode. Dataaksess (
repository/) og logikk med validering, prisberegning og tilstandsmaskin (service/) er implementert og testet. Din jobb er å eksponere disse tjenestene som MCP-verktøy, -ressurser og -prompts. Injiser tjenesten i en@Componentog deleger til den:
Oppgave Bruk T-03/T-04 DestinationService.listAvailable()/.search(query, country, maxPricePerNight)T-05 AvailabilityRepository.findOverlapping(...)T-06 PricingService.quote(...)→QuoteT-07 BookingService.createBooking(...)T-08–T-10 BookingService.get(id)/.list(status)/.updateStatus(id, status)T-11/T-12 håndteres av createBooking(kapasitet) ogBookingService.cancel(id)Tjenestene kaster
ValidationException/NotFoundExceptionved feil — du bestemmer hvordan verktøyet ditt formidler det videre til klienten.
-
Mål: Få serveren opp og se eksempel-verktøyet i MCP Inspector.
-
Akseptkriterier:
./gradlew builder grønt; du serabout_applicationi Inspector og får svar når du kaller det. -
Hint: Start Inspector og pek den på den kjørbare jar-en som stdio-kommando. Kjør fra prosjektroten, så den relative jar-stien stemmer:
npx @modelcontextprotocol/inspector java -jar build/libs/vacation-booking-mcp-0.0.1-SNAPSHOT.jar
Inspector skriver ut en URL i terminalen med et auth-token (
http://localhost:6274/?MCP_PROXY_AUTH_TOKEN=…) — åpne akkurat den URL-en, ellers får du «connection error».Hvis du i stedet startet
npx @modelcontextprotocol/inspectoruten argumenter, åpner UI-et med tomme felt. Fyll da inn i venstre panel og klikk Connect:- Transport Type:
STDIO - Command:
java - Arguments:
-jar build/libs/vacation-booking-mcp-0.0.1-SNAPSHOT.jar
- Transport Type:
-
Slik tester du: Kall
about_applicationfra Inspector og les svaret.
- Mål: Bruke serveren fra en ekte LLM-host (Claude Desktop eller Claude Code).
- Akseptkriterier: Claude lister
about_applicationog kan kalle det. - Hint: Legg serveren inn som en stdio-MCP-server i host-konfigurasjonen (kommando =
java -jar …). Se README for eksempel-config. - Slik tester du: Spør Claude «hva er denne applikasjonen?» og se at den bruker verktøyet.
- Mål: Et verktøy som returnerer alle tilgjengelige reisemål fra databasen.
- Akseptkriterier: Returnerer navn, land, pris pr. natt for alle
available = 1. - Hint: Injiser
DestinationServicei en@Componentog lag en@McpTool-metode som returnererlistAvailable(). - Slik tester du:
tools/call list_destinationsgir 5 reisemål.
- Mål: Søk/filtrering med valgfrie parametre.
- Akseptkriterier: Filtrerer på fritekst i navn/beskrivelse, evt. land og makspris. Ugyldig input (negativ pris) avvises pent.
- Hint: Bruk
@McpToolParam(required = false, …)for de valgfrie feltene og deleger tilDestinationService.search(...)(den validerer og filtrerer).
- Mål: Vis ledige perioder og kapasitet for et reisemål.
- Akseptkriterier: Datoer valideres (ISO-format,
from < to); returnerer overlappendeavailability-rader. - Hint:
AvailabilityRepository.findOverlapping(destinationId, from, to)gir de overlappende periodene. Fokuset er hvordan du tar imot datoer som@McpToolParamog formidler resultatet.
- Mål: Beregn totalpris for et opphold.
- Akseptkriterier: Pris = (sesongpris ?: pris pr. natt) × netter × reisende.
numTravelers ≥ 1. Avviser datoer utenfor tilgjengelig periode. - Hint:
PricingService.quote(...)gjør all validering og prisberegning og returnerer etQuote. Verktøyet ditt mapper bareQuotetil et svar.
- Mål: Opprett en booking med full validering.
- Akseptkriterier: Validerer reisemål finnes/er tilgjengelig, datoer, antall reisende; beregner totalpris; lagrer med status
PENDING; returnerer booking-id. - Hint:
BookingService.createBooking(customerName, destinationId, from, to, numTravelers)gjør validering, kapasitetssjekk og prisberegning og returnerer den lagredeBooking-en.
- Mål: Lese, oppdatere og liste bookinger.
- Akseptkriterier (T-09): Statusendring følger tilstandsmaskinen — ulovlige overganger (f.eks.
COMPLETED → PENDING) avvises. - Hint:
BookingService.get(id),.list(status)og.updateStatus(id, target). Tilstandsmaskinen ligger iBookingStatus.canTransitionTo(...)—updateStatusavviser ulovlige overganger for deg.
- Mål: En booking kan ikke overstige
availability.capacityfor perioden. - Akseptkriterier: Summen av aktive bookinger + ny booking ≤ kapasitet, ellers avvises.
- Hint: Dette er allerede innebygd i
BookingService.createBooking(...)— verifiser at verktøyet ditt fra T-07 formidlerValidationException-en pent når kapasiteten er full.
- Mål: Kanseller en booking og frigjør kapasitet.
- Akseptkriterier: Setter status
CANCELLED; frigjort kapasitet blir tilgjengelig igjen. - Hint:
BookingService.cancel(id). Frigjøringen skjer automatisk (kansellerte bookinger teller ikke mot kapasitet).
- Mål: Eksponer katalogen og enkeltreisemål som MCP-ressurser (
destination://{id}). - Hint: Se Spring AI sine
@McpResource-annotasjoner.
- Mål: Gjenbrukbare prompt-maler, f.eks. «planlegg en ferie innen budsjett» og «reisesammendrag».
- Hint:
@McpPrompt-annoterte metoder.
- Mål: Oppsummer omsetning og belegg pr. reisemål/periode.
- Mål: Kjør serveren som en stå-alene HTTP-tjeneste.
- Hint: Bytt starteren til
spring-ai-starter-mcp-server-webmvcog settspring.ai.mcp.server.protocol=STREAMABLE. Skru på web igjen (fjern stdio-spesifikk config).
- Mål: Beskytt endepunktet med et enkelt token.
- Mål: Bruk HTTP-transporten fra hosten i stedet for stdio.
- T-20 · Elicitation — be brukeren bekrefte datoer/tillegg midt i en booking.
- T-21 · Sampling — la serveren be hosten foreslå «dagens anbefaling» basert på katalogen.