Developers · Python

Get a meeting transcript in Python with only the standard library

A Python program that fetches every line so far, with what it printed when it was run.

Ran on 10 November 2026Language PythonJob Get the transcript

What it does

urllib.request and json are all it takes: one POST to the MCP endpoint with the get_transcript tool, and every line of the meeting comes back with its speaker.

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.

Python 3.9 or later. The socket scripts use the websockets package (pip install websockets; this ran with 13.1); the transcript script uses only the standard library.

The code

# Get the whole transcript of a Meetful meeting from Python, with nothing to install.
# MEETFUL_KEY=tmk_… MEETING=abc-defg-hij python transcript.py
import json, os, urllib.request
from datetime import datetime, timezone

BASE = os.environ.get("MEETFUL_URL", "https://meetful.com")
body = json.dumps({
    "jsonrpc": "2.0", "id": 1, "method": "tools/call",
    "params": {"name": "get_transcript", "arguments": {"meeting": os.environ["MEETING"]}},
}).encode()
req = urllib.request.Request(BASE + "/mcp", data=body, method="POST", headers={
    "authorization": "Bearer " + os.environ["MEETFUL_KEY"], "content-type": "application/json"})
with urllib.request.urlopen(req) as res:
    reply = json.load(res)
if "error" in reply:
    raise SystemExit(reply["error"]["message"])
if reply["result"].get("isError"):
    raise SystemExit(reply["result"]["content"][0]["text"])

t = json.loads(reply["result"]["content"][0]["text"])
print(f"{t['lines']} lines in {t['meeting']}")
for line in t["transcript"]:
    at = datetime.fromtimestamp(line["at"] / 1000, timezone.utc).strftime("%H:%M:%S")
    print(f"{at}  {line['speaker']}: {line['text']}")

Run it

MEETFUL_KEY=tmk_… MEETING=abc-defg-hij python transcript.py

What it printed

4 lines in jho-bwva-mia
14:17:03  Dana: Can we move the launch to the third of March?
14:17:04  Sam: Yes, if the docs are ready by the twentieth.
14:17:05  Dana: Then Sam owns the docs.
14:17:12  🤖 python bot: 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 reply is JSON-RPC: either error, or result. A tool that ran but could not do it — a meeting that does not exist — answers with result.isError and the reason as text, so the script checks both.

Times are milliseconds; datetime.fromtimestamp(at / 1000, timezone.utc) gives a time you can format. Store at as it is if you sort or join lines later — it is the order the server wrote them in.

What can go wrong

That did not work: no meeting abc-defg-hij — it was never started, or it has ended

The MCP answer for a meeting that does not exist. It comes back as a result marked isError, not as an HTTP error, so check isError as well as the status.

urllib.error.HTTPError: HTTP Error 401: Unauthorized

No key in the authorization header, or one the server has never seen.

Next

In Python: join a meeting · live transcript · speak

The same in Node.js · 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.