{"ok":true,"site":{"host":"caprai.dev","url":"https://caprai.dev/en/vibe-coding/post/next-js-and-webmcp-the-skill-that-makes-your-site-speak-the-language-of-ai-agents","type":"live","desc":"A Skill to implement WebMCP on Next.js and make your site compatible with AI agents. Practical experience, mistakes to avoid, and verified solutions.","tools":[{"name":"search_content","kind":"answer","impl":"imperative","description":"Full-text search across the articles and the courses of caprai.dev, Alessandro Caprai's site about artificial intelligence (blog and online courses, in Italian, English and Spanish). Use it to find content on a topic; then call get_article or get_course with a result's url to read it. Only content the current visitor may open is returned.","title":"Search caprai.dev","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"query":{"type":"string","minLength":2,"maxLength":200,"description":"Words to search for, e.g. \"AI Act\" or \"prompt engineering\"."},"type":{"default":"all","description":"Restrict the search to articles or courses. Defaults to all.","type":"string","enum":["all","articles","courses"]},"language":{"description":"Language of the returned content: it (Italian, the site's main language), en (English) or es (Spanish). Defaults to the language of the page the agent is on.","type":"string","enum":["it","en","es"]}},"required":["query"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/en/vibe-coding/post/next-js-and-webmcp-the-skill-that-makes-your-site-speak-the-language-of-ai-agents","pages":["/en/vibe-coding/post/next-js-and-webmcp-the-skill-that-makes-your-site-speak-the-language-of-ai-agents","/it","/it/chi-sono","/it/contatti","/it/aziende","/it/corsi"]},{"name":"list_articles","kind":"answer","impl":"imperative","description":"List the latest articles published on caprai.dev, newest first, with title, URL, short description, category and date. Optionally filter by category slug. Use get_article to read one in full.","title":"List latest articles","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"category":{"description":"A category slug as it appears in the site's URLs, e.g. intelligenza-artificiale. Omit for all categories.","type":"string","minLength":1,"maxLength":200},"limit":{"default":10,"description":"How many articles to return, from 1 to 50. Defaults to 10.","type":"integer","minimum":1,"maximum":50},"language":{"description":"Language of the returned content: it (Italian, the site's main language), en (English) or es (Spanish). Defaults to the language of the page the agent is on.","type":"string","enum":["it","en","es"]}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/en/vibe-coding/post/next-js-and-webmcp-the-skill-that-makes-your-site-speak-the-language-of-ai-agents","pages":["/en/vibe-coding/post/next-js-and-webmcp-the-skill-that-makes-your-site-speak-the-language-of-ai-agents","/it","/it/chi-sono","/it/contatti","/it/aziende","/it/corsi"]},{"name":"get_article","kind":"answer","impl":"imperative","description":"Read one article of caprai.dev in full, as Markdown, with its title, date, category and tags. Pass the article's url (from search_content or list_articles) or its slug. If the article is reserved to some readers the visitor is not among, only its title, URL and public description are returned (available: false, reason: restricted).","title":"Read an article","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"url":{"description":"The article's URL on caprai.dev, absolute or as a path, e.g. https://caprai.dev/en/ai/post/my-article.","type":"string","minLength":1,"maxLength":500},"slug":{"description":"The article's slug (the last segment of its URL), when the URL is not known.","type":"string","minLength":1,"maxLength":200},"language":{"description":"Language of the returned content: it (Italian, the site's main language), en (English) or es (Spanish). Defaults to the language of the page the agent is on.","type":"string","enum":["it","en","es"]}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/en/vibe-coding/post/next-js-and-webmcp-the-skill-that-makes-your-site-speak-the-language-of-ai-agents","pages":["/en/vibe-coding/post/next-js-and-webmcp-the-skill-that-makes-your-site-speak-the-language-of-ai-agents","/it","/it/chi-sono","/it/contatti","/it/aziende","/it/corsi"]},{"name":"list_courses","kind":"answer","impl":"imperative","description":"List the online courses published on caprai.dev, with title, URL, description, level, how they open (free, free_with_registration, reserved, paid), price (in cents, VAT included), duration, number of modules and lessons, and available languages. Use get_course for a course's full programme.","title":"List courses","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"language":{"description":"Language of the returned content: it (Italian, the site's main language), en (English) or es (Spanish). Defaults to the language of the page the agent is on.","type":"string","enum":["it","en","es"]}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/en/vibe-coding/post/next-js-and-webmcp-the-skill-that-makes-your-site-speak-the-language-of-ai-agents","pages":["/en/vibe-coding/post/next-js-and-webmcp-the-skill-that-makes-your-site-speak-the-language-of-ai-agents","/it","/it/chi-sono","/it/contatti","/it/aziende","/it/corsi"]},{"name":"get_course","kind":"answer","impl":"imperative","description":"Get one course of caprai.dev in full: description, programme (modules and lessons with durations), whether it has a final exam and a certificate, how it opens, price and team-seat discounts for paid courses, and what the current visitor can do next (viewer.nextStep: open, register, enroll or buy). Enrolling and paying are done by the person on the course page (url); this tool never does them.","title":"Course details","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"url":{"description":"The course's URL on caprai.dev, absolute or as a path, e.g. https://caprai.dev/en/courses/ai-for-work.","type":"string","minLength":1,"maxLength":500},"slug":{"description":"The course's slug (the last segment of its URL), when the URL is not known.","type":"string","minLength":1,"maxLength":200},"language":{"description":"Language of the returned content: it (Italian, the site's main language), en (English) or es (Spanish). Defaults to the language of the page the agent is on.","type":"string","enum":["it","en","es"]}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/en/vibe-coding/post/next-js-and-webmcp-the-skill-that-makes-your-site-speak-the-language-of-ai-agents","pages":["/en/vibe-coding/post/next-js-and-webmcp-the-skill-that-makes-your-site-speak-the-language-of-ai-agents","/it","/it/chi-sono","/it/contatti","/it/aziende","/it/corsi"]},{"name":"verify_certificate","kind":"act","impl":"imperative","description":"Check whether a caprai.dev course certificate code (format CD-XXXX-XXXX-XXXX, printed on the certificate) is genuine. Returns valid: true with the course title and the issue date, or valid: false. It never returns the holder's name.","title":"Verify a certificate","annotations":{"readOnlyHint":true,"untrustedContentHint":false},"inputSchema":{"type":"object","properties":{"code":{"type":"string","minLength":1,"maxLength":40,"description":"The certificate code, e.g. CD-ACDE-FGHJ-KLMN."},"language":{"description":"Language of the returned content: it (Italian, the site's main language), en (English) or es (Spanish). Defaults to the language of the page the agent is on.","type":"string","enum":["it","en","es"]}},"required":["code"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/en/vibe-coding/post/next-js-and-webmcp-the-skill-that-makes-your-site-speak-the-language-of-ai-agents","pages":["/en/vibe-coding/post/next-js-and-webmcp-the-skill-that-makes-your-site-speak-the-language-of-ai-agents","/it","/it/chi-sono","/it/contatti","/it/aziende","/it/corsi"]},{"name":"subscribe_newsletter","kind":"transact","impl":"declarative","description":"Subscribe the visitor's own email address to the caprai.dev newsletter about artificial intelligence. The site then sends a confirmation email (double opt-in): the address joins the list only when its owner clicks the link. Fill it only with the visitor's own address and consent; the visitor submits the form.","inputSchema":{"type":"object","properties":{"email":{"type":"string","description":"email@example.com"}},"required":["email"]},"__source":"spec","__declarative":true,"page":"/en/vibe-coding/post/next-js-and-webmcp-the-skill-that-makes-your-site-speak-the-language-of-ai-agents","pages":["/en/vibe-coding/post/next-js-and-webmcp-the-skill-that-makes-your-site-speak-the-language-of-ai-agents"]},{"name":"subscribe_newsletter","kind":"transact","impl":"declarative","description":"Subscribe the visitor's own email address to the caprai.dev newsletter about artificial intelligence. The site then sends a confirmation email (double opt-in): the address joins the list only when its owner clicks the link. Fill it only with the visitor's own address and consent; the visitor submits the form.","inputSchema":{"type":"object","properties":{"email":{"type":"string","description":"email@esempio.com"}},"required":["email"]},"__source":"spec","__declarative":true,"page":"/it","pages":["/it","/it/chi-sono","/it/contatti","/it/aziende","/it/corsi"]},{"name":"send_contact_message","kind":"transact","impl":"declarative","description":"Send a message to Alessandro Caprai, author of caprai.dev (questions about courses, AI training for companies, collaborations). Fill it with the visitor's own name and email address, so that he can reply; the visitor reviews and submits the form.","inputSchema":{"type":"object","properties":{"name":{"type":"string"},"email":{"type":"string"},"message":{"type":"string"}},"required":["name","email","message"]},"__source":"spec","__declarative":true,"page":"/it/contatti","pages":["/it/contatti"]}],"category":"Media & Personal","favicon":"/favicons/caprai.dev.png","apiSurface":"spec","toolCount":9}}