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.
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 endedThe 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: UnauthorizedNo 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.