Presentasjon - Marp presentation markdown
MCP Travel Weather Server er en basis-implementasjon for MCP workshop LAB03. Dette er en læringsorientert versjon som demonstrerer Model Context Protocol (MCP) grunnleggende konsepter med fokus på værdata.
Arkitektur: Systemet består av tre hovedkomponenter:
- Web Service: Frontend brukergrensesnitt
- AI Agent: OpenAI-basert agent som orkestrerer forespørsler
- MCP Server: HTTP API med værfunksjonalitet
Denne workshopen implementerer JSON-RPC 2.0 over HTTP i henhold til den offisielle MCP spesifikasjonen (2025-11-25).
Offisielle MCP 2025-11-25 Transporter:
- stdio - JSON-RPC 2.0 over standard input/output
- Streamable HTTP - JSON-RPC 2.0 over HTTP POST med valgfri Server-Sent Events (SSE)
Vår Implementasjon:
- ✅ JSON-RPC 2.0 protokoll
- ✅ POST /message endpoint for alle operasjoner
- ✅ tools/list metode for verktøyoppdagelse
- ✅ tools/call metode for verktøykjøring
- ✅ Standard JSON-RPC feilkoder
- ✅ MCP-compliant tool result format (content, structuredContent, isError)
- ✅ MCP tools manifest struktur
Hvorfor Denne Tilnærmingen?
- ✅ Spec-kompatibel og produksjonsklar
- ✅ Lærer den faktiske MCP-protokollen
- ✅ Enkelt å teste med curl (bare JSON)
- ✅ Ingen migrering nødvendig for produksjon
- ✅ Tydelig protokollstruktur
Hva Som Er Valgfritt (Ikke Implementert):
- ⚪ stdio transport (kun HTTP i denne workshopen)
- ⚪ Server-Sent Events streaming
- ⚪ WebSocket transport
- ⚪ MCP SDK wrappere (bruker direkte JSON-RPC for læring)
Dette er en produksjonsklar implementasjon som følger MCP-spesifikasjonen fullstendig.
graph LR
A["<b>Web Service</b><br/>Port 8080<br/>━━━━━━━━━<br/>• Frontend UI<br/>• User Interface<br/>• Examples<br/>• Health Checks"] --HTTP--> B["<b>Agent Service</b><br/>Port 8001<br/>━━━━━━━━━<br/>• AI Logic<br/>• OpenAI GPT-4o<br/>• Conversation<br/>• Memory"]
B --HTTP--> C["<b>MCP Server</b><br/>Port 8000<br/>━━━━━━━━━<br/>• Weather Tool<br/>• OpenWeatherMap<br/>• Geocoding<br/>• Health Checks"]
style A fill:#e1f5ff,stroke:#01579b,stroke-width:2px,color:#000
style B fill:#f3e5f5,stroke:#4a148c,stroke-width:2px,color:#000
style C fill:#e8f5e9,stroke:#1b5e20,stroke-width:2px,color:#000
MCP-compliant JSON-RPC 2.0 API - Port 8000
POST /message- JSON-RPC 2.0 endpoint for alle operasjonertools/listmetode - Hent verktøymanifesttools/callmetode - Kjør verktøy
GET /health- Helsesjekk
MCP Tools Manifest: Serveren følger MCP spesifikasjonen og eksponerer verktøy med:
name: Unikt verktøynavntitle: Human-readable visningsnavndescription: FunksjonalitetsbeskrivelseinputSchema: JSON Schema for input valideringoutputSchema: JSON Schema for output valideringendpoint: HTTP endpoint for verktøyetmethod: HTTP metode (GET, POST, etc.)
MCP Result Format: Alle verktøy returnerer MCP-compliant responses:
{
"content": [{"type": "text", "text": "..."}],
"structuredContent": {...},
"isError": false
}API som brukes:
- OpenWeatherMap for værdata
- Nominatim (OpenStreetMap) for geocoding
AI-orkestrering med MCP-compliant tool handling - Port 8001
- OpenAI GPT-4o mini for intelligent respons
- Dynamisk lasting av verktøy fra MCP server ved oppstart
- MCP-compliant response parsing (content array, structuredContent, isError)
- HTTP klient med endpoint mapping fra tools manifest
- Persistent SQLite database for samtalehistorikk
POST /query- Prosesser brukerforespørslerGET /health- Helsesjekk med agent status
Frontend web-grensesnitt - Port 8080
- HTML/JavaScript grensesnitt
- HTTP klient for agent kommunikasjon
- Eksempel spørsmål og interaktiv chat
- Real-time helsestatusindikator
GET /- HovedsidePOST /query- Proxy til agent serviceGET /examples- Foreslåtte spørsmålGET /health- Helsesjekk
SQLite database viewer - Port 8090
- Web-basert SQLite database viewer for samtalehistorikk
- Read-only tilgang til conversations database
- Visuell inspeksjon av conversation og session data
- Automatisk tilkobling til
/data/conversations.db - Verktøy for å utforske agent hukommelse
Denne LAB03-versjonen er designet for å lære:
- MCP Protocol: Implementering av Model Context Protocol (spec 2025-11-25)
- MCP Tools: Verktøydefinisjon med inputSchema og outputSchema
- MCP Results: Strukturerte responses med content array og structuredContent
- Tools Integration: Dynamisk kobling av AI agent med MCP server verktøy
- OpenAI Function Calling: Strukturert verktøybruk med dynamic tool loading
- Docker Deployment: Containerisert mikroservice deployment
- Error Handling: MCP-compliant error responses med isError flag
Third-Party MCP Client (services/mcp-sdk-client/) - En frittstående Python klient som beviser at MCP serveren følger den offisielle spesifikasjonen:
- ✅ Uavhengig implementasjon - Ingen delt kode med workshop agenten
- ✅ Ren JSON-RPC 2.0 - Ingen proprietære protokoll-utvidelser
- ✅ Minimal avhengigheter - Kun httpx library
- ✅ Fungerer med hvilken som helst MCP server - Oppdager verktøy dynamisk
- ✅ Docker Ready - Kjører i Docker container med fulle tjenesteintegrert
Test det (Docker - Anbefalt):
# Med hele stacken
docker compose --profile compliance-test up mcp-sdk-client
# Eller som en one-off test
docker compose --profile compliance-test run mcp-sdk-clientTest det (Lokalt):
cd services/mcp-sdk-client
export MCP_SERVER_URL=http://localhost:8000 # For lokal testing
python3 test_mcp_sdk.pySe MCP SDK Client README for detaljer.
Du trenger API nøkler for:
- OpenAI: For GPT AI → platform.openai.com
- OpenWeatherMap: For værdata → openweathermap.org/api
# Klon repository
git clone <repository-url>
cd agent
# Sett opp miljøvariabler
cp .env.example .env
# Rediger .env med dine API nøkler
# Start alle tjenester (uten compliance test)
docker compose up -d
# Start alle tjenester INKL. MCP SDK compliance test
docker compose --profile compliance-test up -d
# Sjekk status
docker compose psTilgang:
- Hovedside: http://localhost:8080
- Agent API: http://localhost:8001
- MCP API: http://localhost:8000
- Datasette (Database Viewer): http://localhost:8090
Kjør MCP Compliance Test:
# Se loggen fra compliance test
docker compose logs mcp-sdk-client
# Kjør testen på nytt
docker compose --profile compliance-test run mcp-sdk-client# Kreves for LAB03
OPENAI_API_KEY=your_openai_api_key_here
# Værdata bruker yr.no (api.met.no) - ingen API-nøkkel nødvendig
# Service URLs (auto-konfigurert i Docker)
MCP_SERVER_URL=http://mcp-server:8000- MCP server eksponerer tilgjengelige verktøy via
/toolsendpoint - Agent laster verktøy dynamisk ved oppstart
- Følger MCP spesifikasjon 2025-11-25
- Tools returnerer strukturerte responses med
content,structuredContentogisError - Støtte for inputSchema og outputSchema validering
- Detaljert værprognose for enhver destinasjon
- Temperatur, nedbør, vind og luftfuktighet
- Basert på OpenWeatherMap API
- get_weather_forecast: Hent værprognose for destinasjoner
- ping: Test verktøy for tilkoblingskontroll
- get_status: Server status informasjon
- Alle verktøy følger MCP spesifikasjon
- Husker samtalehistorikk på tvers av sesjoner
- SQLite database for lokal lagring
- Administrering av flere samtalesesjoner
- OpenAI GPT-4o mini for naturlig språkforståelse
- Dynamic function calling basert på MCP tools manifest
- Kontekstbevisst samtaler
Workshop LAB03 demonstrerer MCP (Model Context Protocol) arkitektur med dynamisk tools discovery:
graph LR
WS["Web Service"] -->|HTTP| AA["AI Agent"]
AA -->|dynamic tools| MS["MCP Server"]
MS -->|/tools manifest| AA
MS -->|API calls| EA["External APIs"]
AA -.->|tools/list| MS
AA -.->|tools/call| MS
style WS fill:#e1f5ff,stroke:#01579b,color:#000
style AA fill:#f3e5f5,stroke:#4a148c,color:#000
style MS fill:#e8f5e9,stroke:#1b5e20,color:#000
style EA fill:#fff3e0,stroke:#e65100,color:#000
Arkitektur komponenter:
- Web Service: Frontend brukergrensesnitt og API proxy
- AI Agent: OpenAI GPT-4o mini med dynamisk tools loading og intelligent endpoint mapping
- MCP Server: HTTP API som eksponerer MCP tools manifest og implementerer verktøy
- Tools Manifest: MCP-kompatibel manifest med endpoint og method informasjon
- Memory: Persistent samtalehukommelse
MCP Protocol Implementation:
- MCP server følger MCP spesifikasjon for tools eksponering
- Agent implementerer dynamisk tools discovery ved oppstart
- Intelligent endpoint mapping med både eksplisitt og konvensjonsbasert støtte
- HTTP method routing (GET, POST, PUT, DELETE) basert på tools manifest
pip install -r requirements.txtSystemet er optimalisert for Docker deployment med alle komponenter i separate containere.
- Docker og Docker Compose installert
- API nøkler konfigurert (se over)
# Klon repository og naviger til mappen
cd travel-weather-mcp
# Kopier og rediger miljøvariabler
cp .env.example .env
# Rediger .env med dine API nøkler:
# - OPENAI_API_KEY (kreves)
# Værdata bruker yr.no - ingen API-nøkkel nødvendig
# Bygg og start alle tjenester
docker compose up -d
# Sjekk at alt kjører
docker compose ps- travel-weather-mcp-server: MCP server med værverktøy
- travel-weather-agent: AI agent service
- travel-weather-web: Web interface på http://localhost:8080
Åpne http://localhost:8080 i nettleseren for enkel bruk.
# REST API kall
curl -X POST http://localhost:8080/query \
-H "Content-Type: application/json" \
-d '{"query": "Hvordan er været i Oslo i dag?"}'# Bygg og start alle tjenester
docker compose up -d
# Eller start kun spesifikke tjenester
docker compose up -d mcp-server travel-agent
# Se logfiler
docker compose logs -f mcp-server
docker compose logs -f travel-agent
# Stopp tjenester
docker compose down- Web Interface: http://localhost:8080 - Enkel web-grensesnitt for agenten
- Agent API: http://localhost:8001 - REST API for agenten
- MCP Server: http://localhost:8000 - MCP server API
- Datasette: http://localhost:8090 - SQLite database viewer for samtalehistorikk
- MCP SDK Client (optional): Compliance test - kjøres med
--profile compliance-test
Gå til http://localhost:8080 i nettleseren din for et enkelt brukergrensesnitt.
# Se alle kjørende tjenester
docker compose ps
# Restart spesifikk tjeneste
docker compose restart mcp-server
# Se logfiler live
docker compose logs -f travel-agentMCP Server bruker JSON-RPC 2.0 protokoll via POST /message endpoint for alle operasjoner:
- POST /message - JSON-RPC 2.0 endpoint for alle MCP operasjoner
tools/listmetode - Hent liste over tilgjengelige verktøytools/callmetode - Kjør et spesifikt verktøy
- GET /health - Helsesjekk
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list",
"params": {}
}- Beskrivelse: Hent værprognose for en destinasjon
- Parametere:
location(stedsnavn, f.eks. "Oslo, Norway") - Returner: Værprognose med temperatur, vind, fuktighet og beskrivelse
- Beskrivelse: Test verktøy for tilkoblingskontroll
- Parametere:
message(melding å sende) - Returner: Bekreftelses-melding
Hent verktøyliste:
curl -X POST http://localhost:8000/message \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list"
}'Kall værverktøy:
curl -X POST http://localhost:8000/message \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "get_weather_forecast",
"arguments": {"location": "Oslo, Norway"}
}
}'Kall ping verktøy:
curl -X POST http://localhost:8000/message \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "ping",
"arguments": {"message": "Hello MCP"}
}
}'Via Agent (anbefalt for brukere):
curl -X POST http://localhost:8001/query \
-H "Content-Type: application/json" \
-d '{"query": "Hvordan er været i Oslo?"}'- API nøkler lagres som miljøvariabler
- Ingen sensitive data logges
- Input validering på alle endpoints
- Rate limiting gjennom OpenWeatherMap API
-
"API key not configured"
- Sjekk at miljøvariabler er riktig satt i
.env - Verifiser at API nøklene er gyldige
- Sjekk at miljøvariabler er riktig satt i
-
"Location not found"
- Prøv mer spesifikke stedsnavn
- Inkluder land (f.eks. "Oslo, Norway")
-
Containerproblemer
- Kjør
docker compose down && docker compose up -d - Sjekk logfiler med
docker compose logs
- Kjør
# Se live logfiler (stdout/stderr)
docker compose logs -f travel-agent # Agent service
docker compose logs -f mcp-server # MCP server
docker compose logs -f agent-web # Web service
docker compose logs -f # Alle tjenester
# Tilgang til persistente loggfiler i volume
docker exec travel-weather-agent cat /app/logs/agent.log
docker exec travel-weather-mcp cat /app/logs/mcp-server.log
docker exec travel-weather-web cat /app/logs/web.log
# Følg loggfiler i real-time
docker exec travel-weather-agent tail -f /app/logs/agent.logLogglagring: Alle tjenester lagrer logger i travel-weather-logs Docker volume på /app/logs/ inne i hver container. Logger skrives både til stdout (for docker logs) og til persistente filer.
LAB03 er designet for utvidelse. Deltagere kan legge til:
- Implementer en ny funksjon i
services/mcp-server/app.py - Legg verktøyet til i
handle_tools_list()med navn, beskrivelse og inputSchema - Legg til handling for verktøyet i
handle_tools_call()metoden - Agent vil automatisk laste det nye verktøyet ved restart via
tools/listJSON-RPC metoden - Test med curl eller web interface
Merk: Agent laster verktøy dynamisk via JSON-RPC tools/list, så ingen hardkoding kreves i agent koden.
- Ruteplanlegging: Legg til OpenRouteService API
- Hotell booking: Integrer booking API
- Transport: Legg til public transport API
- Oversettelse: Legg til språkoversettelse
Se Presentasjonen for detaljerte instruksjoner på workshop øvelser.
# Test health endpoints
curl http://localhost:8000/health
curl http://localhost:8001/health
curl http://localhost:8080/health
# Test MCP tools/list metode
curl -X POST http://localhost:8000/message \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list"
}' | python3 -m json.tool
# Test get_weather_forecast verktøy
curl -X POST http://localhost:8000/message \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "get_weather_forecast",
"arguments": {"location": "Oslo, Norway"}
}
}' | python3 -m json.tool
# Test ping verktøy
curl -X POST http://localhost:8000/message \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "ping",
"arguments": {"message": "test"}
}
}' | python3 -m json.tool
# Test via Agent
curl -X POST http://localhost:8001/query \
-H "Content-Type: application/json" \
-d '{"query": "Hva er været i Oslo?}' | python3 -m json.toolMIT License - se LICENSE fil for detaljer.
For workshop deltagere:
- Presentasjon: Marp Presentation
- Teknisk support: Spør workshopleder
Bidrag er velkomne! Vennligst:
- Fork repository
- Opprett en feature branch
- Commit endringene dine
- Push til branch
- Opprett en Pull Request