Modelový protokol pro volání (MCP) výrazně zlepšil způsob, jakým asistenti umělé inteligence interagují s externími nástroji, což umožňuje výkonnější a univerzálnější aplikace. klíčové omezení však existuje uvnitř standardní implementace MCP: volání nástrojů jsou v podstatě operace „černé skříňky“ bez vestavěného uživatelského rozhraní pro interakci.
V tomto článku budu zkoumat inovativní přístup, který jsme vyvinuli v21. magické MCPpřekonat toto omezení vytvořením rozhraní založeného na prohlížeči pro komunikaci MCP, zaměřeného konkrétně na generování komponent uživatelského rozhraní s naší integrací 21st.dev.
Problém: Omezená uživatelská interakce v MCP
Model Calling Protocol umožňuje AI asistentům zavolat externí nástroje k provádění specializovaných úkolů, zatímco výkonná standardní implementace má jednu významnou nevýhodu:
Toto omezení je obzvláště problematické při vytváření komponent uživatelského rozhraní.Když AI navrhuje součást uživatelského rozhraní, uživatelé často potřebují:
-
See various design options
-
Compare different implementations
-
Customize details before integration
-
Make informed choices based on visual representation
Standardní přístup MCP neposkytuje vestavěný mechanismus pro tento typ interaktivní zpětné vazby.
Řešení: Komunikace MCP založená na prohlížeči
Pro řešení tohoto omezení jsme vyvinuli systém, který umožňuje komunikaci s MCP prostřednictvím rozhraní prohlížeče.
- Vytváří místní MCP, který může hostit balíček a otevřít webový prohlížeč
- Poskytuje lokální balíček vedle MCP v NPM
- Automaticky otevírá prohlížeč, který přesměruje na uživatelské rozhraní
- Umožňuje uživatelům komunikovat a vybírat z dostupných možností
- Zavře server a obnoví provedení s výběrem uživatele
Výsledkem je bezproblémová integrace, která udržuje výkon MCP a přidává vizuální zpětnou vazbu a interakční schopnosti, které uživatelé potřebují.
Technická implementace
Podívejme se, jak je to realizováno.
Callback server
Jádrem našeho řešení je callback server, který usnadňuje komunikaci mezi MCP a rozhraním prohlížeče:
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;
}
}
}
Na tomto serveru:
- Dynamicky najde dostupný port
- Vytvoří unikátní ID relace pro každou žádost
- Použijte UI bundle
- Otevře prohlížeč pro zobrazení možností
- Přijímá výběr uživatele prostřednictvím zpětného hovoru
- Vyřeší slib pomocí vybraných dat
Integration with MCP tool
Tento přístup jsme použili k vylepšení nástroje 21st_magic_component_builder, který generuje součásti rozhraní uživatele:
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;
}
}
}
Uživatelská zkušenost Flow
Zde je návod, jak uživatelská zkušenost proudí při žádosti o součást rozhraní uživatele:
- Vyvolání nástroje: Asistent AI vyvolá nástroj 21st_magic_component_builder, když uživatel požádá o novou komponentu rozhraní uživatele.
- API Request: Nástroj odesílá žádost do rozhraní 21st.dev API, aby generoval více variant komponent rozhraní uživatele na základě zprávy a kontextu uživatele.
- Spuštění prohlížeče: Spustí se lokální server a automaticky se otevře okno prohlížeče, které zobrazí generované možnosti komponentu rozhraní uživatele.
- Uživatelská interakce: Uživatel si může prohlížet, interagovat a vybrat svou preferovanou variaci komponentu.
- Selection Capture: Když uživatel provede výběr, prohlížeč odesílá výběr zpět na callback server.
- Opětovné spuštění: Server se vypne a spuštění se obnoví s vybranými daty součástek.
- Integrační vedení: Asistent AI obdrží vybranou komponentu a poskytuje pokyny pro její integraci do uživatelské kódové databáze.
This approach creates a seamless experience that allows users to make informed decisions about UI components while maintaining the overall MCP workflow.
Bezpečnostní a soukromé úvahy
Naše implementace zahrnuje několik bezpečnostních opatření:
- Lokální hosting: Veškerá komunikace probíhá lokálně na počítači uživatele (127.0.0.1)
- Unikátní ID relace: Každá relace prohlížeče má unikátní ID, aby se zabránilo interferenci mezi relacemi
- Timeout mechanismus: relace automaticky vyprší po konfiguračním období (default 5 minut)
- Bezpečnost portu: server dynamicky najde dostupný port, aby se zabránilo konfliktům
Závěr
Přístup založený na prohlížeči k komunikaci MCP představuje významné zlepšení uživatelského zážitku při práci s nástroji, které mají prospěch z vizuální interakce. Překonáním mezery mezi výkonnými schopnostmi MCP a interaktivní povahou webových rozhraní jsme vytvořili intuitivnější pracovní postup pro uživatele. Tento přístup je zvláště cenný pro generování komponent rozhraní uživatele, kde je vizuální reprezentace rozhodující pro přijímání informovaných rozhodnutí.
Zdrojový kód je k dispoziciGitHub.