API & MCP

Everything you can do on the site, your own assistant can do for you. One token, two doors, the same 12 tools behind both.

1 · Get a token

Settings → API & MCP. It is shown once and starts with lh_.

2a · MCP

Streamable HTTP at https://letshang.io/mcp with your token as a bearer.

claude mcp add --transport http letshang https://letshang.io/mcp \
  --header "Authorization: Bearer lh_…"

2b · REST

curl https://letshang.io/api/v1/tools/explore_hangouts \
  -H "Authorization: Bearer lh_…" -H "Content-Type: application/json" \
  -d '{"topic":"ai","this_week":true}'

GET /api/v1/me · GET /api/v1/tools (with JSON schemas) · POST /api/v1/tools/{name}. 60 requests a minute. Errors come back as {"error": "…"} with 4xx.

The tools

explore_hangouts(topic, this_week, fits_my_schedule)

Upcoming public tables, soonest first. Each has seats taken, seats still needed before it happens, and its link.

get_hangout(slug)

One table in full: who is sitting (nickname, country), the time options and how many can make each, the deadline, and the Meet link if this account has a seat and the lights are on.

create_hangout(title, topic, description, times, duration_min, min_seats, max_seats, decide_hours, visibility, format)

Set a new table. It only happens if min_seats people sit down before the deadline. Times are ISO 8601 with an offset; one to three options. The account becomes the host and takes the first seat.

grab_seat(slug, times)

Sit down at a table (or join its waitlist when full). With several time options, pass the ones that work as times; omit to accept all.

leave_seat(slug)

Free this account's seat. The host cannot leave their own table.

my_hangouts()

Tables this account sits at or hosts, upcoming first, then the recent past.

share_text(slug)

A ready-to-post invitation for a table, with its link.

table_talk_read(slug, limit)

The last messages of a table's chat. Only for people sitting at it.

table_talk_post(slug, body)

Say something in a table's chat as this account. Only for people sitting at it.

alert_channels()

Where news about this account's tables is announced besides email.

add_alert_channel(kind, url, label, slug)

Announce this account's tables in Discord, Slack, Teams, Google Chat, Telegram or any https URL that takes JSON. With slug the channel only hears about that one table. A test message goes out at once.

remove_alert_channel(id)

Remove one alert channel by id.

Thinking…

Missing something, or found something broken? This goes straight to Primož.