# 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)