{
  "schema": "meetly-mcp-catalog/1",
  "server": {
    "name": "Meetly",
    "endpoint": "https://mcp.getmeetly.ai/mcp",
    "version": "0.8.0",
    "sourceCommit": "13743ab0fd1289fa2dd1cfc2bf08ed34a9fb1040"
  },
  "tools": [
    {
      "name": "setup",
      "title": "Set up Meetly and optional routines",
      "description": "Use this for Meetly setup, standing rules, workflow selection, and optional host-owned routines. Ordinary setup returns the guide/skill index and drift without loading bodies; pass skill_keys to read only relevant verified workflows. Returns pinned files and a validated latest ZIP installation plan. Only the host schedules after confirming authenticated scheduled access and deduplicating routines. MCP writes nothing.",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": true,
        "idempotentHint": true
      },
      "securitySchemes": [
        {
          "type": "oauth2",
          "scopes": [
            "meetings:read"
          ]
        }
      ],
      "_meta": {
        "securitySchemes": [
          {
            "type": "oauth2",
            "scopes": [
              "meetings:read"
            ]
          }
        ]
      },
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "host_environment": {
            "type": "string",
            "enum": [
              "hosted",
              "local"
            ],
            "description": "Defaults to local for codex/cursor and hosted otherwise. ChatGPT always uses human upload. Specify local for Claude Code."
          },
          "host": {
            "type": "string",
            "enum": [
              "chatgpt",
              "codex",
              "claude",
              "cursor",
              "other"
            ]
          },
          "channel": {
            "type": "string",
            "enum": [
              "latest",
              "beta"
            ],
            "default": "latest"
          },
          "skills_held": {
            "type": "array",
            "maxItems": 32,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "key": {
                  "type": "string"
                },
                "sha256": {
                  "type": "string",
                  "pattern": "^[a-f0-9]{64}$"
                },
                "files_held": {
                  "type": "array",
                  "maxItems": 64,
                  "items": {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "path": {
                        "type": "string",
                        "minLength": 1
                      },
                      "sha256": {
                        "type": "string",
                        "pattern": "^[a-f0-9]{64}$"
                      }
                    },
                    "required": [
                      "path",
                      "sha256"
                    ]
                  }
                }
              },
              "required": [
                "key",
                "sha256"
              ]
            }
          },
          "guide_held_sha256": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$"
          },
          "include_bodies": {
            "type": "boolean",
            "description": "Include verified guide and selected skill files. Defaults true when skill_keys is nonempty, false otherwise for every host. Without skill_keys, true retrieves only the guide."
          },
          "skill_keys": {
            "type": "array",
            "maxItems": 32,
            "uniqueItems": true,
            "items": {
              "type": "string",
              "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$"
            },
            "description": "Select relevant skills from the index for progressive body retrieval; omitted or empty means no skill bodies. Unknown or removed keys fail closed. Drift still checks the entire manifest."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "channel": {
            "type": "string",
            "enum": [
              "latest",
              "beta"
            ]
          },
          "ref": {
            "type": "string"
          },
          "sha": {
            "type": "string",
            "pattern": "^[a-f0-9]{40}$"
          },
          "manifestUrl": {
            "type": "string",
            "format": "uri"
          },
          "currency": {
            "type": "string",
            "enum": [
              "metadata_verified",
              "bodies_verified"
            ],
            "description": "Metadata means release schema and pinned URLs were validated; bodies_verified confirms only returned body hashes and byte lengths. bodyVerification identifies the verified guide and selected skills; unselected bodies remain metadata only. Drift compares host-reported hashes to manifest metadata."
          },
          "bodyVerification": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "guide": {
                "type": "boolean"
              },
              "skillKeys": {
                "type": "array",
                "uniqueItems": true,
                "items": {
                  "type": "string"
                }
              }
            },
            "required": [
              "guide",
              "skillKeys"
            ]
          },
          "drift": {
            "type": "boolean"
          },
          "nextAction": {
            "type": "string",
            "enum": [
              "none",
              "install",
              "update"
            ]
          },
          "removedSkills": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "recommendedSkill": {
            "type": "string",
            "enum": [
              "setup-meetly"
            ]
          },
          "instructions": {
            "type": "string"
          },
          "standingRules": {
            "type": "string"
          },
          "workflowRouting": {
            "type": "string"
          },
          "skillsZip": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": false,
            "properties": {
              "url": {
                "type": "string",
                "format": "uri"
              },
              "sha256": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              "bytes": {
                "type": "integer",
                "minimum": 1,
                "maximum": 10485760
              }
            },
            "required": [
              "url",
              "sha256",
              "bytes"
            ]
          },
          "zipIntegrity": {
            "type": "string",
            "enum": [
              "metadata_only",
              "not_available"
            ]
          },
          "installation": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "owner": {
                "type": "string",
                "enum": [
                  "human",
                  "host"
                ]
              },
              "mode": {
                "type": "string",
                "enum": [
                  "human_upload",
                  "per_file"
                ]
              },
              "instructions": {
                "type": "string"
              }
            },
            "required": [
              "owner",
              "mode",
              "instructions"
            ]
          },
          "optionalRoutine": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "owner": {
                "type": "string",
                "enum": [
                  "host"
                ]
              },
              "optional": {
                "type": "boolean",
                "enum": [
                  true
                ]
              },
              "skill": {
                "type": "string",
                "enum": [
                  "setup-meetly"
                ]
              },
              "requiredPreferences": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "schedulingGate": {
                "type": "string",
                "enum": [
                  "host_confirms_authenticated_meetly_access_in_scheduled_execution"
                ]
              },
              "instructions": {
                "type": "string"
              }
            },
            "required": [
              "owner",
              "optional",
              "skill",
              "requiredPreferences",
              "schedulingGate",
              "instructions"
            ]
          },
          "guide": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "path": {
                "type": "string"
              },
              "src": {
                "type": "string"
              },
              "sha256": {
                "type": "string",
                "pattern": "^[a-f0-9]{64}$"
              },
              "bytes": {
                "type": "integer",
                "minimum": 0
              },
              "url": {
                "type": "string",
                "format": "uri"
              },
              "text": {
                "type": "string"
              },
              "status": {
                "type": "string",
                "enum": [
                  "current",
                  "update",
                  "install"
                ]
              }
            },
            "required": [
              "src",
              "sha256",
              "bytes",
              "url",
              "status"
            ]
          },
          "skills": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "key": {
                  "type": "string"
                },
                "version": {
                  "type": "integer",
                  "minimum": 1
                },
                "removedFiles": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "description": {
                  "type": "string"
                },
                "sha256": {
                  "type": "string"
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "current",
                    "update",
                    "install"
                  ]
                },
                "files": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "path": {
                        "type": "string"
                      },
                      "src": {
                        "type": "string"
                      },
                      "sha256": {
                        "type": "string",
                        "pattern": "^[a-f0-9]{64}$"
                      },
                      "bytes": {
                        "type": "integer",
                        "minimum": 0
                      },
                      "url": {
                        "type": "string",
                        "format": "uri"
                      },
                      "text": {
                        "type": "string"
                      },
                      "status": {
                        "type": "string",
                        "enum": [
                          "current",
                          "update",
                          "install"
                        ]
                      }
                    },
                    "required": [
                      "path",
                      "src",
                      "sha256",
                      "bytes",
                      "url",
                      "status"
                    ]
                  }
                }
              },
              "required": [
                "key",
                "version",
                "description",
                "sha256",
                "status",
                "files",
                "removedFiles"
              ]
            }
          }
        },
        "required": [
          "channel",
          "ref",
          "sha",
          "manifestUrl",
          "currency",
          "bodyVerification",
          "drift",
          "nextAction",
          "removedSkills",
          "recommendedSkill",
          "skillsZip",
          "zipIntegrity",
          "installation",
          "optionalRoutine",
          "instructions",
          "standingRules",
          "workflowRouting",
          "guide",
          "skills"
        ]
      }
    },
    {
      "name": "search",
      "title": "Search Meetly meeting sources",
      "description": "Use this to find relevant authorized Meetly meetings by query. Searches titles, discovery previews, and available transcripts, including segment-only recordings; generated summaries are not required. Returns only source IDs, titles, and citation URLs. Discovery matches are not evidence: call fetch to verify against the transcript before making claims.",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": false,
        "idempotentHint": true
      },
      "securitySchemes": [
        {
          "type": "oauth2",
          "scopes": [
            "meetings:read"
          ]
        }
      ],
      "_meta": {
        "securitySchemes": [
          {
            "type": "oauth2",
            "scopes": [
              "meetings:read"
            ]
          }
        ],
        "openai/toolInvocation/invoking": "Searching Meetly sources…",
        "openai/toolInvocation/invoked": "Meetly sources ready"
      },
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "query": {
            "type": "string",
            "description": "Query over meeting titles, discovery previews, and transcripts. Previews may be generated and must not support substantive claims."
          }
        },
        "required": [
          "query"
        ]
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "id": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "url": {
                  "type": "string",
                  "format": "uri"
                }
              },
              "required": [
                "id",
                "title",
                "url"
              ]
            }
          }
        },
        "required": [
          "results"
        ]
      }
    },
    {
      "name": "fetch",
      "title": "Fetch a Meetly meeting source",
      "description": "Use this after search or list_meetings to read the complete authorized transcript as the sole primary meeting evidence. Transcript comes first, with timestamps and source speaker labels where available; missing attribution is 'Unknown speaker'. Optional calendar/capture context has separate provenance; invitees are not speakers. Generated summaries, highlights, and actions are omitted. Check coverage and revision metadata.",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": false,
        "idempotentHint": true
      },
      "securitySchemes": [
        {
          "type": "oauth2",
          "scopes": [
            "meetings:read"
          ]
        }
      ],
      "_meta": {
        "securitySchemes": [
          {
            "type": "oauth2",
            "scopes": [
              "meetings:read"
            ]
          }
        ],
        "openai/toolInvocation/invoking": "Reading Meetly source…",
        "openai/toolInvocation/invoked": "Meetly source ready"
      },
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "description": "Source ID returned by search."
          }
        },
        "required": [
          "id"
        ]
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "text": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {
              "type": [
                "string",
                "number",
                "boolean",
                "null"
              ]
            }
          }
        },
        "required": [
          "id",
          "title",
          "text",
          "url"
        ]
      }
    },
    {
      "name": "list_meetings",
      "title": "List Meetly meetings",
      "description": "Use this to browse authorized meeting history or select meetings for a daily briefing. Lists discovery metadata newest first; previews and action counts may be generated and are not evidence, and participants do not prove attendance or speaking. Use fetch for transcript evidence or get_transcript for bounded pages.",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": false,
        "idempotentHint": true
      },
      "securitySchemes": [
        {
          "type": "oauth2",
          "scopes": [
            "meetings:read"
          ]
        }
      ],
      "_meta": {
        "securitySchemes": [
          {
            "type": "oauth2",
            "scopes": [
              "meetings:read"
            ]
          }
        ],
        "openai/toolInvocation/invoking": "Finding meetings…",
        "openai/toolInvocation/invoked": "Meetings ready"
      },
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "from": {
            "type": "number",
            "description": "Milliseconds since Unix epoch; inclusive meeting-date lower bound."
          },
          "to": {
            "type": "number",
            "description": "Milliseconds since Unix epoch; exclusive meeting-date upper bound."
          },
          "query": {
            "type": "string",
            "description": "Optional case-insensitive filter over meeting title and preview."
          },
          "limit": {
            "type": "number",
            "minimum": 1,
            "maximum": 100,
            "description": "Maximum results; defaults to 25."
          },
          "cursor": {
            "type": "number",
            "minimum": 0,
            "description": "Zero-based result offset; defaults to 0."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "meetings": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "id": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "dateIso": {
                  "type": "string",
                  "format": "date-time"
                },
                "durationSec": {
                  "type": "number"
                },
                "previewPlain": {
                  "type": "string"
                },
                "participants": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "actionItemCount": {
                  "type": "number"
                }
              },
              "required": [
                "id",
                "title",
                "dateIso",
                "durationSec",
                "previewPlain",
                "participants",
                "actionItemCount"
              ]
            }
          },
          "total": {
            "type": "number"
          },
          "nextCursor": {
            "type": [
              "number",
              "null"
            ]
          },
          "note": {
            "type": "string"
          }
        },
        "required": [
          "meetings",
          "total",
          "nextCursor"
        ]
      }
    },
    {
      "name": "get_transcript",
      "title": "Read a Meetly transcript page",
      "description": "Use this to read a bounded page of primary transcript evidence. Continue with nextCursor until null for full coverage, check revision metadata, and request timestamped source speaker labels with segments. Never infer speakers from calendar invitees. Use fetch for the whole transcript and separately attributed calendar/capture context.",
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": false,
        "idempotentHint": true
      },
      "securitySchemes": [
        {
          "type": "oauth2",
          "scopes": [
            "meetings:read"
          ]
        }
      ],
      "_meta": {
        "securitySchemes": [
          {
            "type": "oauth2",
            "scopes": [
              "meetings:read"
            ]
          }
        ],
        "openai/toolInvocation/invoking": "Reading transcript…",
        "openai/toolInvocation/invoked": "Transcript page ready"
      },
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string",
            "minLength": 1,
            "description": "Meeting identifier."
          },
          "cursor": {
            "type": "number",
            "minimum": 0,
            "description": "Character offset; defaults to 0."
          },
          "maxChars": {
            "type": "number",
            "minimum": 1,
            "maximum": 20000,
            "description": "Characters to return; defaults to 12,000 and is capped at 20,000."
          },
          "segments": {
            "type": "boolean",
            "description": "Include only timestamped segments that overlap this transcript page; defaults to false."
          }
        },
        "required": [
          "id"
        ]
      },
      "outputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "dateIso": {
            "type": "string",
            "format": "date-time"
          },
          "transcriptText": {
            "type": "string"
          },
          "cursor": {
            "type": "number"
          },
          "nextCursor": {
            "type": [
              "number",
              "null"
            ]
          },
          "totalChars": {
            "type": "number"
          },
          "truncated": {
            "type": "boolean"
          },
          "metadata": {
            "type": "object",
            "additionalProperties": {
              "type": [
                "string",
                "number",
                "boolean",
                "null"
              ]
            }
          },
          "segments": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "startSec": {
                  "type": "number"
                },
                "endSec": {
                  "type": "number"
                },
                "speaker": {
                  "type": "string"
                },
                "text": {
                  "type": "string"
                },
                "partial": {
                  "type": "boolean"
                }
              },
              "required": [
                "startSec",
                "endSec",
                "speaker",
                "text",
                "partial"
              ]
            }
          }
        },
        "required": [
          "id",
          "title",
          "dateIso",
          "transcriptText",
          "cursor",
          "nextCursor",
          "totalChars",
          "truncated"
        ]
      }
    }
  ]
}
