import { MCPServer, text, widget } from "mcp-use/server";
import { z } from "zod";
const productSchema = z.object({
id: z.string(),
name: z.string(),
price: z.number(),
});
const productResultsSchema = z.object({
query: z.string(),
results: z.array(productSchema),
});
const server = new MCPServer({
name: "product-search",
version: "1.0.0",
});
async function searchProducts(query: string) {
return [
{ id: "sku_123", name: `${query} starter kit`, price: 29 },
];
}
server.tool(
{
name: "search-products",
description: "Search products and show the results in a widget",
schema: z.object({
query: z.string().describe("Search query"),
}),
outputSchema: productResultsSchema,
annotations: {
readOnlyHint: true,
destructiveHint: false,
openWorldHint: true,
},
widget: {
name: "product-results",
invoking: "Searching products...",
invoked: "Products loaded",
},
},
async ({ query }) => {
const results = await searchProducts(query);
return widget({
props: { query, results },
output: text(`Found ${results.length} products matching "${query}".`),
});
},
);