wigle-mcp
Allows searching and retrieving details of observed Bluetooth/BLE devices from WiGLE's wardriving database.
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., "@wigle-mcp search for open WiFi networks in downtown Seattle"
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.
wigle-mcp
An MCP server that exposes WiGLE.net wardriving lookups as tools for LLMs.
All tools are read-only. Responses are trimmed to compact summaries so agents stay within context limits and WiGLE query quota.
Tools
network_search — search observed WiFi networks by SSID, BSSID, bounding box, country/region/city, or encryption.
network_detail — look up a single BSSID; pass
include_locations=truefor capped sighting history.bluetooth_search / bluetooth_detail — same pattern for Bluetooth/BLE devices.
cell_search / cell_detail — same pattern for cell towers.
user_stats — WiGLE account stats (rank, discovered network counts).
site_stats — WiGLE-wide totals (networks, locations, users).
Related MCP server: pumperly-mcp
Query etiquette
WiGLE enforces per-account daily query limits (reset midnight US/Pacific; new accounts start low). The server validates requests and ships MCP server instructions to guide agents, but humans should know the rules too:
Always filter searches. Every
*_searchcall needs at least one filter (SSID, BSSID, geo fields, bounding box, encryption, etc.). Unfiltered searches are rejected before they hit the API.Paginate with
search_after. Responses include asearchAftercursor. Pass it assearch_afteron the next page — it alone satisfies the filter requirement, so you do not need to repeat the original filters.Prefer search over detail. One bounded search beats many per-BSSID detail calls. Keep
results_per_pagelow unless you need more.Locations are opt-in.
*_detailreturns a summary by default. Passinclude_locations=trueonly when sighting history is needed (capped at 5 points).
On startup the server verifies credentials by calling stats/user. Missing or
invalid keys fail immediately instead of on the first tool call.
Errors are returned as MCP tool errors (not success payloads with an error
field). HTTP 429 responses include guidance about daily limits.
Response shape
Search results are compact summaries, not raw WiGLE records:
{
"netid": "00:00:34:7A:67:1E",
"ssid": "pretty fly for a wifi",
"encryption": "wpa2",
"trilat": 33.057,
"trilong": -96.720,
"country": "US",
"region": "TX",
"city": "Plano",
"sightingCount": 12,
"lastSeen": {"latitude": 33.057, "longitude": -96.720}
}Detail responses use the same summary fields. With include_locations=true,
sightingCount is accompanied by up to five locationData entries (with
locationDataTruncated when more exist).
Example workflow
1. network_search(city="San Francisco", region="CA", country="US", results_per_page=5)
→ searchAfter: "3522985", results: [...]
2. network_search(search_after="3522985", results_per_page=5)
→ next page of the same query
3. network_detail(bssid="00:00:00:00:81:4E")
→ summary for one network
4. network_detail(bssid="00:00:00:00:81:4E", include_locations=true)
→ summary plus capped sighting locationsSetup
Get a free API key (Name + Token) at https://wigle.net/account, under "Your API Key".
Provide credentials via environment variables:
export WIGLE_API_NAME=... export WIGLE_API_TOKEN=...or in
~/.config/wigle-mcp/config.json:{"api_name": "...", "api_token": "..."}MCP host configs can omit
envwhen using the config file.
Running
uv run wigle-mcpIf uv run fails because wigle-mcp.exe is locked (common on Windows when
another MCP client is connected), use the module entry point instead:
uv run python -m wigle_mcp.serverConfiguration
On Windows, add --no-sync to uv run args in every host config so
uv does not try to reinstall the project while another client already has
wigle-mcp.exe open.
Claude Code
claude mcp add wigle -- uv --directory /path/to/wigle-mcp run --no-sync wigle-mcpClaude Desktop
{
"mcpServers": {
"wigle": {
"command": "uv",
"args": ["--directory", "/path/to/wigle-mcp", "run", "--no-sync", "wigle-mcp"],
"env": {
"WIGLE_API_NAME": "your-api-name",
"WIGLE_API_TOKEN": "your-api-token"
}
}
}
}Cursor
Add to .cursor/mcp.json (project-level) or ~/.cursor/mcp.json (global):
{
"mcpServers": {
"wigle": {
"command": "uv",
"args": ["--directory", "/path/to/wigle-mcp", "run", "--no-sync", "wigle-mcp"],
"env": {
"WIGLE_API_NAME": "your-api-name",
"WIGLE_API_TOKEN": "your-api-token"
}
}
}
}Development
uv sync --dev
uv run pytest
uv run ruff check .
uv run ruff format --check .License: MIT
Available Tools
8 toolsbluetooth_detailARead-onlyIdempotent
Look up everything WiGLE knows about a single Bluetooth/BLE device by its MAC address, including name history and recorded sighting locations.
Inputs: bssid (required). Returns: object
bluetooth_searchARead-onlyIdempotent
Search WiGLE's database of observed Bluetooth/BLE devices by name, MAC, or location.
Inputs: name, bssid, lat_max, lat_min, +5 more. Returns: object
cell_detailARead-onlyIdempotent
Look up everything WiGLE knows about a single cell tower by its ID, including operator/network type and recorded sighting locations.
Inputs: netid (required). Returns: object
cell_searchARead-onlyIdempotent
Search WiGLE's database of observed cell towers by ID, operator, network type, or location.
Inputs: netid, lat_max, lat_min, long_max, +5 more. Returns: object
network_detailARead-onlyIdempotent
Look up everything WiGLE knows about a single network by its BSSID, including SSID history, encryption, and recorded sighting locations.
Inputs: bssid (required). Returns: object
network_searchARead-onlyIdempotent
Search WiGLE's database of observed WiFi networks by SSID, BSSID, location, or encryption.
Inputs: city, ssid, bssid, region, +10 more. Returns: object
site_statsARead-onlyIdempotent
Get WiGLE-wide statistics: total WiFi/cell/Bluetooth networks and locations recorded, total users, and recent daily/monthly upload totals.
Inputs: no named parameters. Returns: object
user_statsARead-onlyIdempotent
Get WiGLE account statistics for the configured API user: rank, monthly rank, and counts of discovered WiFi/cell networks.
Inputs: no named parameters. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 8 tools
Each tool targets a distinct domain (Bluetooth, cell, WiFi, stats) with clear search/detail pairs. No overlapping purposes.
All tools follow a consistent domain_action pattern (e.g., bluetooth_detail, network_search). No mixing of conventions.
8 tools is well-scoped for querying three data types plus stats. Each tool earns its place, neither too few nor too many.
For a read-only database query service, the surface covers search and detail for each data type, plus site and user stats. No obvious gaps.
Maintenance
Related MCP Connectors
Web search API and MCP server for developers building AI agents.
Hosted MCP server for live public-data APIs and Skills for AI agents.
Capability registry for the agentic economy. Semantic search over verified MCP server listings.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA lightweight MCP server that enables LLMs to search the web via DuckDuckGo, search GitHub code repositories, and extract clean content from web pages in LLM-friendly formats.9MIT
- AlicenseAqualityBmaintenanceMCP server that exposes any Pumperly instance to LLMs, enabling real-time fuel price queries, station search, route planning, and geocoding.6102 npm3GPL 3.0
- FlicenseNot gradedqualityDmaintenanceEnables tool-calling LLMs to search the internet, capture website images, extract webpage text, and more via a local MCP server.16-
- AlicenseAqualityDmaintenanceMCP server that exposes APRS-IS network tools to LLM agents, enabling sending APRS messages, querying positions, finding nearby stations, and listening to live packet streams.5MIT