@mapbox/mcp-server 0.13.0 → 0.15.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.
- package/README.md +111 -14
- package/dist/commonjs/cli.d.ts.map +1 -1
- package/dist/commonjs/cli.js +5 -2
- package/dist/commonjs/cli.js.map +1 -1
- package/dist/commonjs/index.js +38 -1
- package/dist/commonjs/index.js.map +1 -1
- package/dist/commonjs/resources/BaseResource.d.ts +18 -0
- package/dist/commonjs/resources/BaseResource.d.ts.map +1 -1
- package/dist/commonjs/resources/BaseResource.js +26 -4
- package/dist/commonjs/resources/BaseResource.js.map +1 -1
- package/dist/commonjs/resources/resourceRegistry.d.ts +1 -2
- package/dist/commonjs/resources/resourceRegistry.d.ts.map +1 -1
- package/dist/commonjs/resources/resourceRegistry.js +0 -2
- package/dist/commonjs/resources/resourceRegistry.js.map +1 -1
- package/dist/commonjs/resources/temporary/TemporaryDataResource.d.ts.map +1 -1
- package/dist/commonjs/resources/temporary/TemporaryDataResource.js +20 -10
- package/dist/commonjs/resources/temporary/TemporaryDataResource.js.map +1 -1
- package/dist/commonjs/resources/ui-apps/MapAppUIResource.d.ts.map +1 -1
- package/dist/commonjs/resources/ui-apps/MapAppUIResource.js +2 -8
- package/dist/commonjs/resources/ui-apps/MapAppUIResource.js.map +1 -1
- package/dist/commonjs/resources/ui-apps/mapAppCsp.d.ts +22 -0
- package/dist/commonjs/resources/ui-apps/mapAppCsp.d.ts.map +1 -0
- package/dist/commonjs/resources/ui-apps/mapAppCsp.js +39 -0
- package/dist/commonjs/resources/ui-apps/mapAppCsp.js.map +1 -0
- package/dist/commonjs/resources/ui-apps/mapAppHtml.d.ts +3 -3
- package/dist/commonjs/resources/ui-apps/mapAppHtml.d.ts.map +1 -1
- package/dist/commonjs/resources/ui-apps/mapAppHtml.js +89 -13
- package/dist/commonjs/resources/ui-apps/mapAppHtml.js.map +1 -1
- package/dist/commonjs/tools/BaseTool.d.ts +19 -0
- package/dist/commonjs/tools/BaseTool.d.ts.map +1 -1
- package/dist/commonjs/tools/BaseTool.js +25 -3
- package/dist/commonjs/tools/BaseTool.js.map +1 -1
- package/dist/commonjs/tools/directions-tool/DirectionsTool.d.ts +16 -0
- package/dist/commonjs/tools/directions-tool/DirectionsTool.d.ts.map +1 -1
- package/dist/commonjs/tools/directions-tool/DirectionsTool.js +107 -2
- package/dist/commonjs/tools/directions-tool/DirectionsTool.js.map +1 -1
- package/dist/commonjs/tools/ground-location-tool/GroundLocationTool.d.ts.map +1 -1
- package/dist/commonjs/tools/ground-location-tool/GroundLocationTool.js +7 -4
- package/dist/commonjs/tools/ground-location-tool/GroundLocationTool.js.map +1 -1
- package/dist/commonjs/tools/ground-location-tool/GroundLocationTool.output.schema.d.ts +4 -0
- package/dist/commonjs/tools/ground-location-tool/GroundLocationTool.output.schema.d.ts.map +1 -1
- package/dist/commonjs/tools/ground-location-tool/GroundLocationTool.output.schema.js +9 -1
- package/dist/commonjs/tools/ground-location-tool/GroundLocationTool.output.schema.js.map +1 -1
- package/dist/commonjs/tools/isochrone-tool/IsochroneTool.js +1 -1
- package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.d.ts +11 -1
- package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.d.ts.map +1 -1
- package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.input.schema.js +3 -3
- package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.input.schema.js.map +1 -1
- package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.js +134 -139
- package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.js.map +1 -1
- package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.output.schema.d.ts +71 -10
- package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.output.schema.d.ts.map +1 -1
- package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.output.schema.js +86 -10
- package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.output.schema.js.map +1 -1
- package/dist/commonjs/tools/render-map-tool/RenderMapTool.d.ts +2 -4
- package/dist/commonjs/tools/render-map-tool/RenderMapTool.d.ts.map +1 -1
- package/dist/commonjs/tools/render-map-tool/RenderMapTool.input.schema.d.ts +50 -0
- package/dist/commonjs/tools/render-map-tool/RenderMapTool.input.schema.d.ts.map +1 -1
- package/dist/commonjs/tools/render-map-tool/RenderMapTool.input.schema.js +51 -2
- package/dist/commonjs/tools/render-map-tool/RenderMapTool.input.schema.js.map +1 -1
- package/dist/commonjs/tools/render-map-tool/RenderMapTool.js +50 -18
- package/dist/commonjs/tools/render-map-tool/RenderMapTool.js.map +1 -1
- package/dist/commonjs/tools/render-map-tool/RenderMapTool.output.schema.d.ts +50 -0
- package/dist/commonjs/tools/render-map-tool/RenderMapTool.output.schema.d.ts.map +1 -1
- package/dist/commonjs/tools/search-and-geocode-tool/SearchAndGeocodeTool.d.ts.map +1 -1
- package/dist/commonjs/tools/search-and-geocode-tool/SearchAndGeocodeTool.input.schema.d.ts.map +1 -1
- package/dist/commonjs/tools/search-and-geocode-tool/SearchAndGeocodeTool.input.schema.js +2 -2
- package/dist/commonjs/tools/search-and-geocode-tool/SearchAndGeocodeTool.input.schema.js.map +1 -1
- package/dist/commonjs/tools/search-and-geocode-tool/SearchAndGeocodeTool.js +6 -3
- package/dist/commonjs/tools/search-and-geocode-tool/SearchAndGeocodeTool.js.map +1 -1
- package/dist/commonjs/tools/static-map-image-tool/StaticMapImageTool.d.ts.map +1 -1
- package/dist/commonjs/tools/static-map-image-tool/StaticMapImageTool.input.schema.d.ts +3 -3
- package/dist/commonjs/tools/static-map-image-tool/StaticMapImageTool.input.schema.d.ts.map +1 -1
- package/dist/commonjs/tools/static-map-image-tool/StaticMapImageTool.input.schema.js +16 -2
- package/dist/commonjs/tools/static-map-image-tool/StaticMapImageTool.input.schema.js.map +1 -1
- package/dist/commonjs/tools/static-map-image-tool/StaticMapImageTool.js +17 -6
- package/dist/commonjs/tools/static-map-image-tool/StaticMapImageTool.js.map +1 -1
- package/dist/commonjs/utils/index.d.ts +2 -0
- package/dist/commonjs/utils/index.d.ts.map +1 -1
- package/dist/commonjs/utils/index.js +8 -1
- package/dist/commonjs/utils/index.js.map +1 -1
- package/dist/commonjs/utils/jsonSchema2020.d.ts +26 -0
- package/dist/commonjs/utils/jsonSchema2020.d.ts.map +1 -0
- package/dist/commonjs/utils/jsonSchema2020.js +143 -0
- package/dist/commonjs/utils/jsonSchema2020.js.map +1 -0
- package/dist/commonjs/utils/jwtUtils.d.ts +48 -0
- package/dist/commonjs/utils/jwtUtils.d.ts.map +1 -1
- package/dist/commonjs/utils/jwtUtils.js +63 -0
- package/dist/commonjs/utils/jwtUtils.js.map +1 -1
- package/dist/commonjs/utils/mapAppPayload.d.ts +109 -0
- package/dist/commonjs/utils/mapAppPayload.d.ts.map +1 -1
- package/dist/commonjs/utils/mapAppPayload.js +38 -2
- package/dist/commonjs/utils/mapAppPayload.js.map +1 -1
- package/dist/commonjs/utils/redactToken.d.ts +3 -0
- package/dist/commonjs/utils/redactToken.d.ts.map +1 -0
- package/dist/commonjs/utils/redactToken.js +55 -0
- package/dist/commonjs/utils/redactToken.js.map +1 -0
- package/dist/commonjs/utils/redactingSpanExporter.d.ts +24 -0
- package/dist/commonjs/utils/redactingSpanExporter.d.ts.map +1 -0
- package/dist/commonjs/utils/redactingSpanExporter.js +97 -0
- package/dist/commonjs/utils/redactingSpanExporter.js.map +1 -0
- package/dist/commonjs/utils/selfFetchRef.d.ts.map +1 -1
- package/dist/commonjs/utils/selfFetchRef.js +31 -0
- package/dist/commonjs/utils/selfFetchRef.js.map +1 -1
- package/dist/commonjs/utils/serverInstructions.d.ts +12 -0
- package/dist/commonjs/utils/serverInstructions.d.ts.map +1 -0
- package/dist/commonjs/utils/serverInstructions.js +28 -0
- package/dist/commonjs/utils/serverInstructions.js.map +1 -0
- package/dist/commonjs/utils/storeMapPayload.d.ts +11 -11
- package/dist/commonjs/utils/storeMapPayload.d.ts.map +1 -1
- package/dist/commonjs/utils/storeMapPayload.js +14 -13
- package/dist/commonjs/utils/storeMapPayload.js.map +1 -1
- package/dist/commonjs/utils/temporaryResourceManager.d.ts +10 -4
- package/dist/commonjs/utils/temporaryResourceManager.d.ts.map +1 -1
- package/dist/commonjs/utils/temporaryResourceManager.js.map +1 -1
- package/dist/commonjs/utils/tracing.d.ts +4 -0
- package/dist/commonjs/utils/tracing.d.ts.map +1 -1
- package/dist/commonjs/utils/tracing.js +24 -1
- package/dist/commonjs/utils/tracing.js.map +1 -1
- package/dist/commonjs/utils/urlSafety.d.ts +23 -7
- package/dist/commonjs/utils/urlSafety.d.ts.map +1 -1
- package/dist/commonjs/utils/urlSafety.js +84 -66
- package/dist/commonjs/utils/urlSafety.js.map +1 -1
- package/dist/commonjs/version.json +3 -3
- package/dist/esm/cli.d.ts.map +1 -1
- package/dist/esm/cli.js +5 -2
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/index.js +39 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/resources/BaseResource.d.ts +18 -0
- package/dist/esm/resources/BaseResource.d.ts.map +1 -1
- package/dist/esm/resources/BaseResource.js +26 -4
- package/dist/esm/resources/BaseResource.js.map +1 -1
- package/dist/esm/resources/resourceRegistry.d.ts +1 -2
- package/dist/esm/resources/resourceRegistry.d.ts.map +1 -1
- package/dist/esm/resources/resourceRegistry.js +0 -2
- package/dist/esm/resources/resourceRegistry.js.map +1 -1
- package/dist/esm/resources/temporary/TemporaryDataResource.d.ts.map +1 -1
- package/dist/esm/resources/temporary/TemporaryDataResource.js +21 -11
- package/dist/esm/resources/temporary/TemporaryDataResource.js.map +1 -1
- package/dist/esm/resources/ui-apps/MapAppUIResource.d.ts.map +1 -1
- package/dist/esm/resources/ui-apps/MapAppUIResource.js +2 -8
- package/dist/esm/resources/ui-apps/MapAppUIResource.js.map +1 -1
- package/dist/esm/resources/ui-apps/mapAppCsp.d.ts +22 -0
- package/dist/esm/resources/ui-apps/mapAppCsp.d.ts.map +1 -0
- package/dist/esm/resources/ui-apps/mapAppCsp.js +36 -0
- package/dist/esm/resources/ui-apps/mapAppCsp.js.map +1 -0
- package/dist/esm/resources/ui-apps/mapAppHtml.d.ts +3 -3
- package/dist/esm/resources/ui-apps/mapAppHtml.d.ts.map +1 -1
- package/dist/esm/resources/ui-apps/mapAppHtml.js +89 -13
- package/dist/esm/resources/ui-apps/mapAppHtml.js.map +1 -1
- package/dist/esm/tools/BaseTool.d.ts +19 -0
- package/dist/esm/tools/BaseTool.d.ts.map +1 -1
- package/dist/esm/tools/BaseTool.js +25 -3
- package/dist/esm/tools/BaseTool.js.map +1 -1
- package/dist/esm/tools/directions-tool/DirectionsTool.d.ts +16 -0
- package/dist/esm/tools/directions-tool/DirectionsTool.d.ts.map +1 -1
- package/dist/esm/tools/directions-tool/DirectionsTool.js +108 -3
- package/dist/esm/tools/directions-tool/DirectionsTool.js.map +1 -1
- package/dist/esm/tools/ground-location-tool/GroundLocationTool.d.ts.map +1 -1
- package/dist/esm/tools/ground-location-tool/GroundLocationTool.js +7 -4
- package/dist/esm/tools/ground-location-tool/GroundLocationTool.js.map +1 -1
- package/dist/esm/tools/ground-location-tool/GroundLocationTool.output.schema.d.ts +4 -0
- package/dist/esm/tools/ground-location-tool/GroundLocationTool.output.schema.d.ts.map +1 -1
- package/dist/esm/tools/ground-location-tool/GroundLocationTool.output.schema.js +9 -1
- package/dist/esm/tools/ground-location-tool/GroundLocationTool.output.schema.js.map +1 -1
- package/dist/esm/tools/isochrone-tool/IsochroneTool.js +2 -2
- package/dist/esm/tools/place-details-tool/PlaceDetailsTool.d.ts +11 -1
- package/dist/esm/tools/place-details-tool/PlaceDetailsTool.d.ts.map +1 -1
- package/dist/esm/tools/place-details-tool/PlaceDetailsTool.input.schema.js +3 -3
- package/dist/esm/tools/place-details-tool/PlaceDetailsTool.input.schema.js.map +1 -1
- package/dist/esm/tools/place-details-tool/PlaceDetailsTool.js +135 -140
- package/dist/esm/tools/place-details-tool/PlaceDetailsTool.js.map +1 -1
- package/dist/esm/tools/place-details-tool/PlaceDetailsTool.output.schema.d.ts +71 -10
- package/dist/esm/tools/place-details-tool/PlaceDetailsTool.output.schema.d.ts.map +1 -1
- package/dist/esm/tools/place-details-tool/PlaceDetailsTool.output.schema.js +85 -9
- package/dist/esm/tools/place-details-tool/PlaceDetailsTool.output.schema.js.map +1 -1
- package/dist/esm/tools/render-map-tool/RenderMapTool.d.ts +2 -4
- package/dist/esm/tools/render-map-tool/RenderMapTool.d.ts.map +1 -1
- package/dist/esm/tools/render-map-tool/RenderMapTool.input.schema.d.ts +50 -0
- package/dist/esm/tools/render-map-tool/RenderMapTool.input.schema.d.ts.map +1 -1
- package/dist/esm/tools/render-map-tool/RenderMapTool.input.schema.js +51 -2
- package/dist/esm/tools/render-map-tool/RenderMapTool.input.schema.js.map +1 -1
- package/dist/esm/tools/render-map-tool/RenderMapTool.js +51 -19
- package/dist/esm/tools/render-map-tool/RenderMapTool.js.map +1 -1
- package/dist/esm/tools/render-map-tool/RenderMapTool.output.schema.d.ts +50 -0
- package/dist/esm/tools/render-map-tool/RenderMapTool.output.schema.d.ts.map +1 -1
- package/dist/esm/tools/search-and-geocode-tool/SearchAndGeocodeTool.d.ts.map +1 -1
- package/dist/esm/tools/search-and-geocode-tool/SearchAndGeocodeTool.input.schema.d.ts.map +1 -1
- package/dist/esm/tools/search-and-geocode-tool/SearchAndGeocodeTool.input.schema.js +2 -2
- package/dist/esm/tools/search-and-geocode-tool/SearchAndGeocodeTool.input.schema.js.map +1 -1
- package/dist/esm/tools/search-and-geocode-tool/SearchAndGeocodeTool.js +6 -3
- package/dist/esm/tools/search-and-geocode-tool/SearchAndGeocodeTool.js.map +1 -1
- package/dist/esm/tools/static-map-image-tool/StaticMapImageTool.d.ts.map +1 -1
- package/dist/esm/tools/static-map-image-tool/StaticMapImageTool.input.schema.d.ts +3 -3
- package/dist/esm/tools/static-map-image-tool/StaticMapImageTool.input.schema.d.ts.map +1 -1
- package/dist/esm/tools/static-map-image-tool/StaticMapImageTool.input.schema.js +17 -3
- package/dist/esm/tools/static-map-image-tool/StaticMapImageTool.input.schema.js.map +1 -1
- package/dist/esm/tools/static-map-image-tool/StaticMapImageTool.js +18 -7
- package/dist/esm/tools/static-map-image-tool/StaticMapImageTool.js.map +1 -1
- package/dist/esm/utils/index.d.ts +2 -0
- package/dist/esm/utils/index.d.ts.map +1 -1
- package/dist/esm/utils/index.js +5 -0
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/esm/utils/jsonSchema2020.d.ts +26 -0
- package/dist/esm/utils/jsonSchema2020.d.ts.map +1 -0
- package/dist/esm/utils/jsonSchema2020.js +138 -0
- package/dist/esm/utils/jsonSchema2020.js.map +1 -0
- package/dist/esm/utils/jwtUtils.d.ts +48 -0
- package/dist/esm/utils/jwtUtils.d.ts.map +1 -1
- package/dist/esm/utils/jwtUtils.js +61 -0
- package/dist/esm/utils/jwtUtils.js.map +1 -1
- package/dist/esm/utils/mapAppPayload.d.ts +109 -0
- package/dist/esm/utils/mapAppPayload.d.ts.map +1 -1
- package/dist/esm/utils/mapAppPayload.js +38 -2
- package/dist/esm/utils/mapAppPayload.js.map +1 -1
- package/dist/esm/utils/redactToken.d.ts +3 -0
- package/dist/esm/utils/redactToken.d.ts.map +1 -0
- package/dist/esm/utils/redactToken.js +52 -0
- package/dist/esm/utils/redactToken.js.map +1 -0
- package/dist/esm/utils/redactingSpanExporter.d.ts +24 -0
- package/dist/esm/utils/redactingSpanExporter.d.ts.map +1 -0
- package/dist/esm/utils/redactingSpanExporter.js +93 -0
- package/dist/esm/utils/redactingSpanExporter.js.map +1 -0
- package/dist/esm/utils/selfFetchRef.d.ts.map +1 -1
- package/dist/esm/utils/selfFetchRef.js +31 -0
- package/dist/esm/utils/selfFetchRef.js.map +1 -1
- package/dist/esm/utils/serverInstructions.d.ts +12 -0
- package/dist/esm/utils/serverInstructions.d.ts.map +1 -0
- package/dist/esm/utils/serverInstructions.js +25 -0
- package/dist/esm/utils/serverInstructions.js.map +1 -0
- package/dist/esm/utils/storeMapPayload.d.ts +11 -11
- package/dist/esm/utils/storeMapPayload.d.ts.map +1 -1
- package/dist/esm/utils/storeMapPayload.js +14 -13
- package/dist/esm/utils/storeMapPayload.js.map +1 -1
- package/dist/esm/utils/temporaryResourceManager.d.ts +10 -4
- package/dist/esm/utils/temporaryResourceManager.d.ts.map +1 -1
- package/dist/esm/utils/temporaryResourceManager.js.map +1 -1
- package/dist/esm/utils/tracing.d.ts +4 -0
- package/dist/esm/utils/tracing.d.ts.map +1 -1
- package/dist/esm/utils/tracing.js +23 -1
- package/dist/esm/utils/tracing.js.map +1 -1
- package/dist/esm/utils/urlSafety.d.ts +23 -7
- package/dist/esm/utils/urlSafety.d.ts.map +1 -1
- package/dist/esm/utils/urlSafety.js +80 -66
- package/dist/esm/utils/urlSafety.js.map +1 -1
- package/dist/esm/version.json +3 -3
- package/package.json +3 -2
- package/patches/{@modelcontextprotocol+sdk+1.29.0.patch → @modelcontextprotocol+sdk+1.30.0.patch} +6 -2
- package/dist/commonjs/resources/ui-apps/StaticMapUIResource.d.ts +0 -15
- package/dist/commonjs/resources/ui-apps/StaticMapUIResource.d.ts.map +0 -1
- package/dist/commonjs/resources/ui-apps/StaticMapUIResource.js +0 -262
- package/dist/commonjs/resources/ui-apps/StaticMapUIResource.js.map +0 -1
- package/dist/esm/resources/ui-apps/StaticMapUIResource.d.ts +0 -15
- package/dist/esm/resources/ui-apps/StaticMapUIResource.d.ts.map +0 -1
- package/dist/esm/resources/ui-apps/StaticMapUIResource.js +0 -258
- package/dist/esm/resources/ui-apps/StaticMapUIResource.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selfFetchRef.js","sourceRoot":"","sources":["../../../src/utils/selfFetchRef.ts"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,kCAAkC;;AA6BlC,8CAQC;
|
|
1
|
+
{"version":3,"file":"selfFetchRef.js","sourceRoot":"","sources":["../../../src/utils/selfFetchRef.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-level `instructions` returned from `initialize`.
|
|
3
|
+
*
|
|
4
|
+
* Hosts that load tools lazily (Claude Desktop, Claude Code) list only tool
|
|
5
|
+
* names until the model loads a tool, so tool descriptions can't steer
|
|
6
|
+
* which tool gets picked — e.g. a model asked to "show a map" loaded
|
|
7
|
+
* static_map_image_tool because of its name and never saw
|
|
8
|
+
* render_map_tool's "ALWAYS use this tool to display maps". Server
|
|
9
|
+
* instructions are shown up front, so the routing rule lives here.
|
|
10
|
+
*/
|
|
11
|
+
export declare function buildServerInstructions(enabledToolNames: readonly string[]): string | undefined;
|
|
12
|
+
//# sourceMappingURL=serverInstructions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serverInstructions.d.ts","sourceRoot":"","sources":["../../../src/utils/serverInstructions.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,gBAAgB,EAAE,SAAS,MAAM,EAAE,GAClC,MAAM,GAAG,SAAS,CAYpB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) Mapbox, Inc.
|
|
3
|
+
// Licensed under the MIT License.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.buildServerInstructions = buildServerInstructions;
|
|
6
|
+
/**
|
|
7
|
+
* Server-level `instructions` returned from `initialize`.
|
|
8
|
+
*
|
|
9
|
+
* Hosts that load tools lazily (Claude Desktop, Claude Code) list only tool
|
|
10
|
+
* names until the model loads a tool, so tool descriptions can't steer
|
|
11
|
+
* which tool gets picked — e.g. a model asked to "show a map" loaded
|
|
12
|
+
* static_map_image_tool because of its name and never saw
|
|
13
|
+
* render_map_tool's "ALWAYS use this tool to display maps". Server
|
|
14
|
+
* instructions are shown up front, so the routing rule lives here.
|
|
15
|
+
*/
|
|
16
|
+
function buildServerInstructions(enabledToolNames) {
|
|
17
|
+
if (!enabledToolNames.includes('render_map_tool'))
|
|
18
|
+
return undefined;
|
|
19
|
+
const lines = [
|
|
20
|
+
'To show anything on a map, use render_map_tool: it renders an interactive Mapbox GL JS map inline.',
|
|
21
|
+
'When a tool result includes mapboxRender.ref, pass that ref unchanged in render_map_tool payload_refs (several refs can share one map). Never write or edit a ref by hand.'
|
|
22
|
+
];
|
|
23
|
+
if (enabledToolNames.includes('static_map_image_tool')) {
|
|
24
|
+
lines.push('Use static_map_image_tool only when the user explicitly asks for a static image file (PNG/JPEG), never as the default way to show a map.');
|
|
25
|
+
}
|
|
26
|
+
return lines.join('\n');
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=serverInstructions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serverInstructions.js","sourceRoot":"","sources":["../../../src/utils/serverInstructions.ts"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,kCAAkC;;AAYlC,0DAcC;AAxBD;;;;;;;;;GASG;AACH,SAAgB,uBAAuB,CACrC,gBAAmC;IAEnC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAAE,OAAO,SAAS,CAAC;IACpE,MAAM,KAAK,GAAG;QACZ,oGAAoG;QACpG,4KAA4K;KAC7K,CAAC;IACF,IAAI,gBAAgB,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;QACvD,KAAK,CAAC,IAAI,CACR,0IAA0I,CAC3I,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -20,11 +20,11 @@ export type MapAppRef = z.infer<typeof MapAppRefSchema>;
|
|
|
20
20
|
* payloads (e.g. polygon-op chains). Passing a ref instead keeps the LLM's
|
|
21
21
|
* emission down to a few tokens.
|
|
22
22
|
*
|
|
23
|
-
* `owner` must be the same
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
23
|
+
* `owner` must be the same ownership key (`getOwnerKeyFromToken`) the caller
|
|
24
|
+
* resolves for its own token — `TemporaryDataResource.read()` fails closed on
|
|
25
|
+
* an unowned resource, so omitting this makes the ref permanently unreadable
|
|
26
|
+
* via the real `resources/read` path the render iframe uses (it always 404s),
|
|
27
|
+
* even though callers that read the manager directly (like
|
|
28
28
|
* `resolveMapPayloadRef`) wouldn't notice anything wrong.
|
|
29
29
|
*/
|
|
30
30
|
export declare function storeMapPayload(payload: MapAppPayload, owner?: string): string;
|
|
@@ -54,12 +54,12 @@ export declare function buildMapboxRenderField(ref: string, payload: MapAppPaylo
|
|
|
54
54
|
export declare function renderHint(ref: string): string;
|
|
55
55
|
/**
|
|
56
56
|
* Resolve a `mapbox://temp/map-payload-...` ref back to its `MapAppPayload`.
|
|
57
|
-
* Returns null if the ref is unknown, expired, or owned by a
|
|
58
|
-
*
|
|
59
|
-
* `TemporaryDataResource.read()` (a caller passing
|
|
60
|
-
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
57
|
+
* Returns null if the ref is unknown, expired, or owned by a key other than
|
|
58
|
+
* `owner` — this is the same token-scoping enforced by
|
|
59
|
+
* `TemporaryDataResource.read()` (a caller passing someone else's ref would
|
|
60
|
+
* otherwise have it silently merged and re-served under their own ref,
|
|
61
|
+
* bypassing the read-side check entirely since this goes straight to the
|
|
62
|
+
* manager rather than through `resources/read`).
|
|
63
63
|
*/
|
|
64
64
|
export declare function resolveMapPayloadRef(ref: string, owner: string | undefined): MapAppPayload | null;
|
|
65
65
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storeMapPayload.d.ts","sourceRoot":"","sources":["../../../src/utils/storeMapPayload.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"storeMapPayload.d.ts","sourceRoot":"","sources":["../../../src/utils/storeMapPayload.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAMxD,eAAO,MAAM,wBAAwB,QAAY,CAAC;AAElD;;;;;GAKG;AACH,eAAO,MAAM,eAAe;;iBAUzB,CAAC;AAEJ,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAIxD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,aAAa,EACtB,KAAK,CAAC,EAAE,MAAM,GACb,MAAM,CAcR;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,aAAa,GACrB;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAM1C;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK9C;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,aAAa,GAAG,IAAI,CAMtB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,aAAa,CA8BzE"}
|
|
@@ -11,6 +11,7 @@ exports.mergeMapPayloads = mergeMapPayloads;
|
|
|
11
11
|
const node_crypto_1 = require("node:crypto");
|
|
12
12
|
const zod_1 = require("zod");
|
|
13
13
|
const temporaryResourceManager_js_1 = require("./temporaryResourceManager.js");
|
|
14
|
+
const jwtUtils_js_1 = require("./jwtUtils.js");
|
|
14
15
|
// Above this size, only the ref is included inline (the ref+resources/read
|
|
15
16
|
// path still works for hosts that support it) - matches the 50KB threshold
|
|
16
17
|
// already used elsewhere (e.g. the directions/isochrone large-response
|
|
@@ -39,11 +40,11 @@ const TEMP_URI_PREFIX = 'mapbox://temp/map-payload-';
|
|
|
39
40
|
* payloads (e.g. polygon-op chains). Passing a ref instead keeps the LLM's
|
|
40
41
|
* emission down to a few tokens.
|
|
41
42
|
*
|
|
42
|
-
* `owner` must be the same
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
43
|
+
* `owner` must be the same ownership key (`getOwnerKeyFromToken`) the caller
|
|
44
|
+
* resolves for its own token — `TemporaryDataResource.read()` fails closed on
|
|
45
|
+
* an unowned resource, so omitting this makes the ref permanently unreadable
|
|
46
|
+
* via the real `resources/read` path the render iframe uses (it always 404s),
|
|
47
|
+
* even though callers that read the manager directly (like
|
|
47
48
|
* `resolveMapPayloadRef`) wouldn't notice anything wrong.
|
|
48
49
|
*/
|
|
49
50
|
function storeMapPayload(payload, owner) {
|
|
@@ -89,17 +90,17 @@ function buildMapboxRenderField(ref, payload) {
|
|
|
89
90
|
* URI — including the literal string in the visible text fixes that.)
|
|
90
91
|
*/
|
|
91
92
|
function renderHint(ref) {
|
|
92
|
-
return (`\n\n📍 To show this on a
|
|
93
|
+
return (`\n\n📍 To show this on a map, call render_map_tool (not static_map_image_tool) with this ref unchanged:\n` +
|
|
93
94
|
` render_map_tool({ "payload_refs": ["${ref}"] })`);
|
|
94
95
|
}
|
|
95
96
|
/**
|
|
96
97
|
* Resolve a `mapbox://temp/map-payload-...` ref back to its `MapAppPayload`.
|
|
97
|
-
* Returns null if the ref is unknown, expired, or owned by a
|
|
98
|
-
*
|
|
99
|
-
* `TemporaryDataResource.read()` (a caller passing
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
98
|
+
* Returns null if the ref is unknown, expired, or owned by a key other than
|
|
99
|
+
* `owner` — this is the same token-scoping enforced by
|
|
100
|
+
* `TemporaryDataResource.read()` (a caller passing someone else's ref would
|
|
101
|
+
* otherwise have it silently merged and re-served under their own ref,
|
|
102
|
+
* bypassing the read-side check entirely since this goes straight to the
|
|
103
|
+
* manager rather than through `resources/read`).
|
|
103
104
|
*/
|
|
104
105
|
function resolveMapPayloadRef(ref, owner) {
|
|
105
106
|
if (!ref.startsWith(TEMP_URI_PREFIX))
|
|
@@ -107,7 +108,7 @@ function resolveMapPayloadRef(ref, owner) {
|
|
|
107
108
|
const entry = temporaryResourceManager_js_1.temporaryResourceManager.get(ref);
|
|
108
109
|
if (!entry || !entry.data)
|
|
109
110
|
return null;
|
|
110
|
-
if (!
|
|
111
|
+
if (!(0, jwtUtils_js_1.ownerKeyMatches)(entry.owner, owner))
|
|
111
112
|
return null;
|
|
112
113
|
return entry.data;
|
|
113
114
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storeMapPayload.js","sourceRoot":"","sources":["../../../src/utils/storeMapPayload.ts"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,kCAAkC;;;
|
|
1
|
+
{"version":3,"file":"storeMapPayload.js","sourceRoot":"","sources":["../../../src/utils/storeMapPayload.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,10 +13,16 @@ export interface TemporaryResource {
|
|
|
13
13
|
created: number;
|
|
14
14
|
ttl: number;
|
|
15
15
|
/**
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
16
|
+
* Opaque ownership key for the token that created this resource — a SHA-256
|
|
17
|
+
* fingerprint of that token, produced by `getOwnerKeyFromToken`. Reads are
|
|
18
|
+
* restricted to a caller presenting the same token so one caller cannot read
|
|
19
|
+
* another's temporary data. Undefined means no owner could be determined, in
|
|
20
|
+
* which case reads fail closed.
|
|
21
|
+
*
|
|
22
|
+
* Deliberately NOT the Mapbox username: that comes from an unsigned, locally
|
|
23
|
+
* unverifiable `u` claim, so a username-scoped check could be defeated by
|
|
24
|
+
* fabricating a token asserting the victim's name. Never store or compare a
|
|
25
|
+
* username here.
|
|
20
26
|
*/
|
|
21
27
|
owner?: string;
|
|
22
28
|
metadata?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"temporaryResourceManager.d.ts","sourceRoot":"","sources":["../../../src/utils/temporaryResourceManager.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AAEH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ
|
|
1
|
+
{"version":3,"file":"temporaryResourceManager.d.ts","sourceRoot":"","sources":["../../../src/utils/temporaryResourceManager.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AAEH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;;;;;;;OAWG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE;QACT,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,qBAAa,wBAAwB;IAMjC,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,QAAQ;IANlB,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,eAAe,CAAC,CAAiB;IACzC,OAAO,CAAC,UAAU,CAAK;gBAGb,UAAU,GAAE,MAAuB,EAAE,aAAa;IAClD,QAAQ,GAAE,MAAyB;IAM7C;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE;QACb,EAAE,EAAE,MAAM,CAAC;QACX,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,OAAO,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACzC,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,iBAAiB;IAiCrB;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAiB/C;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAQ5B;;OAEG;IACH,OAAO,IAAI,MAAM;IAejB;;OAEG;IACH,KAAK,IAAI,MAAM;IAIf;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,OAAO,IAAI,IAAI;CAOhB;AAGD,eAAO,MAAM,wBAAwB,0BAAiC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"temporaryResourceManager.js","sourceRoot":"","sources":["../../../src/utils/temporaryResourceManager.ts"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,kCAAkC;;;
|
|
1
|
+
{"version":3,"file":"temporaryResourceManager.js","sourceRoot":"","sources":["../../../src/utils/temporaryResourceManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -59,6 +59,10 @@ export declare function isTracingInitialized(): boolean;
|
|
|
59
59
|
* Get the default tracer for the MCP server
|
|
60
60
|
*/
|
|
61
61
|
export declare function getTracer(): import("@opentelemetry/api").Tracer;
|
|
62
|
+
export declare function setClientInfo(info: {
|
|
63
|
+
name?: string;
|
|
64
|
+
version?: string;
|
|
65
|
+
} | undefined): void;
|
|
62
66
|
/**
|
|
63
67
|
* Create a span for tool execution with comprehensive attributes
|
|
64
68
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../../src/utils/tracing.ts"],"names":[],"mappings":"AAWA,OAAO,EAIL,KAAK,IAAI,EAGV,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../../src/utils/tracing.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ exports.initializeTracing = initializeTracing;
|
|
|
8
8
|
exports.shutdownTracing = shutdownTracing;
|
|
9
9
|
exports.isTracingInitialized = isTracingInitialized;
|
|
10
10
|
exports.getTracer = getTracer;
|
|
11
|
+
exports.setClientInfo = setClientInfo;
|
|
11
12
|
exports.createToolSpan = createToolSpan;
|
|
12
13
|
exports.createHttpSpan = createHttpSpan;
|
|
13
14
|
exports.markSpanSuccess = markSpanSuccess;
|
|
@@ -21,6 +22,7 @@ const semantic_conventions_1 = require("@opentelemetry/semantic-conventions");
|
|
|
21
22
|
const exporter_trace_otlp_http_1 = require("@opentelemetry/exporter-trace-otlp-http");
|
|
22
23
|
const api_1 = require("@opentelemetry/api");
|
|
23
24
|
const versionUtils_js_1 = require("./versionUtils.js");
|
|
25
|
+
const redactingSpanExporter_js_1 = require("./redactingSpanExporter.js");
|
|
24
26
|
const incubating_1 = require("@opentelemetry/semantic-conventions/incubating");
|
|
25
27
|
// Suppress OpenTelemetry diagnostic logging IMMEDIATELY to avoid polluting stdio
|
|
26
28
|
// This must happen at module load time, before any OTEL operations
|
|
@@ -142,7 +144,9 @@ async function initializeTracing() {
|
|
|
142
144
|
// Create SDK instance
|
|
143
145
|
sdk = new sdk_node_1.NodeSDK({
|
|
144
146
|
resource,
|
|
145
|
-
|
|
147
|
+
// Wrap the exporter so access tokens recorded in HTTP client span
|
|
148
|
+
// attributes (url.full, url.query) never reach the trace backend
|
|
149
|
+
traceExporter: new redactingSpanExporter_js_1.RedactingSpanExporter(exporters[0]),
|
|
146
150
|
instrumentations: [
|
|
147
151
|
(0, auto_instrumentations_node_1.getNodeAutoInstrumentations)({
|
|
148
152
|
// Disable instrumentations that might be too noisy
|
|
@@ -194,6 +198,19 @@ function isTracingInitialized() {
|
|
|
194
198
|
function getTracer() {
|
|
195
199
|
return api_1.trace.getTracer('mapbox-mcp-server');
|
|
196
200
|
}
|
|
201
|
+
/**
|
|
202
|
+
* The connected client's `clientInfo` (name/version), as reported in its
|
|
203
|
+
* `initialize` request. There is exactly one client per stdio server
|
|
204
|
+
* process, so this is safe as module-level state; set once via
|
|
205
|
+
* `setClientInfo` after the initialize handshake completes (see
|
|
206
|
+
* `server.server.oninitialized` in index.ts) and read by every tool span
|
|
207
|
+
* created afterward, so traces can be filtered/grouped by which MCP client
|
|
208
|
+
* (Claude Desktop, Cursor, VS Code, etc.) made the call.
|
|
209
|
+
*/
|
|
210
|
+
let currentClientInfo;
|
|
211
|
+
function setClientInfo(info) {
|
|
212
|
+
currentClientInfo = info;
|
|
213
|
+
}
|
|
197
214
|
/**
|
|
198
215
|
* Create a span for tool execution with comprehensive attributes
|
|
199
216
|
*/
|
|
@@ -205,6 +222,12 @@ function createToolSpan(toolName, inputSize, extra) {
|
|
|
205
222
|
'tool.name': toolName,
|
|
206
223
|
'tool.input.size': inputSize,
|
|
207
224
|
'operation.type': 'tool_execution',
|
|
225
|
+
...(currentClientInfo?.name && {
|
|
226
|
+
'mcp.client.name': currentClientInfo.name
|
|
227
|
+
}),
|
|
228
|
+
...(currentClientInfo?.version && {
|
|
229
|
+
'mcp.client.version': currentClientInfo.version
|
|
230
|
+
}),
|
|
208
231
|
...(extra?.sessionId && { 'session.id': extra.sessionId }),
|
|
209
232
|
...(extra?.userId && { 'user.id': extra.userId }),
|
|
210
233
|
...(extra?.accountId && { 'account.id': extra.accountId }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../../src/utils/tracing.ts"],"names":[],"mappings":";AAAA,6BAA6B;AAC7B,kCAAkC;;
|
|
1
|
+
{"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../../src/utils/tracing.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,14 +6,30 @@
|
|
|
6
6
|
* Rejects:
|
|
7
7
|
* - non-http(s) schemes (e.g. file:, gopher:, data:, javascript:)
|
|
8
8
|
* - non-https URLs (markers should always be fetched over TLS)
|
|
9
|
-
* -
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* - IPv4/IPv6 literals outside ipaddr.js's plain "unicast" range —
|
|
10
|
+
* deny-by-default, so loopback, private, link-local, multicast,
|
|
11
|
+
* broadcast, CGNAT, reserved, and every IPv4-in-IPv6 transition/
|
|
12
|
+
* translation mechanism (mapped, compatible, 6to4, NAT64, SIIT, Teredo,
|
|
13
|
+
* AMT, ORCHID, etc.) are all rejected without needing to be named
|
|
14
|
+
* individually (CWE-918 SSRF)
|
|
15
|
+
* - well-known local hostnames, reserved local/internal-use suffixes
|
|
16
|
+
* (.internal, .local, .arpa), and dotless single-label hostnames
|
|
12
17
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
18
|
+
* Out of scope, by design, for this pre-fetch string check — all three
|
|
19
|
+
* require validating the actual connection, not the URL string, so they
|
|
20
|
+
* belong where the fetch happens, not here:
|
|
21
|
+
* - DNS rebinding (an ordinary hostname resolving to an internal address
|
|
22
|
+
* at fetch time)
|
|
23
|
+
* - port restriction
|
|
24
|
+
* - network-specific hostname suffixes (.corp, .lan, .home, etc.) —
|
|
25
|
+
* unlike .internal/.local/.arpa, these aren't globally reserved, so
|
|
26
|
+
* they can't be enumerated in general
|
|
17
27
|
*/
|
|
18
28
|
export declare function isSafeExternalUrl(rawUrl: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Same validation as isSafeExternalUrl, but returns the parsed URL on
|
|
31
|
+
* success (null otherwise) so callers that need the WHATWG-canonical form
|
|
32
|
+
* of the validated URL don't have to re-parse the raw string.
|
|
33
|
+
*/
|
|
34
|
+
export declare function parseSafeExternalUrl(rawUrl: string): URL | null;
|
|
19
35
|
//# sourceMappingURL=urlSafety.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"urlSafety.d.ts","sourceRoot":"","sources":["../../../src/utils/urlSafety.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"urlSafety.d.ts","sourceRoot":"","sources":["../../../src/utils/urlSafety.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,CAoF/D"}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// Copyright (c) Mapbox, Inc.
|
|
3
3
|
// Licensed under the MIT License.
|
|
4
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
6
|
+
};
|
|
4
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
8
|
exports.isSafeExternalUrl = isSafeExternalUrl;
|
|
9
|
+
exports.parseSafeExternalUrl = parseSafeExternalUrl;
|
|
10
|
+
const ipaddr_js_1 = __importDefault(require("ipaddr.js"));
|
|
6
11
|
/**
|
|
7
12
|
* Validates that a URL is safe for server-side fetching by an upstream service
|
|
8
13
|
* (in particular, the Mapbox Static Images API which fetches custom marker
|
|
@@ -11,30 +16,55 @@ exports.isSafeExternalUrl = isSafeExternalUrl;
|
|
|
11
16
|
* Rejects:
|
|
12
17
|
* - non-http(s) schemes (e.g. file:, gopher:, data:, javascript:)
|
|
13
18
|
* - non-https URLs (markers should always be fetched over TLS)
|
|
14
|
-
* -
|
|
15
|
-
*
|
|
16
|
-
*
|
|
19
|
+
* - IPv4/IPv6 literals outside ipaddr.js's plain "unicast" range —
|
|
20
|
+
* deny-by-default, so loopback, private, link-local, multicast,
|
|
21
|
+
* broadcast, CGNAT, reserved, and every IPv4-in-IPv6 transition/
|
|
22
|
+
* translation mechanism (mapped, compatible, 6to4, NAT64, SIIT, Teredo,
|
|
23
|
+
* AMT, ORCHID, etc.) are all rejected without needing to be named
|
|
24
|
+
* individually (CWE-918 SSRF)
|
|
25
|
+
* - well-known local hostnames, reserved local/internal-use suffixes
|
|
26
|
+
* (.internal, .local, .arpa), and dotless single-label hostnames
|
|
17
27
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
28
|
+
* Out of scope, by design, for this pre-fetch string check — all three
|
|
29
|
+
* require validating the actual connection, not the URL string, so they
|
|
30
|
+
* belong where the fetch happens, not here:
|
|
31
|
+
* - DNS rebinding (an ordinary hostname resolving to an internal address
|
|
32
|
+
* at fetch time)
|
|
33
|
+
* - port restriction
|
|
34
|
+
* - network-specific hostname suffixes (.corp, .lan, .home, etc.) —
|
|
35
|
+
* unlike .internal/.local/.arpa, these aren't globally reserved, so
|
|
36
|
+
* they can't be enumerated in general
|
|
22
37
|
*/
|
|
23
38
|
function isSafeExternalUrl(rawUrl) {
|
|
39
|
+
return parseSafeExternalUrl(rawUrl) !== null;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Same validation as isSafeExternalUrl, but returns the parsed URL on
|
|
43
|
+
* success (null otherwise) so callers that need the WHATWG-canonical form
|
|
44
|
+
* of the validated URL don't have to re-parse the raw string.
|
|
45
|
+
*/
|
|
46
|
+
function parseSafeExternalUrl(rawUrl) {
|
|
24
47
|
let parsed;
|
|
25
48
|
try {
|
|
26
49
|
parsed = new URL(rawUrl);
|
|
27
50
|
}
|
|
28
51
|
catch {
|
|
29
|
-
return
|
|
52
|
+
return null;
|
|
30
53
|
}
|
|
31
54
|
if (parsed.protocol !== 'https:') {
|
|
32
|
-
return
|
|
55
|
+
return null;
|
|
33
56
|
}
|
|
34
|
-
// Strip optional surrounding brackets from IPv6 literals
|
|
35
|
-
|
|
57
|
+
// Strip optional surrounding brackets from IPv6 literals and a trailing
|
|
58
|
+
// root-label dot (e.g. "localhost." is equivalent to "localhost"). The
|
|
59
|
+
// dotless-hostname check further below relies on this running first —
|
|
60
|
+
// without it, "intranet." would still contain a dot and slip past that
|
|
61
|
+
// check.
|
|
62
|
+
const host = parsed.hostname
|
|
63
|
+
.replace(/^\[|\]$/g, '')
|
|
64
|
+
.replace(/\.$/, '')
|
|
65
|
+
.toLowerCase();
|
|
36
66
|
if (host.length === 0) {
|
|
37
|
-
return
|
|
67
|
+
return null;
|
|
38
68
|
}
|
|
39
69
|
// Block well-known local hostnames
|
|
40
70
|
const blockedHostnames = new Set([
|
|
@@ -43,62 +73,50 @@ function isSafeExternalUrl(rawUrl) {
|
|
|
43
73
|
'ip6-loopback',
|
|
44
74
|
'broadcasthost'
|
|
45
75
|
]);
|
|
46
|
-
|
|
47
|
-
|
|
76
|
+
// Suffixes reserved for local/internal use that no public marker image
|
|
77
|
+
// host is ever legitimately under: cloud-internal DNS zones (.internal,
|
|
78
|
+
// used by GCP/AWS service discovery — covers metadata.google.internal,
|
|
79
|
+
// the GCP metadata endpoint's actual hostname), mDNS (.local), and
|
|
80
|
+
// reverse-DNS / home-network zones reserved by RFC 6761/8375 (.arpa
|
|
81
|
+
// covers .in-addr.arpa, .ip6.arpa, and .home.arpa as suffixes of it).
|
|
82
|
+
const blockedSuffixes = ['.localhost', '.internal', '.local', '.arpa'];
|
|
83
|
+
if (blockedHostnames.has(host) ||
|
|
84
|
+
blockedSuffixes.some((suffix) => host.endsWith(suffix))) {
|
|
85
|
+
return null;
|
|
48
86
|
}
|
|
49
|
-
//
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
if (a === 192 && b === 168)
|
|
69
|
-
return false;
|
|
70
|
-
// 100.64/10 (CGNAT)
|
|
71
|
-
if (a === 100 && b >= 64 && b <= 127)
|
|
72
|
-
return false;
|
|
73
|
-
// 224/4 multicast and 240/4 reserved
|
|
74
|
-
if (a >= 224)
|
|
75
|
-
return false;
|
|
76
|
-
return true;
|
|
87
|
+
// If the host isn't a parseable IP literal at all, it's an ordinary
|
|
88
|
+
// hostname — allowed here (subject to the checks above), except that a
|
|
89
|
+
// public marker image host always has at least one dot; a dotless,
|
|
90
|
+
// single-label hostname only resolves via the fetcher's own network
|
|
91
|
+
// search-domain suffixing (e.g. "intranet", "metadata"), which is never
|
|
92
|
+
// the case for a legitimate external image URL. DNS rebinding on a
|
|
93
|
+
// multi-label hostname is out of scope for this pre-fetch check, see the
|
|
94
|
+
// module doc comment.
|
|
95
|
+
if (!ipaddr_js_1.default.isValid(host)) {
|
|
96
|
+
return host.includes('.') ? parsed : null;
|
|
97
|
+
}
|
|
98
|
+
const addr = ipaddr_js_1.default.parse(host);
|
|
99
|
+
// Deny by default for both IPv4 and IPv6: only plain global unicast
|
|
100
|
+
// addresses are allowed. Every other named range (private, loopback,
|
|
101
|
+
// link-local, multicast, broadcast, CGNAT, reserved, unique-local, and
|
|
102
|
+
// every IPv4-in-IPv6 transition/translation mechanism) is rejected,
|
|
103
|
+
// regardless of what it does or doesn't embed.
|
|
104
|
+
if (addr.range() !== 'unicast') {
|
|
105
|
+
return null;
|
|
77
106
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
// ::
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
//
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
if (
|
|
88
|
-
return
|
|
89
|
-
|
|
90
|
-
if (/^ff[0-9a-f]{2}:/.test(host))
|
|
91
|
-
return false;
|
|
92
|
-
// IPv4-mapped / IPv4-compatible IPv6: ::ffff:a.b.c.d or ::a.b.c.d
|
|
93
|
-
// (Node's URL parser normalises ::ffff:127.0.0.1 to ::ffff:7f00:1, so
|
|
94
|
-
// detect the embedded IPv4 either as a dotted-quad or as the
|
|
95
|
-
// ::ffff:xxxx:xxxx hex form.)
|
|
96
|
-
if (/\d+\.\d+\.\d+\.\d+/.test(host))
|
|
97
|
-
return false;
|
|
98
|
-
if (/^::ffff:[0-9a-f]{1,4}:[0-9a-f]{1,4}$/.test(host))
|
|
99
|
-
return false;
|
|
100
|
-
return true;
|
|
107
|
+
if (addr.kind() === 'ipv6') {
|
|
108
|
+
// ipaddr.js does not classify the deprecated IPv4-compatible form
|
|
109
|
+
// (::a.b.c.d, i.e. the leading 96 bits all zero) as a special range
|
|
110
|
+
// when written in plain hex, which is exactly the form Node's URL
|
|
111
|
+
// parser normalises a dotted-quad IPv4-compatible literal to — so it
|
|
112
|
+
// reaches here as ordinary 'unicast' and needs an explicit check.
|
|
113
|
+
// (::1 and :: are already excluded above via the loopback/unspecified
|
|
114
|
+
// ranges, so this only affects addresses with a genuine embedded IPv4.)
|
|
115
|
+
const bytes = addr.toByteArray();
|
|
116
|
+
if (bytes.slice(0, 12).every((b) => b === 0)) {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
101
119
|
}
|
|
102
|
-
return
|
|
120
|
+
return parsed;
|
|
103
121
|
}
|
|
104
122
|
//# sourceMappingURL=urlSafety.js.map
|