Skip to main content

MCP Server

The Model Context Protocol (MCP) server provides a standardized interface that allows any compatible AI model or agent to access your Follow data securely.

Connect to our MCP server natively in Claude, Cursor, and other clients, or use the mcp-remote module for backwards compatibility with clients that do not support remote MCP.

Follow's MCP server follows the authenticated remote MCP spec, so the server is centrally hosted and managed. The server has tools available for managing locations, monitoring stations, controlling locks, listing access codes, and tracking usage, with more functionality on the way. Feedback on its functionality is welcomed.

Setup instructions

General

Our MCP server supports Streamable HTTP transports. This transport uses OAuth 2.1 with PKCE for authentication at the following address:

https://mcp.follow.tech/mcp

For instructions for specific clients, read on...

Claude Desktop

From Claude settings > Connectors, add a new connector with the URL https://mcp.follow.tech/mcp.

Alternatively, add the following to your configuration file (~/Library/Application Support/Claude/claude_desktop_config.json on macOS, %APPDATA%\Claude\claude_desktop_config.json on Windows):

{
"mcpServers": {
"follow": {
"url": "https://mcp.follow.tech/mcp"
}
}
}

Claude Code

claude mcp add --transport http follow https://mcp.follow.tech/mcp

Then run /mcp once you've opened a Claude Code session to go through the authentication flow.

Cursor

To add the MCP to Cursor, open Settings > MCP Servers and add a new server with the following configuration:

{
"mcpServers": {
"follow": {
"url": "https://mcp.follow.tech/mcp"
}
}
}

Visual Studio Code

CTRL/CMD + P and search for MCP: Add Server, then select Command (stdio) and enter:

npx mcp-remote https://mcp.follow.tech/mcp

Enter the name Follow and hit enter. Activate the server using MCP: List Servers, selecting Follow, then Start Server.

Alternatively, add the following to your .vscode/settings.json:

{
"mcp": {
"servers": {
"follow": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.follow.tech/mcp"]
}
}
}
}

Windsurf

  1. CTRL/CMD + , to open Windsurf settings.
  2. Scroll to Cascade > MCP servers.
  3. Select Add Server > Add custom server.
  4. Add the following:
{
"mcpServers": {
"follow": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.follow.tech/mcp"]
}
}
}

Others

Many other tools now support MCP servers. You can configure them to use Follow's MCP server with the following settings:

  • Command: npx
  • Arguments: -y mcp-remote https://mcp.follow.tech/mcp
  • Environment: None

Available tools

The assistant discovers tools automatically when connected. They are scoped to your account — an OWNER only ever sees their own locations, stations, rentals and customers.

Assets & devices

  • list_locations, get_location, list_rental_durations
  • list_stations, list_equipment
  • list_station_codes, list_lock_codes, list_station_events

Live device operations — billed (count against your API quota)

  • get_station_status, get_locks_status, get_lock_status
  • unlock_lock — requires the elevated mcp:unlock scope (see below)

Rentals & business data

  • list_rentals (current / history), get_rental
  • get_payment_attempts — every Stripe charge attempt on a rental's invoice (timestamps, outcome, decline reason), to diagnose failed or retried payments
  • get_revenue_summary (by month, location or station), get_rental_stats
  • list_customers, get_customer
  • get_available_equipments — find equipment that could replace a rental's current one (same station, active lock, not already busy elsewhere)
  • update_rental — reschedule a rental's start, or swap its equipment for another
  • get_extend_options — how far a rental can be extended right now (hours bounded by Stripe pre-authorization headroom and equipment availability)
  • extend_rental — extend a Stripe-paid rental by a chosen number of hours (priced at the plain hourly rate), charging it out of the rental's existing pre-authorization instead of making a new charge

get_rental also returns the rental's status history (events): every status transition with its timestamp, cause (payment confirmed, automatic timeout, closed by an admin, ended by the customer…) and the acting admin when applicable — so "why is this rental closed?" is one call.

Filtering, ranking & compact output

These tools are built to answer a question in a single small response rather than dumping raw data:

  • list_rentals filters server-side by location_id, station_id, date range (from / to, on the rental start date), invoice_status (e.g. PAID, FAILED, CANCELED), and rental_status — plus page / page_size. Prefer filters over paging through everything.
  • list_customers accepts from / to, location_id, and invoice_status. Each row carries rentalCount and paidRentalCount; setting invoice_status (e.g. PAID) keeps only customers with such a rental and ranks them by that count — so "customers with the most charged rentals last year" is one call.
  • Compact by default: list tools return a lean summary per row. Pass verbose: true for the full objects, use get_rental for one rental in full, or format: csv for a compact tabular export.
  • For counts, totals or rankings, prefer get_rental_stats / get_revenue_summary / list_customers over listing rentals.
  • Very large results are truncated with a _meta note (how many were returned, the total, and how to narrow) instead of failing — so a query never overflows silently.
  • Rental start/end are returned in Europe/Paris local time (ISO 8601 with the UTC offset, e.g. 2026-08-03T13:00:00+02:00) — every location is in France, so there's no per-location timezone to resolve.

Station health & telemetry — free

  • list_station_health — which stations are online/offline or low on battery right now
  • get_station_telemetry_history — voltage & signal trends over time
  • get_station_connectivity — when a station disconnected (downtime windows)

Usage

  • get_usage, get_lock_usage
Billing

Only the live device operations above are metered. Account-data operations (rentals — including rescheduling, swapping equipment or extending a rental's duration — revenue, customers, telemetry history) are free.

Customer privacy

Customer name, email and phone are redacted by default. Tools that can surface them (list_rentals, get_rental, list_customers, get_customer) only return PII when called with include_pii: true, and only ever for your own account's customers.

Unlocking requires an elevated scope

unlock_lock opens a physical lock, so it needs the mcp:unlock scope in addition to the default mcp:tools (read) scope. When you authorize the server you'll see the requested permissions on the consent screen. If your client only requested read access, unlock_lock returns a clear "re-authorize with the mcp:unlock permission" message — reconnect and approve unlock access to use it. All other tools work with the default scope.

FAQ

What can the AI assistant do?

The MCP server gives the AI assistant tools to manage your locations; monitor station status, voltage, signal and connectivity history; check lock states and unlock locks; list access codes and events; list rentals and customers with their full status history and payment attempts; reschedule a rental, swap its equipment, or extend its duration; report revenue and rental statistics; and track API usage. The assistant will discover the available tools automatically when connected.

Do I need a separate account?

No. You log in with your existing Follow credentials during the OAuth flow. Your account must have an ADMIN or OWNER role to access the MCP server.

Can the AI assistant unlock doors?

Yes, the unlock tool is available. The assistant will typically confirm before executing an unlock. It requires the elevated mcp:unlock scope (approved on the consent screen when you authorize) and is a billed operation that counts against your API quota.

Why am I seeing an authentication error?

Try clearing cached auth info by running the following in your terminal:

rm -rf ~/.mcp-auth

Then reconnect. If the issue persists, make sure you are using a supported Node.js version (20+).

What happens if my session expires?

The MCP server automatically refreshes tokens when possible. If the session has fully expired, your AI client will prompt you to re-authenticate through the browser.

What's next?