AutomationFlowsAI & RAG › Auto-Summarize Meeting Notes with Gemini

Auto-Summarize Meeting Notes with Gemini

Original n8n title: 회의록자동요약 (최종)

6. 회의록자동요약 (최종). Uses googleGemini, googleDrive, notion. Webhook trigger; 13 nodes.

Webhook trigger★★★☆☆ complexityAI-powered13 nodesGoogle GeminiGoogle DriveNotion
AI & RAG Trigger: Webhook Nodes: 13 Complexity: ★★★☆☆ AI nodes: yes Added:

This workflow follows the Google Drive → Googlegemini recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "name": "6. \ud68c\uc758\ub85d\uc790\ub3d9\uc694\uc57d (\ucd5c\uc885)",
  "nodes": [
    {
      "parameters": {
        "modelId": {
          "__rl": true,
          "value": "models/gemini-2.5-flash",
          "mode": "list",
          "cachedResultName": "models/gemini-2.5-flash"
        },
        "messages": {
          "values": [
            {
              "content": "=[\uc74c\uc131 \uc778\uc2dd \ud14d\uc2a4\ud2b8]\n{{ $('Transcribe a recording(gemini)').item.json.content.parts[0].text }}\n"
            },
            {
              "content": "=\ub2f9\uc2e0\uc740 \uc804\ubb38\uc801\uc778 \uad50\uc815 \ubc0f \ud3b8\uc9d1 \uc5d0\ub514\ud130\uc785\ub2c8\ub2e4.\n\uc544\ub798 \uc81c\uacf5\ub418\ub294 [\uc74c\uc131 \uc778\uc2dd \ud14d\uc2a4\ud2b8]\ub97c \ubc14\ud0d5\uc73c\ub85c \ub2e4\uc74c\uc758 [\uc791\uc5c5 \uc9c0\uce68]\uc744 \uc5c4\uaca9\ud788 \uc900\uc218\ud558\uc5ec \ud14d\uc2a4\ud2b8\ub97c \ub2e4\ub4ec\uc5b4 \uc8fc\uc138\uc694.\n\n[\uc791\uc5c5 \uc9c0\uce68]\n1. **\uad50\uc815 \ubc0f \uc724\ubb38**: \ub9de\ucda4\ubc95, \ub744\uc5b4\uc4f0\uae30, \ubb38\ubc95 \uc624\ub958\ub97c \uc218\uc815\ud558\uace0 \ubb38\uc7a5\uc758 \ud750\ub984\uc774 \uc790\uc5f0\uc2a4\ub7fd\uac8c \uc774\uc5b4\uc9c0\ub3c4\ub85d \ub9e4\ub044\ub7fd\uac8c \ub2e4\ub4ec\uc73c\uc138\uc694.\n2. **\uae38\uc774 \uc720\uc9c0 (\uc694\uc57d \uae08\uc9c0)**: \ub0b4\uc6a9\uc744 \uc694\uc57d\ud558\uac70\ub098 \ucd95\uc57d\ud558\uc9c0 \ub9c8\uc138\uc694. \uc6d0\ubb38\uc758 \uc815\ubcf4\ub7c9\uacfc \uae38\uc774\ub97c \uadf8\ub300\ub85c \uc720\uc9c0\ud574\uc57c \ud569\ub2c8\ub2e4.\n3. **\ub204\ub77d \ubc29\uc9c0**: \ud14d\uc2a4\ud2b8\uc758 \uc2dc\uc791\ubd80\ud130 \ub05d\uae4c\uc9c0, \uc5b4\ub5a4 \ubb38\uc7a5\ub3c4 \ub204\ub77d\ub418\uc9c0 \uc54a\ub3c4\ub85d \uaf3c\uaf3c\ud558\uac8c \uac80\ud1a0\ud558\uc5ec \ubcc0\ud658\ud558\uc138\uc694.\n4. **\ubb38\ub9e5 \uc218\uc815**: \uc74c\uc131 \uc778\uc2dd(STT) \uacfc\uc815\uc5d0\uc11c \uc798\ubabb \uc778\uc2dd\ub41c \uac83\uc73c\ub85c \ubcf4\uc774\ub294 \ub2e8\uc5b4\ub098 \ubb38\ub9e5\uc0c1 \uc5b4\uc0c9\ud55c \ud45c\ud604\uc740 \uc0c1\ud669\uc5d0 \uac00\uc7a5 \uc801\ud569\ud55c \ub2e8\uc5b4\ub85c \uc218\uc815\ud558\uc138\uc694.\n5. **\ucd9c\ub825 \ud615\uc2dd**: \uad50\uc815\uc774 \uc644\ub8cc\ub41c \ud14d\uc2a4\ud2b8\ub9cc \ucd9c\ub825\ud558\uc138\uc694. (\uc778\uc0ac\ub9d0\uc774\ub098 \ubd80\uac00 \uc124\uba85 \uc0dd\ub7b5)",
              "role": "model"
            }
          ]
        },
        "jsonOutput": true,
        "builtInTools": {},
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "typeVersion": 1.1,
      "position": [
        -1264,
        1728
      ],
      "id": "10212f3b-76f6-495c-81bc-e3f7aca80bf2",
      "name": "Check Typo",
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "modelId": {
          "__rl": true,
          "value": "models/gemini-2.5-flash",
          "mode": "list",
          "cachedResultName": "models/gemini-2.5-flash"
        },
        "messages": {
          "values": [
            {
              "content": "={{ $json.content.parts[0].text }}"
            }
          ]
        },
        "jsonOutput": true,
        "builtInTools": {},
        "options": {
          "systemMessage": "=\ub2f9\uc2e0\uc740 \ube44\uc988\ub2c8\uc2a4 \ubb38\uc11c \uc815\ub9ac\uc5d0 \ud2b9\ud654\ub41c '\uc218\uc11d \uc11c\uae30'\uc785\ub2c8\ub2e4.\n\uc81c\uacf5\ub41c \ud68c\uc758 \uc2a4\ud06c\ub9bd\ud2b8(\ud0c0\uc784\ucf54\ub4dc \ud3ec\ud568)\ub97c \ubd84\uc11d\ud558\uc5ec, \ub2e4\uc74c JSON \ud3ec\ub9f7\uc73c\ub85c \uc815\ub9ac\ub41c \ud68c\uc758\ub85d\uc744 \uc791\uc131\ud558\uc138\uc694.\n\n[\ucd9c\ub825 \ud3ec\ub9f7 - JSON]\n{\n  \"meeting_date\": \"\ubbf8\ud305 \ub0a0\uc9dc (YYYY-MM-DD \ud615\uc2dd. \uac12\uc774 \uc5c6\ub294 \uacbd\uc6b0 {{ $now.setZone('Asia/Seoul').toFormat('yyyy-MM-dd') }} \ub97c \uae30\ubcf8\uac12\uc744 \uc124\uc815)\",\n  \"meeting_title\": \"\ud68c\uc758 \uc8fc\uc81c\",\n  \"meeting_oneline\": \"\ud55c\uc904 \uc694\uc57d\",\n  \"meeting_attendee\": [\"\ucc38\uc11d\uc7901\", \"\ucc38\uc11d\uc7902\"],\n  \"meeting_summary\": \"\ubbf8\ud305 \uc694\uc57d (\uc544\ub798 \uc791\uc131 \uc9c0\uce68\uc5d0 \ub530\ub978 \ub9c8\ud06c\ub2e4\uc6b4 \ud615\uc2dd\uc758 \ud14d\uc2a4\ud2b8, 2000\uc790 \ubbf8\ub9cc)\"\n}\n\n[meeting_summary \uc791\uc131 \uc9c0\uce68 - \uc5c4\uaca9 \uc900\uc218]\n\n1. **3\uc904 \uc694\uc57d (Executive Summary)**\n   - \ud68c\uc758\uc758 \ud575\uc2ec \ubaa9\uc801\uacfc \uacb0\ub860\uc744 \uac00\uc7a5 \uc911\uc694\ud55c \uc21c\uc11c\ub300\ub85c \ub531 3\ubb38\uc7a5\uc73c\ub85c \uc694\uc57d\ud558\uc138\uc694.\n\n2. **\ubc1c\uc5b8\uc790\ubcc4 \ud575\uc2ec \ubc1c\uc5b8 (Who Said What)**\n   - **\ub2f4\ub2f9 \uc5c5\ubb34\ub294 \uc81c\uc678\ud558\uace0**, \uac01 \ucc38\uc5ec\uc790\uac00 \ud68c\uc758\uc5d0\uc11c \ub17c\uc758\ud55c **\uc8fc\uc694 \uc758\uacac\ub9cc** \uac04\uacb0\ud558\uac8c \uc694\uc57d\ud558\uc138\uc694.\n   - **\ud615\uc2dd:**\n     - **\uc774\ub984**: \uc8fc\uc694 \ubc1c\uc5b8 \uc694\uc57d\n\n3. **\ub2f4\ub2f9\uc790\ubcc4 \uc561\uc158 \uc544\uc774\ud15c (Action Items by Assignee)**\n   - \ud68c\uc758\uc5d0\uc11c \ub3c4\ucd9c\ub41c \ud560 \uc77c\uc744 \ub2f4\ub2f9\uc790\ubcc4\ub85c \uadf8\ub8f9\ud654\ud558\uc5ec \uc815\ub9ac\ud558\uc138\uc694.\n   - \uacf5\ub3d9 \uc791\uc5c5\uc774\uac70\ub098 \ub2f4\ub2f9\uc790\uac00 \ubd88\uba85\ud655\ud560 \uacbd\uc6b0 '\uacf5\ud1b5' \ub610\ub294 '\ud300 \uc804\uccb4'\ub85c \ubd84\ub958\ud558\uc138\uc694.\n   - **\ud615\uc2dd:**\n     - **\ub2f4\ub2f9\uc790\uba85**\n       - [ ] \ud560 \uc77c \ub0b4\uc6a9 (\ub9c8\uac10: \ubb38\ub9e5\uc0c1 \ub0a0\uc9dc\uac00 \uc720\ucd94\ub420 \uacbd\uc6b0 \uae30\uc785\ud558\uace0, \uadf8\ub807\uc9c0 \uc54a\ub2e4\uba74 \ube48\uce78 \uc720\uc9c0, \ubcf4\ud1b5 \ub9c8\uac10\uc77c\uc740 {{ $now.toFormat('yyyy-MM-dd') }} \ubcf4\ub2e4 \uc774\ud6c4 \ub0a0\uc9dc\uac00 \ub9de\uc73c\ubbc0\ub85c {{ $now.toFormat('yyyy-MM-dd') }} \uc774\ud6c4 \ub0a0\uc9dc\ub77c\uba74 \ub9c8\uac10\uc77c \uc0dd\ub7b5.)\n       - [ ] \ud560 \uc77c \ub0b4\uc6a9\n   - **[\uc704\ud5d8 \uace0\uc9c0]** \uc561\uc158 \uc544\uc774\ud15c\uc758 \ub9c8\uac10 \uae30\ud55c\uc740 **\ubb38\ub9e5\uc0c1 \uba85\ud655\ud558\uac8c \uc5b8\uae09\ub418\uc5c8\uc744 \ub54c\ub9cc \uae30\uc785**\ud558\uba70, \uc720\ucd94\ub41c \ub9c8\uac10\uc77c\uc5d0\ub294 **\ub354\ube14 \uccb4\ud06c\uac00 \ud544\uc694\ud568**\uc744 \uc0c1\uae30\ud558\uc138\uc694.\n\n[\uc8fc\uc758\uc0ac\ud56d]\n- \uc751\ub2f5\uc740 \uc624\uc9c1 JSON \ub370\uc774\ud130\ub9cc \ucd9c\ub825\ud558\uc138\uc694.\n- meeting_summary \ud544\ub4dc\uc5d0 \ub9c8\ud06c\ub2e4\uc6b4 \uc904\ubc14\uafc8(\\n)\uc744 \ud3ec\ud568\ud558\uc5ec \ud14d\uc2a4\ud2b8\ub85c \ub123\uc73c\uc138\uc694."
        }
      },
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "typeVersion": 1.1,
      "position": [
        -912,
        1728
      ],
      "id": "0a5acde9-c2b5-4bd8-bc49-2514c0bc7260",
      "name": "Summarize",
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "content": "## Target\n### Notion \uc5c5\ub85c\ub4dc\n\ud68c\uc758\ub85d DB \ud398\uc774\uc9c0 \uc0dd\uc131 \ubc0f \ud68c\uc758\ub85d \uc5c5\ub85c\ub4dc",
        "height": 336,
        "width": 256,
        "color": 6
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -640,
        1552
      ],
      "typeVersion": 1,
      "id": "37773854-8246-4772-827c-1c2435d40b83",
      "name": "Sticky Note4"
    },
    {
      "parameters": {
        "content": "## Task\n### Gemini transcription(STT)\n\uc555\ucd95\ub41c \uc74c\uc131 \ud30c\uc77c\uc744 \ud14d\uc2a4\ud2b8\ub85c \ubcc0\ud658",
        "height": 336,
        "color": 5
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2008,
        1552
      ],
      "typeVersion": 1,
      "id": "7f8a53e3-6caa-4c61-91a7-b78c5ab3dbad",
      "name": "Sticky Note13"
    },
    {
      "parameters": {
        "content": "## Task\n### \ubb38\ubc95 \uad50\uc815 (Gemini 2.5 Flash)\n\uc74c\uc131 \ub179\uc74c \ud30c\uc77c\uc744 \uc790\ub9c9\uc73c\ub85c \ubcc0\uacbd\ud558\uba74, \ub9de\ucda4\ubc95, \ud750\ub984 \ub4f1 \uc790\uc5f0\uc2a4\ub7fd\uac8c \ubb38\ub9e5 \uad50\uc815",
        "height": 336,
        "width": 320,
        "color": 5
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1312,
        1552
      ],
      "typeVersion": 1,
      "id": "f8ad3288-9f71-4945-9a5c-c96ac1e75025",
      "name": "Sticky Note11"
    },
    {
      "parameters": {
        "content": "## Task\n### \ud68c\uc758 \uc694\uc57d (Gemini 2.5 Flash)\n\uc804\ubc18\uc801\uc778 \ud68c\uc758 \ub0b4\uc6a9 \ud30c\uc545 \ubc0f \ud558\uc774\ub77c\uc774\ud2b8, 3\uc904 \uc694\uc57d \ub4f1",
        "height": 336,
        "width": 304,
        "color": 5
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -952,
        1552
      ],
      "typeVersion": 1,
      "id": "63267394-20fe-433d-83a7-bbeb2aac54f2",
      "name": "Sticky Note14"
    },
    {
      "parameters": {
        "operation": "toText",
        "sourceProperty": "content.parts[0].text",
        "options": {
          "fileName": "={{ $('Webhook').item.binary.data.fileName.replace(/\\.[^.]+$/, '') }}_\ud68c\uc758\ub85d.txt"
        }
      },
      "type": "n8n-nodes-base.convertToFile",
      "typeVersion": 1.1,
      "position": [
        -1712,
        1728
      ],
      "id": "c5c75a45-3273-44a3-b653-ec8c1dd30b7d",
      "name": "meeting_transcript_text_file"
    },
    {
      "parameters": {
        "resource": "audio",
        "modelId": {
          "__rl": true,
          "value": "models/gemini-2.5-flash",
          "mode": "list",
          "cachedResultName": "models/gemini-2.5-flash"
        },
        "inputType": "binary",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "typeVersion": 1.1,
      "position": [
        -1936,
        1728
      ],
      "id": "325792d1-b871-4f58-83e3-dca17526fd60",
      "name": "Transcribe a recording(gemini)",
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "name": "={{ $('meeting_transcript_text_file').item.binary.data.fileName }}",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "folderId": {
          "__rl": true,
          "value": "1YQ1kqa2D6-_uZUPFcF2qY-PqRUWiFwar",
          "mode": "list",
          "cachedResultName": "meeting",
          "cachedResultUrl": "https://drive.google.com/drive/folders/1YQ1kqa2D6-_uZUPFcF2qY-PqRUWiFwar"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [
        -1488,
        1728
      ],
      "id": "417949ab-9c9a-4d62-b0ed-5f6b9a4a9348",
      "name": "Upload file",
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "content": "## Task\n### \ud68c\uc758\ub85d \ud30c\uc77c \uad6c\uae00 \ub4dc\ub77c\uc774\ube0c \uc5c5\ub85c\ub4dc",
        "height": 336,
        "width": 416,
        "color": 5
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1760,
        1552
      ],
      "typeVersion": 1,
      "id": "1a3639e4-891d-44b8-b5da-27cb6a9f3767",
      "name": "Sticky Note15"
    },
    {
      "parameters": {
        "resource": "databasePage",
        "databaseId": {
          "__rl": true,
          "value": "30c13bcf-ac5a-800f-9a68-c3799070532f",
          "mode": "list",
          "cachedResultName": "\ud14c\uc2a4\ud2b8 \ud68c\uc758\ub85d",
          "cachedResultUrl": "https://www.notion.so/30c13bcfac5a800f9a68c3799070532f"
        },
        "title": "=[{{ $now.setZone('Asia/Seoul').toFormat('yyyy-MM-dd') }}]{{ JSON.parse($json.content.parts[0].text).meeting_title }}",
        "propertiesUi": {
          "propertyValues": [
            {
              "key": "\ud68c\uc758 \ub0a0\uc9dc|date",
              "includeTime": false,
              "date": "={{ JSON.parse($json.content.parts[0].text).meeting_date }}"
            },
            {
              "key": "\ud68c\uc758 \uc8fc\uc81c|title",
              "title": "={{ JSON.parse($json.content.parts[0].text).meeting_title }}"
            },
            {
              "key": "\ud55c\uc904 \uc694\uc57d|rich_text",
              "textContent": "={{ JSON.parse($json.content.parts[0].text).meeting_oneline }}"
            },
            {
              "key": "\ud30c\uc77c|files",
              "fileUrls": {
                "fileUrl": [
                  {
                    "name": "={{ $('meeting_transcript_text_file').first().binary.data.fileName }}",
                    "url": "={{ $('Upload file').item.json.webContentLink }}"
                  }
                ]
              }
            }
          ]
        },
        "blockUi": {
          "blockValues": [
            {
              "textContent": "={{ JSON.parse($json.content.parts[0].text).meeting_summary }}"
            }
          ]
        },
        "options": {
          "icon": "\ud83e\udd16"
        }
      },
      "type": "n8n-nodes-base.notion",
      "typeVersion": 2.2,
      "position": [
        -560,
        1728
      ],
      "id": "615b86c4-4126-4beb-aefb-0b9ecc75bdd1",
      "name": "Create a database page(meeting)",
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "content": "## Trigger (Webhook)\n- *iOS(\uc544\uc774\ud3f0) \uc720\uc800\ub9cc \uac00\ub2a5\ud569\ub2c8\ub2e4.\n- [\ub2e8\ucd95\uc5b4shortcut  \ud30c\uc77c \ub2e4\uc6b4\ub85c\ub4dc](https://www.icloud.com/shortcuts/9767e709c79e40d1827c39cb4cc9dbce)\n- \ud574\ub2f9 \uae30\ub2a5 \uc0ac\uc6a9\uc744 \uc704\ud574\uc11c \ubc18\ub4dc\uc2dc \uc6cc\ud06c\ud50c\ub85c\uc6b0 `Publish`\uac00 \ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4.\n- Production URL \ubcf5\uc0ac \ud6c4 shortcut\uc5d0\uc11c \uc9c4\ud589\ud558\uae30.",
        "height": 368,
        "width": 352
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2368,
        1520
      ],
      "typeVersion": 1,
      "id": "fd07740a-5600-43a5-a632-be3acc455df8",
      "name": "Sticky Note16"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "audio-transcribe",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -2160,
        1728
      ],
      "id": "fe6ba6e4-b10b-420a-8202-5acdc2142199",
      "name": "Webhook"
    }
  ],
  "connections": {
    "Check Typo": {
      "main": [
        [
          {
            "node": "Summarize",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Summarize": {
      "main": [
        [
          {
            "node": "Create a database page(meeting)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "meeting_transcript_text_file": {
      "main": [
        [
          {
            "node": "Upload file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Transcribe a recording(gemini)": {
      "main": [
        [
          {
            "node": "meeting_transcript_text_file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload file": {
      "main": [
        [
          {
            "node": "Check Typo",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook": {
      "main": [
        [
          {
            "node": "Transcribe a recording(gemini)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": true,
  "settings": {
    "executionOrder": "v1",
    "availableInMCP": false
  },
  "versionId": "ffe75e88-bfd7-4095-af4d-a71528532ccc",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "id": "M0CCw36DMXec0BHe",
  "tags": []
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

6. 회의록자동요약 (최종). Uses googleGemini, googleDrive, notion. Webhook trigger; 13 nodes.

Source: https://github.com/ggplab/n8n-playbook/blob/08ee7d84568b1462a8b1b16a29607db085ee0846/01-hanbit-n8n-guidebook/chap5/chap5_meeting_transcribe.json — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

6. 회의록자동요약 (최종). Uses googleGemini, googleDrive, notion. Webhook trigger; 13 nodes.

Google Gemini, Google Drive, Notion
AI & RAG

This workflow is designed for creators, designers, and automation builders who need to generate visually consistent images at scale. It is ideal for teams producing branded visuals, social media asset

HTTP Request, Google Sheets, Google Gemini +1
AI & RAG

Account manager-v1. Uses whatsAppTrigger, googleGemini, whatsApp, httpRequest. Event-driven trigger; 22 nodes.

WhatsApp Trigger, Google Gemini, WhatsApp +3
AI & RAG

Convert any PDF into a structured Multiple Choice Question (MCQ) bank with answer keys and explanations — fully automated using n8n and Google Gemini. Teachers & Educators Trainers & Course Creators H

Google Gemini, Telegram, Email Send +1
AI & RAG

Transform your job search with this comprehensive n8n workflow that automatically searches, analyzes, and applies to relevant positions across multiple job platforms. Perfect for developers, engineers

HTTP Request, Google Gemini, Notion +2