{
    "name": "saminfo",
    "description": "Read SAM Magazine articles, classifieds, and the community board; submit board requests; and fully manage advertising & sponsorships (sponsors, campaigns, creatives, ad positions, placements, invoices, and ad generation).",
    "version": "1.0.164",
    "protocol": "mcp",
    "protocolVersion": "2025-06-18",
    "transport": {
        "type": "http",
        "endpoint": "https://www.saminfo.com/wp-json/mcp/mcp-adapter-default-server"
    },
    "documentation": "https://www.saminfo.com/llms.txt",
    "authentication": {
        "type": "oauth2",
        "metadata": "https://www.saminfo.com/.well-known/oauth-protected-resource"
    },
    "capabilities": {
        "tools": true,
        "resources": true
    },
    "tools": [
        {
            "name": "saminfo/add-sponsor-asset",
            "description": "Sideload an image/video/PDF from a URL into a sponsor\u2019s asset pool (creative assets or brand guidelines). Lands pending review; brand guidelines are baked into generated video ads.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "sponsor_id": {
                        "type": "integer"
                    },
                    "url": {
                        "type": "string",
                        "description": "Publicly fetchable URL of the asset"
                    },
                    "kind": {
                        "type": "string",
                        "enum": [
                            "asset",
                            "brand"
                        ],
                        "description": "asset = creative reference; brand = brand guidelines"
                    }
                },
                "required": [
                    "sponsor_id",
                    "url"
                ]
            }
        },
        {
            "name": "saminfo/add-sync-issue-exclude",
            "description": "Stop the hourly Joomla sync from creating or updating one magazine issue. Pass catid and/or title.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "catid": {
                        "type": "integer"
                    },
                    "title": {
                        "type": "string"
                    }
                }
            }
        },
        {
            "name": "saminfo/approve-board-request",
            "description": "Publish a pending request after moderation. Moderators only.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    }
                },
                "required": [
                    "id"
                ]
            }
        },
        {
            "name": "saminfo/approve-sponsor-asset",
            "description": "Approve (or re-flag) an advertiser-uploaded asset. Approving clears pending-review so it can serve.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "attachment_id": {
                        "type": "integer"
                    },
                    "approve": {
                        "type": "boolean"
                    }
                },
                "required": [
                    "attachment_id"
                ]
            }
        },
        {
            "name": "saminfo/assign-bylines",
            "description": "Set ordered byline credits on a post. The first user is post_author.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "post_id": {
                        "type": "integer"
                    },
                    "user_ids": {
                        "type": "array",
                        "items": {
                            "type": "integer"
                        }
                    }
                },
                "required": [
                    "post_id",
                    "user_ids"
                ]
            }
        },
        {
            "name": "saminfo/attach-recording-uid",
            "description": "Attach an existing Cloudflare Stream video (by UID) to a series \u2014 the manual fallback when a recording is already in Stream.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "cf_uid": {
                        "type": "string"
                    },
                    "series_id": {
                        "type": "integer"
                    },
                    "title": {
                        "type": "string"
                    }
                },
                "required": [
                    "cf_uid",
                    "series_id"
                ]
            }
        },
        {
            "name": "saminfo/attach-series-to-program",
            "description": "Move a series under a program (sets its parent link, appends to the end).",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "series_id": {
                        "type": "integer"
                    },
                    "program_id": {
                        "type": "integer"
                    }
                },
                "required": [
                    "series_id",
                    "program_id"
                ]
            }
        },
        {
            "name": "saminfo/attach-video-to-series",
            "description": "Move a video under a series (sets its parent link, appends to the end).",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "video_id": {
                        "type": "integer"
                    },
                    "series_id": {
                        "type": "integer"
                    }
                },
                "required": [
                    "video_id",
                    "series_id"
                ]
            }
        },
        {
            "name": "saminfo/board-member-stats",
            "description": "Board activity + reputation for a member: requests, resolves, replies, helpful, tier.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "user_id": {
                        "type": "integer"
                    }
                },
                "required": [
                    "user_id"
                ]
            }
        },
        {
            "name": "saminfo/classified-import",
            "description": "Parse a Gravity Forms classified Excel/CSV export, drop payment columns, and create or replace pending listings. Staging only with execute.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "file": {
                        "type": "string"
                    },
                    "execute": {
                        "type": "boolean"
                    },
                    "batch": {
                        "type": "string"
                    }
                },
                "required": [
                    "file"
                ]
            }
        },
        {
            "name": "saminfo/classified-unimport",
            "description": "Trash listings from one classified GF import batch. Does not touch Joomla/DJCF listings. Staging only with execute.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "batch": {
                        "type": "string"
                    },
                    "execute": {
                        "type": "boolean"
                    }
                },
                "required": [
                    "batch"
                ]
            }
        },
        {
            "name": "saminfo/content-quality-report",
            "description": "Published posts and pages with little or no body copy, empty first.",
            "inputSchema": {
                "type": "object"
            }
        },
        {
            "name": "saminfo/create-campaign",
            "description": "Create an insertion order under a sponsor.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "post_title": {
                        "type": "string"
                    },
                    "sponsor_id": {
                        "type": "integer"
                    },
                    "campaign_status": {
                        "type": "string",
                        "enum": [
                            "draft",
                            "live",
                            "paused",
                            "complete"
                        ]
                    },
                    "tier": {
                        "type": "string",
                        "enum": [
                            "standard",
                            "preferred",
                            "premium"
                        ]
                    },
                    "allocated_dollars": {
                        "type": "number"
                    }
                },
                "required": [
                    "post_title",
                    "sponsor_id"
                ]
            }
        },
        {
            "name": "saminfo/create-classified",
            "description": "Create a listing with title, category, status, and contact/meta fields.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "post_title": {
                        "type": "string"
                    },
                    "category": {
                        "type": "string",
                        "enum": [
                            "employment",
                            "lifts-equipment",
                            "grooming-vehicles",
                            "snowmaking-equipment",
                            "general-area-equipment",
                            "ski-snowboard-rental",
                            "resort-real-estate",
                            "free-stuff"
                        ]
                    },
                    "status": {
                        "type": "string",
                        "enum": [
                            "publish",
                            "pending",
                            "draft"
                        ]
                    },
                    "employer": {
                        "type": "string"
                    },
                    "department": {
                        "type": "string",
                        "enum": [
                            "",
                            "accounting",
                            "construction-project-management",
                            "food-beverage",
                            "guest-service",
                            "human-resources-admin",
                            "it",
                            "marketing-communications",
                            "miscellaneous",
                            "mountain-operations",
                            "rental-retail",
                            "resort-management",
                            "ski-patrol",
                            "snowsports-school",
                            "terrain-park",
                            "trail-maintenance",
                            "lift",
                            "grooming",
                            "snowmaking",
                            "technology"
                        ],
                        "description": "Employment department slug. Lift and Grooming landing pages match lift and grooming."
                    }
                },
                "required": [
                    "post_title"
                ]
            }
        },
        {
            "name": "saminfo/create-creative",
            "description": "Create a creative variant under a campaign (set positions so it can serve).",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "post_title": {
                        "type": "string"
                    },
                    "campaign_id": {
                        "type": "integer"
                    },
                    "creative_type": {
                        "type": "string",
                        "enum": [
                            "image",
                            "video",
                            "html"
                        ]
                    },
                    "attachment_id": {
                        "type": "integer"
                    },
                    "poster_id": {
                        "type": "integer"
                    },
                    "positions": {
                        "type": "string",
                        "description": "CSV of position slugs this creative may serve in"
                    },
                    "click_url": {
                        "type": "string"
                    },
                    "cta_text": {
                        "type": "string"
                    },
                    "variant_label": {
                        "type": "string"
                    },
                    "weight": {
                        "type": "integer"
                    },
                    "is_paused": {
                        "type": "boolean"
                    },
                    "parallax_height": {
                        "type": "integer",
                        "description": "Parallax band min-height in px (0 = position default)"
                    },
                    "parallax_logo_id": {
                        "type": "integer",
                        "description": "Optional logo override attachment ID"
                    },
                    "parallax_logo_max_width": {
                        "type": "integer",
                        "description": "Logo chip max width in px (0 = 200)"
                    },
                    "parallax_logo_height": {
                        "type": "integer",
                        "description": "Logo chip height in px (0 = 44)"
                    },
                    "parallax_logo_align": {
                        "type": "string",
                        "enum": [
                            "left",
                            "center",
                            "right"
                        ]
                    },
                    "parallax_show_logo": {
                        "type": "boolean"
                    },
                    "parallax_hide_label": {
                        "type": "boolean"
                    }
                },
                "required": [
                    "post_title",
                    "campaign_id"
                ]
            }
        },
        {
            "name": "saminfo/create-position",
            "description": "Add a sellable inventory position.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "label": {
                        "type": "string"
                    },
                    "slug": {
                        "type": "string"
                    },
                    "format": {
                        "type": "string"
                    },
                    "rate_cents": {
                        "type": "number"
                    }
                },
                "required": [
                    "label"
                ]
            }
        },
        {
            "name": "saminfo/create-program",
            "description": "Create a new video program (top-level container).",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "title": {
                        "type": "string",
                        "description": "Program title"
                    },
                    "description": {
                        "type": "string",
                        "description": "Optional program description (post content)"
                    }
                },
                "required": [
                    "title"
                ]
            }
        },
        {
            "name": "saminfo/create-series",
            "description": "Create a series inside a program (appended to the end).",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "program_id": {
                        "type": "integer"
                    },
                    "title": {
                        "type": "string"
                    }
                },
                "required": [
                    "program_id",
                    "title"
                ]
            }
        },
        {
            "name": "saminfo/create-sponsor",
            "description": "Create an advertiser record.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "post_title": {
                        "type": "string"
                    },
                    "sponsor_click_url": {
                        "type": "string"
                    },
                    "sponsor_body": {
                        "type": "string",
                        "description": "Default description for native cards and Supplier Guide listings."
                    },
                    "sponsor_premium": {
                        "type": "boolean"
                    },
                    "sponsor_dept_lock": {
                        "type": "string",
                        "description": "CSV of department/program tags to list this sponsor under in the Supplier Guide, e.g. \"lifts,cutters-camp\". Valid tags: grooming, leadership, lifts, snowmaking, summer, sustainability, technology, cutters-camp"
                    },
                    "sponsor_context_bodies": {
                        "type": "string",
                        "description": "JSON object of Supplier Guide scope slug \u2192 page-specific description. Empty/omitted keys fall back to sponsor_body. Example: {\"cutters-camp\":\"Hands-on grooming training partner.\"}"
                    },
                    "sponsor_guide_scope": {
                        "type": "string",
                        "description": "Department/program slug to patch one page-specific blurb (e.g. cutters-camp)."
                    },
                    "sponsor_guide_body": {
                        "type": "string",
                        "description": "Description for sponsor_guide_scope. Used with sponsor_guide_override."
                    },
                    "sponsor_guide_override": {
                        "type": "boolean",
                        "description": "True (default when scope+body sent): store as page-specific copy. False: clear that override and write sponsor_body."
                    }
                },
                "required": [
                    "post_title"
                ]
            }
        },
        {
            "name": "saminfo/create-video",
            "description": "Create a video inside a series (appended to the end).",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "series_id": {
                        "type": "integer"
                    },
                    "title": {
                        "type": "string"
                    },
                    "cf_video_uid": {
                        "type": "string",
                        "description": "Cloudflare Stream UID (optional; can be attached later)"
                    }
                },
                "required": [
                    "series_id",
                    "title"
                ]
            }
        },
        {
            "name": "saminfo/delete-board-request",
            "description": "Trash a board request (reversible).",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    }
                },
                "required": [
                    "id"
                ]
            }
        },
        {
            "name": "saminfo/delete-campaign",
            "description": "Trash a campaign and its creatives.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    }
                },
                "required": [
                    "id"
                ]
            }
        },
        {
            "name": "saminfo/delete-classified",
            "description": "Trash a listing (reversible).",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    }
                },
                "required": [
                    "id"
                ]
            }
        },
        {
            "name": "saminfo/delete-creative",
            "description": "Trash a creative variant.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    }
                },
                "required": [
                    "id"
                ]
            }
        },
        {
            "name": "saminfo/delete-placement",
            "description": "Trash a placement rule (companion to set-ad-placement).",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    }
                },
                "required": [
                    "id"
                ]
            }
        },
        {
            "name": "saminfo/delete-position",
            "description": "Trash an inventory position.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    }
                },
                "required": [
                    "id"
                ]
            }
        },
        {
            "name": "saminfo/delete-sponsor",
            "description": "Trash a sponsor (reversible). Refuses while the sponsor has campaigns \u2014 merge it instead. Releases any ad position reserved for it back to open inventory, drops it from the department Supplier Guides, and leaves past impressions/clicks in reporting.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    }
                },
                "required": [
                    "id"
                ]
            }
        },
        {
            "name": "saminfo/delete-video-template",
            "description": "Delete a Remotion video-ad template by slug.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "slug": {
                        "type": "string"
                    }
                },
                "required": [
                    "slug"
                ]
            }
        },
        {
            "name": "saminfo/demote-bylines",
            "description": "Preview or apply demoting byline-only contributors to sam_profile. commit defaults false.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "commit": {
                        "type": "boolean"
                    }
                }
            }
        },
        {
            "name": "saminfo/extend-classified",
            "description": "Push the expiration date out by N days (default 60); re-publishes if it had lapsed.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "days": {
                        "type": "integer"
                    }
                },
                "required": [
                    "id"
                ]
            }
        },
        {
            "name": "saminfo/generate-article-audio",
            "description": "Generate (or refresh) AI narration for a post and store it as an MP3.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "post_id": {
                        "type": "integer"
                    },
                    "force": {
                        "type": "boolean"
                    }
                },
                "required": [
                    "post_id"
                ]
            }
        },
        {
            "name": "saminfo/generate-sponsor-html-ad",
            "description": "Scaffold a block-content (parallax) ad from a sponsor brief + assets; returns a block-editor link to refine it.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "sponsor_id": {
                        "type": "integer"
                    },
                    "campaign_id": {
                        "type": "integer"
                    }
                },
                "required": [
                    "sponsor_id"
                ]
            }
        },
        {
            "name": "saminfo/generate-sponsor-video",
            "description": "Queue a Remotion render from a sponsor brief + reference files; renders on staging and lands as a creative.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "sponsor_id": {
                        "type": "integer"
                    },
                    "composition": {
                        "type": "string"
                    },
                    "campaign_id": {
                        "type": "integer"
                    }
                },
                "required": [
                    "sponsor_id"
                ]
            }
        },
        {
            "name": "saminfo/get-article",
            "description": "Fetch a single published article. Full body when free; excerpt + paywalled flag when gated.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    }
                },
                "required": [
                    "id"
                ]
            }
        },
        {
            "name": "saminfo/get-article-audio-status",
            "description": "Read narration status, duration, and URL for a post.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "post_id": {
                        "type": "integer"
                    }
                },
                "required": [
                    "post_id"
                ]
            }
        },
        {
            "name": "saminfo/get-article-mid-ad",
            "description": "Read the site-wide magazine/news mid-article slot (leaderboard or parallax) and the Wiegand sample article if one is set.",
            "inputSchema": {
                "type": "object"
            }
        },
        {
            "name": "saminfo/get-audio-queue",
            "description": "Read the bulk narration queue: queued, processing, done, total, failed.",
            "inputSchema": {
                "type": "object",
                "properties": []
            }
        },
        {
            "name": "saminfo/get-hero-pool",
            "description": "List post IDs pinned to the homepage hero pool (max 3; one shown at random per load).",
            "inputSchema": {
                "type": "object"
            }
        },
        {
            "name": "saminfo/get-invoice",
            "description": "Invoice number, paid/unpaid status, amount, printable-invoice URL, and pay link for a campaign.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "campaign_id": {
                        "type": "integer"
                    }
                },
                "required": [
                    "campaign_id"
                ]
            }
        },
        {
            "name": "saminfo/get-related-content",
            "description": "Brand-safe, positive-sentiment articles related to a given post, classified, or board request (never closures/incidents).",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "description": "Source post/classified/board ID"
                    },
                    "count": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 4
                    }
                },
                "required": [
                    "id"
                ]
            }
        },
        {
            "name": "saminfo/get-revenue-entity",
            "description": "Fetch one record (sponsor, campaign, creative, position, or placement) with its full editable fields, to read before updating.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "entity": {
                        "type": "string",
                        "enum": [
                            "sponsor",
                            "campaign",
                            "creative",
                            "position",
                            "placement"
                        ]
                    },
                    "id": {
                        "type": "integer"
                    }
                },
                "required": [
                    "entity",
                    "id"
                ]
            }
        },
        {
            "name": "saminfo/get-revenue-summary",
            "description": "Booked value, live campaigns, fill rate, pacing-behind count, and unsold premium value.",
            "inputSchema": {
                "type": "object",
                "properties": []
            }
        },
        {
            "name": "saminfo/get-video-job-status",
            "description": "Poll a Remotion render job started by generate-sponsor-video (status, output, error).",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "job": {
                        "type": "string"
                    }
                },
                "required": [
                    "job"
                ]
            }
        },
        {
            "name": "saminfo/get-watch-progress",
            "description": "The current user's per-video watch progress map.",
            "inputSchema": {
                "type": "object",
                "properties": []
            }
        },
        {
            "name": "saminfo/grant-program-access",
            "description": "Grant a user access to a whole program (one bundle row per series) or a single series. Access derives from this entitlement, not a subscription.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "user_id": {
                        "type": "integer"
                    },
                    "user_email": {
                        "type": "string",
                        "description": "Alternative to user_id"
                    },
                    "program_id": {
                        "type": "integer",
                        "description": "Grant the whole program (bundle)"
                    },
                    "series_id": {
                        "type": "integer",
                        "description": "Grant a single series (takes precedence over program_id)"
                    },
                    "source": {
                        "type": "string",
                        "enum": [
                            "purchase",
                            "bundle",
                            "manual",
                            "import"
                        ],
                        "description": "Defaults to manual (single) / bundle (program)"
                    },
                    "expires_at": {
                        "type": "string",
                        "description": "Override Y-m-d H:i:s; omit to derive from the series access policy"
                    }
                }
            }
        },
        {
            "name": "saminfo/image-quality-report",
            "description": "Posts whose featured image is smaller than the ideal for the main featured area, worst first.",
            "inputSchema": {
                "type": "object"
            }
        },
        {
            "name": "saminfo/import-classifieds",
            "description": "Bulk-create or update listings from a CSV string. Defaults to pending so the desk can approve.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "csv": {
                        "type": "string"
                    },
                    "status": {
                        "type": "string",
                        "enum": [
                            "publish",
                            "pending",
                            "draft"
                        ]
                    },
                    "dry_run": {
                        "type": "boolean"
                    }
                },
                "required": [
                    "csv"
                ]
            }
        },
        {
            "name": "saminfo/import-drive-library",
            "description": "Batch-import every video in the Drive recordings folder into Cloudflare Stream as UNATTACHED library videos, to be tagged into a program/series later. Idempotent on the Drive file id. dry_run (default true) reports what would import without transferring.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "folder_id": {
                        "type": "string"
                    },
                    "dry_run": {
                        "type": "boolean"
                    }
                }
            }
        },
        {
            "name": "saminfo/ingest-recording",
            "description": "Pull a Drive recording into Cloudflare Stream (async). Omit series_id (or pass 0) to land it unattached in the Video Library; pass a series id to attach on ingest. Returns the sam_video id + status.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "drive_file_id": {
                        "type": "string"
                    },
                    "series_id": {
                        "type": "integer"
                    },
                    "title": {
                        "type": "string"
                    }
                },
                "required": [
                    "drive_file_id"
                ]
            }
        },
        {
            "name": "saminfo/ingest-status",
            "description": "Current ingest status for a sam_video (queued/downloading/uploading/processing/ready/error).",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "video_id": {
                        "type": "integer"
                    }
                },
                "required": [
                    "video_id"
                ]
            }
        },
        {
            "name": "saminfo/list-ad-inventory",
            "description": "Per-position occupancy: live eligible campaigns, 8-week fill, 30-day impressions, premium flag.",
            "inputSchema": {
                "type": "object",
                "properties": []
            }
        },
        {
            "name": "saminfo/list-ad-placements",
            "description": "Read the ad-placement rules \u2014 which position shows at which location under which conditions.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "enabled_only": {
                        "type": "boolean"
                    }
                }
            }
        },
        {
            "name": "saminfo/list-ad-positions",
            "description": "Enumerate sellable inventory positions (id, slug, label, format, rate).",
            "inputSchema": {
                "type": "object",
                "properties": [],
                "required": []
            }
        },
        {
            "name": "saminfo/list-articles",
            "description": "Read published articles, newest first, optionally filtered by department.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "department": {
                        "type": "string",
                        "description": "Department slug, e.g. lifts, grooming, snowmaking"
                    },
                    "count": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 50
                    },
                    "page": {
                        "type": "integer",
                        "minimum": 1
                    }
                }
            }
        },
        {
            "name": "saminfo/list-board-requests",
            "description": "Read published requests, filterable by topic and open/resolved status.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "topic": {
                        "type": "string"
                    },
                    "status": {
                        "type": "string",
                        "enum": [
                            "open",
                            "resolved",
                            "any"
                        ]
                    },
                    "count": {
                        "type": "integer"
                    }
                }
            }
        },
        {
            "name": "saminfo/list-campaigns",
            "description": "Enumerate campaigns/insertion orders with ids. Filter by sponsor_id or status.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "sponsor_id": {
                        "type": "integer"
                    },
                    "status": {
                        "type": "string"
                    },
                    "limit": {
                        "type": "integer"
                    }
                },
                "required": []
            }
        },
        {
            "name": "saminfo/list-classifieds-ops",
            "description": "Live count, review-queue depth, expiring-in-7-days count, and 30-day paid revenue.",
            "inputSchema": {
                "type": "object",
                "properties": []
            }
        },
        {
            "name": "saminfo/list-contests",
            "description": "Contests with their voting window, status, and ballot categories. Voting itself requires human email verification.",
            "inputSchema": {
                "type": "object",
                "properties": []
            }
        },
        {
            "name": "saminfo/list-creatives",
            "description": "Enumerate creatives with ids. Filter by campaign_id or by a position slug.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "campaign_id": {
                        "type": "integer"
                    },
                    "position": {
                        "type": "string"
                    },
                    "limit": {
                        "type": "integer"
                    }
                },
                "required": []
            }
        },
        {
            "name": "saminfo/list-drive-recordings",
            "description": "Video files in the Drive recordings folder available to ingest into a program.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "folder_id": {
                        "type": "string"
                    }
                }
            }
        },
        {
            "name": "saminfo/list-pending-assets",
            "description": "Advertiser-uploaded assets flagged pending review (they cannot serve until approved).",
            "inputSchema": {
                "type": "object",
                "properties": [],
                "required": []
            }
        },
        {
            "name": "saminfo/list-position-creatives",
            "description": "Creatives that could fill a position, flagged active/eligible, plus the current pin.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "slug": {
                        "type": "string"
                    }
                },
                "required": [
                    "slug"
                ]
            }
        },
        {
            "name": "saminfo/list-program-entitlements",
            "description": "List entitlement rows, filterable by program, series, user, or status.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "program_id": {
                        "type": "integer"
                    },
                    "series_id": {
                        "type": "integer"
                    },
                    "user_id": {
                        "type": "integer"
                    },
                    "status": {
                        "type": "string",
                        "enum": [
                            "active",
                            "revoked"
                        ]
                    },
                    "limit": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 500
                    }
                }
            }
        },
        {
            "name": "saminfo/list-program-feedback",
            "description": "Feedback summary for a program: response count, average rating and recommend score, and recent comments.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "program_id": {
                        "type": "integer"
                    }
                },
                "required": [
                    "program_id"
                ]
            }
        },
        {
            "name": "saminfo/list-sponsors",
            "description": "Enumerate advertisers (id, title, premium, campaign count). Filter by search text or premium.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "search": {
                        "type": "string"
                    },
                    "premium": {
                        "type": "boolean"
                    },
                    "limit": {
                        "type": "integer"
                    }
                },
                "required": []
            }
        },
        {
            "name": "saminfo/list-sync-issue-excludes",
            "description": "Show magazine issues the hourly Joomla sync will not import. Manual issue upload is unaffected.",
            "inputSchema": {
                "type": "object",
                "properties": []
            }
        },
        {
            "name": "saminfo/mark-invoice-paid",
            "description": "Set a campaign invoice status to paid or unpaid.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "campaign_id": {
                        "type": "integer"
                    },
                    "status": {
                        "type": "string",
                        "enum": [
                            "paid",
                            "unpaid"
                        ]
                    }
                },
                "required": [
                    "campaign_id",
                    "status"
                ]
            }
        },
        {
            "name": "saminfo/merge-authors",
            "description": "Preview or apply merging one byline user into another. commit defaults false.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "from": {
                        "type": "string"
                    },
                    "into": {
                        "type": "string"
                    },
                    "commit": {
                        "type": "boolean"
                    }
                },
                "required": [
                    "from",
                    "into"
                ]
            }
        },
        {
            "name": "saminfo/merge-sponsor",
            "description": "Reassign all campaigns, creatives, and analytics from one sponsor into another, then trash the source. For deduping.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "from_id": {
                        "type": "integer"
                    },
                    "into_id": {
                        "type": "integer"
                    }
                },
                "required": [
                    "from_id",
                    "into_id"
                ]
            }
        },
        {
            "name": "saminfo/moderate-board-reply",
            "description": "Approve, trash, or spam a held reply on a board request.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "comment_id": {
                        "type": "integer"
                    },
                    "action": {
                        "type": "string",
                        "enum": [
                            "approve",
                            "trash",
                            "spam"
                        ]
                    },
                    "reason": {
                        "type": "string"
                    }
                },
                "required": [
                    "comment_id",
                    "action"
                ]
            }
        },
        {
            "name": "saminfo/moderation-queue",
            "description": "Pending requests, held replies, open/resolved/unanswered counts, and boost requests.",
            "inputSchema": {
                "type": "object",
                "properties": []
            }
        },
        {
            "name": "saminfo/pace-report",
            "description": "Delivery vs. flight pacing for live capped campaigns; flags under/over delivery.",
            "inputSchema": {
                "type": "object",
                "properties": []
            }
        },
        {
            "name": "saminfo/pause-creative",
            "description": "Toggle a creative in/out of rotation.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "creative_id": {
                        "type": "integer"
                    },
                    "paused": {
                        "type": "boolean"
                    }
                },
                "required": [
                    "creative_id",
                    "paused"
                ]
            }
        },
        {
            "name": "saminfo/privacy-info",
            "description": "Returns what SAMinfo collects, who processes it, whether data is sold or shared (it is not), and how to opt out (Your Privacy Choices / Global Privacy Control).",
            "inputSchema": {
                "type": "object",
                "properties": []
            }
        },
        {
            "name": "saminfo/program-analytics",
            "description": "Per-program video engagement: unique viewers, completion rate, drop-off point, and most-watched. Omit program_id for a leaderboard across all programs.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "program_id": {
                        "type": "integer",
                        "description": "A sam_program ID. Omit for all-programs summary."
                    },
                    "days": {
                        "type": "integer",
                        "minimum": 0,
                        "description": "Window in days; 0 = all time."
                    }
                }
            }
        },
        {
            "name": "saminfo/program-feedback-status",
            "description": "Whether the current user has finished a program and should be shown its feedback survey (and whether they already submitted).",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "program_id": {
                        "type": "integer"
                    }
                },
                "required": [
                    "program_id"
                ]
            }
        },
        {
            "name": "saminfo/promote-ab-winner",
            "description": "Set a creative as its campaign's A/B winner (locks rotation to it).",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "creative_id": {
                        "type": "integer"
                    }
                },
                "required": [
                    "creative_id"
                ]
            }
        },
        {
            "name": "saminfo/publish-classified",
            "description": "Publish a pending listing, apply placement from its stored upgrade ladder, clear the review flag, and set a 60-day expiry when it is missing or already past. A future expiry stays as stored. Already-live listings only lose the review flag.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    }
                },
                "required": [
                    "id"
                ]
            }
        },
        {
            "name": "saminfo/publish-issue",
            "description": "Publish Import Issue drafts on one issue term so current-issue, home, and archives can see them. Staging only. --issue required.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "issue": {
                        "type": "string"
                    },
                    "execute": {
                        "type": "boolean"
                    }
                },
                "required": [
                    "issue"
                ]
            }
        },
        {
            "name": "saminfo/reassign-byline",
            "description": "Set post_author on every post with a given tag. Use for series such as Ski Inc. (tag ski-inc-series, byline Andy Bigford).",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "tag": {
                        "type": "string"
                    },
                    "byline": {
                        "type": "string"
                    },
                    "dry_run": {
                        "type": "boolean"
                    }
                },
                "required": [
                    "tag",
                    "byline"
                ]
            }
        },
        {
            "name": "saminfo/record-watch-progress",
            "description": "Record the current user's position/pct for a video.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "video_id": {
                        "type": "integer"
                    },
                    "position_s": {
                        "type": "integer"
                    },
                    "pct": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 100
                    },
                    "completed": {
                        "type": "boolean"
                    }
                },
                "required": [
                    "video_id"
                ]
            }
        },
        {
            "name": "saminfo/register-program",
            "description": "Price a program registration server-side under the buyer's access tier and open a Stripe Checkout Session. Nothing is granted until payment clears via the verified webhook.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "program_id": {
                        "type": "integer",
                        "description": "SAM program id (required)"
                    },
                    "series_id": {
                        "type": "integer",
                        "description": "Specific series; omit for a bare program/year purchase"
                    },
                    "sku": {
                        "type": "string",
                        "description": "Registration choice: s{series_id}, \"series\", \"year\", or a Bootcamp package key. Omit to resolve from series_id/program_id"
                    },
                    "buyer_email": {
                        "type": "string",
                        "description": "Buyer email; must already be a site user to price as that member"
                    },
                    "seats": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "description": "All seat emails including the buyer's (first). Defaults to [buyer_email]"
                    },
                    "renewal": {
                        "type": "boolean",
                        "description": "Mark as a renewal to reuse an existing entitlement"
                    }
                },
                "required": [
                    "program_id",
                    "buyer_email"
                ]
            }
        },
        {
            "name": "saminfo/register-program-status",
            "description": "Look up a Checkout Session and whether the resulting entry was fulfilled (grants applied).",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "session_id": {
                        "type": "string",
                        "description": "Stripe Checkout Session id (cs_\u2026) returned by register-program"
                    }
                },
                "required": [
                    "session_id"
                ]
            }
        },
        {
            "name": "saminfo/remind-classified-renewal",
            "description": "Email the listing owner a renewal reminder and stamp the reminded date.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    }
                },
                "required": [
                    "id"
                ]
            }
        },
        {
            "name": "saminfo/remove-sync-issue-exclude",
            "description": "Allow the hourly Joomla sync to import this magazine issue again.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "catid": {
                        "type": "integer"
                    },
                    "title": {
                        "type": "string"
                    }
                }
            }
        },
        {
            "name": "saminfo/renew-entitlements",
            "description": "Roll a batch of entitlements forward to a new access-through date \u2014 e.g. renewing a group subscription for a whole team. Sets expiry only; expired-active rows revive, revoked rows stay revoked.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "entitlement_ids": {
                        "type": "array",
                        "items": {
                            "type": "integer"
                        },
                        "description": "Renew exactly these rows"
                    },
                    "program_id": {
                        "type": "integer",
                        "description": "With user_ids/user_emails: renew that program's active rows for those members"
                    },
                    "user_ids": {
                        "type": "array",
                        "items": {
                            "type": "integer"
                        }
                    },
                    "user_emails": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "expires_at": {
                        "type": "string",
                        "description": "New access-through date (Y-m-d, or Y-m-d H:i:s); a bare date means end of that day"
                    }
                },
                "required": [
                    "expires_at"
                ]
            }
        },
        {
            "name": "saminfo/reorder-dept-suppliers",
            "description": "Set the order of a department's Supplier Guide listings by an ordered list of sponsor ids.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "dept": {
                        "type": "string"
                    },
                    "ordered_ids": {
                        "type": "array",
                        "items": {
                            "type": "integer"
                        }
                    }
                },
                "required": [
                    "dept",
                    "ordered_ids"
                ]
            }
        },
        {
            "name": "saminfo/reorder-series",
            "description": "Set the order of a program's series by an ordered list of series ids.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "program_id": {
                        "type": "integer"
                    },
                    "ordered_ids": {
                        "type": "array",
                        "items": {
                            "type": "integer"
                        }
                    }
                },
                "required": [
                    "program_id",
                    "ordered_ids"
                ]
            }
        },
        {
            "name": "saminfo/reorder-videos",
            "description": "Set the order of a series' videos by an ordered list of video ids.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "series_id": {
                        "type": "integer"
                    },
                    "ordered_ids": {
                        "type": "array",
                        "items": {
                            "type": "integer"
                        }
                    }
                },
                "required": [
                    "series_id",
                    "ordered_ids"
                ]
            }
        },
        {
            "name": "saminfo/repair-import-fields",
            "description": "Restore slugs, bylines, deks, leads, and department tags on already-imported posts. Staging only. Does not rewrite listing bylines.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "issue": {
                        "type": "string"
                    },
                    "idml": {
                        "type": "string"
                    },
                    "execute": {
                        "type": "boolean"
                    }
                },
                "required": [
                    "issue"
                ]
            }
        },
        {
            "name": "saminfo/repair-import-photos",
            "description": "Move leaked shared-spread photos (e.g. Nest interiors on Happy Staff) to the article that already owns that cluster. Staging only. Does not re-upload.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "issue": {
                        "type": "string"
                    },
                    "execute": {
                        "type": "boolean"
                    }
                },
                "required": [
                    "issue"
                ]
            }
        },
        {
            "name": "saminfo/repair-import-templates",
            "description": "Restore the default magazine header on leftover feature-hero auto-assigns. Intentional Feature Hero Template picks are kept unless force is true. Staging only. --issue required to write.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "issue": {
                        "type": "string"
                    },
                    "execute": {
                        "type": "boolean"
                    },
                    "force": {
                        "type": "boolean"
                    }
                },
                "required": [
                    "issue"
                ]
            }
        },
        {
            "name": "saminfo/reply-board-request",
            "description": "Add a reply to a request. Held for moderation before it appears.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "content": {
                        "type": "string"
                    }
                },
                "required": [
                    "id",
                    "content"
                ]
            }
        },
        {
            "name": "saminfo/request-account-link",
            "description": "Email a single-use magic link to connect a SimpleCirc subscription and sign in. Never reveals whether the email matches a subscriber.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "email": {
                        "type": "string"
                    }
                },
                "required": [
                    "email"
                ]
            }
        },
        {
            "name": "saminfo/request-account-link-by-number",
            "description": "Secondary sign-in for subscribers with no email on file: verify by account number + ZIP, then email a single-use sign-in link to the address provided (or the one on file). Never reveals whether the details matched.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "account": {
                        "type": "string"
                    },
                    "zip": {
                        "type": "string"
                    },
                    "email": {
                        "type": "string"
                    }
                },
                "required": [
                    "account",
                    "zip"
                ]
            }
        },
        {
            "name": "saminfo/resolve-board-request",
            "description": "Set a request open or resolved. Author or editor only.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "status": {
                        "type": "string",
                        "enum": [
                            "open",
                            "resolved"
                        ]
                    }
                },
                "required": [
                    "id"
                ]
            }
        },
        {
            "name": "saminfo/revoke-program-access",
            "description": "Revoke a specific entitlement row, or all of a user's rows for a series/program.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "entitlement_id": {
                        "type": "integer",
                        "description": "Revoke exactly this row"
                    },
                    "user_id": {
                        "type": "integer"
                    },
                    "user_email": {
                        "type": "string"
                    },
                    "series_id": {
                        "type": "integer"
                    },
                    "program_id": {
                        "type": "integer"
                    },
                    "reason": {
                        "type": "string"
                    }
                }
            }
        },
        {
            "name": "saminfo/save-search",
            "description": "Save a category + query so the user gets daily alerts on new matches.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "cat": {
                        "type": "string"
                    },
                    "q": {
                        "type": "string"
                    }
                }
            }
        },
        {
            "name": "saminfo/save-video-template",
            "description": "Create or update a Remotion video-ad template (option-backed, keyed by slug).",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "slug": {
                        "type": "string"
                    },
                    "label": {
                        "type": "string"
                    },
                    "composition": {
                        "type": "string"
                    }
                },
                "required": []
            }
        },
        {
            "name": "saminfo/search",
            "description": "Federated search across articles, classifieds, and the community board. Hybrid keyword + semantic when configured; falls back to keyword search otherwise.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "q": {
                        "type": "string"
                    },
                    "type": {
                        "type": "string",
                        "enum": [
                            "post",
                            "page",
                            "sam_classified",
                            "sam_board_request"
                        ]
                    },
                    "count": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 30
                    }
                },
                "required": [
                    "q"
                ]
            }
        },
        {
            "name": "saminfo/search-articles",
            "description": "Full-text/semantic search across published articles. Returns ranked article cards.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "q": {
                        "type": "string",
                        "description": "Search query"
                    },
                    "count": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 50
                    }
                },
                "required": [
                    "q"
                ]
            }
        },
        {
            "name": "saminfo/search-events",
            "description": "Search all events on the SAM industry calendar by title, description, or location. Covers every date, not just the current month.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "q": {
                        "type": "string",
                        "description": "Search term."
                    },
                    "limit": {
                        "type": "integer",
                        "description": "Max results (1\u201350)."
                    }
                },
                "required": [
                    "q"
                ]
            }
        },
        {
            "name": "saminfo/set-ad-placement",
            "description": "Create or update a placement rule: a position, a location hook, optional targeting conditions, priority, and enabled flag.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer",
                        "description": "Omit/0 to create"
                    },
                    "post_title": {
                        "type": "string"
                    },
                    "position_slug": {
                        "type": "string"
                    },
                    "hook": {
                        "type": "string",
                        "description": "before_content | after_paragraph | after_content | sidebar_top | homepage_leaderboard | dept_top"
                    },
                    "paragraph": {
                        "type": "integer"
                    },
                    "priority": {
                        "type": "integer"
                    },
                    "enabled": {
                        "type": "boolean"
                    },
                    "cond_post_types": {
                        "type": "string",
                        "description": "CSV of post types"
                    },
                    "cond_departments": {
                        "type": "string",
                        "description": "CSV of department slugs"
                    },
                    "cond_categories": {
                        "type": "string",
                        "description": "CSV of category slugs"
                    },
                    "cond_tags": {
                        "type": "string",
                        "description": "CSV of tag slugs"
                    },
                    "cond_front_page": {
                        "type": "boolean"
                    },
                    "cond_url": {
                        "type": "string"
                    }
                },
                "required": [
                    "position_slug",
                    "hook"
                ]
            }
        },
        {
            "name": "saminfo/set-article-mid-ad",
            "description": "Flip the site-wide magazine/news mid-article slot between Mid-Article Leaderboard (unsold default) and Article Mid Parallax (sold).",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "format": {
                        "type": "string",
                        "enum": [
                            "leaderboard",
                            "parallax"
                        ],
                        "description": "leaderboard (unsold) or parallax (sold)"
                    }
                },
                "required": [
                    "format"
                ]
            }
        },
        {
            "name": "saminfo/set-auto-renew",
            "description": "Toggle auto-renew on the signed-in member's subscription.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "on": {
                        "type": "boolean"
                    }
                },
                "required": [
                    "on"
                ]
            }
        },
        {
            "name": "saminfo/set-board-boost",
            "description": "Set a request boost to none, requested, or active ($50 Emergency Boost).",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "status": {
                        "type": "string",
                        "enum": [
                            "none",
                            "requested",
                            "active"
                        ]
                    }
                },
                "required": [
                    "id",
                    "status"
                ]
            }
        },
        {
            "name": "saminfo/set-cover-story",
            "description": "Mark or unmark a post as this issue's Cover Story. Best-effort one per issue when the post is published: turning it on clears sibling flags the current user can edit (edit_post). Unpublished targets do not clear live siblings; exclusivity runs on publish. Flags on posts the user cannot edit stay. Returns siblings_cleared false when any flagged sibling remains.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "post_id": {
                        "type": "integer"
                    },
                    "on": {
                        "type": "boolean"
                    }
                },
                "required": [
                    "post_id",
                    "on"
                ]
            }
        },
        {
            "name": "saminfo/set-event-landing",
            "description": "Link a calendar event to a related program page (or clear the link). Does not redirect the event.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "event_id": {
                        "type": "integer"
                    },
                    "target": {
                        "type": "string",
                        "description": "Page ID or absolute URL. Empty string clears the related page."
                    }
                },
                "required": [
                    "event_id",
                    "target"
                ]
            }
        },
        {
            "name": "saminfo/set-hero-pool",
            "description": "Replace the homepage hero pin pool (max 3). Empty list restores cover-story / latest fallback. Front end shows one story per load, not a slider.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "post_ids": {
                        "type": "array",
                        "items": {
                            "type": "integer"
                        }
                    }
                },
                "required": [
                    "post_ids"
                ]
            }
        },
        {
            "name": "saminfo/set-issue-cover",
            "description": "Set or clear the dedicated magazine cover (issue_cover term meta). attachment_id 0 clears. Flushes the issue wall cache.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "term_id": {
                        "type": "integer"
                    },
                    "attachment_id": {
                        "type": "integer"
                    }
                },
                "required": [
                    "term_id",
                    "attachment_id"
                ]
            }
        },
        {
            "name": "saminfo/set-password",
            "description": "Set the signed-in member's password so they can sign in with a password instead of a magic link.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "password": {
                        "type": "string",
                        "minLength": 8
                    }
                },
                "required": [
                    "password"
                ]
            }
        },
        {
            "name": "saminfo/set-position-pin",
            "description": "Force which creative fills a position (creative_id 0 = clear \u2192 normal rotation).",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "slug": {
                        "type": "string"
                    },
                    "creative_id": {
                        "type": "integer"
                    }
                },
                "required": [
                    "slug"
                ]
            }
        },
        {
            "name": "saminfo/set-program-pricing",
            "description": "Set a program's optional bundle prices (cents; -1 = not sold as a bundle), survey form, and playback defaults.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "program_id": {
                        "type": "integer"
                    },
                    "member_bundle_price_cents": {
                        "type": "integer",
                        "description": "-1 = not sold as a bundle"
                    },
                    "nonmember_bundle_price_cents": {
                        "type": "integer",
                        "description": "-1 = not sold as a bundle"
                    },
                    "survey_gf_form_id": {
                        "type": "integer"
                    },
                    "autoplay_default": {
                        "type": "boolean"
                    },
                    "resume_mode": {
                        "type": "string",
                        "enum": [
                            "prompt",
                            "autoseek"
                        ]
                    }
                },
                "required": [
                    "program_id"
                ]
            }
        },
        {
            "name": "saminfo/set-series-pricing-and-access",
            "description": "Set a series' member/non-member prices (cents), members-free flag, and access policy.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "series_id": {
                        "type": "integer"
                    },
                    "member_price_cents": {
                        "type": "integer"
                    },
                    "nonmember_price_cents": {
                        "type": "integer"
                    },
                    "members_free": {
                        "type": "boolean"
                    },
                    "access_policy": {
                        "type": "string",
                        "enum": [
                            "duration",
                            "fixed",
                            "never"
                        ]
                    },
                    "access_duration_days": {
                        "type": "integer",
                        "description": "Required when access_policy=duration"
                    },
                    "access_fixed_date": {
                        "type": "string",
                        "description": "Y-m-d; required when access_policy=fixed"
                    }
                },
                "required": [
                    "series_id"
                ]
            }
        },
        {
            "name": "saminfo/set-video-poster-frame",
            "description": "Capture a frame of the video at a given time (seconds) and set it as the poster \u2014 sideloaded into the media library so it is public and permanent.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "video_id": {
                        "type": "integer"
                    },
                    "time_s": {
                        "type": "number",
                        "description": "Seconds into the video to capture"
                    }
                },
                "required": [
                    "video_id",
                    "time_s"
                ]
            }
        },
        {
            "name": "saminfo/split-bylines",
            "description": "Preview or apply splitting glued co-byline accounts into one user per person. commit defaults false.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "commit": {
                        "type": "boolean"
                    },
                    "limit": {
                        "type": "integer"
                    },
                    "user_id": {
                        "type": "integer"
                    },
                    "post_id": {
                        "type": "integer"
                    }
                }
            }
        },
        {
            "name": "saminfo/submit-board-request",
            "description": "Create a \"wanted\" request (parts, equipment, technical help, other). Posts as pending for moderation.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "title": {
                        "type": "string"
                    },
                    "body": {
                        "type": "string"
                    },
                    "topic": {
                        "type": "string",
                        "enum": [
                            "snowmaking",
                            "grooming",
                            "lifts",
                            "other",
                            "technical-help"
                        ]
                    },
                    "willing_to_pay": {
                        "type": "boolean"
                    },
                    "region": {
                        "type": "string",
                        "enum": [
                            "",
                            "Canada East",
                            "Canada West",
                            "Pacific Northwest",
                            "Pacific Southwest",
                            "Rocky Mountain",
                            "Midwest",
                            "Northeast",
                            "Southeast",
                            "International"
                        ]
                    }
                },
                "required": [
                    "title",
                    "body",
                    "topic"
                ]
            }
        },
        {
            "name": "saminfo/submit-classified",
            "description": "Create a pending classified listing (employment, equipment, real estate, \u2026). Publishes after review + payment.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "title": {
                        "type": "string"
                    },
                    "description": {
                        "type": "string"
                    },
                    "category": {
                        "type": "string",
                        "enum": [
                            "employment",
                            "lifts-equipment",
                            "grooming-vehicles",
                            "snowmaking-equipment",
                            "general-area-equipment",
                            "ski-snowboard-rental",
                            "resort-real-estate",
                            "free-stuff"
                        ]
                    },
                    "employer": {
                        "type": "string"
                    },
                    "department": {
                        "type": "string",
                        "enum": [
                            "",
                            "accounting",
                            "construction-project-management",
                            "food-beverage",
                            "guest-service",
                            "human-resources-admin",
                            "it",
                            "marketing-communications",
                            "miscellaneous",
                            "mountain-operations",
                            "rental-retail",
                            "resort-management",
                            "ski-patrol",
                            "snowsports-school",
                            "terrain-park",
                            "trail-maintenance",
                            "lift",
                            "grooming",
                            "snowmaking",
                            "technology"
                        ]
                    },
                    "region": {
                        "type": "string",
                        "enum": [
                            "",
                            "Canada East",
                            "Canada West",
                            "Pacific Northwest",
                            "Pacific Southwest",
                            "Rocky Mountain",
                            "Midwest",
                            "Northeast",
                            "Southeast",
                            "International"
                        ]
                    },
                    "employment_type": {
                        "type": "string",
                        "enum": [
                            "",
                            "Full-time, year-round",
                            "Full-time, seasonal",
                            "Part-time, year-round",
                            "Part-time, seasonal"
                        ]
                    },
                    "price": {
                        "type": "string"
                    },
                    "contact_email": {
                        "type": "string"
                    },
                    "apply_url": {
                        "type": "string"
                    }
                },
                "required": [
                    "title",
                    "description",
                    "category"
                ]
            }
        },
        {
            "name": "saminfo/submit-program-feedback",
            "description": "Record the current user\u2019s end-of-program feedback (overall rating, recommend score, and comments) as a Gravity Forms entry.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "program_id": {
                        "type": "integer"
                    },
                    "rating": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 5
                    },
                    "nps": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 10
                    },
                    "valuable": {
                        "type": "string"
                    },
                    "improve": {
                        "type": "string"
                    },
                    "other": {
                        "type": "string"
                    }
                },
                "required": [
                    "program_id",
                    "rating"
                ]
            }
        },
        {
            "name": "saminfo/subscribe-newsletter",
            "description": "Add a contact to the SAM newsletter (MailerLite). Upserts \u2014 a repeat email is updated, not duplicated.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "email": {
                        "type": "string",
                        "format": "email"
                    },
                    "name": {
                        "type": "string"
                    }
                },
                "required": [
                    "email"
                ]
            }
        },
        {
            "name": "saminfo/tag-review-report",
            "description": "Published posts missing department post_tags, import-flagged first, with keyword tag suggestions.",
            "inputSchema": {
                "type": "object"
            }
        },
        {
            "name": "saminfo/test-render-video",
            "description": "Preview a video template using a sponsor's assets without landing a creative.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "template": {
                        "type": "string"
                    },
                    "sponsor_id": {
                        "type": "integer"
                    }
                },
                "required": []
            }
        },
        {
            "name": "saminfo/trash-imported-excluded-issue-posts",
            "description": "Move already-imported Joomla posts for one excluded magazine issue to trash. Manual uploads without a Joomla id are left alone. Restore with wp_untrash_post().",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "title": {
                        "type": "string",
                        "description": "Excluded issue title, e.g. September 2026"
                    },
                    "dry_run": {
                        "type": "boolean",
                        "description": "List matching posts without trashing"
                    }
                },
                "required": [
                    "title"
                ]
            }
        },
        {
            "name": "saminfo/unimport-issue",
            "description": "Trash Import Issue drafts (`_sam_layout`) for one publication_issue. Does not restore Joomla copies or trash news/hand-built posts. Staging only. --issue required.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "issue": {
                        "type": "string"
                    },
                    "execute": {
                        "type": "boolean"
                    }
                },
                "required": [
                    "issue"
                ]
            }
        },
        {
            "name": "saminfo/update-address",
            "description": "Update the signed-in member's mailing address in SimpleCirc.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "address_1": {
                        "type": "string"
                    },
                    "address_2": {
                        "type": "string"
                    },
                    "city": {
                        "type": "string"
                    },
                    "state": {
                        "type": "string"
                    },
                    "zipcode": {
                        "type": "string"
                    },
                    "country": {
                        "type": "string"
                    }
                }
            }
        },
        {
            "name": "saminfo/update-board-request",
            "description": "Moderator edit of a request: title, topic, details, publish/request status, region, boost.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "post_title": {
                        "type": "string"
                    },
                    "topic": {
                        "type": "string",
                        "enum": [
                            "snowmaking",
                            "grooming",
                            "lifts",
                            "other",
                            "technical-help"
                        ]
                    },
                    "status": {
                        "type": "string"
                    },
                    "request_status": {
                        "type": "string",
                        "enum": [
                            "open",
                            "resolved"
                        ]
                    }
                },
                "required": [
                    "id"
                ]
            }
        },
        {
            "name": "saminfo/update-campaign",
            "description": "Edit an insertion order.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "post_title": {
                        "type": "string"
                    },
                    "sponsor_id": {
                        "type": "integer"
                    },
                    "campaign_status": {
                        "type": "string"
                    }
                },
                "required": [
                    "id"
                ]
            }
        },
        {
            "name": "saminfo/update-campaign-status",
            "description": "Set a campaign's lifecycle status: draft, live, paused, or complete. Live campaigns serve; paused/complete/draft do not.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "campaign_id": {
                        "type": "integer"
                    },
                    "status": {
                        "type": "string",
                        "enum": [
                            "draft",
                            "live",
                            "paused",
                            "complete"
                        ]
                    }
                },
                "required": [
                    "campaign_id",
                    "status"
                ]
            }
        },
        {
            "name": "saminfo/update-classified",
            "description": "Edit a listing's fields, category, or status.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "post_title": {
                        "type": "string"
                    },
                    "status": {
                        "type": "string"
                    },
                    "department": {
                        "type": "string",
                        "enum": [
                            "",
                            "accounting",
                            "construction-project-management",
                            "food-beverage",
                            "guest-service",
                            "human-resources-admin",
                            "it",
                            "marketing-communications",
                            "miscellaneous",
                            "mountain-operations",
                            "rental-retail",
                            "resort-management",
                            "ski-patrol",
                            "snowsports-school",
                            "terrain-park",
                            "trail-maintenance",
                            "lift",
                            "grooming",
                            "snowmaking",
                            "technology"
                        ],
                        "description": "Employment department slug. Lift and Grooming landing pages match lift and grooming."
                    }
                },
                "required": [
                    "id"
                ]
            }
        },
        {
            "name": "saminfo/update-contact",
            "description": "Update the signed-in member's name, company, title, phone, or email in SimpleCirc.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "first_name": {
                        "type": "string"
                    },
                    "last_name": {
                        "type": "string"
                    },
                    "company": {
                        "type": "string"
                    },
                    "title": {
                        "type": "string"
                    },
                    "phone": {
                        "type": "string"
                    },
                    "email": {
                        "type": "string"
                    }
                }
            }
        },
        {
            "name": "saminfo/update-creative",
            "description": "Edit a creative variant.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "post_title": {
                        "type": "string"
                    },
                    "campaign_id": {
                        "type": "integer"
                    },
                    "creative_type": {
                        "type": "string",
                        "enum": [
                            "image",
                            "video",
                            "html"
                        ]
                    },
                    "attachment_id": {
                        "type": "integer"
                    },
                    "poster_id": {
                        "type": "integer"
                    },
                    "positions": {
                        "type": "string",
                        "description": "CSV of position slugs this creative may serve in"
                    },
                    "click_url": {
                        "type": "string"
                    },
                    "cta_text": {
                        "type": "string"
                    },
                    "variant_label": {
                        "type": "string"
                    },
                    "weight": {
                        "type": "integer"
                    },
                    "is_paused": {
                        "type": "boolean"
                    },
                    "parallax_height": {
                        "type": "integer",
                        "description": "Parallax band min-height in px (0 = position default)"
                    },
                    "parallax_logo_id": {
                        "type": "integer",
                        "description": "Optional logo override attachment ID"
                    },
                    "parallax_logo_max_width": {
                        "type": "integer",
                        "description": "Logo chip max width in px (0 = 200)"
                    },
                    "parallax_logo_height": {
                        "type": "integer",
                        "description": "Logo chip height in px (0 = 44)"
                    },
                    "parallax_logo_align": {
                        "type": "string",
                        "enum": [
                            "left",
                            "center",
                            "right"
                        ]
                    },
                    "parallax_show_logo": {
                        "type": "boolean"
                    },
                    "parallax_hide_label": {
                        "type": "boolean"
                    }
                },
                "required": [
                    "id"
                ]
            }
        },
        {
            "name": "saminfo/update-position",
            "description": "Edit an inventory position.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "label": {
                        "type": "string"
                    }
                },
                "required": [
                    "id"
                ]
            }
        },
        {
            "name": "saminfo/update-sponsor",
            "description": "Edit an advertiser record. Set sponsor_context_bodies or sponsor_guide_scope+sponsor_guide_body for a Cutter's Camp (or other page) blurb that differs from the default.",
            "inputSchema": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "post_title": {
                        "type": "string"
                    },
                    "sponsor_click_url": {
                        "type": "string"
                    },
                    "sponsor_body": {
                        "type": "string",
                        "description": "Default description for native cards and Supplier Guide listings."
                    },
                    "sponsor_premium": {
                        "type": "boolean"
                    },
                    "sponsor_dept_lock": {
                        "type": "string",
                        "description": "CSV of department/program tags to list this sponsor under in the Supplier Guide, e.g. \"lifts,cutters-camp\". Valid tags: grooming, leadership, lifts, snowmaking, summer, sustainability, technology, cutters-camp"
                    },
                    "sponsor_context_bodies": {
                        "type": "string",
                        "description": "JSON object of Supplier Guide scope slug \u2192 page-specific description. Empty/omitted keys fall back to sponsor_body. Example: {\"cutters-camp\":\"Hands-on grooming training partner.\"}"
                    },
                    "sponsor_guide_scope": {
                        "type": "string",
                        "description": "Department/program slug to patch one page-specific blurb (e.g. cutters-camp)."
                    },
                    "sponsor_guide_body": {
                        "type": "string",
                        "description": "Description for sponsor_guide_scope. Used with sponsor_guide_override."
                    },
                    "sponsor_guide_override": {
                        "type": "boolean",
                        "description": "True (default when scope+body sent): store as page-specific copy. False: clear that override and write sponsor_body."
                    }
                },
                "required": [
                    "id"
                ]
            }
        },
        {
            "name": "saminfo/view-subscription",
            "description": "Read the signed-in member's own subscriber record and subscription status from SimpleCirc.",
            "inputSchema": {
                "type": "object",
                "properties": []
            }
        }
    ]
}