Model Calling Protocol (MCP) har avsevärt förbättrat hur AI-assistenter interagerar med externa verktyg, vilket möjliggör mer kraftfulla och mångsidiga applikationer. emellertid finns det en viktig begränsning inom standard MCP-implementationen: verktygsamtal är i huvudsak "black box" -operationer utan inbyggt användargränssnitt för interaktion.
I den här artikeln kommer jag att utforska ett innovativt tillvägagångssätt som vi har utvecklat i21:e magiska MCPatt övervinna denna begränsning genom att skapa ett webbläsarbaserat gränssnitt för MCP-kommunikation, specifikt inriktat på UI-komponentgenerering med vår 21st.dev-integration.
Problem: Begränsad användarinteraktion i MCP
Model Calling Protocol tillåter AI-assistenter att använda externa verktyg för att utföra specialiserade uppgifter.
Denna begränsning är särskilt problematisk vid generering av UI-komponenter.När en AI föreslår en UI-komponent behöver användarna ofta:
-
See various design options
-
Compare different implementations
-
Customize details before integration
-
Make informed choices based on visual representation
Standard MCP-metoden erbjuder ingen inbyggd mekanism för denna typ av interaktiv feedback loop.
Lösning: Browser-baserad MCP-kommunikation
För att ta itu med denna begränsning har vi utvecklat ett system som möjliggör kommunikation med MCP via ett webbläsargränssnitt.
- Skapar en lokal MCP som kan vara värd för ett paket och öppna en webbläsare
- Tjänar en lokal bunt bredvid MCP i NPM
- Öppnar automatiskt en webbläsare som omdirigerar till ett användargränssnitt
- Tillåter användare att interagera med och välja från tillgängliga alternativ
- Stänger av servern och återupptar utförandet med användarens val
Resultatet är en sömlös integration som upprätthåller kraften i MCP samtidigt som man lägger till visuell feedback och interaktionsfunktioner som användarna behöver.
Teknisk genomförande
Låt oss se hur detta genomförs.
Callback Servern
Kärnan i vår lösning är en callback-server som underlättar kommunikationen mellan MCP och webbläsargränssnittet:
export class CallbackServer {
private server: Server | null = null;
private port: number;
private sessionId = Math.random().toString(36).substring(7);
// ... other properties
async promptUser(
config: CallbackServerConfig = {}
): Promise<CallbackResponse> {
const { initialData = null, timeout = 300000 } = config;
this.config = config;
try {
const availablePort = await this.findAvailablePort();
this.server = createServer(this.handleRequest);
this.server.listen(availablePort, "127.0.0.1");
// Set up promise to handle user selection
return new Promise<CallbackResponse>((resolve, reject) => {
this.promiseResolve = resolve;
this.promiseReject = reject;
// ... server setup code
// Open browser with unique session ID
const url = `http://127.0.0.1:${availablePort}?id=${this.sessionId}`;
open(url).catch((error) => {
console.warn("Failed to open browser:", error);
resolve({ data: { browserOpenFailed: true } });
this.shutdown();
});
});
} catch (error) {
await this.shutdown();
throw error;
}
}
}
Den här servern:
- Dynamiskt hittar en tillgänglig port
- Skapar ett unikt session-ID för varje begäran
- Tjänar UI bundle
- Öppnar webbläsaren för att visa alternativ
- Får användarens val genom en callback
- Löser löftet med de valda uppgifterna
Integration with MCP tool
Vi har tillämpat detta tillvägagångssätt för att förbättra vårt verktyg 21st_magic_component_builder, som genererar UI-komponenter:
export class CreateUiTool extends BaseTool {
name = UI_TOOL_NAME;
description = UI_TOOL_DESCRIPTION;
// ... schema definition
async execute({
message,
searchQuery,
absolutePathToCurrentFile,
context,
}: z.infer<typeof this.schema>): Promise<{
content: Array<{ type: "text"; text: string }>;
}> {
try {
// Fetch UI component variations from API
const response = await twentyFirstClient.post<{
data1: { text: string };
data2: { text: string };
data3: { text: string };
}>("/api/create-ui-variation", {
message,
searchQuery,
fileContent: await getContentOfFile(absolutePathToCurrentFile),
context,
});
// Handle billing or error cases
if (response.status !== 200) {
open("https://21st.dev/settings/billing");
return {
content: [
{
type: "text" as const,
text: response.data.text as string,
},
],
};
}
// Create server and prompt user through browser
const server = new CallbackServer();
const { data } = await server.promptUser({
initialData: {
data1: response.data.data1,
data2: response.data.data2,
data3: response.data.data3,
},
});
// Process user selection and return formatted response
const componentData = data || {
text: "No component data received. Please try again.",
};
// Return formatted response to user
// ...
} catch (error) {
console.error("Error executing tool", error);
throw error;
}
}
}
Användarupplevelse Flow
Så här flödar användarupplevelsen när du begär en UI-komponent:
- Verktygsinriktning: AI-assistenten inbjuder verktyget 21st_magic_component_builder när en användare begär en ny UI-komponent.
- API-begäran: Verktyget skickar en begäran till 21st.dev API för att generera flera UI-komponentvariationer baserat på användarens meddelande och sammanhang.
- Browser Launch: En lokal server startar och ett webbläsarfönster öppnas automatiskt, vilket visar de genererade UI-komponentalternativen.
- Användarinteraktion: Användaren kan visa, interagera med och välja sin föredragna komponentvariation.
- Selection Capture: När användaren gör ett urval skickar webbläsaren urvalet tillbaka till återkopplingsservern.
- Exekveringsåterupptagning: Servern stängs av och utförandet återupptas med de valda komponentdata.
- Integrationsvägledning: AI-assistenten tar emot den valda komponenten och ger vägledning om att integrera den i användarens kodbas.
Detta tillvägagångssätt skapar en sömlös upplevelse som gör det möjligt för användare att fatta välgrundade beslut om UI-komponenter samtidigt som det övergripande MCP-arbetsflödet upprätthålls.
Säkerhets- och integritetsöverväganden
Vår implementering kräver flera säkerhetsåtgärder:
- Lokal hosting: All kommunikation sker lokalt på användarens maskin (127.0.0.1)
- Unika session-ID: Varje webbläsarsession har ett unikt ID för att förhindra interferens mellan sessioner
- Timeout-mekanism: Sessioner slutar automatiskt efter en konfigurerbar period (standard 5 minuter)
- Portsäkerhet: Servern hittar dynamiskt en tillgänglig port för att undvika konflikter
Slutsats
Det webbaserade tillvägagångssättet för MCP-kommunikation representerar en betydande förbättring av användarupplevelsen när man arbetar med verktyg som drar nytta av visuell interaktion. Genom att överbrygga klyftan mellan MCP:s kraftfulla funktioner och webbgränssnittens interaktiva karaktär har vi skapat ett mer intuitivt arbetsflöde för användarna. Detta tillvägagångssätt är särskilt värdefullt för UI-komponentgenerering, där visuell representation är avgörande för att fatta välgrundade beslut.
Källkoden finns tillgänglig påGitHub.