{
  "schemaVersion": "1.0",
  "item": {
    "slug": "granola-api",
    "name": "Granola",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/byungkyu/granola-api",
    "canonicalUrl": "https://clawhub.ai/byungkyu/granola-api",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/granola-api",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=granola-api",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "LICENSE.txt",
      "schemas/get_meeting_transcript.json",
      "schemas/get_meetings.json",
      "schemas/list_meetings.json",
      "schemas/query_granola_meetings.json"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/granola-api"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/granola-api",
    "agentPageUrl": "https://openagent3.xyz/skills/granola-api/agent",
    "manifestUrl": "https://openagent3.xyz/skills/granola-api/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/granola-api/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Granola MCP",
        "body": "Access Granola via MCP (Model Context Protocol) with managed authentication."
      },
      {
        "title": "Quick Start",
        "body": "python <<'EOF'\nimport urllib.request, os, json\ndata = json.dumps({'query': 'What action items came from my last meeting?'}).encode()\nreq = urllib.request.Request('https://gateway.maton.ai/granola/query_granola_meetings', data=data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/json')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Base URL",
        "body": "https://gateway.maton.ai/granola/{tool-name}\n\nReplace {tool-name} with the MCP tool name (e.g., query_granola_meetings). The gateway proxies requests to mcp.granola.ai and automatically injects your credentials."
      },
      {
        "title": "Authentication",
        "body": "All requests require the Maton API key:\n\nAuthorization: Bearer $MATON_API_KEY\n\nEnvironment Variable: Set your API key as MATON_API_KEY:\n\nexport MATON_API_KEY=\"YOUR_API_KEY\""
      },
      {
        "title": "Getting Your API Key",
        "body": "Sign in or create an account at maton.ai\nGo to maton.ai/settings\nCopy your API key"
      },
      {
        "title": "Connection Management",
        "body": "Manage your Granola MCP connections at https://ctrl.maton.ai."
      },
      {
        "title": "List Connections",
        "body": "python <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections?app=granola&method=MCP&status=ACTIVE')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Create Connection",
        "body": "python <<'EOF'\nimport urllib.request, os, json\ndata = json.dumps({'app': 'granola', 'method': 'MCP'}).encode()\nreq = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/json')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Get Connection",
        "body": "python <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nResponse:\n\n{\n  \"connection\": {\n    \"connection_id\": \"8a413c45-6427-45d9-b69d-8118ce62ffce\",\n    \"status\": \"PENDING\",\n    \"creation_time\": \"2026-02-24T11:34:46.204677Z\",\n    \"url\": \"https://connect.maton.ai/?session_token=...\",\n    \"app\": \"granola\",\n    \"method\": \"MCP\",\n    \"metadata\": {}\n  }\n}\n\nOpen the returned url in a browser to complete OAuth authorization."
      },
      {
        "title": "Delete Connection",
        "body": "python <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Specifying Connection",
        "body": "If you have multiple Granola connections, you must specify which MCP connection to use with the Maton-Connection header:\n\npython <<'EOF'\nimport urllib.request, os, json\ndata = json.dumps({'query': 'What were my action items?'}).encode()\nreq = urllib.request.Request('https://gateway.maton.ai/granola/query_granola_meetings', data=data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/json')\nreq.add_header('Maton-Connection', '8a413c45-6427-45d9-b69d-8118ce62ffce')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nIMPORTANT: If omitted, the gateway uses the default (oldest) active connection, which may fail if it's not an MCP connection."
      },
      {
        "title": "MCP Reference",
        "body": "All MCP tools use POST method:\n\nToolDescriptionSchemaquery_granola_meetingsChat with meeting notes using natural languageschemalist_meetingsList meetings with metadata and attendeesschemaget_meetingsRetrieve detailed content for specific meetingsschemaget_meeting_transcriptGet raw transcript (paid tiers only)schema"
      },
      {
        "title": "Query Meetings",
        "body": "Chat with your meeting notes using natural language queries:\n\nPOST /granola/query_granola_meetings\nContent-Type: application/json\n\n{\n  \"query\": \"What action items came from my meetings this week?\"\n}\n\nResponse:\n\n{\n  \"content\": [\n    {\n      \"type\": \"text\",\n      \"text\": \"You had 2 recent meetings:\\n**Feb 4, 2026 at 7:30 PM** - \\\"Team sync\\\" [[0]](https://notes.granola.ai/d/abc123)\\n- Action item: Review Q1 roadmap\\n- Action item: Schedule follow-up with engineering\\n**Jan 27, 2026 at 1:04 AM** - \\\"Finance integration\\\" [[1]](https://notes.granola.ai/d/def456)\\n- Discussed workflow automation platforms\\n- Action item: Evaluate n8n vs Zapier\"\n    }\n  ],\n  \"isError\": false\n}\n\nUse cases:\n\n\"What action items were assigned to me?\"\n\"Summarize my meetings from last week\"\n\"What did we discuss about the product launch?\"\n\"Find all mentions of budget in my meetings\""
      },
      {
        "title": "List Meetings",
        "body": "List your meetings with metadata including IDs, titles, dates, and attendees:\n\nPOST /granola/list_meetings\nContent-Type: application/json\n\n{}\n\nResponse:\n\n{\n  \"content\": [\n    {\n      \"type\": \"text\",\n      \"text\": \"<meetings_data from=\\\"Jan 27, 2026\\\" to=\\\"Feb 4, 2026\\\" count=\\\"2\\\">\\n<meeting id=\\\"0dba4400-50f1-4262-9ac7-89cd27b79371\\\" title=\\\"Team sync\\\" date=\\\"Feb 4, 2026 7:30 PM\\\">\\n    <known_participants>\\n    John Doe (note creator) from Acme <john@acme.com>\\n    Jane Smith from Acme <jane@acme.com>\\n    </known_participants>\\n  </meeting>\\n\\n<meeting id=\\\"4ebc086f-ba8d-49e8-8cd1-ed81ac8f2e3b\\\" title=\\\"Finance integration\\\" date=\\\"Jan 27, 2026 1:04 AM\\\">\\n    <known_participants>\\n    John Doe (note creator) from Acme <john@acme.com>\\n    </known_participants>\\n  </meeting>\\n</meetings_data>\"\n    }\n  ],\n  \"isError\": false\n}\n\nResponse fields in XML format:\n\nmeetings_data: Container with from, to date range and count\nmeeting: Individual meeting with id, title, and date attributes\nknown_participants: List of attendees with name, role, company, and email"
      },
      {
        "title": "Get Meetings",
        "body": "Retrieve detailed content for specific meetings by ID:\n\nPOST /granola/get_meetings\nContent-Type: application/json\n\n{\n  \"meeting_ids\": [\"0dba4400-50f1-4262-9ac7-89cd27b79371\"]\n}\n\nResponse:\n\n{\n  \"content\": [\n    {\n      \"type\": \"text\",\n      \"text\": \"<meetings_data from=\\\"Feb 4, 2026\\\" to=\\\"Feb 4, 2026\\\" count=\\\"1\\\">\\n<meeting id=\\\"0dba4400-50f1-4262-9ac7-89cd27b79371\\\" title=\\\"Team sync\\\" date=\\\"Feb 4, 2026 7:30 PM\\\">\\n  <known_participants>\\n  John Doe (note creator) from Acme <john@acme.com>\\n  </known_participants>\\n  \\n  <summary>\\n## Key Decisions\\n- Approved Q1 roadmap\\n- Budget increased by 15%\\n\\n## Action Items\\n- @john: Review design specs by Friday\\n- @jane: Schedule engineering sync\\n</summary>\\n</meeting>\\n</meetings_data>\"\n    }\n  ],\n  \"isError\": false\n}\n\nResponse includes:\n\nMeeting metadata (id, title, date, participants)\nsummary: AI-generated meeting summary with key decisions and action items\nEnhanced notes and private notes (when available)"
      },
      {
        "title": "Get Meeting Transcript",
        "body": "Retrieve the raw transcript for a specific meeting (paid tiers only):\n\nPOST /granola/get_meeting_transcript\nContent-Type: application/json\n\n{\n  \"meeting_id\": \"0dba4400-50f1-4262-9ac7-89cd27b79371\"\n}\n\nResponse (paid tier):\n\n{\n  \"content\": [\n    {\n      \"type\": \"text\",\n      \"text\": \"<transcript meeting_id=\\\"0dba4400-50f1-4262-9ac7-89cd27b79371\\\">\\n[00:00:15] John: Let's get started with the Q1 planning...\\n[00:01:23] Jane: I've prepared the budget breakdown...\\n[00:03:45] John: That looks good. What about the timeline?\\n</transcript>\"\n    }\n  ],\n  \"isError\": false\n}\n\nResponse (free tier):\n\n{\n  \"content\": [\n    {\n      \"type\": \"text\",\n      \"text\": \"Transcripts are only available to paid Granola tiers\"\n    }\n  ],\n  \"isError\": true\n}"
      },
      {
        "title": "JavaScript",
        "body": "const response = await fetch('https://gateway.maton.ai/granola/query_granola_meetings', {\n  method: 'POST',\n  headers: {\n    'Content-Type': 'application/json',\n    'Authorization': `Bearer ${process.env.MATON_API_KEY}`\n  },\n  body: JSON.stringify({\n    query: 'What were the action items from my last meeting?'\n  })\n});\nconst data = await response.json();\nconsole.log(data.content[0].text);"
      },
      {
        "title": "Python",
        "body": "import os\nimport requests\n\n# Query meeting notes\nresponse = requests.post(\n    'https://gateway.maton.ai/granola/query_granola_meetings',\n    headers={\n        'Authorization': f'Bearer {os.environ[\"MATON_API_KEY\"]}',\n        'Content-Type': 'application/json'\n    },\n    json={\n        'query': 'What were the action items from my last meeting?'\n    }\n)\nprint(response.json())"
      },
      {
        "title": "Error Handling",
        "body": "StatusMeaning400Missing Granola connection401Invalid or missing Maton API key429Rate limited (approx 100 req/min)"
      },
      {
        "title": "Troubleshooting: API Key Issues",
        "body": "Check that the MATON_API_KEY environment variable is set:\n\necho $MATON_API_KEY\n\nVerify the API key is valid by listing connections:\n\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Troubleshooting: Invalid App Name",
        "body": "Ensure your URL path starts with granola. For example:\n\nCorrect: https://gateway.maton.ai/granola/query_granola_meetings\nIncorrect: https://gateway.maton.ai/query_granola_meetings"
      },
      {
        "title": "Troubleshooting: MCP Parameter Errors",
        "body": "MCP tools return validation errors when required parameters are missing:\n\n{\n  \"content\": [\n    {\n      \"type\": \"text\",\n      \"text\": \"MCP error -32602: Input validation error: Invalid arguments for tool get_meetings: [\\n  {\\n    \\\"code\\\": \\\"invalid_type\\\",\\n    \\\"expected\\\": \\\"array\\\",\\n    \\\"received\\\": \\\"undefined\\\",\\n    \\\"path\\\": [\\\"meeting_ids\\\"],\\n    \\\"message\\\": \\\"Required\\\"\\n  }\\n]\"\n    }\n  ],\n  \"isError\": true\n}"
      },
      {
        "title": "Notes",
        "body": "All IDs are UUIDs (with or without hyphens)\nMCP tool responses wrap content in {\"content\": [{\"type\": \"text\", \"text\": \"...\"}], \"isError\": false} format\nUsers can only query their own meeting notes; shared notes from others are not accessible\nBasic (free) plan users are limited to notes from the last 30 days\nThe get_meeting_transcript tool is only available on paid Granola tiers"
      },
      {
        "title": "Resources",
        "body": "Granola MCP Documentation\nGranola Help Center\nMaton Community\nMaton Support"
      }
    ],
    "body": "Granola MCP\n\nAccess Granola via MCP (Model Context Protocol) with managed authentication.\n\nQuick Start\npython <<'EOF'\nimport urllib.request, os, json\ndata = json.dumps({'query': 'What action items came from my last meeting?'}).encode()\nreq = urllib.request.Request('https://gateway.maton.ai/granola/query_granola_meetings', data=data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/json')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nBase URL\nhttps://gateway.maton.ai/granola/{tool-name}\n\n\nReplace {tool-name} with the MCP tool name (e.g., query_granola_meetings). The gateway proxies requests to mcp.granola.ai and automatically injects your credentials.\n\nAuthentication\n\nAll requests require the Maton API key:\n\nAuthorization: Bearer $MATON_API_KEY\n\n\nEnvironment Variable: Set your API key as MATON_API_KEY:\n\nexport MATON_API_KEY=\"YOUR_API_KEY\"\n\nGetting Your API Key\nSign in or create an account at maton.ai\nGo to maton.ai/settings\nCopy your API key\nConnection Management\n\nManage your Granola MCP connections at https://ctrl.maton.ai.\n\nList Connections\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections?app=granola&method=MCP&status=ACTIVE')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nCreate Connection\npython <<'EOF'\nimport urllib.request, os, json\ndata = json.dumps({'app': 'granola', 'method': 'MCP'}).encode()\nreq = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/json')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nGet Connection\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\n\nResponse:\n\n{\n  \"connection\": {\n    \"connection_id\": \"8a413c45-6427-45d9-b69d-8118ce62ffce\",\n    \"status\": \"PENDING\",\n    \"creation_time\": \"2026-02-24T11:34:46.204677Z\",\n    \"url\": \"https://connect.maton.ai/?session_token=...\",\n    \"app\": \"granola\",\n    \"method\": \"MCP\",\n    \"metadata\": {}\n  }\n}\n\n\nOpen the returned url in a browser to complete OAuth authorization.\n\nDelete Connection\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nSpecifying Connection\n\nIf you have multiple Granola connections, you must specify which MCP connection to use with the Maton-Connection header:\n\npython <<'EOF'\nimport urllib.request, os, json\ndata = json.dumps({'query': 'What were my action items?'}).encode()\nreq = urllib.request.Request('https://gateway.maton.ai/granola/query_granola_meetings', data=data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/json')\nreq.add_header('Maton-Connection', '8a413c45-6427-45d9-b69d-8118ce62ffce')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\n\nIMPORTANT: If omitted, the gateway uses the default (oldest) active connection, which may fail if it's not an MCP connection.\n\nMCP Reference\n\nAll MCP tools use POST method:\n\nTool\tDescription\tSchema\nquery_granola_meetings\tChat with meeting notes using natural language\tschema\nlist_meetings\tList meetings with metadata and attendees\tschema\nget_meetings\tRetrieve detailed content for specific meetings\tschema\nget_meeting_transcript\tGet raw transcript (paid tiers only)\tschema\nQuery Meetings\n\nChat with your meeting notes using natural language queries:\n\nPOST /granola/query_granola_meetings\nContent-Type: application/json\n\n{\n  \"query\": \"What action items came from my meetings this week?\"\n}\n\n\nResponse:\n\n{\n  \"content\": [\n    {\n      \"type\": \"text\",\n      \"text\": \"You had 2 recent meetings:\\n**Feb 4, 2026 at 7:30 PM** - \\\"Team sync\\\" [[0]](https://notes.granola.ai/d/abc123)\\n- Action item: Review Q1 roadmap\\n- Action item: Schedule follow-up with engineering\\n**Jan 27, 2026 at 1:04 AM** - \\\"Finance integration\\\" [[1]](https://notes.granola.ai/d/def456)\\n- Discussed workflow automation platforms\\n- Action item: Evaluate n8n vs Zapier\"\n    }\n  ],\n  \"isError\": false\n}\n\n\nUse cases:\n\n\"What action items were assigned to me?\"\n\"Summarize my meetings from last week\"\n\"What did we discuss about the product launch?\"\n\"Find all mentions of budget in my meetings\"\nList Meetings\n\nList your meetings with metadata including IDs, titles, dates, and attendees:\n\nPOST /granola/list_meetings\nContent-Type: application/json\n\n{}\n\n\nResponse:\n\n{\n  \"content\": [\n    {\n      \"type\": \"text\",\n      \"text\": \"<meetings_data from=\\\"Jan 27, 2026\\\" to=\\\"Feb 4, 2026\\\" count=\\\"2\\\">\\n<meeting id=\\\"0dba4400-50f1-4262-9ac7-89cd27b79371\\\" title=\\\"Team sync\\\" date=\\\"Feb 4, 2026 7:30 PM\\\">\\n    <known_participants>\\n    John Doe (note creator) from Acme <john@acme.com>\\n    Jane Smith from Acme <jane@acme.com>\\n    </known_participants>\\n  </meeting>\\n\\n<meeting id=\\\"4ebc086f-ba8d-49e8-8cd1-ed81ac8f2e3b\\\" title=\\\"Finance integration\\\" date=\\\"Jan 27, 2026 1:04 AM\\\">\\n    <known_participants>\\n    John Doe (note creator) from Acme <john@acme.com>\\n    </known_participants>\\n  </meeting>\\n</meetings_data>\"\n    }\n  ],\n  \"isError\": false\n}\n\n\nResponse fields in XML format:\n\nmeetings_data: Container with from, to date range and count\nmeeting: Individual meeting with id, title, and date attributes\nknown_participants: List of attendees with name, role, company, and email\nGet Meetings\n\nRetrieve detailed content for specific meetings by ID:\n\nPOST /granola/get_meetings\nContent-Type: application/json\n\n{\n  \"meeting_ids\": [\"0dba4400-50f1-4262-9ac7-89cd27b79371\"]\n}\n\n\nResponse:\n\n{\n  \"content\": [\n    {\n      \"type\": \"text\",\n      \"text\": \"<meetings_data from=\\\"Feb 4, 2026\\\" to=\\\"Feb 4, 2026\\\" count=\\\"1\\\">\\n<meeting id=\\\"0dba4400-50f1-4262-9ac7-89cd27b79371\\\" title=\\\"Team sync\\\" date=\\\"Feb 4, 2026 7:30 PM\\\">\\n  <known_participants>\\n  John Doe (note creator) from Acme <john@acme.com>\\n  </known_participants>\\n  \\n  <summary>\\n## Key Decisions\\n- Approved Q1 roadmap\\n- Budget increased by 15%\\n\\n## Action Items\\n- @john: Review design specs by Friday\\n- @jane: Schedule engineering sync\\n</summary>\\n</meeting>\\n</meetings_data>\"\n    }\n  ],\n  \"isError\": false\n}\n\n\nResponse includes:\n\nMeeting metadata (id, title, date, participants)\nsummary: AI-generated meeting summary with key decisions and action items\nEnhanced notes and private notes (when available)\nGet Meeting Transcript\n\nRetrieve the raw transcript for a specific meeting (paid tiers only):\n\nPOST /granola/get_meeting_transcript\nContent-Type: application/json\n\n{\n  \"meeting_id\": \"0dba4400-50f1-4262-9ac7-89cd27b79371\"\n}\n\n\nResponse (paid tier):\n\n{\n  \"content\": [\n    {\n      \"type\": \"text\",\n      \"text\": \"<transcript meeting_id=\\\"0dba4400-50f1-4262-9ac7-89cd27b79371\\\">\\n[00:00:15] John: Let's get started with the Q1 planning...\\n[00:01:23] Jane: I've prepared the budget breakdown...\\n[00:03:45] John: That looks good. What about the timeline?\\n</transcript>\"\n    }\n  ],\n  \"isError\": false\n}\n\n\nResponse (free tier):\n\n{\n  \"content\": [\n    {\n      \"type\": \"text\",\n      \"text\": \"Transcripts are only available to paid Granola tiers\"\n    }\n  ],\n  \"isError\": true\n}\n\nCode Examples\nJavaScript\nconst response = await fetch('https://gateway.maton.ai/granola/query_granola_meetings', {\n  method: 'POST',\n  headers: {\n    'Content-Type': 'application/json',\n    'Authorization': `Bearer ${process.env.MATON_API_KEY}`\n  },\n  body: JSON.stringify({\n    query: 'What were the action items from my last meeting?'\n  })\n});\nconst data = await response.json();\nconsole.log(data.content[0].text);\n\nPython\nimport os\nimport requests\n\n# Query meeting notes\nresponse = requests.post(\n    'https://gateway.maton.ai/granola/query_granola_meetings',\n    headers={\n        'Authorization': f'Bearer {os.environ[\"MATON_API_KEY\"]}',\n        'Content-Type': 'application/json'\n    },\n    json={\n        'query': 'What were the action items from my last meeting?'\n    }\n)\nprint(response.json())\n\nError Handling\nStatus\tMeaning\n400\tMissing Granola connection\n401\tInvalid or missing Maton API key\n429\tRate limited (approx 100 req/min)\nTroubleshooting: API Key Issues\nCheck that the MATON_API_KEY environment variable is set:\necho $MATON_API_KEY\n\nVerify the API key is valid by listing connections:\npython <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nTroubleshooting: Invalid App Name\nEnsure your URL path starts with granola. For example:\nCorrect: https://gateway.maton.ai/granola/query_granola_meetings\nIncorrect: https://gateway.maton.ai/query_granola_meetings\nTroubleshooting: MCP Parameter Errors\n\nMCP tools return validation errors when required parameters are missing:\n\n{\n  \"content\": [\n    {\n      \"type\": \"text\",\n      \"text\": \"MCP error -32602: Input validation error: Invalid arguments for tool get_meetings: [\\n  {\\n    \\\"code\\\": \\\"invalid_type\\\",\\n    \\\"expected\\\": \\\"array\\\",\\n    \\\"received\\\": \\\"undefined\\\",\\n    \\\"path\\\": [\\\"meeting_ids\\\"],\\n    \\\"message\\\": \\\"Required\\\"\\n  }\\n]\"\n    }\n  ],\n  \"isError\": true\n}\n\nNotes\nAll IDs are UUIDs (with or without hyphens)\nMCP tool responses wrap content in {\"content\": [{\"type\": \"text\", \"text\": \"...\"}], \"isError\": false} format\nUsers can only query their own meeting notes; shared notes from others are not accessible\nBasic (free) plan users are limited to notes from the last 30 days\nThe get_meeting_transcript tool is only available on paid Granola tiers\nResources\nGranola MCP Documentation\nGranola Help Center\nMaton Community\nMaton Support"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/byungkyu/granola-api",
    "publisherUrl": "https://clawhub.ai/byungkyu/granola-api",
    "owner": "byungkyu",
    "version": "1.0.1",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/granola-api",
    "downloadUrl": "https://openagent3.xyz/downloads/granola-api",
    "agentUrl": "https://openagent3.xyz/skills/granola-api/agent",
    "manifestUrl": "https://openagent3.xyz/skills/granola-api/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/granola-api/agent.md"
  }
}