npm package: @striderlabs/mcp-nextdoor
Description: MCP server for Nextdoor - local community platform automation
Author: Strider Labs
Latest version: 1.0.0

# @striderlabs/mcp-nextdoor

MCP (Model Context Protocol) server for Nextdoor — the local community platform. Automate neighborhood feed browsing, marketplace search, event discovery, and local service finding using Playwright with Browserbase.

## Requirements

- Node.js 18+
- A [Browserbase](https://browserbase.com) account with a CDP-enabled session URL
- A Nextdoor account

## Environment Variables

| Variable | Required | Description |
|---|---|---|
| `BROWSERBASE_CDP_URL` | Yes | Browserbase CDP WebSocket URL for browser connection |
| `NEXTDOOR_EMAIL` | Yes | Your Nextdoor account email |
| `NEXTDOOR_PASSWORD` | Yes | Your Nextdoor account password |

## Installation

```bash
npm install @striderlabs/mcp-nextdoor
```

Or from tarball:

```bash
npm install ./striderlabs-mcp-nextdoor-1.0.0.tgz
```

## MCP Configuration

Add to your MCP client config (e.g., Claude Desktop `~/.claude/claude_desktop_config.json`):

```json
{
  "mcpServers": {
    "nextdoor": {
      "command": "node",
      "args": ["/path/to/node_modules/@striderlabs/mcp-nextdoor/dist/index.js"],
      "env": {
        "BROWSERBASE_CDP_URL": "wss://connect.browserbase.com?apiKey=YOUR_KEY&sessionId=YOUR_SESSION",
        "NEXTDOOR_EMAIL": "you@example.com",
        "NEXTDOOR_PASSWORD": "yourpassword"
      }
    }
  }
}
```

## Tools

### `get_feed`
Get posts from your Nextdoor neighborhood feed.

**Parameters:**
- `limit` (number, 1-50, default: 10) — Number of posts to retrieve
- `category` (string, default: "all") — Filter by: `all`, `crime_safety`, `lost_found`, `free_stuff`, `recommendations`, `general`

**Example:**
```json
{ "limit": 5, "category": "crime_safety" }
```

---

### `create_post`
Draft a new post in your Nextdoor neighborhood. The post is loaded into the composer but not auto-submitted (safety measure).

**Parameters:**
- `title` (string, required) — Post title
- `body` (string, required) — Post body content
- `category` (string, default: "general") — Category: `general`, `crime_safety`, `lost_found`, `free_stuff`, `recommendations`

**Example:**
```json
{ "title": "Lost black cat - Maple St area", "body": "Missing since Tuesday evening...", "category": "lost_found" }
```

---

### `search_marketplace`
Search Nextdoor's For Sale & Free marketplace.

**Parameters:**
- `query` (string, required) — Search terms
- `max_price` (number, optional) — Maximum price
- `min_price` (number, optional) — Minimum price
- `limit` (number, 1-50, default: 10) — Number of listings

**Example:**
```json
{ "query": "bicycle", "max_price": 200, "limit": 5 }
```

---

### `get_events`
Get upcoming local events from Nextdoor.

**Parameters:**
- `limit` (number, 1-50, default: 10) — Number of events
- `days_ahead` (number, 1-90, default: 30) — Days ahead to look

**Example:**
```json
{ "limit": 10, "days_ahead": 14 }
```

---

### `get_recommendations`
Get local business recommendations from neighbors.

**Parameters:**
- `category` (string, default: "all") — Business type (e.g., `restaurant`, `plumber`, `dentist`)
- `limit` (number, 1-50, default: 10) — Number of recommendations

**Example:**
```json
{ "category": "restaurant", "limit": 5 }
```

---

### `find_services`
Search for local service providers.

**Parameters:**
- `service_type` (string, required) — Service to find (e.g., `plumber`, `electrician`, `babysitter`)
- `limit` (number, 1-50, default: 10) — Number of providers

**Example:**
```json
{ "service_type": "house cleaner", "limit": 5 }
```

## How It Works

The server uses Playwright to connect to a Browserbase-managed Chromium browser via CDP (Chrome DevTools Protocol). It navigates to Nextdoor, authenticates with your credentials, and scrapes or interacts with the page to fulfill tool requests.

```
MCP Client → mcp-nextdoor server → Playwright CDP → Browserbase → Chromium → nextdoor.com
```

## Notes

- **Authentication**: The server logs in using email/password on first use. Sessions are reused across tool calls.
- **Post creation**: `create_post` drafts content into the composer but does not submit automatically to prevent accidental posts.
- **Selectors**: Nextdoor's frontend changes periodically. If extraction returns empty results, the page structure may have changed.
- **Rate limiting**: Be respectful of Nextdoor's terms of service and avoid excessive automated requests.

## License

MIT — Strider Labs