Magic Lane MCP Docs Server
OfficialProvides searchable and retrievable Magic Lane Maps SDK documentation for Android, including code examples and cross-SDK topic lookup for maps and 3D scenes, markers, places and search, routing and navigation, positioning, offline maps, weather, and fleet management.
Provides searchable and retrievable Magic Lane Maps SDK documentation for C++, including code examples and cross-SDK topic lookup for maps, markers, places and search, routing and navigation, positioning, offline maps, weather, and fleet management.
Provides searchable and retrievable Magic Lane Maps SDK documentation for Flutter, including code examples and cross-SDK topic lookup for maps, markers, places and search, routing and navigation, positioning, offline maps, weather, and fleet management.
Provides searchable and retrievable Magic Lane Maps SDK documentation for iOS, including code examples and cross-SDK topic lookup for maps, markers, places and search, routing and navigation, positioning, offline maps, weather, and fleet management.
Provides searchable and retrievable Magic Lane Maps SDK documentation for TypeScript, including code examples and cross-SDK topic lookup for maps, markers, places and search, routing and navigation, positioning, offline maps, weather, and fleet management.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Magic Lane MCP Docs Serverfind the Flutter SDK code example for adding markers to a map"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Magic Lane MCP Docs Server
The Magic Lane MCP Docs Server enables any AI agent or application to become a Magic Lane documentation expert. Through the Model Context Protocol, your AI assistant gains instant, searchable access to the live Magic Lane developer documentation: the developer guides (account setup, API keys, Map Studio, the Magic Lane MCP Server), the full references of the Maps SDKs for Flutter, Android, iOS, C++, and TypeScript (maps & 3D scene, markers, places & search, routing & navigation, positioning, offline maps, weather, fleet management, migration guides), and the Cloud REST APIs (Routing, Isochrones, Search, Reverse Geocoding, Fleet Management, Geofences, Vector Tiles, Offline Maps).
Documentation Search - Rank pages across all documentation sources, with optional full-text excerpts
Document Retrieval - Fetch any documentation page as clean markdown, paged for long pages
Batch Retrieval - Pull up to 20 pages in a single call
Documentation Browsing - List every documented page grouped by source and section
Code Example Extraction - Pull only the code blocks from a page, filterable by language
Cross-SDK Lookup - Find the same topic in every SDK side by side
Recency Tracking - List which pages changed in the last N days
Product Guides - Serve the official Magic Lane MCP Server and Magic Lane Studio (formerly Map Studio) documentation
Documentation is fetched at runtime from Magic Lane's published llms.txt / llms-full.txt files - nothing is bundled, so results always reflect the live docs. All requests go through one outbound pipeline with a one-hour in-memory cache that revalidates with ETag / Last-Modified (an expired entry is renewed with a cheap 304 instead of a re-download, and is served stale when the refresh fails) and retries a failed (5xx or network) request once. Every tool is annotated read-only and idempotent; whether a client still asks before calling a tool is up to the client.
No API key or account is required, and the server has no authentication of its own: the documentation it exposes is public.
Use the hosted server
Magic Lane runs this server at https://developer.magiclane.com/docs-mcp (Streamable HTTP, no API key), so you can connect your AI client without installing anything. In Claude Code:
claude mcp add --transport http --scope user magiclane-docs https://developer.magiclane.com/docs-mcpThe setup guide shows the same for Cursor, VS Code and other clients. To run the server yourself, read on.
Related MCP server: Google Cloud Docs MCP Server
Getting Started
Prerequisites
Node.js 22+ and npm - verify with:
# Check Node.js version (should be 22+) node --version # Check npm version npm --versionThe server itself runs on any Node.js 22 (
engines: >=22); the development toolchain (ESLint 10) needs Node.js 22.13 or newer. Theinspect:*scripts pin the MCP Inspector to 1.0.2, the last release that runs on Node.js 22.18 (Inspector 2.x needs 22.19+).An MCP-compatible AI client, such as:
Visual Studio Code with GitHub Copilot or Claude Code
Android Studio with GitHub Copilot
No API key or account - the documentation this server exposes is public
Installation
Once the package is published, npx runs it without an install - the way most MCP client configurations start a server:
npx -y @magiclane/mcp-docs-server # stdio transport
npx -y -p @magiclane/mcp-docs-server magiclane-mcp-docs-http # Streamable HTTP on http://127.0.0.1:3000/mcpThe first form runs the command named after the package, mcp-docs-server
(the stdio server). The HTTP server is another command of the same package,
so npx needs -p and the command's name.
For a service, run the HTTP server from a global install or from Docker, not
through npx: npx starts the server under npm, so a signal the supervisor
sends (SIGTERM from systemd or docker stop) may not reach it, and the
calls still running then end with the process instead of finishing.
A global install provides the commands magiclane-mcp-docs (stdio) and magiclane-mcp-docs-http (Streamable HTTP), the names to use in a client configuration:
npm install -g @magiclane/mcp-docs-server
magiclane-mcp-docs # stdio transport
magiclane-mcp-docs-http # Streamable HTTP transport on http://127.0.0.1:3000/mcpFrom a clone of the repository:
git clone https://github.com/magiclane/magiclane-mcp-docs-server.git
cd magiclane-mcp-docs-server
# Install dependencies
npm install
# Build the two bundles
npm run build
# Verify the build was successful
ls dist/ # docs-server.esm.js and docs-server-http.esm.js (plus source maps)Client configurations that start the server with node need two absolute paths: the bundle (/absolute/path/to/magiclane-mcp-docs-server/dist/docs-server.esm.js) and, for some clients, node itself - which node on macOS/Linux, where node on Windows. With the package installed globally, the magiclane-mcp-docs command replaces both.
The npm package ships dist/ (the two bundles and their source maps), src/ (the TypeScript sources, for reference), LICENSES/, REUSE.toml, README.md, LICENSE and package.json - no type declarations. It is a CLI package: it has no main/exports, so importing it from another program is not supported.
Running the Server
Stdio transport (default - used by desktop MCP clients):
npm start # node dist/docs-server.esm.js (after npm run build)
# or during development, straight from the TypeScript sources:
npm run dev # node --import tsx src/docs-server.tsA one-shot pipe works too - requests on stdin, then the end of input (printf '…' | npx -y @magiclane/mcp-docs-server): the calls still running when stdin closes finish, and their answers are written before the server exits. Each request to the documentation site is waited for on its own limits, so an answer whose first byte takes up to 20 s still arrives; the first request the site leaves unanswered for 20 s stops further requests, and the calls answer with what they have. Calls still running after 3 s with nothing left to wait for from the site are given up. The exit status is 0 when every call was answered, 1 when some were given up.
Streamable HTTP transport:
npm run start:http # node dist/docs-server-http.esm.js (after npm run build)
# or during development:
npm run dev:http # node --import tsx src/docs-server-http.tsnode src/docs-server.ts does not work (the sources are TypeScript with .js import specifiers); use the built bundle or node --import tsx.
The HTTP server listens on http://127.0.0.1:3000/mcp by default and exposes separate GET /health (liveness) and GET /ready (readiness) endpoints. Its port, bind address, path, CORS policy, Host allowlist and trusted proxies are set through environment variables, and it enforces body, rate and concurrency limits with a share per client - all documented in HTTP server › Configuration, together with loading a .env file. Every variable and its default is also listed in .env.example. Two settings deserve care:
MCP_CORS_ORIGIN=*lets any web page the user visits call a local instance from their browser - the server has no authentication. Allow your web client's exact origin instead.Behind a reverse proxy,
X-Forwarded-Foris honoured only from the proxy addresses listed inMCP_TRUSTED_PROXIES(IPs or CIDR ranges) and withTRUSTED_PROXY_HOPS> 0. WithTRUSTED_PROXY_HOPSalone the header is ignored and every client shares the proxy's rate-limit bucket and concurrency share.
Both transports honour VERBOSE:
VERBOSE=true npm start # logs "[Magic Lane MCP Docs] tool invoked: <name>" per callOn the stdio transport every diagnostic goes to stderr - stdout is reserved for the MCP protocol - so verbose mode is safe to enable. (The HTTP entry point, which has no protocol on stdout, prints its startup banner there.) Accepted truthy values are true, 1, yes, and on (case-insensitive); anything else is off.
Connecting a Client
Every guide uses the client config key magiclane-docs and the same server; only the file and its schema differ:
Client | Config file | Schema | Guide |
VS Code (GitHub Copilot) |
|
| |
Claude Desktop |
|
| |
Claude Code |
|
| |
Visual Studio (GitHub Copilot) |
|
| |
Android Studio / JetBrains (Copilot plugin) | the plugin's |
| |
Cursor |
|
| |
Any client, over HTTP (shared server, Docker) | the client's own HTTP/URL entry |
|
MCP Inspector
npm run inspect:build # build, then inspect the stdio server
npm run inspect:dev # inspect the stdio server from TypeScript sources
npm run inspect:build:http # build, start the HTTP server, and launch the inspector
npm run inspect:dev:http # same, from TypeScript sourcesEach script tells the Inspector which transport to open on (
--transport stdiofor the stdio pair), because the Inspector otherwise opens on whatever transport was used last in that browser: after an HTTP session, a stdio launch would come up on "Streamable HTTP" and Connect would fail withECONNREFUSED 127.0.0.1:3000, as no HTTP server is running. The HTTP variants start the server and pointscripts/inspect-http.mjsat it (MCP_HTTP_URL, defaulthttp://127.0.0.1:3000/mcp); the launcher waits until the server accepts connections (up toMCP_HTTP_WAIT_MS, default 60 s) before it opens the Inspector, which connects as soon as its page loads. No credentials are involved - connect and start calling tools.
Available Tools
1. Documentation Search (search_docs)
Search the Magic Lane developer documentation. Ranks pages from the llms.txt indexes (title, section, description, path) and optionally appends full-text excerpts from llms-full.txt.
Ranking: whole words in any script, function words removed and word forms folded ("route calculation" finds "Calculate Route"). Rare words weigh more, action words less; pages score by query coverage, with bonuses for adjacent words, the whole phrase and an exact title. A platform in the query limits the search to that source, unless it is part of a feature name ("Android Auto"); everyday platform words (web, cloud, rest, compose) only rank that platform higher. Up to 5 full-text excerpts with page URLs follow the index results.
Structured output (structuredContent), for programmatic consumers:
results[]- index matches, best first:title,url,path,description,source,sectionexcerpts[]- full-text matches, best first:title,url?,path?,source,excerpt(empty whenincludeFullTextisfalse)failedSources[]-{ source, part, reason, kind }for every file that could not be loaded (kind:unreachableorfile);partisindex(the source's pages were not ranked) orfull-text(no excerpts from it)searched?-{ query, sources }, present when a platform name in the query narrowed the search or left the search words: what was searched - the query without the platform name, or the whole query when nothing else matched there and the platform's overview page names the topic ("rest api authentication") - and where: the platform's pages, plus the developer guides for an API-key question ("rest api key")preferred?- the sources ranked higher because the query says web, cloud, rest or compose without sdk/api (every source is still searched)unverified?-{ word, source }for a platform word left out of the search words that could not be checked against its platform's page titles (that index did not load), so it may be part of a feature name ("Android Auto") insteadelsewhere?- when the topic matches no page of the platform the query names: the other sources whose best page for it is titled with a word of it
Input Parameters:
Parameter | Type | Default | Description |
| string (1–300 chars) | required | Free-text search query, e.g. |
|
|
| Restrict the search to one documentation source |
| number (1–25) |
| Maximum number of index results (excerpts are capped at 5) |
| boolean |
| Also search full page contents ( |
Example Prompts:
"How do I calculate a route between two coordinates with the Flutter SDK?"
"How do I stream turn-by-turn navigation over BLE with the Android SDK?"
"Show me how to center the map on a coordinate in SwiftUI (iOS SDK)"
"How do I embed an interactive map in a web app with the TypeScript SDK?"
"Where do I get a Magic Lane API key?"
"How do I download map data for offline use?"
"Find docs about weather forecasts along a route"
"How do I create a geofence and get alerts when an asset enters it?" (
source: cloud-rest-api)
Fetch the markdown content of a specific documentation page by URL or /docs/... path. The whole page is reachable: a call returns 24,000 characters by default (maxChars up to 50,000), and every response starts with a note that says where you are - (Complete page: N characters.) or (Showing characters a–b of N. M remain - call again with offset: b for the next chunk.). An offset past the end of the page is an error. Slices never split a surrogate pair, and always advance (even maxChars: 1 at an emoji).
Accepted references (at most 500 characters), all normalized to https://developer.magiclane.com/docs/<path>.md:
/docs/flutter/examples/maps-3dscene/hello-map(a docs path;.mdis added,.htmlis replaced)/flutter/examples/maps-3dscene/hello-map(a path without the/docsprefix)developer.magiclane.com/docs/...(bare host) andhttp://developer.magiclane.com/...(upgraded tohttps)Query strings and fragments are stripped; letter case, doubled slashes and percent-encoded letters are folded (every published path is lower-case), so each page has one cache entry
Other hosts, non-default ports, URLs carrying credentials and other schemes (ftp:, file:, …) are refused, and so is llms-full.txt (megabytes; use search_docs and the pages instead). A path that the site answers with HTML (its shell or a 404 page) is rejected with "Not a documentation page".
Input Parameters:
Parameter | Type | Default | Description |
| string (1–500 chars) | required | Absolute |
| number (≥0) |
| Character offset to start from (for paging through long pages) |
| number (1–50,000) |
| Maximum characters to return from the offset; the note names the next offset |
Example Prompts:
"Read the Get Started guide from the Magic Lane docs"
"Fetch https://developer.magiclane.com/docs/flutter/examples/routing-navigation/calculate-route.md and summarize it"
"Open /docs/guides/map-studio and explain how to publish a custom style"
"Read /docs/android/examples/ble/ble-server-client and explain the GATT service it publishes"
"Fetch the Flutter route-preferences guide and list every vehicle profile option"
"Open the Routing API guide from the Cloud REST APIs and show the request format"
"Read /docs/typescript/examples/get-started-with-sample-apps and tell me the prerequisites"
3. Batch Document Retrieval (read_docs_batch)
Fetch up to 20 documentation pages in a single call: at most 20 URLs are accepted, a longer array is refused with that limit, and one of 256 values or more is refused outright by the server's argument-size check, without naming it. The page text is capped at 120,000 characters shared across the pages that loaded (each gets at least 2,000; a failed or short page leaves its share to the others; each page's header and any error notes come on top); a page that was cut short says where to continue with read_doc (offset). Pages that fail to load are reported individually, and those that did not load in time are listed at the end, to read again with another call; the call is an error only when every page failed. A page given twice is returned once.
Input Parameters:
Parameter | Type | Default | Description |
| string[] (1–20) | required | URLs or |
Example Prompts:
"Compare the Calculate Route and Calculate Bike Route examples"
"Read all the migration guides and tell me what changed between 2.11.0 and 3.1.10"
"Fetch the routing guides for Flutter, Android, and iOS and summarize the differences"
"Read every weather-related page in the Flutter docs and produce one combined cheat sheet"
"Pull the whole Get Started section plus the API-key guide so I can onboard a new developer"
4. Documentation Browsing (list_docs)
Browse the documentation index. mode: "sections" returns a compact table of contents (sections with page counts); mode: "pages" lists pages with title, URL and description (a description over 200 characters is cut to its first sentence, or at a word - where the room ends when its second half has no space), grouped by source and section. When mode is omitted it defaults to sections for source: all without a filter, and pages otherwise - start with the TOC, then drill into one source or section. The pages listing is paged - also for a single source: 50 pages per call by default and 100 at most, with offset/limit; the response says how many pages remain and which offset continues. An offset beyond the listing is an error.
Input Parameters:
Parameter | Type | Default | Description |
|
|
| Restrict listing to one documentation source |
| string (≤64 chars) | (none) | Case-insensitive substring filter on the section, e.g. |
|
| (smart) |
|
| number (≥0) |
|
|
| number (1–100) |
|
|
Structured output: mode, total (pages matching the filters), message (what is shown and how to continue), sections[] (source, section, pages - in sections mode), pages[] (title, url, path, description, source, section - in pages mode), offset, nextOffset? (absent at the end) and failedSources[].
Example Prompts:
"What documentation exists for the Magic Lane Android SDK?"
"List all Magic Lane docs pages about routing and navigation"
"List the iOS SDK examples for Maps & 3D Scene"
"Show every Cloud REST API guide grouped by section"
"Which migration guides exist for the Flutter SDK?"
"List the TypeScript SDK pages in the Places & Search section"
5. Code Example Extraction (get_code_examples)
Extract only the code blocks from a page, skipping the prose - cheaper than reading the whole page when only the sample code matters. Each block is labelled with the heading above it and its caption ("Request Body"), so you can tell which step it belongs to. Fences may be indented (inside list items); a block indented four columns beyond its list item (an indented code block) counts too, tagged text as a fence that names no language is (the language: text filter finds both), and headings are read as CommonMark does (a setext underline heads the paragraph above it, closing #s are dropped). Blocks come in order up to a character budget; a longer block is split into parts, and the response says which offset continues.
When the page has no matching block, the response lists the languages it does have and points to nearby pages of the same source that hold code - the pages below it, related pages, or, for an example page, the guides on its topic - with how many matching blocks each has.
Input Parameters:
Parameter | Type | Default | Description |
| string (1–500 chars) | required | Absolute |
| string (≤64 chars) | (none) | Only return blocks with this language tag; aliases are honoured ( |
| string (≤64 chars) | (none) | Only return blocks whose caption contains this text (case-insensitive): |
| number (≥0) |
| Skip this many matching blocks (for paging; a block split into parts counts each part) |
| number (1–50,000) |
| Character budget for the returned code; a longer block is split into parts of at most the budget less about 200 characters for the header - at most 2,000 when the budget is smaller, so a budget below that still returns one such part (a block's last part is whatever is left) |
Example Prompts:
"Show me just the Dart code from the Calculate Route example"
"Get the Kotlin snippets for adding markers on Android"
"Extract the Swift code from the iOS center-map example"
"Give me only the JSON request bodies from the Fleet Management add-optimization guide"
"Pull the C++ code from the fleet-management example"
6. Cross-SDK Lookup (find_across_sdks)
Returns the best-matching page(s) for one topic in every source, side by side. Platform and comparison words (iOS, cloud, vs, …) are ignored unless part of a feature name ("Android Auto"), a page title or the product name ("rest api"); "flutter vs android" gets each platform's overview page. A source reports (no match) unless a page covers half the topic in its title or description and is about its most specific word (in its title or section, or in its description or path with every other word). Short topics must match in full; when no page is headed with a word, a page whose full text names it at least twice answers, flagged onlyInText. Action and setup words may be missing. Passing mentions are left to search_docs. An unloaded index shows (index not loaded: <reason>).
Input Parameters:
Parameter | Type | Default | Description |
| string (1–300 chars) | required | The topic to look up, e.g. |
| number (1–5) |
| How many matches to return per source |
Structured output: query, topic (the query without platform words), message, sources[] - one per source, in a fixed order: source, name, status (matched, no match or index not loaded with reason), matches[] (title, url, path, description, source, section, and onlyInText?: the topic words a page covering part of the topic lacks in its title, section and description, which its own text names) - unverified[] (word, source: platform words left out of the topic that could not be checked against their platform's titles because that index did not load, so one may be part of a feature name) and failedSources[] (a failed full-text file leaves its source's pages that lack a word of the topic unchecked, and unlisted).
Example Prompts:
"How do I add markers on iOS vs Android vs Flutter?"
"Find the offline maps documentation for every SDK"
"Compare how turn-by-turn navigation is documented across all platforms"
"Which SDKs document weather services, and where?"
"Find the search/geocoding page in each SDK - give me 2 matches per source" (
limitPerSource: 2)"Where is public transit routing covered on each platform?"
7. Recency Tracking (list_recent_updates)
List the documentation pages updated in the last N days, per source, from the "Last updated" date each page carries (no extra fetches). The window counts whole days in UTC: days: 1 is yesterday and today (and a page dated tomorrow, as a time zone ahead of UTC may date it); each line gives the date, title, source and page URL, newest first. When nothing changed in the window, the response lists the newest pages instead, so a quiet fortnight is not an empty answer.
Input Parameters:
Parameter | Type | Default | Description |
| number (1–365) |
| Look-back window in calendar days (UTC), inclusive |
| source id |
| Restrict to one documentation source |
| number (1–100) |
| Maximum number of pages to report |
| number (≥ 0) |
| Pages of the window, newest first, to skip: the |
Structured output: days, source, message, total (pages dated within the window), updates[] (limit of them from offset: title, source, date, url?, path?), offset, nextOffset? (the offset that lists the next pages; absent at the end), newestDate? (the newest date among the selected sources' pages), newestPages[] (only when updates is empty: their newest pages, all older than the window) and failedSources[].
Example Prompts:
"What changed in the iOS SDK docs this month?"
"Which Cloud REST API pages were updated in the last 90 days?"
"Show me everything updated across all SDK docs in the last week" (
days: 7)"List the 10 most recently updated Android SDK pages this year" (
days: 365, limit: 10)"Did the iOS SDK docs change since our last release four weeks ago?"
8. Product Guides (get_product_guide)
Return the official documentation for a Magic Lane product - use it for questions about the products themselves rather than the Maps SDKs:
mcp-server- the geospatial MCP that gives AI agents location search, multi-modal routing, isochrone analysis, reverse geocoding, geofence management, and map rendering. Sections:overview,usage-guidelines(default).map-studio- Magic Lane Studio (formerly Map Studio), the web-based visual editor for creating, testing, and publishing custom map styles. Sections:overview(default),create-a-map-style,customize-map-style,download-style. The Developer site is replacing the Map Studio pages with the Magic Lane Studio guide (getting-started/create-a-style,tutorials/first-style,getting-started/download-and-use); each section is read from the location the documentation index lists, trying the new one first and then the old one, so the tool works before and after the switch.
The sections share a 120,000-character budget, at most 50,000 each (longer pages say where to continue with read_doc). Sections that fail to load are reported individually; the call is an error only when every section failed.
Input Parameters:
Parameter | Type | Default | Description |
|
| required | Which product guide to return |
| section id | | (product default) | Which guide section; |
Example Prompts:
"How should my agent use the Magic Lane MCP Server tools effectively?"
"What is the Magic Lane MCP Server and how do I connect to it?"
"What is Map Studio and what can I do with it?"
"How do I create a custom map style and use it in my app?" (
product: map-studio, section: create-a-map-style)"Give me the complete Map Studio documentation" (
section: all)
Resources
The raw llms.txt indexes are also exposed as MCP resources:
Resource | URI |
Magic Lane Guides index |
|
Maps SDK for Flutter index |
|
Maps SDK for Android index |
|
Maps SDK for iOS index |
|
Maps SDK for C++ index |
|
Maps SDK for TypeScript index |
|
Cloud REST APIs index |
|
Troubleshooting
Common Issues
Client-specific checks (the tools picker, approvals, reloading the window) are in each guide's Verify section, and HTTP status codes (400, 403, 404, 405, 406, 408, 413, 429, 503, EADDRINUSE) in HTTP server › Troubleshooting.
Server won't start - Ensure Node.js 22+ (
node --version) and thatnpm run buildcompleted; the stdio entry isdist/docs-server.esm.js.node src/docs-server.tscannot work - usenpm run devfor the sources.## Sources not loadedin a tool response - one or morellms.txt/llms-full.txtfiles could not be loaded; results from those sources are missing. The note says whetherdeveloper.magiclane.comcould not be reached or a file was published empty - either way not a documentation gap. When no source loads at all the call is an error.Empty search results - Try broader keywords, or browse with
list_docsfirst.Stale content - Fetched pages and indexes are cached in memory for 1 hour (and served stale when a refresh fails); restart the server to force a refresh.
Common Error Messages
Message | Meaning |
| The path is not a markdown page (the site answered with its HTML shell) - discover URLs via search or listing |
| The resource does not exist; remembered for 60 s |
|
|
|
|
| No requested source could be loaded. The message says which: developer.magiclane.com could not be reached (it then adds "retry shortly"), or it answered without a usable file (not found, HTML, empty) - a retry will not help |
| HTTP transport under load: the outbound queue is full |
| HTTP transport: one client's budget of new page fetches is spent; pages already read stay available |
Privacy Policy
Data Collection: This server collects nothing. There is no telemetry, no analytics, and no logging of queries beyond the local process's stderr.
How Data Is Used: Tool inputs are used solely to fetch and rank publicly available documentation from developer.magiclane.com.
Data Storage & Retention: Fetched pages and indexes are held in memory only and discarded when the process exits; an entry is refreshed after an hour (and served as it was when a refresh fails). Nothing is written to disk.
Third-Party Data: The only outbound requests are to developer.magiclane.com. No data is shared with any other party.
Support
Documentation: developer.magiclane.com/docs
API Dashboard: developer.magiclane.com/api/dashboard
GitHub Issues: github.com/magiclane/magiclane-mcp-docs-server/issues
Developer Portal Support: Contact support through the developer portal
Available Tools
8 toolsfind_across_sdksFind a topic across all Magic Lane SDKsARead-onlyIdempotent
Given one topic (e.g. "add markers", "calculate route", "offline maps"), return the best-matching documentation page(s) for EVERY source side by side — developer guides, the Maps SDKs for Flutter, Android, iOS, C++, TypeScript, and the Cloud REST APIs. Ideal for cross-platform comparisons ("how do I do X on iOS vs Android"; platform names in the query are ignored unless they are part of a feature name, such as "Android Auto", or of a page's title, such as "integrate the sdk", or name the product itself, such as "REST API" — a query that is the title of one of the Cloud REST APIs, such as "geofences api", is answered by that API alone; a query about the platforms themselves, such as "flutter vs android", is answered by each named platform's own overview page). A source reports "(no match)" unless a page matches at least half of the topic words (half in its own title or description, not only in its section) and is about the most specific one: it is in the page's title or section, or in its description or path with every other word too (every word when even that one is common, such as "map"). A topic of one or two words must match in full, and a single one must head the page — unless the title holds the query's other word ("Update Content" for "update maps"), or no page is headed with the word the page lacks there — no page of its source for a word its index entry lacks, no page at all for a single word (never a word next to "API"): then a page whose own text (llms-full.txt) names the missing word at least twice answers, marked as covering part of the topic ("landmark store"; the Cloud's Territory for "generate territories"), and a page whose description names the single word as written (not "key" for "token") in its first sentence and its first two thirds answers when its text names it again ("waypoints"); a page may always lack an action word ("upgrade to 3.1.4") or the words of setting up ("set up navigation"). A word the page has only in its section does not count when its own title and description hold less than half of the query's words ("handle route events" is not "Social Event Voting", filed under Routing & Navigation). A page that only mentions the topic in passing is not listed; search_docs finds those.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | The topic to look up in every SDK, e.g. "add markers". | |
| limitPerSource | No | How many matches to return per source. |
Output Schema
| Name | Required | Description |
|---|---|---|
| query | Yes | |
| topic | Yes | The query without platform and comparison words — what was looked up. |
| message | Yes | A one-line summary of the result. |
| sources | Yes | Every documentation source, in a fixed order. |
| unverified | Yes | Platform words left out of the topic that could not be checked against their platform's page titles (the index of `source` did not load), so one may be part of a feature name ("Android Auto") instead. |
| failedSources | Yes | Source files that could not be loaded: "index" (llms.txt) or "full-text" (llms-full.txt) — a problem with the files on developer.magiclane.com or with reaching it, never a gap in the documentation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so safety is covered; the description still adds real behavioral context beyond them, notably that every source returns a row and that a source reports "(no match)" rather than being omitted. It also discloses the per-source answer shape (side-by-side), which the caller could not infer from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The body is a single sprawling run-on laced with nested parentheticals and semicolon-chained exceptions, making it hard to parse even though the purpose statement is front-loaded. Much of the detail is arguably necessary spec, but it is delivered as an undifferentiated wall of clause stacking rather than structured rules.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return shape need not be explained, and the description is unusually exhaustive about matching thresholds, fallbacks, and exclusion rules. The main residual gap is that limitPerSource's effect on output (up to 5 per source) is only in the schema, not the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine semantics for the query parameter that the schema does not: platform names are ignored unless they are feature names ("Android Auto"), page titles, or the product itself ("REST API"). limitPerSource is left entirely to the schema, which is acceptable given its inline description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening clause gives a precise verb and resource ("Given one topic... return the best-matching documentation page(s) for EVERY source side by side") and explicitly enumerates the sources covered. It is clearly distinguishable from read_docs_batch, list_docs, and search_docs, which the description names as the tool for pages that only mention a topic in passing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the ideal use case ("cross-platform comparisons") and names an explicit alternative, search_docs, for loose mentions, which is genuine routing guidance. However, these cues are buried mid-paragraph rather than front-loaded, and there is no clear when-not-to-use framing against the other siblings such as get_product_guide or read_doc.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_code_examplesGet code examples from a Magic Lane documentation pageARead-onlyIdempotent
Extract only the code blocks from a Magic Lane documentation page (by URL or /docs/... path), skipping the surrounding tutorial prose. Optionally filter by language tag (e.g. dart, kotlin, swift, cpp, typescript, json, shell) and by caption — the line that introduces a block, such as "Request Body" or "Response Body" on the REST API pages. Each block comes with its nearest heading and caption. Much cheaper than read_doc when only the sample code matters. Long pages are paged: the response says how many blocks remain and which offset continues; a block longer than the budget comes in parts. When a page has no matching block, the response names the languages it does have and the pages below it (or related pages, or for an example page the guides on its topic) that hold such blocks, with counts — listed unchecked when the page contents cannot be loaded, and not at all, saying so, when the index cannot be loaded in time.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Absolute developer.magiclane.com URL or a /docs/... path of the page. | |
| offset | No | Skip this many matching blocks (for paging through pages with many examples). A block longer than maxChars is split into parts, and each part counts as one block here. | |
| caption | No | Only return blocks whose caption — the label line introducing the block, e.g. "Request Body" or "Response Body (error code 200)" — contains this text (case-insensitive). Only labelled blocks match: on the REST API pages caption: "request" keeps the labelled request bodies; a request body that follows a field list without a label is not found this way. | |
| language | No | Only return blocks with this language tag (aliases like ts/kt/c++/yml are honoured). | |
| maxChars | No | Character budget for the returned code (default 24000, at most 50000). A longer block is returned in parts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld/idempotent annotations, the description discloses real behavioral traits: long pages are paged with a stated remaining-count and offset, oversized blocks are returned in parts, and there are two degraded fallback modes when no block matches (listing languages/pages with counts; "listed unchecked" when contents can't load, silent-with-notice when the index times out). That is well beyond what the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and the read_doc comparison are front-loaded, and every sentence carries operative information. The final sentence, however, is an over-packed clause chain ("listed unchecked when... and not at all, saying so, when...") that costs readability, and some caption/offset detail overlaps the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden itself: it explains that each block arrives with its nearest heading and caption, how paging metadata is reported, and what the response looks like when nothing matches. For a read-only extraction tool with 5 params, nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the schema itself documents url/offset/caption/language/maxChars thoroughly, so the baseline is 3. The description still adds value by enumerating concrete language tags (dart, kotlin, swift, cpp, typescript, json, shell) where the schema has no enum, and by restating the caption concept with page-specific examples like "Request Body" on REST API pages.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb+resource: "Extract only the code blocks from a Magic Lane documentation page", and explicitly contrasts with the sibling read_doc ("Much cheaper than read_doc when only the sample code matters"). It also states the input address form (URL or /docs/... path), so an agent can immediately tell this apart from read_doc or search_docs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names the alternative (read_doc) and the condition that selects this tool: when only the sample code matters. It also implies when-not use via "skipping the surrounding tutorial prose". There is no explicit exclusion for the other siblings (find_across_sdks, search_docs), so it stops short of a full routing guide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_product_guideGet official Magic Lane product guidesARead-onlyIdempotent
Return the official documentation for a Magic Lane product. Products: "mcp-server" — the geospatial MCP giving AI agents location search, multi-modal routing, isochrone analysis, reverse geocoding, geofence management and map rendering (sections: overview, usage-guidelines; default usage-guidelines); "map-studio" — Magic Lane Studio (formerly Map Studio), the web-based visual editor for creating, testing and publishing custom map styles (sections: overview, create-a-map-style, customize-map-style, download-style; default overview). A finished style is published by downloading it as a .style file and loading that file in the app — there is no separate publish step, and download-style is the section that covers it. Use section "all" for the complete set in reading order. Use this for questions about the products themselves rather than the Maps SDKs.
| Name | Required | Description | Default |
|---|---|---|---|
| product | Yes | Which product guide to return. | |
| section | No | Which guide section; omit for the product default, or "all" for every section in order. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so safety is covered; the description adds real behavioral detail beyond them, namely product-specific default sections and that "all" returns sections in reading order. It also clarifies a domain nuance that the publish flow is a download step, which prevents a wrong lookup. Return shape/pagination is not described, but a static doc fetch has little to disclose.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and every clause is dense but relevant; the per-product section lists map cleanly onto the enum values. It is somewhat long for a two-parameter fetch, and the embedded note about publishing via .style download is guide content rather than invocation guidance, which is minor waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only documentation fetch with full schema coverage and annotations carrying the safety profile, the description covers selection, defaults and ordering. The only omission is any hint of output size or format, which matters modestly given there is no output schema and "all" can return a large set.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description exceeds it by spelling out what each product's default section actually is (mcp-server → usage-guidelines, map-studio → overview) and what "all" yields. That is meaning the enum schema alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Return the official documentation for a Magic Lane product") and enumerates the exact products covered, so the agent knows precisely what comes back. The closing clause ("questions about the products themselves rather than the Maps SDKs") implicitly separates it from read_doc/search_docs/find_across_sdks, though it never names those siblings directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear when-to-use rule (product-level questions, not SDK questions) plus concrete defaults per product and the meaning of section "all" in reading order. It stops short of naming an explicit alternative tool to use for SDK questions, leaving that routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_docsList Magic Lane documentation pagesARead-onlyIdempotent
Browse the Magic Lane documentation index (llms.txt). mode "sections" returns a compact table of contents (sections with page counts); mode "pages" lists pages with title, URL and the description (one over 200 characters cut to its first sentence, or at a word — where the room ends when its second half has no space; search_docs gives it whole), 50 per call by default, 100 at most (page with offset). When mode is omitted it defaults to "sections" for source "all" without a section filter, and "pages" otherwise. Start with the TOC, then drill into one source/section with mode "pages".
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | "sections" = compact TOC with page counts; "pages" = full page list. See default above. | |
| limit | No | In "pages" mode: pages per response (default 50, at most 100). | |
| offset | No | In "pages" mode: skip this many pages (for paging through a long listing). | |
| source | No | Restrict listing to one documentation source. | all |
| section | No | Optional case-insensitive filter on the section, e.g. "routing" or "Examples › Maps & 3D Scene". Sections mirror the documentation URL: "Examples › <category>" and "Guides › <topic>". |
Output Schema
| Name | Required | Description |
|---|---|---|
| mode | Yes | |
| pages | Yes | "pages" mode: the pages of this slice. Empty in "sections" mode. |
| total | Yes | Pages matching the source and section filters. |
| offset | Yes | "pages" mode: position of the first page of this slice. |
| message | Yes | What the listing shows and how to continue (paging, or how to drill down). |
| sections | Yes | "sections" mode: every section with its page count. Empty in "pages" mode. |
| nextOffset | No | "pages" mode: offset of the next slice; absent at the end. |
| failedSources | Yes | Source files that could not be loaded: "index" (llms.txt) or "full-text" (llms-full.txt) — a problem with the files on developer.magiclane.com or with reaching it, never a gap in the documentation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, open-world, so the bar is lower, but the description still adds real behavior: 50-per-call default with a 100 hard cap, offset paging, and the description-truncation rule (cut to first sentence or at a word). It does not discuss ordering of results or whether the index is cached, which would be the remaining gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and no sentence is wasted, but the middle sentence is a single sprawling run-on with nested parentheticals ("or at a word — where the room ends when its second half has no space") that takes several passes to parse. Splitting mode behavior, limits, and truncation into separate sentences would improve scanability without losing content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter, all-optional listing tool with a full output schema and annotations, the description covers the workflow, mode defaults, pagination, and truncation caveat. The only soft spot is the ambiguous truncation phrasing, which could leave an agent unsure whether a description was cut mid-sentence and whether to re-fetch via search_docs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all five parameters, and the 3 baseline applies. The description does add the non-obvious conditional default resolution for mode ("sections" only for source "all" with no section filter, "pages" otherwise), which the schema explicitly defers to it — a genuine value-add that keeps this from being pure repetition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Browse the Magic Lane documentation index (llms.txt)") and immediately splits the behavior into two named modes with distinct outputs. It is clearly distinguishable from siblings like read_doc, search_docs, and read_docs_batch, which operate on individual documents rather than the index.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit workflow: "Start with the TOC, then drill into one source/section with mode 'pages'," and routes a narrow case (full untruncated descriptions) to search_docs. What is missing is a stated when-not-to-use — e.g. that full-text or concept lookups should skip this tool entirely in favor of search_docs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_recent_updatesList recently updated Magic Lane documentationARead-onlyIdempotent
Report which documentation pages were updated within the last N days, per source, using each page's embedded 'Last updated' date. Useful for tracking SDK documentation changes without re-reading everything. Covers every source, including the developer guides. When nothing falls in the window, the response names the newest date there is and lists the newest pages.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Look-back window in calendar days (UTC), inclusive: 1 = yesterday and today. | |
| limit | No | Maximum number of pages to report. | |
| offset | No | How many of the window's pages, newest first, to skip: the nextOffset of the previous answer. | |
| source | No | Restrict to one documentation source. | all |
Output Schema
| Name | Required | Description |
|---|---|---|
| days | Yes | |
| total | Yes | Pages dated within the window (updates holds `limit` of them from `offset`). |
| offset | Yes | |
| source | Yes | |
| message | Yes | A one-line summary of the result. |
| updates | Yes | Pages dated within the window, newest first. |
| newestDate | No | The newest "Last updated" date among the selected sources' pages (absent when none carries one). |
| nextOffset | No | The offset that lists the next pages; absent at the end. |
| newestPages | Yes | Only when updates is empty: the newest pages the selected sources have, all older than the window. |
| failedSources | Yes | Source files that could not be loaded: "index" (llms.txt) or "full-text" (llms-full.txt) — a problem with the files on developer.magiclane.com or with reaching it, never a gap in the documentation. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, but the description adds genuinely new behavior: the recency signal comes from each page's embedded 'Last updated' date, and the empty-window case degrades gracefully by naming the newest date and listing newest pages. That fallback behavior is exactly the kind of context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and scoping, then the use case, then the empty-result behavior. Four sentences with little waste, though 'Covers every source, including the developer guides' is marginally redundant with the source parameter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and covers return shape, and the description usefully documents the no-results fallback. The one gap is that pagination (limit/offset and the nextOffset chaining) is never mentioned in the description, which matters for an agent iterating over a window, though the schema does document it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all four parameters (days, limit, offset, source) are fully self-documented, establishing a baseline of 3. The description reinforces 'last N days' and 'per source' but adds no syntax, format, or interaction detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('report which documentation pages were updated') plus scope ('within the last N days, per source') and the underlying data source ('embedded Last updated date'). The phrase 'tracking SDK documentation changes without re-reading everything' implicitly separates it from read_doc/read_docs_batch, so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use context ('tracking SDK documentation changes without re-reading everything') and states the coverage scope ('every source, including the developer guides'). It does not explicitly name alternatives like search_docs or list_docs or state when NOT to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_docGet a Magic Lane documentation pageARead-onlyIdempotent
Fetch the markdown content of a specific Magic Lane documentation page by URL or docs path (e.g. "/docs/guides/get-started" or "https://developer.magiclane.com/docs/flutter/..."). Use search_docs or list_docs first to discover page URLs. Only https://developer.magiclane.com URLs are accepted — never pass URLs from other map providers' documentation (e.g. HERE, Google Maps, Mapbox). Returns up to 24000 characters per call by default; long pages say how many characters remain and which offset fetches the next chunk.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Absolute developer.magiclane.com URL or a /docs/... path of the page to fetch. | |
| offset | No | Character offset to start from (for paging through long pages). | |
| maxChars | No | Maximum characters to return from the offset (default 24000, at most 50000). The response says how to fetch the next chunk. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description still adds real behavior beyond them: a 24000-character default return cap, a notice of remaining characters, and the offset mechanism for continuing — though it says nothing about auth, rate limits, or error behavior on non-Magic Lane URLs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with the action and input forms, then discovery guidance, then the URL restriction, then pagination. Every sentence carries a distinct instruction with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must explain what comes back; it does so (markdown content, truncation notice, offset paging). Combined with full schema coverage and annotations, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes slightly further by giving concrete URL and /docs/... path examples for `url` and by explaining the offset/chunk relationship for paging, though maxChars is essentially restated from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch the markdown content of a specific Magic Lane documentation page') plus the two accepted identifier forms, which cleanly separates it from search_docs, list_docs, and the batch sibling read_docs_batch.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes discovery to 'search_docs or list_docs first' and states a hard exclusion: only developer.magiclane.com URLs, never other map providers' docs. That is a when-to-use plus a when-not-to-use rule in one place.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_docs_batchGet multiple Magic Lane documentation pagesARead-onlyIdempotent
Fetch up to 20 Magic Lane documentation pages in a single call: at most 20 URLs are accepted, a longer array is refused with that limit, and one of 256 values or more is refused outright, without naming it. Returns the markdown content of each page; pages that fail to load are reported individually, and the call is an error only when every page failed. The page text is capped at 120000 characters shared across the pages (headers and error notes come on top) — a page cut short says where to continue with read_doc.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | Absolute developer.magiclane.com URLs or /docs/... paths to fetch. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, openWorld, idempotent), it discloses the per-URL failure model, the aggregate error condition (error only if every page failed), the shared 120000-character text cap, and truncation reporting — exactly the operational detail annotations cannot carry. The clause about '256 values or more is refused outright, without naming it' is opaque and adds confusion rather than usable behavior information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the operation and its size limit, then return shape, then truncation — a logical order with little waste. The garbled '256 values' clause costs it, since it consumes a sentence without conveying an actionable rule.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates fully by describing the return value (markdown per page), partial-failure reporting, the all-failed error condition, and the shared character budget. An agent can call this correctly and interpret every outcome without further documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter already documents URL format, maxItems 20, and length bounds, so the schema does the heavy lifting. The description restates the 20-URL limit rather than adding new meaning about the array's contents or ordering; the minimum viable baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first clause gives a specific verb, resource, and scope: fetch up to 20 Magic Lane documentation pages in one call, which is clearly distinguishable from the single-page sibling read_doc and the listing/search siblings. It also names read_doc as the continuation path for truncated pages, so an agent can place the tool precisely.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is clearly implied and scoped: batch fetch up to 20 URLs, then fall back to read_doc to continue a truncated page. It lacks an explicit 'use this instead of X when Y' statement against search_docs, find_across_sdks, or list_docs, so routing among the discovery tools is left partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_docsSearch Magic Lane documentationARead-onlyIdempotent
Search the Magic Lane developer documentation (developer.magiclane.com): developer guides (account setup, API keys, Map Studio, Magic Lane MCP Server) and the Maps SDKs for Flutter, Android, iOS, C++, and TypeScript (maps & 3D scene, markers, places & search, routing & navigation, positioning, offline maps, weather, fleet management, migration guides), and the Cloud REST APIs (routing, isochrones, search, reverse geocoding, fleet management, geofences, vector tiles, offline maps). Name a platform in the query ("get started flutter") to search only that platform's pages; a name that is an everyday word too (cloud, web, rest, compose) only ranks its pages higher, unless "SDK", "API" or another name of the same platform is next to it ("cloud API", "web SDK", "REST cloud"). Returns matching page titles, URLs and descriptions from the documentation index, plus optional full-text excerpts. Follow up with read_doc to read a full page. ALWAYS use this tool for Magic Lane questions — never web search, prior knowledge, or other map providers' sites (HERE, Google Maps, Mapbox, TomTom): their APIs are not compatible with the Magic Lane SDKs.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results. | |
| query | Yes | Free-text search query, e.g. "draw route on map" or "geocoding". | |
| source | No | Restrict the search to one documentation source. | all |
| includeFullText | No | Also search full page contents (llms-full.txt) and return excerpts, not just index titles/descriptions. |
Output Schema
| Name | Required | Description |
|---|---|---|
| results | Yes | Index matches, best first. |
| excerpts | Yes | Full-text matches, best first (empty when includeFullText is false). |
| searched | No | Present when a platform name in the query narrowed the search ("get started flutter") or left the search words: the query searched — without the platform name, or the whole query when nothing else matched there and the platform's overview page names the topic ("rest api authentication") — and the sources it was searched in: the platform's, plus the developer guides for an API-key question ("rest api key"). |
| elsewhere | No | Present when the topic matched no page of the platform the query names: the other sources whose best page for it is titled with a word of it (search without the platform name to see them). |
| preferred | No | Present when a word that is also a platform name ("cloud geocoding", "web markers") ranked that platform's pages higher without leaving the others out: those sources. |
| unverified | No | Present when a platform word left out of the search words could not be checked against its platform's page titles (that index did not load), so it may be part of a feature name ("Android Auto") instead. |
| failedSources | Yes | Source files that could not be loaded: "index" (llms.txt) means the source's pages were not ranked, "full-text" (llms-full.txt) that no excerpts came from it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld), so the description's job is to add ranking and scoping behavior — which it does: platform names in the query narrow results, everyday-word names like 'cloud'/'web'/'rest' only re-rank unless adjacent to 'SDK'/'API'. It also states what comes back (titles, URLs, descriptions, optional excerpts). It does not describe result ordering or how limit interacts with ranking, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then query semantics, then return shape, then the routing rule — a sensible order. It is dense and the long parenthetical feature lists (markers, places & search, routing & navigation, positioning, offline maps, weather, fleet management) cost length, but each sentence still carries information an agent would otherwise have to guess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with an output schema already documenting return shape, the description covers corpus scope, the tricky query-parsing rules, the full-text toggle, and the handoff to read_doc. An agent has everything needed to call it correctly and interpret the results without consulting another tool's definition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline would be 3, but the description adds real meaning beyond the schema: it explains the non-obvious matching semantics of the 'query' parameter (platform-name scoping vs. mere re-ranking, and the adjacency rule) and clarifies that 'includeFullText' searches llms-full.txt page bodies rather than just index metadata. It does not explain the 'source' enum's relation to naming a platform in the query, which is a small residual overlap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Search the Magic Lane developer documentation') and immediately enumerates the corpus: developer guides, five SDK platforms, and Cloud REST APIs. An agent can tell at a glance this is the index-search tool, distinct from siblings like list_docs, read_doc, and find_across_sdks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('ALWAYS use this tool for Magic Lane questions'), explicit when-not ('never web search, prior knowledge, or other map providers' sites'), names the incompatible competitors, and prescribes the follow-up workflow ('Follow up with read_doc to read a full page'). The routing to the sibling is spelled out rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v1.0.0- First observed
find_across_sdks - First observed
get_code_examples - First observed
get_product_guide - First observed
list_docs - First observed
list_recent_updates - First observed
read_doc - First observed
read_docs_batch - First observed
search_docs
TDQS
Scored across 8 tools
Each tool is anchored to a distinct retrieval mode: index browsing (list_docs), keyword search (search_docs), single-page fetch (read_doc), batch fetch (read_docs_batch), code-only extraction (get_code_examples), cross-SDK topic matching (find_across_sdks), recency (list_recent_updates), and curated product docs (get_product_guide). The main soft spots are search_docs vs find_across_sdks (keyword vs per-source topic) and get_product_guide vs read_doc, which overlap but are disambiguated by the verbose descriptions. The sheer density of each description helps precision but makes boundaries slower to grasp.
Uniform snake_case verb_noun pattern across all eight tools: read_doc, read_docs_batch, list_docs, list_recent_updates, get_code_examples, get_product_guide, search_docs, find_across_sdks. The verbs (read/list/get/search/find) map predictably to retrieval semantics, and singular/plural (read_doc vs read_docs_batch) correctly signals cardinality.
Eight tools is well within the sweet spot for a documentation server, and each earns its place: browsing, searching, single read, batch read, code extraction, cross-platform comparison, recency, and product docs. No redundant or filler tools are present.
The surface covers the full discovery-to-retrieval lifecycle (TOC → search → read → batch → code snippets) plus niche needs like cross-SDK comparison and recent changes, with pagination/continuation handled everywhere. Minor gaps: no explicit tool to enumerate available sources/sections metadata beyond list_docs modes, and no dedicated API-reference or schema lookup, though find_across_sdks partly covers REST API discovery.
Maintenance
Related MCP Connectors
Provides AI assistants with direct access to Mapbox developer APIs and documentation.
Provide your AI coding tools with token-efficient access to up-to-date technical documentation for…
Versioned documentation registry and semantic search for AI tools and coding assistants.
Routing, geocoding, places, matrix and map tools for location-aware AI workflows.
Related MCP Servers
- AlicenseCqualityCmaintenanceProvides real-time access to up-to-date library documentation and code examples for any programming library. Helps AI coding assistants deliver accurate, current information instead of relying on outdated training data.16 npmMIT
- AlicenseAqualityDmaintenanceEnables AI assistants to search and access Google Cloud Platform documentation in real-time, supporting 20+ GCP services with natural language queries and smart content extraction.4MIT
- AlicenseAqualityBmaintenanceEnables AI assistants to access Google Maps services including places search, details, directions, geocoding, and nearby search through natural language.671 PyPI2MIT

mapbox-docsofficial
AlicenseAqualityCmaintenanceProvides AI assistants with instant access to Mapbox documentation and reference materials through tools and resources, with no Mapbox access token required.3129 npm1MIT