Ein schlanker Spring Boot MCP-Server, der Daten (Timescale/PostgreSQL) per Model Context Protocol (MCP, Spring AI) als Ressourcen + Tools bereitstellt. Fokus: Abfragen & Kontextbereitstellung – keine Daten-Ingestion im aktuellen Code.
Bereitgestellt werden:
- SQL-Query Tool (eingeschränkt sinnvoll nutzen)
- Ressourcendokumentation (Schema, Beispielabfragen, Gerätedaten-Metainfo)
- Resource-Lade-Tool zum Auslesen von MCP-Ressourcen
- MCP SSE-Endpunkt (/mcp/device or /sse)
- Tools:
load(Ressourcen lesen),query(SQL gegen device_states & andere Tabellen) - Ressourcen: Schema, Beispielabfragen, Beispieldaten, Geräte-Attribut-Dokumentation
- Direkte SQL-Ausführung via JdbcTemplate (KEINE Entities definiert – JPA nur vorbereitet)
- Einstieg:
McpServerDbApplication - Tools:
TimescaleToolResource.query,MakeResourcesAccessible.load - Ressourcen:
home-devices-InformationDatabaseSchema-TimescaleToolResourcedevice-insights-readMedevice-insights_devices_example_queriesSample-Data-Sampling-of-device-insights
- Schema:
DeviceHistoryDbSchema(device_states) - SQL-Service:
HistoryService(JdbcTemplate)
- Java 17+ (gebaut wird mit JDK 21 Image, Quellcode kompatibel zu 17)
- Maven 3.9+
- PostgreSQL / TimescaleDB
application.properties (vereinfacht – Variablen via Umgebungsvariablen):
server.port=9090
spring.ai.mcp.server.name=Home-Device-Server
spring.ai.mcp.server.version=0.0.1
spring.ai.mcp.server.type=SYNC
spring.ai.mcp.server.sse-message-endpoint=/mcp/device
spring.datasource.url=jdbc:postgresql://${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}
spring.datasource.username=postgres
spring.datasource.password=${POSTGRES_PASSWORD}Erforderliche Umgebungsvariablen:
- POSTGRES_HOST
- POSTGRES_PORT
- POSTGRES_DB
- POSTGRES_PASSWORD
Optionale (derzeit funktionslos im Code):
- MQTT_SERVER_URI, mqtt.publisherId (MQTT nicht implementiert)
mvn clean package
java -jar target/mcp-test-server-0.0.1-SNAPSHOT.jarDocker (multi-stage, JDK 21 Runtime):
docker build -t mcp-server .
docker run -e POSTGRES_HOST=postgres \
-e POSTGRES_PORT=5432 \
-e POSTGRES_DB=jarvis \
-e POSTGRES_PASSWORD=secret \
-p 9090:9090 mcp-serverCompose (Beispiel selbst erstellen): .env mit DB Variablen anlegen.
CREATE TABLE public.device_states (
"time" timestamptz NOT NULL,
floor text NULL,
room text NULL,
device_short text NULL,
device_full text NULL,
value_type text NULL,
value_value numeric(10,2) NULL
);
-- passende Indizes laut DeviceHistoryDbSchema(Hinweis: Kommentarzeichen // in Schema-Dokumentation sind beschreibend, kein gültiges SQL.)
- SSE: /mcp/device
- load(uri: string)
- Lädt Inhalt einer verfügbaren MCP-Ressource (erst Ressourcen auflisten, dann gezielt laden)
- query(query: string)
- Führt SQL aus. Verantwortung für LIMIT + Zeitfilter liegt beim Aufrufer. Beispielabfragen vorher lesen (
device-insights_devices_example_queries).
- Führt SQL aus. Verantwortung für LIMIT + Zeitfilter liegt beim Aufrufer. Beispielabfragen vorher lesen (
- home-devices-Information → Gerätemetadaten & Attributbedeutung
- DatabaseSchema-TimescaleToolResource → Tabellen-/Schemaüberblick
- device-insights-readMe → Nutzungshinweise
- device-insights_devices_example_queries → Beispiel-SQL
- Sample-Data-Sampling-of-device-insights → aktuelle Stichprobe
Durchschnittstemperatur je Raum:
SELECT room, AVG(value_value) AS avg_temp
FROM public.device_states
WHERE value_type = 'temperature'
GROUP BY room;- Keine Entities: reine JDBC-Abfragen (HistoryService)
- Erweiterung: Entities + Repositories ergänzen oder Ingestion-Mechanismen hinzufügen
- Tests fehlen – empfehlenswert für SQL-Validierung
Noch keine Lizenzdatei hinterlegt – bitte ergänzen (z.B. MIT oder Apache 2.0).
Status: README konsistent mit aktuellem Code (Stand: letzter Review).