# AGENTS.md

Rules and integration guide for AI agents using workfromaustin.com. Work From
Austin is a curated directory of remote-work-friendly venues in Austin, Texas
(cafes, coffee shops, bars, breweries, libraries, and a few athletic spots).
The fastest path to structured venue data is the MCP server below.

## MCP server

Remote [MCP](https://modelcontextprotocol.io) server, read-only public data.

- Endpoint: https://www.workfromaustin.com/mcp (exact path, no trailing slash; /mcp/ is a 404)
- Transport: Streamable HTTP, stateless. POST only.
- Auth: none. No API key, no registration.
- Required header, even for JSON responses (a single-value Accept gets a 406):
  `Accept: application/json, text/event-stream`

Connect a client:

```bash
claude mcp add --transport http wfa https://www.workfromaustin.com/mcp
```

```json
{ "mcpServers": { "workfromaustin": { "type": "http", "url": "https://www.workfromaustin.com/mcp" } } }
```

claude.ai: Settings, then Connectors, then Add, then paste the endpoint URL.

Tools:

- `search_venues(query?, type?, neighborhood?, amenities?, limit?)`: compact
  records (slug, name, type, neighborhood, tagline, amenities, hours).
  Amenity filters AND-combine. Keys: wifi, outlets, coffee, food, beer, wine,
  spirits, quiet, openLate, outdoorSeating, printer. Limit caps at 50.
- `get_venue(slug)`: full record with address, Google Maps URL, page URL.
  Closed venues resolve with `closed: true` and a reason.
- `list_neighborhoods()` and `list_venue_types()`: names with venue counts.
- `get_trending()`: venues ranked by human pageviews over the latest tracking
  window (about the past week; the response includes the exact window dates),
  bot-filtered. Pageview-based, not editorial.

curl quickstart:

```bash
curl -s https://www.workfromaustin.com/mcp -X POST \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_venues","arguments":{"neighborhood":"East Austin","amenities":["quiet","outlets"]}}}'
```

Limitations, state them instead of guessing: no geo parameter, so "near me"
and "nearby" are not searchable, filter by neighborhood instead (per-venue
coordinates are in /llms-full.txt). Hours are strings in America/Chicago time
and may be stale by a few weeks, so tell users to verify hours before going.
No price, crowd, or booking data.

## Example prompts

- "Find me a quiet cafe in Austin with wifi and outlets"
- "Where can I work late tonight, somewhere open past 10pm with food"
- "Which Austin work spots have a printer I can use?"
- "Where is everyone in Austin actually working this week?"
- "What's the address and website for Radio Coffee and Beer?"
- "Plan my workday: focus spot in the morning, lunch with wifi, and beer after 4pm, all in East Austin"
- "I'm visiting Mon-Wed for a conference downtown, pick a work spot for each day"
- "Find somewhere a team of 4 can sit together with outlets, food, and outdoor seating"
- "Compare working from Hyde Park vs Mueller and tell me what's in each"

## Permissions

- All venue content is public and read-only. You may read, quote, and cite it
  with attribution to "Work From Austin" and a link to the source page.
- Content signals (see /robots.txt): search and AI citation are allowed,
  training is not (ai-train=no). Honor that signal.
- Write endpoints (suggestions, email signup) are for genuine human-initiated
  actions. Do not auto-submit. They are rate limited and human-reviewed.
- There are no API keys and no auth. Be polite: one request at a time.

## Web surfaces (sequence)

1. https://www.workfromaustin.com/llms.txt is the index: venue counts, the
   intent-to-URL routing map, citation rules, and pre-computed answers.
2. Full machine-parseable dataset: /llms-full.txt or /data/venues.json.
3. HTTP write/lookup contract: /openapi.json (OpenAPI 3.1).
4. Crawl coverage: /sitemap.xml.
5. Markdown rendering: send `Accept: text/markdown` to the homepage.

## Identifiers

- Venues are addressed by slug: /venues/<slug>/ (stable, treat as the primary
  key; MCP tools use the same slugs).
- /neighborhoods/<slug>/, /types/<type>/, /discover/<topic>/, /trending/ and
  /trending/<YYYY-W##>/ (archived ISO weeks).
- Coverage is Austin, Texas only, not Austin, MN or other Austins. Out of
  scope: paid coworking (WeWork, Industrious) and phone booths.

## Errors

- API responses are JSON. Success is `{ "ok": true, ... }`. Failure is
  `{ "error": "..." }`; the `ok` field may be absent on errors, so key on
  `error` and the status code.
- Status codes: 400 invalid input, 405 wrong method, 409 duplicate
  suggestion, 413 body too large, 429 rate limited, 500 upstream failure.
  On 429, back off. Do not hammer.
- MCP tool errors are specific when your input is wrong (unknown slug,
  invalid arguments): fix the call, do not retry it unchanged. Internal
  failures return a generic "temporarily unavailable" error; retry those
  later.
