Generates complete, optimized SEO metadata packages including Title Tags, Meta Descriptions, Open Graph tags, schema.org Product JSON-LD, and canonical URL slugs with character limit validation
This is a Python-based SEO metadata generation skill with 2 tools. Tool naming follows verb_noun convention (generate, generate_url_slug), which is good. Both tools have descriptions and input schemas with type information. However, there are significant gaps: (1) Output schemas are entirely undocumented, the code shows that 'generate' returns a complex dict with title_tag, meta_description, og_tags, schema_jsonld, url_slug, and validation fields, but this structure is not formally declared anywhere; (2) Parameter descriptions are minimal and lack constraint guidance (e.g., no min/max for price, no enum for category); (3) Error handling is internal (warnings in validation dict) but not exposed as tool-level error responses with recovery guidance; (4) The tool is transport-agnostic (no MCP protocol visible), so this is a raw Python module, not an MCP server. Schemas exist but are incomplete compared to production baselines.
Generate SEO metadata package for a product.
Generate a clean, web-safe canonical URL slug from a product name.
Output schemas entirely undocumented. 'generate' returns a complex nested dict (title_tag, meta_description, og_tags with nested key-value pairs, schema_jsonld as JSON string, url_slug, validation with is_valid, warnings, lengths), but no formal output schema is visible. LLMs cannot plan downstream tool chains or extract data reliably without knowing return structure.
Parameter descriptions lack constraints and guidance. 'price' accepts float/int/string but description doesn't explain when to use each type or valid range. 'keywords' is an array but max length, format, and ordering are not documented. 'category' is a free-form string with no enum, though categories are finite. No guidance on handling empty or invalid inputs.
No error guidance in tool descriptions. Internal validation warnings (e.g., 'Title tag exceeded limit') are surfaced in the returned validation dict, but there's no explicit error response pattern or recovery guidance. If an LLM receives a warning, the description doesn't say how to proceed or what to retry.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 49 | 2026-07-28+ | v2 |
Price parameter accepts three types (float/int/string) with identical semantics, creating ambiguity. LLMs don't know when to pass '799.99' vs 799.99 vs '799'. This violates the natural-identifiers pattern and invites silent failures or type mismatches. Normalize to a single type (float) with clear formatting guidance.
No composition guidance. 'generate' depends on 'product_name', which 'generate_url_slug' also takes, but the description doesn't mention this relationship. LLMs won't know they can call generate_url_slug independently or reuse its output. Missing dependency hints.