{"serverId":"mcp-registry/tools.systra/systra-tools","tools":[{"name":"get_component","fixed":{"name":"get_component","description":"Returns the complete, copy-ready React/TSX source of one component as designed, plus notes on its images and any extra files it needs. Components use Tailwind CSS classes and import only react, framer-motion and lucide-react. Use it once you know the exact name; use get_component_styled instead when the component should take on an extracted brand style. Without a premium key, source comes back only for the six free samples (OrbitGalleryHero, CTABanner, FaqSection, ContactSection, FooterSection, ","inputSchema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Component name as listed by list_components or search_components, e.g. 'OrbitGalleryHero'. Matching ignores case."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":220,"tokensAfter":220},{"name":"get_component_styled","fixed":{"name":"get_component_styled","description":"Returns one component's source together with the tokens of a brand style, step-by-step instructions for mapping the component's colours, fonts and radii onto that style, and the colour values the component uses today. Use it instead of get_component when the result should match a specific brand. The server does not rewrite the code; you apply the mapping. Same premium rule as get_component.","inputSchema":{"type":"object","required":["name","style"],"properties":{"name":{"type":"string","description":"Component name as listed by list_components, e.g. 'GradientHeroSection'."},"style":{"type":"string","description":"Style slug exactly as listed by list_styles."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":208,"tokensAfter":208},{"name":"get_post","fixed":{"name":"get_post","description":"Returns one post template as working instructions: the full HTML file, an export script to render it locally as PNG or video, and the rules on what may be changed. The server renders nothing; you edit and export the file. Use it after list_posts.","inputSchema":{"type":"object","required":["slug"],"properties":{"lang":{"enum":["de","en"],"type":"string","description":"Language of the instructions (optional, English by default)."},"slug":{"type":"string","description":"Template slug as listed by list_posts."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":161,"tokensAfter":161},{"name":"get_recipe","fixed":{"name":"get_recipe","description":"Returns one page recipe: the ordered sections with the purpose of each, a composition file where available, and the full source of every section. Pass style to add brand tokens and adaptation instructions. Without a premium key, sections outside the free samples are named but their source is held back. The answer is long because it contains several complete components.","inputSchema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Recipe slug as listed by list_recipes, e.g. 'saas-produkt' or 'hotel-stay'."},"style":{"type":"string","description":"Style slug from list_styles (optional), to adapt the page to a brand."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":204,"tokensAfter":204},{"name":"get_style","fixed":{"name":"get_style","description":"Returns every design token of one extracted brand style: colours, font families and sizes, spacing, radii, CSS variables and the generated DESIGN.md (up to 4000 characters). Use it to theme your own code or set up a design system; use get_component_styled when you want one specific component already paired with the style.","inputSchema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string","description":"Style slug exactly as listed by list_styles."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":151,"tokensAfter":151},{"name":"list_categories","fixed":{"name":"list_categories","description":"Lists every component category of the Systra Tools library with its slug, its title and how many components it holds. Start here when the user names a kind of page part (hero, pricing, footer) instead of a component, then pass the slug to list_components. No parameters, works without a key.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":115,"tokensAfter":115},{"name":"list_components","fixed":{"name":"list_components","description":"Lists component names, optionally limited to one category, one line each with the name and the category slug. Use it to browse a category before choosing; use search_components instead when you already have a keyword. Returns names only, no source: fetch the code with get_component. Works without a key.","inputSchema":{"type":"object","properties":{"category":{"type":"string","description":"Category slug from list_categories, e.g. 'heroes', 'cta', 'pricing', 'forms', 'footer'. Omit it to list every component (more than 600)."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":169,"tokensAfter":169},{"name":"list_images","fixed":{"name":"list_images","description":"Lists images and a few videos from the Systra Tools media library (all AI-generated), each with a permanent URL to use directly as src, plus title, album and format. Filter by album and format, 100 per page. Use it to browse an album; use search_images to find a motif by keyword. Without a premium key only the free images are returned, three per album.","inputSchema":{"type":"object","properties":{"page":{"type":"integer","minimum":1,"description":"Page of the result, 100 images per page (optional, default 1)."},"album":{"type":"string","description":"Album key (optional, German): verlaeufe, abstrakt, surreal, objekte, freisteller, natur, interior, essen, portraet, beauty, hochzeit, menschen, arbeitsplatz, business, industrie, gesundheit, sport, autos, luftfahrt, nachtleben. Without one, every album is returned."},"format":{"enum":["landscape","portrait","square"],"type":"string","description":"Image format to filter by (optional)."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":283,"tokensAfter":283},{"name":"list_posts","fixed":{"name":"list_posts","description":"Lists the Instagram post templates (1080 x 1350) with slug, name, family and whether they need your own imagery. Each template is a single HTML file that can be rebuilt and exported as an image or a video. Use it to pick a slug for get_post.","inputSchema":{"type":"object","properties":{"family":{"enum":["klar","editorial"],"type":"string","description":"Family to filter by (optional): 'klar' are calm informational posts, 'editorial' lives on the image and a serif face."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":152,"tokensAfter":152},{"name":"list_recipes","fixed":{"name":"list_recipes","description":"Lists curated page recipes: proven section sequences for complete landing pages (for example SaaS, coaching or a hotel), each with its number of sections and a short purpose. Use it when the user wants a whole page rather than one section, then call get_recipe. No parameters.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":110,"tokensAfter":110},{"name":"list_styles","fixed":{"name":"list_styles","description":"Lists the brand styles extracted from real websites with the Systra style extractor: slug, site name, primary and accent colour and heading font. Use it to find a slug for get_style, get_component_styled or get_recipe. No parameters, works without a key.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":103,"tokensAfter":103},{"name":"search_components","fixed":{"name":"search_components","description":"Finds components whose name or category contains the search term (one term, case-insensitive substring match) and returns their names with the category slug. Use it when you know roughly what you need, such as 'pricing', 'marquee', 'testimonial' or 'countdown'; use list_components to see a whole category. Names are English PascalCase, so short English words match best. Follow up with get_component for the source.","inputSchema":{"type":"object","required":["query"],"properties":{"query":{"type":"string","description":"One keyword or name fragment, e.g. 'hero', 'gallery', 'bento'. Matched against component names and category slugs and titles."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":202,"tokensAfter":202},{"name":"search_images","fixed":{"name":"search_images","description":"Finds images in the media library (all AI-generated) whose title, tags, file name or album contain every word of the query, and returns their permanent URLs, 100 per page. Use it for a motif, such as 'red dress', 'laptop desk' or 'misty forest'; use list_images to browse a whole album. Titles and tags are English, album keys German. Without a premium key only the free images are included.","inputSchema":{"type":"object","required":["query"],"properties":{"page":{"type":"integer","minimum":1,"description":"Page of the result, 100 images per page (optional, default 1)."},"query":{"type":"string","description":"One or more words; every word must match. E.g. 'gradient', 'laptop', 'red dress'."}},"additionalProperties":false},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":214,"tokensAfter":214}],"toolsChanged":13,"tokensSaved":0,"todo":[],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}