Tässä luvussa tarjotaan kattava opas turvallisen, skaalautuvan ja reaaliaikaisen suoratoiston toteuttamiseen Model Context Protocolin (MCP) avulla käyttäen HTTPS:ää. Se käsittelee suoratoiston motivaatiota, käytettävissä olevia siirtomekanismeja, HTTP-suoratoiston toteuttamista MCP:ssä, turvallisuuden parhaita käytäntöjä, siirtymistä SSE:stä sekä käytännön ohjeita omien MCP-suoratoistosovellusten rakentamiseen.
Tässä osiossa tarkastellaan MCP:n eri siirtomekanismeja ja niiden roolia reaaliaikaisen viestinnän mahdollistamisessa asiakkaiden ja palvelimien välillä.
Siirtomekanismi määrittää, miten dataa vaihdetaan asiakkaan ja palvelimen välillä. MCP tukee useita siirtotyyppejä, jotka sopivat erilaisiin ympäristöihin ja tarpeisiin:
- stdio: Standardi syöte/tuloste, sopii paikallisiin ja CLI-pohjaisiin työkaluihin. Yksinkertainen, mutta ei sovellu web- tai pilvikäyttöön.
- SSE (Server-Sent Events): Mahdollistaa palvelimien reaaliaikaisten päivitysten lähettämisen asiakkaille HTTP:n kautta. Hyvä web-käyttöliittymille, mutta rajoitettu skaalautuvuudessa ja joustavuudessa.
- Streamable HTTP: Moderni HTTP-pohjainen suoratoistosiirto, joka tukee ilmoituksia ja parempaa skaalautuvuutta. Suositeltava useimpiin tuotanto- ja pilviskenaarioihin.
Alla oleva vertailutaulukko auttaa ymmärtämään näiden siirtomekanismien erot:
| Siirtomekanismi | Reaaliaikaiset päivitykset | Suoratoisto | Skaalautuvuus | Käyttötapaus |
|---|---|---|---|---|
| stdio | Ei | Ei | Matala | Paikalliset CLI-työkalut |
| SSE | Kyllä | Kyllä | Keskitaso | Web, reaaliaikaiset päivitykset |
| Streamable HTTP | Kyllä | Kyllä | Korkea | Pilvi, moniasiakasympäristöt |
Vinkki: Oikean siirtomekanismin valinta vaikuttaa suorituskykyyn, skaalautuvuuteen ja käyttökokemukseen. Streamable HTTP on suositeltava modernien, skaalautuvien ja pilvivalmiiden sovellusten toteutukseen.
Huomaa aiemmissa luvuissa käsitellyt stdio- ja SSE-siirrot sekä tämän luvun keskiössä oleva streamable HTTP.
Suoratoiston peruskäsitteiden ja motivaation ymmärtäminen on olennaista tehokkaiden reaaliaikaisten viestintäjärjestelmien toteuttamiseksi.
Suoratoisto on verkkosovellusohjelmoinnin tekniikka, joka mahdollistaa datan lähettämisen ja vastaanottamisen pieninä, hallittavina paloina tai tapahtumina sen sijaan, että odotettaisiin koko vastauksen valmistumista. Tämä on erityisen hyödyllistä seuraavissa tapauksissa:
- Suuret tiedostot tai tietoaineistot.
- Reaaliaikaiset päivitykset (esim. chat, edistymispalkit).
- Pitkäkestoiset laskennat, joissa käyttäjää halutaan pitää ajan tasalla.
Tässä on, mitä suoratoistosta on hyvä tietää yleisellä tasolla:
- Data toimitetaan vähitellen, ei kerralla.
- Asiakas voi käsitellä dataa sitä mukaa, kun se saapuu.
- Vähentää koettua viivettä ja parantaa käyttökokemusta.
Suoratoiston käytön syyt ovat seuraavat:
- Käyttäjät saavat palautetta heti, eivät vasta lopuksi.
- Mahdollistaa reaaliaikaiset sovellukset ja responsiiviset käyttöliittymät.
- Tehokkaampi verkko- ja laskentaresurssien käyttö.
Tässä on yksinkertainen esimerkki suoratoiston toteuttamisesta:
Palvelin (Python, käyttäen FastAPI:ta ja StreamingResponsea):
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import time
app = FastAPI()
async def event_stream():
for i in range(1, 6):
yield f"data: Message {i}\n\n"
time.sleep(1)
@app.get("/stream")
def stream():
return StreamingResponse(event_stream(), media_type="text/event-stream")Asiakas (Python, käyttäen requests-kirjastoa):
import requests
with requests.get("http://localhost:8000/stream", stream=True) as r:
for line in r.iter_lines():
if line:
print(line.decode())Tämä esimerkki havainnollistaa palvelinta, joka lähettää viestisarjan asiakkaalle sitä mukaa, kun viestit ovat valmiita, sen sijaan että odotettaisiin kaikkien viestien valmistumista.
Miten se toimii:
- Palvelin tuottaa jokaisen viestin sitä mukaa, kun se on valmis.
- Asiakas vastaanottaa ja tulostaa jokaisen palan sitä mukaa, kun se saapuu.
Vaadittavat ominaisuudet:
- Palvelimen on käytettävä suoratoistovastausta (esim.
StreamingResponseFastAPI:ssa). - Asiakkaan on käsiteltävä vastaus suoratoistona (
stream=Truerequests-kirjastossa). - Content-Type on yleensä
text/event-streamtaiapplication/octet-stream.
Palvelin (Java, käyttäen Spring Bootia ja Server-Sent Eventsejä):
@RestController
public class CalculatorController {
@GetMapping(value = "/calculate", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<ServerSentEvent<String>> calculate(@RequestParam double a,
@RequestParam double b,
@RequestParam String op) {
double result;
switch (op) {
case "add": result = a + b; break;
case "sub": result = a - b; break;
case "mul": result = a * b; break;
case "div": result = b != 0 ? a / b : Double.NaN; break;
default: result = Double.NaN;
}
return Flux.<ServerSentEvent<String>>just(
ServerSentEvent.<String>builder()
.event("info")
.data("Calculating: " + a + " " + op + " " + b)
.build(),
ServerSentEvent.<String>builder()
.event("result")
.data(String.valueOf(result))
.build()
)
.delayElements(Duration.ofSeconds(1));
}
}Asiakas (Java, käyttäen Spring WebFlux WebClientiä):
@SpringBootApplication
public class CalculatorClientApplication implements CommandLineRunner {
private final WebClient client = WebClient.builder()
.baseUrl("http://localhost:8080")
.build();
@Override
public void run(String... args) {
client.get()
.uri(uriBuilder -> uriBuilder
.path("/calculate")
.queryParam("a", 7)
.queryParam("b", 5)
.queryParam("op", "mul")
.build())
.accept(MediaType.TEXT_EVENT_STREAM)
.retrieve()
.bodyToFlux(String.class)
.doOnNext(System.out::println)
.blockLast();
}
}Java-toteutuksen huomioita:
- Käyttää Spring Bootin reaktiivista pinoa ja
Flux-luokkaa suoratoistoon. ServerSentEventtarjoaa rakenteellisen tapahtumasuoratoiston tapahtumatyypeillä.WebClientjabodyToFlux()mahdollistavat reaktiivisen suoratoiston kulutuksen.delayElements()simuloi käsittelyaikaa tapahtumien välillä.- Tapahtumilla voi olla tyyppejä (
info,result) paremman asiakaskäsittelyn mahdollistamiseksi.
Erot klassisen suoratoiston ja MCP-suoratoiston välillä voidaan kuvata seuraavasti:
| Ominaisuus | Klassinen HTTP-suoratoisto | MCP-suoratoisto (ilmoitukset) |
|---|---|---|
| Päävastaus | Paloiteltu | Yksittäinen, lopussa |
| Edistymispäivitykset | Lähetetään datan paloina | Lähetetään ilmoituksina |
| Asiakasvaatimukset | Täytyy käsitellä suoratoisto | Täytyy toteuttaa viestinkäsittelijä |
| Käyttötapaus | Suuret tiedostot, AI-tokenit | Edistyminen, lokit, reaaliaikainen palaute |
Lisäksi tässä on joitakin keskeisiä eroja:
-
Viestintämalli:
- Klassinen HTTP-suoratoisto: Käyttää yksinkertaista paloittelusiirtoa datan lähettämiseen paloina.
- MCP-suoratoisto: Käyttää rakenteellista ilmoitusjärjestelmää JSON-RPC-protokollan avulla.
-
Viestimuoto:
- Klassinen HTTP: Yksinkertaiset tekstipalat rivinvaihtoineen.
- MCP: Rakenteelliset
LoggingMessageNotification-objektit metatiedoilla.
-
Asiakastoteutus:
- Klassinen HTTP: Yksinkertainen asiakas, joka käsittelee suoratoistovastauksia.
- MCP: Kehittyneempi asiakas, jossa on viestinkäsittelijä erilaisten viestien käsittelyyn.
-
Edistymispäivitykset:
- Klassinen HTTP: Edistyminen on osa päävastauksen suoratoistoa.
- MCP: Edistyminen lähetetään erillisinä ilmoitusviesteinä, kun päävastaus saapuu lopuksi.
Seuraavassa on suosituksia klassisen suoratoiston (esim. /stream-päätepisteen) ja MCP-suoratoiston välillä valitsemiseen:
-
Yksinkertaisiin suoratoistotarpeisiin: Klassinen HTTP-suoratoisto on yksinkertaisempi toteuttaa ja riittävä perussuoratoistotarpeisiin.
-
Monimutkaisiin, interaktiivisiin sovelluksiin: MCP-suoratoisto tarjoaa rakenteellisemman lähestymistavan, jossa on rikkaammat metatiedot ja erottelu ilmoitusten ja lopputulosten välillä.
-
AI-sovelluksiin: MCP:n ilmoitusjärjestelmä on erityisen hyödyllinen pitkäkestoisissa AI-tehtävissä, joissa käyttäjää halutaan pitää ajan tasalla edistymisestä. On kaksi vakuuttavaa syytä päivittää SSE:stä Streamable HTTP:hen:
-
Streamable HTTP tarjoaa paremman skaalautuvuuden, yhteensopivuuden ja monipuolisemman ilmoitustuen kuin SSE.
-
Se on suositeltu kuljetusmuoto uusille MCP-sovelluksille.
Näin voit siirtyä SSE:stä Streamable HTTP:hen MCP-sovelluksissasi:
- Päivitä palvelinkoodi käyttämään
transport="streamable-http"-asetustamcp.run()-funktiossa. - Päivitä asiakaskoodi käyttämään
streamablehttp_client-asiakasta SSE-asiakkaan sijaan. - Toteuta viestinkäsittelijä asiakkaassa ilmoitusten käsittelyä varten.
- Testaa yhteensopivuus olemassa olevien työkalujen ja työnkulkujen kanssa.
Suositeltavaa on ylläpitää yhteensopivuutta olemassa olevien SSE-asiakkaiden kanssa siirtymäprosessin aikana. Tässä muutamia strategioita:
- Voit tukea sekä SSE:tä että Streamable HTTP:tä käyttämällä molempia kuljetusmuotoja eri päätepisteissä.
- Siirrä asiakkaat vähitellen uuteen kuljetusmuotoon.
Varmista, että käsittelet seuraavat haasteet siirtymän aikana:
- Varmista, että kaikki asiakkaat päivitetään.
- Käsittele erot ilmoitusten toimituksessa.
Tietoturvan tulisi olla ensisijainen prioriteetti minkä tahansa palvelimen toteutuksessa, erityisesti HTTP-pohjaisten kuljetusmuotojen, kuten Streamable HTTP:n, käytössä MCP:ssä.
Kun toteutat MCP-palvelimia HTTP-pohjaisilla kuljetusmuodoilla, tietoturva nousee keskeiseksi huolenaiheeksi, joka vaatii huolellista huomiointia useisiin hyökkäysvektoreihin ja suojamekanismeihin.
Tietoturva on kriittistä MCP-palvelimien altistamisessa HTTP:n kautta. Streamable HTTP tuo mukanaan uusia hyökkäyspintoja ja vaatii huolellista konfigurointia.
Tässä keskeisiä tietoturvanäkökulmia:
- Origin-otsikon validointi: Validoi aina
Origin-otsikko DNS-uudelleensidontahyökkäysten estämiseksi. - Paikallinen sidonta: Kehitysvaiheessa sido palvelimet
localhost-osoitteeseen, jotta ne eivät altistu julkiselle internetille. - Autentikointi: Toteuta autentikointi (esim. API-avaimet, OAuth) tuotantokäyttöä varten.
- CORS: Määritä Cross-Origin Resource Sharing (CORS) -käytännöt pääsyn rajoittamiseksi.
- HTTPS: Käytä HTTPS:ää tuotannossa liikenteen salaamiseksi.
Lisäksi tässä muutamia parhaita käytäntöjä tietoturvan toteuttamiseen MCP-suoratoistopalvelimessa:
- Älä koskaan luota saapuviin pyyntöihin ilman validointia.
- Kirjaa ja seuraa kaikki pääsy- ja virhelokit.
- Päivitä riippuvuudet säännöllisesti tietoturvahaavoittuvuuksien korjaamiseksi.
Tietoturvan toteuttamisessa MCP-suoratoistopalvelimissa kohtaat joitakin haasteita:
- Tietoturvan ja kehityksen helppouden tasapainottaminen
- Yhteensopivuuden varmistaminen eri asiakasympäristöjen kanssa
Tilanne: Rakenna MCP-palvelin ja asiakas, jossa palvelin käsittelee listan kohteita (esim. tiedostoja tai dokumentteja) ja lähettää ilmoituksen jokaisesta käsitellystä kohteesta. Asiakkaan tulisi näyttää jokainen ilmoitus sen saapuessa.
Vaiheet:
- Toteuta palvelintyökalu, joka käsittelee listan ja lähettää ilmoituksia jokaisesta kohteesta.
- Toteuta asiakas, jossa on viestinkäsittelijä ilmoitusten näyttämiseksi reaaliajassa.
- Testaa toteutuksesi ajamalla sekä palvelin että asiakas ja tarkkaile ilmoituksia.
Jatka MCP-suoratoiston parissa ja laajenna tietämystäsi tämän osion lisäresurssien ja ehdotettujen seuraavien askelten avulla rakentaaksesi edistyneempiä sovelluksia.
- Microsoft: Johdatus HTTP-suoratoistoon
- Microsoft: Server-Sent Events (SSE)
- Microsoft: CORS ASP.NET Core:ssa
- Python requests: Suoratoistopyynnöt
- Kokeile rakentaa edistyneempiä MCP-työkaluja, jotka hyödyntävät suoratoistoa reaaliaikaiseen analytiikkaan, keskusteluihin tai yhteistyömuokkaukseen.
- Tutki MCP-suoratoiston integrointia frontend-kehyksiin (React, Vue jne.) reaaliaikaisia käyttöliittymäpäivityksiä varten.
- Seuraavaksi: AI Toolkitin hyödyntäminen VSCode:ssa
Vastuuvapauslauseke:
Tämä asiakirja on käännetty käyttämällä tekoälypohjaista käännöspalvelua Co-op Translator. Vaikka pyrimme tarkkuuteen, huomioithan, että automaattiset käännökset voivat sisältää virheitä tai epätarkkuuksia. Alkuperäinen asiakirja sen alkuperäisellä kielellä tulisi pitää ensisijaisena lähteenä. Kriittisen tiedon osalta suositellaan ammattimaista ihmiskäännöstä. Emme ole vastuussa väärinkäsityksistä tai virhetulkinnoista, jotka johtuvat tämän käännöksen käytöstä.