Skip to main content
Glama
README.md
# nyc-restroom-mcp

Ask Claude "where's the nearest public bathroom?" and get a real answer.

This is an [MCP](https://modelcontextprotocol.io) server, a small plugin that
gives an AI assistant (like Claude Desktop or Claude Code) new abilities. This
one lets it search New York City's official public restroom data, live from
[NYC Open Data](https://opendata.cityofnewyork.us/). Once installed, you can
ask things like:

- "Find a public restroom near Union Square that's open right now."
- "Which restrooms near me are wheelchair accessible?"
- "Is the bathroom at Jaime Campiz Playground actually clean?" (it looks up
  the latest NYC Parks inspection report)

It adds two tools:

| Tool                  | What it does                                                                                                           |
| --------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| `find_restrooms`      | Lists open public restrooms near a location, closest first, with hours, accessibility, and changing-station info.      |
| `get_restroom_status` | Looks up one restroom by name or coordinates, including its most recent NYC Parks inspection rating, where one exists. |

If you don't give it a location, it can detect yours automatically (details
below). Everything is read-only: it only ever fetches public city data.

## Install

You need [Node.js](https://nodejs.org) 20 or newer. No download or setup
beyond the snippet for your app.

**Claude Code** (one command):

```bash
claude mcp add nyc-restroom -- npx -y nyc-restroom-mcp
```

**Claude Desktop**: go to Settings -> Developer -> Edit Config and add this to
`claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "nyc-restroom": {
      "command": "npx",
      "args": ["-y", "nyc-restroom-mcp"]
    }
  }
}
```

Any other MCP client works the same way: have it launch
`npx -y nyc-restroom-mcp` as a local (stdio) server.

## Good to know

- **Automatic location.** If you ask for nearby restrooms without saying
  where you are, the server tries to figure it out: first from your device
  (macOS only, if you `brew install corelocationcli` and grant it Location
  Services access), otherwise a rough guess from your IP address. If neither
  works, or you're outside NYC, it simply asks for explicit coordinates
  instead of guessing wrong.
- **Privacy.** Location detection only happens when you omit coordinates,
  and your location is never written to logs. Pass explicit coordinates and
  no location lookup happens at all.
- **Live data.** Every answer comes straight from NYC Open Data (with a
  short-lived in-memory cache), so results are as current as the city's own
  records. Inspection reports only exist for restrooms run by NYC Parks;
  library and other restrooms will honestly say no inspection data exists.
- **More detail.** The [docs/](docs/) directory covers the full
  [tool reference](docs/tools.md), [location detection](docs/location.md),
  [data sources](docs/data-sources.md), [configuration](docs/configuration.md),
  and [security model](docs/security.md). The reasoning behind every design
  decision lives in [DECISIONS.md](DECISIONS.md).

### Optional settings

Set these as environment variables if you need them (most people don't):

| Variable            | Purpose                                                              |
| ------------------- | -------------------------------------------------------------------- |
| `SOCRATA_APP_TOKEN` | A free NYC Open Data app token, for higher rate limits.              |
| `LOG_LEVEL`         | `error`, `warn`, or `info` (default `info`). Logs go to stderr only. |

A few more exist for testing and advanced setups; see
[docs/configuration.md](docs/configuration.md).

## Contributing

Issues and pull requests are welcome at
[DanielOrtiz0220/nyc-restroom-mcp](https://github.com/DanielOrtiz0220/nyc-restroom-mcp).

Development uses [Bun](https://bun.sh) (1.1+):

```bash
git clone https://github.com/DanielOrtiz0220/nyc-restroom-mcp.git
cd nyc-restroom-mcp
bun install
bun test            # full unit + end-to-end suite, runs completely offline
bun run typecheck   # tsc --noEmit
bun run lint        # eslint, zero warnings allowed
bun run build       # compile src/ to dist/ (what the npm package ships)
```

To run your local copy inside an MCP client instead of the published package:

```bash
claude mcp add nyc-restroom -- bun "$(pwd)/src/index.ts"
```

Useful extras: `bun run test:live` runs one smoke test against the real NYC
Open Data API (needs network), and `bun test --coverage` reports coverage
(85%+ lines required on `src/lib/`). Before opening a PR, please make sure
`bun test`, `bun run typecheck`, and `bun run lint` all pass. The full
development guide (test architecture, project structure, invariants to
preserve) is in [docs/development.md](docs/development.md), and
[DECISIONS.md](DECISIONS.md) explains why things work the way they do.

## License

[MIT](LICENSE)

TDQS

A4.4/5.0

Scored across 2 tools

Disambiguation5/5

The two tools have clearly distinct roles: find_restrooms discovers restrooms by proximity and open status, while get_restroom_status looks up a single restroom's detailed condition. No overlap or ambiguity.

Naming Consistency5/5

Both tools follow a consistent verb_noun snake_case pattern: find_restrooms and get_restroom_status. This is perfectly predictable.

Tool Count3/5

With only 2 tools, the server sits at the borderline lower end of the scale. The narrow domain could justify it, but the small surface area feels thin compared to typical MCP servers.

Completeness4/5

The two tools cover the essential workflow of finding restrooms and checking their status. A few minor gaps exist, such as no way to list all restrooms or filter by amenities, but these are not core dead ends for the stated purpose.

Maintenance

ActivityStale
ResponsivenessNo issues