JO

Joinly MCP Server: AI Bots, Live Transcripts

Deploy an MCP server to send AI bots to Zoom, Teams, and Google Meet, capture live transcripts, speak text, and post messages in meeting chat.

Overview

Joinly MCP Server implements the Model Context Protocol (MCP) to deploy AI “bots” that can join video meetings (Zoom, Microsoft Teams, Google Meet), capture live transcripts, synthesize speech, and post messages into meeting chat. It acts as a bridge between meeting platforms, speech/text processing services, and large language models (LLMs), enabling developers to build assistants that observe, summarize, respond, and speak during live meetings.

For developers, Joinly provides a hosted or self-deployable service that handles meeting connection, real‑time transcript streaming, text-to-speech (TTS) output, and chat posting APIs. This centralizes platform-specific complexities (OAuth, SDK differences, reconnection) and exposes a consistent MCP-driven API suitable for hooking models, webhooks, or other automation.

Features

  • Join Zoom, Teams, and Google Meet meetings as an automated participant (bot)
  • Capture live audio → real-time transcripts (streamed via WebSocket or webhooks)
  • Speak text into meetings using configurable TTS voices
  • Post messages into meeting chat channels
  • Pluggable model integration (OpenAI / local LLMs / custom inference)
  • Session lifecycle management (create/join/leave, error handling, reconnect)
  • Webhook and socket events for transcripts, speaker changes, and chat activity
  • Deployable via Docker or local Node runtime with environment configuration

Installation / Configuration

Prerequisites: Docker (recommended) or Node.js >=14 and access credentials for target meeting platforms and any chosen model provider.

Clone repository:

git clone https://github.com/joinly-ai/joinly.git
cd joinly

Environment variables (example .env):

# Model provider
OPENAI_API_KEY=sk-...

# MCP server secret
MCP_SECRET=supersecretvalue

# Zoom (if using Zoom SDK/API)
ZOOM_API_KEY=your_zoom_api_key
ZOOM_API_SECRET=your_zoom_api_secret

# Google Meet (OAuth credentials)
GOOGLE_CLIENT_ID=...
GOOGLE_CLIENT_SECRET=...

# Microsoft Teams (app credentials)
TEAMS_APP_ID=...
TEAMS_APP_SECRET=...

Run with Docker Compose (example):

version: "3.8"
services:
  joinly:
    image: joinlyai/joinly:latest
    env_file: .env
    ports:
      - "8080:8080"
    restart: unless-stopped

Start:

docker-compose up -d

Run locally (Node):

npm install
npm run build
npm start
# or for development
npm run dev

Configuration notes:

  • Keep platform credentials secure and scoped to only required OAuth scopes (meeting:read/write, chat posting, audio)
  • Configure TTS provider (internal or external) via env vars
  • Set up webhook endpoint(s) to receive transcripts, speaker events, errors

Available Resources

  • GitHub repo: https://github.com/joinly-ai/joinly
  • Example clients: included sample scripts for creating sessions and streaming transcripts
  • API documentation: (look in /docs or /api in repo) — contains MCP endpoints and event schemas
  • WebSocket endpoint: ws:///ws/sessions/{session_id}/stream for realtime transcript and speaker events
  • Webhooks: configure POST targets to receive events for transcripts, chat, and bot status
  • Example API endpoints (typical):

    EndpointMethodPurpose
    /api/v1/sessionsPOSTCreate a bot session and instruct it to join a meeting
    /api/v1/sessions/{id}/speakPOSTMake bot speak given text
    /api/v1/sessions/{id}/chatPOSTPost a message into meeting chat
    /api/v1/sessions/{id}/transcriptsGET / WSRetrieve or stream live transcripts

    Example: create and join a meeting (curl)

    curl -X POST https://your-joinly-host/api/v1/sessions \
      -H "Authorization: Bearer ${MCP_SECRET}" \
      -H "Content-Type: application/json" \
      -d '{
        "platform": "zoom",
        "meeting_url": "https://zoom.us/j/1234567890",
        "display_name": "NotesBot",
        "model": "openai/gpt-4o",
        "transcript_webhook": "https://yourapp.example.com/webhooks/transcript"
      }'
    

    Speak text and post chat:

    # speak
    curl -X POST https://your-joinly-host/api/v1/sessions/SESSION_ID/speak \
      -H "Authorization: Bearer ${MCP_SECRET}" \
      -d '{"text":"Hello everyone — I will summarize main points after the agenda.", "voice":"alloy"}'
    
    # post chat
    curl -X POST https://your-joinly-host/api/v1/sessions/SESSION_ID/chat \
      -H "Authorization: Bearer ${MCP_SECRET}" \
      -d '{"text":"Link to the notes: https://example.com/notes/123"}'
    

    Use Cases

    • Meeting summarization: stream live transcript to an LLM via MCP, produce rolling summaries or action items and post them in chat at intervals.
    • Accessibility & captioning: provide real-time captions for participants with hearing impairments, or translate speech into another language and speak the translation into the meeting.
    • Live QA assistant: attach a question-answering bot that listens to discussion and answers factual queries in chat or by speaking short responses.
    • Compliance & moderation: detect sensitive language or policy violations in the live transcript and trigger alerts or muted interventions.
    • Automated note-taking and distribution: capture key points, assign tasks, and automatically publish summarized meeting minutes to Slack/Email after the session.

    Security & operational tips:

    • Use least-privilege credentials and rotate keys regularly.
    • Rate-limit model calls and handle backpressure for large meetings.
    • Test TTS voice levels and join/leave flows in staging before production.

    For implementation details, reference the repository README and API docs in the GitHub project for endpoint schemas, event payload examples, and sample client code.