@ridemypark/cli
v1.2.2
Published
Command-line access to the RideMyPark catalogue: search skateparks, street spots, pumptracks, shops and events, read one listing in full, geocode a place. Read-only, no account needed.
Maintainers
Readme
@ridemypark/cli
The RideMyPark catalogue from your terminal: skateparks, street spots, pumptracks, shops and events. Read-only, no account, no API key.
npx @ridemypark/cli search --near Bordeaux --spot-type skatepark --limit 33 of 80 results (page 1/27)
Quai des Chartrons skatepark [skatepark]
83 Quai Des Chartrons, 33300 Bordeaux, France
https://ridemypark.com/spots/quai-des-chartrons-skatepark
Hangar Darwin skatepark [skatepark]
Allée Cavalière, 33100 Bordeaux, France
https://ridemypark.com/spots/hangar-darwin-skatepark
Zoom skatepark [skatepark]
5 Cours Du Médoc, 33300 Bordeaux, France
https://ridemypark.com/spots/zoom-skateparkInstall
npm install -g @ridemypark/cli # or: npx @ridemypark/cli <command>
npm install -g ridemypark # the short name works tooNode 20 or later. No runtime dependencies.
The package is @ridemypark/cli; the command it installs is
ridemypark. They differ on purpose — the scope says who publishes it, the
binary is what you type. ridemypark is published as well, as a thin alias onto
this package, so the short name you type is also a name you can install. Both
give you the same tool.
Commands
| Command | What it does |
| --- | --- |
| ridemypark search [query] | Search the catalogue |
| ridemypark spot <slug\|id> | One listing in full: address, modules, materials, rating, reviews |
| ridemypark geocode <place> | Resolve a place name to coordinates |
| ridemypark mcp | How to connect an AI assistant to the catalogue |
| ridemypark openapi | Print the API specification the server is serving |
Search options
| Option | Meaning |
| --- | --- |
| --near <place> | Search around a place — geocoded for you |
| --lat <n> --lng <n> | Search around a point |
| --radius <km> | Search radius (default: 50) |
| --type <universe> | spot, event or shop (default: spot) |
| --spot-type <slug> | skatepark, street, pumptrack, bowl, diy… |
| --category <slug> | indoor, outdoor, closed |
| --sport <slug> | skate, bmx, inline, scooter |
| --element <slug> | rail, quarters, bowl… (repeatable) |
| --country <name> | Restrict to one country |
| --min-rating <n> | Minimum rating, out of 5 |
| --open-now | Open right now (listings that publish opening hours) |
| --limit <n> | Results per page (default: 10, max: 500) |
| --page <n> | Page, starting at 1 |
Ratings are sparse: roughly 200 of the 31 000 listings carry one today.
--min-ratingexcludes everything unrated, so it narrows results hard.
--json works on every command and prints the raw API response, for a script or
an agent that will parse it. Without it the output is plain text — no colours,
no control characters, because this output regularly ends up in a pipe, a log
file or a model's context.
Run ridemypark help for the full list.
One listing in full
ridemypark spot zoom-skateparkZoom skatepark
https://ridemypark.com/spots/zoom-skatepark
5 Cours Du Médoc, 33300 Bordeaux, France
44.85629, -0.56429
Type: Skatepark
Categories: Outdoor
Modules: Kicker, Flatbars, Quarters, Stairs, Ledges, Banks, Hubbas, Manual pads
Materials: WoodAs a library
import { search, getListing } from '@ridemypark/cli'
const { data } = await search({ query: 'bowl', sports: ['bmx'], limit: 5 })
const listing = await getListing('cosanostra-skatepark')Same client the CLI uses, same types.
For AI agents
ridemypark mcp prints everything needed to connect an assistant to the
catalogue over MCP — endpoint, transport, and a ready-to-paste command:
claude mcp add --transport http RMP --scope user https://mcp.ridemypark.com/mcpThe MCP server answers questions in natural language, where this CLI answers flags. Both read the same catalogue through the same API.
What it talks to
The public read-only REST API, described by
https://ridemypark.com/openapi.json.
Every command maps to one documented operation:
| Command | Operation |
| --- | --- |
| search | searchListings — GET /wp-json/rmp/v2/search |
| spot | getListing — GET /wp-json/rmp/v1/listing |
| geocode | geocodeAddress — GET /wp-json/rmp/v2/geocode |
Two environment variables override the hosts, for a staging or a local backend:
RIDEMYPARK_API_URL (default https://api.ridemypark.com) and
RIDEMYPARK_WEB_URL (default https://ridemypark.com).
What it will never do
Write. There is no create, no edit, no review posting, and no token is read from the environment or accepted as an option — a CLI that took a secret would invite someone to paste one. Everything that needs an account lives behind the OAuth consent of the MCP server.
Contributing
This package lives in the RideMyPark monorepo, under apps/cli.
bun install
bun run check # typecheck + tests + build
bun src/cli.ts search bercy --limit 3Tests never open a socket: fetch is injected everywhere.
Releases are automatic. Any change that ships in the tarball must raise
version in package.json and CLI_VERSION in src/constants.ts; a guard in
continuous integration turns red otherwise, because a published client that
changed without a new version is a client nobody can pin. Once the change lands
on main, the release workflow publishes that exact version through npm Trusted
Publishing (OIDC) — no npm token is stored anywhere.
Licence
MIT.
