marta-mcp
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., "@marta-mcpwhen's the next northbound red line train at midtown?"
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.
marta-mcp
An MCP server for Atlanta MARTA real-time transit data. Ask Claude things like "When's the next northbound Red Line train at Midtown?" or "Where are the buses on route 110 right now?"
Tools
Tool | Data source | API key? |
| Rail real-time RESTful API — arrival predictions for every station, filterable by station / line / direction | Yes |
| Static — canonical station names | No |
| GTFS-realtime vehicle positions feed (protobuf) | No |
| GTFS-realtime trip updates feed (protobuf) | No |
Related MCP server: gtfs-pro-mcp
API key setup
Rail data requires a free MARTA API key — register here.
The key is never stored in this project or in your MCP client config. The server reads it from, in order:
The
MARTA_API_KEYenvironment variable~/.marta/config.json:{ "api_key": "your-key-here" }
The easiest way to create the config file:
uvx --from git+https://github.com/thejiraguy/marta-mcp marta-mcp-config <your-key>Installation
Option 1 — Claude Desktop extension (one-click)
Requires uv to be installed.
Download marta-mcp.dxt (or .mcpb — same file, newer name) from the
latest release and
double-click it, or drag it into Claude Desktop's Settings → Extensions.
No JSON editing needed.
The extension is a thin manifest: Claude Desktop launches the server with
uvx --from git+<this repo>, fetching the package and its dependencies on
first run — so it works on any OS and always tracks the repo's main branch.
Build it yourself (requires Node.js):
bash scripts/build_dxt.sh # macOS / Linux
powershell -ExecutionPolicy Bypass -File scripts\build_dxt.ps1 # WindowsOption 2 — uvx straight from GitHub
Add to your MCP client config (e.g. claude_desktop_config.json):
{
"mcpServers": {
"marta": {
"command": "uvx",
"args": ["--from", "git+https://github.com/thejiraguy/marta-mcp", "marta-mcp"]
}
}
}Option 3 — local clone
git clone https://github.com/thejiraguy/marta-mcp
cd marta-mcp
uv run marta-mcpDevelopment
uv sync
uv run pytest # live smoke tests against MARTA's APIsNotes
Bus
route_idvalues are MARTA's internal GTFS identifiers, which don't always match the public route numbers. Pair this server with MARTA's static GTFS feed if you need the mapping.This project is not affiliated with or endorsed by MARTA. MARTA's marks may not be used without written authorization.
License
MIT
Available Tools
4 toolsget_bus_positionsA
Get live MARTA bus vehicle positions from the GTFS-realtime feed.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of vehicles to return (default 100). | |
| route | No | Optional GTFS route_id filter (exact match). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It mentions 'live' and 'GTFS-realtime feed', indicating real-time data, but does not disclose rate limits, authentication requirements, or data staleness. The description is minimal but not misleading.
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 description is a single, clear sentence with no wasted words. It is appropriately front-loaded, though it could include slightly more detail without becoming verbose.
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?
The tool is simple with two optional parameters and an output schema is present. The description covers the core purpose adequately. However, it could mention the optional nature of parameters or provide more context on the limit parameter's effect.
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 description coverage is 100%, and the schema provides adequate descriptions for both parameters. The description adds no additional meaning beyond what the schema already provides, so a baseline score of 3 is appropriate.
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 clearly states the action ('Get'), the resource ('live MARTA bus vehicle positions'), and the data source ('GTFS-realtime feed'). It effectively distinguishes from sibling tools like 'get_bus_trip_updates' (trip updates vs positions) and 'get_rail_arrivals' (bus vs rail).
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?
The description does not explicitly specify when to use this tool versus alternatives. While the sibling names provide some implicit guidance, the description lacks explicit statements about when or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bus_trip_updatesA
Get live MARTA bus arrival/departure predictions (GTFS-realtime trip updates).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of trips to return (default 25). | |
| route | No | Optional GTFS route_id filter (exact match). | |
| stop_id | No | Optional GTFS stop_id filter — only trips serving this stop are returned, and only that stop's prediction is included. | |
| stops_per_trip | No | Upcoming stop predictions to include per trip (default 5; ignored when stop_id is set). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations available. Description implies read operation ('Get live... predictions') but does not disclose potential side effects, rate limits, or data freshness. Adequate but not detailed.
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?
Single sentence, no wasted words, front-loaded with key info. Highly concise and efficient.
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?
Simple data retrieval tool with optional parameters. Description covers purpose and data type. Output schema exists (not shown) so return format is handled. Slight lack of context about data freshness or scope (MARTA), but overall sufficient.
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?
Input schema has 100% parameter description coverage. Description adds no extra meaning beyond schema fields; baseline score 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?
Clear verb 'Get' and specific resource 'live MARTA bus arrival/departure predictions' with format mention. Distinct from siblings (bus positions, rail, stations).
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?
No guidance on when to use vs siblings or alternatives. Only states what tool does; no explicit when/when-not or exclusion context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_rail_arrivalsB
Get real-time MARTA train arrival predictions.
| Name | Required | Description | Default |
|---|---|---|---|
| line | No | Optional line filter: RED, GOLD, BLUE, or GREEN. | |
| station | No | Optional station name filter, e.g. "Five Points" or "Midtown". Partial names match; use list_rail_stations for the full list. | |
| direction | No | Optional direction filter: N, S, E, or W. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. It only says 'real-time predictions' without detailing data freshness, latency, caching, or whether predictions are live or scheduled. This minimal disclosure is insufficient.
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 description is a single, concise sentence with no filler. It is front-loaded with the core purpose, but could benefit from a brief usage note or alternative reference without becoming verbose.
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 tool with three optional parameters and an output schema, the description is minimally adequate. However, it omits context like data source latency, result count limits, and guidance for handling empty results, leaving gaps for optimal agent usage.
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 description coverage is 100%, and the inline parameter descriptions explain line, station, and direction filters with examples. The tool description adds no additional meaning beyond the schema, so baseline 3 is appropriate.
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?
Description clearly states it retrieves real-time MARTA train arrival predictions. The verb 'Get' and resource 'rail arrivals' are specific, and the sibling tools (bus positions, station listing) make the rail focus distinct.
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?
The description does not explicitly state when to use this tool vs alternatives like get_bus_positions. However, the name and context signals imply it is for rail arrivals, but no when-not or alternative references are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_rail_stationsA
List all MARTA rail station names accepted by get_rail_arrivals.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description carries full burden. It only states it lists names, with no mention of side effects, rate limits, or error handling. As a read-only tool, minimal behavioral disclosure is acceptable, but more detail could help.
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?
Single sentence, no wasted words. Perfectly concise and structured.
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 parameters and an output schema that likely documents return values, the description is complete for its purpose. It tells what it does and how it relates to a sibling tool.
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?
No parameters exist (input schema empty). Baseline 4 for zero parameters. Description does not need to add parameter info.
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 clearly states the tool lists all MARTA rail station names and specifies they are accepted by get_rail_arrivals. This distinguishes it from sibling tools which are for buses.
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?
The description implies usage context: before calling get_rail_arrivals. It does not explicitly exclude alternatives, but given sibling tools are for unrelated tasks, it is clear.
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.
4 tool updates
v0.1.0- First observed
get_bus_positions - First observed
get_bus_trip_updates - First observed
get_rail_arrivals - First observed
list_rail_stations
TDQS
Scored across 4 tools
Each tool targets a distinct aspect of MARTA transit data: bus positions, bus trip updates, rail arrivals, and rail stations. No overlap in functionality.
All tools use a consistent verb_noun pattern in snake_case (e.g., get_bus_positions, list_rail_stations). The minor variation of 'list_' for stations is standard for listing endpoints.
4 tools is an appropriate scope for a real-time transit data server, covering bus and rail essentials without being too sparse or overwhelming.
The tool set covers core real-time functionality for both bus and rail. However, it lacks a bus route or station list analogous to list_rail_stations, which could be a minor gap for agents needing bus station identifiers.
Maintenance
Related MCP Connectors
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
An MCP server that provides congressional transcripts
Hosted MCP server for Xweather weather data: conditions, forecasts, alerts, and more.
Related MCP Servers
- 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.111MIT
- AlicenseNot gradedqualityDmaintenanceMCP server that provides tools for querying live transit data (stops, departures, routes, vehicles, alerts) from any WP GTFS Pro site, enabling AI assistants to answer rider questions.12GPL 2.0
- FlicenseNot gradedqualityDmaintenanceMCP server for real-time German public transport data (HAFAS/VBN network). Enables querying departures, arrivals, journeys, and nearby stops using natural language.-
- AlicenseNot gradedqualityBmaintenanceMCP server that integrates with the transport12 API to provide tools for searching stops, routes, arrivals, and vehicle forecasts, enabling natural language interaction with public transport data.12MIT