Skip to main content
Glama

Sitecore MCP Server

by GaryWenneker
BIDIRECTIONAL-TEMPLATE-DISCOVERY.md•13.5 kB
# Bidirectional Template-Based Discovery **Versie:** 1.5.0 **Datum:** 17 oktober 2025 **Status:** āš ļø CRITICAL INSTRUCTION **Impact:** Alle relationship discovery workflows --- ## šŸŽÆ Core Principle **Templates zijn de brug tussen content en architectuur.** Bij **ELKE** discovery in Sitecore MCP MOET je bidirectioneel navigeren via templates: ``` Content ←→ Template ←→ Related Content ``` **Dit is NIET optioneel. Dit is CRITICAL voor correcte Helix discovery.** --- ## āš ļø CRITICAL RULE ### Content Item Discovery **Wanneer je een content item vindt:** 1. āœ… **ALTIJD** de template analyseren 2. āœ… **ALTIJD** zoeken naar andere content items met dezelfde template 3. āœ… **ALTIJD** feature locaties zoeken (templates, renderings, resolvers) ### Template Discovery **Wanneer je een template vindt:** 1. āœ… **ALTIJD** zoeken naar alle content items die deze template gebruiken 2. āœ… **ALTIJD** content distributie analyseren (sites, languages, locaties) 3. āœ… **ALTIJD** usage statistics genereren --- ## šŸ”„ Bidirectional Flows ### Flow A: Content → Template → Related Content (Upward) ```typescript // STAP 1: Get content item const item = await sitecore_get_item({ path: '/sitecore/content/MySite/Home/Article1', language: 'en' }); // STAP 2: Extract template information const templatePath = item.template.path; // Result: "/sitecore/templates/Feature/Articles/Article" const featureName = templatePath.split('/')[4]; // Result: "Articles" const templateName = item.template.name; // Result: "Article" // STAP 3A: Search ALL content using same template (CRITICAL!) const relatedContent = await sitecore_search({ templateName: templateName, // "Article" rootPath: '/sitecore/content', language: 'en', maxItems: 100 }); // Result: Article1, Article2, Article3, ... (12 items found) // STAP 3B: Search feature definition locations const templateItems = await sitecore_search({ rootPath: `/sitecore/templates/Feature/${featureName}`, language: 'en' }); const renderingItems = await sitecore_search({ rootPath: `/sitecore/layout/Renderings/Feature/${featureName}`, language: 'en' }); const resolverItems = await sitecore_search({ rootPath: `/sitecore/system/Modules/Layout Service/Rendering Contents Resolvers/Feature/${featureName}`, language: 'en' }); ``` **Output:** ``` šŸ“„ Content Item: Article1 Template: Article (Feature: Articles) šŸ”— Related Content (same template): - Article1 (/sitecore/content/MySite/Home/Article1) - Article2 (/sitecore/content/MySite/News/Article2) - Article3 (/sitecore/content/MySite/Blog/Article3) ... (12 total) šŸ“ Feature Locations: Templates: /sitecore/templates/Feature/Articles (5 items) Renderings: /sitecore/layout/Renderings/Feature/Articles (3 items) Resolvers: /sitecore/system/.../Feature/Articles (2 items) ``` --- ### Flow B: Template → Content (Downward) ```typescript // STAP 1: Get template definition const template = await sitecore_get_template({ templatePath: '/sitecore/templates/Feature/Articles/Article', language: 'en' }); // STAP 2: Extract template name const templateName = template.name; // Result: "Article" // STAP 3: Search ALL content items using this template (CRITICAL!) const contentInstances = await sitecore_search({ templateName: templateName, rootPath: '/sitecore/content', language: 'en', maxItems: 200 }); // STAP 4: Analyze content distribution const sites = {}; const languages = {}; const locations = []; contentInstances.forEach(item => { const siteName = item.path.split('/')[3]; sites[siteName] = (sites[siteName] || 0) + 1; languages[item.language] = (languages[item.language] || 0) + 1; locations.push(item.path); }); const stats = { totalItems: contentInstances.length, sites: sites, // { MySite: 8, AnotherSite: 4 } languages: languages, // { en: 10, nl: 2 } locations: locations }; ``` **Output:** ``` šŸ“‹ Template: Article Path: /sitecore/templates/Feature/Articles/Article šŸ“Š Usage Statistics: Total Content Items: 12 By Site: - MySite: 8 items - AnotherSite: 4 items By Language: - en: 10 items - nl: 2 items Locations: - /sitecore/content/MySite/Home/Article1 - /sitecore/content/MySite/News/Article2 - /sitecore/content/MySite/Blog/Article3 ... (12 total) ``` --- ## šŸŽÆ Complete Example: TestFeatures Module ### Scenario: Discover ALL TestFeatures Related Items ```typescript // USER VRAAG: "Find everything related to TestFeatures" // ================================================== // FLOW A: Start met content item discovery // ================================================== // 1. Search content items with "TestFeatures" in name/path const contentItems = await sitecore_search({ searchText: 'TestFeatures', rootPath: '/sitecore/content', language: 'en', maxItems: 50 }); // Result: Found 3 content items // - /sitecore/content/MySite/Home/TestItem1 // - /sitecore/content/MySite/Home/TestItem2 // - /sitecore/content/MySite/Features/TestItem3 // 2. Get first content item to analyze template const firstItem = await sitecore_get_item({ path: contentItems[0].path, language: 'en' }); // firstItem.template.path = "/sitecore/templates/Feature/TestFeatures/TestFeature Item" // firstItem.template.name = "TestFeature Item" // 3. Search ALL content using same template (CRITICAL!) const allTestFeatureContent = await sitecore_search({ templateName: 'TestFeature Item', rootPath: '/sitecore/content', language: 'en', maxItems: 100 }); // Result: Found 12 items (not just the 3 with "TestFeatures" in name!) // This discovers ALL content using this template, regardless of name // ================================================== // FLOW B: Template definition discovery // ================================================== // 4. Search template folder const templates = await sitecore_search({ rootPath: '/sitecore/templates/Feature/TestFeatures', language: 'en' }); // Result: Found 5 templates // - TestFeature Item // - TestFeature Settings // - TestFeature Data // - _TestFeature Base // - Data Templates/ // 5. For each template, search content usage (CRITICAL!) for (const template of templates) { const templateUsage = await sitecore_search({ templateName: template.name, rootPath: '/sitecore/content', language: 'en' }); console.log(`Template "${template.name}" used by ${templateUsage.length} items`); } // Result: // - TestFeature Item: 12 content items // - TestFeature Settings: 1 content item // - TestFeature Data: 0 content items (not used yet) // - _TestFeature Base: 0 (base template, not directly instantiated) // ================================================== // Additional: Renderings and Resolvers // ================================================== // 6. Search renderings const renderings = await sitecore_search({ rootPath: '/sitecore/layout/Renderings/Feature/TestFeatures', language: 'en' }); // 7. Search resolvers const resolvers = await sitecore_search({ rootPath: '/sitecore/system/Modules/Layout Service/Rendering Contents Resolvers/Feature/TestFeatures', language: 'en' }); ``` **Complete Output:** ``` šŸŽÆ TestFeatures Module - Complete Discovery šŸ“„ Content Items (12 found): Using Template "TestFeature Item": - /sitecore/content/MySite/Home/TestItem1 - /sitecore/content/MySite/Home/TestItem2 - /sitecore/content/MySite/Features/TestItem3 - /sitecore/content/MySite/Data/TestData1 ... (12 total) Distribution: - MySite: 10 items - AnotherSite: 2 items Languages: - en: 10 items - nl: 2 items šŸ“‹ Templates (5 found): Location: /sitecore/templates/Feature/TestFeatures - TestFeature Item (used by 12 content items) - TestFeature Settings (used by 1 content item) - TestFeature Data (not used) - _TestFeature Base (base template) - Data Templates/ šŸ“Š Renderings (3 found): Location: /sitecore/layout/Renderings/Feature/TestFeatures - TestFeature List - TestFeature Detail - TestFeature Navigation šŸ”§ Resolvers (2 found): Location: /sitecore/system/.../Feature/TestFeatures - TestFeature List Resolver - TestFeature Detail Resolver šŸ”— Helix Relationship Map: Feature Module: TestFeatures ā”œā”€ā”€ Templates (5 items) │ └── Used by 13 content items total ā”œā”€ā”€ Renderings (3 items) ā”œā”€ā”€ Resolvers (2 items) └── Content Items (12 items) ā”œā”€ā”€ 2 sites └── 2 languages ``` --- ## āŒ Common Mistakes (AVOID!) ### āŒ FOUT 1: Alleen naam-based search ```typescript // FOUT: Zoekt alleen items met "TestFeatures" in naam const items = await sitecore_search({ searchText: 'TestFeatures', rootPath: '/sitecore/content' }); // Miss: Content items met andere namen maar zelfde template! ``` **āœ… CORRECT:** ```typescript // 1. Zoek met naam const namedItems = await sitecore_search({ searchText: 'TestFeatures', rootPath: '/sitecore/content' }); // 2. Get template van eerste item const item = await sitecore_get_item({ path: namedItems[0].path }); // 3. Zoek ALLE items met zelfde template const allItems = await sitecore_search({ templateName: item.template.name, rootPath: '/sitecore/content' }); ``` --- ### āŒ FOUT 2: Template niet analyseren ```typescript // FOUT: Stopt na content item vinden const item = await sitecore_get_item({ path: '/sitecore/content/MySite/TestItem' }); // Miss: Geen related content, geen feature locations! ``` **āœ… CORRECT:** ```typescript // 1. Get item const item = await sitecore_get_item({ path: '/sitecore/content/MySite/TestItem' }); // 2. Search related content (same template) const related = await sitecore_search({ templateName: item.template.name, rootPath: '/sitecore/content' }); // 3. Search feature locations const feature = item.template.path.split('/')[4]; const templates = await sitecore_search({ rootPath: `/sitecore/templates/Feature/${feature}` }); ``` --- ### āŒ FOUT 3: Template zonder content usage ```typescript // FOUT: Template info zonder usage check const template = await sitecore_get_template({ templatePath: '/sitecore/templates/Feature/Articles/Article' }); // Miss: Hoeveel content items gebruiken dit? Waar? ``` **āœ… CORRECT:** ```typescript // 1. Get template const template = await sitecore_get_template({ templatePath: '/sitecore/templates/Feature/Articles/Article' }); // 2. Search ALL content using this template const usage = await sitecore_search({ templateName: template.name, rootPath: '/sitecore/content' }); // 3. Analyze distribution console.log(`Template used by ${usage.length} content items`); ``` --- ## šŸ“‹ Checklist Bij **ELKE** discovery taak: ### Content Item Discovery - [ ] Content item gevonden? - [ ] Template geanalyseerd? - [ ] Alle content met zelfde template gezocht? - [ ] Feature locaties onderzocht? - [ ] Helix map gegenereerd? ### Template Discovery - [ ] Template gevonden? - [ ] Alle content instances gezocht? - [ ] Usage statistics gegenereerd? - [ ] Distribution geanalyseerd (sites, languages)? - [ ] Related templates onderzocht (base templates)? ### Feature Module Discovery - [ ] Templates onderzocht? - [ ] Renderings onderzocht? - [ ] Resolvers onderzocht? - [ ] Content items gezocht (per template)? - [ ] Complete Helix map? --- ## šŸŽ“ Learning Examples ### Example 1: Article Feature ```typescript // Given: Article content item // Task: Find all related items // Step 1: Content → Template const article = await sitecore_get_item({ path: '/sitecore/content/MySite/News/Article1' }); // template: "Article", feature: "Articles" // Step 2: Template → Related Content const allArticles = await sitecore_search({ templateName: 'Article', rootPath: '/sitecore/content' }); // Result: 25 articles across 3 sites // Step 3: Feature Locations const articleTemplates = await sitecore_search({ rootPath: '/sitecore/templates/Feature/Articles' }); // Result: Article, Article List, Article Category templates // Complete map generated! ``` --- ### Example 2: Navigation Feature ```typescript // Given: Navigation template // Task: Find all navigation instances // Step 1: Template → Content const template = await sitecore_get_template({ templatePath: '/sitecore/templates/Feature/Navigation/Navigation' }); // Step 2: Search content usage const navItems = await sitecore_search({ templateName: 'Navigation', rootPath: '/sitecore/content' }); // Result: 15 navigation items // Step 3: Analyze distribution const sites = groupBy(navItems, item => item.path.split('/')[3]); // Result: { MySite: 8, AnotherSite: 5, ThirdSite: 2 } // Usage report generated! ``` --- ## šŸ“š Related Documentation - **HELIX-RELATIONSHIP-DISCOVERY.md** - Complete Helix workflow - **TESTFEATURES-MCP-WORKFLOW.md** - MCP tools workflow - **.github/copilot-instructions.md** - AI assistant instructions - **MCP-CONTEXT-INSTRUCTIONS.md** - Cross-IDE context --- ## āœ… Success Criteria **You know you're doing it right when:** āœ… Content discovery ALTIJD includes template analysis āœ… Template discovery ALTIJD includes content search āœ… Related content wordt ALTIJD gevonden (via template) āœ… Feature locations worden ALTIJD onderzocht āœ… Usage statistics worden ALTIJD gegenereerd āœ… Helix relationship maps zijn COMPLEET āœ… Geen orphaned items (content without template check) āœ… Geen incomplete discoveries (template without usage) **Status: CRITICAL INSTRUCTION - ALWAYS FOLLOW** šŸš€

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/GaryWenneker/SitecoreMCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server