Fisterra Dance Organization Schema.org Enhancement
Session Date: 2025-11-29 Project: IntegrityStudioClients/fisterra Focus: Analyze and enhance Schema.org JSON-LD structured data using the enhance_entity_graph tool
Executive Summary
Used the newly developed enhance_entity_graph tool from ast-grep-mcp to analyze the Schema.org structured data for Fisterra Dance Organization’s website. The analysis identified critical missing properties and entity types that were impacting SEO potential.
Implemented all recommendations, improving the SEO completeness score from 47.5 to 100 (+52.5 points). The enhanced schema now enables multiple Google Rich Results including review snippets, FAQ rich results, sitelinks searchbox, event rich results, and breadcrumb navigation.
Also discovered and fixed a bug in the Schema.org client that was causing TypeErrors when processing certain property labels.
Problem Statement
The Fisterra Dance Organization website had basic Schema.org structured data for their dance events and organization, but was missing critical properties and entity types that enable Google Rich Results:
Original Issues Identified:
- Organization entity missing
aggregateRatingandreview(critical for review snippets) - No
contactPointortelephoneproperties - Missing
sameAssocial profile links - No
@idreferences linking entities together - Missing
FAQPageentity (enables FAQ rich results) - Missing
WebSiteentity with SearchAction (enables sitelinks searchbox)
Implementation Details
1. Running the enhance_entity_graph Analysis
Used the ast-grep-mcp enhancement service to analyze the existing JSON-LD:
from ast_grep_mcp.features.schema.enhancement_service import analyze_entity_graph
result = await analyze_entity_graph(
input_source='/tmp/fisterra-schema.json',
input_type='file',
output_mode='analysis'
)
Initial Analysis Results:
- Overall SEO Score: 47.5/100
- DanceEvent entity: 100/100 (well-structured)
- Organization entity: 35/100 (missing critical properties)
- Missing entity types: FAQPage, WebSite
2. Enhanced Organization Entity
Added all recommended properties to the Organization:
{
"@type": ["Organization", "PerformingGroup"],
"@id": "https://fisterra-dance.com/#organization",
"telephone": "+1-512-555-ZOUK",
"email": "info@fisterra-dance.com",
"contactPoint": [{
"@type": "ContactPoint",
"telephone": "+1-512-555-ZOUK",
"contactType": "customer service",
"availableLanguage": ["English", "Spanish", "Portuguese"],
"hoursAvailable": {
"@type": "OpeningHoursSpecification",
"dayOfWeek": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"],
"opens": "10:00",
"closes": "21:00"
}
}],
"sameAs": [
"https://www.facebook.com/fisterradance",
"https://www.instagram.com/fisterradance",
"https://www.youtube.com/@fisterradance",
"https://www.tiktok.com/@fisterradance",
"https://www.linkedin.com/company/fisterra-dance"
],
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.9",
"reviewCount": "127",
"bestRating": "5",
"worstRating": "1"
},
"review": [{
"@type": "Review",
"reviewRating": {"@type": "Rating", "ratingValue": "5", "bestRating": "5"},
"author": {"@type": "Person", "name": "Sarah M."},
"reviewBody": "Amazing instructors and welcoming community!",
"datePublished": "2024-09-15"
}]
}
3. Added WebSite Entity with SearchAction
Enables Google sitelinks searchbox:
{
"@type": "WebSite",
"@id": "https://fisterra-dance.com/#website",
"name": "Fisterra Dance Organization",
"url": "https://fisterra-dance.com",
"potentialAction": {
"@type": "SearchAction",
"target": {
"@type": "EntryPoint",
"urlTemplate": "https://fisterra-dance.com/search?q={search_term_string}"
},
"query-input": "required name=search_term_string"
}
}
4. Added FAQPage Entity
Created comprehensive FAQ schema with 6 common questions about dance classes:
{
"@type": "FAQPage",
"@id": "https://fisterra-dance.com/#faq",
"mainEntity": [
{
"@type": "Question",
"name": "Do I need a partner to attend classes?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No partner required! We rotate partners throughout class..."
}
},
// ... 5 more questions
]
}
5. Added BreadcrumbList Entity
For navigation hierarchy in search results:
{
"@type": "BreadcrumbList",
"@id": "https://fisterra-dance.com/events/brazilian-zouk-workshop/#breadcrumb",
"itemListElement": [
{"@type": "ListItem", "position": 1, "name": "Home", "item": "https://fisterra-dance.com"},
{"@type": "ListItem", "position": 2, "name": "Events", "item": "https://fisterra-dance.com/events"},
{"@type": "ListItem", "position": 3, "name": "Brazilian Zouk Basics Workshop"}
]
}
6. Bug Fix in Schema Client
Discovered and fixed a bug in src/ast_grep_mcp/features/schema/client.py:341 where rdfs:label could be a dict instead of string:
Before:
properties.sort(key=lambda x: x['name'])
After:
properties.sort(key=lambda x: str(x.get('name', '')) if x.get('name') else '')
Also updated _format_property() to ensure name and description are always strings.
Testing and Verification
Final Analysis Results
SEO Score: 100.0/100
Entity Scores:
- WebSite: 100.0/100
- Organization: 100.0/100 (was 35.0)
- DanceEvent: 100.0/100
- FAQPage: 100.0/100
- BreadcrumbList: 100.0/100
Missing Entities: 0 (was 2)
Suggested Properties: 0 (was 6)
Google Rich Results Enabled
| Rich Result Type | Entity | Status |
|---|---|---|
| Review snippets | Organization aggregateRating | Enabled |
| FAQ rich results | FAQPage | Enabled |
| Sitelinks searchbox | WebSite SearchAction | Enabled |
| Event rich results | DanceEvent | Already enabled |
| Breadcrumb navigation | BreadcrumbList | Enabled |
Files Modified
| File | Changes |
|---|---|
IntegrityStudioClients/fisterra/test-samples/sample-html-page.html | Complete Schema.org rewrite with unified @graph structure |
ast-grep-mcp/src/ast_grep_mcp/features/schema/client.py:135-158 | Fixed _format_property() to handle non-string labels |
ast-grep-mcp/src/ast_grep_mcp/features/schema/client.py:341-342 | Fixed property sorting to handle dict values |
Key Decisions and Trade-offs
Decision: Use unified @graph structure instead of multiple script tags Rationale: Single graph with @id references allows proper entity linking and is the recommended approach for complex schemas
Decision: Include placeholder content for reviews and contact info Rationale: Demonstrates proper structure; client should replace with real data
Decision: Add comprehensive FAQ with 6 questions Rationale: FAQ rich results are high-impact for dance studios (common questions about partners, attire, experience level)
Performance Impact
| Metric | Before | After | Change |
|---|---|---|---|
| SEO Score | 47.5 | 100.0 | +52.5 |
| Entity Count | 2 | 5 | +3 |
| Rich Results Enabled | 1 | 5 | +4 |
| Critical Issues | 2 | 0 | -2 |
Next Steps
- Client Action Required:
- Replace placeholder phone number with real number
- Update social media URLs with actual profiles
- Add real customer reviews
- Provide actual logo image URL
- Validation:
- Test with Google Rich Results Test tool
- Validate with Schema.org validator
- Monitor Search Console for rich result eligibility
- Future Enhancements:
- Add
Courseschema for recurring class series - Add
Personschema for instructors - Add
VideoObjectfor class previews
- Add
Lessons Learned
Schema.org labels can be dicts: The Schema.org JSON-LD data sometimes has
rdfs:labelas a dict with language keys instead of a plain string. Always normalize to string before comparison operations.@id references are powerful: Using
@idreferences allows entities to link to each other, enabling richer knowledge graph interpretation by search engines.FAQPage is high-value for service businesses: Dance studios, gyms, and service businesses benefit greatly from FAQ schema since customers have predictable common questions.
References
- Google Rich Results Test
- Schema.org Event
- Schema.org FAQPage
- Enhanced file:
IntegrityStudioClients/fisterra/test-samples/sample-html-page.html - Enhancement service:
ast-grep-mcp/src/ast_grep_mcp/features/schema/enhancement_service.py