@mapbox/mcp-server 0.15.0 → 0.16.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 (131) hide show
  1. package/dist/commonjs/resources/place-photo/PlacePhotoResource.d.ts +57 -0
  2. package/dist/commonjs/resources/place-photo/PlacePhotoResource.d.ts.map +1 -0
  3. package/dist/commonjs/resources/place-photo/PlacePhotoResource.js +202 -0
  4. package/dist/commonjs/resources/place-photo/PlacePhotoResource.js.map +1 -0
  5. package/dist/commonjs/resources/resourceRegistry.d.ts +3 -1
  6. package/dist/commonjs/resources/resourceRegistry.d.ts.map +1 -1
  7. package/dist/commonjs/resources/resourceRegistry.js +5 -0
  8. package/dist/commonjs/resources/resourceRegistry.js.map +1 -1
  9. package/dist/commonjs/resources/tool-response/ToolResponseResource.d.ts +20 -0
  10. package/dist/commonjs/resources/tool-response/ToolResponseResource.d.ts.map +1 -0
  11. package/dist/commonjs/resources/tool-response/ToolResponseResource.js +83 -0
  12. package/dist/commonjs/resources/tool-response/ToolResponseResource.js.map +1 -0
  13. package/dist/commonjs/resources/ui-apps/mapAppHtml.d.ts.map +1 -1
  14. package/dist/commonjs/resources/ui-apps/mapAppHtml.js +484 -11
  15. package/dist/commonjs/resources/ui-apps/mapAppHtml.js.map +1 -1
  16. package/dist/commonjs/tools/category-list-tool/CategoryListTool.d.ts.map +1 -1
  17. package/dist/commonjs/tools/category-list-tool/CategoryListTool.input.schema.js +1 -1
  18. package/dist/commonjs/tools/category-list-tool/CategoryListTool.input.schema.js.map +1 -1
  19. package/dist/commonjs/tools/category-list-tool/CategoryListTool.js +1 -1
  20. package/dist/commonjs/tools/category-list-tool/CategoryListTool.js.map +1 -1
  21. package/dist/commonjs/tools/directions-tool/DirectionsTool.d.ts.map +1 -1
  22. package/dist/commonjs/tools/directions-tool/DirectionsTool.input.schema.js +3 -3
  23. package/dist/commonjs/tools/directions-tool/DirectionsTool.input.schema.js.map +1 -1
  24. package/dist/commonjs/tools/directions-tool/DirectionsTool.js +17 -17
  25. package/dist/commonjs/tools/directions-tool/DirectionsTool.js.map +1 -1
  26. package/dist/commonjs/tools/ground-location-tool/GroundLocationTool.d.ts.map +1 -1
  27. package/dist/commonjs/tools/ground-location-tool/GroundLocationTool.js +1 -1
  28. package/dist/commonjs/tools/ground-location-tool/GroundLocationTool.js.map +1 -1
  29. package/dist/commonjs/tools/isochrone-tool/IsochroneTool.d.ts.map +1 -1
  30. package/dist/commonjs/tools/isochrone-tool/IsochroneTool.js +6 -13
  31. package/dist/commonjs/tools/isochrone-tool/IsochroneTool.js.map +1 -1
  32. package/dist/commonjs/tools/render-map-tool/RenderMapTool.d.ts.map +1 -1
  33. package/dist/commonjs/tools/render-map-tool/RenderMapTool.input.schema.d.ts +4 -0
  34. package/dist/commonjs/tools/render-map-tool/RenderMapTool.input.schema.d.ts.map +1 -1
  35. package/dist/commonjs/tools/render-map-tool/RenderMapTool.input.schema.js +18 -2
  36. package/dist/commonjs/tools/render-map-tool/RenderMapTool.input.schema.js.map +1 -1
  37. package/dist/commonjs/tools/render-map-tool/RenderMapTool.js +9 -5
  38. package/dist/commonjs/tools/render-map-tool/RenderMapTool.js.map +1 -1
  39. package/dist/commonjs/tools/render-map-tool/RenderMapTool.output.schema.d.ts +4 -0
  40. package/dist/commonjs/tools/render-map-tool/RenderMapTool.output.schema.d.ts.map +1 -1
  41. package/dist/commonjs/utils/directionsRef.d.ts +27 -0
  42. package/dist/commonjs/utils/directionsRef.d.ts.map +1 -0
  43. package/dist/commonjs/utils/directionsRef.js +52 -0
  44. package/dist/commonjs/utils/directionsRef.js.map +1 -0
  45. package/dist/commonjs/utils/index.d.ts +8 -0
  46. package/dist/commonjs/utils/index.d.ts.map +1 -1
  47. package/dist/commonjs/utils/index.js +23 -1
  48. package/dist/commonjs/utils/index.js.map +1 -1
  49. package/dist/commonjs/utils/mapAppPayload.d.ts +21 -0
  50. package/dist/commonjs/utils/mapAppPayload.d.ts.map +1 -1
  51. package/dist/commonjs/utils/mapAppPayload.js +5 -1
  52. package/dist/commonjs/utils/mapAppPayload.js.map +1 -1
  53. package/dist/commonjs/utils/responseRef.d.ts +33 -0
  54. package/dist/commonjs/utils/responseRef.d.ts.map +1 -0
  55. package/dist/commonjs/utils/responseRef.js +73 -0
  56. package/dist/commonjs/utils/responseRef.js.map +1 -0
  57. package/dist/commonjs/utils/serverInstructions.d.ts +2 -2
  58. package/dist/commonjs/utils/serverInstructions.js +2 -2
  59. package/dist/commonjs/utils/storeMapPayload.js +1 -1
  60. package/dist/commonjs/utils/storeMapPayload.js.map +1 -1
  61. package/dist/commonjs/utils/urlSafety.d.ts +6 -0
  62. package/dist/commonjs/utils/urlSafety.d.ts.map +1 -1
  63. package/dist/commonjs/utils/urlSafety.js +15 -4
  64. package/dist/commonjs/utils/urlSafety.js.map +1 -1
  65. package/dist/commonjs/version.json +3 -3
  66. package/dist/esm/resources/place-photo/PlacePhotoResource.d.ts +57 -0
  67. package/dist/esm/resources/place-photo/PlacePhotoResource.d.ts.map +1 -0
  68. package/dist/esm/resources/place-photo/PlacePhotoResource.js +198 -0
  69. package/dist/esm/resources/place-photo/PlacePhotoResource.js.map +1 -0
  70. package/dist/esm/resources/resourceRegistry.d.ts +3 -1
  71. package/dist/esm/resources/resourceRegistry.d.ts.map +1 -1
  72. package/dist/esm/resources/resourceRegistry.js +5 -0
  73. package/dist/esm/resources/resourceRegistry.js.map +1 -1
  74. package/dist/esm/resources/tool-response/ToolResponseResource.d.ts +20 -0
  75. package/dist/esm/resources/tool-response/ToolResponseResource.d.ts.map +1 -0
  76. package/dist/esm/resources/tool-response/ToolResponseResource.js +79 -0
  77. package/dist/esm/resources/tool-response/ToolResponseResource.js.map +1 -0
  78. package/dist/esm/resources/ui-apps/mapAppHtml.d.ts.map +1 -1
  79. package/dist/esm/resources/ui-apps/mapAppHtml.js +484 -11
  80. package/dist/esm/resources/ui-apps/mapAppHtml.js.map +1 -1
  81. package/dist/esm/tools/category-list-tool/CategoryListTool.d.ts.map +1 -1
  82. package/dist/esm/tools/category-list-tool/CategoryListTool.input.schema.js +1 -1
  83. package/dist/esm/tools/category-list-tool/CategoryListTool.input.schema.js.map +1 -1
  84. package/dist/esm/tools/category-list-tool/CategoryListTool.js +1 -1
  85. package/dist/esm/tools/category-list-tool/CategoryListTool.js.map +1 -1
  86. package/dist/esm/tools/directions-tool/DirectionsTool.d.ts.map +1 -1
  87. package/dist/esm/tools/directions-tool/DirectionsTool.input.schema.js +3 -3
  88. package/dist/esm/tools/directions-tool/DirectionsTool.input.schema.js.map +1 -1
  89. package/dist/esm/tools/directions-tool/DirectionsTool.js +17 -17
  90. package/dist/esm/tools/directions-tool/DirectionsTool.js.map +1 -1
  91. package/dist/esm/tools/ground-location-tool/GroundLocationTool.d.ts.map +1 -1
  92. package/dist/esm/tools/ground-location-tool/GroundLocationTool.js +1 -1
  93. package/dist/esm/tools/ground-location-tool/GroundLocationTool.js.map +1 -1
  94. package/dist/esm/tools/isochrone-tool/IsochroneTool.d.ts.map +1 -1
  95. package/dist/esm/tools/isochrone-tool/IsochroneTool.js +6 -13
  96. package/dist/esm/tools/isochrone-tool/IsochroneTool.js.map +1 -1
  97. package/dist/esm/tools/render-map-tool/RenderMapTool.d.ts.map +1 -1
  98. package/dist/esm/tools/render-map-tool/RenderMapTool.input.schema.d.ts +4 -0
  99. package/dist/esm/tools/render-map-tool/RenderMapTool.input.schema.d.ts.map +1 -1
  100. package/dist/esm/tools/render-map-tool/RenderMapTool.input.schema.js +18 -2
  101. package/dist/esm/tools/render-map-tool/RenderMapTool.input.schema.js.map +1 -1
  102. package/dist/esm/tools/render-map-tool/RenderMapTool.js +9 -5
  103. package/dist/esm/tools/render-map-tool/RenderMapTool.js.map +1 -1
  104. package/dist/esm/tools/render-map-tool/RenderMapTool.output.schema.d.ts +4 -0
  105. package/dist/esm/tools/render-map-tool/RenderMapTool.output.schema.d.ts.map +1 -1
  106. package/dist/esm/utils/directionsRef.d.ts +27 -0
  107. package/dist/esm/utils/directionsRef.d.ts.map +1 -0
  108. package/dist/esm/utils/directionsRef.js +49 -0
  109. package/dist/esm/utils/directionsRef.js.map +1 -0
  110. package/dist/esm/utils/index.d.ts +8 -0
  111. package/dist/esm/utils/index.d.ts.map +1 -1
  112. package/dist/esm/utils/index.js +15 -0
  113. package/dist/esm/utils/index.js.map +1 -1
  114. package/dist/esm/utils/mapAppPayload.d.ts +21 -0
  115. package/dist/esm/utils/mapAppPayload.d.ts.map +1 -1
  116. package/dist/esm/utils/mapAppPayload.js +5 -1
  117. package/dist/esm/utils/mapAppPayload.js.map +1 -1
  118. package/dist/esm/utils/responseRef.d.ts +33 -0
  119. package/dist/esm/utils/responseRef.d.ts.map +1 -0
  120. package/dist/esm/utils/responseRef.js +68 -0
  121. package/dist/esm/utils/responseRef.js.map +1 -0
  122. package/dist/esm/utils/serverInstructions.d.ts +2 -2
  123. package/dist/esm/utils/serverInstructions.js +2 -2
  124. package/dist/esm/utils/storeMapPayload.js +1 -1
  125. package/dist/esm/utils/storeMapPayload.js.map +1 -1
  126. package/dist/esm/utils/urlSafety.d.ts +6 -0
  127. package/dist/esm/utils/urlSafety.d.ts.map +1 -1
  128. package/dist/esm/utils/urlSafety.js +14 -4
  129. package/dist/esm/utils/urlSafety.js.map +1 -1
  130. package/dist/esm/version.json +3 -3
  131. package/package.json +9 -2
@@ -0,0 +1,57 @@
1
+ import type { ReadResourceResult } from '@modelcontextprotocol/sdk/types.js';
2
+ import { MapboxApiBasedResource } from '../MapboxApiBasedResource.js';
3
+ import type { HttpRequest } from '../../utils/types.js';
4
+ /**
5
+ * Largest photo the resource returns; bigger ones are treated as missing.
6
+ * Place Details photos are full-size originals: Union Square's ran 100 to
7
+ * 600 KB, so a smaller cap would drop most of them.
8
+ */
9
+ export declare const MAX_PLACE_PHOTO_BYTES: number;
10
+ /**
11
+ * The cache is shared by everyone using the server process, so it's capped
12
+ * by size (base64, as stored) as well as by entries.
13
+ */
14
+ export declare const MAX_PLACE_PHOTO_CACHE_BYTES: number;
15
+ /** Resolves a hostname to every address it points at. */
16
+ export type LookupHost = (hostname: string) => Promise<string[]>;
17
+ /**
18
+ * A POI's first Place Details photo, proxied through the server for the map
19
+ * app's results panel.
20
+ *
21
+ * Place Details photos are hosted wherever the business's own site hosts
22
+ * them (Yext, Webflow and so on), so the map app's CSP can't list their
23
+ * hosts, and allowing any https: host would also allow scripts from
24
+ * anywhere. Instead the page reads this resource through the host
25
+ * (`resources/read`) and shows the image as a `data:` URL.
26
+ *
27
+ * The URI carries only a mapbox_id, never a URL: the server looks the place
28
+ * up itself and fetches the photo URL Place Details returns, so the page
29
+ * can't point the server at arbitrary hosts.
30
+ */
31
+ export declare class PlacePhotoResource extends MapboxApiBasedResource {
32
+ readonly uri = "mapbox://place-photo/{id}";
33
+ readonly name = "Mapbox Place Photo";
34
+ readonly description: string;
35
+ readonly mimeType = "image/jpeg";
36
+ private readonly cache;
37
+ private cacheBytes;
38
+ private readonly lookupHost;
39
+ constructor(params: {
40
+ httpRequest: HttpRequest;
41
+ lookupHost?: LookupHost;
42
+ });
43
+ protected execute(uri: string, accessToken: string): Promise<ReadResourceResult>;
44
+ private getPhoto;
45
+ private evict;
46
+ private fetchPhoto;
47
+ /**
48
+ * https on the default port, a public DNS name (not an IP literal or a
49
+ * local name), and every address it resolves to public, so a bad photo
50
+ * URL in the data can't make the server request something on its own
51
+ * network. The fetch resolves the name again, so a host that changes its
52
+ * answer in between can still get through; the request can't be read
53
+ * back either way (no redirects, image types only).
54
+ */
55
+ private isPublicPhotoUrl;
56
+ }
57
+ //# sourceMappingURL=PlacePhotoResource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlacePhotoResource.d.ts","sourceRoot":"","sources":["../../../../src/resources/place-photo/PlacePhotoResource.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAQxD;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,QAAc,CAAC;AAEjD;;;GAGG;AACH,eAAO,MAAM,2BAA2B,QAAmB,CAAC;AAoB5D,yDAAyD;AACzD,MAAM,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AAKjE;;;;;;;;;;;;;GAaG;AACH,qBAAa,kBAAmB,SAAQ,sBAAsB;IAC5D,QAAQ,CAAC,GAAG,+BAAuB;IACnC,QAAQ,CAAC,IAAI,wBAAwB;IACrC,QAAQ,CAAC,WAAW,SAE4B;IAChD,QAAQ,CAAC,QAAQ,gBAAgB;IAEjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkC;IACxD,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;gBAE5B,MAAM,EAAE;QAAE,WAAW,EAAE,WAAW,CAAC;QAAC,UAAU,CAAC,EAAE,UAAU,CAAA;KAAE;cAKzD,OAAO,CACrB,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,CAAC;YAiBhB,QAAQ;IAyBtB,OAAO,CAAC,KAAK;YAOC,UAAU;IA2CxB;;;;;;;OAOG;YACW,gBAAgB;CAa/B"}
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+ // Copyright (c) Mapbox, Inc.
3
+ // Licensed under the MIT License.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.PlacePhotoResource = exports.MAX_PLACE_PHOTO_CACHE_BYTES = exports.MAX_PLACE_PHOTO_BYTES = void 0;
6
+ const promises_1 = require("node:dns/promises");
7
+ const MapboxApiBasedResource_js_1 = require("../MapboxApiBasedResource.js");
8
+ const urlSafety_js_1 = require("../../utils/urlSafety.js");
9
+ const URI_PREFIX = 'mapbox://place-photo/';
10
+ /**
11
+ * Largest photo the resource returns; bigger ones are treated as missing.
12
+ * Place Details photos are full-size originals: Union Square's ran 100 to
13
+ * 600 KB, so a smaller cap would drop most of them.
14
+ */
15
+ exports.MAX_PLACE_PHOTO_BYTES = 1024 * 1024;
16
+ /**
17
+ * The cache is shared by everyone using the server process, so it's capped
18
+ * by size (base64, as stored) as well as by entries.
19
+ */
20
+ exports.MAX_PLACE_PHOTO_CACHE_BYTES = 20 * 1024 * 1024;
21
+ const PHOTO_FETCH_TIMEOUT_MS = 5000;
22
+ const CACHE_TTL_MS = 30 * 60 * 1000;
23
+ const CACHE_MAX_ENTRIES = 200;
24
+ // Raster types an <img> or CSS background can show. SVG is left out: it's a
25
+ // document that can carry script, and thumbnails never need it.
26
+ const ALLOWED_TYPES = new Set([
27
+ 'image/jpeg',
28
+ 'image/png',
29
+ 'image/webp',
30
+ 'image/gif'
31
+ ]);
32
+ const lookupAll = async (hostname) => (await (0, promises_1.lookup)(hostname, { all: true })).map((a) => a.address);
33
+ /**
34
+ * A POI's first Place Details photo, proxied through the server for the map
35
+ * app's results panel.
36
+ *
37
+ * Place Details photos are hosted wherever the business's own site hosts
38
+ * them (Yext, Webflow and so on), so the map app's CSP can't list their
39
+ * hosts, and allowing any https: host would also allow scripts from
40
+ * anywhere. Instead the page reads this resource through the host
41
+ * (`resources/read`) and shows the image as a `data:` URL.
42
+ *
43
+ * The URI carries only a mapbox_id, never a URL: the server looks the place
44
+ * up itself and fetches the photo URL Place Details returns, so the page
45
+ * can't point the server at arbitrary hosts.
46
+ */
47
+ class PlacePhotoResource extends MapboxApiBasedResource_js_1.MapboxApiBasedResource {
48
+ uri = `${URI_PREFIX}{id}`;
49
+ name = 'Mapbox Place Photo';
50
+ description = "The first photo of a POI from Place Details, as an image, for the map app's results panel. " +
51
+ 'Read with mapbox://place-photo/{mapbox_id}.';
52
+ mimeType = 'image/jpeg';
53
+ cache = new Map();
54
+ cacheBytes = 0;
55
+ lookupHost;
56
+ constructor(params) {
57
+ super(params);
58
+ this.lookupHost = params.lookupHost ?? lookupAll;
59
+ }
60
+ async execute(uri, accessToken) {
61
+ const id = decodeURIComponent(uri.slice(URI_PREFIX.length));
62
+ if (!isPlacesApiId(id)) {
63
+ throw new Error('Not a Places API mapbox_id');
64
+ }
65
+ const photo = await this.getPhoto(id, accessToken);
66
+ if (!photo) {
67
+ return {
68
+ contents: [{ uri, mimeType: 'text/plain', text: 'No photo available' }]
69
+ };
70
+ }
71
+ return {
72
+ contents: [{ uri, mimeType: photo.mimeType, blob: photo.base64 }]
73
+ };
74
+ }
75
+ async getPhoto(id, accessToken) {
76
+ const now = Date.now();
77
+ const cached = this.cache.get(id);
78
+ if (cached && cached.expires > now)
79
+ return cached.photo;
80
+ const photo = await this.fetchPhoto(id, accessToken);
81
+ // Places are public data, so one cache serves every caller. Misses are
82
+ // cached too, so a place without a photo isn't looked up on every render.
83
+ this.evict(id);
84
+ const size = photo?.base64.length ?? 0;
85
+ while (this.cache.size > 0 &&
86
+ (this.cache.size >= CACHE_MAX_ENTRIES ||
87
+ this.cacheBytes + size > exports.MAX_PLACE_PHOTO_CACHE_BYTES)) {
88
+ this.evict(this.cache.keys().next().value);
89
+ }
90
+ this.cache.set(id, { expires: now + CACHE_TTL_MS, photo });
91
+ this.cacheBytes += size;
92
+ return photo;
93
+ }
94
+ evict(id) {
95
+ const entry = this.cache.get(id);
96
+ if (!entry)
97
+ return;
98
+ this.cacheBytes -= entry.photo?.base64.length ?? 0;
99
+ this.cache.delete(id);
100
+ }
101
+ async fetchPhoto(id, accessToken) {
102
+ const detailsUrl = new URL(`${MapboxApiBasedResource_js_1.MapboxApiBasedResource.mapboxApiEndpoint}places/v1/details/retrieve/${encodeURIComponent(id)}`);
103
+ detailsUrl.searchParams.append('access_token', accessToken);
104
+ const details = await this.httpRequest(detailsUrl.toString());
105
+ if (!details.ok)
106
+ return null;
107
+ const data = (await details.json());
108
+ const photoUrl = data.photos?.find((p) => typeof p?.url === 'string')
109
+ ?.url;
110
+ if (!photoUrl || !(await this.isPublicPhotoUrl(photoUrl)))
111
+ return null;
112
+ let response;
113
+ try {
114
+ response = await this.httpRequest(photoUrl, {
115
+ // A redirect could lead anywhere, including hosts isPublicHttpsUrl
116
+ // would have rejected, so treat it as no photo.
117
+ redirect: 'manual',
118
+ signal: AbortSignal.timeout(PHOTO_FETCH_TIMEOUT_MS)
119
+ });
120
+ }
121
+ catch {
122
+ return null;
123
+ }
124
+ if (response.status !== 200)
125
+ return null;
126
+ const mimeType = (response.headers?.get('content-type') ?? '')
127
+ .split(';')[0]
128
+ .trim()
129
+ .toLowerCase();
130
+ if (!ALLOWED_TYPES.has(mimeType))
131
+ return null;
132
+ const declared = Number(response.headers?.get('content-length'));
133
+ if (declared > exports.MAX_PLACE_PHOTO_BYTES)
134
+ return null;
135
+ const bytes = await readCapped(response, exports.MAX_PLACE_PHOTO_BYTES);
136
+ if (!bytes || bytes.length === 0)
137
+ return null;
138
+ return { mimeType, base64: bytes.toString('base64') };
139
+ }
140
+ /**
141
+ * https on the default port, a public DNS name (not an IP literal or a
142
+ * local name), and every address it resolves to public, so a bad photo
143
+ * URL in the data can't make the server request something on its own
144
+ * network. The fetch resolves the name again, so a host that changes its
145
+ * answer in between can still get through; the request can't be read
146
+ * back either way (no redirects, image types only).
147
+ */
148
+ async isPublicPhotoUrl(value) {
149
+ const url = (0, urlSafety_js_1.parseSafeExternalUrl)(value);
150
+ if (!url || url.username || url.password)
151
+ return false;
152
+ if (url.port && url.port !== '443')
153
+ return false;
154
+ const host = url.hostname;
155
+ if (host.startsWith('[') || isIpv4Literal(host))
156
+ return false;
157
+ try {
158
+ const addresses = await this.lookupHost(host);
159
+ return addresses.length > 0 && addresses.every(urlSafety_js_1.isPublicIpAddress);
160
+ }
161
+ catch {
162
+ return false;
163
+ }
164
+ }
165
+ }
166
+ exports.PlacePhotoResource = PlacePhotoResource;
167
+ function isIpv4Literal(host) {
168
+ return /^[\d.]+$/.test(host);
169
+ }
170
+ /** Reads a body, giving up (null) as soon as it passes `limit` bytes. */
171
+ async function readCapped(response, limit) {
172
+ const reader = response.body?.getReader();
173
+ if (!reader) {
174
+ const whole = Buffer.from(await response.arrayBuffer());
175
+ return whole.length > limit ? null : whole;
176
+ }
177
+ const chunks = [];
178
+ let total = 0;
179
+ for (;;) {
180
+ const { done, value } = await reader.read();
181
+ if (done)
182
+ break;
183
+ total += value.byteLength;
184
+ if (total > limit) {
185
+ await reader.cancel().catch(() => { });
186
+ return null;
187
+ }
188
+ chunks.push(value);
189
+ }
190
+ return Buffer.concat(chunks);
191
+ }
192
+ const PLACES_ID = /^urn:mbxpoi:[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
193
+ /**
194
+ * Native Places ids decode to "urn:mbxpoi:<uuid>". Others, including
195
+ * OSM-sourced ids and "urn:mbxpoi:mapbox-n<id>", 422 the API.
196
+ */
197
+ function isPlacesApiId(id) {
198
+ if (!/^[A-Za-z0-9+/_=-]{8,200}$/.test(id))
199
+ return false;
200
+ return PLACES_ID.test(Buffer.from(id, 'base64').toString('utf8'));
201
+ }
202
+ //# sourceMappingURL=PlacePhotoResource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PlacePhotoResource.js","sourceRoot":"","sources":["../../../../src/resources/place-photo/PlacePhotoResource.ts"],"names":[],"mappings":"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"}
@@ -2,9 +2,11 @@ import { CategoryListResource } from './category-list/CategoryListResource.js';
2
2
  import { TemporaryDataResource } from './temporary/TemporaryDataResource.js';
3
3
  import { ComputeResource } from './compute/ComputeResource.js';
4
4
  import { InlinePayloadResource } from './inline-payload/InlinePayloadResource.js';
5
+ import { ToolResponseResource } from './tool-response/ToolResponseResource.js';
5
6
  import { MapAppUIResource } from './ui-apps/MapAppUIResource.js';
6
7
  import { VersionResource } from './version/VersionResource.js';
7
- export declare const ALL_RESOURCES: readonly [CategoryListResource, TemporaryDataResource, ComputeResource, InlinePayloadResource, MapAppUIResource, VersionResource];
8
+ import { PlacePhotoResource } from './place-photo/PlacePhotoResource.js';
9
+ export declare const ALL_RESOURCES: readonly [CategoryListResource, TemporaryDataResource, ComputeResource, InlinePayloadResource, ToolResponseResource, MapAppUIResource, PlacePhotoResource, VersionResource];
8
10
  export type ResourceInstance = (typeof ALL_RESOURCES)[number];
9
11
  export declare function getAllResources(): readonly ResourceInstance[];
10
12
  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;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAI/D,eAAO,MAAM,aAAa,mIAShB,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,CAkB1E"}
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,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAIzE,eAAO,MAAM,aAAa,6KAYhB,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,CAkB1E"}
@@ -10,8 +10,10 @@ const CategoryListResource_js_1 = require("./category-list/CategoryListResource.
10
10
  const TemporaryDataResource_js_1 = require("./temporary/TemporaryDataResource.js");
11
11
  const ComputeResource_js_1 = require("./compute/ComputeResource.js");
12
12
  const InlinePayloadResource_js_1 = require("./inline-payload/InlinePayloadResource.js");
13
+ const ToolResponseResource_js_1 = require("./tool-response/ToolResponseResource.js");
13
14
  const MapAppUIResource_js_1 = require("./ui-apps/MapAppUIResource.js");
14
15
  const VersionResource_js_1 = require("./version/VersionResource.js");
16
+ const PlacePhotoResource_js_1 = require("./place-photo/PlacePhotoResource.js");
15
17
  const httpPipeline_js_1 = require("../utils/httpPipeline.js");
16
18
  // Central registry of all resources
17
19
  exports.ALL_RESOURCES = [
@@ -20,8 +22,11 @@ exports.ALL_RESOURCES = [
20
22
  new TemporaryDataResource_js_1.TemporaryDataResource(),
21
23
  new ComputeResource_js_1.ComputeResource(),
22
24
  new InlinePayloadResource_js_1.InlinePayloadResource(),
25
+ new ToolResponseResource_js_1.ToolResponseResource({ httpRequest: httpPipeline_js_1.httpRequest }),
23
26
  // Single shared map renderer, targeted exclusively by render_map_tool.
24
27
  new MapAppUIResource_js_1.MapAppUIResource({ httpRequest: httpPipeline_js_1.httpRequest }),
28
+ // Photos for the map app's results panel, which its CSP can't load directly.
29
+ new PlacePhotoResource_js_1.PlacePhotoResource({ httpRequest: httpPipeline_js_1.httpRequest }),
25
30
  new VersionResource_js_1.VersionResource()
26
31
  ];
27
32
  function getAllResources() {
@@ -1 +1 @@
1
- {"version":3,"file":"resourceRegistry.js","sourceRoot":"","sources":["../../../src/resources/resourceRegistry.ts"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,kCAAkC;;;AAyBlC,0CAEC;AAED,4CAkBC;AA7CD,kCAAkC;AAClC,qFAA+E;AAC/E,mFAA6E;AAC7E,qEAA+D;AAC/D,wFAAkF;AAClF,uEAAiE;AACjE,qEAA+D;AAC/D,8DAAuD;AAEvD,oCAAoC;AACvB,QAAA,aAAa,GAAG;IAC3B,oCAAoC;IACpC,IAAI,8CAAoB,CAAC,EAAE,WAAW,EAAX,6BAAW,EAAE,CAAC;IACzC,IAAI,gDAAqB,EAAE;IAC3B,IAAI,oCAAe,EAAE;IACrB,IAAI,gDAAqB,EAAE;IAC3B,uEAAuE;IACvE,IAAI,sCAAgB,CAAC,EAAE,WAAW,EAAX,6BAAW,EAAE,CAAC;IACrC,IAAI,oCAAe,EAAE;CACb,CAAC;AAIX,SAAgB,eAAe;IAC7B,OAAO,qBAAa,CAAC;AACvB,CAAC;AAED,SAAgB,gBAAgB,CAAC,GAAW;IAC1C,yBAAyB;IACzB,MAAM,UAAU,GAAG,qBAAa,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,6EAA6E;IAC7E,wEAAwE;IACxE,0EAA0E;IAC1E,iEAAiE;IACjE,OAAO,qBAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;QACrC,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,UAAU,GACd,aAAa,KAAK,CAAC,CAAC;YAClB,CAAC,CAAC,QAAQ,CAAC,GAAG;YACd,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;QAC3C,OAAO,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"resourceRegistry.js","sourceRoot":"","sources":["../../../src/resources/resourceRegistry.ts"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,kCAAkC;;;AA8BlC,0CAEC;AAED,4CAkBC;AAlDD,kCAAkC;AAClC,qFAA+E;AAC/E,mFAA6E;AAC7E,qEAA+D;AAC/D,wFAAkF;AAClF,qFAA+E;AAC/E,uEAAiE;AACjE,qEAA+D;AAC/D,+EAAyE;AACzE,8DAAuD;AAEvD,oCAAoC;AACvB,QAAA,aAAa,GAAG;IAC3B,oCAAoC;IACpC,IAAI,8CAAoB,CAAC,EAAE,WAAW,EAAX,6BAAW,EAAE,CAAC;IACzC,IAAI,gDAAqB,EAAE;IAC3B,IAAI,oCAAe,EAAE;IACrB,IAAI,gDAAqB,EAAE;IAC3B,IAAI,8CAAoB,CAAC,EAAE,WAAW,EAAX,6BAAW,EAAE,CAAC;IACzC,uEAAuE;IACvE,IAAI,sCAAgB,CAAC,EAAE,WAAW,EAAX,6BAAW,EAAE,CAAC;IACrC,6EAA6E;IAC7E,IAAI,0CAAkB,CAAC,EAAE,WAAW,EAAX,6BAAW,EAAE,CAAC;IACvC,IAAI,oCAAe,EAAE;CACb,CAAC;AAIX,SAAgB,eAAe;IAC7B,OAAO,qBAAa,CAAC;AACvB,CAAC;AAED,SAAgB,gBAAgB,CAAC,GAAW;IAC1C,yBAAyB;IACzB,MAAM,UAAU,GAAG,qBAAa,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,6EAA6E;IAC7E,wEAAwE;IACxE,0EAA0E;IAC1E,iEAAiE;IACjE,OAAO,qBAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;QACrC,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,UAAU,GACd,aAAa,KAAK,CAAC,CAAC;YAClB,CAAC,CAAC,QAAQ,CAAC,GAAG;YACd,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;QAC3C,OAAO,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { ReadResourceResult } from '@modelcontextprotocol/sdk/types.js';
2
+ import { MapboxApiBasedResource } from '../MapboxApiBasedResource.js';
3
+ import type { HttpRequest } from '../../utils/types.js';
4
+ /**
5
+ * Full `directions_tool` / `isochrone_tool` responses that were too large
6
+ * to return inline. The `mapbox://response/{tool}?data=...` ref carries the
7
+ * call's inputs (see responseRef.ts), and reading it runs the same request
8
+ * again with the reader's token, so any server process can answer it.
9
+ */
10
+ export declare class ToolResponseResource extends MapboxApiBasedResource {
11
+ readonly name = "Full Tool Response";
12
+ readonly uri = "mapbox://response/{spec}";
13
+ readonly description = "The full response of a directions_tool or isochrone_tool call that was too large to return inline, fetched again from its ref.";
14
+ readonly mimeType = "application/json";
15
+ constructor(params: {
16
+ httpRequest: HttpRequest;
17
+ });
18
+ protected execute(uri: string, accessToken: string): Promise<ReadResourceResult>;
19
+ }
20
+ //# sourceMappingURL=ToolResponseResource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolResponseResource.d.ts","sourceRoot":"","sources":["../../../../src/resources/tool-response/ToolResponseResource.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AASxD;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,sBAAsB;IAC9D,QAAQ,CAAC,IAAI,wBAAwB;IACrC,QAAQ,CAAC,GAAG,8BAA8B;IAC1C,QAAQ,CAAC,WAAW,oIAC+G;IACnI,QAAQ,CAAC,QAAQ,sBAAsB;gBAE3B,MAAM,EAAE;QAAE,WAAW,EAAE,WAAW,CAAA;KAAE;cAIhC,OAAO,CACrB,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,CAAC;CAgE/B"}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ // Copyright (c) Mapbox, Inc.
3
+ // Licensed under the MIT License.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.ToolResponseResource = void 0;
6
+ const MapboxApiBasedResource_js_1 = require("../MapboxApiBasedResource.js");
7
+ const responseRef_js_1 = require("../../utils/responseRef.js");
8
+ const DirectionsTool_input_schema_js_1 = require("../../tools/directions-tool/DirectionsTool.input.schema.js");
9
+ const buildDirectionsRequestUrl_js_1 = require("../../tools/directions-tool/buildDirectionsRequestUrl.js");
10
+ const cleanResponseData_js_1 = require("../../tools/directions-tool/cleanResponseData.js");
11
+ const IsochroneTool_input_schema_js_1 = require("../../tools/isochrone-tool/IsochroneTool.input.schema.js");
12
+ const buildIsochroneRequestUrl_js_1 = require("../../tools/isochrone-tool/buildIsochroneRequestUrl.js");
13
+ /**
14
+ * Full `directions_tool` / `isochrone_tool` responses that were too large
15
+ * to return inline. The `mapbox://response/{tool}?data=...` ref carries the
16
+ * call's inputs (see responseRef.ts), and reading it runs the same request
17
+ * again with the reader's token, so any server process can answer it.
18
+ */
19
+ class ToolResponseResource extends MapboxApiBasedResource_js_1.MapboxApiBasedResource {
20
+ name = 'Full Tool Response';
21
+ uri = 'mapbox://response/{spec}';
22
+ description = 'The full response of a directions_tool or isochrone_tool call that was too large to return inline, fetched again from its ref.';
23
+ mimeType = 'application/json';
24
+ constructor(params) {
25
+ super(params);
26
+ }
27
+ async execute(uri, accessToken) {
28
+ const spec = (0, responseRef_js_1.resolveResponseRef)(uri);
29
+ const apiEndpoint = MapboxApiBasedResource_js_1.MapboxApiBasedResource.mapboxApiEndpoint;
30
+ let url = null;
31
+ let directionsInput = null;
32
+ if (spec?.tool === 'directions') {
33
+ const parsed = DirectionsTool_input_schema_js_1.DirectionsInputSchema.safeParse(spec.input);
34
+ if (parsed.success) {
35
+ directionsInput = parsed.data;
36
+ url = (0, buildDirectionsRequestUrl_js_1.buildDirectionsRequestUrl)({
37
+ input: parsed.data,
38
+ accessToken,
39
+ apiEndpoint
40
+ });
41
+ }
42
+ }
43
+ else if (spec?.tool === 'isochrone') {
44
+ const parsed = IsochroneTool_input_schema_js_1.IsochroneInputSchema.safeParse(spec.input);
45
+ if (parsed.success &&
46
+ (parsed.data.contours_minutes || parsed.data.contours_meters)) {
47
+ url = (0, buildIsochroneRequestUrl_js_1.buildIsochroneRequestUrl)({
48
+ input: parsed.data,
49
+ accessToken,
50
+ apiEndpoint
51
+ });
52
+ }
53
+ }
54
+ if (!url) {
55
+ return text(uri, 'Response ref was malformed or unsupported.');
56
+ }
57
+ const response = await this.httpRequest(url);
58
+ if (!response.ok) {
59
+ return text(uri, `Fetching the full response failed: ${response.status} ${response.statusText}`);
60
+ }
61
+ let data = await response.json();
62
+ if (directionsInput) {
63
+ // The same cast DirectionsTool makes on its own response.
64
+ let cleaned = (0, cleanResponseData_js_1.cleanResponseData)(directionsInput, data);
65
+ // Same route the user picked when the original call was made.
66
+ const index = spec?.selectedRouteIndex;
67
+ if (index !== undefined && cleaned.routes?.[index]) {
68
+ cleaned = { ...cleaned, routes: [cleaned.routes[index]] };
69
+ }
70
+ data = cleaned;
71
+ }
72
+ return {
73
+ contents: [
74
+ { uri, mimeType: this.mimeType, text: JSON.stringify(data, null, 2) }
75
+ ]
76
+ };
77
+ }
78
+ }
79
+ exports.ToolResponseResource = ToolResponseResource;
80
+ function text(uri, message) {
81
+ return { contents: [{ uri, mimeType: 'text/plain', text: message }] };
82
+ }
83
+ //# sourceMappingURL=ToolResponseResource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolResponseResource.js","sourceRoot":"","sources":["../../../../src/resources/tool-response/ToolResponseResource.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"mapAppHtml.d.ts","sourceRoot":"","sources":["../../../../src/resources/ui-apps/mapAppHtml.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE;;;;;;;;;GASG;AAMH,eAAO,MAAM,iBAAiB,WAAW,CAAC;AAE1C,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,aAAa,CAAC;CAC7B,GAAG,MAAM,CA2oDT"}
1
+ {"version":3,"file":"mapAppHtml.d.ts","sourceRoot":"","sources":["../../../../src/resources/ui-apps/mapAppHtml.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE;;;;;;;;;GASG;AAMH,eAAO,MAAM,iBAAiB,WAAW,CAAC;AAE1C,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,aAAa,CAAC;CAC7B,GAAG,MAAM,CAomET"}