espaciarte-mcp
# espaciarte-mcp
Minimal [MCP](https://modelcontextprotocol.io) server exposing Espaciarte's **public space discovery** to external AI clients (Claude Desktop, Cursor). A thin, read-only wrapper over the backend REST API — no database access, no LLM calls, no auth, no secrets.
## Tools
| Tool | Wraps | Purpose |
| ------------------- | ------------------------------------ | ------------------------------------------------------------------ |
| `search_spaces` | `GET /api/discovery/spaces` | Geo-search published spaces (`lat`/`lng`/`radius` + optional filters) |
| `get_space_details` | `GET /api/discovery/spaces/:id` | Full public detail of one published space |
The backend already handles privacy (published spaces only, obfuscated locations, no PII); this server returns its responses untouched.
## Setup
```bash
pnpm install
pnpm build
```
Requires the backend running (default `http://localhost:8000` — `pnpm dev` in `espaciarte-backend/` with the DB up).
## Configuration
Single env var:
| Var | Default | Purpose |
| ------------------ | ----------------------- | ------------------------ |
| `BACKEND_BASE_URL` | `http://localhost:8000` | Espaciarte backend URL |
### Claude Desktop (`claude_desktop_config.json`)
```json
{
"mcpServers": {
"espaciarte": {
"command": "node",
"args": ["/Users/vicentecantu/Development/espaciarte/espaciarte-mcp/dist/index.js"],
"env": { "BACKEND_BASE_URL": "http://localhost:8000" }
}
}
}
```
### Cursor (`~/.cursor/mcp.json` or `.cursor/mcp.json`)
```json
{
"mcpServers": {
"espaciarte": {
"command": "node",
"args": ["/Users/vicentecantu/Development/espaciarte/espaciarte-mcp/dist/index.js"],
"env": { "BACKEND_BASE_URL": "http://localhost:8000" }
}
}
}
```
## Smoke test
```bash
pnpm smoke # 9-check battery: both tools live, error paths, privacy fields (needs backend up)
pnpm inspect # MCP Inspector UI against the built server
```
Or headless: `npx @modelcontextprotocol/inspector --cli node dist/index.js --method tools/list`
Note: local seed data is geo-centered on **Monterrey** (25.6866, -100.3161) — searches around other cities correctly return 0 items.
TDQS
Scored across 2 tools
The two tools have clearly distinct purposes: one searches for spaces with filtering, while the other retrieves full details for a specific space. There is no overlap or ambiguity in their intended use.
Both tools follow a consistent verb_noun pattern (search_spaces, get_space_details). Though the verbs differ, the structure is predictable and readable.
With only 2 tools, the server feels minimal but not absurdly thin. The scope appears to be read-only space exploration, and these two tools cover the primary needs, though more operations could be expected.
For a public-facing space discovery API, the combination of search and detail retrieval covers the core use case. Missing operations like booking or creating are outside the apparent purpose, so no critical gaps are evident.