Start meetings and work with meeting transcripts, notes, recordings and follow-up tasks.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer followed by your own TeamMeet API key. Create a key using the developer guide. Never embed a key in a shared configuration.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Generate a picture from a description and put it in the meeting for everyone to see.
diagram and infographic render legible labels; visual and meme are for imagery.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http teammeet https://teammeet.ai/mcp \ --header 'Authorization: Bearer YOUR_TOKEN'
Headers
Authorization (required): Bearer followed by your own TeamMeet API key. Create a key using the developer guide. Never embed a key in a shared configuration.Generate a picture from a description and put it in the meeting for everyone to see.
| Argument | Type | Description |
|---|---|---|
| kind | string | diagram and infographic render legible labels; visual and meme are for imagery. |
| prompt* | string | |
| meeting* | string |
{
"type": "object",
"required": [
"meeting",
"prompt"
],
"properties": {
"kind": {
"enum": [
"visual",
"diagram",
"infographic",
"meme"
],
"type": "string",
"description": "diagram and infographic render legible labels; visual and meme are for imagery."
},
"prompt": {
"type": "string"
},
"meeting": {
"type": "string"
}
}
}What the room has read out of the conversation so far — decisions, open questions, actions and live disagreements. Every item carries a verbatim quote from the transcript; anything that failed that check is marked unverified rather than presented as fact.
| Argument | Type | Description |
|---|---|---|
| meeting* | string |
{
"type": "object",
"required": [
"meeting"
],
"properties": {
"meeting": {
"type": "string"
}
}
}One task handed to you from a call, in full: the words the person asked in, who they are, the lines of the call just before (each with the microphone it came in on), and any TeamMeet fix request it is about.
| Argument | Type | Description |
|---|---|---|
| task* | string | The task id, tmt_… |
{
"type": "object",
"required": [
"task"
],
"properties": {
"task": {
"type": "string",
"description": "The task id, tmt_…"
}
}
}The full transcript of a meeting, with who said each line. Speaker attribution here is not a guess from a mixed audio stream — each microphone is transcribed separately, so the name on a line is the connection the words arrived on.
| Argument | Type | Description |
|---|---|---|
| since | number | Only lines after this epoch-ms timestamp. |
| meeting* | string | The meeting code, like abc-defg-hij. |
{
"type": "object",
"required": [
"meeting"
],
"properties": {
"since": {
"type": "number",
"description": "Only lines after this epoch-ms timestamp."
},
"meeting": {
"type": "string",
"description": "The meeting code, like abc-defg-hij."
}
}
}Hand a task to another person's agent, from the call you are in — they see it in the call and send it to their Claude with one press. Name the person as they appear in the call.
| Argument | Type | Description |
|---|---|---|
| to* | string | The person's name as it shows in the call. |
| task* | string | What their agent should do, in plain words. |
| meeting* | string |
{
"type": "object",
"required": [
"meeting",
"to",
"task"
],
"properties": {
"to": {
"type": "string",
"description": "The person's name as it shows in the call."
},
"task": {
"type": "string",
"description": "What their agent should do, in plain words."
},
"meeting": {
"type": "string"
}
}
}Bring a meeting transcript or a chat log from another tool into the dashboard of the account this key was minted by — .vtt/.srt captions (Zoom, Google Meet, Teams, Fireflies, Grain), Otter-style text, Read AI JSON, any JSON list of turns with names and times, or the chats: Google Meet's chat log, Zoom's meeting_saved_chat.txt, a WhatsApp export. Speaker labels are kept exactly as written; a chat is filed as a chat. Returns the meeting id and link.
| Argument | Type | Description |
|---|---|---|
| name* | string | The file name, with its extension — it says what format this is and often carries the date. |
| text* | string | The whole file as text. |
| title | string | A title for the meeting, if the file name is not one. |
| started_at | string | ISO 8601 start time, if the file does not say. |
{
"type": "object",
"required": [
"name",
"text"
],
"properties": {
"name": {
"type": "string",
"description": "The file name, with its extension — it says what format this is and often carries the date."
},
"text": {
"type": "string",
"description": "The whole file as text."
},
"title": {
"type": "string",
"description": "A title for the meeting, if the file name is not one."
},
"started_at": {
"type": "string",
"description": "ISO 8601 start time, if the file does not say."
}
}
}Join a TeamMeet call you are in, as your own agent — "<your name>'s Claude" appears in the call, announced in its chat, and anyone in it can remove you. Then call listen to hear it. You can only join a call the person this connector belongs to is in (signed in) or started.
| Argument | Type | Description |
|---|---|---|
| meeting* | string | The meeting code, like abc-defg-hij, or its link. |
{
"type": "object",
"required": [
"meeting"
],
"properties": {
"meeting": {
"type": "string",
"description": "The meeting code, like abc-defg-hij, or its link."
}
}
}List the meetings this key started that are still running, with how many people are in each.
No arguments.
{
"type": "object",
"properties": {}
}Recordings this key can see, newest first, with their share links.
| Argument | Type | Description |
|---|---|---|
| meeting | string |
{
"type": "object",
"properties": {
"meeting": {
"type": "string"
}
}
}Wait for what happens next in a call you joined: new transcript lines with who said each (ground truth — every microphone is transcribed on its own), new chat messages, and tasks handed to you. Returns as soon as there is something, or after wait_seconds. Pass back the "next" value as since. Keep calling it to stay in the call; you leave after 90 seconds without one.
| Argument | Type | Description |
|---|---|---|
| since | number | The "next" value from the last listen. Omit for the last few minutes. |
| meeting* | string | |
| wait_seconds | number | How long to wait for something new, up to 45. Default 25. |
{
"type": "object",
"required": [
"meeting"
],
"properties": {
"since": {
"type": "number",
"description": "The \"next\" value from the last listen. Omit for the last few minutes."
},
"meeting": {
"type": "string"
},
"wait_seconds": {
"type": "number",
"description": "How long to wait for something new, up to 45. Default 25."
}
}
}What your calls have handed to you — the person this TeamMeet connector belongs to — to do: who asked, what they asked for, which call, and where each one has got to. Open ones first. Use get_task for the whole of one.
| Argument | Type | Description |
|---|---|---|
| all | boolean | Include finished and declined ones too. |
{
"type": "object",
"properties": {
"all": {
"type": "boolean",
"description": "Include finished and declined ones too."
}
}
}File something you noticed about Team Meet — a bug, a confusing moment, an idea. It goes on the list the product is built from; repeats are counted and move the item up. Be specific: the page, what you expected, what happened. Set fix=true when the person wants the platform itself changed: it becomes a fix request, an AI engineer turns it into a pull request, and a person reviews it before it ships. The reply carries a link to follow it.
| Argument | Type | Description |
|---|---|---|
| fix | boolean | true = the person wants this FIXED in the platform; it becomes a pull request. |
| kind | string | |
| page | string | The URL or path where you noticed it. |
| text* | string | What you noticed, in one or a few sentences. |
| actual | string | |
| expected | string | |
| severity | integer | 5 = blocks the task, 1 = polish |
{
"type": "object",
"required": [
"text"
],
"properties": {
"fix": {
"type": "boolean",
"description": "true = the person wants this FIXED in the platform; it becomes a pull request."
},
"kind": {
"enum": [
"bug",
"idea",
"confusing",
"praise",
"question"
],
"type": "string"
},
"page": {
"type": "string",
"description": "The URL or path where you noticed it."
},
"text": {
"type": "string",
"description": "What you noticed, in one or a few sentences."
},
"actual": {
"type": "string"
},
"expected": {
"type": "string"
},
"severity": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"description": "5 = blocks the task, 1 = polish"
}
}
}Post a message into the meeting chat, from this agent, under its own name. Everyone in the room sees it.
| Argument | Type | Description |
|---|---|---|
| text* | string | |
| meeting* | string |
{
"type": "object",
"required": [
"meeting",
"text"
],
"properties": {
"text": {
"type": "string"
},
"meeting": {
"type": "string"
}
}
}Send the TeamMeet notetaker to a Zoom, Google Meet, Microsoft Teams or Webex meeting you did not host. It joins as a participant, records, and when the call ends the transcript, recap and action items land in the dashboard of the account this key was minted by. Needs a key minted while signed in. Metered in minutes per month by plan.
| Argument | Type | Description |
|---|---|---|
| url* | string | The meeting link. |
| name | string | What the bot is called in the call. Default "TeamMeet notetaker". |
| join_at | string | ISO 8601 time to join, for a meeting later today. Omit to join now. |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "The meeting link."
},
"name": {
"type": "string",
"description": "What the bot is called in the call. Default \"TeamMeet notetaker\"."
},
"join_at": {
"type": "string",
"description": "ISO 8601 time to join, for a meeting later today. Omit to join now."
}
}
}Say something out loud in the meeting. It is spoken through the room's speakers and joins the transcript, so it is on the record like anything else that was said. Use sparingly — this interrupts people.
| Argument | Type | Description |
|---|---|---|
| text* | string | Keep it to a sentence or two. Nobody wants to be read a paragraph. |
| meeting* | string |
{
"type": "object",
"required": [
"meeting",
"text"
],
"properties": {
"text": {
"type": "string",
"description": "Keep it to a sentence or two. Nobody wants to be read a paragraph."
},
"meeting": {
"type": "string"
}
}
}Start a new meeting and get its code and link. The link works in any browser with no account and no download. Nobody can join a meeting that was not started this way.
| Argument | Type | Description |
|---|---|---|
| mode | string | What the AI in the room should do with what is said. "meet" keeps live notes; "agenda" tracks topics you supply; "brainstorm" draws pictures from the conversation; "align" runs a decision protocol; "legal" is a two-party call with Counsel, an AI counsel that reads the draft aloud and proposes wording both parties must accept (the host calls it in from the room). Defaults to brainstorm. |
| topics | array | Agenda topics, if mode is agenda. |
{
"type": "object",
"properties": {
"mode": {
"enum": [
"meet",
"align",
"agenda",
"brainstorm",
"legal"
],
"type": "string",
"description": "What the AI in the room should do with what is said. \"meet\" keeps live notes; \"agenda\" tracks topics you supply; \"brainstorm\" draws pictures from the conversation; \"align\" runs a decision protocol; \"legal\" is a two-party call with Counsel, an AI counsel that reads the draft aloud and proposes wording both parties must accept (the host calls it in from the room). Defaults to brainstorm."
},
"topics": {
"type": "array",
"items": {
"type": "string"
},
"description": "Agenda topics, if mode is agenda."
}
}
}Open a pull request against Team Meet: a unified diff (`git diff` output) you wrote against its source, for a fix request. Give feedback_id to attach it to an existing request (see send_feedback, or GET /api/fixes for the open ones), or give text to file the request and attach the fix in one step. Nothing is applied automatically — a person reviews and merges. Run the tests your change touches first (AGENTS.md says which) and report them.
| Argument | Type | Description |
|---|---|---|
| body | string | What changed and why, and how you checked it. |
| diff* | string | Unified diff against the source, with diff --git headers. |
| page | string | |
| text | string | If there is no feedback_id: what is being fixed, as a person would report it. |
| tests | object | |
| title | string | One line, like a commit subject. |
| feedback_id | string | The fix request this resolves. |
{
"type": "object",
"required": [
"diff"
],
"properties": {
"body": {
"type": "string",
"description": "What changed and why, and how you checked it."
},
"diff": {
"type": "string",
"description": "Unified diff against the source, with diff --git headers."
},
"page": {
"type": "string"
},
"text": {
"type": "string",
"description": "If there is no feedback_id: what is being fixed, as a person would report it."
},
"tests": {
"type": "object",
"properties": {
"failed": {
"type": "integer"
},
"passed": {
"type": "integer"
},
"command": {
"type": "string"
}
}
},
"title": {
"type": "string",
"description": "One line, like a commit subject."
},
"feedback_id": {
"type": "string",
"description": "The fix request this resolves."
}
}
}Say where a task has got to. The call it came from sees it in its chat: "working" when you start, "done" with a short note and the link to what you made (a pull request, a document), or "blocked" with what you need from a person.
| Argument | Type | Description |
|---|---|---|
| note | string | Two plain sentences at most. |
| task* | string | The task id, tmt_… |
| links | array | Links to what you made. |
| status* | string |
{
"type": "object",
"required": [
"task",
"status"
],
"properties": {
"note": {
"type": "string",
"description": "Two plain sentences at most."
},
"task": {
"type": "string",
"description": "The task id, tmt_…"
},
"links": {
"type": "array",
"items": {
"type": "string"
},
"description": "Links to what you made."
},
"status": {
"enum": [
"working",
"done",
"blocked"
],
"type": "string"
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Oct 31, 2026.
No readOnlyHint / destructiveHint annotations, so clients can't tell a read from a write without asking.
Fix: Add annotations to each tool, e.g. { readOnlyHint: true } for tools that only read.