bizidashboard-mcp
This MCP server exposes historical and analytical data for the Zaragoza Bizi bike-share system, going beyond the official GBFS real-time feed. You can:
Get latest station snapshots (
get_stations): bikes available, free anchors, capacity, location.Rank stations (
get_rankings) by turnover or availability to identify busiest or most reliably stocked stations.List active alerts (
get_alerts) for stations low on bikes or anchors.Query alert history (
get_alerts_history) by station, type, severity, state, and time range.Get hourly occupancy patterns (
get_patterns) for weekday vs. weekend.Retrieve occupancy heatmap cells (
get_heatmap) by day and hour.Analyze mobility signals (
get_mobility): hourly demand curves, station-to-station flows, and transit impact.Access full historical daily demand data (
get_history) since BiziDashboard started recording.Generate a rebalancing report (
get_rebalancing_report) with station classifications, empty/full risk predictions, and origin-destination transfer recommendations.
Most tools support JSON or CSV output (some CSV exports or extended windows require elevated permissions), and the server can integrate with LLM clients like Claude, ChatGPT, and Gemini via local stdio or remote HTTP/OpenAPI endpoints.
Click on "Install 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., "@bizidashboard-mcpShow me the stations with the highest turnover this week."
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.
bizidashboard-mcp
MCP server exposing BiziDashboard's historical and analytical data for the Zaragoza Bizi bike-share system as tools for LLM clients.
Unlike the official GBFS feed (which only exposes the current state of the system), BiziDashboard stores and analyzes history: rankings, occupancy patterns, mobility signals, alert history, and a station rebalancing diagnostic report. This server makes that analytical layer easy to query from Claude Desktop or any other MCP client.
Installation
Published on npm — no cloning or compiling required. Add it to your MCP client config
(e.g. claude_desktop_config.json):
{
"mcpServers": {
"bizidashboard": {
"command": "npx",
"args": ["-y", "bizidashboard-mcp"]
}
}
}From source
git clone https://github.com/gcaguilar/bizidashboard-mcp.git
cd bizidashboard-mcp
npm install
npm run buildThen point your MCP client at the built entrypoint:
{
"mcpServers": {
"bizidashboard": {
"command": "node",
"args": ["/absolute/path/to/bizidashboard-mcp/dist/index.js"]
}
}
}Related MCP server: Spanish Public Data MCP
Configuration
BiziDashboard API (outbound)
Variable | Default | Purpose |
|
| Base URL of the BiziDashboard instance to query. Override to point at another city's deployment or a local dev server. |
| (none) | Local stdio only. Optional legacy |
| (none) | Optional local stdio Auth0 access token forwarded to DatosBizi. |
HTTP Server & OAuth (inbound, remote clients only)
The HTTP server requires OAuth-based authentication via Auth0. Before running it, you must:
Create an Auth0 API for the MCP resource, with exact identifier
https://mcp.datosbizi.com/mcp, RS256, and scopesread:dashboardandread:exports. Enable Dynamic Client Registration and Resource Parameter Compatibility Profile in the tenant. Claude and ChatGPT then register their own public clients; users do not receive an OAuth secret.In Applications → APIs → the MCP API, select Add Application to create its Custom API Client. Grant that client user-delegated access to
https://api.datosbizi.comand enable On-Behalf-Of Token Exchange. It is not the ordinary Machine-to-Machine application. Keep its client secret only in the MCP deployment.Configure these environment variables:
Variable | Purpose |
| Required. Your Auth0 tenant domain, e.g., |
| Required in production. Exact MCP Auth0 API identifier: |
| Required in production. Existing DatosBizi API identifier, e.g. |
| Required in production. Client ID of the special Auth0 resource-server OBO client. |
| Required in production. Secret of that OBO client. Store only as a Coolify secret. |
| Optional comma-separated browser origins allowed to call the HTTP MCP, e.g. |
| (optional) The public URL of this server (e.g., |
| (optional) HTTP port. Default |
Do not set AUTH0_AUDIENCES, AUTH0_ACCESS_TOKEN_ALLOWED_CLIENT_IDS,
AUTH0_CLIENT_IDS, or OAUTH_PROXY_ORIGIN on this public DCR deployment.
BASE_URL is required in production and must be the HTTPS MCP URL. Set
BIZI_ALLOWED_API_HOSTS to an explicit comma-separated allowlist (normally
datosbizi.com) so authenticated tokens are never forwarded to an unintended
origin.
For local authenticated use, enable Device Authorization for a local DatosBizi
Auth0 client and run bizidashboard-mcp-login with AUTH0_DOMAIN,
AUTH0_CLIENT_ID and AUTH0_AUDIENCE. It stores tokens in
~/.config/bizidashboard-mcp/tokens.json; the stdio server refreshes them when a
refresh token is available. Set BIZI_TOKEN_FILE to override that path.
Stdio Server (Claude Desktop, no auth needed)
All BIZI_* variables above are optional; if omitted, they default to the public BiziDashboard.
The stdio server (bizidashboard-mcp) needs no authentication.
Tools
Tool | Description |
| Latest availability snapshot for every station. |
| Rank stations by turnover or availability. |
| Currently active low-bikes/low-anchors alerts. |
| Filterable/paginated alert history. Remote |
| Weekday/weekend hourly occupancy pattern for one station. |
| Occupancy heatmap cells for one station. |
| Hourly/daily mobility signals and transit impact. |
| Full historical daily demand data since first record. |
| Station diagnostics (A–F classification), risk predictions, and transfer recommendations. Remote |
Every tool remains visible to every authenticated remote user. Every tool returns the
API's JSON response as-is (or CSV text when format: "csv" is requested); nothing is
summarized or transformed. An elevated request without read:exports returns an
actionable authorization error telling the user to reconnect with that scope. Other
upstream errors (bad params, rate limits) retain their original status and message.
Remote connector (Claude / ChatGPT)
npx bizidashboard-mcp (stdio) only works for local clients like Claude
Desktop. To use this data from claude.ai remote connectors or ChatGPT,
run the HTTP server instead and expose it publicly over HTTPS. It exposes the
same nine tools through one standard MCP endpoint:
Endpoint | Protocol | Used by |
| MCP Streamable HTTP (stateless) | Claude and ChatGPT |
Every route except /healthz requires an OAuth bearer token
(Authorization Code flow with Auth0), obtained after registering as described above.
The remote server validates issuer, MCP audience, signature, expiry, azp (when
configured), and read:dashboard. It then performs an Auth0 On-Behalf-Of exchange,
so BiziDashboard receives a token for https://api.datosbizi.com, preserving the
signed-in user and their scopes without accepting an MCP token at the downstream API.
Run it on your own server
With Docker (image published to GHCR on every push to main/tag by
.github/workflows/docker-publish.yml):
docker run -d \
--name bizidashboard-mcp \
-p 8787:8787 \
-e AUTH0_DOMAIN=<your-auth0-domain> \
-e MCP_AUTH0_AUDIENCE=https://mcp.yourdomain.com/mcp \
-e API_AUTH0_AUDIENCE=https://api.datosbizi.com \
-e MCP_AUTH0_CLIENT_ID=<obo-client-id> \
-e MCP_AUTH0_CLIENT_SECRET=<obo-client-secret> \
-e BASE_URL=https://mcp.yourdomain.com \
ghcr.io/gcaguilar/bizidashboard-mcp:latestFrom source:
npm install
npm run build
AUTH0_DOMAIN=<your-auth0-domain> \
MCP_AUTH0_AUDIENCE=https://mcp.yourdomain.com/mcp \
API_AUTH0_AUDIENCE=https://api.datosbizi.com \
MCP_AUTH0_CLIENT_ID=<obo-client-id> \
MCP_AUTH0_CLIENT_SECRET=<obo-client-secret> \
npm run start:httpEither way, put it behind a reverse proxy (Caddy, nginx, Traefik, …) on your
VPS to terminate TLS on a real domain — https://mcp.yourdomain.com — since
neither client below will call a plain-HTTP or self-signed endpoint.
Register it
Claude (claude.ai → Settings → Connectors → Add custom connector): URL
https://mcp.yourdomain.com/mcp. Authentication is OAuth 2.0 Authorization Code; Claude will discover the flow automatically via/.well-known/oauth-protected-resource.ChatGPT MCP / GPT builder: use the MCP URL and let the client complete OAuth through Dynamic Client Registration. Do not embed the OBO client secret in ChatGPT or in a public page.
OpenAI plugin submission
The MCP-only plugin package is in plugins/bizidashboard-mcp. It includes the
directory metadata and starter prompts for ChatGPT/Codex. Submission copy and
review cases are in docs/openai-plugin-submission.md.
The public submission still needs a verified OpenAI publisher identity, legal
URLs, regional availability, and OAuth reviewer credentials.
Development
npm run build # compile TypeScript to dist/ (both the stdio and HTTP entrypoints)
npm run typecheck # type-check without emitting
npm test # build, then run integration tests against the live public API
npm run start:http # run the HTTP MCP server locally (needs the Auth0 MCP/OBO variables above)To build the Docker image locally: docker build -t bizidashboard-mcp .
The existing tool smoke tests hit https://datosbizi.com for real. Focused
authorization tests use no live credentials and verify that remote HTTP requests never
send BIZI_PUBLIC_API_KEY.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseBqualityDmaintenanceMCP-compatible server that enables AI assistants to interact with Lightdash analytics data, providing tools to list and retrieve projects, spaces, charts, dashboards, and metrics through a standardized interface.134426MIT
- AlicenseAqualityFmaintenanceMCP server for querying Spanish government open data APIs including grants, legislation, company registry, statistics, and open data catalog. Enables LLMs to access Spanish public information on-the-fly.265MIT
- AlicenseNot gradedqualityDmaintenanceMCP server exposing Montevideo public transportation data (STM) as tools for AI assistants, enabling natural language queries about routes, stops, arrivals, and trip planning.191MIT
- AlicenseNot gradedqualityDmaintenanceMCP server to query public open data from Recife, Brazil using natural language. It exposes tools for schema exploration and SQL query generation via Gemini 2.5 Flash, backed by a local DuckDB database.1MIT
Related MCP Connectors
MCP server exposing the Backtest360 engine API as tools for AI agents.
MCP server providing access to the Scorecard API to evaluate and optimize LLM systems.
Hosted MCP server for LLM cost estimation, model comparison, and budget-aware routing.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/gcaguilar/bizidashboard-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server