Wunder Mobility MCP
Give your AI coding assistant live knowledge of the Wunder Mobility API.
This is a Model Context Protocol (MCP) server that puts the full Wunder Mobility public API documentation — every guide, every endpoint, every request/response schema — directly inside your AI assistant.
Instead of copy-pasting docs or hoping your assistant's training data is up to date, you can just ask:
"What endpoints do I need to build a payment flow for my users?" "Show me the full spec for creating a booking." "How does vehicle discovery work in the User API?"
…and get back cited answers with deep-links straight to docs.wundermobility.services.
Works with Claude Code, Cursor, Windsurf, VS Code with Copilot, and any other MCP-compatible client.
What it does
The MCP server exposes twelve tools your assistant can call automatically. It reads like a book: the list first, then the outline of one document, then one section. For an exact code or name, a finder lists every place it appears.
| Tool | What your assistant uses it for |
|---|---|
list_guides() |
"What is documented at all?" — every guide with its group and a one-line description. The start for any question about a concept, a rule, a flow or an error code. |
get_guide_outline(slug) |
"What sections does the Error Codes guide have?" — the guide's table of contents: section id, title, level and size in tokens. |
get_guide_section(slug, section_id) |
"Show me the section on rental errors." — one section, word for word, with the guide title, the section path and the link. |
list_tags(api) |
"What areas does the Operations API have?" — the tag names to narrow list_endpoints with, and how many endpoints each holds. |
list_endpoints(api, tag?) |
"What endpoints exist in the User API under Payments?" — browse by API namespace and tag. |
get_endpoint_spec(operation_id) |
"Give me the exact request/response schema for this endpoint." — the OpenAPI operation with its schema references expanded, so the field names are there. |
find_in_api_docs(text, limit?) |
"Where does R256 appear?" — every place an exact text appears, in a fixed order: endpoints whose id, path, summary or description holds it, then guide sections, then endpoints that hold it only in their request or response fields. No ranking. At most 50 places per call (limit); truncated is true when there are more. |
list_snowflake_tables() |
"What tables are documented in the Snowflake warehouse?" — lists every documented table with primary key and description. |
get_snowflake_table(name) |
"Show me the columns, types, and descriptions for the bookings table." — returns the table's primary key, description, and full field list (case-insensitive name lookup). |
list_data_guides() |
"How is a KPI defined?" — the Snowflake data guides (KPI definitions, reporting how-tos, the data inventory) with their size. |
get_data_guide(slug) |
"Show me the KPI report documentation." — one data guide, in full. |
find_in_data_docs(text, limit?) |
"Which tables have a branch_id column?" — every place an exact text appears, in a fixed order: tables (with the notes on their pages), then fields table by table, then data guides. No ranking. At most 50 places per call (limit); truncated is true when there are more. |
Every result includes a deep-link so you (or your assistant) can open the same content in a browser.
Docs are pulled live from the public Wunder docs sites (api.docs.wundermobility.services and data.docs.wundermobility.services) on every startup and cached locally — so your assistant always has the current API and data-warehouse schema, not a stale snapshot. The fetch is unauthenticated and never committed.
Install
Option A — uvx (recommended, no cloning needed)
uvx runs the package directly from PyPI — no Python environment setup, no cloning.
Install uv if you don't have it:
curl -LsSf https://astral.sh/uv/install.sh | sh # macOS / Linux
# or: brew install uv
# or: winget install astral-sh.uv # Windows
Claude Code:
claude mcp add wunder-api uvx wunder-mobility-mcp
Cursor — add to your MCP settings (~/.cursor/mcp.json or via Settings → MCP):
{
"mcpServers": {
"wunder-api": {
"command": "uvx",
"args": ["wunder-mobility-mcp"]
}
}
}
Windsurf — add to ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"wunder-api": {
"command": "uvx",
"args": ["wunder-mobility-mcp"]
}
}
}
Any client that accepts a command: use uvx as the command and ["wunder-mobility-mcp"] as the args.
On first start, the server fetches the latest docs from GitHub (~5–10s) and caches them locally. Every subsequent start is instant.
Option B — clone and run
If you'd rather run from source:
Prerequisites: Python 3.12+, git.
git clone https://github.com/Wunder-Mobility/public-api-mcp.git
cd public-api-mcp
make install
Claude Code:
claude mcp add wunder-api "$(pwd)/.venv/bin/wunder-mobility-mcp"
Cursor:
{
"mcpServers": {
"wunder-api": {
"command": "/path/to/public-api-mcp/.venv/bin/wunder-mobility-mcp"
}
}
}
Replace /path/to/public-api-mcp with your actual clone path (pwd inside the repo).
Verify it's working
Once connected, open your assistant and try:
- "Search the Wunder API docs for payment flow"
- "List all endpoints in the Wunder operations API"
- "Get the guide for user authentication"
You should see the tools being called and results coming back with Stoplight links.
How docs stay current
The docs are published to the public GitHub Pages site api.docs.wundermobility.services (and data.docs.wundermobility.services for the Snowflake data docs). On every server startup, this MCP mirrors the latest raw docs from those sites — driven by each site's toc.json — and caches them locally. No authentication, no manual sync, no stale snapshots.
To get the latest docs locally: restart your MCP server (or restart your editor). The cache lives at:
| OS | Cache path |
|---|---|
| macOS | ~/Library/Caches/wunder-mobility-mcp/public-api-docs |
| Linux | ~/.cache/wunder-mobility-mcp/public-api-docs |
| Windows | %LOCALAPPDATA%\wunder-mobility-mcp\Cache\public-api-docs |
Development
make install # create .venv, install package + dev deps
make test # run the test suite (requires network on first run)
make testfetches live docs from the public docs sites on the first run (~10s). Subsequent runs use the local cache.
Project structure
src/wunder_mcp/
docs_source.py # mirrors & caches the raw docs from the public Pages sites
catalog.py # builds the in-memory guide + endpoint catalog
guide_tree.py # a guide's table of contents: its sections and the text of each
find.py # exact-text finder (no ranking) over the API docs and the data docs
docs_links.py # parses toc.json and builds Stoplight deep-link URLs
openapi.py # loads and indexes OpenAPI specs
server.py # MCP tool definitions (FastMCP)
stdio.py # stdio entrypoint
Publishing a new version
- Bump
versioninpyproject.toml - Commit and tag:
git tag v0.x.x && git push --tags - The
publish.ymlworkflow builds and uploads to PyPI automatically via trusted publishing
One-time PyPI setup (before the first publish): go to pypi.org → your project → Publishing → add a trusted publisher with owner Wunder-Mobility, repo public-api-mcp, workflow publish.yml, environment pypi.
Troubleshooting
Failed to reconnect to wunder-api: ENOENT
What it means: Your AI client tried to restart the wunder-api server process but couldn't find the uvx executable. This happens because desktop apps and some editors launch with a minimal PATH that doesn't include the directory where Homebrew or uv installed uvx.
Fix — use the absolute path to uvx:
-
Find where
uvxlives on your machine:which uvxCommon locations:
- macOS (Apple Silicon / Homebrew):
/opt/homebrew/bin/uvx - macOS (Intel / Homebrew):
/usr/local/bin/uvx - Linux:
~/.local/bin/uvx
- macOS (Apple Silicon / Homebrew):
-
Re-register the server using that full path:
Claude Code:
claude mcp remove wunder-api claude mcp add wunder-api /opt/homebrew/bin/uvx wunder-mobility-mcp
Cursor / Windsurf / other JSON configs:
{ "mcpServers": { "wunder-api": { "command": "/opt/homebrew/bin/uvx", "args": ["wunder-mobility-mcp"] } } }
Replace
/opt/homebrew/bin/uvxwith the output ofwhich uvx.
Roadmap
- v0.1: read-only API docs search, public and unauthenticated, docs fetched live on startup.
- v0.2: Snowflake data-warehouse documentation search — operators can discover tables, columns, and enum meanings for SQL building without leaving their AI assistant.
- v0.6 (current): read the docs by table of contents (list, outline, one section) with an exact-text finder for codes and names. Both word-match searches (
search_guides_and_endpoints,search_snowflake_docs) andget_guideare removed. - v1.0: tools that call the live Wunder API directly (e.g.
create_test_booking), gated by a customer API key.
Metadata
Release files for wunder-mobility-mcp 0.6.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| wunder_mobility_mcp-0.6.0.tar.gz | 51.3 kB | With provenance | Details for wunder_mobility_mcp-0.6.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| wunder_mobility_mcp-0.6.0-py3-none-any.whl | Python 3 | none | any | Details for wunder_mobility_mcp-0.6.0-py3-none-any.whl |
Total release size: 87.9 kB
Release files / wunder_mobility_mcp-0.6.0.tar.gz
| Download URL | wunder_mobility_mcp-0.6.0.tar.gz |
|---|---|
| Size | 51.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7242d5ff33e71e68c98c95c262f15ed1a83fcc99c346b0f0673b218b6d058e8c
|
|
BLAKE2b-256 checksum How to use checksums |
a84fe0922b41c9f5f653138c62623208421369064df2b7a874cb1f66fe1090ed
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 27, 2026.
Transparency logRelease files / wunder_mobility_mcp-0.6.0-py3-none-any.whl
| Download URL | wunder_mobility_mcp-0.6.0-py3-none-any.whl |
|---|---|
| Size | 36.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9fdcd53b853239e9a0bad5218163ee70a38ede6c9e47a0bf480120a4263eed49
|
|
BLAKE2b-256 checksum How to use checksums |
6c10c24728aa380e54f3e659ceb3398794292e26ae7b9eb5d211d7d68d332d09
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 27, 2026.
Transparency logSecurity for wunder-mobility-mcp 0.6.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for wunder_mobility_mcp-0.6.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 27, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.