CCM
/MCP
SkillsMCPMarketplacesDigestToolsAdvertise

This week in Claude

Every Monday: Claude Code, Agent SDK, MCP, and the Anthropic platform moves worth your time.

Skills by Category
Frontend DevelopmentBackend & APIsTesting & QASecurityDevOps & CI/CDGit & Pull RequestsDocumentationCode Review & QualityAI & Agent BuildingSkill Development
MCP Servers by Category
Sales & MarketingWeb & Browser AutomationDatabasesAI & LLM ToolsCloud & InfrastructureCommunication & MessagingDeveloper ToolsDesign & CreativeDocuments & KnowledgeSearch & Web Crawling
Marketplaces by Category
AI Agents & OrchestrationLLM IntegrationDevelopment ToolsFrontend & UIBackend & APIsDatabasesTesting & Code QualityDevOps & CloudSecurity & ComplianceGit & Version Control

Claude Code Marketplaces

Discover Claude Code plugins, extensions, and tools. Automatically updated directory of Anthropic Claude AI marketplaces with development tools, productivity plugins, and integrations.

Resources

  • Browse Skills
  • Browse MCP Servers
  • Browse Marketplaces
  • Skill index
  • MCP index
  • Marketplace index
  • Plugins Reference

Community

  • About
  • Tools
  • Feedback
  • Privacy Policy
  • Advertise

Built for the Claude Code community with Claude Code by mertbuilds.com

Independent project, not affiliated with Anthropic
cyanheads avatar

Onebusaway Mcp Server

cyanheads/onebusaway-mcp-server
1STDIO, HTTPregistry active
Summary

Connects Claude to OneBusAway transit APIs for real-time vehicle tracking and schedule lookups. You get 15 tools covering stop discovery by location or name, live arrival predictions with GPS positions and schedule deviations, full trip sequences, agency-wide vehicle positions, and static timetables. The arrivals endpoint distinguishes GPS-tracked predictions from schedule-only data and surfaces active service alerts inline. Useful for building transit assistants that need to answer "when's my bus" with actual vehicle locations, not just printed schedules. Works over stdio or streamable HTTP, with a public hosted instance at onebusaway.caseyjhand.com/mcp if you don't want to run it locally. Puget Sound is the reference region, but any OneBusAway deployment works with the right API key.

CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
Lid closed, agents working
Lid closed, agents working
Keeps your Mac awake while Claude Code, Codex or Cursor works. Lets it sleep when they are done.
Try free for 7 days →
Block distraction from your iPhone for freeBlock distraction from your iPhone for free
Block distraction from your iPhone for free
Block distracting apps from your iPhone permanently without a 3rd party app. Free and open source.
Block now (100% free) →
Granola, the best AI meeting recorder
Granola, the best AI meeting recorder
Notes, actions and memory. Without a meeting bot. First month 100% off.
Download for free →
belt - the only tool your agent needs
belt - the only tool your agent needs
belt cli automatically finds the best tools and skills for your agent. image, video, music, tts...
one prompt install →
Open Steps
Open Steps
Free an open-source skills that make AI coding agents easier to understand, verify, and control.
Download for free →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →
Agent, connect blockchain
Agent, connect blockchain
Connect your Claude agent to live crypto prices and trading routes via 1inch
Get the MCP →
CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
Lid closed, agents working
Lid closed, agents working
Keeps your Mac awake while Claude Code, Codex or Cursor works. Lets it sleep when they are done.
Try free for 7 days →
Block distraction from your iPhone for freeBlock distraction from your iPhone for free
Block distraction from your iPhone for free
Block distracting apps from your iPhone permanently without a 3rd party app. Free and open source.
Block now (100% free) →
Granola, the best AI meeting recorder
Granola, the best AI meeting recorder
Notes, actions and memory. Without a meeting bot. First month 100% off.
Download for free →
belt - the only tool your agent needs
belt - the only tool your agent needs
belt cli automatically finds the best tools and skills for your agent. image, video, music, tts...
one prompt install →
Open Steps
Open Steps
Free an open-source skills that make AI coding agents easier to understand, verify, and control.
Download for free →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →
Agent, connect blockchain
Agent, connect blockchain
Connect your Claude agent to live crypto prices and trading routes via 1inch
Get the MCP →

@cyanheads/onebusaway-mcp-server

Query stops, routes, real-time arrivals, vehicle positions, and schedules from OneBusAway transit APIs via MCP. STDIO or Streamable HTTP.

16 Tools • 2 Resources

Version License Docker MCP SDK npm TypeScript Bun

Install in Claude Desktop Install in Cursor Install in VS Code

Framework

Public Hosted Server: https://onebusaway.caseyjhand.com/mcp


Overview

Real-time transit data and schedules from OneBusAway. It defaults to the Puget Sound instance (King County Metro, Sound Transit, Pierce Transit, Community Transit, and more) and works with any other OneBusAway instance. Find stops and routes, track live arrivals and vehicle positions, and pull full-day schedules, vehicle blocks, and service alerts. Runs as a stdio process, a local Streamable HTTP server, or the public hosted endpoint above.

Tools

ToolDescription
onebusaway_list_agenciesList the transit agencies on the instance, with IDs, contact info, and coverage area
onebusaway_find_stopsFind stops near a lat/lon, optionally filtered by stop code
onebusaway_search_stopsResolve a stop name or code to a stop ID
onebusaway_get_stopFetch one stop by ID
onebusaway_find_routesFind routes near a lat/lon, optionally filtered by name or number
onebusaway_search_routesResolve a route name or number to a route ID
onebusaway_get_routeFetch one route by ID
onebusaway_list_routes_for_agencyList every route an agency operates
onebusaway_get_arrivalsReal-time arrivals and departures at a stop, with schedule deviation, vehicle positions, and active alerts
onebusaway_get_stop_contextStop details, real-time arrivals, and full detail for every alert at the stop, from one upstream request
onebusaway_get_alertFull service alert detail by situation ID
onebusaway_get_tripReal-time status and stop sequence for a trip
onebusaway_get_blockEvery trip one vehicle runs in a service day, in order, with stop times
onebusaway_get_vehiclesReal-time positions of an agency's active vehicles, optionally for one route
onebusaway_get_schedule_for_stopFull-day departure schedule for a stop, by route and direction
onebusaway_get_schedule_for_routeFull-day schedule for a route: every trip and its stop sequence

Resources

ResourceDescription
onebusaway://stop/{stopId}Stop metadata: name, coordinates, served routes, wheelchair accessibility
onebusaway://route/{routeId}Route metadata: short name, description, agency, schedule URL

The same data is available to tool-only clients through onebusaway_get_stop and onebusaway_get_route.

Capability reference

onebusaway_list_agencies tool

  • No input; returns every agency with id, contact info, timezone, and coverageCenter / coverageSpan
  • limitExceeded flags an upstream-capped list, with no pagination to fetch the rest

onebusaway_find_stops tool

  • lat / lon required; radius in meters, default 300, max 1600; optional query matches the stop code printed on the sign
  • Each stop carries id, code, direction, routeIds, and wheelchairBoarding (ACCESSIBLE / NOT_ACCESSIBLE / UNKNOWN); limitExceeded means more stops exist within the radius

onebusaway_search_stops tool

  • query (stop name fragment or stop code) required; maxCount up to 100, default 10
  • Same stop shape as onebusaway_find_stops; limitExceeded means more stops matched than maxCount

onebusaway_get_stop tool

  • Single stopId; returns name, code, coordinates, direction, routeIds, and wheelchairBoarding
  • Unknown IDs fail as stop_not_found, with recovery via onebusaway_find_stops or onebusaway_search_stops

onebusaway_find_routes tool

  • lat / lon required; radius in meters, default 500, max 1600, or a latSpan + lonSpan box (both set) in its place; optional query by route name or number
  • Each route carries shortName, longName, agencyId, GTFS type (0=tram … 5=cable_car), color, and schedule url; limitExceeded means more routes exist in the area

onebusaway_search_routes tool

  • query (route name or number) required; maxCount up to 100, default 10
  • Returns shortName, longName, agencyId, and GTFS type; limitExceeded means more routes matched than maxCount
  • Fails as endpoint_unavailable on instances whose route-search endpoint returns 404, Puget Sound among them; use onebusaway_find_routes or onebusaway_list_routes_for_agency instead

onebusaway_get_route tool

  • Single routeId; returns shortName, longName, description, agency, GTFS type, color, and schedule url
  • Unknown IDs fail as route_not_found, with recovery via onebusaway_find_routes or onebusaway_search_routes

onebusaway_list_routes_for_agency tool

  • agencyId required; unknown agencies fail as agency_not_found
  • Every route with shortName, longName, GTFS type, color, and url; limitExceeded flags an upstream-capped list with no pagination

onebusaway_get_arrivals tool

  • stopId required; the window is minutesBefore (integer 0–60, default 5) / minutesAfter (integer 0–240, default 35), with longer horizons left to onebusaway_get_schedule_for_stop; unknown stops fail as stop_not_found
  • Each arrival carries predicted (false = schedule-only), scheduleDeviation in seconds (positive = late, meaningful only when predicted), predictedArrivalTime, vehiclePosition, stopsAway, and tripId
  • Active alerts arrive in situations[]: those on the stop itself plus those linked from each arrival's situationIds, each once

onebusaway_get_stop_context tool

  • Same input as onebusaway_get_arrivals, and the same stop_not_found / rate_limited failures; one call issues one upstream request
  • Returns stop (the onebusaway_get_stop fields minus routeIds), arrivals in the onebusaway_get_arrivals shape, and alerts in the onebusaway_get_alert shape — every alert on the stop or on an arrival in the window, including stop-wide alerts no arrival in the window carries
  • When the upstream response omits the stop, stop is null; a referenced alert missing from the response is left out; either way a notice names the tool to fetch it with

onebusaway_get_alert tool

  • Single situationId, from onebusaway_get_arrivals (situations[].id or arrivals[].situationIds); unknown IDs fail as situation_not_found
  • Returns a TPEG reason code, severity, consequenceMessage, affects (agency, route, stop, or trip scope), consequences with diversion stop IDs, and activeWindows

onebusaway_get_trip tool

  • tripId required; serviceDateMs (non-negative integer, midnight local) only for a trip on a previous service day; includeSchedule (default true) adds the stop sequence with GTFS times and distanceAlongTripMeters
  • status carries phase (e.g. in_progress, layover_before), predicted, position, scheduleDeviation, and nextStop; blockId (null when the trip has none) feeds onebusaway_get_block
  • Fails as trip_not_found when the trip isn't active for the service date; a completed trip's times come from onebusaway_get_schedule_for_route

onebusaway_get_block tool

  • Single blockId, from onebusaway_get_trip; unknown IDs fail as block_not_found
  • The vehicle's trips for the service day in order, each with distanceAlongBlock, accumulatedSlackTime (layover seconds), and blockStopTimes; activeServiceIds / inactiveServiceIds show which service calendars apply

onebusaway_get_vehicles tool

  • agencyId required, unknown agencies fail as agency_not_found; optional routeId is filtered client-side after all of the agency's vehicles are fetched
  • Each vehicle carries position, orientation, phase, scheduleDeviation, tripId, nextStop, and predicted (reporting real-time GPS); limitExceeded flags an upstream-capped list with no pagination

onebusaway_get_schedule_for_stop tool

  • stopId required; optional date as a real YYYY-MM-DD calendar date, default (omitted or blank) today in the agency's timezone; unknown stops fail as stop_not_found
  • Departures grouped by route and direction, each with scheduledDepartureTime and tripId
  • Static schedule only; live predictions come from onebusaway_get_arrivals

onebusaway_get_schedule_for_route tool

  • routeId required; optional date as a real YYYY-MM-DD calendar date, default (omitted or blank) today; unknown routes fail as route_not_found
  • Every trip that day with tripId, tripHeadsign, serviceId, and its stop sequence
  • Static schedule only; live predictions come from onebusaway_get_arrivals at a stop

onebusaway://stop/{stopId} resource

  • Stop record as application/json, the same shape onebusaway_get_stop returns
  • stopId comes from onebusaway_find_stops or onebusaway_search_stops

onebusaway://route/{routeId} resource

  • Route record as application/json, the same shape onebusaway_get_route returns
  • routeId comes from onebusaway_find_routes or onebusaway_search_routes

Features

Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.

OneBusAway-specific:

  • Wraps onebusaway-sdk with typed error classification (NotFound, RateLimited, ValidationError for an upstream 400, ServiceUnavailable)
  • Defaults to the Puget Sound instance (api.pugetsound.onebusaway.org), where ONEBUSAWAY_API_KEY=TEST works for development; ONEBUSAWAY_BASE_URL points it at any other OneBusAway instance
  • Stop and route IDs are agency-prefixed, {agencyId}_{localId} (stop 1_75403, route 1_100259); agency IDs are the bare prefix (1 for Metro Transit, 40 for Sound Transit)
  • One shared pacer, sized by ONEBUSAWAY_RATE_LIMIT_*, queues every upstream request against the API key's budget; a call that gets no slot within the wait cap fails as retryable rate_limited with data.retryAfter, on any tool
  • Transit data only, no trip planning; server-level instructions walk agents through the ID format and the common lookup chains

Agent-friendly output:

  • predicted on every arrival, trip, and vehicle separates GPS-tracked data from schedule-only projections
  • Machine-readable times: scheduleDeviation in seconds; arrival, stop-schedule, and update timestamps in Unix milliseconds; trip, route-schedule, and block stop times in GTFS seconds from midnight
  • Chainable IDs: stopId from the stop tools feeds arrivals, tripId feeds onebusaway_get_trip, blockId feeds onebusaway_get_block, situationIds feed onebusaway_get_alert, and agencyId feeds vehicles and route listing
  • Typed error contracts whose recovery hints name the next tool to call, plus a notice on empty or truncated results

Getting started

Public Hosted Instance

A public instance is available at https://onebusaway.caseyjhand.com/mcp — no installation required. Point any MCP client at it via Streamable HTTP:

{
  "mcpServers": {
    "onebusaway-mcp-server": {
      "type": "streamable-http",
      "url": "https://onebusaway.caseyjhand.com/mcp"
    }
  }
}

Self-Hosted / Local

Add the following to your MCP client configuration file. ONEBUSAWAY_API_KEY=TEST works on the Puget Sound instance without registration.

{
  "mcpServers": {
    "onebusaway-mcp-server": {
      "type": "stdio",
      "command": "bunx",
      "args": ["@cyanheads/onebusaway-mcp-server@latest"],
      "env": {
        "MCP_TRANSPORT_TYPE": "stdio",
        "MCP_LOG_LEVEL": "info",
        "ONEBUSAWAY_API_KEY": "TEST"
      }
    }
  }
}

Or with npx (no Bun required):

{
  "mcpServers": {
    "onebusaway-mcp-server": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@cyanheads/onebusaway-mcp-server@latest"],
      "env": {
        "MCP_TRANSPORT_TYPE": "stdio",
        "MCP_LOG_LEVEL": "info",
        "ONEBUSAWAY_API_KEY": "TEST"
      }
    }
  }
}

Or with Docker:

{
  "mcpServers": {
    "onebusaway-mcp-server": {
      "type": "stdio",
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-e", "MCP_TRANSPORT_TYPE=stdio",
        "-e", "ONEBUSAWAY_API_KEY=TEST",
        "ghcr.io/cyanheads/onebusaway-mcp-server:latest"
      ]
    }
  }
}

For Streamable HTTP, set the transport and start the server:

MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 ONEBUSAWAY_API_KEY=TEST bun run start:http
# Server listens at http://localhost:3010/mcp

Prerequisites

  • Bun v1.4.0 or higher (or Node.js v24+).
  • A OneBusAway API key. TEST works on the Puget Sound instance for development; for production use or other instances, register at the relevant agency's developer portal.

Installation

  1. Clone the repository:
git clone https://github.com/cyanheads/onebusaway-mcp-server.git
  1. Navigate into the directory:
cd onebusaway-mcp-server
  1. Install dependencies:
bun install
  1. Configure environment:
cp .env.example .env
# edit .env — set ONEBUSAWAY_API_KEY if needed

Configuration

VariableDescriptionDefault
ONEBUSAWAY_API_KEYOneBusAway API key. TEST works on the Puget Sound instance.TEST
ONEBUSAWAY_BASE_URLBase URL of the OneBusAway instance.https://api.pugetsound.onebusaway.org
ONEBUSAWAY_RATE_LIMIT_REQUESTSUpstream requests allowed per window, shared by all callers.20
ONEBUSAWAY_RATE_LIMIT_WINDOW_MSWidth of the sliding rate window, in ms.60000
ONEBUSAWAY_RATE_LIMIT_MAX_WAIT_MSLongest a call waits for a slot before failing as rate_limited, in ms. Keep it under the SDK's 60 s request timeout.45000
MCP_TRANSPORT_TYPETransport: stdio or http.stdio
MCP_HTTP_PORTHTTP server port.3010
MCP_SESSION_MODEHTTP session mode: stateless, stateful, or auto.stateless
MCP_AUTH_MODEAuthentication: none, jwt, or oauth.none
MCP_LOG_LEVELLog level (debug, info, notice, warning, error).info
LOGS_DIRDirectory for log files (Node.js only).<project-root>/logs
STORAGE_PROVIDER_TYPEStorage backend: in-memory, filesystem, supabase, cloudflare-kv/r2/d1.in-memory
OTEL_ENABLEDEnable OpenTelemetry.false

See .env.example for the full list of optional overrides.

Running the server

Local development

  • Build and run the production version:

    # One-time build
    bun run rebuild
    
    # Run the built server
    bun run start:http
    # or
    bun run start:stdio
    
  • Run checks and tests:

    bun run devcheck       # Lint, format, typecheck, security, changelog sync
    bun run test           # Vitest test suite
    bun run test:coverage  # Test suite with coverage, held to the framework thresholds
    bun run lint:mcp       # Validate MCP definitions against spec
    

Docker

docker build -t onebusaway-mcp-server .
docker run --rm -e ONEBUSAWAY_API_KEY=TEST -p 3010:3010 onebusaway-mcp-server

The Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/onebusaway-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.

Project structure

DirectoryPurpose
src/index.tscreateApp() entry point: registers tools and resources, sets server instructions, inits the OneBusAway service.
src/configServer-specific env var parsing and validation with Zod.
src/mcp-server/toolsTool definitions (*.tool.ts) plus the schemas and format helpers they share.
src/mcp-server/resourcesStop and route resource definitions (*.resource.ts).
src/services/onebusawayOneBusAway service: wraps onebusaway-sdk, paces upstream requests, classifies errors; domain types.
tests/Vitest tests for the tools, resources, service, and config.

Development guide

See CLAUDE.md for development guidelines and architectural rules. The short version:

  • Handlers throw, framework catches — no try/catch in tool logic
  • Use ctx.log for request-scoped logging, ctx.state for tenant-scoped storage
  • Register new tools and resources in the createApp() arrays in src/index.ts
  • Wrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields

Contributing

Issues are welcome. Run checks and tests before submitting:

bun run devcheck
bun run test

License

Apache-2.0 — see LICENSE for details.

Transit data from the default Puget Sound OneBusAway API, operated by Sound Transit and King County Metro, is governed by the Sound Transit Transit Data Terms of Use, and users of the hosted endpoint receive it under those terms. Key obligations:

  • Clause 2: usage metrics are available on request.
  • Clause 3: data is fetched live from the OneBusAway API and is not modified or cached beyond the request cycle.
  • Clause 4: you agree to pass substantially similar terms through to any users you provide this data to.
  • Clause 7: this server does not use Sound Transit trademarks in its name or branding.
Featured
CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
Lid closed, agents working
Lid closed, agents working
Keeps your Mac awake while Claude Code, Codex or Cursor works. Lets it sleep when they are done.
Try free for 7 days →
Block distraction from your iPhone for freeBlock distraction from your iPhone for free
Block distraction from your iPhone for free
Block distracting apps from your iPhone permanently without a 3rd party app. Free and open source.
Block now (100% free) →
Granola, the best AI meeting recorder
Granola, the best AI meeting recorder
Notes, actions and memory. Without a meeting bot. First month 100% off.
Download for free →
belt - the only tool your agent needs
belt - the only tool your agent needs
belt cli automatically finds the best tools and skills for your agent. image, video, music, tts...
one prompt install →
Open Steps
Open Steps
Free an open-source skills that make AI coding agents easier to understand, verify, and control.
Download for free →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →
Agent, connect blockchain
Agent, connect blockchain
Connect your Claude agent to live crypto prices and trading routes via 1inch
Get the MCP →

Configuration

ONEBUSAWAY_API_KEYdefault: TEST

OneBusAway API key. TEST works on the Puget Sound instance for development.

ONEBUSAWAY_BASE_URLdefault: https://api.pugetsound.onebusaway.org

Base URL for the OneBusAway instance. Defaults to Puget Sound.

MCP_LOG_LEVELdefault: info

Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').

MCP_HTTP_HOSTdefault: 127.0.0.1

The hostname for the HTTP server.

MCP_HTTP_PORTdefault: 3010

The port to run the HTTP server on.

MCP_HTTP_ENDPOINT_PATHdefault: /mcp

The endpoint path for the MCP server.

MCP_AUTH_MODEdefault: none

Authentication mode to use: 'none', 'jwt', or 'oauth'.

Registryactive
Package@cyanheads/onebusaway-mcp-server
TransportSTDIO, HTTP
UpdatedJun 4, 2026
View on GitHub

More from cyanheads

  • Openfda Mcp Server1
  • Openfec Mcp Server1
  • Openfoodfacts Mcp Server1
  • Openlibrary Mcp Server1
  • Openstates Mcp Server1
  • Orcid Mcp Server1
  • Reliefweb Mcp Server1
  • Smithsonian Mcp Server1
  • Wikidata Mcp Server1
  • Wsdot Mcp Server1
  • Noaa Cdo Mcp Server2
  • Nominatim Mcp Server2
  • Openstreetmap Mcp Server2
  • Arxiv Mcp Server1
  • Gbif Biodiversity Mcp Server1
  • Gbif Mcp Server1
  • Osv Advisory Mcp Server1
  • Pentest Mcp Server1
  • Socrata Mcp Server1
  • Who Gho Mcp Server1
  • Aviation Weather Mcp Server
  • Cyanheads Mcp Server
  • Ensembl Mcp Server
  • Eur Lex Mcp Server