{"apiVersion":"v1","directorySlug":"fractalfi-mcp-84240e4e66","title":"Fractal","description":"Plan drone missions in natural language. Fractal turns intent into repeatable flight plans, learns from every run, and helps improve the next mission.","pageUrl":"https://www.mcpbundles.com/skills/fractalfi-mcp-84240e4e66","connectPath":"importable","connectAction":"import_server","catalogListing":false,"bundleSlug":null,"listingKind":"remote_mcp","kind":"provider","transportUrl":"https://fractalfi.co/api/mcp","hostedMcpUrl":null,"toolCount":26,"toolInventoryStatus":"observed","refreshedAt":"2026-11-03T13:26:00.516172+00:00","registryName":"co.fractalfi/fractalfi-mcp-84240e4e66","registryVersion":"2026.11.3","registryEligible":true,"tools":[{"name":"connect","description":"Connect this agent session to a browser planning session. The session ID is shown in the Mission Builder UI (e.g. \"3f2a…\"). Call this before using any mission tools.","inputSchema":{"type":"object","required":["sessionId"],"properties":{"sessionId":{"type":"string"}}},"logicalName":"connect","displayName":"connect","title":"connect","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"disconnect","description":"Disconnect from the current browser planning session.","inputSchema":{"type":"object","required":[],"properties":{}},"logicalName":"disconnect","displayName":"disconnect","title":"disconnect","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"setField","description":"Set a field to an absolute value on selected waypoints. Selection can be by indices, rows, segments, geographic bounds, or all. Field captureMode accepts string values (photo/video/both/none); all others accept numbers.","inputSchema":{"type":"object","required":["selection","field","value"],"properties":{"field":{"enum":["altitude","heading","speed","gimbalPitch","captureMode"],"type":"string"},"value":{},"selection":{"oneOf":[{"type":"object","required":["kind","indices"],"properties":{"kind":{"const":"indices"},"indices":{"type":"array","items":{"type":"integer"},"minItems":1}}},{"type":"object","required":["kind","rowNums"],"properties":{"kind":{"const":"rows"},"rowNums":{"type":"array","items":{"type":"integer"},"minItems":1}}},{"type":"object","required":["kind","segmentIds"],"properties":{"kind":{"const":"segments"},"segmentIds":{"type":"array","items":{"type":"string"},"minItems":1}}},{"type":"object","required":["kind","bounds"],"properties":{"kind":{"const":"bounds"},"bounds":{"type":"object","required":["north","south","east","west"],"properties":{"east":{"type":"number"},"west":{"type":"number"},"north":{"type":"number"},"south":{"type":"number"}}}}},{"type":"object","required":["kind"],"properties":{"kind":{"const":"all"}}},{"type":"object","required":["kind","of"],"properties":{"of":{"type":"object"},"kind":{"const":"invert"}}}]}}},"logicalName":"setField","displayName":"setField","title":"setField","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"adjustField","description":"Adjust a field on selected waypoints. mode='delta': add a fixed amount to each waypoint's current value. mode='ramp': linearly interpolate from startValue to endValue across the selection in order.","inputSchema":{"type":"object","required":["selection","field","mode"],"properties":{"mode":{"enum":["delta","ramp"],"type":"string"},"field":{"enum":["altitude","heading","speed","gimbalPitch"],"type":"string"},"value":{"type":"number"},"endValue":{"type":"number"},"selection":{"oneOf":[{"type":"object","required":["kind","indices"],"properties":{"kind":{"const":"indices"},"indices":{"type":"array","items":{"type":"integer"},"minItems":1}}},{"type":"object","required":["kind","rowNums"],"properties":{"kind":{"const":"rows"},"rowNums":{"type":"array","items":{"type":"integer"},"minItems":1}}},{"type":"object","required":["kind","segmentIds"],"properties":{"kind":{"const":"segments"},"segmentIds":{"type":"array","items":{"type":"string"},"minItems":1}}},{"type":"object","required":["kind","bounds"],"properties":{"kind":{"const":"bounds"},"bounds":{"type":"object","required":["north","south","east","west"],"properties":{"east":{"type":"number"},"west":{"type":"number"},"north":{"type":"number"},"south":{"type":"number"}}}}},{"type":"object","required":["kind"],"properties":{"kind":{"const":"all"}}},{"type":"object","required":["kind","of"],"properties":{"of":{"type":"object"},"kind":{"const":"invert"}}}]},"startValue":{"type":"number"}}},"logicalName":"adjustField","displayName":"adjustField","title":"adjustField","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"setEnabled","description":"Enable or disable selected waypoints. Use {kind:'invert', of:<sel>} to disable everything outside a selection (the 'enable only X' pattern). When selection is rows-kind, only row waypoints are toggled — transition waypoints are left unchanged.","inputSchema":{"type":"object","required":["selection","enabled"],"properties":{"enabled":{"type":"boolean"},"selection":{"oneOf":[{"type":"object","required":["kind","indices"],"properties":{"kind":{"const":"indices"},"indices":{"type":"array","items":{"type":"integer"},"minItems":1}}},{"type":"object","required":["kind","rowNums"],"properties":{"kind":{"const":"rows"},"rowNums":{"type":"array","items":{"type":"integer"},"minItems":1}}},{"type":"object","required":["kind","segmentIds"],"properties":{"kind":{"const":"segments"},"segmentIds":{"type":"array","items":{"type":"string"},"minItems":1}}},{"type":"object","required":["kind","bounds"],"properties":{"kind":{"const":"bounds"},"bounds":{"type":"object","required":["north","south","east","west"],"properties":{"east":{"type":"number"},"west":{"type":"number"},"north":{"type":"number"},"south":{"type":"number"}}}}},{"type":"object","required":["kind"],"properties":{"kind":{"const":"all"}}},{"type":"object","required":["kind","of"],"properties":{"of":{"type":"object"},"kind":{"const":"invert"}}}]}}},"logicalName":"setEnabled","displayName":"setEnabled","title":"setEnabled","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"shift","description":"Move waypoints in space. direction.kind='compass': uniform compass direction (all wps shift identically). direction.kind='perpendicular': relative to each waypoint's flight bearing. direction.kind='along-bearing': forward/backward along each waypoint's bearing (negative distanceM = backward).","inputSchema":{"type":"object","required":["selection","direction","distanceM"],"properties":{"direction":{"oneOf":[{"type":"object","required":["kind","bearingDeg"],"properties":{"kind":{"const":"compass"},"bearingDeg":{"type":"number"}}},{"type":"object","required":["kind","side"],"properties":{"kind":{"const":"perpendicular"},"side":{"enum":["left","right"],"type":"string"}}},{"type":"object","required":["kind"],"properties":{"kind":{"const":"along-bearing"}}}]},"distanceM":{"type":"number"},"selection":{"oneOf":[{"type":"object","required":["kind","indices"],"properties":{"kind":{"const":"indices"},"indices":{"type":"array","items":{"type":"integer"},"minItems":1}}},{"type":"object","required":["kind","rowNums"],"properties":{"kind":{"const":"rows"},"rowNums":{"type":"array","items":{"type":"integer"},"minItems":1}}},{"type":"object","required":["kind","segmentIds"],"properties":{"kind":{"const":"segments"},"segmentIds":{"type":"array","items":{"type":"string"},"minItems":1}}},{"type":"object","required":["kind","bounds"],"properties":{"kind":{"const":"bounds"},"bounds":{"type":"object","required":["north","south","east","west"],"properties":{"east":{"type":"number"},"west":{"type":"number"},"north":{"type":"number"},"south":{"type":"number"}}}}},{"type":"object","required":["kind"],"properties":{"kind":{"const":"all"}}},{"type":"object","required":["kind","of"],"properties":{"of":{"type":"object"},"kind":{"const":"invert"}}}]}}},"logicalName":"shift","displayName":"shift","title":"shift","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"editRoute","description":"Structural route edits. op.kind='reorder': change visit order (newOrder[i] = current index to place at position i). op.kind='reverse': reverse entire sequence. op.kind='delete': remove selected waypoints (supports all Selection kinds). op.kind='movePositions': move waypoints to exact GPS coordinates.","inputSchema":{"type":"object","required":["op"],"properties":{"op":{"oneOf":[{"type":"object","required":["kind","newOrder"],"properties":{"kind":{"const":"reorder"},"newOrder":{"type":"array","items":{"type":"integer"}}}},{"type":"object","required":["kind"],"properties":{"kind":{"const":"reverse"}}},{"type":"object","required":["kind","selection"],"properties":{"kind":{"const":"delete"},"selection":{"oneOf":[{"type":"object","required":["kind","indices"],"properties":{"kind":{"const":"indices"},"indices":{"type":"array","items":{"type":"integer"},"minItems":1}}},{"type":"object","required":["kind","rowNums"],"properties":{"kind":{"const":"rows"},"rowNums":{"type":"array","items":{"type":"integer"},"minItems":1}}},{"type":"object","required":["kind","segmentIds"],"properties":{"kind":{"const":"segments"},"segmentIds":{"type":"array","items":{"type":"string"},"minItems":1}}},{"type":"object","required":["kind","bounds"],"properties":{"kind":{"const":"bounds"},"bounds":{"type":"object","required":["north","south","east","west"],"properties":{"east":{"type":"number"},"west":{"type":"number"},"north":{"type":"number"},"south":{"type":"number"}}}}},{"type":"object","required":["kind"],"properties":{"kind":{"const":"all"}}},{"type":"object","required":["kind","of"],"properties":{"of":{"type":"object"},"kind":{"const":"invert"}}}]}}},{"type":"object","required":["kind","moves"],"properties":{"kind":{"const":"movePositions"},"moves":{"type":"array","items":{"type":"object","required":["index","lat","lng"],"properties":{"lat":{"type":"number"},"lng":{"type":"number"},"index":{"type":"integer"}}}}}}]}}},"logicalName":"editRoute","displayName":"editRoute","title":"editRoute","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"addWaypoints","description":"Insert waypoints into the mission. Each entry is either a free waypoint (lat, lng, optional afterIndex and props) or a transition dogleg ({kind:\"transition\", betweenRows:[fromRow,toRow], exitDistanceM?, entryDistanceM?}). Insertions are applied in sequence — indices shift as earlier items are inserted.","inputSchema":{"type":"object","required":["waypoints"],"properties":{"waypoints":{"type":"array","items":{"oneOf":[{"type":"object","required":["lat","lng"],"properties":{"lat":{"type":"number"},"lng":{"type":"number"},"props":{"type":"object","properties":{"speed":{"type":"number"},"heading":{"type":"number"},"altitude":{"type":"number"},"gimbalPitch":{"type":"number"}}},"afterIndex":{"type":"integer"}}},{"type":"object","required":["kind","betweenRows"],"properties":{"kind":{"const":"transition"},"betweenRows":{"type":"array","items":{"type":"integer"},"maxItems":2,"minItems":2},"exitDistanceM":{"type":"number","default":20},"entryDistanceM":{"type":"number","default":20}}}]},"minItems":1}}},"logicalName":"addWaypoints","displayName":"addWaypoints","title":"addWaypoints","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"revertPreview","description":"Roll back the most recent mutation(s) staged in the preview. Useful for trying alternatives without losing earlier work. Returns count of steps actually reverted.","inputSchema":{"type":"object","required":[],"properties":{"steps":{"type":"integer","default":1}}},"logicalName":"revertPreview","displayName":"revertPreview","title":"revertPreview","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"clearPreview","description":"Discard the entire in-progress preview and return to the canonical mission state. Use when starting over.","inputSchema":{"type":"object","required":[],"properties":{}},"logicalName":"clearPreview","displayName":"clearPreview","title":"clearPreview","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"proposeToUser","description":"Surface the current preview to the user as a proposal. The UI will show Accept/Reject controls. Call this only when you are confident the preview is correct — it ends your turn. The user must accept before any change becomes canonical.","inputSchema":{"type":"object","required":[],"properties":{"summary":{"type":"string"}}},"logicalName":"proposeToUser","displayName":"proposeToUser","title":"proposeToUser","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"getMissionInfo","description":"Get mission overview: bounding box, centroid, total distance, estimated flight time, altitude/speed ranges, waypoint counts, and row summary if available. Includes previewActive flag.","inputSchema":{"type":"object","required":[],"properties":{"usePreview":{"type":"boolean"}}},"logicalName":"getMissionInfo","displayName":"getMissionInfo","title":"getMissionInfo","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"getWaypoints","description":"Get waypoint details. If indices is provided, returns only those waypoints; otherwise returns all. Each waypoint includes index, lat, lng, altitude, heading, speed, gimbalPitch, enabled, rowNum, isRowStart, isRowEnd.","inputSchema":{"type":"object","required":[],"properties":{"indices":{"type":"array","items":{"type":"integer"}},"usePreview":{"type":"boolean"}}},"logicalName":"getWaypoints","displayName":"getWaypoints","title":"getWaypoints","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"getSegments","description":"Get detected flight segments. Each segment has an id (e.g. \"leg-1\", \"turn-2\"), type (leg/turn/hover), start/end waypoint indices, average bearing, altitude, length in meters, and centroid.","inputSchema":{"type":"object","required":[],"properties":{"usePreview":{"type":"boolean"}}},"logicalName":"getSegments","displayName":"getSegments","title":"getSegments","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"measureDistance","description":"Measure distance (meters) and bearing between two points. Each point can be a waypoint index ({kind:'waypoint',index}), a row number ({kind:'row',rowNum}), or raw coordinates ({kind:'coords',lat,lng}).","inputSchema":{"type":"object","required":["from","to"],"properties":{"to":{"type":"object"},"from":{"type":"object"},"usePreview":{"type":"boolean"}}},"logicalName":"measureDistance","displayName":"measureDistance","title":"measureDistance","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"findWaypoints","description":"Find waypoints matching filter criteria. All filters are optional and ANDed together.","inputSchema":{"type":"object","required":[],"properties":{"bounds":{"type":"object","required":["north","south","east","west"],"properties":{"east":{"type":"number"},"west":{"type":"number"},"north":{"type":"number"},"south":{"type":"number"}}},"rowNum":{"type":"integer"},"enabled":{"type":"boolean"},"speedMax":{"type":"number"},"speedMin":{"type":"number"},"usePreview":{"type":"boolean"},"altitudeMax":{"type":"number"},"altitudeMin":{"type":"number"}}},"logicalName":"findWaypoints","displayName":"findWaypoints","title":"findWaypoints","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"previewShift","description":"Preview what waypoints would look like after a shift WITHOUT applying it. Returns the shifted positions alongside the originals for comparison. (Stateless inspection — does not affect the preview store.)","inputSchema":{"type":"object","required":["selection","direction","distanceM"],"properties":{"direction":{"type":"object"},"distanceM":{"type":"number"},"selection":{"type":"object"},"usePreview":{"type":"boolean"}}},"logicalName":"previewShift","displayName":"previewShift","title":"previewShift","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"getWaypointsNear","description":"Find waypoints within a geographic radius, sorted by distance.","inputSchema":{"type":"object","required":["lat","lng","radiusM"],"properties":{"lat":{"type":"number"},"lng":{"type":"number"},"radiusM":{"type":"number"},"usePreview":{"type":"boolean"}}},"logicalName":"getWaypointsNear","displayName":"getWaypointsNear","title":"getWaypointsNear","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"getFeatures","description":"List all registered environment features (exclusion zones, obstacles, corridors, inclusions).","inputSchema":{"type":"object","required":[],"properties":{}},"logicalName":"getFeatures","displayName":"getFeatures","title":"getFeatures","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"analyzeFlightPath","description":"Check which flight segments interact with registered environment features. Returns per-segment status: clear, near (within bufferM), or crossing.","inputSchema":{"type":"object","required":[],"properties":{"featureIds":{"type":"array","items":{"type":"string"}},"usePreview":{"type":"boolean"}}},"logicalName":"analyzeFlightPath","displayName":"analyzeFlightPath","title":"analyzeFlightPath","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"checkPosition","description":"Check whether a specific position is inside or near registered features.","inputSchema":{"type":"object","required":["lat","lng"],"properties":{"lat":{"type":"number"},"lng":{"type":"number"},"featureIds":{"type":"array","items":{"type":"string"}}}},"logicalName":"checkPosition","displayName":"checkPosition","title":"checkPosition","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"declareFeature","description":"Register an environment feature on the map. Type can be obstacle, exclusion, inclusion, or corridor. Geometry can be a polygon (coordinates array), circle (center + radiusM), or corridor (path + widthM).","inputSchema":{"type":"object","required":["label","type","geometry"],"properties":{"type":{"enum":["obstacle","exclusion","inclusion","corridor"],"type":"string"},"label":{"type":"string"},"bufferM":{"type":"number","default":0},"geometry":{"type":"object"}}},"logicalName":"declareFeature","displayName":"declareFeature","title":"declareFeature","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"removeFeature","description":"Remove a registered environment feature by ID.","inputSchema":{"type":"object","required":["featureId"],"properties":{"featureId":{"type":"string"}}},"logicalName":"removeFeature","displayName":"removeFeature","title":"removeFeature","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"undoLastBatch","description":"Undo the last batch of operations applied to the mission. Can be called multiple times to walk back through history (up to 10 steps).","inputSchema":{"type":"object","required":[],"properties":{}},"logicalName":"undoLastBatch","displayName":"undoLastBatch","title":"undoLastBatch","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"getMissionSnapshot","description":"Get a complete mission snapshot including waypoints, segments, spatial stats, row profiles, and row distances. Use when you need a comprehensive view before planning a series of operations. Includes previewActive flag.","inputSchema":{"type":"object","required":[],"properties":{"usePreview":{"type":"boolean"}}},"logicalName":"getMissionSnapshot","displayName":"getMissionSnapshot","title":"getMissionSnapshot","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"captureMapView","description":"Capture a map region as a satellite image. Returns an image block plus a scaleMeta text block. scaleMeta includes: bounds (lat/lng), metersPerPixel, anchors (pixel positions for each rendered waypoint, labelled 'WP3' etc.), gridCells (A1-H8 reference grid), and — when displayOptions are used — renderedWaypoints, filteredWaypoints, agentOverlays, renderedAnnotationIds, cornerCoords, and warnings. Waypoint index labels are drawn by default. The trajectory path always renders in full regardless of","inputSchema":{"type":"object","required":["center","radiusM"],"properties":{"center":{"type":"object","required":["lat","lng"],"properties":{"lat":{"type":"number"},"lng":{"type":"number"}}},"radiusM":{"type":"number"},"displayOptions":{"type":"object","required":[],"properties":{"lines":{"type":"array","items":{"type":"object","required":["points"],"properties":{"color":{"type":"string"},"label":{"type":"string"},"dashed":{"type":"boolean"},"points":{"type":"array","items":{"type":"object","required":["lat","lng"],"properties":{"lat":{"type":"number"},"lng":{"type":"number"}}}},"weight":{"type":"number"}}}},"circles":{"type":"array","items":{"type":"object","required":["lat","lng","radiusM"],"properties":{"lat":{"type":"number"},"lng":{"type":"number"},"color":{"type":"string"},"label":{"type":"string"},"dashed":{"type":"boolean"},"radiusM":{"type":"number"},"fillOpacity":{"type":"number"}}}},"markers":{"type":"array","items":{"type":"object","required":["lat","lng"],"properties":{"lat":{"type":"number"},"lng":{"type":"number"},"color":{"type":"string"},"label":{"type":"string"}}}},"markerSize":{"enum":["small","medium","large"],"type":"string"},"showLabels":{"type":"boolean"},"annotationIds":{"type":"array","items":{"type":"string"}},"showWaypoints":{"type":"array","items":{"type":"integer"}},"showCoordinates":{"type":"boolean"},"highlightWaypoints":{"type":"array","items":{"type":"integer"}}}}}},"logicalName":"captureMapView","displayName":"captureMapView","title":"captureMapView","annotations":{"untrustedContentHint":true,"readOnlyHint":true}}],"toolSource":"directory_preview","agentAction":"both","installLinks":[{"id":"cursor","label":"Cursor","href":"cursor://anysphere.cursor-deeplink/mcp/install?name=Fractal&config=eyJ1cmwiOiAiaHR0cHM6Ly9mcmFjdGFsZmkuY28vYXBpL21jcCJ9"},{"id":"vscode","label":"VS Code","href":"vscode:mcp/install?%7B%22name%22%3A%22Fractal%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Ffractalfi.co%2Fapi%2Fmcp%22%7D"},{"id":"vscode-insiders","label":"VS Code Insiders","href":"vscode-insiders:mcp/install?%7B%22name%22%3A%22Fractal%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Ffractalfi.co%2Fapi%2Fmcp%22%7D"},{"id":"claude-web","label":"Claude.ai","href":"https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=Fractal&connectorUrl=https%3A%2F%2Ffractalfi.co%2Fapi%2Fmcp"},{"id":"codex","label":"Codex","copyText":"codex mcp add \"Fractal\" --url \"https://fractalfi.co/api/mcp\""},{"id":"chatgpt","label":"ChatGPT","href":"https://www.mcpbundles.com/docs/integrations/chatgpt"}],"catalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/fractalfi-mcp-84240e4e66","callUrl":"https://www.mcpbundles.com/api/directory/v1/servers/fractalfi-mcp-84240e4e66/tools/{tool}","mcpServerUrl":"https://fractalfi.co/api/mcp","liveCatalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/fractalfi-mcp-84240e4e66?live=1"}