Developers · Node.js

Make a meeting bot speak, from Node.js

A Node.js program that says something in the meeting, with what it printed when it was run.

Ran on 10 November 2026Language Node.jsJob Speak

What it does

One say message after agent-ready, and the words are in the meeting: on the transcript under the bot's name, and read out loud where the server has a voice to read them with.

It needs a key and a meeting code in MEETFUL_KEY and MEETING. Two curl requests make both. MEETFUL_URL is optional and defaults to https://meetful.com.

Node 22 or later. WebSocket and fetch are built into Node from version 22, so there is nothing to install.

The code

// Say something in a Meetful meeting from Node. The words go into the transcript under the bot's name,
// and are read out loud in the room where the server has a voice to read them with.
// MEETFUL_KEY=tmk_… MEETING=abc-defg-hij node speak.mjs "Noted: the launch moves to the third of March."
const base = process.env.MEETFUL_URL || 'https://meetful.com';
const text = process.argv[2] || 'Hello from Node.';
const ws = new WebSocket(base.replace(/^http/, 'ws'));

ws.addEventListener('open', () => {
  ws.send(JSON.stringify({ type: 'agent-hello', key: process.env.MEETFUL_KEY, meeting: process.env.MEETING }));
});

ws.addEventListener('message', ({ data }) => {
  const m = JSON.parse(data);
  if (m.type === 'agent-ready') ws.send(JSON.stringify({ type: 'say', text }));
  if (m.type === 'agent-said') {
    console.log(`${m.by} said: ${m.text}${m.audio ? ' (read aloud)' : ''}`);
    ws.close();
  }
  if (m.type === 'agent-error' || m.type === 'agent-refused') { console.error(m.type, m.why); ws.close(); }
});

Run it

MEETFUL_KEY=tmk_… MEETING=abc-defg-hij node speak.mjs "Noted: the launch moves to the third of March, and Sam owns the docs."

What it printed

🤖 node bot said: Noted: the launch moves to the third of March, and Sam owns the docs.

Run on 10 November 2026 against a Meetful server built from the same code as meetful.com, with two people — Dana and Sam — in the meeting saying three lines. Nothing above was edited.

How it works

The server answers with agent-said, which carries the text and an audio field. On the run below the audio was empty, because that server had no text-to-speech key; on a server with a voice it carries the spoken version, and the room plays it.

say is limited per key, like everything an agent sends. Send one line per thought; a bot that talks in long paragraphs is hard to follow in a meeting anyway.

What can go wrong

Refused: no such key — mint one with POST /api/keys

The key is wrong, or was never minted on this server. A key from one Meetful server does not work on another.

agent-error with a why

Sent too fast, or something this key may not do. The why says which; can in agent-ready lists what is allowed.

Next

In Node.js: join a meeting · live transcript · get the transcript

The same in Python · Go · curl

The whole API · Every socket message and webhook · All guides

Try Meetful

Meetings that take their own notes

Free video meetings in the browser: every line of the transcript under the name of who said it, and the summary and action items when you hang up. Nothing to install — guests just open the link.