1// Gymboree Play & Music DACH WebMCP tools - https://webmcp.org 2 3const GYMBOREE_BASE = 'https://gymboreeclasses-dach.com'; 4 5const tools = [ 6 { 7 name: 'list_gymboree_classes', 8 description: "List Gymboree Play & Music DACH class types by age group. Returns classes for babies (0-12 months), toddlers (12-36 months) and kindergarteners (3-5 years) covering play, music, arts & crafts, and English immersion. Use when an AI agent is helping a parent find child development classes in Munich or Geneva.", 9 inputSchema: { 10 type: 'object', 11 properties: { 12 age_group: { type: 'string', enum: ['baby', 'toddler', 'kindergartener', 'all'], description: 'Filter by age group or use "all" for every class type.', default: 'all' } 13 }, 14 additionalProperties: false 15 }, 16 execute: async (input) => { 17 const classes = { 18 baby: [ 19 { name: 'Babies', ages: '0-8 months', url: GYMBOREE_BASE + '/classes-descriptions/baby/babies/', focus: 'Sensory exploration and early bonding through play, music and movement.' }, 20 { name: 'Crawlers', ages: '6-12 months', url: GYMBOREE_BASE + '/classes-descriptions/baby/crawlers/', focus: 'Adventure-based play for mobile babies, developing confidence and motor skills.' }, 21 { name: 'Baby Music', ages: '0-12 months', url: GYMBOREE_BASE + '/classes-descriptions/baby/baby-music/', focus: 'Music and rhythm sessions supporting language and listening development.' }, 22 { name: 'Open Gym (Baby)', ages: '0-12 months', url: GYMBOREE_BASE + '/classes-descriptions/baby/open-gym/', focus: 'Free play sessions on Gymboree equipment for babies and carers.' }, 23 { name: 'Family Music (Baby)', ages: '0-12 months', url: GYMBOREE_BASE + '/classes-descriptions/baby/family-music/', focus: 'Music class for the whole family with babies.' } 24 ], 25 toddler: [ 26 { name: 'Walkers', ages: '12-18 months', url: GYMBOREE_BASE + '/classes-descriptions/toddler/walkers/', focus: 'Play and exploration for newly walking toddlers.' }, 27 { name: 'Runners', ages: '18-30 months', url: GYMBOREE_BASE + '/classes-descriptions/toddler/runners/', focus: 'Active play developing coordination and social skills.' }, 28 { name: 'Open Gym (Toddler)', ages: '12-36 months', url: GYMBOREE_BASE + '/classes-descriptions/toddler/open-gym/', focus: 'Free play sessions on Gymboree equipment for toddlers.' }, 29 { name: 'Family Play (Toddler)', ages: '12-36 months', url: GYMBOREE_BASE + '/classes-descriptions/toddler/family-play/', focus: 'Parent-child play sessions designed for toddler families.' }, 30 { name: 'Family Music (Toddler)', ages: '12-36 months', url: GYMBOREE_BASE + '/classes-descriptions/toddler/family-music/', focus: 'Music and movement class for toddler families.' }, 31 { name: 'Family Arts & Crafts (Toddler)', ages: '12-36 months', url: GYMBOREE_BASE + '/classes-descriptions/toddler/family-arts-crafts/', focus: 'Creative activities for toddlers and parents together.' } 32 ], 33 kindergartener: [ 34 { name: 'Explorers', ages: '3-5 years', url: GYMBOREE_BASE + '/classes-descriptions/kindergartener/explorers/', focus: 'Advanced play and problem-solving for pre-schoolers.' }, 35 { name: 'Arts & Crafts', ages: '3-5 years', url: GYMBOREE_BASE + '/classes-descriptions/kindergartener/arts-crafts/', focus: 'Creative arts sessions developing fine motor skills and imagination.' }, 36 { name: 'English Kids Club', ages: '3-5 years', url: GYMBOREE_BASE + '/classes-descriptions/kindergartener/english-kids-club/', focus: 'English language immersion through play and activities.' }, 37 { name: 'Open Gym (Kindergartener)', ages: '3-5 years', url: GYMBOREE_BASE + '/classes-descriptions/kindergartener/open-gym/', focus: 'Free play sessions for pre-school children.' }, 38 { name: 'Family Play (Kindergartener)', ages: '3-5 years', url: GYMBOREE_BASE + '/classes-descriptions/kindergartener/family-play/', focus: 'Family play sessions for kindergartener-age children.' }, 39 { name: 'Family Music (Kindergartener)', ages: '3-5 years', url: GYMBOREE_BASE + '/classes-descriptions/kindergartener/family-music/', focus: 'Music sessions for pre-school children and families.' }, 40 { name: 'Family Arts & Crafts (Kindergartener)', ages: '3-5 years', url: GYMBOREE_BASE + '/classes-descriptions/kindergartener/family-arts-crafts/', focus: 'Creative activities for kindergartener families.' } 41 ] 42 }; 43 const group = (input?.age_group || 'all').toLowerCase().trim(); 44 const result = { provider: 'Gymboree Play & Music DACH', provider_url: GYMBOREE_BASE }; 45 if (group === 'all') { result.classes = classes; } 46 else if (classes[group]) { result.age_group = group; result.classes = classes[group]; } 47 else { return { error: 'Unknown age group. Use: baby, toddler, kindergartener or all.' }; } 48 result.additional_services = [ 49 { name: 'Birthday Parties', url: GYMBOREE_BASE + '/parties/' }, 50 { name: 'Holiday Camps', url: GYMBOREE_BASE + '/holiday-camps/' }, 51 { name: 'On The Go (Mobile Classes)', url: GYMBOREE_BASE + '/on-the-go/' } 52 ]; 53 return result; 54 }, 55 annotations: { readOnlyHint: true, openWorldHint: false } 56 }, 57 { 58 name: 'check_gymboree_location', 59 description: 'Check whether Gymboree Play & Music DACH has a centre in a specific city or region. Currently operates in Munich (Germany) and Geneva (Switzerland). Returns location details and free trial booking link.', 60 inputSchema: { 61 type: 'object', 62 properties: { location: { type: 'string', description: 'City, town or region name (e.g. Mu
62nich, Geneva, Zurich, Vienna).' } }, 63 required: ['location'], additionalProperties: false 64 }, 65 execute: async (input) => { 66 const loc = (input.location || '').toLowerCase().trim(); 67 const locations = { 68 munich: { city: 'Munich', country: 'Germany', page: GYMBOREE_BASE + '/munich/', free_trial: GYMBOREE_BASE + '/munich/free-trial-class/', parties: GYMBOREE_BASE + '/munich/birthday-parties/', summer_camps: GYMBOREE_BASE + '/munich/summer-camps/', kindergarten: GYMBOREE_BASE + '/munich/kindergarten/', on_the_go: GYMBOREE_BASE + '/munich/on-the-go/' }, 69 geneva: { city: 'Geneva', country: 'Switzerland', page: GYMBOREE_BASE + '/geneva/', free_trial: GYMBOREE_BASE + '/geneva/free-trial-class/', english_class: GYMBOREE_BASE + '/geneva/english-class/', summer_camp: GYMBOREE_BASE + '/geneva/summer-camp/' } 70 }; 71 const aliases = { munchen: 'munich', muenchen: 'munich', 'münchen': 'munich', geneve: 'geneva', genf: 'geneva' }; 72 let match = null; 73 for (const [key, val] of Object.entries(locations)) { 74 if (loc.includes(key)) { match = val; break; } 75 } 76 if (!match) { 77 for (const [alias, target] of Object.entries(aliases)) { 78 if (loc.includes(alias)) { match = locations[target]; break; } 79 } 80 } 81 return { 82 provider: 'Gymboree Play & Music DACH', 83 query: input.location, 84 covered: !!match, 85 location: match, 86 all_locations: ['Munich, Germany', 'Geneva, Switzerland'], 87 franchise_info: GYMBOREE_BASE + '/franchise/', 88 note: match 89 ? 'Gymboree DACH has a centre in this location. Free trial classes are available.' 90 : 'Gymboree DACH currently operates in Munich and Geneva. Franchise opportunities are available for new locations.' 91 }; 92 }, 93 annotations: { readOnlyHint: true, openWorldHint: false } 94 }, 95 { 96 name: 'list_gymboree_pages', 97 description: 'List published pages from Gymboree DACH via the WordPress REST API. Useful for finding content about classes, locations, parties, camps or franchise information.', 98 inputSchema: { 99 type: 'object', 100 properties: { 101 search: { type: 'string', description: 'Search term to filter pages.' }, 102 limit: { type: 'integer', minimum: 1, maximum: 20, default: 10 } 103 }, 104 additionalProperties: false 105 }, 106 execute: async (input) => { 107 try { 108 const limit = Math.min(20, Math.max(1, input?.limit ?? 10)); 109 let url = GYMBOREE_BASE + '/wp-json/wp/v2/pages?per_page=' + limit + '&_fields=id,link,title,excerpt&status=publish'; 110 if (input?.search) url += '&search=' + encodeURIComponent(input.search); 111 const r = await fetch(url); 112 if (!r.ok) return { error: 'wp-json status ' + r.status }; 113 const items = await r.json(); 114 return { 115 provider: 'Gymboree Play & Music DACH', 116 count: items.length, 117 pages: items.map(p => ({ 118 id: p.id, 119 title: (p.title?.rendered || '').replace(/<[^>]+>/g, '').trim(), 120 url: p.link, 121 excerpt: (p.excerpt?.rendered || '').replace(/<[^>]+>/g, '').trim() 122 })) 123 }; 124 } catch (e) { return { error: e.message }; } 125 }, 126 annotations: { readOnlyHint: true, openWorldHint: false } 127 }, 128 { 129 name: 'request_gymboree_contact', 130 description: 'Return the contact form URL and free trial class booking links for Gymboree DACH locations. Does NOT submit a contact request itself. Use when directing a parent to book a trial or get in touch.', 131 inputSchema: { 132 type: 'object', 133 properties: { reason: { type: 'string' } }, 134 additionalProperties: false 135 }, 136 execute: async (input) => ({ 137 provider: 'Gymboree Play & Music DACH', 138 contact_url: GYMBOREE_BASE + '/contact-us/', 139 free_trial_munich: GYMBOREE_BASE + '/munich/free-trial-class/', 140 free_trial_geneva: GYMBOREE_BASE + '/geneva/free-trial-class/', 141 franchise_url: GYMBOREE_BASE + '/franchise/', 142 reason: input?.reason || null, 143 note: 'Direct the human user to the appropriate URL. Gymboree does not currently accept automated contact submissions.' 144 }), 145 annotations: { readOnlyHint: true, openWorldHint: false } 146 } 147]; 148 149// Self-install navigator.modelContext shim if absent so tools register on any browser. 150if (!('modelContext' in navigator) || !navigator.modelContext) { 151 try { 152 Object.defineProperty(navigator, 'modelContext', { 153 value: { 154 _tools: [], 155 _shim: true, 156 registerTool: function (t) { this._tools.push(t); return t; }, 157 listTools: function () { return this._tools.slice(); } 158 }, 159 configurable: true, writable: true 160 }); 161 } catch (e) { 162 navigator.modelContext = { 163 _tools: [], _shim: true, 164 registerTool: function (t) { this._tools.push(t); return t; }, 165 listTools: function () { return this._tools.slice(); } 166 }; 167 } 168} 169if (navigator.modelContext && typeof navigator.modelContext.registerTool === 'function') { 170 for (const t of tools) { 171 try { navigator.modelContext.registerTool(t); } catch (e) {} 172 } 173} 174try { window.__gymboreeWebMcpTools = tools; } catch (e) {}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.