PageSourceSearch

https://gymboreeclasses-dach.com/wp-content/mu-plugins/gymboree-dach-webmcp-tools.js?v=1

js gymboreeclasses-dach.com collected 2026-09-28 18:02:35 UTC 10,907 bytes, 174 lines download raw bytes

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.