@mapbox/mcp-server 0.8.3 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/README.md +39 -12
  2. package/dist/commonjs/index.js +19 -2
  3. package/dist/commonjs/index.js.map +1 -1
  4. package/dist/commonjs/prompts/SearchAlongRoutePrompt.js +6 -6
  5. package/dist/commonjs/prompts/index.d.ts +41 -0
  6. package/dist/commonjs/prompts/index.d.ts.map +1 -0
  7. package/dist/commonjs/prompts/index.js +56 -0
  8. package/dist/commonjs/prompts/index.js.map +1 -0
  9. package/dist/commonjs/resources/index.d.ts +6 -0
  10. package/dist/commonjs/resources/index.d.ts.map +1 -0
  11. package/dist/commonjs/resources/index.js +43 -0
  12. package/dist/commonjs/resources/index.js.map +1 -0
  13. package/dist/commonjs/resources/resourceRegistry.d.ts +3 -1
  14. package/dist/commonjs/resources/resourceRegistry.d.ts.map +1 -1
  15. package/dist/commonjs/resources/resourceRegistry.js +5 -1
  16. package/dist/commonjs/resources/resourceRegistry.js.map +1 -1
  17. package/dist/commonjs/resources/temporary/TemporaryDataResource.d.ts +13 -0
  18. package/dist/commonjs/resources/temporary/TemporaryDataResource.d.ts.map +1 -0
  19. package/dist/commonjs/resources/temporary/TemporaryDataResource.js +41 -0
  20. package/dist/commonjs/resources/temporary/TemporaryDataResource.js.map +1 -0
  21. package/dist/commonjs/resources/ui-apps/StaticMapUIResource.d.ts +15 -0
  22. package/dist/commonjs/resources/ui-apps/StaticMapUIResource.d.ts.map +1 -0
  23. package/dist/commonjs/resources/ui-apps/StaticMapUIResource.js +262 -0
  24. package/dist/commonjs/resources/ui-apps/StaticMapUIResource.js.map +1 -0
  25. package/dist/commonjs/tools/BaseTool.d.ts +10 -0
  26. package/dist/commonjs/tools/BaseTool.d.ts.map +1 -1
  27. package/dist/commonjs/tools/BaseTool.js +9 -4
  28. package/dist/commonjs/tools/BaseTool.js.map +1 -1
  29. package/dist/commonjs/tools/category-search-tool/CategorySearchTool.d.ts.map +1 -1
  30. package/dist/commonjs/tools/category-search-tool/CategorySearchTool.input.schema.d.ts +2 -2
  31. package/dist/commonjs/tools/category-search-tool/CategorySearchTool.js +4 -0
  32. package/dist/commonjs/tools/category-search-tool/CategorySearchTool.js.map +1 -1
  33. package/dist/commonjs/tools/category-search-tool/CategorySearchTool.output.schema.d.ts +17846 -2030
  34. package/dist/commonjs/tools/category-search-tool/CategorySearchTool.output.schema.d.ts.map +1 -1
  35. package/dist/commonjs/tools/category-search-tool/CategorySearchTool.output.schema.js +73 -38
  36. package/dist/commonjs/tools/category-search-tool/CategorySearchTool.output.schema.js.map +1 -1
  37. package/dist/commonjs/tools/directions-tool/DirectionsTool.d.ts.map +1 -1
  38. package/dist/commonjs/tools/directions-tool/DirectionsTool.js +59 -2
  39. package/dist/commonjs/tools/directions-tool/DirectionsTool.js.map +1 -1
  40. package/dist/commonjs/tools/directions-tool/DirectionsTool.output.schema.d.ts +32 -32
  41. package/dist/commonjs/tools/index.d.ts +86 -0
  42. package/dist/commonjs/tools/index.d.ts.map +1 -0
  43. package/dist/commonjs/tools/index.js +146 -0
  44. package/dist/commonjs/tools/index.js.map +1 -0
  45. package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.d.ts +25 -0
  46. package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.d.ts.map +1 -0
  47. package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.input.schema.d.ts +25 -0
  48. package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.input.schema.d.ts.map +1 -0
  49. package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.input.schema.js +30 -0
  50. package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.input.schema.js.map +1 -0
  51. package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.js +193 -0
  52. package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.js.map +1 -0
  53. package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.output.schema.d.ts +296 -0
  54. package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.output.schema.d.ts.map +1 -0
  55. package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.output.schema.js +55 -0
  56. package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.output.schema.js.map +1 -0
  57. package/dist/commonjs/tools/reverse-geocode-tool/ReverseGeocodeTool.input.schema.d.ts +4 -4
  58. package/dist/commonjs/tools/reverse-geocode-tool/ReverseGeocodeTool.output.schema.d.ts +350 -350
  59. package/dist/commonjs/tools/search-and-geocode-tool/SearchAndGeocodeTool.d.ts.map +1 -1
  60. package/dist/commonjs/tools/search-and-geocode-tool/SearchAndGeocodeTool.input.schema.d.ts +4 -4
  61. package/dist/commonjs/tools/search-and-geocode-tool/SearchAndGeocodeTool.js +4 -0
  62. package/dist/commonjs/tools/search-and-geocode-tool/SearchAndGeocodeTool.js.map +1 -1
  63. package/dist/commonjs/tools/search-and-geocode-tool/SearchAndGeocodeTool.output.schema.d.ts +186 -186
  64. package/dist/commonjs/tools/static-map-image-tool/StaticMapImageTool.d.ts +9 -0
  65. package/dist/commonjs/tools/static-map-image-tool/StaticMapImageTool.d.ts.map +1 -1
  66. package/dist/commonjs/tools/static-map-image-tool/StaticMapImageTool.input.schema.d.ts +12 -12
  67. package/dist/commonjs/tools/static-map-image-tool/StaticMapImageTool.js +18 -30
  68. package/dist/commonjs/tools/static-map-image-tool/StaticMapImageTool.js.map +1 -1
  69. package/dist/commonjs/tools/toolRegistry.d.ts +3 -2
  70. package/dist/commonjs/tools/toolRegistry.d.ts.map +1 -1
  71. package/dist/commonjs/tools/toolRegistry.js +2 -0
  72. package/dist/commonjs/tools/toolRegistry.js.map +1 -1
  73. package/dist/commonjs/utils/index.d.ts +33 -0
  74. package/dist/commonjs/utils/index.d.ts.map +1 -0
  75. package/dist/commonjs/utils/index.js +45 -0
  76. package/dist/commonjs/utils/index.js.map +1 -0
  77. package/dist/commonjs/utils/temporaryResourceManager.d.ts +51 -0
  78. package/dist/commonjs/utils/temporaryResourceManager.d.ts.map +1 -0
  79. package/dist/commonjs/utils/temporaryResourceManager.js +92 -0
  80. package/dist/commonjs/utils/temporaryResourceManager.js.map +1 -0
  81. package/dist/commonjs/version.json +3 -3
  82. package/dist/esm/index.js +19 -2
  83. package/dist/esm/index.js.map +1 -1
  84. package/dist/esm/prompts/SearchAlongRoutePrompt.js +6 -6
  85. package/dist/esm/prompts/index.d.ts +41 -0
  86. package/dist/esm/prompts/index.d.ts.map +1 -0
  87. package/dist/esm/prompts/index.js +47 -0
  88. package/dist/esm/prompts/index.js.map +1 -0
  89. package/dist/esm/resources/index.d.ts +6 -0
  90. package/dist/esm/resources/index.d.ts.map +1 -0
  91. package/dist/esm/resources/index.js +37 -0
  92. package/dist/esm/resources/index.js.map +1 -0
  93. package/dist/esm/resources/resourceRegistry.d.ts +3 -1
  94. package/dist/esm/resources/resourceRegistry.d.ts.map +1 -1
  95. package/dist/esm/resources/resourceRegistry.js +5 -1
  96. package/dist/esm/resources/resourceRegistry.js.map +1 -1
  97. package/dist/esm/resources/temporary/TemporaryDataResource.d.ts +13 -0
  98. package/dist/esm/resources/temporary/TemporaryDataResource.d.ts.map +1 -0
  99. package/dist/esm/resources/temporary/TemporaryDataResource.js +37 -0
  100. package/dist/esm/resources/temporary/TemporaryDataResource.js.map +1 -0
  101. package/dist/esm/resources/ui-apps/StaticMapUIResource.d.ts +15 -0
  102. package/dist/esm/resources/ui-apps/StaticMapUIResource.d.ts.map +1 -0
  103. package/dist/esm/resources/ui-apps/StaticMapUIResource.js +258 -0
  104. package/dist/esm/resources/ui-apps/StaticMapUIResource.js.map +1 -0
  105. package/dist/esm/tools/BaseTool.d.ts +10 -0
  106. package/dist/esm/tools/BaseTool.d.ts.map +1 -1
  107. package/dist/esm/tools/BaseTool.js +9 -4
  108. package/dist/esm/tools/BaseTool.js.map +1 -1
  109. package/dist/esm/tools/category-search-tool/CategorySearchTool.d.ts.map +1 -1
  110. package/dist/esm/tools/category-search-tool/CategorySearchTool.input.schema.d.ts +2 -2
  111. package/dist/esm/tools/category-search-tool/CategorySearchTool.js +4 -0
  112. package/dist/esm/tools/category-search-tool/CategorySearchTool.js.map +1 -1
  113. package/dist/esm/tools/category-search-tool/CategorySearchTool.output.schema.d.ts +17846 -2030
  114. package/dist/esm/tools/category-search-tool/CategorySearchTool.output.schema.d.ts.map +1 -1
  115. package/dist/esm/tools/category-search-tool/CategorySearchTool.output.schema.js +73 -38
  116. package/dist/esm/tools/category-search-tool/CategorySearchTool.output.schema.js.map +1 -1
  117. package/dist/esm/tools/directions-tool/DirectionsTool.d.ts.map +1 -1
  118. package/dist/esm/tools/directions-tool/DirectionsTool.js +59 -2
  119. package/dist/esm/tools/directions-tool/DirectionsTool.js.map +1 -1
  120. package/dist/esm/tools/directions-tool/DirectionsTool.output.schema.d.ts +32 -32
  121. package/dist/esm/tools/index.d.ts +86 -0
  122. package/dist/esm/tools/index.d.ts.map +1 -0
  123. package/dist/esm/tools/index.js +118 -0
  124. package/dist/esm/tools/index.js.map +1 -0
  125. package/dist/esm/tools/place-details-tool/PlaceDetailsTool.d.ts +25 -0
  126. package/dist/esm/tools/place-details-tool/PlaceDetailsTool.d.ts.map +1 -0
  127. package/dist/esm/tools/place-details-tool/PlaceDetailsTool.input.schema.d.ts +25 -0
  128. package/dist/esm/tools/place-details-tool/PlaceDetailsTool.input.schema.d.ts.map +1 -0
  129. package/dist/esm/tools/place-details-tool/PlaceDetailsTool.input.schema.js +24 -0
  130. package/dist/esm/tools/place-details-tool/PlaceDetailsTool.input.schema.js.map +1 -0
  131. package/dist/esm/tools/place-details-tool/PlaceDetailsTool.js +189 -0
  132. package/dist/esm/tools/place-details-tool/PlaceDetailsTool.js.map +1 -0
  133. package/dist/esm/tools/place-details-tool/PlaceDetailsTool.output.schema.d.ts +296 -0
  134. package/dist/esm/tools/place-details-tool/PlaceDetailsTool.output.schema.d.ts.map +1 -0
  135. package/dist/esm/tools/place-details-tool/PlaceDetailsTool.output.schema.js +52 -0
  136. package/dist/esm/tools/place-details-tool/PlaceDetailsTool.output.schema.js.map +1 -0
  137. package/dist/esm/tools/reverse-geocode-tool/ReverseGeocodeTool.input.schema.d.ts +4 -4
  138. package/dist/esm/tools/reverse-geocode-tool/ReverseGeocodeTool.output.schema.d.ts +350 -350
  139. package/dist/esm/tools/search-and-geocode-tool/SearchAndGeocodeTool.d.ts.map +1 -1
  140. package/dist/esm/tools/search-and-geocode-tool/SearchAndGeocodeTool.input.schema.d.ts +4 -4
  141. package/dist/esm/tools/search-and-geocode-tool/SearchAndGeocodeTool.js +4 -0
  142. package/dist/esm/tools/search-and-geocode-tool/SearchAndGeocodeTool.js.map +1 -1
  143. package/dist/esm/tools/search-and-geocode-tool/SearchAndGeocodeTool.output.schema.d.ts +186 -186
  144. package/dist/esm/tools/static-map-image-tool/StaticMapImageTool.d.ts +9 -0
  145. package/dist/esm/tools/static-map-image-tool/StaticMapImageTool.d.ts.map +1 -1
  146. package/dist/esm/tools/static-map-image-tool/StaticMapImageTool.input.schema.d.ts +12 -12
  147. package/dist/esm/tools/static-map-image-tool/StaticMapImageTool.js +18 -30
  148. package/dist/esm/tools/static-map-image-tool/StaticMapImageTool.js.map +1 -1
  149. package/dist/esm/tools/toolRegistry.d.ts +3 -2
  150. package/dist/esm/tools/toolRegistry.d.ts.map +1 -1
  151. package/dist/esm/tools/toolRegistry.js +2 -0
  152. package/dist/esm/tools/toolRegistry.js.map +1 -1
  153. package/dist/esm/utils/index.d.ts +33 -0
  154. package/dist/esm/utils/index.d.ts.map +1 -0
  155. package/dist/esm/utils/index.js +36 -0
  156. package/dist/esm/utils/index.js.map +1 -0
  157. package/dist/esm/utils/temporaryResourceManager.d.ts +51 -0
  158. package/dist/esm/utils/temporaryResourceManager.d.ts.map +1 -0
  159. package/dist/esm/utils/temporaryResourceManager.js +88 -0
  160. package/dist/esm/utils/temporaryResourceManager.js.map +1 -0
  161. package/dist/esm/version.json +3 -3
  162. package/package.json +54 -8
  163. /package/patches/{@modelcontextprotocol+sdk+1.25.3.patch → @modelcontextprotocol+sdk+1.26.0.patch} +0 -0
@@ -67,19 +67,19 @@ Please follow these steps:
67
67
  - Use search_and_geocode_tool to convert ${from} and ${to} to coordinates if they're not already in coordinate format
68
68
 
69
69
  2. **Get the route**:
70
- - Use directions_tool with profile=${mode} to get the route geometry between the two points
71
- - Extract the route LineString coordinates from the response (it will be an array of [lon, lat] pairs)
72
- - Note the total route distance
70
+ - Use directions_tool with profile=${mode} and geometries="none" to get route metadata (distance, duration)
71
+ - This returns a compact response with route summary WITHOUT large geometry data
72
+ - Note the total route distance to determine sampling strategy
73
73
 
74
74
  3. **Search along the route using point sampling** (works for all route lengths):
75
75
 
76
76
  **Determine sample strategy based on route length:**
77
- - SHORT routes (< 50km): Sample every 5-10 points along the route (more samples for better coverage)
78
- - MEDIUM routes (50-150km): Sample every 15-20 points along the route
77
+ - SHORT routes (< 50km): Sample 5-7 evenly spaced points between start and end
78
+ - MEDIUM routes (50-150km): Sample 5-7 evenly spaced points between start and end
79
79
  - VERY LONG routes (> 150km): Sample 5-7 evenly spaced points (start, end, and middle points)
80
80
 
81
81
  **For each sample point:**
82
- - Extract the coordinate [lon, lat] from the route
82
+ - Calculate coordinates by interpolating linearly between start and end coordinates
83
83
  - Choose the appropriate search tool:
84
84
  * If "${search_for}" is a specific place/brand (e.g., "Starbucks", "McDonald's", "Whole Foods"):
85
85
  Use search_and_geocode_tool with proximity="lon,lat" and q="${search_for}"
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @module prompts
3
+ *
4
+ * Public API for Mapbox MCP prompts. This module exports:
5
+ * - Prompt classes for custom instantiation
6
+ * - Pre-configured prompt instances ready to use
7
+ * - Registry functions for batch access
8
+ *
9
+ * @example Simple usage with pre-configured instances
10
+ * ```typescript
11
+ * import { getDirections } from '@mapbox/mcp-server/prompts';
12
+ *
13
+ * // Use directly
14
+ * const result = await getDirections.execute({ ... });
15
+ * ```
16
+ *
17
+ * @example Advanced usage with custom instantiation
18
+ * ```typescript
19
+ * import { GetDirectionsPrompt } from '@mapbox/mcp-server/prompts';
20
+ *
21
+ * const customPrompt = new GetDirectionsPrompt();
22
+ * ```
23
+ */
24
+ export { FindPlacesNearbyPrompt } from './FindPlacesNearbyPrompt.js';
25
+ export { GetDirectionsPrompt } from './GetDirectionsPrompt.js';
26
+ export { SearchAlongRoutePrompt } from './SearchAlongRoutePrompt.js';
27
+ export { ShowReachableAreasPrompt } from './ShowReachableAreasPrompt.js';
28
+ import { FindPlacesNearbyPrompt } from './FindPlacesNearbyPrompt.js';
29
+ import { GetDirectionsPrompt } from './GetDirectionsPrompt.js';
30
+ import { SearchAlongRoutePrompt } from './SearchAlongRoutePrompt.js';
31
+ import { ShowReachableAreasPrompt } from './ShowReachableAreasPrompt.js';
32
+ /** Find places near a location */
33
+ export declare const findPlacesNearby: FindPlacesNearbyPrompt;
34
+ /** Get directions between locations */
35
+ export declare const getDirections: GetDirectionsPrompt;
36
+ /** Search for points of interest along a route */
37
+ export declare const searchAlongRoute: SearchAlongRoutePrompt;
38
+ /** Show areas reachable within a time limit */
39
+ export declare const showReachableAreas: ShowReachableAreasPrompt;
40
+ export { getAllPrompts, getPromptByName, type PromptInstance } from './promptRegistry.js';
41
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/prompts/index.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAGzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAGzE,kCAAkC;AAClC,eAAO,MAAM,gBAAgB,wBAA+B,CAAC;AAE7D,uCAAuC;AACvC,eAAO,MAAM,aAAa,qBAA4B,CAAC;AAEvD,kDAAkD;AAClD,eAAO,MAAM,gBAAgB,wBAA+B,CAAC;AAE7D,+CAA+C;AAC/C,eAAO,MAAM,kBAAkB,0BAAiC,CAAC;AAGjE,OAAO,EACL,aAAa,EACb,eAAe,EACf,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,47 @@
1
+ // Copyright (c) Mapbox, Inc.
2
+ // Licensed under the MIT License.
3
+ /**
4
+ * @module prompts
5
+ *
6
+ * Public API for Mapbox MCP prompts. This module exports:
7
+ * - Prompt classes for custom instantiation
8
+ * - Pre-configured prompt instances ready to use
9
+ * - Registry functions for batch access
10
+ *
11
+ * @example Simple usage with pre-configured instances
12
+ * ```typescript
13
+ * import { getDirections } from '@mapbox/mcp-server/prompts';
14
+ *
15
+ * // Use directly
16
+ * const result = await getDirections.execute({ ... });
17
+ * ```
18
+ *
19
+ * @example Advanced usage with custom instantiation
20
+ * ```typescript
21
+ * import { GetDirectionsPrompt } from '@mapbox/mcp-server/prompts';
22
+ *
23
+ * const customPrompt = new GetDirectionsPrompt();
24
+ * ```
25
+ */
26
+ // Export all prompt classes
27
+ export { FindPlacesNearbyPrompt } from './FindPlacesNearbyPrompt.js';
28
+ export { GetDirectionsPrompt } from './GetDirectionsPrompt.js';
29
+ export { SearchAlongRoutePrompt } from './SearchAlongRoutePrompt.js';
30
+ export { ShowReachableAreasPrompt } from './ShowReachableAreasPrompt.js';
31
+ // Import prompt classes for instantiation
32
+ import { FindPlacesNearbyPrompt } from './FindPlacesNearbyPrompt.js';
33
+ import { GetDirectionsPrompt } from './GetDirectionsPrompt.js';
34
+ import { SearchAlongRoutePrompt } from './SearchAlongRoutePrompt.js';
35
+ import { ShowReachableAreasPrompt } from './ShowReachableAreasPrompt.js';
36
+ // Export pre-configured prompt instances with short, clean names
37
+ /** Find places near a location */
38
+ export const findPlacesNearby = new FindPlacesNearbyPrompt();
39
+ /** Get directions between locations */
40
+ export const getDirections = new GetDirectionsPrompt();
41
+ /** Search for points of interest along a route */
42
+ export const searchAlongRoute = new SearchAlongRoutePrompt();
43
+ /** Show areas reachable within a time limit */
44
+ export const showReachableAreas = new ShowReachableAreasPrompt();
45
+ // Export registry functions for batch access
46
+ export { getAllPrompts, getPromptByName } from './promptRegistry.js';
47
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,kCAAkC;AAElC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,4BAA4B;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,0CAA0C;AAC1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,iEAAiE;AACjE,kCAAkC;AAClC,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,sBAAsB,EAAE,CAAC;AAE7D,uCAAuC;AACvC,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,mBAAmB,EAAE,CAAC;AAEvD,kDAAkD;AAClD,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,sBAAsB,EAAE,CAAC;AAE7D,+CAA+C;AAC/C,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,wBAAwB,EAAE,CAAC;AAEjE,6CAA6C;AAC7C,OAAO,EACL,aAAa,EACb,eAAe,EAEhB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { CategoryListResource } from './category-list/CategoryListResource.js';
2
+ import { CategoryListResource } from './category-list/CategoryListResource.js';
3
+ /** Category list for place search (mapbox://categories) */
4
+ export declare const categoryList: CategoryListResource;
5
+ export { getAllResources, getResourceByUri, type ResourceInstance } from './resourceRegistry.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/resources/index.ts"],"names":[],"mappings":"AA+BA,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAG/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAG/E,2DAA2D;AAC3D,eAAO,MAAM,YAAY,sBAA4C,CAAC;AAGtE,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,KAAK,gBAAgB,EACtB,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,37 @@
1
+ // Copyright (c) Mapbox, Inc.
2
+ // Licensed under the MIT License.
3
+ /**
4
+ * @module resources
5
+ *
6
+ * Public API for Mapbox MCP resources. This module exports:
7
+ * - Resource classes for custom instantiation
8
+ * - Pre-configured resource instances ready to use
9
+ * - Registry functions for batch access
10
+ *
11
+ * @example Simple usage with pre-configured instances
12
+ * ```typescript
13
+ * import { categoryList } from '@mapbox/mcp-server/resources';
14
+ *
15
+ * // Use directly - httpRequest already configured
16
+ * const result = await categoryList.read();
17
+ * ```
18
+ *
19
+ * @example Advanced usage with custom pipeline
20
+ * ```typescript
21
+ * import { CategoryListResource } from '@mapbox/mcp-server/resources';
22
+ * import { httpRequest } from '@mapbox/mcp-server/utils';
23
+ *
24
+ * const customResource = new CategoryListResource({ httpRequest });
25
+ * ```
26
+ */
27
+ import { httpRequest } from '../utils/httpPipeline.js';
28
+ // Export all resource classes
29
+ export { CategoryListResource } from './category-list/CategoryListResource.js';
30
+ // Import resource classes for instantiation
31
+ import { CategoryListResource } from './category-list/CategoryListResource.js';
32
+ // Export pre-configured resource instances with short, clean names
33
+ /** Category list for place search (mapbox://categories) */
34
+ export const categoryList = new CategoryListResource({ httpRequest });
35
+ // Export registry functions for batch access
36
+ export { getAllResources, getResourceByUri } from './resourceRegistry.js';
37
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/resources/index.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,kCAAkC;AAElC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,8BAA8B;AAC9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAE/E,4CAA4C;AAC5C,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAE/E,mEAAmE;AACnE,2DAA2D;AAC3D,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,oBAAoB,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;AAEtE,6CAA6C;AAC7C,OAAO,EACL,eAAe,EACf,gBAAgB,EAEjB,MAAM,uBAAuB,CAAC"}
@@ -1,5 +1,7 @@
1
1
  import { CategoryListResource } from './category-list/CategoryListResource.js';
2
- export declare const ALL_RESOURCES: readonly [CategoryListResource];
2
+ import { TemporaryDataResource } from './temporary/TemporaryDataResource.js';
3
+ import { StaticMapUIResource } from './ui-apps/StaticMapUIResource.js';
4
+ export declare const ALL_RESOURCES: readonly [CategoryListResource, TemporaryDataResource, StaticMapUIResource];
3
5
  export type ResourceInstance = (typeof ALL_RESOURCES)[number];
4
6
  export declare function getAllResources(): readonly ResourceInstance[];
5
7
  export declare function getResourceByUri(uri: string): ResourceInstance | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"resourceRegistry.d.ts","sourceRoot":"","sources":["../../../src/resources/resourceRegistry.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAI/E,eAAO,MAAM,aAAa,iCAGhB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,wBAAgB,eAAe,IAAI,SAAS,gBAAgB,EAAE,CAE7D;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAY1E"}
1
+ {"version":3,"file":"resourceRegistry.d.ts","sourceRoot":"","sources":["../../../src/resources/resourceRegistry.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAIvE,eAAO,MAAM,aAAa,6EAKhB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,wBAAgB,eAAe,IAAI,SAAS,gBAAgB,EAAE,CAE7D;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAY1E"}
@@ -2,11 +2,15 @@
2
2
  // Licensed under the MIT License.
3
3
  // INSERT NEW RESOURCE IMPORT HERE
4
4
  import { CategoryListResource } from './category-list/CategoryListResource.js';
5
+ import { TemporaryDataResource } from './temporary/TemporaryDataResource.js';
6
+ import { StaticMapUIResource } from './ui-apps/StaticMapUIResource.js';
5
7
  import { httpRequest } from '../utils/httpPipeline.js';
6
8
  // Central registry of all resources
7
9
  export const ALL_RESOURCES = [
8
10
  // INSERT NEW RESOURCE INSTANCE HERE
9
- new CategoryListResource({ httpRequest })
11
+ new CategoryListResource({ httpRequest }),
12
+ new TemporaryDataResource(),
13
+ new StaticMapUIResource()
10
14
  ];
11
15
  export function getAllResources() {
12
16
  return ALL_RESOURCES;
@@ -1 +1 @@
1
- {"version":3,"file":"resourceRegistry.js","sourceRoot":"","sources":["../../../src/resources/resourceRegistry.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,kCAAkC;AAElC,kCAAkC;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,oCAAoC;AACpC,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,oCAAoC;IACpC,IAAI,oBAAoB,CAAC,EAAE,WAAW,EAAE,CAAC;CACjC,CAAC;AAIX,MAAM,UAAU,eAAe;IAC7B,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,yBAAyB;IACzB,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IAC1E,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAElC,gFAAgF;IAChF,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;QACrC,uDAAuD;QACvD,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC;QAC5C,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"resourceRegistry.js","sourceRoot":"","sources":["../../../src/resources/resourceRegistry.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,kCAAkC;AAElC,kCAAkC;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,oCAAoC;AACpC,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,oCAAoC;IACpC,IAAI,oBAAoB,CAAC,EAAE,WAAW,EAAE,CAAC;IACzC,IAAI,qBAAqB,EAAE;IAC3B,IAAI,mBAAmB,EAAE;CACjB,CAAC;AAIX,MAAM,UAAU,eAAe;IAC7B,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,yBAAyB;IACzB,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IAC1E,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAElC,gFAAgF;IAChF,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;QACrC,uDAAuD;QACvD,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC;QAC5C,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { BaseResource } from '../BaseResource.js';
2
+ import type { ReadResourceResult } from '@modelcontextprotocol/sdk/types.js';
3
+ /**
4
+ * Resource for temporary data storage (large tool responses)
5
+ */
6
+ export declare class TemporaryDataResource extends BaseResource {
7
+ readonly name = "Temporary Data";
8
+ readonly uri = "mapbox://temp/{id}";
9
+ readonly description = "Temporary storage for large tool responses. Data expires after TTL.";
10
+ readonly mimeType = "application/json";
11
+ read(uri: string): Promise<ReadResourceResult>;
12
+ }
13
+ //# sourceMappingURL=TemporaryDataResource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemporaryDataResource.d.ts","sourceRoot":"","sources":["../../../../src/resources/temporary/TemporaryDataResource.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAG7E;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,YAAY;IACrD,QAAQ,CAAC,IAAI,oBAAoB;IACjC,QAAQ,CAAC,GAAG,wBAAwB;IACpC,QAAQ,CAAC,WAAW,yEACoD;IACxE,QAAQ,CAAC,QAAQ,sBAAsB;IAEjC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAyBrD"}
@@ -0,0 +1,37 @@
1
+ // Copyright (c) Mapbox, Inc.
2
+ // Licensed under the MIT License.
3
+ import { BaseResource } from '../BaseResource.js';
4
+ import { temporaryResourceManager } from '../../utils/temporaryResourceManager.js';
5
+ /**
6
+ * Resource for temporary data storage (large tool responses)
7
+ */
8
+ export class TemporaryDataResource extends BaseResource {
9
+ name = 'Temporary Data';
10
+ uri = 'mapbox://temp/{id}';
11
+ description = 'Temporary storage for large tool responses. Data expires after TTL.';
12
+ mimeType = 'application/json';
13
+ async read(uri) {
14
+ const resource = temporaryResourceManager.get(uri);
15
+ if (!resource) {
16
+ return {
17
+ contents: [
18
+ {
19
+ uri: uri,
20
+ mimeType: 'text/plain',
21
+ text: 'Resource not found or expired. Temporary resources have a 30-minute TTL.'
22
+ }
23
+ ]
24
+ };
25
+ }
26
+ return {
27
+ contents: [
28
+ {
29
+ uri: uri,
30
+ mimeType: this.mimeType,
31
+ text: JSON.stringify(resource.data, null, 2)
32
+ }
33
+ ]
34
+ };
35
+ }
36
+ }
37
+ //# sourceMappingURL=TemporaryDataResource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemporaryDataResource.js","sourceRoot":"","sources":["../../../../src/resources/temporary/TemporaryDataResource.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,kCAAkC;AAElC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AAEnF;;GAEG;AACH,MAAM,OAAO,qBAAsB,SAAQ,YAAY;IAC5C,IAAI,GAAG,gBAAgB,CAAC;IACxB,GAAG,GAAG,oBAAoB,CAAC;IAC3B,WAAW,GAClB,qEAAqE,CAAC;IAC/D,QAAQ,GAAG,kBAAkB,CAAC;IAEvC,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,MAAM,QAAQ,GAAG,wBAAwB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEnD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,GAAG,EAAE,GAAG;wBACR,QAAQ,EAAE,YAAY;wBACtB,IAAI,EAAE,0EAA0E;qBACjF;iBACF;aACF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG;oBACR,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;iBAC7C;aACF;SACF,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol.js';
2
+ import type { ReadResourceResult, ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types.js';
3
+ import { BaseResource } from '../BaseResource.js';
4
+ /**
5
+ * Serves UI App HTML for Static Map Preview
6
+ * Implements MCP Apps pattern with ui:// scheme
7
+ */
8
+ export declare class StaticMapUIResource extends BaseResource {
9
+ readonly name = "Static Map Preview UI";
10
+ readonly uri = "ui://mapbox/static-map/index.html";
11
+ readonly description = "Interactive UI for previewing static map images (MCP Apps)";
12
+ readonly mimeType = "text/html;profile=mcp-app";
13
+ read(_uri: string, _extra?: RequestHandlerExtra<ServerRequest, ServerNotification>): Promise<ReadResourceResult>;
14
+ }
15
+ //# sourceMappingURL=StaticMapUIResource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StaticMapUIResource.d.ts","sourceRoot":"","sources":["../../../../src/resources/ui-apps/StaticMapUIResource.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AACxF,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EAClB,aAAa,EACd,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,YAAY;IACnD,QAAQ,CAAC,IAAI,2BAA2B;IACxC,QAAQ,CAAC,GAAG,uCAAuC;IACnD,QAAQ,CAAC,WAAW,gEAC2C;IAC/D,QAAQ,CAAC,QAAQ,+BAAsB;IAEjC,IAAI,CAER,IAAI,EAAE,MAAM,EAEZ,MAAM,CAAC,EAAE,mBAAmB,CAAC,aAAa,EAAE,kBAAkB,CAAC,GAC9D,OAAO,CAAC,kBAAkB,CAAC;CAgP/B"}
@@ -0,0 +1,258 @@
1
+ // Copyright (c) Mapbox, Inc.
2
+ // Licensed under the MIT License.
3
+ import { RESOURCE_MIME_TYPE } from '@modelcontextprotocol/ext-apps/server';
4
+ import { BaseResource } from '../BaseResource.js';
5
+ /**
6
+ * Serves UI App HTML for Static Map Preview
7
+ * Implements MCP Apps pattern with ui:// scheme
8
+ */
9
+ export class StaticMapUIResource extends BaseResource {
10
+ name = 'Static Map Preview UI';
11
+ uri = 'ui://mapbox/static-map/index.html';
12
+ description = 'Interactive UI for previewing static map images (MCP Apps)';
13
+ mimeType = RESOURCE_MIME_TYPE;
14
+ async read(
15
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
16
+ _uri,
17
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
18
+ _extra) {
19
+ // Generate HTML for static map visualization with MCP Apps protocol support
20
+ const html = `<!DOCTYPE html>
21
+ <html>
22
+ <head>
23
+ <meta charset="UTF-8">
24
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
25
+ <title>Static Map Preview</title>
26
+ <style>
27
+ * { margin: 0; padding: 0; box-sizing: border-box; }
28
+ body {
29
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
30
+ background: #000;
31
+ }
32
+ #toolbar {
33
+ display: none;
34
+ align-items: center;
35
+ justify-content: flex-end;
36
+ padding: 6px 10px;
37
+ background: rgba(0, 0, 0, 0.7);
38
+ gap: 8px;
39
+ }
40
+ #toolbar.visible { display: flex; }
41
+ #fullscreen-btn {
42
+ background: rgba(255, 255, 255, 0.15);
43
+ border: 1px solid rgba(255, 255, 255, 0.3);
44
+ color: #fff;
45
+ padding: 4px 12px;
46
+ border-radius: 4px;
47
+ cursor: pointer;
48
+ font-size: 12px;
49
+ }
50
+ #fullscreen-btn:hover { background: rgba(255, 255, 255, 0.25); }
51
+ #image-container {
52
+ position: relative;
53
+ }
54
+ #preview-image {
55
+ display: none;
56
+ max-width: 100%;
57
+ width: 100%;
58
+ cursor: zoom-in;
59
+ }
60
+ #preview-image.zoomed {
61
+ cursor: zoom-out;
62
+ max-width: none;
63
+ width: auto;
64
+ }
65
+ #loading {
66
+ padding: 20px;
67
+ color: #fff;
68
+ font-size: 16px;
69
+ }
70
+ #error {
71
+ padding: 20px;
72
+ color: #ff6b6b;
73
+ text-align: center;
74
+ }
75
+ </style>
76
+ </head>
77
+ <body>
78
+ <div id="toolbar">
79
+ <button id="fullscreen-btn">⛶ Fullscreen</button>
80
+ </div>
81
+ <div id="image-container">
82
+ <div id="loading">Loading static map preview...</div>
83
+ <img id="preview-image" alt="Static Map Preview">
84
+ <div id="error" style="display:none"></div>
85
+ </div>
86
+
87
+ <script type="module">
88
+ const image = document.getElementById('preview-image');
89
+ const loading = document.getElementById('loading');
90
+ const errorDiv = document.getElementById('error');
91
+ const toolbar = document.getElementById('toolbar');
92
+ const fullscreenBtn = document.getElementById('fullscreen-btn');
93
+
94
+ let isZoomed = false;
95
+ let currentDisplayMode = 'inline';
96
+ let canFullscreen = false;
97
+
98
+ image.addEventListener('click', () => {
99
+ isZoomed = !isZoomed;
100
+ image.classList.toggle('zoomed', isZoomed);
101
+ });
102
+
103
+ let messageId = 0;
104
+ const pendingRequests = new Map();
105
+
106
+ function sendRequest(method, params = {}) {
107
+ const id = ++messageId;
108
+ window.parent.postMessage({ jsonrpc: '2.0', id, method, params }, '*');
109
+ return new Promise((resolve, reject) => {
110
+ pendingRequests.set(id, { resolve, reject });
111
+ });
112
+ }
113
+
114
+ function sendNotification(method, params = {}) {
115
+ window.parent.postMessage({ jsonrpc: '2.0', method, params }, '*');
116
+ }
117
+
118
+ function requestSizeToFit() {
119
+ if (currentDisplayMode !== 'inline') return;
120
+ // Use requestAnimationFrame to measure after layout so we get the
121
+ // actual rendered height (constrained by max-width:100%), not natural px
122
+ requestAnimationFrame(() => {
123
+ const toolbarHeight = canFullscreen ? toolbar.offsetHeight : 0;
124
+ sendNotification('ui/notifications/size-changed', {
125
+ height: Math.round(image.getBoundingClientRect().height) + toolbarHeight
126
+ });
127
+ });
128
+ }
129
+
130
+ function updateFullscreenButton() {
131
+ fullscreenBtn.textContent =
132
+ currentDisplayMode === 'fullscreen' ? '⊟ Exit Fullscreen' : '⛶ Fullscreen';
133
+ }
134
+
135
+ async function toggleFullscreen() {
136
+ const newMode = currentDisplayMode === 'fullscreen' ? 'inline' : 'fullscreen';
137
+ try {
138
+ const result = await sendRequest('ui/request-display-mode', { mode: newMode });
139
+ currentDisplayMode = result?.mode ?? newMode;
140
+ updateFullscreenButton();
141
+ if (currentDisplayMode === 'inline') requestSizeToFit();
142
+ } catch (e) {
143
+ console.error('Failed to change display mode:', e);
144
+ }
145
+ }
146
+
147
+ fullscreenBtn.addEventListener('click', toggleFullscreen);
148
+
149
+ window.addEventListener('message', (event) => {
150
+ const message = event.data;
151
+ if (!message || typeof message !== 'object') return;
152
+
153
+ if (message.id !== undefined && pendingRequests.has(message.id)) {
154
+ const { resolve, reject } = pendingRequests.get(message.id);
155
+ pendingRequests.delete(message.id);
156
+ if (message.error) reject(new Error(message.error.message));
157
+ else resolve(message.result);
158
+ return;
159
+ }
160
+
161
+ if (message.method === 'ui/notifications/tool-result') {
162
+ if (message.params) handleToolResult(message.params);
163
+ }
164
+
165
+ if (message.method === 'ui/notifications/host-context-changed') {
166
+ const ctx = message.params;
167
+ if (ctx?.displayMode) {
168
+ currentDisplayMode = ctx.displayMode;
169
+ updateFullscreenButton();
170
+ if (currentDisplayMode === 'inline' && image.style.display !== 'none') {
171
+ requestSizeToFit();
172
+ }
173
+ }
174
+ }
175
+ });
176
+
177
+ async function handleToolResult(result) {
178
+ const textContent = result.content?.find(c => c.type === 'text');
179
+ if (!textContent?.text) {
180
+ loading.style.display = 'none';
181
+ errorDiv.textContent = 'No URL found in tool result';
182
+ errorDiv.style.display = 'block';
183
+ return;
184
+ }
185
+
186
+ const url = textContent.text;
187
+ if (!url.includes('api.mapbox.com/styles/') || !url.includes('/static/')) {
188
+ loading.style.display = 'none';
189
+ errorDiv.textContent = 'Unsupported URL format';
190
+ errorDiv.style.display = 'block';
191
+ return;
192
+ }
193
+
194
+ loading.textContent = 'Fetching map from Mapbox...';
195
+ try {
196
+ const response = await fetch(url);
197
+ if (!response.ok) throw new Error('HTTP ' + response.status);
198
+ const blob = await response.blob();
199
+ const blobUrl = URL.createObjectURL(blob);
200
+
201
+ image.onload = () => {
202
+ loading.style.display = 'none';
203
+ image.style.display = 'block';
204
+ if (canFullscreen) toolbar.classList.add('visible');
205
+ requestSizeToFit();
206
+ };
207
+ image.src = blobUrl;
208
+ } catch (error) {
209
+ loading.style.display = 'none';
210
+ errorDiv.textContent = 'Failed to load image: ' + error.message;
211
+ errorDiv.style.display = 'block';
212
+ }
213
+ }
214
+
215
+ async function init() {
216
+ try {
217
+ const result = await sendRequest('ui/initialize', {
218
+ protocolVersion: '2026-01-26',
219
+ appCapabilities: {},
220
+ appInfo: { name: 'Static Map Preview', version: '1.0.0' }
221
+ });
222
+
223
+ sendNotification('ui/notifications/initialized', {});
224
+
225
+ const hostContext = result?.hostContext;
226
+ currentDisplayMode = hostContext?.displayMode ?? 'inline';
227
+ canFullscreen = hostContext?.availableDisplayModes?.includes('fullscreen') ?? false;
228
+ } catch (error) {
229
+ console.error('Failed to connect to MCP host:', error);
230
+ loading.textContent = 'Failed to connect: ' + error.message;
231
+ loading.style.color = '#cc0000';
232
+ }
233
+ }
234
+
235
+ init();
236
+ </script>
237
+ </body>
238
+ </html>`;
239
+ return {
240
+ contents: [
241
+ {
242
+ uri: this.uri,
243
+ mimeType: RESOURCE_MIME_TYPE,
244
+ text: html,
245
+ _meta: {
246
+ ui: {
247
+ csp: {
248
+ connectDomains: ['https://api.mapbox.com'],
249
+ resourceDomains: ['https://api.mapbox.com']
250
+ }
251
+ }
252
+ }
253
+ }
254
+ ]
255
+ };
256
+ }
257
+ }
258
+ //# sourceMappingURL=StaticMapUIResource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StaticMapUIResource.js","sourceRoot":"","sources":["../../../../src/resources/ui-apps/StaticMapUIResource.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,kCAAkC;AAQlC,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;;GAGG;AACH,MAAM,OAAO,mBAAoB,SAAQ,YAAY;IAC1C,IAAI,GAAG,uBAAuB,CAAC;IAC/B,GAAG,GAAG,mCAAmC,CAAC;IAC1C,WAAW,GAClB,4DAA4D,CAAC;IACtD,QAAQ,GAAG,kBAAkB,CAAC;IAEvC,KAAK,CAAC,IAAI;IACR,6DAA6D;IAC7D,IAAY;IACZ,6DAA6D;IAC7D,MAA+D;QAE/D,4EAA4E;QAC5E,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA0NT,CAAC;QAEL,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI;oBACV,KAAK,EAAE;wBACL,EAAE,EAAE;4BACF,GAAG,EAAE;gCACH,cAAc,EAAE,CAAC,wBAAwB,CAAC;gCAC1C,eAAe,EAAE,CAAC,wBAAwB,CAAC;6BAC5C;yBACF;qBACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC;CACF"}
@@ -8,6 +8,16 @@ export declare abstract class BaseTool<InputSchema extends ZodTypeAny, OutputSch
8
8
  abstract readonly annotations: ToolAnnotations;
9
9
  readonly inputSchema: InputSchema;
10
10
  readonly outputSchema?: OutputSchema;
11
+ readonly meta?: {
12
+ ui?: {
13
+ resourceUri?: string;
14
+ csp?: {
15
+ connectDomains?: string[];
16
+ resourceDomains?: string[];
17
+ frameDomains?: string[];
18
+ };
19
+ };
20
+ };
11
21
  protected server: McpServer | null;
12
22
  constructor(params: {
13
23
  inputSchema: InputSchema;
@@ -1 +1 @@
1
- {"version":3,"file":"BaseTool.d.ts","sourceRoot":"","sources":["../../../src/tools/BaseTool.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACf,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACf,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AACxF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAGtC,8BAAsB,QAAQ,CAC5B,WAAW,SAAS,UAAU,EAC9B,YAAY,SAAS,UAAU,GAAG,UAAU;IAE5C,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;IAE/C,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;IACrC,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAQ;gBAE9B,MAAM,EAAE;QAClB,WAAW,EAAE,WAAW,CAAC;QACzB,YAAY,CAAC,EAAE,YAAY,CAAC;KAC7B;IAKD;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,cAAc;IAkC5C;;OAEG;IACH,QAAQ,CAAC,GAAG,CACV,QAAQ,EAAE,OAAO,EAEjB,KAAK,CAAC,EAAE,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,GACpC,OAAO,CAAC,cAAc,CAAC;IAE1B;;OAEG;IACH,SAAS,CAAC,GAAG,CACX,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,EAC7C,IAAI,EAAE,OAAO,GACZ,IAAI;IAMP;;;;;OAKG;IACH,SAAS,CAAC,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC;CAgBjD"}
1
+ {"version":3,"file":"BaseTool.d.ts","sourceRoot":"","sources":["../../../src/tools/BaseTool.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACf,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACf,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AACxF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAGtC,8BAAsB,QAAQ,CAC5B,WAAW,SAAS,UAAU,EAC9B,YAAY,SAAS,UAAU,GAAG,UAAU;IAE5C,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;IAE/C,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;IACrC,QAAQ,CAAC,IAAI,CAAC,EAAE;QACd,EAAE,CAAC,EAAE;YACH,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,GAAG,CAAC,EAAE;gBACJ,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;gBAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;gBAC3B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;aACzB,CAAC;SACH,CAAC;KACH,CAAC;IACF,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAQ;gBAE9B,MAAM,EAAE;QAClB,WAAW,EAAE,WAAW,CAAC;QACzB,YAAY,CAAC,EAAE,YAAY,CAAC;KAC7B;IAKD;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,cAAc;IAiD5C;;OAEG;IACH,QAAQ,CAAC,GAAG,CACV,QAAQ,EAAE,OAAO,EAEjB,KAAK,CAAC,EAAE,mBAAmB,CAAC,GAAG,EAAE,GAAG,CAAC,GACpC,OAAO,CAAC,cAAc,CAAC;IAE1B;;OAEG;IACH,SAAS,CAAC,GAAG,CACX,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,EAC7C,IAAI,EAAE,OAAO,GACZ,IAAI;IAMP;;;;;OAKG;IACH,SAAS,CAAC,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC;CAgBjD"}
@@ -3,6 +3,7 @@
3
3
  export class BaseTool {
4
4
  inputSchema;
5
5
  outputSchema;
6
+ meta;
6
7
  server = null;
7
8
  constructor(params) {
8
9
  this.inputSchema = params.inputSchema;
@@ -20,11 +21,15 @@ export class BaseTool {
20
21
  inputSchema: this.inputSchema.shape,
21
22
  annotations: this.annotations
22
23
  };
23
- // Add outputSchema if provided
24
+ // Add outputSchema if provided — pass the full Zod schema (not just .shape)
25
+ // so that .passthrough() and other schema-level settings are preserved when
26
+ // the MCP SDK converts it for structured-content validation.
24
27
  if (this.outputSchema) {
25
- config.outputSchema =
26
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
27
- this.outputSchema.shape;
28
+ config.outputSchema = this.outputSchema;
29
+ }
30
+ // Add _meta for MCP Apps support if provided (includes CSP configuration)
31
+ if (this.meta) {
32
+ config._meta = this.meta;
28
33
  }
29
34
  return server.registerTool(this.name, config,
30
35
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -1 +1 @@
1
- {"version":3,"file":"BaseTool.js","sourceRoot":"","sources":["../../../src/tools/BaseTool.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,kCAAkC;AAclC,MAAM,OAAgB,QAAQ;IAQnB,WAAW,CAAc;IACzB,YAAY,CAAgB;IAC3B,MAAM,GAAqB,IAAI,CAAC;IAE1C,YAAY,MAGX;QACC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,MAAiB;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,MAAM,MAAM,GAQR;YACF,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK;YAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,8DAA8D;YAC9D,WAAW,EAAG,IAAI,CAAC,WAA2C,CAAC,KAAK;YACpE,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC;QAEF,+BAA+B;QAC/B,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,CAAC,YAAY;gBACjB,8DAA8D;gBAC7D,IAAI,CAAC,YAA4C,CAAC,KAAK,CAAC;QAC7D,CAAC;QAED,OAAO,MAAM,CAAC,YAAY,CACxB,IAAI,CAAC,IAAI,EACT,MAAM;QACN,8DAA8D;QAC9D,CAAC,IAAS,EAAE,KAAU,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CACjD,CAAC;IACJ,CAAC;IAWD;;OAEG;IACO,GAAG,CACX,KAA6C,EAC7C,IAAa;QAEb,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;YACxB,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACO,cAAc,CAAI,OAAgB;QAC1C,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,OAAO,OAAY,CAAC;QACtB,CAAC;QAED,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;QAC/C,CAAC;QAAC,OAAO,eAAe,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,CACN,SAAS,EACT,GAAG,IAAI,CAAC,IAAI,sCAAsC,eAAe,YAAY,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,EAAE,CAC5I,CAAC;YACF,gCAAgC;YAChC,OAAO,OAAY,CAAC;QACtB,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"BaseTool.js","sourceRoot":"","sources":["../../../src/tools/BaseTool.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,kCAAkC;AAclC,MAAM,OAAgB,QAAQ;IAQnB,WAAW,CAAc;IACzB,YAAY,CAAgB;IAC5B,IAAI,CASX;IACQ,MAAM,GAAqB,IAAI,CAAC;IAE1C,YAAY,MAGX;QACC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACtC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,MAAiB;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,MAAM,MAAM,GAkBR;YACF,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK;YAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,8DAA8D;YAC9D,WAAW,EAAG,IAAI,CAAC,WAA2C,CAAC,KAAK;YACpE,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC;QAEF,4EAA4E;QAC5E,4EAA4E;QAC5E,6DAA6D;QAC7D,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QAC1C,CAAC;QAED,0EAA0E;QAC1E,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;QAC3B,CAAC;QAED,OAAO,MAAM,CAAC,YAAY,CACxB,IAAI,CAAC,IAAI,EACT,MAAM;QACN,8DAA8D;QAC9D,CAAC,IAAS,EAAE,KAAU,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CACjD,CAAC;IACJ,CAAC;IAWD;;OAEG;IACO,GAAG,CACX,KAA6C,EAC7C,IAAa;QAEb,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;YACxB,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACO,cAAc,CAAI,OAAgB;QAC1C,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,OAAO,OAAY,CAAC;QACtB,CAAC;QAED,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;QAC/C,CAAC;QAAC,OAAO,eAAe,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,CACN,SAAS,EACT,GAAG,IAAI,CAAC,IAAI,sCAAsC,eAAe,YAAY,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B,EAAE,CAC5I,CAAC;YACF,gCAAgC;YAChC,OAAO,OAAY,CAAC;QACtB,CAAC;IACH,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"CategorySearchTool.d.ts","sourceRoot":"","sources":["../../../../src/tools/category-search-tool/CategorySearchTool.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AAQrF,qBAAa,kBAAmB,SAAQ,kBAAkB,CACxD,OAAO,yBAAyB,EAChC,OAAO,4BAA4B,CACpC;IACC,IAAI,SAA0B;IAC9B,WAAW,SACoX;IAC/X,WAAW;;;;;;MAMT;gBAEU,MAAM,EAAE;QAAE,WAAW,EAAE,WAAW,CAAA;KAAE;IAQhD,OAAO,CAAC,mBAAmB;cAwDX,OAAO,CACrB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,EAChD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,cAAc,CAAC;CA8F3B"}
1
+ {"version":3,"file":"CategorySearchTool.d.ts","sourceRoot":"","sources":["../../../../src/tools/category-search-tool/CategorySearchTool.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AAQrF,qBAAa,kBAAmB,SAAQ,kBAAkB,CACxD,OAAO,yBAAyB,EAChC,OAAO,4BAA4B,CACpC;IACC,IAAI,SAA0B;IAC9B,WAAW,SACoX;IAC/X,WAAW;;;;;;MAMT;gBAEU,MAAM,EAAE;QAAE,WAAW,EAAE,WAAW,CAAA;KAAE;IAQhD,OAAO,CAAC,mBAAmB;cA6DX,OAAO,CACrB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,EAChD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,cAAc,CAAC;CA8F3B"}