{
  "name": "Postomator",
  "transport": "streamable-http",
  "endpoint": "https://postomator.com/mcp",
  "authorization_server": "https://postomator.com",
  "protocol_compatibility": {
    "legacy": "2025-11-25 initialize negotiation",
    "modern": "2026-07-28 server/discover request metadata"
  },
  "tools": [
    {
      "name": "apply_queue_assign",
      "title": "Apply queue assign",
      "description": "Apply a previously previewed queue assign mutation.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "postId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public post sqid."
          },
          "accountId": {
            "type": "integer",
            "minimum": 1,
            "description": "Account id."
          },
          "startsAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Startsat."
          },
          "emptyTeam": {
            "type": "boolean",
            "default": false,
            "description": "Emptyteam."
          },
          "preview_token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 10000,
            "description": "Preview token."
          }
        },
        "required": [
          "team_id",
          "postId",
          "accountId",
          "preview_token"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "description": "Token."
          },
          "changes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "postId": {
                  "type": "string",
                  "description": "Post id."
                },
                "account": {
                  "type": "string",
                  "description": "Account."
                },
                "description": {
                  "type": "string",
                  "description": "Description."
                },
                "before": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Before."
                },
                "after": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "After."
                },
                "queued": {
                  "type": "boolean",
                  "description": "Queued."
                }
              },
              "description": "Changes item.",
              "required": [
                "postId",
                "account",
                "description",
                "before",
                "after",
                "queued"
              ],
              "additionalProperties": false
            },
            "description": "Changes."
          },
          "action": {
            "type": "object",
            "properties": {
              "kind": {
                "const": "assign",
                "description": "Kind."
              },
              "postId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 32,
                "description": "Public post sqid."
              },
              "accountId": {
                "type": "integer",
                "minimum": 1,
                "description": "Account id."
              },
              "startsAt": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time",
                "description": "Startsat."
              },
              "emptyTeam": {
                "type": "boolean",
                "default": false,
                "description": "Emptyteam."
              }
            },
            "required": [
              "kind",
              "postId",
              "accountId"
            ],
            "description": "Action.",
            "additionalProperties": false
          }
        },
        "required": [
          "token",
          "changes",
          "action"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:schedule",
      "read_only": false,
      "destructive": true,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.services.team_queue.queue_command",
        "permissions": "Permissions and queue revision are rechecked atomically.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Do not blindly retry apply. Read the queue first after an uncertain response. Apply rechecks the queue revision and permissions atomically; stale, expired, replayed, or mismatched preview tokens require a new preview. Use the actual token returned by preview, not the illustrative token shown here.",
        "example_arguments": {
          "team_id": 42,
          "postId": "R8m3Kn2W",
          "accountId": 272,
          "startsAt": null,
          "emptyTeam": false,
          "preview_token": "opaque-token-from-preview"
        },
        "example_result": {
          "token": "opaque-token-from-preview",
          "changes": [],
          "action": {
            "kind": "assign",
            "postId": "R8m3Kn2W",
            "accountId": 272,
            "startsAt": null,
            "emptyTeam": false
          }
        }
      }
    },
    {
      "name": "apply_queue_enqueue",
      "title": "Apply queue enqueue",
      "description": "Apply a previously previewed queue enqueue mutation.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "postId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public post sqid."
          },
          "accountId": {
            "type": "integer",
            "minimum": 1,
            "description": "Account id."
          },
          "startsAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Startsat."
          },
          "preview_token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 10000,
            "description": "Preview token."
          }
        },
        "required": [
          "team_id",
          "postId",
          "accountId",
          "preview_token"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "description": "Token."
          },
          "changes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "postId": {
                  "type": "string",
                  "description": "Post id."
                },
                "account": {
                  "type": "string",
                  "description": "Account."
                },
                "description": {
                  "type": "string",
                  "description": "Description."
                },
                "before": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Before."
                },
                "after": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "After."
                },
                "queued": {
                  "type": "boolean",
                  "description": "Queued."
                }
              },
              "description": "Changes item.",
              "required": [
                "postId",
                "account",
                "description",
                "before",
                "after",
                "queued"
              ],
              "additionalProperties": false
            },
            "description": "Changes."
          },
          "action": {
            "type": "object",
            "properties": {
              "kind": {
                "const": "enqueue",
                "description": "Kind."
              },
              "postId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 32,
                "description": "Public post sqid."
              },
              "accountId": {
                "type": "integer",
                "minimum": 1,
                "description": "Account id."
              },
              "startsAt": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time",
                "description": "Startsat."
              }
            },
            "required": [
              "kind",
              "postId",
              "accountId"
            ],
            "description": "Action.",
            "additionalProperties": false
          }
        },
        "required": [
          "token",
          "changes",
          "action"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:schedule",
      "read_only": false,
      "destructive": true,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.services.team_queue.queue_command",
        "permissions": "Permissions and queue revision are rechecked atomically.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Do not blindly retry apply. Read the queue first after an uncertain response. Apply rechecks the queue revision and permissions atomically; stale, expired, replayed, or mismatched preview tokens require a new preview. Use the actual token returned by preview, not the illustrative token shown here.",
        "example_arguments": {
          "team_id": 42,
          "postId": "P7k2Lm9Q",
          "accountId": 271,
          "startsAt": null,
          "preview_token": "opaque-token-from-preview"
        },
        "example_result": {
          "token": "opaque-token-from-preview",
          "changes": [],
          "action": {
            "kind": "enqueue",
            "postId": "P7k2Lm9Q",
            "accountId": 271,
            "startsAt": null
          }
        }
      }
    },
    {
      "name": "apply_queue_occurrence",
      "title": "Apply queue occurrence",
      "description": "Apply a previously previewed queue occurrence mutation.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "occurrenceId": {
            "type": "integer",
            "minimum": 1,
            "description": "Occurrence id."
          },
          "mode": {
            "enum": [
              "together",
              "staggered"
            ],
            "description": "Mode."
          },
          "gap": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1440,
            "description": "Gap."
          },
          "order": {
            "type": "array",
            "items": {
              "type": "integer",
              "minimum": 1,
              "description": "Order item."
            },
            "maxItems": 100,
            "description": "Order."
          },
          "preview_token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 10000,
            "description": "Preview token."
          }
        },
        "required": [
          "team_id",
          "occurrenceId",
          "mode",
          "gap",
          "order",
          "preview_token"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "description": "Token."
          },
          "changes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "postId": {
                  "type": "string",
                  "description": "Post id."
                },
                "account": {
                  "type": "string",
                  "description": "Account."
                },
                "description": {
                  "type": "string",
                  "description": "Description."
                },
                "before": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Before."
                },
                "after": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "After."
                },
                "queued": {
                  "type": "boolean",
                  "description": "Queued."
                }
              },
              "description": "Changes item.",
              "required": [
                "postId",
                "account",
                "description",
                "before",
                "after",
                "queued"
              ],
              "additionalProperties": false
            },
            "description": "Changes."
          },
          "action": {
            "type": "object",
            "properties": {
              "kind": {
                "const": "occurrence",
                "description": "Kind."
              },
              "occurrenceId": {
                "type": "integer",
                "minimum": 1,
                "description": "Occurrence id."
              },
              "mode": {
                "enum": [
                  "together",
                  "staggered"
                ],
                "description": "Mode."
              },
              "gap": {
                "type": "integer",
                "minimum": 1,
                "maximum": 1440,
                "description": "Gap."
              },
              "order": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "minimum": 1,
                  "description": "Order item."
                },
                "maxItems": 100,
                "description": "Order."
              }
            },
            "required": [
              "kind",
              "occurrenceId",
              "mode",
              "gap",
              "order"
            ],
            "description": "Action.",
            "additionalProperties": false
          }
        },
        "required": [
          "token",
          "changes",
          "action"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:schedule",
      "read_only": false,
      "destructive": true,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.services.team_queue.queue_command",
        "permissions": "Permissions and queue revision are rechecked atomically.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Do not blindly retry apply. Read the queue first after an uncertain response. Apply rechecks the queue revision and permissions atomically; stale, expired, replayed, or mismatched preview tokens require a new preview. Use the actual token returned by preview, not the illustrative token shown here.",
        "example_arguments": {
          "team_id": 42,
          "occurrenceId": 73,
          "mode": "staggered",
          "gap": 10,
          "order": [
            884,
            885
          ],
          "preview_token": "opaque-token-from-preview"
        },
        "example_result": {
          "token": "opaque-token-from-preview",
          "changes": [],
          "action": {
            "kind": "occurrence",
            "occurrenceId": 73,
            "mode": "staggered",
            "gap": 10,
            "order": [
              884,
              885
            ]
          }
        }
      }
    },
    {
      "name": "apply_queue_remove",
      "title": "Apply queue remove",
      "description": "Apply a previously previewed queue remove mutation.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "entryId": {
            "type": "integer",
            "minimum": 1,
            "description": "Entry id."
          },
          "preview_token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 10000,
            "description": "Preview token."
          }
        },
        "required": [
          "team_id",
          "entryId",
          "preview_token"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "description": "Token."
          },
          "changes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "postId": {
                  "type": "string",
                  "description": "Post id."
                },
                "account": {
                  "type": "string",
                  "description": "Account."
                },
                "description": {
                  "type": "string",
                  "description": "Description."
                },
                "before": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Before."
                },
                "after": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "After."
                },
                "queued": {
                  "type": "boolean",
                  "description": "Queued."
                }
              },
              "description": "Changes item.",
              "required": [
                "postId",
                "account",
                "description",
                "before",
                "after",
                "queued"
              ],
              "additionalProperties": false
            },
            "description": "Changes."
          },
          "action": {
            "type": "object",
            "properties": {
              "kind": {
                "const": "remove",
                "description": "Kind."
              },
              "entryId": {
                "type": "integer",
                "minimum": 1,
                "description": "Entry id."
              }
            },
            "required": [
              "kind",
              "entryId"
            ],
            "description": "Action.",
            "additionalProperties": false
          }
        },
        "required": [
          "token",
          "changes",
          "action"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:schedule",
      "read_only": false,
      "destructive": true,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.services.team_queue.queue_command",
        "permissions": "Permissions and queue revision are rechecked atomically.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Do not blindly retry apply. Read the queue first after an uncertain response. Apply rechecks the queue revision and permissions atomically; stale, expired, replayed, or mismatched preview tokens require a new preview. Use the actual token returned by preview, not the illustrative token shown here.",
        "example_arguments": {
          "team_id": 42,
          "entryId": 884,
          "preview_token": "opaque-token-from-preview"
        },
        "example_result": {
          "token": "opaque-token-from-preview",
          "changes": [],
          "action": {
            "kind": "remove",
            "entryId": 884
          }
        }
      }
    },
    {
      "name": "apply_queue_reorder",
      "title": "Apply queue reorder",
      "description": "Apply a previously previewed queue reorder mutation.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "entryId": {
            "type": "integer",
            "minimum": 1,
            "description": "Entry id."
          },
          "position": {
            "type": "integer",
            "minimum": 1,
            "description": "Position."
          },
          "preview_token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 10000,
            "description": "Preview token."
          }
        },
        "required": [
          "team_id",
          "entryId",
          "position",
          "preview_token"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "description": "Token."
          },
          "changes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "postId": {
                  "type": "string",
                  "description": "Post id."
                },
                "account": {
                  "type": "string",
                  "description": "Account."
                },
                "description": {
                  "type": "string",
                  "description": "Description."
                },
                "before": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Before."
                },
                "after": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "After."
                },
                "queued": {
                  "type": "boolean",
                  "description": "Queued."
                }
              },
              "description": "Changes item.",
              "required": [
                "postId",
                "account",
                "description",
                "before",
                "after",
                "queued"
              ],
              "additionalProperties": false
            },
            "description": "Changes."
          },
          "action": {
            "type": "object",
            "properties": {
              "kind": {
                "const": "reorder",
                "description": "Kind."
              },
              "entryId": {
                "type": "integer",
                "minimum": 1,
                "description": "Entry id."
              },
              "position": {
                "type": "integer",
                "minimum": 1,
                "description": "Position."
              }
            },
            "required": [
              "kind",
              "entryId",
              "position"
            ],
            "description": "Action.",
            "additionalProperties": false
          }
        },
        "required": [
          "token",
          "changes",
          "action"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:schedule",
      "read_only": false,
      "destructive": true,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.services.team_queue.queue_command",
        "permissions": "Permissions and queue revision are rechecked atomically.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Do not blindly retry apply. Read the queue first after an uncertain response. Apply rechecks the queue revision and permissions atomically; stale, expired, replayed, or mismatched preview tokens require a new preview. Use the actual token returned by preview, not the illustrative token shown here.",
        "example_arguments": {
          "team_id": 42,
          "entryId": 885,
          "position": 1,
          "preview_token": "opaque-token-from-preview"
        },
        "example_result": {
          "token": "opaque-token-from-preview",
          "changes": [],
          "action": {
            "kind": "reorder",
            "entryId": 885,
            "position": 1
          }
        }
      }
    },
    {
      "name": "apply_queue_rule",
      "title": "Apply queue rule",
      "description": "Apply a previously previewed queue rule mutation.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "ruleId": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1,
            "description": "Rule id."
          },
          "weekday": {
            "type": "integer",
            "minimum": 0,
            "maximum": 6,
            "description": "Weekday."
          },
          "time": {
            "type": "string",
            "pattern": "^[0-2][0-9]:[0-5][0-9]$",
            "description": "Time."
          },
          "delete": {
            "type": "boolean",
            "default": false,
            "description": "Delete."
          },
          "policy": {
            "enum": [
              "keep",
              "reflow"
            ],
            "description": "Policy."
          },
          "preview_token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 10000,
            "description": "Preview token."
          }
        },
        "required": [
          "team_id",
          "weekday",
          "time",
          "policy",
          "preview_token"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "description": "Token."
          },
          "changes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "postId": {
                  "type": "string",
                  "description": "Post id."
                },
                "account": {
                  "type": "string",
                  "description": "Account."
                },
                "description": {
                  "type": "string",
                  "description": "Description."
                },
                "before": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Before."
                },
                "after": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "After."
                },
                "queued": {
                  "type": "boolean",
                  "description": "Queued."
                }
              },
              "description": "Changes item.",
              "required": [
                "postId",
                "account",
                "description",
                "before",
                "after",
                "queued"
              ],
              "additionalProperties": false
            },
            "description": "Changes."
          },
          "action": {
            "type": "object",
            "properties": {
              "kind": {
                "const": "rule",
                "description": "Kind."
              },
              "ruleId": {
                "type": [
                  "integer",
                  "null"
                ],
                "minimum": 1,
                "description": "Rule id."
              },
              "weekday": {
                "type": "integer",
                "minimum": 0,
                "maximum": 6,
                "description": "Weekday."
              },
              "time": {
                "type": "string",
                "pattern": "^[0-2][0-9]:[0-5][0-9]$",
                "description": "Time."
              },
              "delete": {
                "type": "boolean",
                "default": false,
                "description": "Delete."
              },
              "policy": {
                "enum": [
                  "keep",
                  "reflow"
                ],
                "description": "Policy."
              }
            },
            "required": [
              "kind",
              "weekday",
              "time",
              "policy"
            ],
            "description": "Action.",
            "additionalProperties": false
          }
        },
        "required": [
          "token",
          "changes",
          "action"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:schedule",
      "read_only": false,
      "destructive": true,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.services.team_queue.queue_command",
        "permissions": "Permissions and queue revision are rechecked atomically.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Do not blindly retry apply. Read the queue first after an uncertain response. Apply rechecks the queue revision and permissions atomically; stale, expired, replayed, or mismatched preview tokens require a new preview. Use the actual token returned by preview, not the illustrative token shown here.",
        "example_arguments": {
          "team_id": 42,
          "ruleId": null,
          "weekday": 2,
          "time": "09:30",
          "delete": false,
          "policy": "reflow",
          "preview_token": "opaque-token-from-preview"
        },
        "example_result": {
          "token": "opaque-token-from-preview",
          "changes": [],
          "action": {
            "kind": "rule",
            "ruleId": null,
            "weekday": 2,
            "time": "09:30",
            "delete": false,
            "policy": "reflow"
          }
        }
      }
    },
    {
      "name": "apply_queue_timezone",
      "title": "Apply queue timezone",
      "description": "Apply a previously previewed queue timezone mutation.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "timezone": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100,
            "description": "Timezone."
          },
          "policy": {
            "enum": [
              "keep",
              "reflow"
            ],
            "description": "Policy."
          },
          "preview_token": {
            "type": "string",
            "minLength": 1,
            "maxLength": 10000,
            "description": "Preview token."
          }
        },
        "required": [
          "team_id",
          "timezone",
          "policy",
          "preview_token"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "description": "Token."
          },
          "changes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "postId": {
                  "type": "string",
                  "description": "Post id."
                },
                "account": {
                  "type": "string",
                  "description": "Account."
                },
                "description": {
                  "type": "string",
                  "description": "Description."
                },
                "before": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Before."
                },
                "after": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "After."
                },
                "queued": {
                  "type": "boolean",
                  "description": "Queued."
                }
              },
              "description": "Changes item.",
              "required": [
                "postId",
                "account",
                "description",
                "before",
                "after",
                "queued"
              ],
              "additionalProperties": false
            },
            "description": "Changes."
          },
          "action": {
            "type": "object",
            "properties": {
              "kind": {
                "const": "timezone",
                "description": "Kind."
              },
              "timezone": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100,
                "description": "Timezone."
              },
              "policy": {
                "enum": [
                  "keep",
                  "reflow"
                ],
                "description": "Policy."
              }
            },
            "required": [
              "kind",
              "timezone",
              "policy"
            ],
            "description": "Action.",
            "additionalProperties": false
          }
        },
        "required": [
          "token",
          "changes",
          "action"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:schedule",
      "read_only": false,
      "destructive": true,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.services.team_queue.queue_command",
        "permissions": "Permissions and queue revision are rechecked atomically.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Do not blindly retry apply. Read the queue first after an uncertain response. Apply rechecks the queue revision and permissions atomically; stale, expired, replayed, or mismatched preview tokens require a new preview. Use the actual token returned by preview, not the illustrative token shown here.",
        "example_arguments": {
          "team_id": 42,
          "timezone": "Europe/Brussels",
          "policy": "reflow",
          "preview_token": "opaque-token-from-preview"
        },
        "example_result": {
          "token": "opaque-token-from-preview",
          "changes": [],
          "action": {
            "kind": "timezone",
            "timezone": "Europe/Brussels",
            "policy": "reflow"
          }
        }
      }
    },
    {
      "name": "approve_post",
      "title": "Approve post",
      "description": "Approve the current content revision for its selected profile.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "post_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public post sqid."
          },
          "expected_revision": {
            "type": "integer",
            "minimum": 1,
            "description": "Expected revision."
          }
        },
        "required": [
          "team_id",
          "post_id",
          "expected_revision"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "post_id": {
            "type": "string",
            "description": "Post id."
          },
          "approval_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Approval id."
          },
          "content_revision": {
            "type": "integer",
            "description": "Content revision."
          }
        },
        "required": [
          "post_id",
          "approval_id",
          "content_revision"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:approve",
      "read_only": false,
      "destructive": false,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "services.approvals.approve_target",
        "permissions": "Profile owner or workspace approver permission.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Request metadata (actor, connection, workspace, tool, outcome, duration, and correlation ID) is logged; arguments and results are not. Retry reads freely. Retry a mutation only when marked idempotent; otherwise read current state before deciding whether to repeat it.",
        "example_arguments": {
          "team_id": 42,
          "post_id": "P7k2Lm9Q",
          "expected_revision": 3
        },
        "example_result": {
          "post_id": "P7k2Lm9Q",
          "approval_id": 884,
          "content_revision": 3
        }
      }
    },
    {
      "name": "assist_text",
      "title": "Assist with text",
      "description": "Apply one existing tracked and scrubbed LinkedIn editing operation.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "operation": {
            "enum": [
              "rewrite",
              "shorten",
              "lengthen",
              "fix_grammar",
              "improve",
              "attention_grabbing",
              "engaging"
            ],
            "description": "Operation."
          },
          "full_content": {
            "type": "string",
            "maxLength": 63206,
            "description": "Full content."
          },
          "selected_text": {
            "type": "string",
            "maxLength": 63206,
            "default": "",
            "description": "Selected text."
          },
          "instruction": {
            "type": "string",
            "maxLength": 2000,
            "default": "",
            "description": "Instruction."
          }
        },
        "required": [
          "team_id",
          "operation",
          "full_content"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "content": {
            "type": "string",
            "description": "Content."
          },
          "operation": {
            "type": "string",
            "description": "Operation."
          }
        },
        "required": [
          "content",
          "operation"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:ai",
      "read_only": false,
      "destructive": false,
      "open_world": true,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.ai.generation",
        "permissions": "Current member; existing AI usage quota applies.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Request metadata (actor, connection, workspace, tool, outcome, duration, and correlation ID) is logged; arguments and results are not. Retry reads freely. Retry a mutation only when marked idempotent; otherwise read current state before deciding whether to repeat it.",
        "example_arguments": {
          "team_id": 42,
          "operation": "shorten",
          "full_content": "Our onboarding review uncovered three avoidable sources of friction.",
          "selected_text": "",
          "instruction": "Keep the concrete finding."
        },
        "example_result": {
          "content": "Our onboarding review found three avoidable friction points.",
          "operation": "shorten"
        }
      }
    },
    {
      "name": "cancel_invitation",
      "title": "Cancel invitation",
      "description": "Cancel an unaccepted invitation.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "invitation_id": {
            "type": "string",
            "format": "uuid",
            "description": "Invitation id."
          }
        },
        "required": [
          "team_id",
          "invitation_id"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "deleted": {
            "const": true,
            "description": "Deleted."
          },
          "invitation_id": {
            "type": "string",
            "description": "Invitation id."
          }
        },
        "required": [
          "deleted",
          "invitation_id"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:invitations",
      "read_only": false,
      "destructive": true,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "InvitationViewSet.perform_destroy",
        "permissions": "Workspace administrator; accepted invitations immutable.",
        "errors": "Workspace reads require current membership; workspace and invitation administration requires an administrator, while creation requires account-level mcp:teams. Invalid/duplicate slugs or pending emails are rejected; unknown or cross-workspace invitations return not found, and accepted invitations cannot be changed or cancelled. Calls are limited to 120 per user per minute.",
        "retry": "Reads are safe to retry. Before retrying workspace or invitation creation after an ambiguous response, list current workspaces or invitations. Updates may be retried after reading current state; never blindly repeat workspace deletion or invitation cancellation.",
        "example_arguments": {
          "team_id": 42,
          "invitation_id": "018f3c96-0d74-7b2b-9e10-5ecbbcd82921"
        },
        "example_result": {
          "deleted": true,
          "invitation_id": "018f3c96-0d74-7b2b-9e10-5ecbbcd82921"
        }
      }
    },
    {
      "name": "convert_idea_to_draft",
      "title": "Convert idea to draft",
      "description": "Atomically create or return the idea's existing draft. To schedule it, next call schedule_post with the returned post_id and post_version.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "idea_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Idea id."
          }
        },
        "required": [
          "team_id",
          "idea_id"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "idea_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Idea id."
          },
          "post_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public post sqid."
          },
          "created": {
            "type": "boolean",
            "description": "Created."
          },
          "next_step": {
            "type": "string",
            "description": "Next step."
          },
          "post_version": {
            "type": "integer",
            "minimum": 1,
            "description": "Post version."
          }
        },
        "required": [
          "idea_id",
          "post_id",
          "created",
          "next_step",
          "post_version"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:content",
      "read_only": false,
      "destructive": false,
      "open_world": false,
      "idempotent": true,
      "team_required": true,
      "docs": {
        "source": "services.repurposing.convert_idea_to_draft",
        "permissions": "Draft creation permission or an owned workspace profile.",
        "errors": "Requires current workspace membership; conversion also requires draft creation permission or an owned profile. Unknown and cross-workspace source/idea IDs return not found. Source creation accepts public HTTPS HTML only (1 MB maximum); fetch failures appear asynchronously in status=failed and error. AI usage is tracked and mcp:ai creation is limited to 30 calls per user per hour; no additional MCP AI quota is enforced.",
        "retry": "Reads are safe to retry and pending/processing sources should be polled with get_content_source. Before retrying source creation after an ambiguous response, list sources to avoid duplicate jobs. Idea conversion is atomic and returns the existing draft on retry; read state before retrying deletion.",
        "example_arguments": {
          "team_id": 42,
          "idea_id": 381
        },
        "example_result": {
          "idea_id": 381,
          "post_id": "R8m3Nk2V",
          "created": true,
          "next_step": "Call schedule_post with post_id, scheduled_on, expected_version, and optionally account_id.",
          "post_version": 1
        }
      }
    },
    {
      "name": "create_content_source",
      "title": "Create content source",
      "description": "Queue a public HTTPS article for asynchronous repurposing into post ideas. Poll get_content_source for results.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "maxLength": 2000,
            "description": "Url."
          },
          "requested_post_count": {
            "type": "integer",
            "minimum": 5,
            "maximum": 20,
            "default": 10,
            "description": "Requested post count."
          }
        },
        "required": [
          "team_id",
          "url"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "source": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "minLength": 1,
                "maxLength": 32,
                "description": "Public content-source sqid."
              },
              "url": {
                "type": "string",
                "format": "uri",
                "description": "Url."
              },
              "title": {
                "type": "string",
                "description": "Title."
              },
              "status": {
                "enum": [
                  "pending",
                  "processing",
                  "completed",
                  "failed"
                ],
                "description": "Status."
              },
              "error": {
                "type": "string",
                "description": "Error."
              },
              "requested_post_count": {
                "type": "integer",
                "description": "Requested post count."
              },
              "created_at": {
                "type": "string",
                "description": "Created at."
              },
              "ideas": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "integer",
                      "minimum": 1,
                      "description": "Id."
                    },
                    "content": {
                      "type": "string",
                      "description": "Content."
                    },
                    "order": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Order."
                    },
                    "post_id": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Post id."
                    }
                  },
                  "required": [
                    "id",
                    "content",
                    "order",
                    "post_id"
                  ],
                  "additionalProperties": false,
                  "description": "Ideas item."
                },
                "description": "Ideas."
              }
            },
            "required": [
              "id",
              "url",
              "title",
              "status",
              "error",
              "requested_post_count",
              "created_at"
            ],
            "additionalProperties": false,
            "description": "Source."
          }
        },
        "required": [
          "source"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:ai",
      "read_only": false,
      "destructive": false,
      "open_world": true,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "services.repurposing.create_content_source",
        "permissions": "Current workspace member; AI usage is tracked and the MCP AI limit is 30 calls per user per hour.",
        "errors": "Requires current workspace membership; conversion also requires draft creation permission or an owned profile. Unknown and cross-workspace source/idea IDs return not found. Source creation accepts public HTTPS HTML only (1 MB maximum); fetch failures appear asynchronously in status=failed and error. AI usage is tracked and mcp:ai creation is limited to 30 calls per user per hour; no additional MCP AI quota is enforced.",
        "retry": "Reads are safe to retry and pending/processing sources should be polled with get_content_source. Before retrying source creation after an ambiguous response, list sources to avoid duplicate jobs. Idea conversion is atomic and returns the existing draft on retry; read state before retrying deletion.",
        "example_arguments": {
          "team_id": 42,
          "url": "https://example.com/research/customer-interviews",
          "requested_post_count": 10
        },
        "example_result": {
          "source": {
            "id": "S4n8Qp2L",
            "url": "https://example.com/research/customer-interviews",
            "title": "Customer interview research",
            "status": "pending",
            "error": "",
            "requested_post_count": 10,
            "created_at": "2026-10-01T14:05:00+00:00"
          }
        }
      }
    },
    {
      "name": "create_followup_comment",
      "title": "Create follow-up comment",
      "description": "Add planned follow-up publication content.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "post_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public post sqid."
          },
          "expected_version": {
            "type": "integer",
            "minimum": 1,
            "description": "Last-read post concurrency version."
          },
          "confirmed_revision": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1,
            "description": "Confirmed revision."
          },
          "description": {
            "type": "string",
            "maxLength": 1000,
            "description": "Description."
          }
        },
        "required": [
          "team_id",
          "post_id",
          "description",
          "expected_version"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "comment": {
            "type": "object",
            "properties": {
              "id": {
                "type": "integer",
                "minimum": 1,
                "description": "Id."
              },
              "description": {
                "type": "string",
                "description": "Description."
              },
              "order": {
                "type": "integer",
                "minimum": 0,
                "description": "Order."
              }
            },
            "description": "Comment.",
            "required": [
              "id",
              "description",
              "order"
            ],
            "additionalProperties": false
          },
          "version": {
            "type": "integer",
            "description": "Version."
          },
          "content_revision": {
            "type": "integer",
            "description": "Content revision."
          }
        },
        "required": [
          "comment",
          "version",
          "content_revision"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:content",
      "read_only": false,
      "destructive": false,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.services.content; Comment is planned published follow-up content, not private collaboration",
        "permissions": "can_edit_post and approval/version guards.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Request metadata (actor, connection, workspace, tool, outcome, duration, and correlation ID) is logged; arguments and results are not. Retry reads freely. Retry a mutation only when marked idempotent; otherwise read current state before deciding whether to repeat it.",
        "example_arguments": {
          "team_id": 42,
          "post_id": "P7k2Lm9Q",
          "description": "The checklist is linked in the first comment.",
          "expected_version": 4
        },
        "example_result": {
          "comment": {
            "id": 901,
            "description": "The checklist is linked in the first comment.",
            "order": 0
          },
          "version": 5,
          "content_revision": 4
        }
      }
    },
    {
      "name": "create_invitation",
      "title": "Send invitation",
      "description": "Create and email a workspace invitation.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "email": {
            "type": "string",
            "format": "email",
            "maxLength": 254,
            "description": "Email."
          },
          "role": {
            "enum": [
              "admin",
              "member"
            ],
            "description": "Role."
          },
          "requires_linkedin": {
            "type": "boolean",
            "description": "Requires linkedin."
          },
          "can_create_drafts": {
            "type": "boolean",
            "description": "Can create drafts."
          },
          "can_publish": {
            "type": "boolean",
            "description": "Can publish."
          },
          "can_approve": {
            "type": "boolean",
            "description": "Can approve."
          }
        },
        "required": [
          "team_id",
          "email"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "invitation": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "description": "Id."
              },
              "email": {
                "type": "string",
                "format": "email",
                "description": "Email."
              },
              "role": {
                "enum": [
                  "admin",
                  "member"
                ],
                "description": "Role."
              },
              "requires_linkedin": {
                "type": "boolean",
                "description": "Requires linkedin."
              },
              "can_create_drafts": {
                "type": "boolean",
                "description": "Can create drafts."
              },
              "can_publish": {
                "type": "boolean",
                "description": "Can publish."
              },
              "can_approve": {
                "type": "boolean",
                "description": "Can approve."
              },
              "accepted": {
                "type": "boolean",
                "description": "Accepted."
              }
            },
            "description": "Invitation.",
            "required": [
              "id",
              "email",
              "role",
              "requires_linkedin",
              "can_create_drafts",
              "can_publish",
              "can_approve",
              "accepted"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "invitation"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:invitations",
      "read_only": false,
      "destructive": false,
      "open_world": true,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "teams.invitations.send_invitation and InvitationViewSet",
        "permissions": "Workspace administrator. Defaults are role=member, requires_linkedin=false, can_create_drafts=true, can_publish=false, and can_approve=false; requiring LinkedIn blocks applicable work until the invitee connects a personal profile.",
        "errors": "Workspace reads require current membership; workspace and invitation administration requires an administrator, while creation requires account-level mcp:teams. Invalid/duplicate slugs or pending emails are rejected; unknown or cross-workspace invitations return not found, and accepted invitations cannot be changed or cancelled. Calls are limited to 120 per user per minute.",
        "retry": "Reads are safe to retry. Before retrying workspace or invitation creation after an ambiguous response, list current workspaces or invitations. Updates may be retried after reading current state; never blindly repeat workspace deletion or invitation cancellation.",
        "example_arguments": {
          "team_id": 42,
          "email": "alex@example.com",
          "role": "member",
          "requires_linkedin": true,
          "can_create_drafts": true,
          "can_publish": false,
          "can_approve": false
        },
        "example_result": {
          "invitation": {
            "id": "018f3c96-0d74-7b2b-9e10-5ecbbcd82921",
            "email": "alex@example.com",
            "role": "member",
            "requires_linkedin": true,
            "can_create_drafts": true,
            "can_publish": false,
            "can_approve": false,
            "accepted": false
          }
        }
      }
    },
    {
      "name": "create_post",
      "title": "Create draft",
      "description": "Create an unscheduled LinkedIn draft.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "description": {
            "type": "string",
            "maxLength": 63206,
            "default": "",
            "description": "Description."
          }
        },
        "required": [
          "team_id"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "post": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Id."
              },
              "description": {
                "type": "string",
                "description": "Description."
              },
              "version": {
                "type": "integer",
                "description": "Version."
              },
              "content_revision": {
                "type": "integer",
                "description": "Content revision."
              },
              "scheduled_on": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Scheduled on."
              },
              "timezone": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Timezone."
              },
              "schedule_active": {
                "type": "boolean",
                "description": "Schedule active."
              },
              "target_account_id": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Target account id."
              },
              "delivery": {
                "type": "object",
                "properties": {
                  "status": {
                    "type": "string",
                    "description": "Status."
                  },
                  "total": {
                    "type": "integer",
                    "description": "Total."
                  },
                  "published": {
                    "type": "integer",
                    "description": "Published."
                  },
                  "failed": {
                    "type": "integer",
                    "description": "Failed."
                  },
                  "pending": {
                    "type": "integer",
                    "description": "Pending."
                  },
                  "details": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "integer"
                    },
                    "description": "Details.",
                    "properties": {},
                    "required": []
                  }
                },
                "required": [
                  "status",
                  "total"
                ],
                "description": "Delivery.",
                "additionalProperties": false
              }
            },
            "description": "Post.",
            "required": [
              "id",
              "description",
              "version",
              "content_revision",
              "scheduled_on",
              "timezone",
              "schedule_active",
              "target_account_id",
              "delivery"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "post"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:content",
      "read_only": false,
      "destructive": false,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "PostCreateView and can_create_draft",
        "permissions": "Draft creation permission or owned profile.",
        "errors": "Requires a current workspace membership. Unknown or cross-workspace posts return not found; draft permissions can deny writes. Content over 63,206 characters, stale versions, missing approval confirmation, active schedules, or started publication reject the applicable mutation. Calls are limited to 120 per user per minute.",
        "retry": "Reads are safe to retry. Before retrying create, search or list posts to avoid a duplicate draft. For update or delete, reload the post after an ambiguous response and use its current version; never blindly repeat a stale mutation.",
        "example_arguments": {
          "team_id": 42,
          "description": "A draft about what ten customer interviews taught us about onboarding."
        },
        "example_result": {
          "post": {
            "id": "R8m3Nk2V",
            "description": "A draft about what ten customer interviews taught us about onboarding.",
            "version": 1,
            "content_revision": 1,
            "scheduled_on": null,
            "timezone": "America/New_York",
            "schedule_active": false,
            "target_account_id": null,
            "delivery": {
              "status": "draft",
              "total": 0,
              "published": 0,
              "failed": 0,
              "pending": 0,
              "details": {}
            }
          }
        }
      }
    },
    {
      "name": "create_workspace",
      "title": "Create workspace",
      "description": "Create a workspace and explicitly add it to this connection.",
      "input_schema": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100,
            "description": "Name."
          },
          "slug": {
            "type": [
              "string",
              "null"
            ],
            "minLength": 1,
            "maxLength": 50,
            "description": "Slug."
          }
        },
        "required": [
          "name"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "workspace": {
            "type": "object",
            "properties": {
              "id": {
                "type": "integer",
                "minimum": 1,
                "description": "Id."
              },
              "name": {
                "type": "string",
                "description": "Name."
              },
              "slug": {
                "type": "string",
                "description": "Slug."
              },
              "role": {
                "enum": [
                  "admin",
                  "member"
                ],
                "description": "Role."
              },
              "members": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "integer",
                      "minimum": 1,
                      "description": "Id."
                    },
                    "name": {
                      "type": "string",
                      "description": "Name."
                    },
                    "role": {
                      "enum": [
                        "admin",
                        "member"
                      ],
                      "description": "Role."
                    }
                  },
                  "description": "Members item.",
                  "required": [
                    "id",
                    "name",
                    "role"
                  ],
                  "additionalProperties": false
                },
                "description": "Members."
              }
            },
            "description": "Workspace.",
            "required": [
              "id",
              "name",
              "slug",
              "role",
              "members"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "workspace"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:teams",
      "read_only": false,
      "destructive": false,
      "open_world": false,
      "idempotent": false,
      "team_required": false,
      "docs": {
        "source": "teams.helpers.create_default_team_for_user",
        "permissions": "Account-level mcp:teams scope; creator becomes administrator.",
        "errors": "Workspace reads require current membership; workspace and invitation administration requires an administrator, while creation requires account-level mcp:teams. Invalid/duplicate slugs or pending emails are rejected; unknown or cross-workspace invitations return not found, and accepted invitations cannot be changed or cancelled. Calls are limited to 120 per user per minute.",
        "retry": "Reads are safe to retry. Before retrying workspace or invitation creation after an ambiguous response, list current workspaces or invitations. Updates may be retried after reading current state; never blindly repeat workspace deletion or invitation cancellation.",
        "example_arguments": {
          "name": "Northstar Studio",
          "slug": "northstar-studio"
        },
        "example_result": {
          "workspace": {
            "id": 42,
            "name": "Northstar Studio",
            "slug": "northstar-studio",
            "role": "admin",
            "members": [
              {
                "id": 17,
                "name": "Maya Chen",
                "role": "admin"
              },
              {
                "id": 23,
                "name": "Jon Bell",
                "role": "member"
              }
            ]
          }
        }
      }
    },
    {
      "name": "delete_content_source",
      "title": "Delete content source",
      "description": "Delete one of the caller's source jobs and its ideas.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "source_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public content-source sqid."
          }
        },
        "required": [
          "team_id",
          "source_id"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "deleted": {
            "const": true,
            "description": "Deleted."
          },
          "source_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public content-source sqid."
          }
        },
        "required": [
          "deleted",
          "source_id"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:delete",
      "read_only": false,
      "destructive": true,
      "open_world": false,
      "idempotent": true,
      "team_required": true,
      "docs": {
        "source": "services.repurposing.delete_content_source",
        "permissions": "The caller must own the source in this workspace.",
        "errors": "Requires current workspace membership; conversion also requires draft creation permission or an owned profile. Unknown and cross-workspace source/idea IDs return not found. Source creation accepts public HTTPS HTML only (1 MB maximum); fetch failures appear asynchronously in status=failed and error. AI usage is tracked and mcp:ai creation is limited to 30 calls per user per hour; no additional MCP AI quota is enforced.",
        "retry": "Reads are safe to retry and pending/processing sources should be polled with get_content_source. Before retrying source creation after an ambiguous response, list sources to avoid duplicate jobs. Idea conversion is atomic and returns the existing draft on retry; read state before retrying deletion.",
        "example_arguments": {
          "team_id": 42,
          "source_id": "S4n8Qp2L"
        },
        "example_result": {
          "deleted": true,
          "source_id": "S4n8Qp2L"
        }
      }
    },
    {
      "name": "delete_followup_comment",
      "title": "Delete follow-up comment",
      "description": "Delete planned follow-up publication content.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "post_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public post sqid."
          },
          "expected_version": {
            "type": "integer",
            "minimum": 1,
            "description": "Last-read post concurrency version."
          },
          "confirmed_revision": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1,
            "description": "Confirmed revision."
          },
          "comment_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Comment id."
          }
        },
        "required": [
          "team_id",
          "post_id",
          "comment_id",
          "expected_version"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "deleted": {
            "const": true,
            "description": "Deleted."
          },
          "comment_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Comment id."
          },
          "version": {
            "type": "integer",
            "description": "Version."
          },
          "content_revision": {
            "type": "integer",
            "description": "Content revision."
          }
        },
        "required": [
          "deleted",
          "comment_id",
          "version",
          "content_revision"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:delete",
      "read_only": false,
      "destructive": true,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.services.content; Comment is planned published follow-up content, not private collaboration",
        "permissions": "can_edit_post and approval/version guards.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Request metadata (actor, connection, workspace, tool, outcome, duration, and correlation ID) is logged; arguments and results are not. Retry reads freely. Retry a mutation only when marked idempotent; otherwise read current state before deciding whether to repeat it.",
        "example_arguments": {
          "team_id": 42,
          "post_id": "P7k2Lm9Q",
          "comment_id": 901,
          "expected_version": 6,
          "confirmed_revision": 5
        },
        "example_result": {
          "deleted": true,
          "comment_id": 901,
          "version": 7,
          "content_revision": 6
        }
      }
    },
    {
      "name": "delete_media",
      "title": "Delete media",
      "description": "Permanently remove an attachment with content concurrency guards.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "post_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public post sqid."
          },
          "media_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Media id."
          },
          "expected_version": {
            "type": "integer",
            "minimum": 1,
            "description": "Last-read post concurrency version."
          },
          "confirmed_revision": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1,
            "description": "Confirmed revision."
          }
        },
        "required": [
          "team_id",
          "post_id",
          "media_id",
          "expected_version"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "deleted": {
            "const": true,
            "description": "Deleted."
          },
          "media_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Media id."
          },
          "version": {
            "type": "integer",
            "description": "Version."
          },
          "content_revision": {
            "type": "integer",
            "description": "Content revision."
          }
        },
        "required": [
          "deleted",
          "media_id",
          "version",
          "content_revision"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:delete",
      "read_only": false,
      "destructive": true,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.api.media_delete and content services",
        "permissions": "Post edit authority and approval/version guards.",
        "errors": "Requires current workspace membership. Unknown posts, media, accounts, and cross-workspace IDs return not found. Upload commit, rename, and delete recheck edit permission, approval confirmation, and the post version; invalid type, size, or title is rejected. Calls are limited to 120 per user per minute.",
        "retry": "Metadata reads and transfer-instruction requests are safe to retry, but transfer URLs still require the delegated bearer credential (the example is an instruction, not a token). After an ambiguous upload or mutation, list media and reload the post version before retrying; delete is not safe to repeat after success.",
        "example_arguments": {
          "team_id": 42,
          "post_id": "P7k2Lm9Q",
          "media_id": 615,
          "expected_version": 6,
          "confirmed_revision": 5
        },
        "example_result": {
          "deleted": true,
          "media_id": 615,
          "version": 7,
          "content_revision": 6
        }
      }
    },
    {
      "name": "delete_post",
      "title": "Delete post",
      "description": "Permanently delete an unpublished draft.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "post_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public post sqid."
          },
          "expected_version": {
            "type": "integer",
            "minimum": 1,
            "description": "Last-read post concurrency version."
          }
        },
        "required": [
          "team_id",
          "post_id",
          "expected_version"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "deleted": {
            "const": true,
            "description": "Deleted."
          },
          "post_id": {
            "type": "string",
            "description": "Post id."
          }
        },
        "required": [
          "deleted",
          "post_id"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:delete",
      "read_only": false,
      "destructive": true,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.views.post_delete with added version/publication guard",
        "permissions": "can_edit_post; publication must not have started.",
        "errors": "Requires a current workspace membership. Unknown or cross-workspace posts return not found; draft permissions can deny writes. Content over 63,206 characters, stale versions, missing approval confirmation, active schedules, or started publication reject the applicable mutation. Calls are limited to 120 per user per minute.",
        "retry": "Reads are safe to retry. Before retrying create, search or list posts to avoid a duplicate draft. For update or delete, reload the post after an ambiguous response and use its current version; never blindly repeat a stale mutation.",
        "example_arguments": {
          "team_id": 42,
          "post_id": "P7k2Lm9Q",
          "expected_version": 5
        },
        "example_result": {
          "deleted": true,
          "post_id": "P7k2Lm9Q"
        }
      }
    },
    {
      "name": "delete_workspace",
      "title": "Delete workspace",
      "description": "Permanently delete the active workspace and its related records.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          }
        },
        "required": [
          "team_id"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "deleted": {
            "const": true,
            "description": "Deleted."
          },
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Team id."
          }
        },
        "required": [
          "deleted",
          "team_id"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:teams",
      "read_only": false,
      "destructive": true,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "teams API TeamViewSet",
        "permissions": "Workspace administrator.",
        "errors": "Workspace reads require current membership; workspace and invitation administration requires an administrator, while creation requires account-level mcp:teams. Invalid/duplicate slugs or pending emails are rejected; unknown or cross-workspace invitations return not found, and accepted invitations cannot be changed or cancelled. Calls are limited to 120 per user per minute.",
        "retry": "Reads are safe to retry. Before retrying workspace or invitation creation after an ambiguous response, list current workspaces or invitations. Updates may be retried after reading current state; never blindly repeat workspace deletion or invitation cancellation.",
        "example_arguments": {
          "team_id": 42
        },
        "example_result": {
          "deleted": true,
          "team_id": 42
        }
      }
    },
    {
      "name": "generate_linkedin_bios",
      "title": "Generate LinkedIn bios",
      "description": "Generate up to five scrubbed LinkedIn About-section drafts from a professional description.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "content": {
            "type": "string",
            "minLength": 1,
            "maxLength": 10000,
            "description": "Text input; whitespace-only input is rejected."
          }
        },
        "required": [
          "team_id",
          "content"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "bios": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "description": "Bios item."
            },
            "minItems": 1,
            "maxItems": 5,
            "description": "Bios."
          }
        },
        "required": [
          "bios"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:ai",
      "read_only": false,
      "destructive": false,
      "open_world": true,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "free_tools.generators.apis.generate_bio → services.generate_bios (description input)",
        "permissions": "Current workspace member; mcp:ai scope, workspace AI quota, and MCP AI rate limit apply.",
        "errors": "Blank or over-10,000-character input is rejected. Provider and malformed-generation failures are safe to retry as a new generation.",
        "retry": "The provider call is not idempotent. After a provider or ambiguous failure, retry only if another generation is acceptable.",
        "example_arguments": {
          "team_id": 42,
          "content": "Independent analytics consultant for SaaS founders with ten years in data."
        },
        "example_result": {
          "bios": [
            "I help SaaS founders turn product data into decisions their teams can act on."
          ]
        }
      }
    },
    {
      "name": "generate_linkedin_carousel_text",
      "title": "Generate LinkedIn carousel text",
      "description": "Generate scrubbed titles and body copy for three to eight carousel slides; this does not render, download, or publish a PDF.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "topic": {
            "type": "string",
            "minLength": 10,
            "maxLength": 3000,
            "description": "Carousel topic and supporting facts."
          },
          "slide_count": {
            "type": "integer",
            "minimum": 3,
            "maximum": 8,
            "default": 5,
            "description": "Exact slide count."
          }
        },
        "required": [
          "team_id",
          "topic"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "slides": {
            "type": "array",
            "minItems": 3,
            "maxItems": 8,
            "items": {
              "type": "object",
              "properties": {
                "title": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 90,
                  "description": "Title."
                },
                "body": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 600,
                  "description": "Body."
                }
              },
              "required": [
                "title",
                "body"
              ],
              "additionalProperties": false,
              "description": "Slides item."
            },
            "description": "Slides."
          }
        },
        "required": [
          "slides"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:ai",
      "read_only": false,
      "destructive": false,
      "open_world": true,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "free_tools.carousel_generator.services.generate",
        "permissions": "Current workspace member; mcp:ai scope, workspace AI quota, and MCP AI rate limit apply.",
        "errors": "Topic/count limits are enforced; malformed slides and titles over 90 or bodies over 600 characters are rejected.",
        "retry": "The provider call is not idempotent. After a provider or ambiguous failure, retry only if another generation is acceptable.",
        "example_arguments": {
          "team_id": 42,
          "topic": "A practical framework for better customer interviews",
          "slide_count": 3
        },
        "example_result": {
          "slides": [
            {
              "title": "Ask better questions",
              "body": "Start with a recent real event, not a hypothetical future."
            },
            {
              "title": "Follow the evidence",
              "body": "Ask what happened next and what the customer actually did."
            },
            {
              "title": "Your next interview",
              "body": "Replace one leading question with a request for a concrete example."
            }
          ]
        }
      }
    },
    {
      "name": "generate_linkedin_comments",
      "title": "Generate LinkedIn comments",
      "description": "Generate exactly three scrubbed comment drafts grounded in a pasted LinkedIn post and the caller's genuine perspective; nothing is published.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "post": {
            "type": "string",
            "minLength": 20,
            "maxLength": 5000,
            "description": "Pasted LinkedIn post treated as quoted source."
          },
          "context": {
            "type": "string",
            "minLength": 5,
            "maxLength": 1500,
            "description": "The caller's genuine perspective or context."
          },
          "tone": {
            "enum": [
              "professional",
              "warm",
              "curious",
              "concise"
            ],
            "description": "Comment tone."
          },
          "goal": {
            "enum": [
              "add_value",
              "ask_question",
              "support",
              "start_conversation"
            ],
            "description": "Comment objective."
          }
        },
        "required": [
          "team_id",
          "post",
          "context",
          "tone",
          "goal"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "comments": {
            "type": "array",
            "minItems": 3,
            "maxItems": 3,
            "items": {
              "type": "string",
              "minLength": 1,
              "maxLength": 500,
              "description": "Comments item."
            },
            "description": "Comments."
          }
        },
        "required": [
          "comments"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:ai",
      "read_only": false,
      "destructive": false,
      "open_world": true,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "free_tools.comment_generator.services.generate",
        "permissions": "Current workspace member; mcp:ai scope, workspace AI quota, and MCP AI rate limit apply.",
        "errors": "Form limits/enums are enforced; malformed, duplicate, or over-500-character provider drafts are rejected.",
        "retry": "The provider call is not idempotent. After a provider or ambiguous failure, retry only if another generation is acceptable.",
        "example_arguments": {
          "team_id": 42,
          "post": "A detailed post about testing onboarding assumptions.",
          "context": "I value testing with new users.",
          "tone": "curious",
          "goal": "ask_question"
        },
        "example_result": {
          "comments": [
            "Which onboarding assumption changed most after speaking with new users?",
            "How do you separate activation friction from expectation gaps?",
            "What signal tells you an onboarding test has enough evidence?"
          ]
        }
      }
    },
    {
      "name": "generate_linkedin_headlines",
      "title": "Generate LinkedIn headlines",
      "description": "Generate up to ten scrubbed profile headline options from a professional description.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "content": {
            "type": "string",
            "minLength": 1,
            "maxLength": 10000,
            "description": "Text input; whitespace-only input is rejected."
          }
        },
        "required": [
          "team_id",
          "content"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "headlines": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "description": "Headlines item."
            },
            "minItems": 1,
            "maxItems": 10,
            "description": "Headlines."
          }
        },
        "required": [
          "headlines"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:ai",
      "read_only": false,
      "destructive": false,
      "open_world": true,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "free_tools.generators.apis.generate_headline → services.generate_headlines (description input)",
        "permissions": "Current workspace member; mcp:ai scope, workspace AI quota, and MCP AI rate limit apply.",
        "errors": "Blank or over-10,000-character input is rejected. Provider and malformed-generation failures are safe to retry as a new generation.",
        "retry": "The provider call is not idempotent. After a provider or ambiguous failure, retry only if another generation is acceptable.",
        "example_arguments": {
          "team_id": 42,
          "content": "B2B product consultant helping small teams improve activation."
        },
        "example_result": {
          "headlines": [
            "B2B Product Consultant | Turning Activation Friction into Growth"
          ]
        }
      }
    },
    {
      "name": "generate_linkedin_hooks",
      "title": "Generate LinkedIn hooks",
      "description": "Generate up to ten scrubbed opening hooks for a LinkedIn post topic.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "topic": {
            "type": "string",
            "minLength": 1,
            "maxLength": 10000,
            "description": "Text input; whitespace-only input is rejected."
          }
        },
        "required": [
          "team_id",
          "topic"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "hooks": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1,
              "description": "Hooks item."
            },
            "minItems": 1,
            "maxItems": 10,
            "description": "Hooks."
          }
        },
        "required": [
          "hooks"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:ai",
      "read_only": false,
      "destructive": false,
      "open_world": true,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "free_tools.generators.apis.generate_hook → services.generate_hooks",
        "permissions": "Current workspace member; mcp:ai scope, workspace AI quota, and MCP AI rate limit apply.",
        "errors": "Blank or over-10,000-character input is rejected. Provider and malformed-generation failures are safe to retry as a new generation.",
        "retry": "The provider call is not idempotent. After a provider or ambiguous failure, retry only if another generation is acceptable.",
        "example_arguments": {
          "team_id": 42,
          "topic": "Why customer interviews fail when teams ask leading questions"
        },
        "example_result": {
          "hooks": [
            "Your customer interviews may be confirming assumptions—not challenging them."
          ]
        }
      }
    },
    {
      "name": "generate_linkedin_post",
      "title": "Generate LinkedIn post",
      "description": "Generate one scrubbed 150–250 word LinkedIn draft from a topic or source text; this does not create or publish a post.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "content": {
            "type": "string",
            "minLength": 1,
            "maxLength": 10000,
            "description": "Topic or source text."
          },
          "tone": {
            "enum": [
              "professional",
              "casual",
              "storytelling",
              "educational",
              "inspirational"
            ],
            "description": "Writing tone."
          },
          "mode": {
            "enum": [
              "repurpose",
              "topic"
            ],
            "default": "topic",
            "description": "topic creates from an idea; repurpose stays grounded in source text."
          }
        },
        "required": [
          "team_id",
          "content",
          "tone"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "content": {
            "type": "string",
            "minLength": 1,
            "description": "Content."
          }
        },
        "required": [
          "content"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:ai",
      "read_only": false,
      "destructive": false,
      "open_world": true,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "free_tools.generators.apis.create_post → services.generate_post",
        "permissions": "Current workspace member; mcp:ai scope, workspace AI quota, and MCP AI rate limit apply.",
        "errors": "Blank/over-10,000-character content and unsupported tone or mode are rejected.",
        "retry": "The provider call is not idempotent. After a provider or ambiguous failure, retry only if another generation is acceptable.",
        "example_arguments": {
          "team_id": 42,
          "content": "Three lessons from interviewing customers",
          "tone": "educational",
          "mode": "topic"
        },
        "example_result": {
          "content": "Most customer interviews fail before the first question.\n\nHere are three ways to make yours useful..."
        }
      }
    },
    {
      "name": "generate_post_text",
      "title": "Generate post text",
      "description": "Generate scrubbed LinkedIn post text from an idea with usage tracking.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "idea": {
            "type": "string",
            "minLength": 1,
            "maxLength": 10000,
            "description": "Idea."
          }
        },
        "required": [
          "team_id",
          "idea"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "content": {
            "type": "string",
            "description": "Content."
          }
        },
        "required": [
          "content"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:ai",
      "read_only": false,
      "destructive": false,
      "open_world": true,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "ai.generation.generate_from_idea",
        "permissions": "Current member; existing AI usage quota applies.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Request metadata (actor, connection, workspace, tool, outcome, duration, and correlation ID) is logged; arguments and results are not. Retry reads freely. Retry a mutation only when marked idempotent; otherwise read current state before deciding whether to repeat it.",
        "example_arguments": {
          "team_id": 42,
          "idea": "What we learned from interviewing ten new customers about onboarding"
        },
        "example_result": {
          "content": "Ten customer interviews changed how we think about onboarding.\n\nThe biggest lesson: ask about the last real attempt, not an ideal future."
        }
      }
    },
    {
      "name": "get_calendar",
      "title": "Get calendar",
      "description": "List scheduled posts in a bounded aware datetime interval.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "start": {
            "type": "string",
            "format": "date-time",
            "description": "Start."
          },
          "end": {
            "type": "string",
            "format": "date-time",
            "description": "End."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 100,
            "description": "Limit."
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "default": 0,
            "description": "Offset."
          }
        },
        "required": [
          "team_id",
          "start",
          "end"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "events": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "post_id": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 32,
                  "description": "Public post sqid."
                },
                "scheduled_on": {
                  "type": "string",
                  "format": "date-time",
                  "description": "Scheduled instant."
                },
                "active": {
                  "type": "boolean",
                  "description": "Whether publication is still active."
                }
              },
              "description": "Events item.",
              "required": [
                "post_id",
                "scheduled_on",
                "active"
              ],
              "additionalProperties": false
            },
            "description": "Events."
          },
          "has_more": {
            "type": "boolean",
            "description": "Has more."
          }
        },
        "required": [
          "events",
          "has_more"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:read",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": true,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.api.calendar_events",
        "permissions": "Current workspace member.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Request metadata (actor, connection, workspace, tool, outcome, duration, and correlation ID) is logged; arguments and results are not. Retry reads freely. Retry a mutation only when marked idempotent; otherwise read current state before deciding whether to repeat it.",
        "example_arguments": {
          "team_id": 42,
          "start": "2026-10-01T00:00:00-04:00",
          "end": "2026-11-01T00:00:00-04:00",
          "limit": 50,
          "offset": 0
        },
        "example_result": {
          "events": [
            {
              "post_id": "P7k2Lm9Q",
              "scheduled_on": "2026-10-08T13:30:00+00:00",
              "active": true
            }
          ],
          "has_more": false
        }
      }
    },
    {
      "name": "get_content_source",
      "title": "Get content source",
      "description": "Get one bounded source result with all generated ideas.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "source_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public content-source sqid."
          }
        },
        "required": [
          "team_id",
          "source_id"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "source": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "minLength": 1,
                "maxLength": 32,
                "description": "Public content-source sqid."
              },
              "url": {
                "type": "string",
                "format": "uri",
                "description": "Url."
              },
              "title": {
                "type": "string",
                "description": "Title."
              },
              "status": {
                "enum": [
                  "pending",
                  "processing",
                  "completed",
                  "failed"
                ],
                "description": "Status."
              },
              "error": {
                "type": "string",
                "description": "Error."
              },
              "requested_post_count": {
                "type": "integer",
                "description": "Requested post count."
              },
              "created_at": {
                "type": "string",
                "description": "Created at."
              },
              "ideas": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "integer",
                      "minimum": 1,
                      "description": "Id."
                    },
                    "content": {
                      "type": "string",
                      "description": "Content."
                    },
                    "order": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Order."
                    },
                    "post_id": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Post id."
                    }
                  },
                  "required": [
                    "id",
                    "content",
                    "order",
                    "post_id"
                  ],
                  "additionalProperties": false,
                  "description": "Ideas item."
                },
                "description": "Ideas."
              }
            },
            "required": [
              "id",
              "url",
              "title",
              "status",
              "error",
              "requested_post_count",
              "created_at"
            ],
            "additionalProperties": false,
            "description": "Source."
          }
        },
        "required": [
          "source"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:read",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": true,
      "team_required": true,
      "docs": {
        "source": "services.repurposing.get_content_source",
        "permissions": "Current workspace member.",
        "errors": "Requires current workspace membership; conversion also requires draft creation permission or an owned profile. Unknown and cross-workspace source/idea IDs return not found. Source creation accepts public HTTPS HTML only (1 MB maximum); fetch failures appear asynchronously in status=failed and error. AI usage is tracked and mcp:ai creation is limited to 30 calls per user per hour; no additional MCP AI quota is enforced.",
        "retry": "Reads are safe to retry and pending/processing sources should be polled with get_content_source. Before retrying source creation after an ambiguous response, list sources to avoid duplicate jobs. Idea conversion is atomic and returns the existing draft on retry; read state before retrying deletion.",
        "example_arguments": {
          "team_id": 42,
          "source_id": "S4n8Qp2L"
        },
        "example_result": {
          "source": {
            "id": "S4n8Qp2L",
            "url": "https://example.com/research/customer-interviews",
            "title": "Customer interview research",
            "status": "completed",
            "error": "",
            "requested_post_count": 10,
            "created_at": "2026-10-01T14:05:00+00:00",
            "ideas": [
              {
                "id": 381,
                "content": "Ten customer interviews revealed that onboarding friction starts before the first login.",
                "order": 0,
                "post_id": null
              },
              {
                "id": 382,
                "content": "The best onboarding questions focus on the customer's last real attempt, not their ideal workflow.",
                "order": 1,
                "post_id": "R8m3Nk2V"
              }
            ]
          }
        }
      }
    },
    {
      "name": "get_invitation",
      "title": "Get invitation",
      "description": "Read one workspace invitation.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "invitation_id": {
            "type": "string",
            "format": "uuid",
            "description": "Invitation id."
          }
        },
        "required": [
          "team_id",
          "invitation_id"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "invitation": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "description": "Id."
              },
              "email": {
                "type": "string",
                "format": "email",
                "description": "Email."
              },
              "role": {
                "enum": [
                  "admin",
                  "member"
                ],
                "description": "Role."
              },
              "requires_linkedin": {
                "type": "boolean",
                "description": "Requires linkedin."
              },
              "can_create_drafts": {
                "type": "boolean",
                "description": "Can create drafts."
              },
              "can_publish": {
                "type": "boolean",
                "description": "Can publish."
              },
              "can_approve": {
                "type": "boolean",
                "description": "Can approve."
              },
              "accepted": {
                "type": "boolean",
                "description": "Accepted."
              }
            },
            "description": "Invitation.",
            "required": [
              "id",
              "email",
              "role",
              "requires_linkedin",
              "can_create_drafts",
              "can_publish",
              "can_approve",
              "accepted"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "invitation"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:read",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": true,
      "team_required": true,
      "docs": {
        "source": "teams.views.api_views.InvitationViewSet.retrieve",
        "permissions": "Workspace administrator.",
        "errors": "Workspace reads require current membership; workspace and invitation administration requires an administrator, while creation requires account-level mcp:teams. Invalid/duplicate slugs or pending emails are rejected; unknown or cross-workspace invitations return not found, and accepted invitations cannot be changed or cancelled. Calls are limited to 120 per user per minute.",
        "retry": "Reads are safe to retry. Before retrying workspace or invitation creation after an ambiguous response, list current workspaces or invitations. Updates may be retried after reading current state; never blindly repeat workspace deletion or invitation cancellation.",
        "example_arguments": {
          "team_id": 42,
          "invitation_id": "018f3c96-0d74-7b2b-9e10-5ecbbcd82921"
        },
        "example_result": {
          "invitation": {
            "id": "018f3c96-0d74-7b2b-9e10-5ecbbcd82921",
            "email": "alex@example.com",
            "role": "member",
            "requires_linkedin": true,
            "can_create_drafts": true,
            "can_publish": false,
            "can_approve": false,
            "accepted": false
          }
        }
      }
    },
    {
      "name": "get_post",
      "title": "Get post",
      "description": "Read one post including scheduling and delivery state.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "post_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public post sqid."
          }
        },
        "required": [
          "team_id",
          "post_id"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "post": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Id."
              },
              "description": {
                "type": "string",
                "description": "Description."
              },
              "version": {
                "type": "integer",
                "description": "Version."
              },
              "content_revision": {
                "type": "integer",
                "description": "Content revision."
              },
              "scheduled_on": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Scheduled on."
              },
              "timezone": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Timezone."
              },
              "schedule_active": {
                "type": "boolean",
                "description": "Schedule active."
              },
              "target_account_id": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Target account id."
              },
              "delivery": {
                "type": "object",
                "properties": {
                  "status": {
                    "type": "string",
                    "description": "Status."
                  },
                  "total": {
                    "type": "integer",
                    "description": "Total."
                  },
                  "published": {
                    "type": "integer",
                    "description": "Published."
                  },
                  "failed": {
                    "type": "integer",
                    "description": "Failed."
                  },
                  "pending": {
                    "type": "integer",
                    "description": "Pending."
                  },
                  "details": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "integer"
                    },
                    "description": "Details.",
                    "properties": {},
                    "required": []
                  }
                },
                "required": [
                  "status",
                  "total"
                ],
                "description": "Delivery.",
                "additionalProperties": false
              }
            },
            "description": "Post.",
            "required": [
              "id",
              "description",
              "version",
              "content_revision",
              "scheduled_on",
              "timezone",
              "schedule_active",
              "target_account_id",
              "delivery"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "post"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:read",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": true,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.Post",
        "permissions": "Current workspace member.",
        "errors": "Requires a current workspace membership. Unknown or cross-workspace posts return not found; draft permissions can deny writes. Content over 63,206 characters, stale versions, missing approval confirmation, active schedules, or started publication reject the applicable mutation. Calls are limited to 120 per user per minute.",
        "retry": "Reads are safe to retry. Before retrying create, search or list posts to avoid a duplicate draft. For update or delete, reload the post after an ambiguous response and use its current version; never blindly repeat a stale mutation.",
        "example_arguments": {
          "team_id": 42,
          "post_id": "P7k2Lm9Q"
        },
        "example_result": {
          "post": {
            "id": "P7k2Lm9Q",
            "description": "Three onboarding lessons from ten customer interviews.",
            "version": 4,
            "content_revision": 3,
            "scheduled_on": null,
            "timezone": "America/New_York",
            "schedule_active": false,
            "target_account_id": 271,
            "delivery": {
              "status": "draft",
              "total": 0,
              "published": 0,
              "failed": 0,
              "pending": 0,
              "details": {}
            }
          }
        }
      }
    },
    {
      "name": "get_post_idea",
      "title": "Get post idea",
      "description": "Read one generated idea and its existing draft link.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "idea_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Idea id."
          }
        },
        "required": [
          "team_id",
          "idea_id"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "idea": {
            "type": "object",
            "properties": {
              "id": {
                "type": "integer",
                "minimum": 1,
                "description": "Id."
              },
              "content": {
                "type": "string",
                "description": "Content."
              },
              "order": {
                "type": "integer",
                "minimum": 0,
                "description": "Order."
              },
              "post_id": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Post id."
              }
            },
            "required": [
              "id",
              "content",
              "order",
              "post_id"
            ],
            "additionalProperties": false,
            "description": "Idea."
          }
        },
        "required": [
          "idea"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:read",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": true,
      "team_required": true,
      "docs": {
        "source": "services.repurposing.get_idea",
        "permissions": "Current workspace member.",
        "errors": "Requires current workspace membership; conversion also requires draft creation permission or an owned profile. Unknown and cross-workspace source/idea IDs return not found. Source creation accepts public HTTPS HTML only (1 MB maximum); fetch failures appear asynchronously in status=failed and error. AI usage is tracked and mcp:ai creation is limited to 30 calls per user per hour; no additional MCP AI quota is enforced.",
        "retry": "Reads are safe to retry and pending/processing sources should be polled with get_content_source. Before retrying source creation after an ambiguous response, list sources to avoid duplicate jobs. Idea conversion is atomic and returns the existing draft on retry; read state before retrying deletion.",
        "example_arguments": {
          "team_id": 42,
          "idea_id": 381
        },
        "example_result": {
          "idea": {
            "id": 381,
            "content": "Ten customer interviews revealed that onboarding friction starts before the first login.",
            "order": 0,
            "post_id": null
          }
        }
      }
    },
    {
      "name": "get_profile",
      "title": "Get profile",
      "description": "Read the authenticated connection actor's profile. This does not return or imply granted scopes.",
      "input_schema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Id."
          },
          "name": {
            "type": "string",
            "description": "Name."
          },
          "email": {
            "type": "string",
            "format": "email",
            "description": "Email."
          },
          "nickname": {
            "type": "string",
            "description": "Nickname."
          }
        },
        "required": [
          "id",
          "name",
          "email",
          "nickname"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:read",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": true,
      "team_required": false,
      "docs": {
        "source": "apps.mcp_access.models.Profile",
        "permissions": "Authenticated connection actor only.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Request metadata (actor, connection, workspace, tool, outcome, duration, and correlation ID) is logged; arguments and results are not. Retry reads freely. Retry a mutation only when marked idempotent; otherwise read current state before deciding whether to repeat it.",
        "example_arguments": {},
        "example_result": {
          "id": "018f3c96-0d74-7b2b-9e10-5ecbbcd82921",
          "name": "Maya Chen",
          "email": "maya@example.com",
          "nickname": "Maya"
        }
      }
    },
    {
      "name": "get_queue",
      "title": "Get queue",
      "description": "Read a bounded page of queue posts plus the exact IANA timezone, queue revision, and weekly rules. IDs in each post can be passed to remove, reorder, or occurrence tools.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 100,
            "description": "Limit."
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "default": 0,
            "description": "Offset."
          }
        },
        "required": [
          "team_id"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "timezone": {
            "type": "string",
            "description": "Timezone."
          },
          "revision": {
            "type": "integer",
            "description": "Revision."
          },
          "posts": {
            "type": "object",
            "additionalProperties": {
              "type": "object",
              "properties": {
                "postId": {
                  "type": "string"
                },
                "account": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                },
                "time": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "queued": {
                  "type": "boolean"
                },
                "position": {
                  "type": [
                    "integer",
                    "null"
                  ]
                },
                "selectedStart": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "order": {
                  "type": [
                    "integer",
                    "null"
                  ]
                },
                "timing": {
                  "type": [
                    "array",
                    "null"
                  ],
                  "prefixItems": [
                    {
                      "enum": [
                        "together",
                        "staggered"
                      ]
                    },
                    {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 1440
                    }
                  ],
                  "minItems": 2,
                  "maxItems": 2
                },
                "entryId": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "minimum": 1
                },
                "occurrenceId": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "minimum": 1
                },
                "accountId": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "minimum": 1
                }
              }
            },
            "description": "Posts.",
            "properties": {},
            "required": []
          },
          "rules": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "integer",
                  "minimum": 1,
                  "description": "Id."
                },
                "weekday": {
                  "type": "integer",
                  "description": "Weekday."
                },
                "time": {
                  "type": "string",
                  "description": "Time."
                }
              },
              "description": "Rules item.",
              "required": [
                "id",
                "weekday",
                "time"
              ],
              "additionalProperties": false
            },
            "description": "Rules."
          },
          "has_more": {
            "type": "boolean",
            "description": "Has more."
          }
        },
        "required": [
          "timezone",
          "revision",
          "posts",
          "rules",
          "has_more"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:read",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": true,
      "team_required": true,
      "docs": {
        "source": "services.team_queue.snapshot",
        "permissions": "Any current workspace member may read. Queue mutations separately require workspace administrator permission for timezone, rules, and occurrences, or publishing permission for every affected account.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Safe to retry. Use offset plus the number of returned posts while has_more is true. Revision identifies queue state; mutation apply calls still require a fresh preview token.",
        "example_arguments": {
          "team_id": 42,
          "limit": 25,
          "offset": 0
        },
        "example_result": {
          "timezone": "Europe/Brussels",
          "revision": 7,
          "posts": {},
          "rules": [],
          "has_more": false
        }
      }
    },
    {
      "name": "get_workspace",
      "title": "Get workspace",
      "description": "Read the active workspace and members.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          }
        },
        "required": [
          "team_id"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "workspace": {
            "type": "object",
            "properties": {
              "id": {
                "type": "integer",
                "minimum": 1,
                "description": "Id."
              },
              "name": {
                "type": "string",
                "description": "Name."
              },
              "slug": {
                "type": "string",
                "description": "Slug."
              },
              "role": {
                "enum": [
                  "admin",
                  "member"
                ],
                "description": "Role."
              },
              "members": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "integer",
                      "minimum": 1,
                      "description": "Id."
                    },
                    "name": {
                      "type": "string",
                      "description": "Name."
                    },
                    "role": {
                      "enum": [
                        "admin",
                        "member"
                      ],
                      "description": "Role."
                    }
                  },
                  "description": "Members item.",
                  "required": [
                    "id",
                    "name",
                    "role"
                  ],
                  "additionalProperties": false
                },
                "description": "Members."
              }
            },
            "description": "Workspace.",
            "required": [
              "id",
              "name",
              "slug",
              "role",
              "members"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "workspace"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:read",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": true,
      "team_required": true,
      "docs": {
        "source": "teams.Team and Membership",
        "permissions": "Current member.",
        "errors": "Workspace reads require current membership; workspace and invitation administration requires an administrator, while creation requires account-level mcp:teams. Invalid/duplicate slugs or pending emails are rejected; unknown or cross-workspace invitations return not found, and accepted invitations cannot be changed or cancelled. Calls are limited to 120 per user per minute.",
        "retry": "Reads are safe to retry. Before retrying workspace or invitation creation after an ambiguous response, list current workspaces or invitations. Updates may be retried after reading current state; never blindly repeat workspace deletion or invitation cancellation.",
        "example_arguments": {
          "team_id": 42
        },
        "example_result": {
          "workspace": {
            "id": 42,
            "name": "Northstar Studio",
            "slug": "northstar-studio",
            "role": "admin",
            "members": [
              {
                "id": 17,
                "name": "Maya Chen",
                "role": "admin"
              },
              {
                "id": 23,
                "name": "Jon Bell",
                "role": "member"
              }
            ]
          }
        }
      }
    },
    {
      "name": "list_connected_accounts",
      "title": "List connected accounts",
      "description": "Read social profile capabilities and connection health without credentials.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 100,
            "description": "Limit."
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "default": 0,
            "description": "Offset."
          }
        },
        "required": [
          "team_id"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "accounts": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "integer",
                  "minimum": 1,
                  "description": "Id."
                },
                "provider": {
                  "type": "string",
                  "description": "Provider."
                },
                "handle": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Handle."
                },
                "username": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Username."
                },
                "active": {
                  "type": "boolean",
                  "description": "Active."
                },
                "healthy": {
                  "type": "boolean",
                  "description": "Healthy."
                },
                "can_read": {
                  "type": "boolean",
                  "description": "Can read."
                },
                "can_publish": {
                  "type": "boolean",
                  "description": "Can publish."
                },
                "allow_workspace_publishing": {
                  "type": "boolean",
                  "description": "Allow workspace publishing."
                }
              },
              "description": "Accounts item.",
              "required": [
                "id",
                "provider",
                "handle",
                "username",
                "active",
                "healthy",
                "can_read",
                "can_publish",
                "allow_workspace_publishing"
              ],
              "additionalProperties": false
            },
            "description": "Accounts."
          }
        },
        "required": [
          "accounts"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:read",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": true,
      "team_required": true,
      "docs": {
        "source": "SocialAccount and scheduling_state.account_problem",
        "permissions": "Current workspace member; per-account capabilities are returned.",
        "errors": "Requires current workspace membership. Unknown posts, media, accounts, and cross-workspace IDs return not found. Upload commit, rename, and delete recheck edit permission, approval confirmation, and the post version; invalid type, size, or title is rejected. Calls are limited to 120 per user per minute.",
        "retry": "Metadata reads and transfer-instruction requests are safe to retry, but transfer URLs still require the delegated bearer credential (the example is an instruction, not a token). After an ambiguous upload or mutation, list media and reload the post version before retrying; delete is not safe to repeat after success.",
        "example_arguments": {
          "team_id": 42,
          "limit": 100,
          "offset": 0
        },
        "example_result": {
          "accounts": [
            {
              "id": 271,
              "provider": "linkedin",
              "handle": "maya-chen",
              "username": "Maya Chen",
              "active": true,
              "healthy": true,
              "can_read": true,
              "can_publish": true,
              "allow_workspace_publishing": true
            }
          ]
        }
      }
    },
    {
      "name": "list_content_sources",
      "title": "List content sources",
      "description": "List recent workspace repurposing jobs.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 20,
            "description": "Limit."
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "default": 0,
            "description": "Offset."
          }
        },
        "required": [
          "team_id"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "sources": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 32,
                  "description": "Public content-source sqid."
                },
                "url": {
                  "type": "string",
                  "format": "uri",
                  "description": "Url."
                },
                "title": {
                  "type": "string",
                  "description": "Title."
                },
                "status": {
                  "enum": [
                    "pending",
                    "processing",
                    "completed",
                    "failed"
                  ],
                  "description": "Status."
                },
                "error": {
                  "type": "string",
                  "description": "Error."
                },
                "requested_post_count": {
                  "type": "integer",
                  "description": "Requested post count."
                },
                "created_at": {
                  "type": "string",
                  "description": "Created at."
                },
                "ideas": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "id": {
                        "type": "integer",
                        "minimum": 1,
                        "description": "Id."
                      },
                      "content": {
                        "type": "string",
                        "description": "Content."
                      },
                      "order": {
                        "type": "integer",
                        "minimum": 0,
                        "description": "Order."
                      },
                      "post_id": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Post id."
                      }
                    },
                    "required": [
                      "id",
                      "content",
                      "order",
                      "post_id"
                    ],
                    "additionalProperties": false,
                    "description": "Ideas item."
                  },
                  "description": "Ideas."
                }
              },
              "required": [
                "id",
                "url",
                "title",
                "status",
                "error",
                "requested_post_count",
                "created_at"
              ],
              "additionalProperties": false,
              "description": "Sources item."
            },
            "description": "Sources."
          },
          "has_more": {
            "type": "boolean",
            "description": "Has more."
          }
        },
        "required": [
          "sources",
          "has_more"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:read",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": true,
      "team_required": true,
      "docs": {
        "source": "services.repurposing.list_content_sources",
        "permissions": "Current workspace member.",
        "errors": "Requires current workspace membership; conversion also requires draft creation permission or an owned profile. Unknown and cross-workspace source/idea IDs return not found. Source creation accepts public HTTPS HTML only (1 MB maximum); fetch failures appear asynchronously in status=failed and error. AI usage is tracked and mcp:ai creation is limited to 30 calls per user per hour; no additional MCP AI quota is enforced.",
        "retry": "Reads are safe to retry and pending/processing sources should be polled with get_content_source. Before retrying source creation after an ambiguous response, list sources to avoid duplicate jobs. Idea conversion is atomic and returns the existing draft on retry; read state before retrying deletion.",
        "example_arguments": {
          "team_id": 42,
          "limit": 20,
          "offset": 0
        },
        "example_result": {
          "sources": [
            {
              "id": "S4n8Qp2L",
              "url": "https://example.com/research/customer-interviews",
              "title": "Customer interview research",
              "status": "processing",
              "error": "",
              "requested_post_count": 10,
              "created_at": "2026-10-01T14:05:00+00:00"
            },
            {
              "id": "S4n8Qp2L",
              "url": "https://example.com/research/customer-interviews",
              "title": "Customer interview research",
              "status": "completed",
              "error": "",
              "requested_post_count": 10,
              "created_at": "2026-10-01T14:05:00+00:00"
            }
          ],
          "has_more": false
        }
      }
    },
    {
      "name": "list_followup_comments",
      "title": "List follow-up comments",
      "description": "List comments that will be published as ordered follow-up content.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "post_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public post sqid."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 100,
            "description": "Limit."
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "default": 0,
            "description": "Offset."
          }
        },
        "required": [
          "team_id",
          "post_id"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "comments": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "integer",
                  "minimum": 1,
                  "description": "Id."
                },
                "description": {
                  "type": "string",
                  "description": "Description."
                },
                "order": {
                  "type": "integer",
                  "minimum": 0,
                  "description": "Order."
                }
              },
              "description": "Comments item.",
              "required": [
                "id",
                "description",
                "order"
              ],
              "additionalProperties": false
            },
            "description": "Comments."
          },
          "has_more": {
            "type": "boolean",
            "description": "Has more."
          }
        },
        "required": [
          "comments",
          "has_more"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:read",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": true,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.services.content; Comment is planned published follow-up content, not private collaboration",
        "permissions": "Current workspace member.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Request metadata (actor, connection, workspace, tool, outcome, duration, and correlation ID) is logged; arguments and results are not. Retry reads freely. Retry a mutation only when marked idempotent; otherwise read current state before deciding whether to repeat it.",
        "example_arguments": {
          "team_id": 42,
          "post_id": "P7k2Lm9Q",
          "limit": 20,
          "offset": 0
        },
        "example_result": {
          "comments": [
            {
              "id": 901,
              "description": "The checklist is linked in the first comment.",
              "order": 0
            }
          ],
          "has_more": false
        }
      }
    },
    {
      "name": "list_invitations",
      "title": "List invitations",
      "description": "List workspace invitations.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 100,
            "description": "Limit."
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "default": 0,
            "description": "Offset."
          }
        },
        "required": [
          "team_id"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "invitations": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Id."
                },
                "email": {
                  "type": "string",
                  "format": "email",
                  "description": "Email."
                },
                "role": {
                  "enum": [
                    "admin",
                    "member"
                  ],
                  "description": "Role."
                },
                "requires_linkedin": {
                  "type": "boolean",
                  "description": "Requires linkedin."
                },
                "can_create_drafts": {
                  "type": "boolean",
                  "description": "Can create drafts."
                },
                "can_publish": {
                  "type": "boolean",
                  "description": "Can publish."
                },
                "can_approve": {
                  "type": "boolean",
                  "description": "Can approve."
                },
                "accepted": {
                  "type": "boolean",
                  "description": "Accepted."
                }
              },
              "description": "Invitations item.",
              "required": [
                "id",
                "email",
                "role",
                "requires_linkedin",
                "can_create_drafts",
                "can_publish",
                "can_approve",
                "accepted"
              ],
              "additionalProperties": false
            },
            "description": "Invitations."
          },
          "has_more": {
            "type": "boolean",
            "description": "Has more."
          }
        },
        "required": [
          "invitations",
          "has_more"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:read",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": true,
      "team_required": true,
      "docs": {
        "source": "teams.views.api_views.InvitationViewSet",
        "permissions": "Workspace administrator.",
        "errors": "Workspace reads require current membership; workspace and invitation administration requires an administrator, while creation requires account-level mcp:teams. Invalid/duplicate slugs or pending emails are rejected; unknown or cross-workspace invitations return not found, and accepted invitations cannot be changed or cancelled. Calls are limited to 120 per user per minute.",
        "retry": "Reads are safe to retry. Before retrying workspace or invitation creation after an ambiguous response, list current workspaces or invitations. Updates may be retried after reading current state; never blindly repeat workspace deletion or invitation cancellation.",
        "example_arguments": {
          "team_id": 42,
          "limit": 100,
          "offset": 0
        },
        "example_result": {
          "invitations": [
            {
              "id": "018f3c96-0d74-7b2b-9e10-5ecbbcd82921",
              "email": "alex@example.com",
              "role": "member",
              "requires_linkedin": true,
              "can_create_drafts": true,
              "can_publish": false,
              "can_approve": false,
              "accepted": false
            }
          ],
          "has_more": false
        }
      }
    },
    {
      "name": "list_pending_invitations",
      "title": "List my pending invitations",
      "description": "List pending invitations matching the actor's verified or unverified emails.",
      "input_schema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 100,
            "description": "Limit."
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "default": 0,
            "description": "Offset."
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "invitations": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "description": "Id."
                },
                "team_name": {
                  "type": "string",
                  "description": "Team name."
                },
                "email": {
                  "type": "string",
                  "format": "email",
                  "description": "Email."
                },
                "verified": {
                  "type": "boolean",
                  "description": "Verified."
                }
              },
              "description": "Invitations item.",
              "required": [
                "id",
                "team_name",
                "email",
                "verified"
              ],
              "additionalProperties": false
            },
            "description": "Invitations."
          }
        },
        "required": [
          "invitations"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:read",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": true,
      "team_required": false,
      "docs": {
        "source": "teams.helpers.get_open_invitations_for_user",
        "permissions": "Authenticated actor only.",
        "errors": "Workspace reads require current membership; workspace and invitation administration requires an administrator, while creation requires account-level mcp:teams. Invalid/duplicate slugs or pending emails are rejected; unknown or cross-workspace invitations return not found, and accepted invitations cannot be changed or cancelled. Calls are limited to 120 per user per minute.",
        "retry": "Reads are safe to retry. Before retrying workspace or invitation creation after an ambiguous response, list current workspaces or invitations. Updates may be retried after reading current state; never blindly repeat workspace deletion or invitation cancellation.",
        "example_arguments": {
          "limit": 100,
          "offset": 0
        },
        "example_result": {
          "invitations": [
            {
              "id": "0190a7d2-aed8-70bc-a17c-22b629f73a1d",
              "team_name": "Signal Works",
              "email": "maya@example.com",
              "verified": true
            }
          ]
        }
      }
    },
    {
      "name": "list_post_ideas",
      "title": "List post ideas",
      "description": "Page generated ideas for a workspace source.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "source_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public content-source sqid."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 50,
            "default": 20,
            "description": "Limit."
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "default": 0,
            "description": "Offset."
          }
        },
        "required": [
          "team_id",
          "source_id"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "ideas": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "integer",
                  "minimum": 1,
                  "description": "Id."
                },
                "content": {
                  "type": "string",
                  "description": "Content."
                },
                "order": {
                  "type": "integer",
                  "minimum": 0,
                  "description": "Order."
                },
                "post_id": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Post id."
                }
              },
              "required": [
                "id",
                "content",
                "order",
                "post_id"
              ],
              "additionalProperties": false,
              "description": "Ideas item."
            },
            "description": "Ideas."
          },
          "has_more": {
            "type": "boolean",
            "description": "Has more."
          }
        },
        "required": [
          "ideas",
          "has_more"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:read",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": true,
      "team_required": true,
      "docs": {
        "source": "services.repurposing.get_content_source",
        "permissions": "Current workspace member.",
        "errors": "Requires current workspace membership; conversion also requires draft creation permission or an owned profile. Unknown and cross-workspace source/idea IDs return not found. Source creation accepts public HTTPS HTML only (1 MB maximum); fetch failures appear asynchronously in status=failed and error. AI usage is tracked and mcp:ai creation is limited to 30 calls per user per hour; no additional MCP AI quota is enforced.",
        "retry": "Reads are safe to retry and pending/processing sources should be polled with get_content_source. Before retrying source creation after an ambiguous response, list sources to avoid duplicate jobs. Idea conversion is atomic and returns the existing draft on retry; read state before retrying deletion.",
        "example_arguments": {
          "team_id": 42,
          "source_id": "S4n8Qp2L",
          "limit": 20,
          "offset": 0
        },
        "example_result": {
          "ideas": [
            {
              "id": 381,
              "content": "Ten customer interviews revealed that onboarding friction starts before the first login.",
              "order": 0,
              "post_id": null
            },
            {
              "id": 382,
              "content": "The best onboarding questions focus on the customer's last real attempt, not their ideal workflow.",
              "order": 1,
              "post_id": "R8m3Nk2V"
            }
          ],
          "has_more": false
        }
      }
    },
    {
      "name": "list_post_media",
      "title": "List post media",
      "description": "List attachment metadata; binary content is not embedded.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "post_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public post sqid."
          }
        },
        "required": [
          "team_id",
          "post_id"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "media": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "integer",
                  "minimum": 1,
                  "description": "Id."
                },
                "type": {
                  "type": "string",
                  "description": "Type."
                },
                "filename": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Filename."
                },
                "title": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Title."
                },
                "size": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "minimum": 0,
                  "description": "Size."
                },
                "pages": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "minimum": 0,
                  "description": "Pages."
                },
                "order": {
                  "type": "integer",
                  "description": "Order."
                }
              },
              "description": "Media item.",
              "required": [
                "id",
                "type",
                "filename",
                "title",
                "size",
                "pages",
                "order"
              ],
              "additionalProperties": false
            },
            "description": "Media."
          }
        },
        "required": [
          "media"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:read",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": true,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.api.media_list",
        "permissions": "Current workspace member.",
        "errors": "Requires current workspace membership. Unknown posts, media, accounts, and cross-workspace IDs return not found. Upload commit, rename, and delete recheck edit permission, approval confirmation, and the post version; invalid type, size, or title is rejected. Calls are limited to 120 per user per minute.",
        "retry": "Metadata reads and transfer-instruction requests are safe to retry, but transfer URLs still require the delegated bearer credential (the example is an instruction, not a token). After an ambiguous upload or mutation, list media and reload the post version before retrying; delete is not safe to repeat after success.",
        "example_arguments": {
          "team_id": 42,
          "post_id": "P7k2Lm9Q"
        },
        "example_result": {
          "media": [
            {
              "id": 615,
              "type": "document",
              "filename": "onboarding-checklist.pdf",
              "title": "The Customer Onboarding Checklist",
              "size": 842311,
              "pages": 8,
              "order": 0
            }
          ]
        }
      }
    },
    {
      "name": "list_posts",
      "title": "List posts",
      "description": "Search and page through workspace posts.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "query": {
            "type": "string",
            "maxLength": 200,
            "default": "",
            "description": "Query."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 50,
            "description": "Limit."
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "default": 0,
            "description": "Offset."
          }
        },
        "required": [
          "team_id"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "posts": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Id."
                },
                "description": {
                  "type": "string",
                  "description": "Description."
                },
                "version": {
                  "type": "integer",
                  "description": "Version."
                },
                "content_revision": {
                  "type": "integer",
                  "description": "Content revision."
                },
                "scheduled_on": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Scheduled on."
                },
                "timezone": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Timezone."
                },
                "schedule_active": {
                  "type": "boolean",
                  "description": "Schedule active."
                },
                "target_account_id": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "description": "Target account id."
                },
                "delivery": {
                  "type": "object",
                  "properties": {
                    "status": {
                      "type": "string",
                      "description": "Status."
                    },
                    "total": {
                      "type": "integer",
                      "description": "Total."
                    },
                    "published": {
                      "type": "integer",
                      "description": "Published."
                    },
                    "failed": {
                      "type": "integer",
                      "description": "Failed."
                    },
                    "pending": {
                      "type": "integer",
                      "description": "Pending."
                    },
                    "details": {
                      "type": "object",
                      "additionalProperties": {
                        "type": "integer"
                      },
                      "description": "Details.",
                      "properties": {},
                      "required": []
                    }
                  },
                  "required": [
                    "status",
                    "total"
                  ],
                  "description": "Delivery.",
                  "additionalProperties": false
                }
              },
              "description": "Posts item.",
              "required": [
                "id",
                "description",
                "version",
                "content_revision",
                "scheduled_on",
                "timezone",
                "schedule_active",
                "target_account_id",
                "delivery"
              ],
              "additionalProperties": false
            },
            "description": "Posts."
          },
          "has_more": {
            "type": "boolean",
            "description": "Has more."
          },
          "limit": {
            "type": "integer",
            "description": "Limit."
          },
          "offset": {
            "type": "integer",
            "description": "Offset."
          }
        },
        "required": [
          "posts",
          "has_more",
          "limit",
          "offset"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:read",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": true,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.Post",
        "permissions": "Current workspace member.",
        "errors": "Requires a current workspace membership. Unknown or cross-workspace posts return not found; draft permissions can deny writes. Content over 63,206 characters, stale versions, missing approval confirmation, active schedules, or started publication reject the applicable mutation. Calls are limited to 120 per user per minute.",
        "retry": "Reads are safe to retry. Before retrying create, search or list posts to avoid a duplicate draft. For update or delete, reload the post after an ambiguous response and use its current version; never blindly repeat a stale mutation.",
        "example_arguments": {
          "team_id": 42,
          "query": "onboarding",
          "limit": 50,
          "offset": 0
        },
        "example_result": {
          "posts": [
            {
              "id": "P7k2Lm9Q",
              "description": "Three onboarding lessons from ten customer interviews.",
              "version": 4,
              "content_revision": 3,
              "scheduled_on": "2026-10-08T13:30:00+00:00",
              "timezone": "America/New_York",
              "schedule_active": true,
              "target_account_id": 271,
              "delivery": {
                "status": "pending",
                "total": 1,
                "published": 0,
                "failed": 0,
                "pending": 1,
                "details": {
                  "pending": 1
                }
              }
            }
          ],
          "has_more": false,
          "limit": 50,
          "offset": 0
        }
      }
    },
    {
      "name": "list_workspaces",
      "title": "List workspaces",
      "description": "List consented workspaces where membership remains active.",
      "input_schema": {
        "type": "object",
        "properties": {
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "default": 100,
            "description": "Limit."
          },
          "offset": {
            "type": "integer",
            "minimum": 0,
            "default": 0,
            "description": "Offset."
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "workspaces": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "integer",
                  "description": "Id."
                },
                "name": {
                  "type": "string",
                  "description": "Name."
                },
                "slug": {
                  "type": "string",
                  "description": "Slug."
                },
                "role": {
                  "enum": [
                    "admin",
                    "member"
                  ],
                  "description": "Role."
                }
              },
              "description": "Workspaces item.",
              "required": [
                "id",
                "name",
                "slug",
                "role"
              ],
              "additionalProperties": false
            },
            "description": "Workspaces."
          },
          "limit": {
            "type": "integer",
            "description": "Limit."
          },
          "offset": {
            "type": "integer",
            "description": "Offset."
          }
        },
        "required": [
          "workspaces",
          "limit",
          "offset"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:read",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": true,
      "team_required": false,
      "docs": {
        "source": "Connection.teams and teams.invitations.personal_connection_required",
        "permissions": "Current membership and personal connection requirement.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Request metadata (actor, connection, workspace, tool, outcome, duration, and correlation ID) is logged; arguments and results are not. Retry reads freely. Retry a mutation only when marked idempotent; otherwise read current state before deciding whether to repeat it.",
        "example_arguments": {
          "limit": 25,
          "offset": 0
        },
        "example_result": {
          "workspaces": [
            {
              "id": 42,
              "name": "Northstar Studio",
              "slug": "northstar-studio",
              "role": "admin"
            }
          ],
          "limit": 25,
          "offset": 0
        }
      }
    },
    {
      "name": "prepare_cv_generation",
      "title": "Prepare CV generation",
      "description": "Validate CV metadata and return truthful instructions for one read-only PDF upload that generates headlines or bios.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "filename": {
            "type": "string",
            "minLength": 5,
            "maxLength": 255,
            "description": "Filename."
          },
          "content_type": {
            "const": "application/pdf",
            "description": "Content type."
          },
          "size": {
            "type": "integer",
            "minimum": 1,
            "maximum": 2097152,
            "description": "Size."
          },
          "operation": {
            "enum": [
              "headline",
              "bio"
            ],
            "description": "Operation."
          }
        },
        "required": [
          "team_id",
          "filename",
          "content_type",
          "size",
          "operation"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "method": {
            "const": "POST",
            "description": "Method."
          },
          "url": {
            "type": "string",
            "description": "Url."
          },
          "file_field": {
            "const": "cv_file",
            "description": "File field."
          },
          "operation_field": {
            "type": "string",
            "description": "Operation field."
          },
          "headers": {
            "type": "object",
            "properties": {
              "Authorization": {
                "type": "string",
                "description": "Authorization."
              }
            },
            "description": "Headers.",
            "required": [
              "Authorization"
            ],
            "additionalProperties": false
          },
          "max_size": {
            "const": 2097152,
            "description": "Max size."
          },
          "result": {
            "type": "string",
            "description": "Result."
          }
        },
        "required": [
          "method",
          "url",
          "file_field",
          "operation_field",
          "headers",
          "max_size",
          "result"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:ai",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": true,
      "team_required": true,
      "docs": {
        "source": "companion /mcp/transfers/cv endpoint; free_tools.generators.services",
        "permissions": "Current member; mcp:ai scope, 2 MiB PDF limit, AI quota, and shared MCP AI rate limit apply.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Request metadata (actor, connection, workspace, tool, outcome, duration, and correlation ID) is logged; arguments and results are not. Retry reads freely. Retry a mutation only when marked idempotent; otherwise read current state before deciding whether to repeat it.",
        "example_arguments": {
          "team_id": 42,
          "filename": "maya-chen-cv.pdf",
          "content_type": "application/pdf",
          "size": 483217,
          "operation": "headline"
        },
        "example_result": {
          "method": "POST",
          "url": "/mcp/transfers/cv/42/",
          "file_field": "cv_file",
          "operation_field": "operation=headline",
          "headers": {
            "Authorization": "Bearer <delegated access token>"
          },
          "max_size": 2097152,
          "result": "Generates LinkedIn headline suggestions; it does not modify or publish content."
        }
      }
    },
    {
      "name": "preview_queue_assign",
      "title": "Preview queue assign",
      "description": "Preview the exact queue assign mutation without committing it.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "postId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public post sqid."
          },
          "accountId": {
            "type": "integer",
            "minimum": 1,
            "description": "Account id."
          },
          "startsAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Startsat."
          },
          "emptyTeam": {
            "type": "boolean",
            "default": false,
            "description": "Emptyteam."
          }
        },
        "required": [
          "team_id",
          "postId",
          "accountId"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "description": "Token."
          },
          "changes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "postId": {
                  "type": "string",
                  "description": "Post id."
                },
                "account": {
                  "type": "string",
                  "description": "Account."
                },
                "description": {
                  "type": "string",
                  "description": "Description."
                },
                "before": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Before."
                },
                "after": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "After."
                },
                "queued": {
                  "type": "boolean",
                  "description": "Queued."
                }
              },
              "description": "Changes item.",
              "required": [
                "postId",
                "account",
                "description",
                "before",
                "after",
                "queued"
              ],
              "additionalProperties": false
            },
            "description": "Changes."
          },
          "action": {
            "type": "object",
            "properties": {
              "kind": {
                "const": "assign",
                "description": "Kind."
              },
              "postId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 32,
                "description": "Public post sqid."
              },
              "accountId": {
                "type": "integer",
                "minimum": 1,
                "description": "Account id."
              },
              "startsAt": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time",
                "description": "Startsat."
              },
              "emptyTeam": {
                "type": "boolean",
                "default": false,
                "description": "Emptyteam."
              }
            },
            "required": [
              "kind",
              "postId",
              "accountId"
            ],
            "description": "Action.",
            "additionalProperties": false
          }
        },
        "required": [
          "token",
          "changes",
          "action"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:read",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.services.team_queue.queue_command",
        "permissions": "Operation-specific admin or publishing checks run during preview.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Preview is read-only and may be retried. It rolls back all writes; reuse the actual returned token only with the matching apply call within 15 minutes. Preview rechecks administrator or account publishing permission.",
        "example_arguments": {
          "team_id": 42,
          "postId": "R8m3Kn2W",
          "accountId": 272,
          "startsAt": null,
          "emptyTeam": false
        },
        "example_result": {
          "token": "opaque-token-from-preview",
          "changes": [],
          "action": {
            "kind": "assign",
            "postId": "R8m3Kn2W",
            "accountId": 272,
            "startsAt": null,
            "emptyTeam": false
          }
        }
      }
    },
    {
      "name": "preview_queue_enqueue",
      "title": "Preview queue enqueue",
      "description": "Preview the exact queue enqueue mutation without committing it.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "postId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public post sqid."
          },
          "accountId": {
            "type": "integer",
            "minimum": 1,
            "description": "Account id."
          },
          "startsAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Startsat."
          }
        },
        "required": [
          "team_id",
          "postId",
          "accountId"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "description": "Token."
          },
          "changes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "postId": {
                  "type": "string",
                  "description": "Post id."
                },
                "account": {
                  "type": "string",
                  "description": "Account."
                },
                "description": {
                  "type": "string",
                  "description": "Description."
                },
                "before": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Before."
                },
                "after": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "After."
                },
                "queued": {
                  "type": "boolean",
                  "description": "Queued."
                }
              },
              "description": "Changes item.",
              "required": [
                "postId",
                "account",
                "description",
                "before",
                "after",
                "queued"
              ],
              "additionalProperties": false
            },
            "description": "Changes."
          },
          "action": {
            "type": "object",
            "properties": {
              "kind": {
                "const": "enqueue",
                "description": "Kind."
              },
              "postId": {
                "type": "string",
                "minLength": 1,
                "maxLength": 32,
                "description": "Public post sqid."
              },
              "accountId": {
                "type": "integer",
                "minimum": 1,
                "description": "Account id."
              },
              "startsAt": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date-time",
                "description": "Startsat."
              }
            },
            "required": [
              "kind",
              "postId",
              "accountId"
            ],
            "description": "Action.",
            "additionalProperties": false
          }
        },
        "required": [
          "token",
          "changes",
          "action"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:read",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.services.team_queue.queue_command",
        "permissions": "Operation-specific admin or publishing checks run during preview.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Preview is read-only and may be retried. It rolls back all writes; reuse the actual returned token only with the matching apply call within 15 minutes. Preview rechecks administrator or account publishing permission.",
        "example_arguments": {
          "team_id": 42,
          "postId": "P7k2Lm9Q",
          "accountId": 271,
          "startsAt": null
        },
        "example_result": {
          "token": "opaque-token-from-preview",
          "changes": [],
          "action": {
            "kind": "enqueue",
            "postId": "P7k2Lm9Q",
            "accountId": 271,
            "startsAt": null
          }
        }
      }
    },
    {
      "name": "preview_queue_occurrence",
      "title": "Preview queue occurrence",
      "description": "Preview the exact queue occurrence mutation without committing it.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "occurrenceId": {
            "type": "integer",
            "minimum": 1,
            "description": "Occurrence id."
          },
          "mode": {
            "enum": [
              "together",
              "staggered"
            ],
            "description": "Mode."
          },
          "gap": {
            "type": "integer",
            "minimum": 1,
            "maximum": 1440,
            "description": "Gap."
          },
          "order": {
            "type": "array",
            "items": {
              "type": "integer",
              "minimum": 1,
              "description": "Order item."
            },
            "maxItems": 100,
            "description": "Order."
          }
        },
        "required": [
          "team_id",
          "occurrenceId",
          "mode",
          "gap",
          "order"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "description": "Token."
          },
          "changes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "postId": {
                  "type": "string",
                  "description": "Post id."
                },
                "account": {
                  "type": "string",
                  "description": "Account."
                },
                "description": {
                  "type": "string",
                  "description": "Description."
                },
                "before": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Before."
                },
                "after": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "After."
                },
                "queued": {
                  "type": "boolean",
                  "description": "Queued."
                }
              },
              "description": "Changes item.",
              "required": [
                "postId",
                "account",
                "description",
                "before",
                "after",
                "queued"
              ],
              "additionalProperties": false
            },
            "description": "Changes."
          },
          "action": {
            "type": "object",
            "properties": {
              "kind": {
                "const": "occurrence",
                "description": "Kind."
              },
              "occurrenceId": {
                "type": "integer",
                "minimum": 1,
                "description": "Occurrence id."
              },
              "mode": {
                "enum": [
                  "together",
                  "staggered"
                ],
                "description": "Mode."
              },
              "gap": {
                "type": "integer",
                "minimum": 1,
                "maximum": 1440,
                "description": "Gap."
              },
              "order": {
                "type": "array",
                "items": {
                  "type": "integer",
                  "minimum": 1,
                  "description": "Order item."
                },
                "maxItems": 100,
                "description": "Order."
              }
            },
            "required": [
              "kind",
              "occurrenceId",
              "mode",
              "gap",
              "order"
            ],
            "description": "Action.",
            "additionalProperties": false
          }
        },
        "required": [
          "token",
          "changes",
          "action"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:read",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.services.team_queue.queue_command",
        "permissions": "Operation-specific admin or publishing checks run during preview.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Preview is read-only and may be retried. It rolls back all writes; reuse the actual returned token only with the matching apply call within 15 minutes. Preview rechecks administrator or account publishing permission.",
        "example_arguments": {
          "team_id": 42,
          "occurrenceId": 73,
          "mode": "staggered",
          "gap": 10,
          "order": [
            884,
            885
          ]
        },
        "example_result": {
          "token": "opaque-token-from-preview",
          "changes": [],
          "action": {
            "kind": "occurrence",
            "occurrenceId": 73,
            "mode": "staggered",
            "gap": 10,
            "order": [
              884,
              885
            ]
          }
        }
      }
    },
    {
      "name": "preview_queue_remove",
      "title": "Preview queue remove",
      "description": "Preview the exact queue remove mutation without committing it.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "entryId": {
            "type": "integer",
            "minimum": 1,
            "description": "Entry id."
          }
        },
        "required": [
          "team_id",
          "entryId"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "description": "Token."
          },
          "changes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "postId": {
                  "type": "string",
                  "description": "Post id."
                },
                "account": {
                  "type": "string",
                  "description": "Account."
                },
                "description": {
                  "type": "string",
                  "description": "Description."
                },
                "before": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Before."
                },
                "after": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "After."
                },
                "queued": {
                  "type": "boolean",
                  "description": "Queued."
                }
              },
              "description": "Changes item.",
              "required": [
                "postId",
                "account",
                "description",
                "before",
                "after",
                "queued"
              ],
              "additionalProperties": false
            },
            "description": "Changes."
          },
          "action": {
            "type": "object",
            "properties": {
              "kind": {
                "const": "remove",
                "description": "Kind."
              },
              "entryId": {
                "type": "integer",
                "minimum": 1,
                "description": "Entry id."
              }
            },
            "required": [
              "kind",
              "entryId"
            ],
            "description": "Action.",
            "additionalProperties": false
          }
        },
        "required": [
          "token",
          "changes",
          "action"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:read",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.services.team_queue.queue_command",
        "permissions": "Operation-specific admin or publishing checks run during preview.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Preview is read-only and may be retried. It rolls back all writes; reuse the actual returned token only with the matching apply call within 15 minutes. Preview rechecks administrator or account publishing permission.",
        "example_arguments": {
          "team_id": 42,
          "entryId": 884
        },
        "example_result": {
          "token": "opaque-token-from-preview",
          "changes": [],
          "action": {
            "kind": "remove",
            "entryId": 884
          }
        }
      }
    },
    {
      "name": "preview_queue_reorder",
      "title": "Preview queue reorder",
      "description": "Preview the exact queue reorder mutation without committing it.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "entryId": {
            "type": "integer",
            "minimum": 1,
            "description": "Entry id."
          },
          "position": {
            "type": "integer",
            "minimum": 1,
            "description": "Position."
          }
        },
        "required": [
          "team_id",
          "entryId",
          "position"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "description": "Token."
          },
          "changes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "postId": {
                  "type": "string",
                  "description": "Post id."
                },
                "account": {
                  "type": "string",
                  "description": "Account."
                },
                "description": {
                  "type": "string",
                  "description": "Description."
                },
                "before": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Before."
                },
                "after": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "After."
                },
                "queued": {
                  "type": "boolean",
                  "description": "Queued."
                }
              },
              "description": "Changes item.",
              "required": [
                "postId",
                "account",
                "description",
                "before",
                "after",
                "queued"
              ],
              "additionalProperties": false
            },
            "description": "Changes."
          },
          "action": {
            "type": "object",
            "properties": {
              "kind": {
                "const": "reorder",
                "description": "Kind."
              },
              "entryId": {
                "type": "integer",
                "minimum": 1,
                "description": "Entry id."
              },
              "position": {
                "type": "integer",
                "minimum": 1,
                "description": "Position."
              }
            },
            "required": [
              "kind",
              "entryId",
              "position"
            ],
            "description": "Action.",
            "additionalProperties": false
          }
        },
        "required": [
          "token",
          "changes",
          "action"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:read",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.services.team_queue.queue_command",
        "permissions": "Operation-specific admin or publishing checks run during preview.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Preview is read-only and may be retried. It rolls back all writes; reuse the actual returned token only with the matching apply call within 15 minutes. Preview rechecks administrator or account publishing permission.",
        "example_arguments": {
          "team_id": 42,
          "entryId": 885,
          "position": 1
        },
        "example_result": {
          "token": "opaque-token-from-preview",
          "changes": [],
          "action": {
            "kind": "reorder",
            "entryId": 885,
            "position": 1
          }
        }
      }
    },
    {
      "name": "preview_queue_rule",
      "title": "Preview queue rule",
      "description": "Preview the exact queue rule mutation without committing it.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "ruleId": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1,
            "description": "Rule id."
          },
          "weekday": {
            "type": "integer",
            "minimum": 0,
            "maximum": 6,
            "description": "Weekday."
          },
          "time": {
            "type": "string",
            "pattern": "^[0-2][0-9]:[0-5][0-9]$",
            "description": "Time."
          },
          "delete": {
            "type": "boolean",
            "default": false,
            "description": "Delete."
          },
          "policy": {
            "enum": [
              "keep",
              "reflow"
            ],
            "description": "Policy."
          }
        },
        "required": [
          "team_id",
          "weekday",
          "time",
          "policy"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "description": "Token."
          },
          "changes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "postId": {
                  "type": "string",
                  "description": "Post id."
                },
                "account": {
                  "type": "string",
                  "description": "Account."
                },
                "description": {
                  "type": "string",
                  "description": "Description."
                },
                "before": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Before."
                },
                "after": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "After."
                },
                "queued": {
                  "type": "boolean",
                  "description": "Queued."
                }
              },
              "description": "Changes item.",
              "required": [
                "postId",
                "account",
                "description",
                "before",
                "after",
                "queued"
              ],
              "additionalProperties": false
            },
            "description": "Changes."
          },
          "action": {
            "type": "object",
            "properties": {
              "kind": {
                "const": "rule",
                "description": "Kind."
              },
              "ruleId": {
                "type": [
                  "integer",
                  "null"
                ],
                "minimum": 1,
                "description": "Rule id."
              },
              "weekday": {
                "type": "integer",
                "minimum": 0,
                "maximum": 6,
                "description": "Weekday."
              },
              "time": {
                "type": "string",
                "pattern": "^[0-2][0-9]:[0-5][0-9]$",
                "description": "Time."
              },
              "delete": {
                "type": "boolean",
                "default": false,
                "description": "Delete."
              },
              "policy": {
                "enum": [
                  "keep",
                  "reflow"
                ],
                "description": "Policy."
              }
            },
            "required": [
              "kind",
              "weekday",
              "time",
              "policy"
            ],
            "description": "Action.",
            "additionalProperties": false
          }
        },
        "required": [
          "token",
          "changes",
          "action"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:read",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.services.team_queue.queue_command",
        "permissions": "Operation-specific admin or publishing checks run during preview.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Preview is read-only and may be retried. It rolls back all writes; reuse the actual returned token only with the matching apply call within 15 minutes. Preview rechecks administrator or account publishing permission.",
        "example_arguments": {
          "team_id": 42,
          "ruleId": null,
          "weekday": 2,
          "time": "09:30",
          "delete": false,
          "policy": "reflow"
        },
        "example_result": {
          "token": "opaque-token-from-preview",
          "changes": [],
          "action": {
            "kind": "rule",
            "ruleId": null,
            "weekday": 2,
            "time": "09:30",
            "delete": false,
            "policy": "reflow"
          }
        }
      }
    },
    {
      "name": "preview_queue_timezone",
      "title": "Preview queue timezone",
      "description": "Preview the exact queue timezone mutation without committing it.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "timezone": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100,
            "description": "Timezone."
          },
          "policy": {
            "enum": [
              "keep",
              "reflow"
            ],
            "description": "Policy."
          }
        },
        "required": [
          "team_id",
          "timezone",
          "policy"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "token": {
            "type": "string",
            "description": "Token."
          },
          "changes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "postId": {
                  "type": "string",
                  "description": "Post id."
                },
                "account": {
                  "type": "string",
                  "description": "Account."
                },
                "description": {
                  "type": "string",
                  "description": "Description."
                },
                "before": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Before."
                },
                "after": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "After."
                },
                "queued": {
                  "type": "boolean",
                  "description": "Queued."
                }
              },
              "description": "Changes item.",
              "required": [
                "postId",
                "account",
                "description",
                "before",
                "after",
                "queued"
              ],
              "additionalProperties": false
            },
            "description": "Changes."
          },
          "action": {
            "type": "object",
            "properties": {
              "kind": {
                "const": "timezone",
                "description": "Kind."
              },
              "timezone": {
                "type": "string",
                "minLength": 1,
                "maxLength": 100,
                "description": "Timezone."
              },
              "policy": {
                "enum": [
                  "keep",
                  "reflow"
                ],
                "description": "Policy."
              }
            },
            "required": [
              "kind",
              "timezone",
              "policy"
            ],
            "description": "Action.",
            "additionalProperties": false
          }
        },
        "required": [
          "token",
          "changes",
          "action"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:read",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.services.team_queue.queue_command",
        "permissions": "Operation-specific admin or publishing checks run during preview.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Preview is read-only and may be retried. It rolls back all writes; reuse the actual returned token only with the matching apply call within 15 minutes. Preview rechecks administrator or account publishing permission.",
        "example_arguments": {
          "team_id": 42,
          "timezone": "Europe/Brussels",
          "policy": "reflow"
        },
        "example_result": {
          "token": "opaque-token-from-preview",
          "changes": [],
          "action": {
            "kind": "timezone",
            "timezone": "Europe/Brussels",
            "policy": "reflow"
          }
        }
      }
    },
    {
      "name": "publish_post",
      "title": "Publish post now",
      "description": "Authorize immediate publication; worker delivery remains asynchronous.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "post_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public post sqid."
          },
          "expected_version": {
            "type": "integer",
            "minimum": 1,
            "description": "Last-read post concurrency version."
          },
          "account_id": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1,
            "description": "Account id."
          }
        },
        "required": [
          "team_id",
          "post_id",
          "expected_version"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "post_id": {
            "type": "string",
            "description": "Post id."
          },
          "queued_for_publication": {
            "const": true,
            "description": "Queued for publication."
          },
          "version": {
            "type": "integer",
            "description": "Version."
          }
        },
        "required": [
          "post_id",
          "queued_for_publication",
          "version"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:publish",
      "read_only": false,
      "destructive": true,
      "open_world": true,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "services.scheduling.publish_post",
        "permissions": "Publishing access, valid target/approval and publication eligibility.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Request metadata (actor, connection, workspace, tool, outcome, duration, and correlation ID) is logged; arguments and results are not. Retry reads freely. Retry a mutation only when marked idempotent; otherwise read current state before deciding whether to repeat it.",
        "example_arguments": {
          "team_id": 42,
          "post_id": "P7k2Lm9Q",
          "expected_version": 6,
          "account_id": 271
        },
        "example_result": {
          "post_id": "P7k2Lm9Q",
          "queued_for_publication": true,
          "version": 7
        }
      }
    },
    {
      "name": "rename_document",
      "title": "Rename document",
      "description": "Change the LinkedIn document title with content concurrency guards.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "post_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public post sqid."
          },
          "media_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Media id."
          },
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "description": "Title."
          },
          "expected_version": {
            "type": "integer",
            "minimum": 1,
            "description": "Last-read post concurrency version."
          },
          "confirmed_revision": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1,
            "description": "Confirmed revision."
          }
        },
        "required": [
          "team_id",
          "post_id",
          "media_id",
          "title",
          "expected_version"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "media": {
            "type": "object",
            "properties": {
              "id": {
                "type": "integer",
                "minimum": 1,
                "description": "Id."
              },
              "type": {
                "type": "string",
                "description": "Type."
              },
              "filename": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Filename."
              },
              "title": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Title."
              },
              "size": {
                "type": [
                  "integer",
                  "null"
                ],
                "minimum": 0,
                "description": "Size."
              },
              "pages": {
                "type": [
                  "integer",
                  "null"
                ],
                "minimum": 0,
                "description": "Pages."
              },
              "order": {
                "type": "integer",
                "description": "Order."
              }
            },
            "description": "Media.",
            "required": [
              "id",
              "type",
              "filename",
              "title",
              "size",
              "pages",
              "order"
            ],
            "additionalProperties": false
          },
          "version": {
            "type": "integer",
            "description": "Version."
          },
          "content_revision": {
            "type": "integer",
            "description": "Content revision."
          }
        },
        "required": [
          "media",
          "version",
          "content_revision"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:content",
      "read_only": false,
      "destructive": true,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.api.media_title and content services",
        "permissions": "Post edit authority and approval/version guards.",
        "errors": "Requires current workspace membership. Unknown posts, media, accounts, and cross-workspace IDs return not found. Upload commit, rename, and delete recheck edit permission, approval confirmation, and the post version; invalid type, size, or title is rejected. Calls are limited to 120 per user per minute.",
        "retry": "Metadata reads and transfer-instruction requests are safe to retry, but transfer URLs still require the delegated bearer credential (the example is an instruction, not a token). After an ambiguous upload or mutation, list media and reload the post version before retrying; delete is not safe to repeat after success.",
        "example_arguments": {
          "team_id": 42,
          "post_id": "P7k2Lm9Q",
          "media_id": 615,
          "title": "Customer Onboarding Field Guide",
          "expected_version": 5,
          "confirmed_revision": 4
        },
        "example_result": {
          "media": {
            "id": 615,
            "type": "document",
            "filename": "onboarding-checklist.pdf",
            "title": "Customer Onboarding Field Guide",
            "size": 842311,
            "pages": 8,
            "order": 0
          },
          "version": 6,
          "content_revision": 5
        }
      }
    },
    {
      "name": "request_audio_transcription",
      "title": "Request audio transcription",
      "description": "Describe the bounded companion audio transfer needed for tracked transcription.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "filename": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "description": "Filename."
          },
          "content_type": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100,
            "description": "Content type."
          },
          "size": {
            "type": "integer",
            "minimum": 1,
            "maximum": 10485760,
            "description": "Size."
          }
        },
        "required": [
          "team_id",
          "filename",
          "content_type",
          "size"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "method": {
            "const": "POST",
            "description": "Method."
          },
          "url": {
            "type": "string",
            "description": "Url."
          },
          "form_field": {
            "const": "audio_file",
            "description": "Form field."
          },
          "headers": {
            "type": "object",
            "properties": {
              "Authorization": {
                "type": "string",
                "description": "Authorization."
              }
            },
            "description": "Headers.",
            "required": [
              "Authorization"
            ],
            "additionalProperties": false
          },
          "action_field": {
            "type": "string",
            "description": "Action field."
          },
          "max_size": {
            "const": 10485760,
            "description": "Max size."
          },
          "concurrency": {
            "type": "string",
            "description": "Concurrency."
          }
        },
        "required": [
          "method",
          "url",
          "form_field",
          "headers",
          "action_field",
          "max_size",
          "concurrency"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:ai",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": true,
      "team_required": true,
      "docs": {
        "source": "ai.transcription.transcribe_audio; companion transfer owned by runtime",
        "permissions": "Current member; 10 MiB limit and AI quota apply on transfer.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Request metadata (actor, connection, workspace, tool, outcome, duration, and correlation ID) is logged; arguments and results are not. Retry reads freely. Retry a mutation only when marked idempotent; otherwise read current state before deciding whether to repeat it.",
        "example_arguments": {
          "team_id": 42,
          "filename": "customer-notes.m4a",
          "content_type": "audio/mp4",
          "size": 1843200
        },
        "example_result": {
          "method": "POST",
          "url": "/mcp/transfers/audio/42/",
          "form_field": "audio_file",
          "headers": {
            "Authorization": "Bearer"
          },
          "action_field": "action=transcribe or transcribe_and_generate",
          "max_size": 10485760,
          "concurrency": "Transcription has no post mutation. Generated drafts are created only after permission recheck."
        }
      }
    },
    {
      "name": "request_media_download",
      "title": "Request media download",
      "description": "Describe the required authenticated bounded companion download.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "post_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public post sqid."
          },
          "media_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Media id."
          }
        },
        "required": [
          "team_id",
          "post_id",
          "media_id"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "method": {
            "const": "GET",
            "description": "Method."
          },
          "url": {
            "type": "string",
            "description": "Url."
          },
          "headers": {
            "type": "object",
            "properties": {
              "Authorization": {
                "const": "Bearer",
                "description": "Authorization."
              }
            },
            "description": "Headers.",
            "required": [
              "Authorization"
            ],
            "additionalProperties": false
          },
          "filename": {
            "type": "string",
            "description": "Filename."
          },
          "concurrency": {
            "type": "string",
            "description": "Concurrency."
          }
        },
        "required": [
          "method",
          "url",
          "headers",
          "filename",
          "concurrency"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:read",
      "read_only": true,
      "destructive": false,
      "open_world": false,
      "idempotent": true,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.api.media_file; companion transfer owned by runtime",
        "permissions": "Current workspace member.",
        "errors": "Requires current workspace membership. Unknown posts, media, accounts, and cross-workspace IDs return not found. Upload commit, rename, and delete recheck edit permission, approval confirmation, and the post version; invalid type, size, or title is rejected. Calls are limited to 120 per user per minute.",
        "retry": "Metadata reads and transfer-instruction requests are safe to retry, but transfer URLs still require the delegated bearer credential (the example is an instruction, not a token). After an ambiguous upload or mutation, list media and reload the post version before retrying; delete is not safe to repeat after success.",
        "example_arguments": {
          "team_id": 42,
          "post_id": "P7k2Lm9Q",
          "media_id": 615
        },
        "example_result": {
          "method": "GET",
          "url": "/mcp/transfers/media/42/P7k2Lm9Q/615/",
          "headers": {
            "Authorization": "Bearer"
          },
          "filename": "onboarding-checklist.pdf",
          "concurrency": "The endpoint rechecks the delegated workspace membership on every download."
        }
      }
    },
    {
      "name": "request_media_upload",
      "title": "Request media upload",
      "description": "Describe the required bounded companion transfer for an attachment.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "post_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public post sqid."
          },
          "filename": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255,
            "description": "Filename."
          },
          "content_type": {
            "enum": [
              "image/jpeg",
              "image/png",
              "image/gif",
              "image/webp",
              "video/mp4",
              "application/pdf"
            ],
            "description": "Content type."
          },
          "size": {
            "type": "integer",
            "minimum": 1,
            "maximum": 104857600,
            "description": "Size."
          },
          "expected_version": {
            "type": "integer",
            "minimum": 1,
            "description": "Last-read post concurrency version."
          },
          "confirmed_revision": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1,
            "description": "Confirmed revision."
          }
        },
        "required": [
          "team_id",
          "post_id",
          "filename",
          "content_type",
          "size",
          "expected_version"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "method": {
            "const": "POST",
            "description": "Method."
          },
          "url": {
            "type": "string",
            "description": "Url."
          },
          "form_field": {
            "const": "media_files",
            "description": "Form field."
          },
          "headers": {
            "type": "object",
            "properties": {
              "Authorization": {
                "const": "Bearer",
                "description": "Authorization."
              }
            },
            "description": "Headers.",
            "required": [
              "Authorization"
            ],
            "additionalProperties": false
          },
          "form_values": {
            "type": "object",
            "properties": {
              "expected_version": {
                "type": "string",
                "pattern": "^[1-9][0-9]*$",
                "description": "Expected version."
              },
              "confirmed_revision": {
                "type": "string",
                "pattern": "^$|^[1-9][0-9]*$",
                "description": "Confirmed revision."
              }
            },
            "description": "Form values.",
            "required": [
              "expected_version",
              "confirmed_revision"
            ],
            "additionalProperties": false
          },
          "max_request_size": {
            "const": 104857600,
            "description": "Max request size."
          },
          "concurrency": {
            "type": "string",
            "description": "Concurrency."
          }
        },
        "required": [
          "method",
          "url",
          "form_field",
          "headers",
          "form_values",
          "max_request_size",
          "concurrency"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:content",
      "read_only": false,
      "destructive": false,
      "open_world": false,
      "idempotent": true,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.api.media_upload; companion transfer owned by runtime",
        "permissions": "Post edit authority is rechecked when transfer is committed.",
        "errors": "Requires current workspace membership. Unknown posts, media, accounts, and cross-workspace IDs return not found. Upload commit, rename, and delete recheck edit permission, approval confirmation, and the post version; invalid type, size, or title is rejected. Calls are limited to 120 per user per minute.",
        "retry": "Metadata reads and transfer-instruction requests are safe to retry, but transfer URLs still require the delegated bearer credential (the example is an instruction, not a token). After an ambiguous upload or mutation, list media and reload the post version before retrying; delete is not safe to repeat after success.",
        "example_arguments": {
          "team_id": 42,
          "post_id": "P7k2Lm9Q",
          "filename": "onboarding-checklist.pdf",
          "content_type": "application/pdf",
          "size": 842311,
          "expected_version": 4,
          "confirmed_revision": 3
        },
        "example_result": {
          "method": "POST",
          "url": "/mcp/transfers/media/42/P7k2Lm9Q/",
          "form_field": "media_files",
          "headers": {
            "Authorization": "Bearer"
          },
          "form_values": {
            "expected_version": "4",
            "confirmed_revision": "3"
          },
          "max_request_size": 104857600,
          "concurrency": "The endpoint rechecks membership, edit permission, version, and approval confirmation."
        }
      }
    },
    {
      "name": "retry_video_preparation",
      "title": "Retry video preparation",
      "description": "Reset failed pending LinkedIn video deliveries and enqueue preparation again.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "post_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public post sqid."
          },
          "expected_version": {
            "type": "integer",
            "minimum": 1,
            "description": "Last-read post concurrency version."
          }
        },
        "required": [
          "team_id",
          "post_id",
          "expected_version"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "post_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public post sqid."
          },
          "retry_count": {
            "type": "integer",
            "minimum": 0,
            "description": "Retry count."
          },
          "media_state": {
            "enum": [
              "preparing",
              "unchanged"
            ],
            "description": "Media state."
          },
          "version": {
            "type": "integer",
            "minimum": 1,
            "description": "Version."
          }
        },
        "required": [
          "post_id",
          "retry_count",
          "media_state",
          "version"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:publish",
      "read_only": false,
      "destructive": false,
      "open_world": true,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "services.video_retry.retry_video_preparation",
        "permissions": "Current member with publishing access, active non-missed schedule, valid approval, and valid media.",
        "errors": "Stale versions, active publication, invalid media, missing approval, inactive schedule, or missing publishing access fail without resetting deliveries.",
        "retry": "Read the post again before retrying. A successful call with zero retries means no failed eligible LinkedIn delivery existed.",
        "example_arguments": {
          "team_id": 1,
          "post_id": "Ab3dE9xQ",
          "expected_version": 3
        },
        "example_result": {
          "post_id": "Ab3dE9xQ",
          "retry_count": 1,
          "media_state": "preparing",
          "version": 3
        }
      }
    },
    {
      "name": "schedule_post",
      "title": "Schedule post",
      "description": "Schedule or reschedule using the actor's timezone.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "post_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public post sqid."
          },
          "scheduled_on": {
            "type": "string",
            "description": "Actor-local naive ISO datetime."
          },
          "expected_version": {
            "type": "integer",
            "minimum": 1,
            "description": "Last-read post concurrency version."
          },
          "account_id": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1,
            "description": "Account id."
          }
        },
        "required": [
          "team_id",
          "post_id",
          "scheduled_on",
          "expected_version"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "post_id": {
            "type": "string",
            "description": "Post id."
          },
          "outcome": {
            "enum": [
              "scheduled",
              "rescheduled",
              "unchanged"
            ],
            "description": "Outcome."
          },
          "scheduled_on": {
            "type": "string",
            "description": "Scheduled on."
          },
          "version": {
            "type": "integer",
            "description": "Version."
          }
        },
        "required": [
          "post_id",
          "outcome",
          "scheduled_on",
          "version"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:schedule",
      "read_only": false,
      "destructive": true,
      "open_world": true,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "services.scheduling.confirm_publication_date",
        "permissions": "Publishing access and scheduling eligibility.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Request metadata (actor, connection, workspace, tool, outcome, duration, and correlation ID) is logged; arguments and results are not. Retry reads freely. Retry a mutation only when marked idempotent; otherwise read current state before deciding whether to repeat it.",
        "example_arguments": {
          "team_id": 42,
          "post_id": "P7k2Lm9Q",
          "scheduled_on": "2026-10-08T09:30:00",
          "expected_version": 4,
          "account_id": 271
        },
        "example_result": {
          "post_id": "P7k2Lm9Q",
          "outcome": "scheduled",
          "scheduled_on": "2026-10-08T13:30:00+00:00",
          "version": 5
        }
      }
    },
    {
      "name": "set_post_target",
      "title": "Set post target",
      "description": "Select a LinkedIn profile for an unscheduled draft.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "post_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public post sqid."
          },
          "account_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Account id."
          },
          "expected_version": {
            "type": "integer",
            "minimum": 1,
            "description": "Last-read post concurrency version."
          }
        },
        "required": [
          "team_id",
          "post_id",
          "account_id",
          "expected_version"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "post_id": {
            "type": "string",
            "description": "Post id."
          },
          "target_account_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Target account id."
          },
          "version": {
            "type": "integer",
            "description": "Version."
          }
        },
        "required": [
          "post_id",
          "target_account_id",
          "version"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:content",
      "read_only": false,
      "destructive": true,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "services.targets.set_target",
        "permissions": "Draft editing and profile selection authority.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Request metadata (actor, connection, workspace, tool, outcome, duration, and correlation ID) is logged; arguments and results are not. Retry reads freely. Retry a mutation only when marked idempotent; otherwise read current state before deciding whether to repeat it.",
        "example_arguments": {
          "team_id": 42,
          "post_id": "P7k2Lm9Q",
          "account_id": 271,
          "expected_version": 2
        },
        "example_result": {
          "post_id": "P7k2Lm9Q",
          "target_account_id": 271,
          "version": 3
        }
      }
    },
    {
      "name": "suggest_content_emoji",
      "title": "Suggest content emoji",
      "description": "Suggest one unused emoji for the sentence or paragraph immediately before a cursor; content is not modified or published.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "content": {
            "type": "string",
            "minLength": 1,
            "maxLength": 5000,
            "description": "Post text, limited to 500 whitespace-separated words."
          },
          "cursor": {
            "type": "integer",
            "minimum": 0,
            "maximum": 5000,
            "description": "Unicode code-point offset in content; must not exceed content length."
          }
        },
        "required": [
          "team_id",
          "content",
          "cursor"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "emoji": {
            "type": "string",
            "minLength": 1,
            "description": "One trusted emoji sequence from the service catalog."
          }
        },
        "required": [
          "emoji"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:ai",
      "read_only": false,
      "destructive": false,
      "open_world": true,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "free_tools.emoji_content_fit.api.suggest → services.suggest_emoji",
        "permissions": "Current workspace member; mcp:ai scope, workspace AI quota, and MCP AI rate limit apply.",
        "errors": "Blank content, more than 500 words/5,000 characters, invalid cursor, provider failures, or exhausted emoji choices are rejected.",
        "retry": "The provider call is not idempotent. After a provider or ambiguous failure, retry only if another generation is acceptable.",
        "example_arguments": {
          "team_id": 42,
          "content": "We finally shipped the new onboarding flow",
          "cursor": 42
        },
        "example_result": {
          "emoji": "🎉"
        }
      }
    },
    {
      "name": "unschedule_post",
      "title": "Unschedule post",
      "description": "Remove a movable post from publication and queue.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "post_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public post sqid."
          },
          "expected_version": {
            "type": "integer",
            "minimum": 1,
            "description": "Last-read post concurrency version."
          }
        },
        "required": [
          "team_id",
          "post_id",
          "expected_version"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "post_id": {
            "type": "string",
            "description": "Post id."
          },
          "scheduled": {
            "const": false,
            "description": "Scheduled."
          },
          "version": {
            "type": "integer",
            "description": "Version."
          }
        },
        "required": [
          "post_id",
          "scheduled",
          "version"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:schedule",
      "read_only": false,
      "destructive": true,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "services.scheduling.unschedule_post",
        "permissions": "Movable post and current publishing authority.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Request metadata (actor, connection, workspace, tool, outcome, duration, and correlation ID) is logged; arguments and results are not. Retry reads freely. Retry a mutation only when marked idempotent; otherwise read current state before deciding whether to repeat it.",
        "example_arguments": {
          "team_id": 42,
          "post_id": "P7k2Lm9Q",
          "expected_version": 5
        },
        "example_result": {
          "post_id": "P7k2Lm9Q",
          "scheduled": false,
          "version": 6
        }
      }
    },
    {
      "name": "update_followup_comment",
      "title": "Update follow-up comment",
      "description": "Edit planned follow-up publication content.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "post_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public post sqid."
          },
          "expected_version": {
            "type": "integer",
            "minimum": 1,
            "description": "Last-read post concurrency version."
          },
          "confirmed_revision": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1,
            "description": "Confirmed revision."
          },
          "comment_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Comment id."
          },
          "description": {
            "type": "string",
            "maxLength": 1000,
            "description": "Description."
          }
        },
        "required": [
          "team_id",
          "post_id",
          "comment_id",
          "description",
          "expected_version"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "comment": {
            "type": "object",
            "properties": {
              "id": {
                "type": "integer",
                "minimum": 1,
                "description": "Id."
              },
              "description": {
                "type": "string",
                "description": "Description."
              },
              "order": {
                "type": "integer",
                "minimum": 0,
                "description": "Order."
              }
            },
            "description": "Comment.",
            "required": [
              "id",
              "description",
              "order"
            ],
            "additionalProperties": false
          },
          "changed": {
            "type": "boolean",
            "description": "Changed."
          },
          "version": {
            "type": "integer",
            "description": "Version."
          },
          "content_revision": {
            "type": "integer",
            "description": "Content revision."
          }
        },
        "required": [
          "comment",
          "changed",
          "version",
          "content_revision"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:content",
      "read_only": false,
      "destructive": true,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "social_scheduling.services.content; Comment is planned published follow-up content, not private collaboration",
        "permissions": "can_edit_post and approval/version guards.",
        "errors": "The connection is limited to 120 tool calls per user per minute and AI tools to 30 calls per user per hour. Invalid or cross-workspace identifiers return not found; revoked membership/scope returns permission denied; invalid input and stale versions return validation errors. Existing product limits still apply; there is no separate MCP subscription quota.",
        "retry": "Request metadata (actor, connection, workspace, tool, outcome, duration, and correlation ID) is logged; arguments and results are not. Retry reads freely. Retry a mutation only when marked idempotent; otherwise read current state before deciding whether to repeat it.",
        "example_arguments": {
          "team_id": 42,
          "post_id": "P7k2Lm9Q",
          "comment_id": 901,
          "description": "Download the checklist from the link below.",
          "expected_version": 5,
          "confirmed_revision": 4
        },
        "example_result": {
          "comment": {
            "id": 901,
            "description": "Download the checklist from the link below.",
            "order": 0
          },
          "changed": true,
          "version": 6,
          "content_revision": 5
        }
      }
    },
    {
      "name": "update_invitation",
      "title": "Update invitation",
      "description": "Update an unaccepted invitation's role and permissions.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "invitation_id": {
            "type": "string",
            "format": "uuid",
            "description": "Invitation id."
          },
          "email": {
            "type": "string",
            "format": "email",
            "maxLength": 254,
            "description": "Email."
          },
          "role": {
            "enum": [
              "admin",
              "member"
            ],
            "description": "Role."
          },
          "requires_linkedin": {
            "type": "boolean",
            "description": "Requires linkedin."
          },
          "can_create_drafts": {
            "type": "boolean",
            "description": "Can create drafts."
          },
          "can_publish": {
            "type": "boolean",
            "description": "Can publish."
          },
          "can_approve": {
            "type": "boolean",
            "description": "Can approve."
          }
        },
        "required": [
          "team_id",
          "invitation_id",
          "email",
          "role",
          "requires_linkedin",
          "can_create_drafts",
          "can_publish",
          "can_approve"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "invitation": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "format": "uuid",
                "description": "Id."
              },
              "email": {
                "type": "string",
                "format": "email",
                "description": "Email."
              },
              "role": {
                "enum": [
                  "admin",
                  "member"
                ],
                "description": "Role."
              },
              "requires_linkedin": {
                "type": "boolean",
                "description": "Requires linkedin."
              },
              "can_create_drafts": {
                "type": "boolean",
                "description": "Can create drafts."
              },
              "can_publish": {
                "type": "boolean",
                "description": "Can publish."
              },
              "can_approve": {
                "type": "boolean",
                "description": "Can approve."
              },
              "accepted": {
                "type": "boolean",
                "description": "Accepted."
              }
            },
            "description": "Invitation.",
            "required": [
              "id",
              "email",
              "role",
              "requires_linkedin",
              "can_create_drafts",
              "can_publish",
              "can_approve",
              "accepted"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "invitation"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:invitations",
      "read_only": false,
      "destructive": true,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "InvitationViewSet.perform_update",
        "permissions": "Workspace administrator; accepted invitations immutable.",
        "errors": "Workspace reads require current membership; workspace and invitation administration requires an administrator, while creation requires account-level mcp:teams. Invalid/duplicate slugs or pending emails are rejected; unknown or cross-workspace invitations return not found, and accepted invitations cannot be changed or cancelled. Calls are limited to 120 per user per minute.",
        "retry": "Reads are safe to retry. Before retrying workspace or invitation creation after an ambiguous response, list current workspaces or invitations. Updates may be retried after reading current state; never blindly repeat workspace deletion or invitation cancellation.",
        "example_arguments": {
          "team_id": 42,
          "invitation_id": "018f3c96-0d74-7b2b-9e10-5ecbbcd82921",
          "email": "alex.lee@example.com",
          "role": "member",
          "requires_linkedin": false,
          "can_create_drafts": true,
          "can_publish": true,
          "can_approve": false
        },
        "example_result": {
          "invitation": {
            "id": "018f3c96-0d74-7b2b-9e10-5ecbbcd82921",
            "email": "alex.lee@example.com",
            "role": "member",
            "requires_linkedin": false,
            "can_create_drafts": true,
            "can_publish": true,
            "can_approve": false,
            "accepted": false
          }
        }
      }
    },
    {
      "name": "update_post",
      "title": "Update post",
      "description": "Replace draft content using optimistic concurrency and approval confirmation.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "post_id": {
            "type": "string",
            "minLength": 1,
            "maxLength": 32,
            "description": "Public post sqid."
          },
          "description": {
            "type": "string",
            "maxLength": 63206,
            "description": "Description."
          },
          "expected_version": {
            "type": "integer",
            "minimum": 1,
            "description": "Last-read post concurrency version."
          },
          "confirmed_revision": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1,
            "description": "Confirmed revision."
          }
        },
        "required": [
          "team_id",
          "post_id",
          "description",
          "expected_version"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "post": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "description": "Id."
              },
              "description": {
                "type": "string",
                "description": "Description."
              },
              "version": {
                "type": "integer",
                "description": "Version."
              },
              "content_revision": {
                "type": "integer",
                "description": "Content revision."
              },
              "scheduled_on": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Scheduled on."
              },
              "timezone": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Timezone."
              },
              "schedule_active": {
                "type": "boolean",
                "description": "Schedule active."
              },
              "target_account_id": {
                "type": [
                  "integer",
                  "null"
                ],
                "description": "Target account id."
              },
              "delivery": {
                "type": "object",
                "properties": {
                  "status": {
                    "type": "string",
                    "description": "Status."
                  },
                  "total": {
                    "type": "integer",
                    "description": "Total."
                  },
                  "published": {
                    "type": "integer",
                    "description": "Published."
                  },
                  "failed": {
                    "type": "integer",
                    "description": "Failed."
                  },
                  "pending": {
                    "type": "integer",
                    "description": "Pending."
                  },
                  "details": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "integer"
                    },
                    "description": "Details.",
                    "properties": {},
                    "required": []
                  }
                },
                "required": [
                  "status",
                  "total"
                ],
                "description": "Delivery.",
                "additionalProperties": false
              }
            },
            "description": "Post.",
            "required": [
              "id",
              "description",
              "version",
              "content_revision",
              "scheduled_on",
              "timezone",
              "schedule_active",
              "target_account_id",
              "delivery"
            ],
            "additionalProperties": false
          },
          "changed": {
            "type": "boolean",
            "description": "Changed."
          }
        },
        "required": [
          "post",
          "changed"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:content",
      "read_only": false,
      "destructive": true,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "services.content.update_description",
        "permissions": "can_edit_post; approved changes require confirmed_revision.",
        "errors": "Requires a current workspace membership. Unknown or cross-workspace posts return not found; draft permissions can deny writes. Content over 63,206 characters, stale versions, missing approval confirmation, active schedules, or started publication reject the applicable mutation. Calls are limited to 120 per user per minute.",
        "retry": "Reads are safe to retry. Before retrying create, search or list posts to avoid a duplicate draft. For update or delete, reload the post after an ambiguous response and use its current version; never blindly repeat a stale mutation.",
        "example_arguments": {
          "team_id": 42,
          "post_id": "P7k2Lm9Q",
          "description": "Three practical onboarding lessons from ten customer interviews.",
          "expected_version": 4,
          "confirmed_revision": 3
        },
        "example_result": {
          "post": {
            "id": "P7k2Lm9Q",
            "description": "Three practical onboarding lessons from ten customer interviews.",
            "version": 5,
            "content_revision": 4,
            "scheduled_on": null,
            "timezone": "America/New_York",
            "schedule_active": false,
            "target_account_id": 271,
            "delivery": {
              "status": "draft",
              "total": 0,
              "published": 0,
              "failed": 0,
              "pending": 0,
              "details": {}
            }
          },
          "changed": true
        }
      }
    },
    {
      "name": "update_workspace",
      "title": "Update workspace",
      "description": "Rename the active workspace.",
      "input_schema": {
        "type": "object",
        "properties": {
          "team_id": {
            "type": "integer",
            "minimum": 1,
            "description": "Consented workspace ID."
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100,
            "description": "Name."
          },
          "slug": {
            "type": [
              "string",
              "null"
            ],
            "minLength": 1,
            "maxLength": 50,
            "description": "Slug."
          }
        },
        "required": [
          "team_id",
          "name"
        ],
        "additionalProperties": false
      },
      "output_schema": {
        "type": "object",
        "properties": {
          "workspace": {
            "type": "object",
            "properties": {
              "id": {
                "type": "integer",
                "minimum": 1,
                "description": "Id."
              },
              "name": {
                "type": "string",
                "description": "Name."
              },
              "slug": {
                "type": "string",
                "description": "Slug."
              },
              "role": {
                "enum": [
                  "admin",
                  "member"
                ],
                "description": "Role."
              },
              "members": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "integer",
                      "minimum": 1,
                      "description": "Id."
                    },
                    "name": {
                      "type": "string",
                      "description": "Name."
                    },
                    "role": {
                      "enum": [
                        "admin",
                        "member"
                      ],
                      "description": "Role."
                    }
                  },
                  "description": "Members item.",
                  "required": [
                    "id",
                    "name",
                    "role"
                  ],
                  "additionalProperties": false
                },
                "description": "Members."
              }
            },
            "description": "Workspace.",
            "required": [
              "id",
              "name",
              "slug",
              "role",
              "members"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "workspace"
        ],
        "additionalProperties": false
      },
      "scope": "mcp:teams",
      "read_only": false,
      "destructive": true,
      "open_world": false,
      "idempotent": false,
      "team_required": true,
      "docs": {
        "source": "teams API TeamViewSet",
        "permissions": "Workspace administrator.",
        "errors": "Workspace reads require current membership; workspace and invitation administration requires an administrator, while creation requires account-level mcp:teams. Invalid/duplicate slugs or pending emails are rejected; unknown or cross-workspace invitations return not found, and accepted invitations cannot be changed or cancelled. Calls are limited to 120 per user per minute.",
        "retry": "Reads are safe to retry. Before retrying workspace or invitation creation after an ambiguous response, list current workspaces or invitations. Updates may be retried after reading current state; never blindly repeat workspace deletion or invitation cancellation.",
        "example_arguments": {
          "team_id": 42,
          "name": "Northstar Content Studio",
          "slug": "northstar-content"
        },
        "example_result": {
          "workspace": {
            "id": 42,
            "name": "Northstar Content Studio",
            "slug": "northstar-content",
            "role": "admin",
            "members": [
              {
                "id": 17,
                "name": "Maya Chen",
                "role": "admin"
              },
              {
                "id": 23,
                "name": "Jon Bell",
                "role": "member"
              }
            ]
          }
        }
      }
    }
  ]
}