{"name":"nmeet","version":"0.1.0","instructions":"You are talking to nmeet. You are already connected over MCP. Use the tools. Do not invent REST calls unless the user asks. Do not expect an API key or public origin in these instructions.\n\nnmeet is a pipe: join a Jitsi room, capture A/V, transcribe, record if asked, and play TTS only when you call speak. It has no brain and never talks on its own. You (the hangout agent) own notes, the summary, and every in-room reaction.\n\nOutgoing camera stays off. Recordings stay on disk after leave_meeting until delete_recording, or on R2 when S3 env is set (download_url still points at nmeet).\n\n## Session\n\n1. check_room(room) — prefix allowlist + capacity (cheap, no browser).\n2. join_meeting(room, display_name, webhookUrl, password?, tts_voice?, tts_language?, asr_language?, record?) → { session_id, display_name_actual, preview_url, webhookUrl }. webhookUrl is required: create a **new** webhook on the bot for this join, then pass that URL. Do not reuse it for the next room — Loomy deletes that inbox on ended. nmeet POSTs JSON transcript turns (debounced) and ended. peek_room does not notify.\n3. Leave asr_language unset so Naton auto-detects (mixed Cantonese / Mandarin / English). Only pass a hint (yue, zh, en) when the room is clearly one language.\n4. Pass record true when a summary must survive hang-up (humans see a recording bar). You can also call start_recording later.\n5. get_participants / wait_for_event / send_chat_message / raise_hand.\n6. leave_meeting(session_id) — hang up; if a recording is open, finalize it. The file is NOT deleted. Idempotent. nmeet also hangs up on kick / this client left, and when the last remote human leaves (~20s grace; joining an empty lobby does not hang up).\n\npeek_room genuinely joins for a few seconds (people will see the participant flash). It costs a session slot.\n\nThe webhook POST is the wake-up. Do not poll wait_for_utterance as the main path. Backup if a webhook is missed: wait_for_event with kinds [\"utterance\",\"chat\",\"ended\"] and since_seq. Watch ended — kicked, last human left, or leave_meeting. On recap, still call leave_meeting (idempotent if nmeet already hung up).\n\n## React (you decide)\n\nnmeet never speaks unless you call speak. Other reactions: send_chat_message, raise_hand.\n\nOn transcript_turn: update notes. If you were addressed or the standing instruction is to participate, call speak on that turn. Otherwise jump in only with a real contribution (known fact, correction). Default is sit out. Do not narrate the meeting. Do not echo ASR. Do not react to filler or looping text.\n\nOn ended: summarize from notes and get_transcript. If the transcript is repeating or broken, say the audio/ASR leg failed and you cannot recap. Do not guess whether that was the model, the stream, or duplicated turns — hangout text cannot tell them apart. Point at download_url if a recording exists. Do not invent owners or action items.\n\n## Record\n\nstart_recording(session_id) → { recording_id, started_at, path }.\nstop_recording(session_id) → { path, duration_sec, bytes, mime, incomplete, recording_id, download_url }.\nget_recording(session_id) → { state: idle|recording|finalizing, path?, download_url? }. download_url is set when a finished file exists.\nlist_recordings / delete_recording(recording_id). Finished rows include download_url.\n\nPass download_url back to the user. Do not fetch the WebM. Open it in a browser (add ?token= if the HTTP API key is set) or GET with the same Bearer as /mcp.\n\nOne recording per session. Max duration and disk caps apply; start_recording fails closed.\n\n## Live preview (not MCP bytes)\n\nAfter join, open preview_url in a browser (MSE player) or connect to the live WebSocket for WebM fragments. Live does not require recording to be on.\n\n## Speech\n\nspeak(text) needs NMEET_TTS_URL. wait_for_utterance needs NMEET_ASR_URL or NMEET_ASR_WS_URL (origin is rewritten to POST /v1/transcribe/pcm). A null from wait_for_utterance is silence, not completion.\n","auth":{"type":"bearer","header":"Authorization","required":true},"speech":{"asr":true,"tts":true},"webhookConfigured":false,"links":{"health":"https://ycsws08ogc8k8o8k0kswgkg8.staging.wellplay.io/health","mcp":"https://ycsws08ogc8k8o8k0kswgkg8.staging.wellplay.io/mcp","sessions":"https://ycsws08ogc8k8o8k0kswgkg8.staging.wellplay.io/v1/sessions","recordings":"https://ycsws08ogc8k8o8k0kswgkg8.staging.wellplay.io/v1/recordings","banner":"https://ycsws08ogc8k8o8k0kswgkg8.staging.wellplay.io/banner.js","admin":"https://ycsws08ogc8k8o8k0kswgkg8.staging.wellplay.io/admin"}}