{"name":"sendifai","description":"sendifai — AI-native platform for churches and nonprofits. 949 curated workflow MCP tools + 1967 dashboard API routes via scoped invoke bridges + 7841 in-chat MCP App widgets (ui://sendifai/w/{widgetId}). Layered discovery: platform_search_tools → workflow tool OR platform_search_dashboard_api → {module}_invoke_api_read/_write. Guide: /agents","version":5,"discovery":{"pattern":"layered","layers":[{"id":"workflow","description":"~140 curated workflow tools on tools/list. Prefer these — they enforce billing, care timeline sync, and metered sends.","toolCount":949,"entrypoint":"platform_search_tools"},{"id":"routes","description":"1967+ dashboard API routes for the long tail (builders, settings, AI studio).","toolCount":1967,"entrypoint":"platform_search_dashboard_api"}],"workflow":["1. platform_overview — orient","2. platform_search_tools — find a workflow tool OR platform_search_dashboard_api — find a route","3. Call the tool directly, or {module}_invoke_api_read/_write for routes"],"entrypoints":["platform_search_tools","platform_search_dashboard_api","platform_list_tools"],"invokeTools":["platform_invoke_dashboard_api_read","platform_invoke_dashboard_api_write","people_invoke_api_read","people_invoke_api_write","grow_invoke_api_read","grow_invoke_api_write","giving_invoke_api_read","giving_invoke_api_write","spaces_invoke_api_read","spaces_invoke_api_write","mediahub_invoke_api_read","mediahub_invoke_api_write","live_invoke_api_read","live_invoke_api_write","store_invoke_api_read","store_invoke_api_write","community_invoke_api_read","community_invoke_api_write","channels_invoke_api_read","channels_invoke_api_write","guests_invoke_api_read","guests_invoke_api_write","runsheet_invoke_api_read","runsheet_invoke_api_write","ticketing_invoke_api_read","ticketing_invoke_api_write","templates_invoke_api_read","templates_invoke_api_write","groups_invoke_api_read","groups_invoke_api_write","billing_invoke_api_read","billing_invoke_api_write","schedule_invoke_api_read","schedule_invoke_api_write","attendance_invoke_api_read","attendance_invoke_api_write","platform_ai_invoke_api_read","platform_ai_invoke_api_write","platform_settings_invoke_api_read","platform_settings_invoke_api_write","platform_admin_invoke_api_read","platform_admin_invoke_api_write","platform_portal_invoke_api_read","platform_portal_invoke_api_write"],"totalTools":999,"workflowTools":949,"dashboardRoutes":1967},"authentication":{"type":"bearer","header":"Authorization: Bearer <oauth_access_token_or_sk_live_…>","instructions":"OAuth via MCP discovery (PKCE). Pass intent=sms, intent=pastoral, etc. — GET /api/oauth/intents. Fallback: Settings → API Keys.","oauth":{"protected_resource":"/.well-known/oauth-protected-resource","authorization_server":"/.well-known/oauth-authorization-server","intent_bundles":"/api/oauth/intents","example_intents":["sms","email","spaces","pastoral","giving","runsheet","team","platform"]}},"endpoint":"/api/mcp","transport":"streamable-http","scopes":["platform:read","platform:write","people:read","people:write","community:read","community:write","giving:read","giving:write","grow:read","grow:write","spaces:read","spaces:write","channels:read","channels:send","ticketing:read","ticketing:write","ticketing:refund","mediahub:read","mediahub:write","live:read","live:write","guests:read","guests:write","runsheet:read","runsheet:write","billing:read","billing:write","store:read","store:write","templates:read","templates:write","groups:read","groups:write","attendance:read","attendance:write","schedule:read","schedule:write","people:safeguarding","audit:read"],"modules":[{"module":"platform","description":"Platform overview, usage/billing state, agents, proposals. Discovery: platform_search_tools (workflow) + platform_search_dashboard_api (1967+ routes incl. admin panel & member portal). Execute via {module}_invoke_api_read/_write or platform_admin_invoke_api_read/_write / platform_portal_invoke_api_read/_write. Superadmin excluded. Start with platform_overview.","toolCount":42,"tools":[{"name":"platform_overview","description":"One-call snapshot of the organization: total CRM contact count (all statuses), community roster size, giving this month, active automations, published forms and landing pages, upcoming events, bookings, and service plans. Call this first to orient yourself. people.contacts = total CRM contacts; people.communityMembers = Community roster only.","scope":"platform:read"},{"name":"platform_list_agents","description":"List the organization's autonomous platform agents (People, Pastoral Care, Giving, Grow, Spaces, Ticketing, Guests, Runsheet, MediaHub, Channels, Live) with their autonomy mode and last run.","scope":"platform:read"},{"name":"platform_pending_proposals","description":"List pending agent proposals awaiting human approval. Use platform_approve_proposal or platform_reject_proposal (platform:write) to act on them.","scope":"platform:read"},{"name":"platform_usage","description":"Current pay-per-use billing state: usage vs allowance for every feature slider (email sends, messaging credits, contacts, runsheet access seats, donations, tickets, check-ins, rooms, streams, media items), so you know the remaining budget before taking actions that consume usage.","scope":"platform:read"},{"name":"platform_get_brand_voice","description":"Get organization brand voice: saved profile (if any), effective template fallback for the org type, full starter template library (29 presets), and suggestedTemplateId. Read sendifai://docs/brand-voice-templates.","scope":"platform:read"},{"name":"platform_apply_brand_voice_template","description":"Apply a starter brand voice template for the organization (free — no credits). Customize afterward via POST /api/ai/brand-voice update_profile or dashboard Settings → Isla → Brand Voice.","scope":"platform:write"},{"name":"platform_list_media_library_files","description":"List org Media Library files at /media (logos, posters, brand images, documents) — table media_library, NOT Media Hub published content. Use for church logo, event artwork, or uploaded assets. For sermons/podcasts use mediahub_list_media_items. If the user says \"media library\" or \"logo\", prefer this tool over Media Hub.","scope":"platform:read"},{"name":"platform_get_media_library_file","description":"Get one org Media Library file by id — CDN url, dimensions, mimeType. Use after platform_complete_media_library_upload or when you already have a media_library UUID.","scope":"platform:read"},{"name":"platform_begin_media_library_upload","description":"Step 1 for local files (flyers, logos): reserve an upload slot and get a presigned uploadUrl. REQUIRED: fileName + fileSize (bytes). Do NOT pass file bytes in MCP args — PUT raw bytes to uploadUrl (Claude in Chrome fetch PUT, curl, or dashboard). Then platform_complete_media_library_upload. Preferred over base64 for any real image.","scope":"platform:write"},{"name":"platform_complete_media_library_upload","description":"Step 2 after PUTting file bytes to uploadUrl from platform_begin_media_library_upload. REQUIRED: mediaId + sessionId from step 1. Returns emailImageUrl for channels_send_email. Optional isPublic (default true for email), altText, displayName.","scope":"platform:write"},{"name":"platform_upload_media_library_file","description":"One-shot upload when bytes are already available without blowing context: sourceUrl (public HTTPS) OR tiny base64Content (max 64KB decoded). For local flyer/logo files use platform_begin_media_library_upload → PUT uploadUrl → platform_complete_media_library_upload instead. Returns emailImageUrl on media.sendifai.com. NOT Media Hub.","scope":"platform:write"},{"name":"platform_list_team_members","description":"List organization team members with human-readable role labels. Same data as Settings → Team. Requires platform:read.","scope":"platform:read"},{"name":"platform_list_team_roles","description":"List assignable team roles for this organization (labels + descriptions). Call before platform_invite_team_member to pick the right role id. Requires platform:read.","scope":"platform:read"},{"name":"platform_invite_team_member","description":"Send a team invite email — same as Settings → Team → Invite. Replaces any existing pending invite for the same email automatically (one live invite per address). Requires platform:write. Use role ids from platform_list_team_roles (e.g. finance, admin).","scope":"platform:write"},{"name":"platform_list_pending_team_invites","description":"List pending team invites (Settings → Team → Pending Invites). Requires platform:read. Use before platform_resend_team_invite when you need an invite id.","scope":"platform:read"},{"name":"platform_resend_team_invite","description":"Resend a pending team invite email (Settings → Team → Resend). Pass inviteId OR email — if email only, resends the pending invite for that address. Requires platform:write.","scope":"platform:write"},{"name":"platform_cancel_team_invite","description":"Cancel a pending organization team invite — same as Settings → Team → Cancel invite. Frees the pending slot for that email. Requires platform:write.","scope":"platform:write"},{"name":"platform_remove_team_member","description":"Remove a team member from the organization — same as Settings → Team → Remove. Requires owner or admin. Cannot remove yourself or the last owner. Prefer this over invoke DELETE on /api/team/members/{id}.","scope":"platform:write"},{"name":"platform_update_team_member_role","description":"Change a team member's role — same as Settings → Team → Edit role. Requires team:manage permission. Prefer this over invoke PATCH on /api/team/members/{id}.","scope":"platform:write"},{"name":"platform_get_proposal","description":"Get full details of an agent proposal including the action payload.","scope":"platform:read"},{"name":"platform_approve_proposal","description":"Approve and execute a pending agent proposal. Requires owner/admin API key with platform:write scope.","scope":"platform:write"},{"name":"platform_reject_proposal","description":"Reject a pending agent proposal without executing it.","scope":"platform:write"},{"name":"platform_search_tools","description":"Search curated workflow tools by natural language (e.g. \"family relationships\", \"pastoral notes\", \"book a room\", \"delete SMS sender\", \"invite team member as finance\"). Returns tool names only — schemas are on tools/list. Prefer this over platform_search_dashboard_api whenever a workflow tool exists — especially for SMS sender ID management and team invites.","scope":"platform:read"},{"name":"platform_list_tools","description":"List workflow MCP tools available to this credential, optionally filtered by module. For the full dashboard API surface, use platform_search_dashboard_api.","scope":"platform:read"},{"name":"platform_inspect_tools","description":"Fetch JSON input schemas for up to 10 tools by name. Rarely needed — workflow tool schemas are already on tools/list. Useful for agent bridges that do not receive native MCP schemas.","scope":"platform:read"},{"name":"platform_session_tools","description":"List workflow tools available to THIS session (OAuth intent + scopes). Use when tools/list shows tools you cannot call — returns only permitted tools for your credential.","scope":"platform:read"},{"name":"platform_execute_workflow_tool","description":"Execute any sendifai workflow MCP tool by name — full parity with Claude 988-tool catalog. Use platform_search_tools or platform_list_tools to find toolName, platform_inspect_tools for argument schema, then call here. Do not use for dashboard invoke tools (*_invoke_api_*).","scope":"platform:read"},{"name":"platform_report_capability_gap","description":"Report when you cannot answer a user question because no workflow tool exists or data is unreliable. Platform Intelligence queues new tools and discovery fixes — call this instead of telling the user the platform lacks the feature.","scope":"platform:read"},{"name":"platform_analytics_query","description":"Run whitelisted analytics metrics in one call: total_contacts, contacts_by_membership_status, count_unsubscribes, top_donors, giving_total, attendance_total, first_time_visitors, contacts_by_status, weekly_trend_attendance, weekly_trend_giving. Prefer this over paginating list tools or audit logs. total_contacts = all CRM contacts (every status). contacts_by_membership_status = welcome-desk lifecycle (member, volunteer, etc.) — not the same as total. Always relay speakToUser.","scope":"platform:read"},{"name":"platform_search_dashboard_api","description":"Search 1967+ staff dashboard, admin panel, member portal, and cron API routes. Returns matching paths and methods — pair with the scoped `{module}_invoke_api_read` / `_write` tools. Superadmin routes are excluded. Prefer platform_search_tools first — many actions (team invites, campaigns, giving, notes, billing) have curated workflow tools and must NOT use invoke.","scope":"platform:read"},{"name":"platform_invoke_dashboard_api_read","description":"Full dashboard parity: GET any catalogued route (1936+ paths — all modules, settings, team, billing). OAuth-authenticated = same as logged-in dashboard. Prefer workflow tools when available.","scope":"platform:read"},{"name":"platform_invoke_dashboard_api_write","description":"Full dashboard parity: POST/PUT/PATCH/DELETE any catalogued route. REQUIRED: actionSummary in plain English (shown in the user approval dialog). Prefer curated workflow tools (platform_search_tools) for team invites, campaigns, giving, notes, billing — 405 means wrong tool, not human review.","scope":"platform:write"},{"name":"platform_ai_invoke_api_read","description":"Invoke AI studio APIs: content generation, campaign AI, personalization, video-to-campaign. GET-only read bridge for this module's dashboard API long tail.","scope":"platform:read"},{"name":"platform_ai_invoke_api_write","description":"Invoke AI studio APIs: content generation, campaign AI, personalization, video-to-campaign. Mutation bridge (POST, PUT, PATCH, DELETE) for this module's dashboard API long tail. REQUIRED: fill actionSummary in plain English — it appears in the user's approval dialog.","scope":"platform:write"},{"name":"platform_settings_invoke_api_read","description":"Invoke org settings, billing, team, analytics, cron jobs, and autonomous agent config APIs. Team invites, billing checkout/portal, and notes use curated workflow tools — not invoke. GET-only read bridge for this module's dashboard API long tail.","scope":"platform:read"},{"name":"platform_settings_invoke_api_write","description":"Invoke org settings, billing, team, analytics, cron jobs, and autonomous agent config APIs. Team invites, billing checkout/portal, and notes use curated workflow tools — not invoke. Mutation bridge (POST, PUT, PATCH, DELETE) for this module's dashboard API long tail. REQUIRED: fill actionSummary in plain English — it appears in the user's approval dialog.","scope":"platform:write"},{"name":"platform_admin_invoke_api_read","description":"Invoke company admin panel APIs (users, orgs, subscriptions, support, feature flags). Requires platform admin RBAC. GET-only read bridge for this module's dashboard API long tail.","scope":"platform:read"},{"name":"platform_admin_invoke_api_write","description":"Invoke company admin panel APIs (users, orgs, subscriptions, support, feature flags). Requires platform admin RBAC. Mutation bridge (POST, PUT, PATCH, DELETE) for this module's dashboard API long tail. REQUIRED: fill actionSummary in plain English — it appears in the user's approval dialog.","scope":"platform:write"},{"name":"platform_portal_invoke_api_read","description":"Invoke member portal APIs (/api/portal/{orgId}/...) and portal admin (/api/portal/admin/...). Staff OAuth bridges member auth. GET-only read bridge for this module's dashboard API long tail.","scope":"platform:read"},{"name":"platform_portal_invoke_api_write","description":"Invoke member portal APIs (/api/portal/{orgId}/...) and portal admin (/api/portal/admin/...). Staff OAuth bridges member auth. Mutation bridge (POST, PUT, PATCH, DELETE) for this module's dashboard API long tail. REQUIRED: fill actionSummary in plain English — it appears in the user's approval dialog.","scope":"platform:write"},{"name":"platform_route_catalog","description":"Report dashboard API catalog size (1967+ routes) and invoke tool map for agents.","scope":"platform:read"},{"name":"platform_proactive_alerts","description":"AI-generated proactive alerts across the whole organization (native AI tier only).","scope":"platform:read"}]},{"module":"people","description":"CRM contacts: search, create, update, family relationships, care timeline, pastoral notes (/community/care/notes), Welcome Desk visitors, segments, tags, CRM groups (people_list_crm_groups — ministry teams). NOT the same as groups_list (Small Groups module). Long tail: people_invoke_api_read / _write.","toolCount":216,"tools":[{"name":"people_invoke_api_read","description":"Invoke CRM/contacts dashboard APIs (custom fields, segments, data quality, visitors, surveys, family at /api/contacts/{id}/family). Prefer people_list_family and people_add_family_relationship for household links. GET-only read bridge for this module's dashboard API long tail.","scope":"people:read"},{"name":"people_invoke_api_write","description":"Invoke CRM/contacts dashboard APIs (custom fields, segments, data quality, visitors, surveys, family at /api/contacts/{id}/family). Prefer people_list_family and people_add_family_relationship for household links. Mutation bridge (POST, PUT, PATCH, DELETE) for this module's dashboard API long tail. REQUIRED: fill actionSummary in plain English — it appears in the user's approval dialog.","scope":"people:write"},{"name":"people_search_contacts","description":"Search contacts by name, email, phone, or address fields. Supports full list filters (status, tag, segment, group, journey, consent, engagement). Read sendifai://docs/contact-list-filters. Use before people_create_contact to avoid duplicates.","scope":"people:read"},{"name":"people_get_contact","description":"Get full details for one contact by ID, including tags and community membership. For linked family members (spouse, parent, child, sibling), call people_list_family — relationships are stored in contact_family_relationships, not on the contact row alone.","scope":"people:read"},{"name":"people_list_contacts","description":"List contacts with pagination via search_contacts RPC. Supports full list filters (status, tag, segment, group, journey, consent, engagement). Read sendifai://docs/contact-list-filters. For TOTAL contact counts use platform_analytics_query (total_contacts) or platform_overview — never paginate or filter by membershipStatus to guess totals. The response includes a total field when filtered. membershipStatus (welcome desk) is NOT the same as status (marketing/consent). Use people_search_contacts when you have a text query.","scope":"people:read"},{"name":"people_count_unsubscribes","description":"Count how many people unsubscribed in a date range (defaults last 7 days). Uses email unsubscribe events from message history — the reliable source for dated counts. Always relay speakToUser to the user. Do not use audit_list_events for this — audit logs track admin actions, not marketing unsubscribes.","scope":"people:read"},{"name":"people_upcoming_birthdays","description":"Upcoming birthdays with dashboard-eligible contacts plus excluded contacts and reasons (unsubscribed, pastoral opt-out, not on Community roster, outreach already queued, etc.). Always relay speakToUser to the user — explain who you can message and who is excluded with reasonDetail. Never scan all contacts or guess birthdays from names.","scope":"people:read"},{"name":"people_create_contact","description":"Create a new contact with full CRM fields (name, email, phone, dateOfBirth/birthday, address, church dates, familyId household group, tags, customFields, etc.). Provide at least an email or first+last name. For linking two people as family, use people_add_family_relationship after create. Search first with people_search_contacts to avoid duplicates.","scope":"people:write"},{"name":"people_update_contact","description":"Update profile fields on an existing contact: name, preferredName, prefix/title (for Pastor/Mr greetings), dateOfBirth/birthday, gender, address, church dates (baptism, membership, anniversary), tags, status, and custom fields. Only provided fields change. To link family relationships (spouse, parent, child), use people_add_family_relationship — not custom fields.","scope":"people:write"},{"name":"people_bulk_update_contacts","description":"Update multiple contacts in one call (max 50). Ideal for batch tasks like setting birthdays on many people. Each entry needs contactId plus the fields to change.","scope":"people:write"},{"name":"people_bulk_opt_in_whatsapp","description":"Bulk-set whatsapp_consent for contacts with a phone number. Use when congregation numbers were imported but WhatsApp automations show near-zero recipients. Pass allWithPhone:true to update every contact with cell/phone/home/work number in the org.","scope":"people:write"},{"name":"people_delete_contact","description":"Soft-delete a contact (sets deleted_at). Use permanent=true only when GDPR erasure is required. Prefer merge for duplicates.","scope":"people:write"},{"name":"people_list_notes","description":"List pastoral care notes from crm_notes (dashboard: Pastoral Care → Notes at /community/care/notes). Returns team/public notes only — private and confidential notes stay dashboard-only. Includes follow_up_date, follow_up_completed, and confidentiality_level (green/amber/red safeguarding). Newest first.","scope":"people:read"},{"name":"people_add_note","description":"Add a pastoral care note (dashboard: /community/care/notes). Human-readable sentences only — use contact names, never UUIDs or \"(contact …)\" IDs. For family links use people_add_family_relationship, not notes. Syncs to contact_care_timeline. To edit later: people_update_note. To delete: people_remove_note.","scope":"people:write"},{"name":"people_list_family","description":"List family/household relationships for a contact (spouse, parent, child, sibling, grandparent, etc.). Returns linked contacts from the bidirectional contact_family_relationships graph. Dashboard UI: contact detail → Relationships tab. Use people_add_family_relationship to link two existing contacts.","scope":"people:read"},{"name":"people_add_family_relationship","description":"Link two existing contacts as family in contact_family_relationships (shows in People → Relationships tab). Use this instead of custom fields or notes. Example: James as father of Grace → contactId=James UUID, relatedContactId=Grace UUID, relationship=daughter (Grace is James's daughter). Creates bidirectional rows with automatic inverse labels. Search contacts first with people_search_contacts.","scope":"people:write"},{"name":"people_remove_family_relationship","description":"Remove a family link between two contacts (both directions in contact_family_relationships). Use people_list_family to find relatedContactId.","scope":"people:write"},{"name":"people_list_household","description":"List contacts sharing the same flat household group (`family_id` on the contact row). Used by CSV import and segment rules. For spouse/parent/child graph links, use people_list_family instead.","scope":"people:read"},{"name":"people_list_care_timeline","description":"Read combined pastoral care timeline for a contact (notes + interactions from contact_care_timeline and crm_notes). Use after people_list_notes for full history. Dashboard: contact profile timeline.","scope":"people:read"},{"name":"people_complete_note_followup","description":"Mark a pastoral note follow-up as completed (sets follow_up_completed on crm_notes and syncs contact_care_timeline). Use people_list_notes with followUpDueOnly to find open follow-ups.","scope":"people:write"},{"name":"people_update_note","description":"Edit an existing pastoral care note (content, followUpDate, privacy). Use people_list_notes to get noteId. Human-readable content only — no UUIDs. For follow-up completion prefer people_complete_note_followup. Prefer this over dashboard API invoke for note edits.","scope":"people:write"},{"name":"people_remove_note","description":"Delete a pastoral care note by noteId (from people_list_notes). Syncs contact_care_timeline (note_removed). Use to remove mistaken agent notes — prefer this over dashboard API invoke.","scope":"people:write"},{"name":"people_list_custom_field_definitions","description":"List org custom field definitions and sections — required before writing customFields on contacts so agents use correct field keys and types.","scope":"people:read"},{"name":"people_list_welcome_desk_visitors","description":"List CRM Welcome Desk visitors (first-time/returning guests on the people module — NOT the separate /api/guests pipeline). Dashboard: /people/welcome-desk. Filter by membership_status or search name/email.","scope":"people:read"},{"name":"people_list_follow_up_tasks","description":"List CRM Welcome Desk follow-up tasks (visitor_follow_up_tasks) — separate from pastoral note follow_up_date and guests pipeline follow-ups.","scope":"people:read"},{"name":"people_complete_follow_up_task","description":"Mark a CRM Welcome Desk follow-up task complete (visitor_follow_up_tasks at /people/welcome-desk). NOT pastoral notes — use people_complete_note_followup for /community/care/notes.","scope":"people:write"},{"name":"people_list_tags","description":"List all CRM tags in the organization.","scope":"people:read"},{"name":"people_list_crm_groups","description":"List CRM People groups (ministry teams, departments — e.g. Gideon Army) from People → Groups. NOT the same as groups_list (Small Groups ministry module / cell groups). Use search to find by name. Includes active, archived, and on-hold unless status filter set.","scope":"people:read"},{"name":"people_list_crm_group_members","description":"List members of a CRM People group by groupId or groupName. Dashboard: People → Groups → open group → member table.","scope":"people:read"},{"name":"people_add_contact_tags","description":"Add one or more tags to a contact by tag name (creates tags if they do not exist).","scope":"people:write"},{"name":"people_remove_contact_tags","description":"Remove one or more tags from a contact by tag name.","scope":"people:write"},{"name":"people_delete_crm_tag","description":"Delete an org-wide CRM tag definition by name. Removes assignments from contacts first. Use after people_remove_contact_tags when the tag should not remain in Settings.","scope":"people:write"},{"name":"people_get_data_quality_summary","description":"Read Community → Data Quality dashboard summary: reachable contacts, score /100, six category scores, scan history, and Isla-prioritized recommendations. Always relay speakToUser. Use people_run_data_quality_scan if no scan exists or data looks stale.","scope":"people:read"},{"name":"people_run_data_quality_scan","description":"Run a full CRM data quality scan (same as Run Scan on Community → Data Quality). Returns fresh score, categories, and issue counts. communityMembersOnly=true matches the dashboard default for church orgs.","scope":"people:write"},{"name":"people_list_data_quality_checks","description":"List scan checks from the latest data quality run with Isla guidance. Filter by category, severity, or checkType. Use people_list_data_quality_affected_contacts for affected people.","scope":"people:read"},{"name":"people_list_data_quality_affected_contacts","description":"List contacts affected by a specific data quality issue type (same as expanding an issue row on the dashboard).","scope":"people:read"},{"name":"people_preview_data_quality_fix","description":"Preview an auto-fix job before applying (normalize phones, lowercase emails, trim whitespace, fix caps, segment cleanup, etc.).","scope":"people:read"},{"name":"people_apply_data_quality_fix","description":"Queue a background auto-fix job (same as Apply on the dashboard). Poll people_get_data_quality_job; call people_trigger_data_quality_jobs to process immediately.","scope":"people:write"},{"name":"people_preview_data_quality_special_fix","description":"Preview special fixes: dismiss minors missing email/phone, or copy family last name to contacts missing last name.","scope":"people:read"},{"name":"people_apply_data_quality_special_fix","description":"Apply a special data quality fix (dismiss minors, copy family last name).","scope":"people:write"},{"name":"people_list_data_quality_duplicates","description":"List duplicate contact groups by shared email or phone (dashboard Uniqueness panel). Excludes dismissed groups.","scope":"people:read"},{"name":"people_dismiss_data_quality_duplicate_groups","description":"Mark duplicate groups as not duplicates (dashboard dismiss).","scope":"people:write"},{"name":"people_list_data_quality_fuzzy_pairs","description":"List fuzzy duplicate pairs or identical name pairs (dashboard fuzzy / same-name panels).","scope":"people:read"},{"name":"people_dismiss_data_quality_fuzzy_pairs","description":"Dismiss fuzzy duplicate pairs as not duplicates.","scope":"people:write"},{"name":"people_merge_data_quality_contacts","description":"Merge two duplicate contacts (dashboard duplicate panel). Keeps keepContactId; optional fieldChoices for per-field resolution.","scope":"people:write"},{"name":"people_list_data_quality_jobs","description":"List recent data quality background jobs (phone normalize, bulk fixes).","scope":"people:read"},{"name":"people_get_data_quality_job","description":"Poll a data quality background job by id.","scope":"people:read"},{"name":"people_trigger_data_quality_jobs","description":"Run the data quality job processor now (same as dashboard polling / cron). Use after people_apply_data_quality_fix.","scope":"people:write"},{"name":"people_list_data_quality_queue","description":"List Isla data quality queue items pending human review.","scope":"people:read"},{"name":"people_get_data_quality_dismissed_counts","description":"Count dismissed duplicate groups, fuzzy pairs, or contact issues (minors missing email/phone) — same as dashboard dismissed badges.","scope":"people:read"},{"name":"people_restore_data_quality_dismissals","description":"Clear all dismissals for a type (undo dismiss minors, duplicate groups, or fuzzy pairs). Refreshes issue counts after restore.","scope":"people:write"},{"name":"people_fetch_data_quality_dashboard","description":"Exact dashboard GET /api/crm/data-quality?communityMembersOnly=true — score + history as the UI loads.","scope":"people:read"},{"name":"people_merge_data_quality_via_dashboard","description":"Merge duplicates via dashboard merge-duplicate API (same as Duplicate Resolution panel).","scope":"people:write"},{"name":"people_review_data_quality_queue_item","description":"Approve or skip a data quality queue item (Isla review queue).","scope":"people:write"},{"name":"people_get_pastoral_dashboard","description":"Pastoral Care → Dashboard summary: roster contact coverage, pending outreach approvals, welfare checks due, urgent prayers, predicted care needs. Always relay speakToUser.","scope":"people:read"},{"name":"people_list_welfare_due_contacts","description":"Contacts overdue for welfare check (180+ days since pastoral contact). Matches dashboard Needs Attention welfare queue.","scope":"people:read"},{"name":"people_list_care_predictions","description":"Pastoral Care → People → Predictions. AI-ranked contacts who may need pastoral attention.","scope":"people:read"},{"name":"people_list_grief_touchpoints","description":"Pastoral Care → People → Grief. Upcoming grief journey touchpoints.","scope":"people:read"},{"name":"people_complete_grief_touchpoint","description":"Mark a grief journey touchpoint complete (Pastoral Care → People → Grief).","scope":"people:write"},{"name":"people_list_pastoral_note_followups","description":"Open pastoral note follow-ups (due/overdue). Intelligent speakToUser. Complete with people_complete_note_followup.","scope":"people:read"},{"name":"people_get_visit_analytics","description":"Pastoral Care → Visits analytics (volume, team workload). Optional from/to dates (YYYY-MM-DD).","scope":"people:read"},{"name":"people_list_pastoral_visits","description":"List visit history for one contact (Pastoral Care → Visits detail).","scope":"people:read"},{"name":"people_log_pastoral_visit","description":"Log a pastoral visit (home, hospital, phone, etc.) for a contact.","scope":"people:write"},{"name":"people_get_prayer_analytics","description":"Pastoral Care → Insights prayer trends. Optional anonymous report mode for congregation-safe summary.","scope":"people:read"},{"name":"people_analyze_counseling_referral","description":"Analyze note or message text for counseling referral / crisis signals. If isCrisis=true, require immediate human intervention — never auto-send.","scope":"people:read"},{"name":"people_list_prayer_requests","description":"List active prayer requests (Insights). Confidential/private excluded. Urgent-first narrative in speakToUser.","scope":"people:read"},{"name":"people_set_prayer_request_status","description":"Update prayer request status (e.g. mark answered). Pastoral Care → Insights.","scope":"people:write"},{"name":"people_set_life_event_status","description":"Edit life event fields or status (Community → Life Events / Pastoral Care).","scope":"people:write"},{"name":"people_get_safeguarding_summary","description":"Safeguarding dashboard stats: completed, expiring, overdue, pending checks.","scope":"people:read"},{"name":"people_create_safeguarding_check","description":"Request a new safeguarding check (DBS etc.) for a contact.","scope":"people:write"},{"name":"people_set_safeguarding_check","description":"Update safeguarding check status, certificate dates, or notes.","scope":"people:write"},{"name":"people_list_safeguarding_policies","description":"List safeguarding policy documents (Safeguarding → Policies tab).","scope":"people:read"},{"name":"people_list_pending_outreach","description":"Pastoral outreach queue awaiting approval (Manage → Approvals / Dashboard Review Pending). Defaults to pending_review.","scope":"people:read"},{"name":"people_create_outreach","description":"Create a manual pastoral outreach message for approval queue.","scope":"people:write"},{"name":"people_approve_outreach","description":"Approve a pending outreach message for sending. User must confirm content first.","scope":"people:write"},{"name":"people_decline_outreach","description":"Decline a pending outreach message with a reason.","scope":"people:write"},{"name":"people_edit_outreach","description":"Edit subject/body of a pending or approved (not yet sent) outreach item.","scope":"people:write"},{"name":"people_list_pastoral_automations","description":"List pastoral automations (welfare check, encouragement, etc.) with optional stats.","scope":"people:read"},{"name":"people_create_pastoral_automation","description":"Create a pastoral automation (admin). Types include welfare_check, encouragement, grief_support, etc.","scope":"people:write"},{"name":"people_set_pastoral_automation","description":"Update automation name, status, or content config.","scope":"people:write"},{"name":"people_remove_pastoral_automation","description":"Delete a pastoral automation.","scope":"people:write"},{"name":"people_get_pastoral_settings","description":"Read pastoral care settings (welfare intervals, approvers, AI tone).","scope":"people:read"},{"name":"people_set_pastoral_settings","description":"Update pastoral care settings (admin).","scope":"people:write"},{"name":"people_get_care_team_overview","description":"Care team workload overview (Manage → Teams).","scope":"people:read"},{"name":"people_assign_care_team_member","description":"Assign a dashboard user to a contact care team role.","scope":"people:write"},{"name":"people_get_contact_care_status","description":"Per-contact pastoral snapshot: care status, life events, prayers, outreach, care team.","scope":"people:read"},{"name":"people_set_contact_care_priority","description":"Update contact care priority or pastoral opt-out flag.","scope":"people:write"},{"name":"people_list_pastoral_notes","description":"Pastoral Care → Notes list with categories and communityMembersOnly=true (exact dashboard query). Private/confidential excluded unless safeguarding scope.","scope":"people:read"},{"name":"people_get_outreach_item","description":"Fetch one pastoral outreach queue item with contact and automation context before approve/edit.","scope":"people:read"},{"name":"people_cancel_outreach","description":"Cancel/delete a pastoral outreach item (not yet sent).","scope":"people:write"},{"name":"people_run_pastoral_generation","description":"Trigger immediate pastoral message generation batch (same as activating an automation on the dashboard).","scope":"people:write"},{"name":"people_get_pastoral_automation","description":"Get one pastoral automation with recent outreach stats.","scope":"people:read"},{"name":"people_duplicate_pastoral_automation","description":"Duplicate a pastoral automation as an inactive copy.","scope":"people:write"},{"name":"people_initialize_pastoral_settings","description":"Initialize pastoral care settings for the org (first-time setup). Admin only.","scope":"people:write"},{"name":"people_list_care_team_roles","description":"List custom care team roles (Manage → Teams).","scope":"people:read"},{"name":"people_create_care_team_role","description":"Create a care team role with approval/confidential permissions.","scope":"people:write"},{"name":"people_set_care_team_role","description":"Update a care team role.","scope":"people:write"},{"name":"people_remove_care_team_role","description":"Delete a custom care team role.","scope":"people:write"},{"name":"people_seed_care_team_roles","description":"Seed default care team roles for the organization.","scope":"people:write"},{"name":"people_list_care_team_assignments","description":"List care team assignments (optionally filter by contact or user).","scope":"people:read"},{"name":"people_remove_care_team_assignment","description":"Remove a care team assignment.","scope":"people:write"},{"name":"people_list_pastoral_life_events","description":"Pastoral Care → People → Life Events tab (uses /api/pastoral/life-events with community member filter).","scope":"people:read"},{"name":"people_list_all_life_events","description":"Life Events page — all events including milestones (GET /api/community/life-events/all).","scope":"people:read"},{"name":"people_celebrate_life_event","description":"Mark a milestone achievement as celebrated (Life Events page).","scope":"people:write"},{"name":"people_export_life_events_report","description":"Generate monthly life events pastoral report (Life Events → Report).","scope":"people:read"},{"name":"people_export_life_events_calendar","description":"Export life events calendar data (Life Events → Export).","scope":"people:read"},{"name":"people_remove_life_event","description":"Delete a life event record.","scope":"people:write"},{"name":"people_generate_life_event_message","description":"AI-generate a pastoral message for a life event (email/SMS/WhatsApp).","scope":"people:write"},{"name":"people_list_safeguarding_checks","description":"List safeguarding checks with optional status filter (Safeguarding main tab).","scope":"people:read"},{"name":"people_remove_safeguarding_check","description":"Delete a safeguarding check record.","scope":"people:write"},{"name":"people_create_safeguarding_policy","description":"Create a safeguarding policy document.","scope":"people:write"},{"name":"people_set_safeguarding_policy","description":"Update a safeguarding policy (PATCH body includes id).","scope":"people:write"},{"name":"people_remove_safeguarding_policy","description":"Delete a safeguarding policy.","scope":"people:write"},{"name":"people_list_counseling_resources","description":"List org counseling referral resources (Insights sidebar).","scope":"people:read"},{"name":"people_get_main_dashboard_layout","description":"Main People dashboard widget layout (GET /api/dashboard/layout?type=main).","scope":"people:read"},{"name":"people_set_main_dashboard_layout","description":"Save main People dashboard widget layout (PUT /api/dashboard/layout?type=main).","scope":"people:write"},{"name":"people_get_analytics_stats","description":"Stats widget on People dashboard (GET /api/analytics/stats).","scope":"people:read"},{"name":"people_get_donate_subdomain_slug","description":"Public People card subdomain slug (GET /api/organizations/donate-subdomain-slug). Volunteer access page.","scope":"people:read"},{"name":"people_get_contact_stats","description":"Contact list header stats (GET /api/contacts/stats).","scope":"people:read"},{"name":"people_export_contacts","description":"Export contacts CSV with current list filters (GET /api/contacts/export).","scope":"people:read"},{"name":"people_import_contacts","description":"Bulk import contacts from CSV/JSON (POST /api/contacts/import).","scope":"people:write"},{"name":"people_run_contacts_bulk_operation","description":"Dashboard bulk ops (POST /api/contacts/bulk): add_tags, remove_tags, update_fields, delete, etc.","scope":"people:write"},{"name":"people_set_community_membership_bulk","description":"Toggle community membership for many contacts (POST /api/contacts/bulk/community-membership).","scope":"people:write"},{"name":"people_add_contact_to_segment_api","description":"Add one contact to a segment from list bulk flow (POST /api/contacts/{id}/segments).","scope":"people:write"},{"name":"people_list_segments_api","description":"List segments via dashboard API (GET /api/crm/segments). Complements people_list_segments.","scope":"people:read"},{"name":"people_get_segment_api","description":"Get segment by id (GET /api/crm/segments/{id}).","scope":"people:read"},{"name":"people_update_segment","description":"Update segment rules/name (PATCH /api/crm/segments/{id}).","scope":"people:write"},{"name":"people_refresh_segment","description":"Manually refresh segment membership (PATCH /api/crm/segments/{id}/refresh).","scope":"people:write"},{"name":"people_list_segment_templates","description":"Segment template library (GET /api/crm/segment-templates).","scope":"people:read"},{"name":"people_create_segment_from_template","description":"Create segment from template (POST /api/crm/segments/from-template/{templateId}).","scope":"people:write"},{"name":"people_list_segment_fields","description":"Segment rule builder fields (GET /api/crm/segments/fields).","scope":"people:read"},{"name":"people_preview_segment_api","description":"Live segment preview counts (POST /api/crm/segments/preview).","scope":"people:read"},{"name":"people_list_segment_contacts_api","description":"Paginated segment members (GET /api/crm/segments/{id}/contacts).","scope":"people:read"},{"name":"people_list_crm_tags_api","description":"List tags with categories (GET /api/crm/tags?includeCategories=true).","scope":"people:read"},{"name":"people_create_crm_tag","description":"Create CRM tag (POST /api/crm/tags).","scope":"people:write"},{"name":"people_update_crm_tag","description":"Update CRM tag (PATCH /api/crm/tags/{tagId}).","scope":"people:write"},{"name":"people_create_tag_category","description":"Create tag category (POST /api/crm/tags/categories).","scope":"people:write"},{"name":"people_update_tag_category","description":"Update tag category (PATCH /api/crm/tags/categories/{categoryId}).","scope":"people:write"},{"name":"people_list_contact_tags_api","description":"Tags on a contact (GET /api/crm/contacts/{contactId}/tags).","scope":"people:read"},{"name":"people_add_contact_tag_api","description":"Add tag to contact via API (POST /api/crm/contacts/{contactId}/tags).","scope":"people:write"},{"name":"people_remove_contact_tag_api","description":"Remove tag from contact (DELETE /api/crm/contacts/{contactId}/tags?tagId=).","scope":"people:write"},{"name":"people_get_crm_group","description":"CRM group detail (GET /api/crm/groups/{groupId}). Opens People → Groups detail with member roster management.","scope":"people:read"},{"name":"people_update_crm_group","description":"Update CRM group (PUT/PATCH /api/crm/groups/{groupId}).","scope":"people:write"},{"name":"people_list_crm_locations","description":"Campus/location filter options (GET /api/crm/locations).","scope":"people:read"},{"name":"people_list_crm_groups_api","description":"List CRM groups with types/roles (GET /api/crm/groups).","scope":"people:read"},{"name":"people_list_crm_group_members_api","description":"List group members (GET /api/crm/groups/{groupId}/members). Same roster as People → Groups → Manage Members.","scope":"people:read"},{"name":"people_list_portal_invites","description":"List member portal invites (GET /api/portal/admin/invites).","scope":"people:read"},{"name":"people_send_portal_invites","description":"Send portal invites to contacts (POST /api/portal/admin/invites).","scope":"people:write"},{"name":"people_manage_portal_invite","description":"Resend or revoke portal invite (PATCH /api/portal/admin/invites).","scope":"people:write"},{"name":"people_get_portal_analytics","description":"Member portal analytics (GET /api/portal/admin/analytics).","scope":"people:read"},{"name":"people_list_portal_moderation","description":"Portal moderation queue (GET /api/portal/admin/moderation).","scope":"people:read"},{"name":"people_moderate_portal_post","description":"Approve/reject portal post (PATCH /api/portal/admin/moderation).","scope":"people:write"},{"name":"people_list_capture_sessions","description":"List people capture sessions (GET /api/people/sessions).","scope":"people:read"},{"name":"people_unlock_capture_session","description":"Unlock/reopen capture session (POST /api/people/sessions/{id}/unlock-reopen).","scope":"people:write"},{"name":"people_get_contact_profile","description":"Extended visitor-card profile (GET /api/contacts/{id}/profile).","scope":"people:read"},{"name":"people_update_contact_profile","description":"Update visitor-card profile fields (PUT/PATCH /api/contacts/{id}/profile).","scope":"people:write"},{"name":"people_get_contact_summary","description":"Quick contact summary card (GET /api/contacts/{id}/summary).","scope":"people:read"},{"name":"people_get_contact_timeline","description":"Activity timeline tab (GET /api/crm/contacts/{id}/timeline).","scope":"people:read"},{"name":"people_list_contact_emails","description":"Emails tab history (GET /api/crm/contacts/{id}/emails).","scope":"people:read"},{"name":"people_list_contact_groups_tab","description":"Involvement tab groups (GET /api/crm/contacts/{id}/groups).","scope":"people:read"},{"name":"people_get_contact_attendance","description":"Attendance tab (GET /api/contacts/{id}/attendance).","scope":"people:read"},{"name":"people_list_similar_contacts","description":"Similar contacts panel (GET /api/contacts/{id}/similar).","scope":"people:read"},{"name":"people_find_similar_contacts_ai","description":"AI similar contacts (GET /api/ai/similar-contacts/{contactId}).","scope":"people:read"},{"name":"people_get_visitor_card_form","description":"Visitor card form schema (GET /api/people/visitor-card-form).","scope":"people:read"},{"name":"people_list_departments","description":"Departments for contact edit form (GET /api/people/departments).","scope":"people:read"},{"name":"people_get_card_sample_token","description":"Sample member card preview URL (GET /api/people/card-sample-token).","scope":"people:read"},{"name":"people_generate_member_qr","description":"Generate member QR code (POST /api/guests/member-qr/generate).","scope":"people:write"},{"name":"people_list_partner_shares","description":"Partner DPA shares (GET /api/partner/shares).","scope":"people:read"},{"name":"people_list_partner_contacts","description":"Shared partner contacts view (GET /api/partner/contacts).","scope":"people:read"},{"name":"people_build_semantic_segment","description":"AI semantic segment builder (POST /api/ai/semantic-segment).","scope":"people:write"},{"name":"people_semantic_search_contacts","description":"Semantic contact search (POST /api/contacts/semantic-search).","scope":"people:read"},{"name":"people_get_community_dashboard","description":"Community home dashboard stats (GET /api/crm/dashboard?communityMembersOnly=true). Membership, engagement, integration funnel snapshot.","scope":"people:read"},{"name":"people_get_crm_subscription","description":"CRM subscription / plan tier for Community module gating (GET /api/crm/subscription).","scope":"people:read"},{"name":"people_list_crm_search_config","description":"Community search page config: filterable fields and saved searches (GET /api/crm/search?includeFields=true).","scope":"people:read"},{"name":"people_execute_community_search","description":"Execute advanced community-member search (POST /api/crm/search action=execute). Defaults communityMembersOnly=true.","scope":"people:read"},{"name":"people_save_crm_search","description":"Save current search criteria as a reusable saved search (POST /api/crm/search action=save).","scope":"people:write"},{"name":"people_execute_saved_crm_search","description":"Run a saved search by id (GET /api/crm/search/{id}?execute=true). Defaults communityMembersOnly=true.","scope":"people:read"},{"name":"people_get_community_settings","description":"Community / CRM settings (GET /api/crm/settings) — display, family, groups, tags, custom fields, etc.","scope":"people:read"},{"name":"people_set_community_settings","description":"Update Community CRM settings (PUT /api/crm/settings). Pass settings object matching dashboard shape.","scope":"people:write"},{"name":"people_get_integration_overview","description":"Integration funnel stages and optional stalled contacts (GET /api/crm/integration). Set stalled=true for stall list.","scope":"people:read"},{"name":"people_run_integration_stall_detection","description":"Re-run integration stall detection (POST /api/crm/integration). Refresh with people_get_integration_overview.","scope":"people:write"},{"name":"people_get_engagement_overview","description":"Engagement widget data (GET /api/crm/engagement/overview). Community dashboard widget parity.","scope":"people:read"},{"name":"people_get_smart_discoveries","description":"AI smart discoveries card on Community home (GET /api/ai/smart-discoveries).","scope":"people:read"},{"name":"people_get_smart_content_birthdays","description":"Birthday smart-content suggestions (GET /api/ai/smart-content/birthdays).","scope":"people:read"},{"name":"people_get_smart_content_new_members","description":"New-member smart-content suggestions (GET /api/ai/smart-content/new-members).","scope":"people:read"},{"name":"people_list_dashboard_ai_insights","description":"AI insights widget list (GET /api/ai/insights). Community dashboard widget parity.","scope":"people:read"},{"name":"people_generate_dashboard_ai_insights","description":"Generate fresh AI insights for dashboard widget (POST /api/ai/insights).","scope":"people:write"},{"name":"people_get_crm_dashboard_layout","description":"CRM dashboard widget layout (GET /api/dashboard/layout?type=crm).","scope":"people:read"},{"name":"people_set_crm_dashboard_layout","description":"Save CRM dashboard widget layout (PUT /api/dashboard/layout).","scope":"people:write"},{"name":"people_list_recent_activities","description":"Recent activity widget (GET /api/activities). Community dashboard widget parity.","scope":"people:read"},{"name":"people_get_crm_analytics_chart","description":"Analytics chart widget data (GET /api/analytics/chart). Default period 7d.","scope":"people:read"},{"name":"people_get_life_events_radar","description":"Life Events page summary radar (GET /api/community/life-events) — due follow-ups and category counts. Not the full /all list.","scope":"people:read"},{"name":"people_get_contact_life_events_timeline","description":"Per-contact life events timeline (GET /api/community/life-events/contact/{contactId}).","scope":"people:read"},{"name":"people_create_crm_group","description":"Create a CRM People group (ministry team, department) — same as People → Groups → New. NOT the Small Groups ministry module (use groups_create for cell/home groups). To remove: people_delete_crm_group.","scope":"people:write"},{"name":"people_add_crm_group_member","description":"Add a contact to a CRM People group by groupId/groupName and contactId or contactEmail. Same as People → Groups → Add member.","scope":"people:write"},{"name":"people_remove_crm_group_member","description":"Remove a contact from a CRM People group. Pass memberId from people_list_crm_group_members, or contactId/contactEmail with groupId/groupName.","scope":"people:write"},{"name":"people_delete_crm_group","description":"Delete a CRM People group (ministry team / department). Same as People → Groups → delete. Members are unlinked; contacts are not deleted.","scope":"people:write"},{"name":"people_preview_roll_check","description":"Preview how many contacts match a roll-check before sending a review link. Use queryType all_unsubscribed for unsubscribed contacts (no rule JSON needed). For custom segment rules, pass rootGroup. Same as People → Roll check → Preview. Requires people:read (owner/admin).","scope":"people:read"},{"name":"people_list_roll_checks","description":"List recent roll-check review sessions (pending/completed) with contact counts and reviewer email. People → Roll check history.","scope":"people:read"},{"name":"people_create_roll_check","description":"Create a PIN-protected roll-check review link and optionally email it to a reviewer. Same as People → Roll check → Send. Requires people:write (owner/admin).","scope":"people:write"},{"name":"people_get_roll_check_settings","description":"Get default roll-check reviewer name and email for this organization.","scope":"people:read"},{"name":"people_update_roll_check_settings","description":"Set default roll-check reviewer email and name — used when sendEmail is true without recipientEmail.","scope":"people:write"},{"name":"people_list_roll_check_fields","description":"List segment fields available for roll-check rule builder (tags, status, custom fields, etc.).","scope":"people:read"},{"name":"people_list_portal_volunteers","description":"List People Portal volunteers (PIN login for roll-check sessions) — not runsheet crew or Welcome Desk. Settings → People Portal volunteers.","scope":"people:read"},{"name":"people_create_portal_volunteer","description":"Create a People Portal volunteer with a new 6-digit PIN — for roll-check / people session access. Requires people:write (owner/admin).","scope":"people:write"},{"name":"people_reset_portal_volunteer_pin","description":"Reset a People Portal volunteer PIN — generates a new 6-digit PIN unless pin is provided. Requires people:write.","scope":"people:write"},{"name":"people_update_portal_volunteer","description":"Update a People Portal volunteer name or active status (deactivate without deleting history).","scope":"people:write"},{"name":"people_delete_segment","description":"Permanently remove a segment — same as dashboard delete (not pause/archive).","scope":"people:write"},{"name":"people_delete_portal_volunteer","description":"Permanently delete a portal volunteer (welcome desk PIN user). Fails if they have session history — deactivate with people_update_portal_volunteer instead.","scope":"people:write"},{"name":"people_list_segments","description":"List dynamic contact segments with live member counts.","scope":"people:read"},{"name":"people_preview_segment","description":"Preview how many contacts match segment rules before creating one. Pass rootGroup (AND/OR tree) OR shortcuts tagName / activeContactsWithTag. Example rootGroup: {\"op\":\"AND\",\"rules\":[{\"field\":\"tags\",\"op\":\"has_tag\",\"value\":\"Member\"}]}. For active contacts with a tag use activeContactsWithTag: \"volunteer\".","scope":"people:read"},{"name":"people_create_segment","description":"Create a dynamic segment from a rule tree.","scope":"people:write"},{"name":"people_list_duplicates","description":"List groups of contacts sharing the same email (duplicate candidates).","scope":"people:read"},{"name":"people_merge_contacts","description":"Merge two duplicate contacts — keeps keepContactId and soft-merges mergeContactId into it.","scope":"people:write"},{"name":"people_get_segment_contacts","description":"List segment members with email outreach intelligence — eligible vs excluded (unsubscribed, no email, opt-out) plus speakToUser. Call people_list_segments first for segmentId.","scope":"people:read"},{"name":"people_meeting_prep","description":"Generate an AI meeting-prep briefing for one or more contacts (history, giving, engagement).","scope":"people:read"}]},{"module":"grow","description":"Automations, forms, landing pages, email campaigns with stats and A/B tests. Long tail: grow_invoke_api_read / _write.","toolCount":31,"tools":[{"name":"grow_invoke_api_read","description":"Invoke forms builder, campaigns, automations, and landing page APIs. GET-only read bridge for this module's dashboard API long tail.","scope":"grow:read"},{"name":"grow_invoke_api_write","description":"Invoke forms builder, campaigns, automations, and landing page APIs. Mutation bridge (POST, PUT, PATCH, DELETE) for this module's dashboard API long tail. REQUIRED: fill actionSummary in plain English — it appears in the user's approval dialog.","scope":"grow:write"},{"name":"grow_list_automations","description":"List automation flows (funnels) with status and enrollment stats. Rows include aiVariationEnabled when flow_definition is scanned.","scope":"grow:read"},{"name":"grow_get_automation","description":"Get one automation flow including its node graph (flow_definition).","scope":"grow:read"},{"name":"grow_set_automation_status","description":"Activate or pause automation flow(s). Pause uses a fast direct path (no pre-pause needed before grow_delete_automation). Use pauseAll:true to pause every non-platform automation. Activation runs messaging credit preflight.","scope":"grow:write"},{"name":"grow_list_forms","description":"List forms with view and submission counts.","scope":"grow:read"},{"name":"grow_list_form_submissions","description":"List recent submissions for a form, including submitted data.","scope":"grow:read"},{"name":"grow_list_landing_pages","description":"List landing pages with visit and conversion stats.","scope":"grow:read"},{"name":"grow_list_campaigns","description":"List email campaigns with send/open/click stats.","scope":"grow:read"},{"name":"grow_create_landing_page","description":"Create a draft landing page from a text prompt (AI-generated content blocks).","scope":"grow:write"},{"name":"grow_publish_landing_page","description":"Publish a landing page so it is live at its public URL.","scope":"grow:write"},{"name":"grow_enroll_contact","description":"Enroll a contact into an automation flow.","scope":"grow:write"},{"name":"grow_create_campaign","description":"Create a draft email campaign. Optionally attach segmentId or contactIds for the audience before preview/send.","scope":"grow:write"},{"name":"grow_explain_ai_variation","description":"Explain funnel AI variation — per-recipient wording rewrites at send time (NOT A/B tests). Returns personalization_ai cost estimate when recipientCountPerRun is provided. Read sendifai://docs/funnel-ai-variation.","scope":"grow:read"},{"name":"grow_create_automation","description":"Create an automation flow in Grow → Funnels. For per-person wording (not A/B), set enableAiVariation:true — uses personalization_ai credits per recipient. Service reminders from Community → Services default AI variation on. Read sendifai://docs/funnel-ai-variation before congregation-wide sends.","scope":"grow:write"},{"name":"grow_update_automation","description":"Update an automation — name, trigger, flow graph, or enableAiVariation. For activate/pause only after a flow edit, use grow_set_automation_status instead (faster, same credit preflight).","scope":"grow:write"},{"name":"grow_create_weekly_email","description":"Create an active weekly email automation to one recipient (e.g. every Friday 9am to info@htay.co.uk). Appears in Grow → Automations. Recipient must exist as a CRM contact. For shared family emails, pass recipientName or recipientContactId.","scope":"grow:write"},{"name":"grow_delete_automation","description":"Permanently delete automation flow(s). Active flows are paused and removed automatically — no separate pause step. Skips platform-managed flows (e.g. birthday digest). Use deleteAll to remove every deletable automation in the org.","scope":"grow:write"},{"name":"grow_get_birthday_digest_settings","description":"Read daily birthday digest settings: enabled, sendHour, recipientEmail, recipientGroupId, recipientGroupName. Use grow_update_birthday_digest_settings to send to a CRM group.","scope":"grow:read"},{"name":"grow_update_birthday_digest_settings","description":"Configure the platform daily birthday digest (system automation). Set recipientGroupId to fan out to every CRM group member with email — each gets a personalized greeting using their title/prefix. Clears single-email recipient when group is set.","scope":"grow:write"},{"name":"grow_list_community_automations","description":"List automations with Community lens stats (GET /api/automations?community_only=true). Community → Automations page parity.","scope":"grow:read"},{"name":"grow_duplicate_automation","description":"Duplicate an automation flow (POST /api/automations/{id}/duplicate).","scope":"grow:write"},{"name":"grow_delete_campaign","description":"Permanently remove a email campaign — same as dashboard delete (not pause/archive).","scope":"grow:write"},{"name":"grow_delete_form","description":"Permanently remove a form — same as dashboard delete (not pause/archive).","scope":"grow:write"},{"name":"grow_delete_landing_page","description":"Permanently remove a landing page — same as dashboard delete (not pause/archive).","scope":"grow:write"},{"name":"grow_preview_campaign_send","description":"Preview campaign send with eligible vs excluded recipients and speakToUser (unsubscribed, no email, opt-out). Call before grow_send_campaign.","scope":"grow:read"},{"name":"grow_schedule_campaign","description":"Schedule an email campaign for a future ISO datetime.","scope":"grow:write"},{"name":"grow_schedule_campaign_optimal","description":"Schedule a campaign at the AI-recommended optimal send time.","scope":"grow:write"},{"name":"grow_send_campaign","description":"Send an email campaign to its full audience. Call without confirm for recipient preview; set confirm:true to start a background send. Poll grow_email_campaign_status until complete — never loop single-recipient tools for blasts.","scope":"grow:write"},{"name":"grow_email_campaign_status","description":"Poll email campaign send progress after grow_send_campaign (large sends run in the background).","scope":"grow:read"},{"name":"grow_list_ab_tests","description":"List A/B tests with status, winning variant, and significance.","scope":"grow:read"}]},{"module":"giving","description":"Funds, donations, givers, summaries, pledges. Card charges: giving_process_card_donation (Stripe token). Offline gifts: giving_record_donation. Public links: giving_list_donate_pages. Long tail: giving_invoke_api_read / _write.","toolCount":139,"tools":[{"name":"giving_invoke_api_read","description":"Invoke giving APIs: Gift Aid, reconciliation, counting sessions, reports, PayPal. GET-only read bridge for this module's dashboard API long tail.","scope":"giving:read"},{"name":"giving_invoke_api_write","description":"Invoke giving APIs: Gift Aid, reconciliation, counting sessions, reports, PayPal. Mutation bridge (POST, PUT, PATCH, DELETE) for this module's dashboard API long tail. REQUIRED: fill actionSummary in plain English — it appears in the user's approval dialog.","scope":"giving:write"},{"name":"giving_list_funds","description":"List donation funds (e.g. General, Building, Missions) with raised and target amounts.","scope":"giving:read"},{"name":"giving_list_donations","description":"List donations, newest first. Filter by fund, giver, status, or date range.","scope":"giving:read"},{"name":"giving_summary","description":"Giving totals for a date range: total amount, donation count, and per-fund breakdown.","scope":"giving:read"},{"name":"giving_top_donors","description":"Rank top donors by total amount given in a date range. Returns ranked givers with speakToUser — always relay to the user in plain English. Use instead of paginating giving_list_donations.","scope":"giving:read"},{"name":"giving_lapsed_donors","description":"List donors whose last completed gift was before a cutoff — inactive / lapsed givers. Returns speakToUser — always relay to the user. Use instead of paginating giving_list_donations.","scope":"giving:read"},{"name":"giving_search_givers","description":"Search givers by name or email.","scope":"giving:read"},{"name":"giving_get_donation","description":"Get one donation by ID with fund and giver context.","scope":"giving:read"},{"name":"giving_list_batches","description":"List donation import/counting batches for reconciliation.","scope":"giving:read"},{"name":"giving_list_counting_sessions","description":"List offering/cash counting sessions (who counted, when, totals). Use when the user asks who did the count today, which volunteer counted, or for counting session history. Prefer this over dashboard API invoke.","scope":"giving:read"},{"name":"giving_get_counting_session","description":"Get one counting session by ID, including the volunteer who counted and session totals.","scope":"giving:read"},{"name":"giving_record_donation","description":"Record an offline donation already received (cash, cheque, bank transfer, or card taken outside sendifai). Does NOT charge a card — use giving_process_card_donation for Stripe card payments, or giving_list_donate_pages to share a public donate link. Requires fund id (giving_list_funds) and giverId, contactId, or isAnonymous=true.","scope":"giving:write"},{"name":"giving_list_donate_pages","description":"List public online donate pages with shareable URLs. When an agent cannot collect card details safely, send the donor a published page URL instead of asking for card numbers in chat.","scope":"giving:read"},{"name":"giving_process_card_donation","description":"Charge a donation to a card via Stripe Connect (same path as Giving dashboard manual card entry). Requires a Stripe paymentMethodId token from secure card entry — NEVER pass raw card numbers. For 3D Secure, first call may return requiresAction + paymentIntentId; complete verification then call again with paymentIntentId only. If the agent cannot tokenize cards, use giving_list_donate_pages and share a public donate URL, or direct the operator to /giving. Requires linked dashboard user on the API key (OAuth recommended).","scope":"giving:write"},{"name":"giving_create_fund","description":"Create a new giving fund.","scope":"giving:write"},{"name":"giving_deactivate_fund","description":"Archive (deactivate) a giving fund — soft delete via is_active=false. Pass fundId from giving_list_funds or exact fund name.","scope":"giving:write"},{"name":"giving_update_fund","description":"Update a giving fund name or description. Archived funds can be renamed (slug updates too) — names are not permanently locked.","scope":"giving:write"},{"name":"giving_create_pledge","description":"Create a recurring or one-off giving pledge for a giver or contact. Requires fundId (giving_list_funds), amount, and frequency (weekly, fortnightly, monthly, quarterly, annually, one_off).","scope":"giving:write"},{"name":"giving_refund_donation","description":"Refund a card or online donation via Stripe, PayPal, or GoCardless (same path as Giving dashboard). Cannot refund cash/cheque recorded offline — use giving_record_donation adjustments in dashboard instead.","scope":"giving:write"},{"name":"giving_get_gift_aid_status","description":"Check whether a donor has an active Gift Aid declaration and a complete UK address on file. Use before recording Gift Aid eligible donations.","scope":"giving:read"},{"name":"giving_create_gift_aid_declaration","description":"Record a UK Gift Aid declaration for a giver or contact. Requires UK address line 1 and postcode (from contact profile or provided explicitly).","scope":"giving:write"},{"name":"giving_get_settings","description":"Giving module settings (GET /api/giving/settings).","scope":"giving:read"},{"name":"giving_update_settings","description":"Update giving settings (PUT/PATCH /api/giving/settings).","scope":"giving:write"},{"name":"giving_get_stripe_connect_status","description":"Stripe Connect status (GET /api/giving/stripe-connect/status).","scope":"giving:read"},{"name":"giving_onboard_stripe_connect","description":"Start Stripe Connect onboarding (POST /api/giving/stripe-connect/onboard).","scope":"giving:write"},{"name":"giving_disconnect_stripe_connect","description":"Disconnect Stripe Connect (DELETE /api/giving/stripe-connect/disconnect).","scope":"giving:write"},{"name":"giving_get_paypal_status","description":"PayPal connection status (GET /api/giving/paypal/status).","scope":"giving:read"},{"name":"giving_connect_paypal","description":"Connect PayPal (POST /api/giving/paypal/connect).","scope":"giving:write"},{"name":"giving_disconnect_paypal","description":"Disconnect PayPal (POST /api/giving/paypal/disconnect).","scope":"giving:write"},{"name":"giving_connect_gocardless","description":"Connect GoCardless (POST /api/giving/connect/gocardless).","scope":"giving:write"},{"name":"giving_disconnect_gocardless","description":"Disconnect GoCardless (POST /api/giving/connect/gocardless/disconnect).","scope":"giving:write"},{"name":"giving_list_sites","description":"Giving lens sites filter (GET /api/giving/sites).","scope":"giving:read"},{"name":"giving_get_intelligence","description":"Giving intelligence panel (GET /api/giving/intelligence).","scope":"giving:read"},{"name":"giving_get_report_summary_api","description":"Dashboard summary report (GET /api/giving/reports/summary). Complements giving_summary.","scope":"giving:read"},{"name":"giving_list_donations_api","description":"List donations via dashboard API with filters (GET /api/giving/donations).","scope":"giving:read"},{"name":"giving_update_donation_api","description":"Update donation fields (PATCH /api/giving/donations/{id}).","scope":"giving:write"},{"name":"giving_void_donation","description":"Void a donation (POST /api/giving/donations/{id}/void).","scope":"giving:write"},{"name":"giving_check_donation_duplicate","description":"Duplicate donation check (POST /api/giving/donations/duplicate-check).","scope":"giving:read"},{"name":"giving_delete_donation_api","description":"Soft-delete donation from batch (POST /api/giving/donations/{id}/delete).","scope":"giving:write"},{"name":"giving_list_givers_api","description":"List/search givers (GET /api/giving/givers). Complements giving_search_givers.","scope":"giving:read"},{"name":"giving_get_giver_api","description":"Giver profile detail (GET /api/giving/givers/{id}).","scope":"giving:read"},{"name":"giving_create_giver_api","description":"Create giver (POST /api/giving/givers).","scope":"giving:write"},{"name":"giving_get_donor_statement","description":"Donor annual statement (GET /api/giving/donors/{giverId}/statement).","scope":"giving:read"},{"name":"giving_bulk_update_funds","description":"Bulk fund operations (POST /api/giving/funds/bulk).","scope":"giving:write"},{"name":"giving_list_batches_api","description":"List donation batches (GET /api/giving/batches).","scope":"giving:read"},{"name":"giving_get_batch_api","description":"Batch detail with donations (GET /api/giving/batches/{id}).","scope":"giving:read"},{"name":"giving_create_batch","description":"Create donation batch (POST /api/giving/batches).","scope":"giving:write"},{"name":"giving_close_batch","description":"Close a donation batch (PUT /api/giving/batches/{id} action close).","scope":"giving:write"},{"name":"giving_import_batch_csv","description":"Import CSV into batch (POST /api/giving/batches/{id}/import).","scope":"giving:write"},{"name":"giving_get_reconciliation_status","description":"Bank reconciliation status (GET /api/giving/reconciliation).","scope":"giving:read"},{"name":"giving_upload_reconciliation","description":"Upload bank statement for reconciliation (POST /api/giving/reconciliation/upload).","scope":"giving:write"},{"name":"giving_match_reconciliation","description":"Match reconciliation transactions (POST/PATCH /api/giving/reconciliation/match).","scope":"giving:write"},{"name":"giving_delete_reconciliation_batch","description":"Delete reconciliation upload batch (DELETE /api/giving/reconciliation/batch/{batchId}).","scope":"giving:write"},{"name":"giving_export_reconciliation","description":"Export reconciliation CSV (GET /api/giving/reconciliation/export).","scope":"giving:read"},{"name":"giving_list_counting_sessions_api","description":"List counting sessions via API (GET /api/giving/counting-sessions).","scope":"giving:read"},{"name":"giving_get_counting_session_api","description":"Counting session detail (GET /api/giving/counting-sessions/{id}).","scope":"giving:read"},{"name":"giving_unlock_counting_session","description":"Unlock/reopen counting session (POST /api/giving/counting-sessions/{id}/unlock-reopen).","scope":"giving:write"},{"name":"giving_resend_counting_session_email","description":"Resend count session summary email (POST /api/giving/counting-sessions/{id}/resend-email).","scope":"giving:write"},{"name":"giving_get_counting_session_domain_status","description":"Count custom domain status (GET /api/giving/counting-sessions/{id}/domain-status).","scope":"giving:read"},{"name":"giving_list_count_volunteers","description":"List count volunteers (GET /api/giving/count-volunteers).","scope":"giving:read"},{"name":"giving_create_count_volunteer","description":"Create count volunteer (POST /api/giving/count-volunteers).","scope":"giving:write"},{"name":"giving_reset_count_volunteer_pin","description":"Reset count volunteer PIN (POST /api/giving/count-volunteers/{id}/reset-pin).","scope":"giving:write"},{"name":"giving_update_count_volunteer","description":"Update count volunteer (PUT/PATCH /api/giving/count-volunteers/{id}).","scope":"giving:write"},{"name":"giving_delete_count_volunteer","description":"Delete count volunteer (DELETE /api/giving/count-volunteers/{id}).","scope":"giving:write"},{"name":"giving_get_count_settings","description":"Count module settings (GET /api/giving/count-settings).","scope":"giving:read"},{"name":"giving_update_count_settings","description":"Update count settings (PATCH /api/giving/count-settings).","scope":"giving:write"},{"name":"giving_get_count_custom_domain","description":"Count custom domain config (GET /api/organizations/count-custom-domain).","scope":"giving:read"},{"name":"giving_update_count_custom_domain","description":"Update count custom domain (PUT /api/organizations/count-custom-domain).","scope":"giving:write"},{"name":"giving_get_donate_subdomain_slug","description":"Public donate/count subdomain slug (GET /api/organizations/donate-subdomain-slug).","scope":"giving:read"},{"name":"giving_list_donate_pages_api","description":"List donate pages via API (GET /api/giving/donate-pages).","scope":"giving:read"},{"name":"giving_get_donate_page_api","description":"Donate page detail (GET /api/giving/donate-pages/{id}).","scope":"giving:read"},{"name":"giving_create_donate_page","description":"Create donate page (POST /api/giving/donate-pages).","scope":"giving:write"},{"name":"giving_update_donate_page","description":"Update donate page (PUT/PATCH /api/giving/donate-pages/{id}).","scope":"giving:write"},{"name":"giving_get_donate_page_analytics","description":"Donate page analytics (GET /api/giving/donate-pages/{id}/analytics).","scope":"giving:read"},{"name":"giving_get_donate_page_domain_status","description":"Donate page custom domain status (GET /api/giving/donate-pages/{id}/domain-status).","scope":"giving:read"},{"name":"giving_generate_donate_page_ai","description":"AI donate page copy (POST /api/giving/donate-pages/ai).","scope":"giving:write"},{"name":"giving_list_reports","description":"List generated reports (GET /api/giving/reports).","scope":"giving:read"},{"name":"giving_create_report","description":"Generate report from builder (POST /api/giving/reports).","scope":"giving:write"},{"name":"giving_get_report_data","description":"Report viewer data (GET /api/giving/reports/{id}/data).","scope":"giving:read"},{"name":"giving_download_report","description":"Download report export (POST /api/giving/reports/{id}/download).","scope":"giving:read"},{"name":"giving_share_report","description":"Create shareable report link (POST /api/giving/reports/{id}/share).","scope":"giving:write"},{"name":"giving_drilldown_report","description":"Report drilldown dimension (POST /api/giving/reports/{id}/drilldown).","scope":"giving:read"},{"name":"giving_get_report_by_fund","description":"By-fund report slice (GET /api/giving/reports/by-fund).","scope":"giving:read"},{"name":"giving_get_report_by_giver","description":"By-giver report slice (GET /api/giving/reports/by-giver).","scope":"giving:read"},{"name":"giving_get_report_trends","description":"Giving trends report (GET /api/giving/reports/trends).","scope":"giving:read"},{"name":"giving_get_report_pledges_api","description":"Pledges report slice (GET /api/giving/reports/pledges).","scope":"giving:read"},{"name":"giving_list_report_templates","description":"List report templates (GET /api/giving/reports/templates).","scope":"giving:read"},{"name":"giving_get_report_template","description":"Get report template (GET /api/giving/reports/templates/{id}).","scope":"giving:read"},{"name":"giving_create_report_template","description":"Create/save report template (POST /api/giving/reports/templates).","scope":"giving:write"},{"name":"giving_update_report_template","description":"Update report template (PUT /api/giving/reports/templates/{id}).","scope":"giving:write"},{"name":"giving_duplicate_report_template","description":"Duplicate report template (POST /api/giving/reports/templates/{id}/duplicate).","scope":"giving:write"},{"name":"giving_delete_report_template","description":"Delete report template (DELETE /api/giving/reports/templates/{id}).","scope":"giving:write"},{"name":"giving_run_report_template","description":"Run template to generate report (POST /api/giving/reports/templates/{id}/run).","scope":"giving:write"},{"name":"giving_list_report_schedules","description":"List report schedules (GET /api/giving/reports/schedules).","scope":"giving:read"},{"name":"giving_get_report_schedule","description":"Get report schedule (GET /api/giving/reports/schedules/{id}).","scope":"giving:read"},{"name":"giving_create_report_schedule","description":"Create report schedule (POST /api/giving/reports/schedules).","scope":"giving:write"},{"name":"giving_update_report_schedule","description":"Update report schedule (PUT /api/giving/reports/schedules/{id}).","scope":"giving:write"},{"name":"giving_seed_report_templates","description":"Seed system report templates (POST /api/giving/reports/templates/seed).","scope":"giving:write"},{"name":"giving_get_gift_aid_settings","description":"Gift Aid settings (GET /api/giving/gift-aid/settings).","scope":"giving:read"},{"name":"giving_update_gift_aid_settings","description":"Update Gift Aid settings (PUT /api/giving/gift-aid/settings).","scope":"giving:write"},{"name":"giving_list_gift_aid_declarations","description":"List Gift Aid declarations (GET /api/giving/gift-aid/declarations).","scope":"giving:read"},{"name":"giving_list_gift_aid_donations","description":"Gift Aid eligible donations (GET /api/giving/gift-aid/donations).","scope":"giving:read"},{"name":"giving_get_gift_aid_statutory_summary","description":"HMRC statutory summary (GET /api/giving/gift-aid/statutory-summary).","scope":"giving:read"},{"name":"giving_list_gift_aid_claims","description":"List Gift Aid claims (GET /api/giving/gift-aid/claims).","scope":"giving:read"},{"name":"giving_create_gift_aid_claim","description":"Create Gift Aid claim (POST /api/giving/gift-aid/claims).","scope":"giving:write"},{"name":"giving_submit_gift_aid_claim","description":"Submit claim to HMRC (POST /api/giving/gift-aid/claims/{id}/submit).","scope":"giving:write"},{"name":"giving_poll_gift_aid_claim","description":"Poll HMRC claim status (POST /api/giving/gift-aid/claims/{id}/poll).","scope":"giving:read"},{"name":"giving_get_gift_aid_claim","description":"Get Gift Aid claim detail (GET /api/giving/gift-aid/claims/{id}).","scope":"giving:read"},{"name":"giving_delete_gift_aid_claim","description":"Delete Gift Aid claim (DELETE /api/giving/gift-aid/claims/{id}).","scope":"giving:write"},{"name":"giving_get_gift_aid_recovery","description":"Gift Aid recovery queue (GET /api/giving/gift-aid/recovery).","scope":"giving:read"},{"name":"giving_fix_gift_aid_recovery_address","description":"Fix address for Gift Aid recovery (POST /api/giving/gift-aid/recovery/fix-address).","scope":"giving:write"},{"name":"giving_send_gift_aid_recovery_request","description":"Send Gift Aid recovery request email (POST /api/giving/gift-aid/recovery/send-request).","scope":"giving:write"},{"name":"giving_list_statements","description":"List generated statements (GET /api/giving/statements).","scope":"giving:read"},{"name":"giving_generate_statement","description":"Generate statement (POST /api/giving/statements/generate).","scope":"giving:write"},{"name":"giving_send_statements","description":"Email statements to givers (POST /api/giving/statements/send).","scope":"giving:write"},{"name":"giving_get_statement","description":"Get statement by id (GET /api/giving/statements/{id}).","scope":"giving:read"},{"name":"giving_list_pledges_api","description":"List pledges via API (GET /api/giving/pledges). Complements giving_list_pledges.","scope":"giving:read"},{"name":"giving_get_pledge_api","description":"Pledge detail (GET /api/giving/pledges/{id}).","scope":"giving:read"},{"name":"giving_pause_pledge","description":"Pause pledge (POST /api/giving/pledges/{id}/pause).","scope":"giving:write"},{"name":"giving_resume_pledge","description":"Resume pledge (POST /api/giving/pledges/{id}/resume).","scope":"giving:write"},{"name":"giving_cancel_pledge","description":"Cancel pledge (POST /api/giving/pledges/{id}/cancel).","scope":"giving:write"},{"name":"giving_preview_import","description":"Preview donation import (POST /api/giving/import/preview).","scope":"giving:read"},{"name":"giving_execute_import","description":"Execute donation import (POST /api/giving/import/execute).","scope":"giving:write"},{"name":"giving_import_csv","description":"Import donations CSV (POST /api/giving/import/csv).","scope":"giving:write"},{"name":"giving_rollback_import","description":"Rollback import batch (POST /api/giving/import/rollback).","scope":"giving:write"},{"name":"giving_get_count_bank_review","description":"Count bank review queue (GET /api/count/bank-review).","scope":"giving:read"},{"name":"giving_list_count_funds","description":"Funds in count volunteer context (GET /api/count/funds).","scope":"giving:read"},{"name":"giving_upload_count_bank_review","description":"Upload bank statement in count context (POST /api/count/bank-review).","scope":"giving:write"},{"name":"giving_get_count_bank_review_batch","description":"Bank review batch detail (GET /api/count/bank-review/batch/{batchId}).","scope":"giving:read"},{"name":"giving_count_bank_review_action","description":"Bank review transaction action (POST /api/count/bank-review/{id}/action).","scope":"giving:write"},{"name":"giving_assign_count_bank_review","description":"Assign bank review transaction (POST /api/count/bank-review/{id}/assign).","scope":"giving:write"},{"name":"giving_get_count_summary_email","description":"Count session email summary preview (GET /api/count/summary/{sessionId}/email-summary).","scope":"giving:read"},{"name":"giving_get_counting_session_pdf","description":"Counting session PDF export (GET /api/giving/counting-sessions/{id}/pdf).","scope":"giving:read"},{"name":"giving_get_count_summary_pdf","description":"Count session summary PDF (GET /api/count/summary/{sessionId}/pdf).","scope":"giving:read"},{"name":"giving_create_paypal_order","description":"Create PayPal order for donate flow (POST /api/giving/paypal/orders).","scope":"giving:write"},{"name":"giving_capture_paypal_order","description":"Capture PayPal order (POST /api/giving/paypal/orders/{orderId}/capture).","scope":"giving:write"},{"name":"giving_delete_donate_page","description":"Permanently remove a donate page — same as dashboard delete (not pause/archive).","scope":"giving:write"},{"name":"giving_list_pledges","description":"List recurring giving pledges with progress against total pledged.","scope":"giving:read"}]},{"module":"spaces","description":"Rooms, bookings, availability, incidents, utility bills, buildings. Long tail: spaces_invoke_api_read / _write.","toolCount":112,"tools":[{"name":"spaces_invoke_api_read","description":"Invoke facilities APIs: assets, work orders, inventory, parking, HVAC, compliance. GET-only read bridge for this module's dashboard API long tail.","scope":"spaces:read"},{"name":"spaces_invoke_api_write","description":"Invoke facilities APIs: assets, work orders, inventory, parking, HVAC, compliance. Mutation bridge (POST, PUT, PATCH, DELETE) for this module's dashboard API long tail. REQUIRED: fill actionSummary in plain English — it appears in the user's approval dialog.","scope":"spaces:write"},{"name":"spaces_delete_room","description":"Permanently remove a room — same as dashboard delete (not pause/archive).","scope":"spaces:write"},{"name":"spaces_list_rooms","description":"List rooms with type, capacity, and status.","scope":"spaces:read"},{"name":"spaces_list_bookings","description":"List bookings (past and future). Use daysBack for recent history; defaults to upcoming when no range given.","scope":"spaces:read"},{"name":"spaces_check_availability","description":"Check whether a room is free between two times. Returns any conflicting bookings.","scope":"spaces:read"},{"name":"spaces_create_booking","description":"Create an internal booking for a room. Checks conflicts first and fails if the slot is taken. For public/paid hire use the public booking page instead.","scope":"spaces:write"},{"name":"spaces_list_incidents","description":"List facility incidents (maintenance issues, hazards) with severity and status.","scope":"spaces:read"},{"name":"spaces_list_utility_bills","description":"List utility/energy bills with amounts, periods, and payment status.","scope":"spaces:read"},{"name":"spaces_create_incident","description":"Report a facility incident (maintenance issue, hazard, etc.).","scope":"spaces:write"},{"name":"spaces_cancel_booking","description":"Cancel a room booking.","scope":"spaces:write"},{"name":"spaces_create_room","description":"Create a new room in the facilities module.","scope":"spaces:write"},{"name":"spaces_get_stats","description":"Spaces dashboard stats (GET /api/spaces/stats).","scope":"spaces:read"},{"name":"spaces_list_announcements","description":"Active announcements banner (GET /api/spaces/announcements).","scope":"spaces:read"},{"name":"spaces_create_announcement","description":"Create announcement (POST /api/spaces/announcements).","scope":"spaces:write"},{"name":"spaces_update_announcement","description":"Update announcement (PATCH /api/spaces/announcements/{id}).","scope":"spaces:write"},{"name":"spaces_delete_announcement","description":"Delete announcement (DELETE /api/spaces/announcements/{id}).","scope":"spaces:write"},{"name":"spaces_list_rooms_api","description":"List rooms via dashboard API (GET /api/spaces/rooms). Complements spaces_list_rooms.","scope":"spaces:read"},{"name":"spaces_find_rooms","description":"Room finder filters (POST /api/spaces/rooms/find).","scope":"spaces:read"},{"name":"spaces_get_room_api","description":"Room detail (GET /api/spaces/rooms/{id}).","scope":"spaces:read"},{"name":"spaces_update_room_api","description":"Update room (PATCH /api/spaces/rooms/{id}).","scope":"spaces:write"},{"name":"spaces_duplicate_room","description":"Duplicate room (POST /api/spaces/rooms/{id}/duplicate).","scope":"spaces:write"},{"name":"spaces_get_room_bookings","description":"Bookings for one room (GET /api/spaces/rooms/{id}/bookings).","scope":"spaces:read"},{"name":"spaces_get_room_work_orders","description":"Work orders for room (GET /api/spaces/rooms/{id}/work-orders).","scope":"spaces:read"},{"name":"spaces_get_room_assets","description":"Assets in room (GET /api/spaces/rooms/{id}/assets).","scope":"spaces:read"},{"name":"spaces_get_room_feedback","description":"Room feedback summary (GET /api/spaces/rooms/{id}/feedback).","scope":"spaces:read"},{"name":"spaces_get_room_qr","description":"Room QR code data (GET /api/spaces/rooms/{id}/qr).","scope":"spaces:read"},{"name":"spaces_list_bookings_api","description":"List bookings via API (GET /api/spaces/bookings). Complements spaces_list_bookings.","scope":"spaces:read"},{"name":"spaces_list_my_bookings","description":"My bookings (GET /api/spaces/bookings/my).","scope":"spaces:read"},{"name":"spaces_create_booking_api","description":"Create booking via API (POST /api/spaces/bookings). Complements spaces_create_booking.","scope":"spaces:write"},{"name":"spaces_get_booking","description":"Booking detail (GET /api/spaces/bookings/{id}).","scope":"spaces:read"},{"name":"spaces_update_booking","description":"Update booking (PATCH /api/spaces/bookings/{id}).","scope":"spaces:write"},{"name":"spaces_delete_booking","description":"Delete/cancel booking via API (DELETE /api/spaces/bookings/{id}).","scope":"spaces:write"},{"name":"spaces_approve_booking","description":"Approve pending booking (POST /api/spaces/bookings/{id}/approve).","scope":"spaces:write"},{"name":"spaces_reject_booking","description":"Reject booking (POST /api/spaces/bookings/{id}/reject).","scope":"spaces:write"},{"name":"spaces_duplicate_booking","description":"Duplicate booking (POST /api/spaces/bookings/{id}/duplicate).","scope":"spaces:write"},{"name":"spaces_check_booking_conflicts","description":"Check booking conflicts (POST /api/spaces/bookings/check-conflicts).","scope":"spaces:read"},{"name":"spaces_booking_check_in","description":"Check in booking (POST /api/spaces/bookings/{id}/check-in).","scope":"spaces:write"},{"name":"spaces_booking_check_out","description":"Check out booking (POST /api/spaces/bookings/{id}/check-out).","scope":"spaces:write"},{"name":"spaces_get_booking_invoice","description":"Booking invoice (GET /api/spaces/bookings/{id}/invoice).","scope":"spaces:read"},{"name":"spaces_list_recurring_bookings","description":"Recurring booking patterns (GET /api/spaces/bookings/recurring).","scope":"spaces:read"},{"name":"spaces_create_recurring_booking","description":"Create recurring pattern (POST /api/spaces/bookings/recurring).","scope":"spaces:write"},{"name":"spaces_list_approvals","description":"Pending booking approvals queue (GET /api/spaces/approvals). Approvals tab.","scope":"spaces:read"},{"name":"spaces_bulk_approve_bookings","description":"Bulk approve bookings (POST /api/spaces/approvals/bulk).","scope":"spaces:write"},{"name":"spaces_get_calendar","description":"Calendar aggregated view (GET /api/spaces/calendar).","scope":"spaces:read"},{"name":"spaces_list_buildings_api","description":"List buildings (GET /api/spaces/buildings). Complements spaces_list_buildings.","scope":"spaces:read"},{"name":"spaces_get_building","description":"Building detail with rooms (GET /api/spaces/buildings/{id}).","scope":"spaces:read"},{"name":"spaces_create_building","description":"Create building (POST /api/spaces/buildings).","scope":"spaces:write"},{"name":"spaces_update_building","description":"Update building (PATCH /api/spaces/buildings/{id}).","scope":"spaces:write"},{"name":"spaces_delete_building","description":"Delete building (DELETE /api/spaces/buildings/{id}).","scope":"spaces:write"},{"name":"spaces_duplicate_building","description":"Duplicate building (POST /api/spaces/buildings/{id}/duplicate).","scope":"spaces:write"},{"name":"spaces_list_building_leases","description":"Building leases (GET /api/spaces/buildings/{id}/leases).","scope":"spaces:read"},{"name":"spaces_manage_building_lease","description":"Create/update building lease (POST/PATCH /api/spaces/buildings/{id}/leases).","scope":"spaces:write"},{"name":"spaces_list_floor_plans","description":"List floor plans (GET /api/spaces/floor-plans).","scope":"spaces:read"},{"name":"spaces_create_floor_plan","description":"Create floor plan (POST /api/spaces/floor-plans).","scope":"spaces:write"},{"name":"spaces_update_floor_plan","description":"Update floor plan (PATCH /api/spaces/floor-plans/{id}).","scope":"spaces:write"},{"name":"spaces_delete_floor_plan","description":"Delete floor plan (DELETE /api/spaces/floor-plans/{id}).","scope":"spaces:write"},{"name":"spaces_upload_file","description":"Upload file for floor plans/assets (POST /api/spaces/uploads).","scope":"spaces:write"},{"name":"spaces_list_assets_api","description":"List assets (GET /api/spaces/assets).","scope":"spaces:read"},{"name":"spaces_get_asset","description":"Asset detail (GET /api/spaces/assets/{id}).","scope":"spaces:read"},{"name":"spaces_create_asset","description":"Create asset (POST /api/spaces/assets).","scope":"spaces:write"},{"name":"spaces_update_asset","description":"Update asset (PATCH /api/spaces/assets/{id}).","scope":"spaces:write"},{"name":"spaces_scan_asset","description":"Resolve asset by QR scan token (GET /api/spaces/assets/scan/{token}).","scope":"spaces:read"},{"name":"spaces_export_assets","description":"Export assets CSV (GET /api/spaces/assets?format=csv).","scope":"spaces:read"},{"name":"spaces_qr_labels_batch","description":"Batch QR labels (GET /api/spaces/assets/batch-qr).","scope":"spaces:read"},{"name":"spaces_run_asset_depreciation","description":"Run depreciation calc (POST /api/spaces/assets/depreciation).","scope":"spaces:write"},{"name":"spaces_import_assets","description":"Bulk import assets (POST /api/spaces/assets/import or bulk-import).","scope":"spaces:write"},{"name":"spaces_list_work_orders","description":"List work orders (GET /api/spaces/work-orders).","scope":"spaces:read"},{"name":"spaces_create_work_order","description":"Create work order (POST /api/spaces/work-orders).","scope":"spaces:write"},{"name":"spaces_get_work_order","description":"Work order detail (GET /api/spaces/work-orders/{id}).","scope":"spaces:read"},{"name":"spaces_update_work_order","description":"Update work order (PATCH /api/spaces/work-orders/{id}).","scope":"spaces:write"},{"name":"spaces_assign_work_order","description":"Assign work order (POST /api/spaces/work-orders/{id}/assign).","scope":"spaces:write"},{"name":"spaces_complete_work_order","description":"Complete work order (POST /api/spaces/work-orders/{id}/complete).","scope":"spaces:write"},{"name":"spaces_list_work_order_templates","description":"Work order templates (GET /api/spaces/work-orders/templates).","scope":"spaces:read"},{"name":"spaces_create_work_order_from_template","description":"Create work order from template (POST /api/spaces/work-orders/from-template).","scope":"spaces:write"},{"name":"spaces_list_maintenance_schedules","description":"Preventive maintenance schedules (GET /api/spaces/maintenance/schedules).","scope":"spaces:read"},{"name":"spaces_get_maintenance_upcoming","description":"Upcoming maintenance (GET /api/spaces/maintenance/upcoming).","scope":"spaces:read"},{"name":"spaces_list_tasks","description":"List facility tasks (GET /api/spaces/tasks).","scope":"spaces:read"},{"name":"spaces_list_my_tasks","description":"My assigned tasks (GET /api/spaces/tasks/my).","scope":"spaces:read"},{"name":"spaces_complete_task","description":"Complete task (POST /api/spaces/tasks/{id}/complete).","scope":"spaces:write"},{"name":"spaces_claim_task","description":"Claim unassigned task (POST /api/spaces/tasks/{id}/claim).","scope":"spaces:write"},{"name":"spaces_list_incidents_api","description":"List incidents via API (GET /api/spaces/incidents).","scope":"spaces:read"},{"name":"spaces_create_incident_api","description":"Report incident via API (POST /api/spaces/incidents). Complements spaces_create_incident.","scope":"spaces:write"},{"name":"spaces_get_incident","description":"Incident detail (GET /api/spaces/incidents/{id}).","scope":"spaces:read"},{"name":"spaces_update_incident","description":"Update incident (PATCH /api/spaces/incidents/{id}).","scope":"spaces:write"},{"name":"spaces_list_visitors","description":"Visitor log (GET /api/spaces/visitors).","scope":"spaces:read"},{"name":"spaces_visitor_sign_in","description":"Visitor sign-in (POST /api/spaces/visitors/sign-in).","scope":"spaces:write"},{"name":"spaces_visitor_sign_out","description":"Visitor sign-out (POST /api/spaces/visitors/{id}/sign-out).","scope":"spaces:write"},{"name":"spaces_list_energy_readings","description":"Energy meter readings (GET /api/spaces/energy/readings).","scope":"spaces:read"},{"name":"spaces_record_energy_reading","description":"Record energy reading (POST /api/spaces/energy/readings).","scope":"spaces:write"},{"name":"spaces_list_energy_bills_api","description":"Utility bills list (GET /api/spaces/energy/bills). Complements spaces_list_utility_bills.","scope":"spaces:read"},{"name":"spaces_create_energy_bill","description":"Create utility bill (POST /api/spaces/energy/bills).","scope":"spaces:write"},{"name":"spaces_parse_energy_bill","description":"Parse bill document with AI (POST /api/spaces/energy/bills/parse).","scope":"spaces:write"},{"name":"spaces_update_energy_bill","description":"Update utility bill (PATCH /api/spaces/energy/bills/{id}).","scope":"spaces:write"},{"name":"spaces_list_marketplace_listings","description":"Internal marketplace listings (GET /api/spaces/marketplace/listings).","scope":"spaces:read"},{"name":"spaces_request_marketplace_listing","description":"Request marketplace item (POST /api/spaces/marketplace/request).","scope":"spaces:write"},{"name":"spaces_get_marketplace_listing","description":"Marketplace listing detail (GET /api/spaces/marketplace/listings/{id}).","scope":"spaces:read"},{"name":"spaces_get_report_api","description":"Spaces reports tab data (GET /api/spaces/reports/{type}).","scope":"spaces:read"},{"name":"spaces_list_resources","description":"Bookable resources (GET /api/spaces/resources).","scope":"spaces:read"},{"name":"spaces_checkout_resource","description":"Checkout resource (POST /api/spaces/resources/{id}/checkout).","scope":"spaces:write"},{"name":"spaces_return_resource","description":"Return resource (POST /api/spaces/resources/{id}/return).","scope":"spaces:write"},{"name":"spaces_invoke_ai","description":"Call Spaces AI endpoint (POST /api/spaces/ai/{endpoint}).","scope":"spaces:write"},{"name":"spaces_list_team_access_api","description":"Spaces addon team access (GET /api/spaces/team). Settings → Team Access.","scope":"spaces:read"},{"name":"spaces_update_team_access_api","description":"Manage spaces team members (POST /api/spaces/team).","scope":"spaces:write"},{"name":"spaces_get_compliance_dashboard","description":"Compliance dashboard (GET /api/spaces/compliance/dashboard).","scope":"spaces:read"},{"name":"spaces_list_compliance_inspections","description":"Compliance inspections (GET /api/spaces/compliance/inspections).","scope":"spaces:read"},{"name":"spaces_list_inventory","description":"Inventory items (GET /api/spaces/inventory).","scope":"spaces:read"},{"name":"spaces_list_keys","description":"Key register (GET /api/spaces/keys).","scope":"spaces:read"},{"name":"spaces_get_parking_availability","description":"Parking availability (GET /api/spaces/parking/availability).","scope":"spaces:read"},{"name":"spaces_get_budget_tracking","description":"Facilities budget tracking (GET /api/spaces/budget/tracking).","scope":"spaces:read"},{"name":"spaces_check_weather","description":"Weather check for outdoor bookings (GET /api/spaces/weather/check).","scope":"spaces:read"},{"name":"spaces_list_buildings","description":"List buildings/campuses with capacity and address.","scope":"spaces:read"}]},{"module":"mediahub","description":"Media Hub published content, podcasts, playlists. Org file assets: platform_list_media_library_files. Long tail: mediahub_invoke_api_read / _write.","toolCount":12,"tools":[{"name":"mediahub_invoke_api_read","description":"Invoke Media Hub APIs plus org Media Library GET /api/media. Courses, distribution, workflow, social, worship content. GET-only read bridge for this module's dashboard API long tail.","scope":"mediahub:read"},{"name":"mediahub_invoke_api_write","description":"Invoke Media Hub APIs plus org Media Library GET /api/media. Courses, distribution, workflow, social, worship content. Mutation bridge (POST, PUT, PATCH, DELETE) for this module's dashboard API long tail. REQUIRED: fill actionSummary in plain English — it appears in the user's approval dialog.","scope":"mediahub:write"},{"name":"mediahub_delete_media_item","description":"Permanently remove a media item — same as dashboard delete (not pause/archive).","scope":"mediahub:write"},{"name":"mediahub_list_podcast_episodes","description":"List podcast episodes with play/download counts, optionally for one feed.","scope":"mediahub:read"},{"name":"mediahub_list_media_items","description":"Browse Media Hub published content (sermons, podcast episodes, videos in media_items) — NOT org Media Library file assets at /media. For logos/images/documents use platform_list_media_library_files.","scope":"mediahub:read"},{"name":"mediahub_get_media_analytics","description":"Play/download/view analytics for one media item, or the org top-10 summary if no id given.","scope":"mediahub:read"},{"name":"mediahub_create_media_item","description":"Create a draft Media Hub item. mediaType is delivery format (audio/video/document/image); stored as content_format + semantic media_type (sermon, podcast_episode, custom). NOT org Media Library files.","scope":"mediahub:write"},{"name":"mediahub_publish_media_item","description":"Publish a media item immediately (sets status to published).","scope":"mediahub:write"},{"name":"mediahub_cleanup_probe_items","description":"Remove empty MCP smoke-test Media Hub drafts (titles starting with invoke-all-). Use this instead of mediahub_delete_media_item when cleaning probe clutter — supports bulk Allow in Claude. Does not touch published sermons or real uploads.","scope":"mediahub:write"},{"name":"mediahub_list_playlists","description":"List media playlists with item counts and visibility.","scope":"mediahub:read"},{"name":"mediahub_create_playlist","description":"Create a media playlist.","scope":"mediahub:write"},{"name":"mediahub_delete_playlist","description":"Delete a media playlist and its items. Pass playlistId or title to match one playlist.","scope":"mediahub:write"}]},{"module":"live","description":"Streams, polls, viewer stats. Long tail: live_invoke_api_read / _write.","toolCount":10,"tools":[{"name":"live_invoke_api_read","description":"Invoke live streaming APIs: streams, simulcast, destinations, polls, bridge. GET-only read bridge for this module's dashboard API long tail.","scope":"live:read"},{"name":"live_invoke_api_write","description":"Invoke live streaming APIs: streams, simulcast, destinations, polls, bridge. Mutation bridge (POST, PUT, PATCH, DELETE) for this module's dashboard API long tail. REQUIRED: fill actionSummary in plain English — it appears in the user's approval dialog.","scope":"live:write"},{"name":"live_delete_stream","description":"Permanently remove a live stream — same as dashboard delete (not pause/archive).","scope":"live:write"},{"name":"live_delete_poll","description":"Permanently remove a live poll — same as dashboard delete (not pause/archive).","scope":"live:write"},{"name":"live_list_streams","description":"List live streams with viewer stats, optionally filtered by status (scheduled, live, ended).","scope":"live:read"},{"name":"live_get_stream_stats","description":"Viewer, watch-time, interaction, and giving stats for one stream.","scope":"live:read"},{"name":"live_schedule_stream","description":"Schedule a new live stream (creates Mux ingest + playback). Peak viewer limits apply at join time.","scope":"live:write"},{"name":"live_update_stream","description":"Update a scheduled live stream title, description, or schedule time.","scope":"live:write"},{"name":"live_list_polls","description":"List polls for a live stream with options and active state.","scope":"live:read"},{"name":"live_create_poll","description":"Create a viewer poll on a live stream.","scope":"live:write"}]},{"module":"store","description":"Shops, products, orders. Long tail: store_invoke_api_read / _write.","toolCount":7,"tools":[{"name":"store_invoke_api_read","description":"Invoke media shop APIs: products, orders, distribution, merch. GET-only read bridge for this module's dashboard API long tail.","scope":"store:read"},{"name":"store_invoke_api_write","description":"Invoke media shop APIs: products, orders, distribution, merch. Mutation bridge (POST, PUT, PATCH, DELETE) for this module's dashboard API long tail. REQUIRED: fill actionSummary in plain English — it appears in the user's approval dialog.","scope":"store:write"},{"name":"store_list_shops","description":"List media shops for the organization (org shop + speaker shops).","scope":"store:read"},{"name":"store_list_products","description":"List products in a shop.","scope":"store:read"},{"name":"store_ensure_org_shop","description":"Ensure the organization has a default org shop (creates one if missing).","scope":"store:write"},{"name":"store_create_product","description":"Sell an existing media item as a product in a shop. The item must already exist in MediaHub (see mediahub tools).","scope":"store:write"},{"name":"store_list_orders","description":"List store orders with amounts and status.","scope":"store:read"}]},{"module":"community","description":"Pastoral care: life events, follow-up radar, care team, safeguarding, prayer requests, visits. Notes sync to contact_care_timeline. Long tail: community_invoke_api_read / _write.","toolCount":15,"tools":[{"name":"community_invoke_api_read","description":"Invoke pastoral care APIs: outreach, grief journeys, care predictions, follow-ups. GET-only read bridge for this module's dashboard API long tail.","scope":"community:read"},{"name":"community_invoke_api_write","description":"Invoke pastoral care APIs: outreach, grief journeys, care predictions, follow-ups. Mutation bridge (POST, PUT, PATCH, DELETE) for this module's dashboard API long tail. REQUIRED: fill actionSummary in plain English — it appears in the user's approval dialog.","scope":"community:write"},{"name":"community_list_life_event_types","description":"List available life event types (baptism, bereavement, marriage, etc.) grouped by category. Use the returned id when logging events.","scope":"community:read"},{"name":"community_list_life_events","description":"List recent life events for the organization, newest first. Confidential events are excluded.","scope":"community:read"},{"name":"community_log_life_event","description":"Log a life event for a contact (e.g. bereavement, baptism, new baby). The contact becomes a community member. Grief events automatically create a 1-year anniversary reminder.","scope":"community:write"},{"name":"community_pending_followups","description":"Pastoral care radar — due/overdue life-event follow-ups with speakToUser. Confidential events are excluded automatically.","scope":"community:read"},{"name":"community_list_care_team","description":"List care team roles and current assignments.","scope":"community:read"},{"name":"community_list_safeguarding_checks","description":"List safeguarding checks (DBS etc.) with status and expiry. Read-only compliance overview.","scope":"community:read"},{"name":"community_resolve_life_event","description":"Mark a life event as resolved/closed and clear follow-up dates.","scope":"community:write"},{"name":"community_complete_followup","description":"Mark a life-event follow-up complete (contact_life_events). NOT pastoral CRM notes (people_complete_note_followup) or Welcome Desk tasks (people_complete_follow_up_task).","scope":"community:write"},{"name":"community_list_prayer_requests","description":"List prayer requests — optionally filter to urgent or active only.","scope":"community:read"},{"name":"community_create_prayer_request","description":"Log a prayer request for a contact.","scope":"community:write"},{"name":"community_delete_prayer_request","description":"Delete a prayer request (hard delete). Use prayerRequestId from community_list_prayer_requests, or requestContains to match request text (optionally with contactId). For answered prayers prefer marking answered in the dashboard.","scope":"community:write"},{"name":"community_list_pastoral_visits","description":"List pastoral visit history for a contact.","scope":"community:read"},{"name":"community_log_pastoral_visit","description":"Log a pastoral visit (home, hospital, phone, video, office).","scope":"community:write"}]},{"module":"channels","description":"Send email/SMS/WhatsApp (metered + compliance-checked). Messaging credits: platform_usage. Long tail: channels_invoke_api_read / _write.","toolCount":124,"tools":[{"name":"channels_invoke_api_read","description":"Invoke messaging APIs: SMS, WhatsApp campaigns, conversations, templates, quota. GET-only read bridge for this module's dashboard API long tail.","scope":"channels:read"},{"name":"channels_invoke_api_write","description":"Invoke messaging APIs: SMS, WhatsApp campaigns, conversations, templates, quota. Mutation bridge (POST, PUT, PATCH, DELETE) for this module's dashboard API long tail. REQUIRED: fill actionSummary in plain English — it appears in the user's approval dialog.","scope":"channels:send"},{"name":"channels_delete_sms_campaign","description":"Permanently remove a SMS campaign — same as dashboard delete (not pause/archive).","scope":"channels:send"},{"name":"channels_delete_whatsapp_campaign","description":"Permanently remove a WhatsApp campaign — same as dashboard delete (not pause/archive).","scope":"channels:send"},{"name":"channels_send_email","description":"Send a single transactional email. REQUIRED: subject + (text OR html OR mediaLibraryFileId+text). Recipient: to OR contactId. With contactId: merge tags {{salutation_name}}, {{title}}, {{first_name}}, {{last_name}}, {{full_name}}, {{org_name}} in subject/text/html; auto greeting Hi {salutation_name}, (includes Pastor/Mr when title on contact) unless personalizedGreeting:false. Read sendifai://docs/email-personalization. Images: mediaLibraryFileId + text below flyer (never image-only). CDN URLs only (media.sendifai.com). Metered against Email Marketing allowance.","scope":"channels:send"},{"name":"channels_send_sms","description":"Send a text message (SMS) to one mobile number. REQUIRED: body (message text). Recipient: to (E.164, e.g. +447776725182) OR contactId (CRM UUID — resolves cell_phone/phone). Aliases message/text→body, phone/mobile→to. Optional senderName (NOT senderId) — call channels_list_sms_senders first. During quiet hours, queues unless skipQuietHours is true.","scope":"channels:send"},{"name":"channels_list_scheduled_sms","description":"List outbound SMS still queued (quiet hours or future schedule). Use before channels_cancel_scheduled_sms when the user wants to undo a mistaken send.","scope":"channels:read"},{"name":"channels_cancel_scheduled_sms","description":"Cancel a queued SMS before it sends (quiet hours / scheduled). Pass messageId (full UUID from channels_list_scheduled_sms) OR combine to + bodyContains / messageIdSuffix to target one row. Refunds messaging credits when possible.","scope":"channels:send"},{"name":"channels_send_whatsapp","description":"Send WhatsApp to one recipient. Params: to, text OR templateName — not body/message. Polls up to ~18s for Meta delivered/read webhook confirmation. Returns sender verifiedName + phoneNumber, deliveryStatus, deliveredAt, and speakToUser — relay speakToUser to the user. Free-form text only inside an open 24h session; otherwise pass templateName from templates_list_whatsapp_templates (status approved). IMAGE header templates: omit templateBodyParams when body has no {{n}}; platform uploads flyer to Meta automatically. Optional mediaLibraryFileId from platform_list_media_library_files. Set skipQuietHours:true when user asked to send now.","scope":"channels:send"},{"name":"channels_diagnose_whatsapp","description":"Explain WhatsApp delivery status honestly — Meta accepted vs delivered/failed, 24h window, auth/reconnect. Use when the user says a WhatsApp did not arrive after a send reported success. Always relay speakToUser; never claim delivered unless status is delivered/read.","scope":"channels:read"},{"name":"channels_diagnose_sms","description":"Explain why a text may not have been delivered — sender setup, quiet hours, queued messages, frequency caps. Always relay speakToUser. Use when the user asks why a text failed or before retrying.","scope":"channels:read"},{"name":"channels_get_sms_settings","description":"Low-level SMS configuration (sender IDs, quiet hours). Prefer channels_diagnose_sms when the user asks why a text failed — summarise results in plain English.","scope":"channels:read"},{"name":"channels_list_sms_senders","description":"List SMS sender IDs for the organisation (name, label, approval status, default). Use before changing sender or when the user asks which sender IDs they have.","scope":"channels:read"},{"name":"channels_set_sms_sender","description":"PRIMARY tool when the user says set/change/use a sender ID (e.g. \"set senderID to Freedom Arena\"). Accepts long brand names: auto-shortens to a carrier-legal 3–11 char on-phone ID (Freedom Arena → FA Arena), keeps the full name as label. New senders are submitted for sendifai compliance review (pending — not approved instantly). Use setAsDefault only for already-approved senders. Do NOT use dashboard API search or Chrome for this.","scope":"channels:send"},{"name":"channels_create_sms_sender","description":"Create an alphanumeric SMS sender ID (submitted for sendifai compliance review — pending until approved, typically within 72 hours). Prefer channels_set_sms_sender when resolving a name. Accepts names longer than 11 chars (auto-shortens; full name becomes label). Org owners cannot self-approve.","scope":"channels:send"},{"name":"channels_approve_sms_sender","description":"Platform superadmin only — approve a pending SMS sender ID after compliance review. Org owners cannot use this; they must wait for sendifai approval (Admin → Sender IDs). Optionally setAsDefault after approval.","scope":"channels:send"},{"name":"channels_set_default_sms_sender","description":"Set an approved SMS sender as the organisation default (e.g. senderName MTZionFA). Texts without an explicit senderName will use this. Pass senderName — you do not need a UUID. Fails if the sender is still pending or revoked.","scope":"channels:send"},{"name":"channels_deactivate_sms_sender","description":"Delete/deactivate an unlocked, non-default SMS sender by senderName (e.g. RCCGWT). Soft-deletes the row. If it is currently the default, call channels_set_default_sms_sender on another approved sender first. Cannot remove locked senders that have already been used.","scope":"channels:send"},{"name":"channels_get_whatsapp_account","description":"Read the org WhatsApp Business account: phone number, Meta verified display name (what contacts see in chat), pending name review status, and local dashboard label. Use when the user asks what their WhatsApp name/ID is, or to check Meta approval progress after channels_set_whatsapp_display_name. Always relay userMessage in plain English — never claim a pending name is live.","scope":"channels:read"},{"name":"channels_set_whatsapp_display_name","description":"PRIMARY tool when the user says set WhatsApp ID / WhatsApp display name / WhatsApp business name (e.g. \"set WhatsApp ID to Freedom Arena\"). Submits the name to Meta for review — contacts do NOT see it until Meta approves and we re-register (automatic via webhook). Always tell the user the userMessage: pending vs already live. Do NOT use channels_set_sms_sender for WhatsApp. Do NOT open Meta Business Manager or Chrome.","scope":"channels:send"},{"name":"channels_finalize_whatsapp_display_name","description":"After Meta APPROVES a WhatsApp display name, re-register the phone so the name goes live. Usually automatic via webhook — use if the user says Meta approved but the chat name has not updated, or after channels_get_whatsapp_account shows approved_needs_reregister.","scope":"channels:send"},{"name":"channels_get_whatsapp_business_verification","description":"Read WhatsApp Business Verification status — whether Meta has verified the business so the chat header can show the business name instead of the phone number. Use when the user asks about business verification, BV, or why WhatsApp still shows a phone number after display name approval. Relay userMessage; direct them to Channels → Messages → Settings → Business Verification to upload documents in sendifai (no Meta Business Manager).","scope":"channels:read"},{"name":"channels_sync_whatsapp_business_verification","description":"Pull the latest WhatsApp Business Verification status from Meta into sendifai. Use after document submission or when the user asks to refresh BV status. Does not submit documents — use the dashboard Business Verification section for uploads.","scope":"channels:read"},{"name":"channels_set_whatsapp_label","description":"Set the local dashboard nickname for the WhatsApp number only. Does NOT change what contacts see in WhatsApp — use channels_set_whatsapp_display_name for that.","scope":"channels:send"},{"name":"channels_list_conversations","description":"Unified inbox conversations (GET /api/messages/conversations) — SMS, WhatsApp, and Telegram. Same as Messages tab.","scope":"channels:read"},{"name":"channels_get_messaging_quota","description":"Read remaining messaging credits and SMS/WhatsApp quota for the organization. Pair with `platform_usage` for full metered billing state.","scope":"channels:read"},{"name":"channels_create_whatsapp_campaign","description":"Create a draft WhatsApp campaign bound to an approved template and optional segment. Use channels_preview_whatsapp_campaign_send then channels_send_whatsapp_campaign — never loop channels_send_whatsapp for blasts.","scope":"channels:send"},{"name":"channels_preview_whatsapp_campaign_send","description":"Preview WhatsApp campaign audience: eligible vs excluded (no phone, no consent, unsubscribed) plus messaging credit estimate. Always call before channels_send_whatsapp_campaign.","scope":"channels:read"},{"name":"channels_send_whatsapp_campaign","description":"Send a WhatsApp campaign to its segment/template audience. Call without confirm for preview; set confirm:true to execute. Mass sends run in the background — poll channels_whatsapp_campaign_status.","scope":"channels:send"},{"name":"channels_whatsapp_campaign_status","description":"Poll WhatsApp campaign send progress after channels_send_whatsapp_campaign (background sends).","scope":"channels:read"},{"name":"channels_preview_marketing_blast","description":"Preview a dual-channel marketing blast (email + WhatsApp) like Sunday service announcements: eligible recipient counts, flyer detection, usage limits. Email auto-greeting and WhatsApp {{1}} use titled salutation when contact has prefix/metadata.title. REQUIRED before channels_run_marketing_blast. Supports preset sunday_service_restoration (flyer + Restoration Agenda copy + freedom_sunday_restoration_full WA template). Read sendifai://docs/email-personalization.","scope":"channels:read"},{"name":"channels_run_marketing_blast","description":"Run email + WhatsApp marketing blast to all eligible contacts. Email uses inline CID flyer (one.com-safe) and Hi {salutation_name}, greetings (Pastor/Mr when title on contact). WhatsApp {{1}} uses same titled name. Call channels_preview_marketing_blast first; set confirm:true to send. Background job — poll channels_marketing_blast_status. Never loop channels_send_email/channels_send_whatsapp for mass audiences.","scope":"channels:send"},{"name":"channels_marketing_blast_status","description":"Poll marketing blast progress after channels_run_marketing_blast — email/WhatsApp sent and failed counts, sample failure reasons.","scope":"channels:read"},{"name":"channels_email_deliverability_report","description":"List hard bounces and spam complaints for org contacts — Postmark inactive addresses, suppression list, and CRM bounced/complained status. Use after a blast to answer \"who failed and why\" or audit list hygiene.","scope":"channels:read"},{"name":"channels_list_email_campaigns","description":"List email campaigns via dashboard API (GET /api/campaigns). Complements grow_list_campaigns DB read.","scope":"channels:read"},{"name":"channels_get_email_settings","description":"Email channel settings (GET /api/channels/email/settings).","scope":"channels:read"},{"name":"channels_set_email_settings","description":"Update email channel settings (PATCH /api/channels/email/settings).","scope":"channels:write"},{"name":"channels_get_email_analytics","description":"Email analytics dashboard (GET /api/analytics/email).","scope":"channels:read"},{"name":"channels_sync_email_analytics","description":"Sync email analytics from provider (POST /api/analytics/sync).","scope":"channels:write"},{"name":"channels_get_email_insights_correlations","description":"Email insights correlations (GET/POST /api/ai/correlations).","scope":"channels:read"},{"name":"channels_get_competitive_intelligence","description":"Competitive intelligence insights (GET /api/ai/competitive-intelligence).","scope":"channels:read"},{"name":"channels_get_email_attribution","description":"Email attribution paths (GET /api/ai/attribution?paths=true).","scope":"channels:read"},{"name":"channels_list_email_ab_tests","description":"List email A/B tests (GET /api/ab-tests).","scope":"channels:read"},{"name":"channels_create_email_ab_test","description":"Create email A/B test (POST /api/ab-tests).","scope":"channels:write"},{"name":"channels_update_email_ab_test","description":"Update email A/B test (PUT /api/ab-tests/{id}).","scope":"channels:write"},{"name":"channels_remove_email_ab_test","description":"Delete email A/B test (DELETE /api/ab-tests/{id}).","scope":"channels:write"},{"name":"channels_start_email_ab_test","description":"Start email A/B test (POST /api/ab-tests/{id}/start).","scope":"channels:write"},{"name":"channels_pause_email_ab_test","description":"Pause email A/B test (POST /api/ab-tests/{id}/pause).","scope":"channels:write"},{"name":"channels_get_email_ab_test_results","description":"A/B test results (GET /api/ab-tests/{id}/results).","scope":"channels:read"},{"name":"channels_select_email_ab_test_winner","description":"Select A/B test winner variant (POST /api/ab-tests/{id}/select-winner).","scope":"channels:write"},{"name":"channels_send_email_ab_test_winner","description":"Send winner variant to remainder (POST /api/ab-tests/{id}/send-winner).","scope":"channels:send"},{"name":"channels_get_campaign_recipients","description":"Campaign recipient delivery rows (GET /api/campaigns/{id}/recipients).","scope":"channels:read"},{"name":"channels_estimate_campaign_audience","description":"Audience size estimate for email or messaging campaigns (POST /api/campaigns/audience-estimate).","scope":"channels:read"},{"name":"channels_test_send_email","description":"Send test email from builder (POST /api/channels/email/test-send).","scope":"channels:send"},{"name":"channels_get_email_campaign_detail","description":"Email campaign detail from dashboard API (GET /api/campaigns/{id}). Use grow_send_campaign to send.","scope":"channels:read"},{"name":"channels_get_legacy_email_message","description":"Legacy single email message (GET /api/channels/email/{id}).","scope":"channels:read"},{"name":"channels_list_unified_conversations","description":"Unified inbox conversation list (GET /api/messages/conversations). Prefer over channels_list_conversations for Messages tab parity.","scope":"channels:read"},{"name":"channels_get_unified_conversation","description":"Inbox thread messages (GET /api/messages/conversations/{id}).","scope":"channels:read"},{"name":"channels_mark_conversation_read","description":"Mark SMS/WhatsApp/Telegram conversation read (PATCH /api/{channel}/conversations/{id}).","scope":"channels:write"},{"name":"channels_send_telegram","description":"Send Telegram message (POST /api/telegram/send). For 1:1 use channels_send_sms/WA for SMS/WhatsApp.","scope":"channels:send"},{"name":"channels_list_sms_campaigns","description":"List SMS campaigns (GET /api/sms/campaigns).","scope":"channels:read"},{"name":"channels_get_sms_campaign","description":"SMS campaign detail (GET /api/sms/campaigns/{id}).","scope":"channels:read"},{"name":"channels_create_sms_campaign","description":"Create or update SMS campaign (POST /api/sms/campaigns or PATCH /api/sms/campaigns/{id}).","scope":"channels:write"},{"name":"channels_create_sms_empty_draft","description":"Create empty SMS campaign draft (POST /api/sms/campaigns/empty-draft).","scope":"channels:write"},{"name":"channels_send_sms_campaign","description":"Send SMS campaign (POST /api/sms/campaigns/{id}/send).","scope":"channels:send"},{"name":"channels_schedule_sms_campaign","description":"Schedule SMS campaign (POST /api/sms/campaigns/{id}/schedule).","scope":"channels:write"},{"name":"channels_duplicate_sms_campaign","description":"Duplicate SMS campaign (POST /api/sms/campaigns/{id}/duplicate).","scope":"channels:write"},{"name":"channels_list_whatsapp_campaigns","description":"List WhatsApp campaigns (GET /api/whatsapp/campaigns).","scope":"channels:read"},{"name":"channels_get_whatsapp_campaign","description":"WhatsApp campaign detail (GET /api/whatsapp/campaigns/{id}).","scope":"channels:read"},{"name":"channels_send_whatsapp_campaign_api","description":"Send WhatsApp campaign via dashboard API (POST /api/whatsapp/campaigns/{id}/send).","scope":"channels:send"},{"name":"channels_duplicate_whatsapp_campaign","description":"Duplicate WhatsApp campaign (POST /api/whatsapp/campaigns/{id}/duplicate).","scope":"channels:write"},{"name":"channels_list_telegram_campaigns","description":"List Telegram campaigns (GET /api/telegram/campaigns).","scope":"channels:read"},{"name":"channels_create_telegram_campaign","description":"Create Telegram campaign (POST /api/telegram/campaigns).","scope":"channels:write"},{"name":"channels_send_telegram_campaign","description":"Send Telegram campaign (POST /api/telegram/campaigns/{id}/send).","scope":"channels:send"},{"name":"channels_duplicate_telegram_campaign","description":"Duplicate Telegram campaign (POST /api/telegram/campaigns/{id}/duplicate).","scope":"channels:write"},{"name":"channels_list_sms_org_templates","description":"List org SMS templates (GET /api/sms/templates). Not Meta WhatsApp templates.","scope":"channels:read"},{"name":"channels_create_sms_org_template","description":"Create SMS org template (POST /api/sms/templates).","scope":"channels:write"},{"name":"channels_update_sms_org_template","description":"Update SMS org template (PATCH /api/sms/templates/{id}).","scope":"channels:write"},{"name":"channels_remove_sms_org_template","description":"Delete SMS org template (DELETE /api/sms/templates/{id}).","scope":"channels:write"},{"name":"channels_set_sms_quiet_hours","description":"Update SMS quiet hours (PUT /api/sms/quiet-hours).","scope":"channels:write"},{"name":"channels_update_whatsapp_profile","description":"Update WhatsApp business profile fields (PATCH /api/whatsapp/profile).","scope":"channels:write"},{"name":"channels_get_whatsapp_qr","description":"WhatsApp QR connect code (GET /api/whatsapp/qr).","scope":"channels:read"},{"name":"channels_get_whatsapp_conversation_window","description":"WhatsApp 24h window status (GET /api/whatsapp/conversation-window).","scope":"channels:read"},{"name":"channels_get_telegram_setup","description":"Telegram bot setup status (GET /api/telegram/setup).","scope":"channels:read"},{"name":"channels_configure_telegram","description":"Configure Telegram bot (POST /api/telegram/setup).","scope":"channels:write"},{"name":"channels_remove_telegram_setup","description":"Disconnect Telegram (DELETE /api/telegram/setup).","scope":"channels:write"},{"name":"channels_list_sms_opt_outs","description":"SMS opt-out list (GET /api/sms/opt-outs).","scope":"channels:read"},{"name":"channels_list_whatsapp_opt_outs","description":"WhatsApp opt-out list (GET /api/whatsapp/opt-outs).","scope":"channels:read"},{"name":"channels_list_telegram_opt_outs","description":"Telegram opt-out list (GET /api/telegram/opt-outs).","scope":"channels:read"},{"name":"channels_get_messaging_analytics","description":"Messaging analytics for SMS, WhatsApp, or Telegram.","scope":"channels:read"},{"name":"channels_list_sms_automations","description":"List SMS automations (GET /api/sms/automations).","scope":"channels:read"},{"name":"channels_create_sms_automation","description":"Create SMS automation (POST /api/sms/automations).","scope":"channels:write"},{"name":"channels_update_sms_automation","description":"Update SMS automation (PATCH /api/sms/automations/{id}).","scope":"channels:write"},{"name":"channels_remove_sms_automation","description":"Delete SMS automation (DELETE /api/sms/automations/{id}).","scope":"channels:write"},{"name":"channels_list_messaging_ab_tests","description":"List messaging A/B tests (GET /api/{channel}/ab-tests).","scope":"channels:read"},{"name":"channels_create_messaging_ab_test","description":"Create messaging A/B test (POST /api/{channel}/ab-tests).","scope":"channels:write"},{"name":"channels_update_messaging_ab_test","description":"Update messaging A/B test (PATCH /api/{channel}/ab-tests/{id}).","scope":"channels:write"},{"name":"channels_remove_messaging_ab_test","description":"Delete messaging A/B test (DELETE /api/{channel}/ab-tests/{id}).","scope":"channels:write"},{"name":"channels_list_short_links","description":"List tracked short links (GET /api/channels/messages/links).","scope":"channels:read"},{"name":"channels_create_short_link","description":"Create short link (POST /api/sms/shortlinks/create).","scope":"channels:write"},{"name":"channels_get_messaging_ai_insights","description":"AI insights for messaging analytics tab (GET /api/ai/insights).","scope":"channels:read"},{"name":"channels_generate_sms_copy","description":"AI-generate SMS message copy (POST /api/sms/ai/generate).","scope":"channels:write"},{"name":"channels_generate_whatsapp_copy","description":"AI-generate WhatsApp message copy (POST /api/whatsapp/ai/generate).","scope":"channels:write"},{"name":"channels_create_whatsapp_org_template","description":"Create WhatsApp org template (POST /api/whatsapp/templates) — Messages templates tab.","scope":"channels:write"},{"name":"channels_update_whatsapp_org_template","description":"Update WhatsApp org template (PATCH /api/whatsapp/templates/{id}).","scope":"channels:write"},{"name":"channels_remove_short_link","description":"Delete short link (DELETE /api/sms/shortlinks/{id}).","scope":"channels:write"},{"name":"channels_create_push_campaign","description":"Create push notification campaign (POST /api/campaigns with type push).","scope":"channels:write"},{"name":"channels_list_push_campaigns","description":"List push notification campaigns (GET /api/campaigns?type=push).","scope":"channels:read"},{"name":"channels_duplicate_push_campaign","description":"Duplicate push campaign (POST /api/campaigns/{id}/duplicate).","scope":"channels:write"},{"name":"channels_remove_push_campaign","description":"Delete push campaign (DELETE /api/campaigns/{id}).","scope":"channels:write"},{"name":"channels_list_push_subscribers","description":"Push subscriber list (GET /api/push/subscribers).","scope":"channels:read"},{"name":"channels_get_push_analytics","description":"Push analytics (GET /api/push/analytics).","scope":"channels:read"},{"name":"channels_list_push_automations","description":"List push automations (GET /api/push/automations).","scope":"channels:read"},{"name":"channels_create_push_automation","description":"Create push automation (POST /api/push/automations).","scope":"channels:write"},{"name":"channels_update_push_automation","description":"Update push automation (PATCH /api/push/automations/{id}).","scope":"channels:write"},{"name":"channels_remove_push_automation","description":"Delete push automation (DELETE /api/push/automations/{id}).","scope":"channels:write"},{"name":"channels_list_push_ab_tests","description":"List push A/B tests (GET /api/push/ab-tests).","scope":"channels:read"},{"name":"channels_create_push_ab_test","description":"Create push A/B test (POST /api/push/ab-tests).","scope":"channels:write"},{"name":"channels_update_push_ab_test","description":"Update push A/B test (PATCH /api/push/ab-tests/{id}).","scope":"channels:write"},{"name":"channels_remove_push_ab_test","description":"Delete push A/B test (DELETE /api/push/ab-tests/{id}).","scope":"channels:write"},{"name":"channels_list_push_templates","description":"List push templates (GET /api/templates?channel=push).","scope":"channels:read"},{"name":"channels_remove_push_template","description":"Delete push template (DELETE /api/templates/{id}).","scope":"channels:write"},{"name":"channels_list_calendar_events","description":"Marketing calendar events (GET /api/channels/calendar).","scope":"channels:read"},{"name":"channels_create_calendar_event","description":"Add calendar event (POST /api/channels/calendar).","scope":"channels:write"}]},{"module":"guests","description":"Guest pipeline + PCO-grade check-ins: guests_pipeline_summary, guests_list_pipeline_stages, guests_sync_pipeline_stages, guests_list_followup_tasks, guests_list_followups_due, guests_get_followup_suggestions, guests_list_guest_journeys, guests_list_locations, guests_create_location, guests_update_location, guests_import_spaces_rooms, guests_list_volunteer_schedules, guests_assign_volunteer, guests_update_volunteer_schedule, guests_delete_volunteer_schedule, guests_get_analytics_summary, guests_get_analytics_heatmap, guests_list_welcome_card_templates, guests_list_services_today, guests_list_services, guests_duplicate_service, guests_get_live_roster, guests_check_in, guests_check_in_household, guests_send_welcome_card, guests_list_welcome_cards, guests_list_stations, guests_create_check_in_station, guests_delete_check_in_station, guests_get_service_checkin_settings, guests_update_service_checkin_settings, guests_get_checkin_hub, guests_update_checkin_hub, guests_check_in_child_hub, guests_copy_welcome_volunteers, guests_update_settings. Custom domains: checkin_custom_domain + count_custom_domain on hub tools. Long tail: guests_invoke_api_read / _write.","toolCount":48,"tools":[{"name":"guests_invoke_api_read","description":"Invoke guest pipeline APIs beyond named tools: stages, tasks, analytics, check-in. GET-only read bridge for this module's dashboard API long tail.","scope":"guests:read"},{"name":"guests_invoke_api_write","description":"Invoke guest pipeline APIs beyond named tools: stages, tasks, analytics, check-in. Mutation bridge (POST, PUT, PATCH, DELETE) for this module's dashboard API long tail. REQUIRED: fill actionSummary in plain English — it appears in the user's approval dialog.","scope":"guests:write"},{"name":"guests_list_followup_tasks","description":"List guest follow-up tasks with dashboard filters — pending, completed, overdue, assignee, type, priority. Full parity with /guests/follow-ups.","scope":"guests:read"},{"name":"guests_get_followup_task","description":"Get a single guest follow-up task with contact and assignee details.","scope":"guests:read"},{"name":"guests_get_followup_script","description":"AI-generated call script for a guest follow-up task — opening, bridge, questions, closing, and tips. Uses 1 AI credit.","scope":"guests:read"},{"name":"guests_get_followup_suggestions","description":"AI suggestions for at-risk pipeline visitors (medium/high churn risk). Uses 1 AI credit. Pair with guests_create_followup_task.","scope":"guests:read"},{"name":"guests_list_guest_journeys","description":"List guest hospitality journey templates (welcome series, absence, milestones). For marketing funnels use grow_list_automations.","scope":"guests:read"},{"name":"guests_pipeline_summary","description":"Guest/visitor pipeline summary — how many people are in each stage.","scope":"guests:read"},{"name":"guests_list_followups_due","description":"Guest follow-up tasks due by a cutoff. Use daysAhead (7, 30) for upcoming tasks; default is overdue + due today only.","scope":"guests:read"},{"name":"guests_list_pipeline_entries","description":"List people in the guest pipeline with their current stage (who is in each stage).","scope":"guests:read"},{"name":"guests_get_settings","description":"Read guest management settings: VIP alerts, auto welcome cards, default check-in method.","scope":"guests:read"},{"name":"guests_list_locations","description":"List guest check-in locations (rooms/buildings for services and kids classes). Not Spaces facility bookings.","scope":"guests:read"},{"name":"guests_list_pipeline_stages","description":"List guest pipeline stages (auto-seeds defaults if empty).","scope":"guests:read"},{"name":"guests_list_volunteer_schedules","description":"List Welcome Team volunteer schedules (greeters, ushers, kids check-in).","scope":"guests:read"},{"name":"guests_get_analytics_summary","description":"Guest attendance trends and type breakdown for a date range.","scope":"guests:read"},{"name":"guests_get_analytics_heatmap","description":"Daily check-in heatmap counts for calendar visualization.","scope":"guests:read"},{"name":"guests_list_welcome_card_templates","description":"List built-in and per-service welcome card email templates.","scope":"guests:read"},{"name":"guests_create_followup_task","description":"Create a follow-up task for a guest/visitor contact in the pipeline. Title optional — defaults to \"Follow up with {name}\".","scope":"guests:write"},{"name":"guests_complete_followup_task","description":"Mark a guest follow-up task as completed.","scope":"guests:write"},{"name":"guests_update_followup_task","description":"Update a guest follow-up task — title, due date, priority, assignment, completion, or outcome.","scope":"guests:write"},{"name":"guests_delete_followup_task","description":"Delete a guest follow-up task permanently.","scope":"guests:write"},{"name":"guests_set_guest_journey_status","description":"Activate or pause a guest hospitality journey (welcome series, we missed you, birthday, etc.). Marketing funnels use grow_set_automation_status.","scope":"guests:write"},{"name":"guests_create_location","description":"Create a guest check-in location (room/building for services or kids classes).","scope":"guests:write"},{"name":"guests_update_location","description":"Update or reactivate a guest check-in location.","scope":"guests:write"},{"name":"guests_assign_volunteer","description":"Assign a contact to the Welcome Team for a service or specific instance.","scope":"guests:write"},{"name":"guests_update_volunteer_schedule","description":"Update Welcome Team schedule status, role, or notes.","scope":"guests:write"},{"name":"guests_delete_volunteer_schedule","description":"Remove a Welcome Team volunteer assignment.","scope":"guests:write"},{"name":"guests_sync_pipeline_stages","description":"Bulk create/update/delete guest pipeline stages (settings parity).","scope":"guests:write"},{"name":"guests_import_spaces_rooms","description":"Import Spaces module rooms as guest check-in locations (skips duplicates). Requires Spaces data.","scope":"guests:write"},{"name":"guests_move_pipeline_entry","description":"Move a guest pipeline entry to a different stage.","scope":"guests:write"},{"name":"guests_copy_welcome_volunteers","description":"Copy Welcome Team volunteer assignments from a past service instance to an upcoming one. Skips duplicates and syncs portal shifts. Omit instance IDs to auto-resolve last past + next upcoming service.","scope":"guests:write"},{"name":"guests_update_settings","description":"Update guest management settings (VIP alerts, auto welcome cards, check-in defaults).","scope":"guests:write"},{"name":"guests_check_in","description":"Full-parity service check-in (pipeline, welcome cards, caps, automations). Use guests_check_in_household for family one-tap; guests_check_in_child_hub for Children Church hub (name, age, gender, allergies, photo/video consent). Provide serviceInstanceId or serviceId.","scope":"guests:write"},{"name":"guests_check_in_household","description":"One-tap household check-in: primary contact plus family members (children get security codes). PCO family check-in parity.","scope":"guests:write"},{"name":"guests_list_services","description":"List all guest services (recurring events) with check-in settings — use before duplicate or URL setup.","scope":"guests:read"},{"name":"guests_duplicate_service","description":"Clone a guest service (schedule, check-in gates, kids mode, theme). Returns new service id and check-in URLs on custom domain when configured.","scope":"guests:write"},{"name":"guests_list_services_today","description":"List today's service instances with check-in counts — start here on Sunday mornings.","scope":"guests:read"},{"name":"guests_get_live_roster","description":"Roster station mode: community roster with checked-in status for a service. Greeter/agent Sunday playbook.","scope":"guests:read"},{"name":"guests_list_stations","description":"List active check-in stations (manned, self, roster) with location locks.","scope":"guests:read"},{"name":"guests_create_check_in_station","description":"Create a check-in station (manned, self, or roster). Use guests_list_stations to verify setup before Sunday.","scope":"guests:write"},{"name":"guests_delete_check_in_station","description":"Deactivate a check-in station (soft delete — hides from guests_list_stations). Use for test cleanup or removing obsolete kiosks.","scope":"guests:write"},{"name":"guests_get_service_checkin_settings","description":"Read per-service check-in gates and public URLs (self, kiosk, hub) — uses checkin_custom_domain when set.","scope":"guests:read"},{"name":"guests_update_service_checkin_settings","description":"Update per-service check-in gates (capacity, precheck, registration form, check-in enabled). Use before inducing PRECHECK_DISABLED / REGISTRATION_REQUIRED / CAPACITY_REACHED tests.","scope":"guests:write"},{"name":"guests_get_checkin_hub","description":"Read org check-in hub: ministries (Adult/Children/Youth/One Church), children age classes, consent field toggles, and public URLs (checkin + count custom domains). Start here before Sunday kiosk setup.","scope":"guests:read"},{"name":"guests_update_checkin_hub","description":"Update check-in hub ministries, children classes, welcome text, hub/ministry/count background media URLs, checkin_custom_domain, and count_custom_domain. Dashboard: Guests → Settings → Hub.","scope":"guests:write"},{"name":"guests_check_in_child_hub","description":"Children Church check-in via hub config: full name, age, gender, allergies, photo/video consent, optional parent. Uses ministry/class routing and returns pickup code.","scope":"guests:write"},{"name":"guests_list_welcome_cards","description":"List welcome cards sent to guests — verify delivery after guests_send_welcome_card. Filter by contactId or checkInId.","scope":"guests:read"},{"name":"guests_send_welcome_card","description":"Send welcome card email to a checked-in guest. Idempotent — resend returns alreadySent without duplicate email. Pass forceResend:true to send again.","scope":"guests:write"}]},{"module":"runsheet","description":"Service plans (past + future via runsheet_list_plans / runsheet_find_previous_plan), items, positions, songs, access seats, copy-from-previous. Long tail: runsheet_invoke_api_read / _write.","toolCount":153,"tools":[{"name":"runsheet_invoke_api_read","description":"Invoke runsheet APIs: plans, positions, songs, teams, publishing. GET-only read bridge for this module's dashboard API long tail.","scope":"runsheet:read"},{"name":"runsheet_invoke_api_write","description":"Invoke runsheet APIs: plans, positions, songs, teams, publishing. Mutation bridge (POST, PUT, PATCH, DELETE) for this module's dashboard API long tail. REQUIRED: fill actionSummary in plain English — it appears in the user's approval dialog.","scope":"runsheet:write"},{"name":"runsheet_list_event_types","description":"List runsheet event types for service series wizard (GET /api/runsheet/event-types).","scope":"runsheet:read"},{"name":"runsheet_list_ministries","description":"List ministries / top-level structure units (GET /api/runsheet/ministries).","scope":"runsheet:read"},{"name":"runsheet_create_ministry","description":"Create ministry (POST /api/runsheet/ministries). Org admin only.","scope":"runsheet:write"},{"name":"runsheet_update_ministry","description":"Update ministry name or description (PATCH /api/runsheet/ministries/{id}).","scope":"runsheet:write"},{"name":"runsheet_remove_ministry","description":"Delete ministry (DELETE /api/runsheet/ministries/{id}).","scope":"runsheet:write"},{"name":"runsheet_get_team_detail","description":"Team / department detail (GET /api/runsheet/teams/{id}).","scope":"runsheet:read"},{"name":"runsheet_create_team","description":"Create team / department (POST /api/runsheet/teams).","scope":"runsheet:write"},{"name":"runsheet_update_team","description":"Update team / department header (PATCH /api/runsheet/teams/{id}).","scope":"runsheet:write"},{"name":"runsheet_remove_team","description":"Delete team / department (DELETE /api/runsheet/teams/{id}).","scope":"runsheet:write"},{"name":"runsheet_list_pastoral_holders","description":"Pastoral holders for a team (GET /api/runsheet/teams/{id}/pastoral-holders).","scope":"runsheet:read"},{"name":"runsheet_set_team_position","description":"Create or update team position (POST/PATCH /api/runsheet/teams/{id}/positions). Pass positionId to update.","scope":"runsheet:write"},{"name":"runsheet_remove_team_position","description":"Remove team position (DELETE /api/runsheet/teams/{id}/positions/{positionId}).","scope":"runsheet:write"},{"name":"runsheet_add_team_roster_member","description":"Add roster member to team (POST /api/runsheet/teams/{id}/members).","scope":"runsheet:write"},{"name":"runsheet_update_team_roster_member","description":"Update roster member role/position (PATCH /api/runsheet/teams/{id}/members/{memberId}).","scope":"runsheet:write"},{"name":"runsheet_list_leader_permissions","description":"List leader permissions (GET /api/runsheet/leaders). Leaders page parity.","scope":"runsheet:read"},{"name":"runsheet_get_leaders_hierarchy","description":"Leaders hierarchy tree (GET /api/runsheet/leaders/hierarchy).","scope":"runsheet:read"},{"name":"runsheet_grant_leader_permission","description":"Grant ministry or team leader permission (POST /api/runsheet/leaders). scope=team|ministry, scope_id required.","scope":"runsheet:write"},{"name":"runsheet_revoke_leader_permission","description":"Revoke leader permission (DELETE /api/runsheet/leaders/{id}).","scope":"runsheet:write"},{"name":"runsheet_delete_song","description":"Permanently remove a song — same as dashboard delete (not pause/archive).","scope":"runsheet:write"},{"name":"runsheet_remove_team_member","description":"Permanently remove a runsheet team member — same as dashboard delete (not pause/archive).","scope":"runsheet:write"},{"name":"runsheet_list_plans","description":"List service plans (past and future). Use daysBack for last Sunday or recent history; daysAhead for upcoming. Full dashboard parity.","scope":"runsheet:read"},{"name":"runsheet_find_previous_plan","description":"Most recent past service plan before a date. Set onlyLiveOrCompleted true for the last service that actually ran (excludes draft).","scope":"runsheet:read"},{"name":"runsheet_get_last_live_service_order","description":"Last completed/live service order of service as a markdown table — use for \"last live service\", \"order of service\", \"what did we run Sunday\". Excludes drafts.","scope":"runsheet:read"},{"name":"runsheet_get_plan","description":"Get one runsheet plan with service order items and assignment count.","scope":"runsheet:read"},{"name":"runsheet_list_plan_items","description":"List service order items for a plan. Returns a markdown table in speakToUser when 3+ items — relay as a table for readability.","scope":"runsheet:read"},{"name":"runsheet_list_plan_assignments","description":"List production team assignments for a plan — who was on team last Sunday.","scope":"runsheet:read"},{"name":"runsheet_list_teams","description":"List runsheet production teams and departments.","scope":"runsheet:read"},{"name":"runsheet_list_upcoming_plans","description":"Upcoming service plans only (today and future). For past services including last Sunday, use runsheet_list_plans or runsheet_find_previous_plan.","scope":"runsheet:read"},{"name":"runsheet_open_positions","description":"Open (unfilled) volunteer/team positions on service plans — scheduling gaps that need people.","scope":"runsheet:read"},{"name":"runsheet_access_seats","description":"Runsheet portal access seat usage: counts login-linked team members plus pending invitations. Roster-only contacts without login do not consume seats.","scope":"runsheet:read"},{"name":"runsheet_list_team_invitations","description":"List pending runsheet crew portal invitations for a team. Each pending invite consumes an access seat — see runsheet_access_seats.","scope":"runsheet:read"},{"name":"runsheet_invite_team_member","description":"Send a runsheet crew portal invitation (login access) — consumes an access seat. Same as Runsheet → Teams → Invite. Roster-only contacts without login do not use seats.","scope":"runsheet:write"},{"name":"runsheet_cancel_team_invitation","description":"Cancel a pending runsheet crew portal invitation — frees an access seat.","scope":"runsheet:write"},{"name":"runsheet_resend_team_invitation","description":"Resend a pending runsheet crew portal invitation email with a fresh link.","scope":"runsheet:write"},{"name":"runsheet_list_plans_api","description":"List plans via dashboard API (GET /api/runsheet/plans). Complements runsheet_list_plans.","scope":"runsheet:read"},{"name":"runsheet_create_plan_api","description":"Create service plan (POST /api/runsheet/plans).","scope":"runsheet:write"},{"name":"runsheet_get_plan_api","description":"Plan detail via API (GET /api/runsheet/plans/{id}).","scope":"runsheet:read"},{"name":"runsheet_update_plan_api","description":"Update plan metadata (PATCH /api/runsheet/plans/{id}).","scope":"runsheet:write"},{"name":"runsheet_delete_plan_api","description":"Delete plan (DELETE /api/runsheet/plans/{id}).","scope":"runsheet:write"},{"name":"runsheet_publish_plan_api","description":"Publish plan (POST /api/runsheet/plans/{id}/publish). Complements runsheet_publish_plan.","scope":"runsheet:write"},{"name":"runsheet_unpublish_plan_api","description":"Unpublish plan (POST /api/runsheet/plans/{id}/unpublish).","scope":"runsheet:write"},{"name":"runsheet_duplicate_plan_api","description":"Duplicate plan (POST /api/runsheet/plans/{id}/duplicate).","scope":"runsheet:write"},{"name":"runsheet_export_plan_pdf","description":"Export plan PDF (GET /api/runsheet/plans/{id}/export/pdf).","scope":"runsheet:read"},{"name":"runsheet_export_plan_bulletin","description":"Export bulletin format (GET /api/runsheet/plans/{id}/export/bulletin).","scope":"runsheet:read"},{"name":"runsheet_get_plan_version","description":"Plan version history (GET /api/runsheet/plans/{id}/version).","scope":"runsheet:read"},{"name":"runsheet_get_plan_share","description":"Public share link for plan (GET /api/runsheet/plans/share/{token}).","scope":"runsheet:read"},{"name":"runsheet_list_plan_items_api","description":"List plan items via API (GET /api/runsheet/plans/{id}/items).","scope":"runsheet:read"},{"name":"runsheet_create_plan_items_api","description":"Add plan items via API (POST /api/runsheet/plans/{id}/items). Prefer runsheet_add_plan_items for batches.","scope":"runsheet:write"},{"name":"runsheet_update_plan_item_api","description":"Update one plan item (PATCH /api/runsheet/plans/{id}/items/{itemId}).","scope":"runsheet:write"},{"name":"runsheet_delete_plan_item_api","description":"Delete plan item (DELETE /api/runsheet/plans/{id}/items/{itemId}).","scope":"runsheet:write"},{"name":"runsheet_reorder_plan_items_api","description":"Reorder items (POST /api/runsheet/plans/{id}/items/reorder). Prefer runsheet_reorder_plan_items.","scope":"runsheet:write"},{"name":"runsheet_copy_plan_items_api","description":"Copy items from another plan (POST /api/runsheet/plans/{id}/items/copy-from).","scope":"runsheet:write"},{"name":"runsheet_list_plan_assignments_api","description":"List team assignments (GET /api/runsheet/plans/{id}/assignments).","scope":"runsheet:read"},{"name":"runsheet_create_plan_assignments_api","description":"Create assignments (POST /api/runsheet/plans/{id}/assignments).","scope":"runsheet:write"},{"name":"runsheet_copy_plan_assignments_api","description":"Copy assignments from plan (POST /api/runsheet/plans/{id}/assignments/copy-from).","scope":"runsheet:write"},{"name":"runsheet_get_live_status","description":"Live service status (GET /api/runsheet/live/{planId}/status).","scope":"runsheet:read"},{"name":"runsheet_start_live","description":"Start live mode (POST /api/runsheet/live/{planId}/start).","scope":"runsheet:write"},{"name":"runsheet_control_live","description":"Live control actions (POST /api/runsheet/live/{planId}/control).","scope":"runsheet:write"},{"name":"runsheet_advance_live","description":"Advance live item (POST /api/runsheet/live/{planId}/advance).","scope":"runsheet:write"},{"name":"runsheet_end_live","description":"End live mode (POST /api/runsheet/live/{planId}/end).","scope":"runsheet:write"},{"name":"runsheet_get_schedule_api","description":"Schedule matrix (GET /api/runsheet/schedule).","scope":"runsheet:read"},{"name":"runsheet_schedule_assign","description":"Assign volunteer to position (POST /api/runsheet/schedule/assign).","scope":"runsheet:write"},{"name":"runsheet_update_schedule_assignment","description":"Update schedule assignment (PATCH /api/runsheet/schedule/assignments/{id}).","scope":"runsheet:write"},{"name":"runsheet_list_schedule_open_positions_api","description":"Open schedule positions (GET /api/runsheet/schedule/open-positions).","scope":"runsheet:read"},{"name":"runsheet_schedule_self_signup","description":"Volunteer self-signup (POST /api/runsheet/schedule/self-signup).","scope":"runsheet:write"},{"name":"runsheet_get_public_schedule","description":"Public schedule view (GET /api/runsheet/schedule/public).","scope":"runsheet:read"},{"name":"runsheet_list_songs_api","description":"List songs via API (GET /api/runsheet/songs). Complements runsheet_list_songs.","scope":"runsheet:read"},{"name":"runsheet_get_song_api","description":"Song detail (GET /api/runsheet/songs/{id}).","scope":"runsheet:read"},{"name":"runsheet_update_song_api","description":"Update song (PATCH /api/runsheet/songs/{id}).","scope":"runsheet:write"},{"name":"runsheet_import_songs","description":"Import songs file (POST /api/runsheet/songs/import).","scope":"runsheet:write"},{"name":"runsheet_export_songs","description":"Export songs (GET /api/runsheet/songs/export).","scope":"runsheet:read"},{"name":"runsheet_dedupe_songs","description":"Dedupe song library (POST /api/runsheet/songs/dedupe).","scope":"runsheet:write"},{"name":"runsheet_import_songs_ccli","description":"Import CCLI song bundle (POST /api/runsheet/songs/import-ccli).","scope":"runsheet:write"},{"name":"runsheet_create_song_arrangement","description":"Create arrangement (POST /api/runsheet/songs/{id}/arrangements).","scope":"runsheet:write"},{"name":"runsheet_update_song_arrangement","description":"Update arrangement (PATCH /api/runsheet/songs/{id}/arrangements/{arrangementId}).","scope":"runsheet:write"},{"name":"runsheet_delete_song_arrangement","description":"Delete arrangement (DELETE /api/runsheet/songs/{id}/arrangements/{arrangementId}).","scope":"runsheet:write"},{"name":"runsheet_list_song_collections","description":"List song collections (GET /api/runsheet/songs/collections).","scope":"runsheet:read"},{"name":"runsheet_manage_song_collection","description":"Create/update song collection (POST/PATCH /api/runsheet/songs/collections).","scope":"runsheet:write"},{"name":"runsheet_get_song_library","description":"Song library browse (GET /api/runsheet/song-library).","scope":"runsheet:read"},{"name":"runsheet_list_templates_api","description":"List plan templates (GET /api/runsheet/templates).","scope":"runsheet:read"},{"name":"runsheet_create_template","description":"Create template (POST /api/runsheet/templates).","scope":"runsheet:write"},{"name":"runsheet_update_template","description":"Update template (PUT/PATCH /api/runsheet/templates/{id}).","scope":"runsheet:write"},{"name":"runsheet_delete_template","description":"Delete template (DELETE /api/runsheet/templates/{id}).","scope":"runsheet:write"},{"name":"runsheet_create_event_type","description":"Create event type (POST /api/runsheet/event-types).","scope":"runsheet:write"},{"name":"runsheet_update_event_type","description":"Update event type (PATCH /api/runsheet/event-types/{id}).","scope":"runsheet:write"},{"name":"runsheet_delete_event_type","description":"Delete event type (DELETE /api/runsheet/event-types/{id}).","scope":"runsheet:write"},{"name":"runsheet_get_ccli_report","description":"CCLI usage report (GET /api/runsheet/reports/ccli).","scope":"runsheet:read"},{"name":"runsheet_mark_ccli_reported","description":"Mark CCLI songs reported (POST /api/runsheet/reports/ccli/mark-reported).","scope":"runsheet:write"},{"name":"runsheet_get_timing_report","description":"Service timing report (GET /api/runsheet/reports/timing).","scope":"runsheet:read"},{"name":"runsheet_get_serving_report","description":"Volunteer serving report (GET /api/runsheet/reports/serving).","scope":"runsheet:read"},{"name":"runsheet_list_rehearsals","description":"List rehearsals (GET /api/runsheet/rehearsals).","scope":"runsheet:read"},{"name":"runsheet_create_rehearsal","description":"Create rehearsal (POST /api/runsheet/rehearsals).","scope":"runsheet:write"},{"name":"runsheet_update_rehearsal","description":"Update rehearsal (PATCH /api/runsheet/rehearsals/{id}).","scope":"runsheet:write"},{"name":"runsheet_delete_rehearsal","description":"Delete rehearsal (DELETE /api/runsheet/rehearsals/{id}).","scope":"runsheet:write"},{"name":"runsheet_import_parse","description":"Parse import file (POST /api/runsheet/import/{source}/parse).","scope":"runsheet:read"},{"name":"runsheet_import_execute","description":"Execute import (POST /api/runsheet/import/{source}/execute).","scope":"runsheet:write"},{"name":"runsheet_import_csv_execute","description":"Execute CSV import (POST /api/runsheet/import/csv/execute).","scope":"runsheet:write"},{"name":"runsheet_import_planning_center_preview","description":"Planning Center import preview (POST /api/runsheet/import/planning-center/preview).","scope":"runsheet:read"},{"name":"runsheet_import_planning_center_contacts_map","description":"Planning Center contacts map (POST /api/runsheet/import/planning-center/contacts-map).","scope":"runsheet:write"},{"name":"runsheet_import_planning_center_status","description":"Planning Center import job status (GET /api/runsheet/import/planning-center/status).","scope":"runsheet:read"},{"name":"runsheet_import_elvanto_connect","description":"Connect Elvanto for import (POST /api/runsheet/import/elvanto/connect).","scope":"runsheet:write"},{"name":"runsheet_import_elvanto_preview","description":"Elvanto import preview (POST /api/runsheet/import/elvanto/preview).","scope":"runsheet:read"},{"name":"runsheet_notify_assignments","description":"Notify volunteers of assignments (POST /api/runsheet/assignments/notify).","scope":"runsheet:write"},{"name":"runsheet_respond_assignment","description":"Volunteer assignment response (POST /api/runsheet/assignments/respond).","scope":"runsheet:write"},{"name":"runsheet_list_assignment_responses","description":"Assignment responses (GET /api/runsheet/assignments/{id}/responses).","scope":"runsheet:read"},{"name":"runsheet_list_assignment_response_history","description":"Assignment response history (GET /api/runsheet/assignments/{id}/responses/history).","scope":"runsheet:read"},{"name":"runsheet_ai_suggest_schedule","description":"AI schedule suggestions (POST /api/runsheet/ai/suggest-schedule).","scope":"runsheet:write"},{"name":"runsheet_ai_suggest_songs","description":"AI song suggestions (POST /api/runsheet/ai/suggest-songs).","scope":"runsheet:write"},{"name":"runsheet_ai_production_notes","description":"AI production notes (POST /api/runsheet/ai/production-notes).","scope":"runsheet:write"},{"name":"runsheet_ai_post_service_report","description":"AI post-service report (POST /api/runsheet/ai/post-service-report).","scope":"runsheet:write"},{"name":"runsheet_ai_generate_setlist","description":"AI generate setlist (POST /api/runsheet/ai/generate-setlist).","scope":"runsheet:write"},{"name":"runsheet_ai_build_service","description":"AI build full service (POST /api/runsheet/ai/build-service).","scope":"runsheet:write"},{"name":"runsheet_ai_volunteer_insights","description":"AI volunteer insights (POST /api/runsheet/ai/volunteer-insights).","scope":"runsheet:read"},{"name":"runsheet_invoke_ai_endpoint","description":"Generic runsheet AI endpoint caller (POST /api/runsheet/ai/{endpoint}). Plan editor AI tabs.","scope":"runsheet:write"},{"name":"runsheet_get_plan_chat","description":"Plan chat messages (GET /api/runsheet/chat/{planId}).","scope":"runsheet:read"},{"name":"runsheet_post_plan_chat","description":"Post plan chat message (POST /api/runsheet/chat/{planId}).","scope":"runsheet:write"},{"name":"runsheet_get_plan_chat_count","description":"Unread chat count (GET /api/runsheet/chat/{planId}/count).","scope":"runsheet:read"},{"name":"runsheet_get_gate_settings","description":"Crew portal gate settings (GET /api/runsheet/settings/gate).","scope":"runsheet:read"},{"name":"runsheet_update_gate_settings_api","description":"Update crew portal settings (PUT/PATCH /api/runsheet/settings/gate).","scope":"runsheet:write"},{"name":"runsheet_get_gate_domain_status","description":"Gate custom domain status (GET /api/runsheet/settings/gate/domain-status).","scope":"runsheet:read"},{"name":"runsheet_get_gate_access","description":"Gate editor PIN access check (GET /api/runsheet/gate/access).","scope":"runsheet:read"},{"name":"runsheet_set_gate_access","description":"Set gate editor PIN access (POST /api/runsheet/gate/access).","scope":"runsheet:write"},{"name":"runsheet_gate_unlock","description":"Unlock crew portal with PIN (POST /api/runsheet/gate/unlock).","scope":"runsheet:write"},{"name":"runsheet_get_ccli_bundle","description":"CCLI bundle settings (GET /api/runsheet/ccli-bundle).","scope":"runsheet:read"},{"name":"runsheet_update_ccli_bundle","description":"Update CCLI bundle (PUT/PATCH /api/runsheet/ccli-bundle).","scope":"runsheet:write"},{"name":"runsheet_list_team_access_api","description":"Runsheet addon team access list (GET /api/runsheet/team). Settings → Team Access tab.","scope":"runsheet:read"},{"name":"runsheet_update_team_access_api","description":"Manage runsheet team access members (POST/PATCH/DELETE /api/runsheet/team).","scope":"runsheet:write"},{"name":"runsheet_list_leaders_api","description":"List leaders (GET /api/runsheet/leaders). Complements runsheet_list_leader_permissions.","scope":"runsheet:read"},{"name":"runsheet_create_leader_api","description":"Grant leader (POST /api/runsheet/leaders).","scope":"runsheet:write"},{"name":"runsheet_delete_leader_api","description":"Remove leader (DELETE /api/runsheet/leaders/{id}).","scope":"runsheet:write"},{"name":"runsheet_update_leaders_hierarchy","description":"Update leadership hierarchy tree (PUT /api/runsheet/leaders/hierarchy).","scope":"runsheet:write"},{"name":"runsheet_list_teams_api","description":"List teams via API (GET /api/runsheet/teams). Complements runsheet_list_teams.","scope":"runsheet:read"},{"name":"runsheet_list_pastoral_holders_api","description":"Team pastoral holders (GET /api/runsheet/teams/{id}/pastoral-holders).","scope":"runsheet:read"},{"name":"runsheet_team_invitation_lookup","description":"Lookup invitation by token (GET /api/runsheet/teams/invitation-lookup).","scope":"runsheet:read"},{"name":"runsheet_get_availability","description":"Volunteer availability calendar (GET /api/runsheet/availability).","scope":"runsheet:read"},{"name":"runsheet_upload_attachment","description":"Upload plan attachment (POST /api/runsheet/attachments/upload).","scope":"runsheet:write"},{"name":"runsheet_delete_attachment","description":"Delete attachment (DELETE /api/runsheet/attachments/{id}).","scope":"runsheet:write"},{"name":"runsheet_assign_position","description":"Assign someone to an open Runsheet crew position on a service plan (sound, worship, production). Requires a dashboard login or Runsheet portal roster link — pass CRM contact id and we resolve linked portal user_id. For Welcome Team greeters/ushers (no portal login), use guests_assign_volunteer instead.","scope":"runsheet:write"},{"name":"runsheet_publish_plan","description":"Publish a runsheet plan so volunteers can see their assignments.","scope":"runsheet:write"},{"name":"runsheet_reopen_plan","description":"Reset a mistakenly completed runsheet plan back to published. Only allowed when the service date is still in the future.","scope":"runsheet:write"},{"name":"runsheet_add_plan_items","description":"Add multiple service order items (songs, prayers, headers, etc.) to a plan in ONE call — use this instead of runsheet_invoke_api_write per song so Claude only asks permission once for the whole setlist. Up to 80 items.","scope":"runsheet:write"},{"name":"runsheet_update_plan_item","description":"Update an existing service order item on a plan — title, talent (description), notes, duration, key, TIME UP alert toggle, etc. Use for speaker/talent changes during service. Not for adding new items (use runsheet_add_plan_items).","scope":"runsheet:write"},{"name":"runsheet_configure_section_time_alerts","description":"Batch set TIME UP alerts for worship sets and sections: only the last item in each section shows red TIME UP when over time (timer still runs on all items). Use for Praise & Worship — disable alerts on early songs, enable on the closing song. Also supports all_enabled / all_disabled.","scope":"runsheet:write"},{"name":"runsheet_reorder_plan_items","description":"Reorder the full service order on a plan. Pass every item id in the desired order (from runsheet_list_plan_items). Use to move one segment (e.g. Thanksgiving after Word) without per-item invoke writes.","scope":"runsheet:write"},{"name":"runsheet_copy_plan_items","description":"Copy service order items from a previous plan into a target plan. Appends items and recalculates duration.","scope":"runsheet:write"},{"name":"runsheet_copy_team_assignments","description":"Copy production team assignments from a previous service plan. Resets status to pending; skips duplicate roles.","scope":"runsheet:write"},{"name":"runsheet_duplicate_plan","description":"Clone a runsheet plan (items included) to a new date. Returns dashboard manage URL — never people.sendifai.com.","scope":"runsheet:write"},{"name":"runsheet_setup_next_service_from_last_live","description":"One-shot: copy last completed/live service order to next Sunday (or targetDate), optionally copy team roster, publish, and return manage URLs.","scope":"runsheet:write"},{"name":"runsheet_update_gate_settings","description":"Update runsheet crew portal gate settings — idle lock, crew notes privacy, viewer PIN requirement. Dashboard or crew portal (editors).","scope":"runsheet:write"},{"name":"runsheet_list_songs","description":"List the worship song library with keys, CCLI numbers, and usage counts.","scope":"runsheet:read"},{"name":"runsheet_add_song","description":"Add a song to the worship library.","scope":"runsheet:write"}]},{"module":"ticketing","description":"Events, ticketingbook publish, Connect, promos, waitlists, refunds, reports. Read sendifai://docs/ticketing. Long tail: ticketing_invoke_api_read / _write.","toolCount":43,"tools":[{"name":"ticketing_invoke_api_read","description":"Invoke event ticketing APIs: events, registrations, promo codes, refunds. GET-only read bridge for this module's dashboard API long tail.","scope":"ticketing:read"},{"name":"ticketing_invoke_api_write","description":"Invoke event ticketing APIs: events, registrations, promo codes, refunds. Mutation bridge (POST, PUT, PATCH, DELETE) for this module's dashboard API long tail. REQUIRED: fill actionSummary in plain English — it appears in the user's approval dialog.","scope":"ticketing:write"},{"name":"ticketing_delete_ticket_type","description":"Permanently remove a ticket type with zero sales (deactivate via ticketing_update_ticket_type if tickets were sold) — same as dashboard delete (not pause/archive).","scope":"ticketing:write"},{"name":"ticketing_list_events","description":"List ticketing events (draft, published, etc.) with registrations and revenue. Published events appear on ticketingbook.com/e/[slug].","scope":"ticketing:read"},{"name":"ticketing_get_event_sales","description":"Registration, revenue, check-in, and capacity figures for one event.","scope":"ticketing:read"},{"name":"ticketing_create_event","description":"Create a draft ticketing event. Add ticket types, then ticketing_publish_event. For virtual queue before on-sale, call ticketing_set_virtual_queue (enabled=true) — do not rely on optional queue_enabled here (hidden in many chat UIs).","scope":"ticketing:write"},{"name":"ticketing_set_virtual_queue","description":"Enable or disable the virtual waiting room on an event. REQUIRED before ticketing_get_queue_stats or ticketing_run_queue_admit. Pass enabled=true to turn the queue on.","scope":"ticketing:write"},{"name":"ticketing_update_event","description":"Update event fields including ticketingbook settings: ticketing_mode (native|external), external_url, hosted_by_name, dates, venue, capacity, waitlist_enabled, queue_enabled (virtual queue for high-demand on-sales), queue timing knobs. For external listing set ticketing_mode=external and external_url.","scope":"ticketing:write"},{"name":"ticketing_publish_event","description":"Publish draft event to ticketingbook. Requires ticket types; paid events require Stripe Connect ready (use ticketing_get_connect_status first).","scope":"ticketing:write"},{"name":"ticketing_cancel_event","description":"Cancel event — refunds paid registrations via Stripe and marks all registrations cancelled. Distinct from archive.","scope":"ticketing:write"},{"name":"ticketing_duplicate_event","description":"Clone an event (ticket types) into a new draft. Requires new start_date.","scope":"ticketing:write"},{"name":"ticketing_promote_waitlist","description":"Offer a freed-up spot to the next waitlister and email a claim link.","scope":"ticketing:write"},{"name":"ticketing_list_waitlist","description":"List waitlist entries for an event. Use before ticketing_promote_waitlist.","scope":"ticketing:read"},{"name":"ticketing_create_promo_code","description":"Create a discount promo code for an event. Code text is unique per organization (not per event) — reusing a code on a new event fails even if the old event is archived. Optional expiry (valid_until) and ticket-type restriction (applicable_ticket_type_ids).","scope":"ticketing:write"},{"name":"ticketing_list_promo_codes","description":"List promo codes for an event — active and deactivated.","scope":"ticketing:read"},{"name":"ticketing_deactivate_promo_code","description":"Deactivate a promo code so it can no longer be redeemed.","scope":"ticketing:write"},{"name":"ticketing_issue_refund","description":"Refund a paid registration (Pro+). Stripe default; pass refundMethod=store_credit for store credit. Full refund cancels registration and promotes waitlist. Requires ticketing:refund scope.","scope":"ticketing:refund"},{"name":"ticketing_resend_ticket","description":"Resend ticket confirmation email to a registrant.","scope":"ticketing:write"},{"name":"ticketing_get_connect_status","description":"Stripe Connect payout accounts + per-event payout readiness. Required before publishing paid events on ticketingbook.","scope":"ticketing:read"},{"name":"ticketing_start_connect_onboard","description":"Start or resume Stripe Express onboarding for an event payout account. Returns onboarding_url for the organizer.","scope":"ticketing:write"},{"name":"ticketing_get_queue_stats","description":"Virtual queue stats (waiting, shopping, conversion). Prerequisite: ticketing_set_virtual_queue with enabled=true on this eventId.","scope":"ticketing:read"},{"name":"ticketing_bulk_email_attendees","description":"Send a custom email to selected registrants (subject + body HTML/text).","scope":"ticketing:write"},{"name":"ticketing_report_revenue","description":"Revenue summary (gross, refunds, net) for org or one event.","scope":"ticketing:read"},{"name":"ticketing_report_attendees","description":"Attendee summary: confirmed, checked-in, cancelled for one event.","scope":"ticketing:read"},{"name":"ticketing_get_event","description":"Full organizer event record plus ticketingbook URL when published.","scope":"ticketing:read"},{"name":"ticketing_find_attendee_orders","description":"Org-scoped find-your-tickets support: search registrations by attendee email with ticket page URLs.","scope":"ticketing:read"},{"name":"ticketing_preview_ticketingbook_page","description":"Preview what attendees see on ticketingbook (public page payload + discover card). Works for draft (preview only) and published events.","scope":"ticketing:read"},{"name":"ticketing_list_discover_listings","description":"Your org’s published events as they appear on ticketingbook discovery (URLs + enriched cards).","scope":"ticketing:read"},{"name":"ticketing_get_registration","description":"Full registration detail with ticket lines and wallet pass URLs.","scope":"ticketing:read"},{"name":"ticketing_get_wallet_pass_links","description":"Apple/Google wallet pass URLs and ticket page link for a registration (organizer support desk).","scope":"ticketing:read"},{"name":"ticketing_transfer_registration","description":"Initiate ticket transfer to a new recipient (sends claim email).","scope":"ticketing:write"},{"name":"ticketing_update_ticket_type","description":"PATCH ticket type fields (price locked after sales).","scope":"ticketing:write"},{"name":"ticketing_estimate_order_totals","description":"Checkout pricing preview (fees, tax, promos) without creating a registration or charging Stripe.","scope":"ticketing:read"},{"name":"ticketing_get_event_analytics","description":"Page views, conversion, UTM/referrer breakdown for an event.","scope":"ticketing:read"},{"name":"ticketing_report_check_in","description":"Check-in timeline report (5-min buckets, by method).","scope":"ticketing:read"},{"name":"ticketing_run_queue_admit","description":"Manually admit the next batch from the virtual queue. Same logic as cron queue admit. Requires queue_enabled on the event.","scope":"ticketing:write"},{"name":"ticketing_create_registration","description":"Create a confirmed free registration without Stripe checkout (free ticket types or 100% promo). Use for harness QA, comps, and manual check-in/transfer/refund testing.","scope":"ticketing:write"},{"name":"ticketing_archive_event","description":"Archive an event (retire from active lists).","scope":"ticketing:write"},{"name":"ticketing_delete_draft_event","description":"Permanently delete a draft with zero registrations.","scope":"ticketing:write"},{"name":"ticketing_list_attendees","description":"List confirmed registrations for an event with check-in status.","scope":"ticketing:read"},{"name":"ticketing_check_in","description":"Check in a registration by ID, email, or QR token.","scope":"ticketing:write"},{"name":"ticketing_list_ticket_types","description":"List ticket types for an event with prices and quantities sold.","scope":"ticketing:read"},{"name":"ticketing_create_ticket_type","description":"Add a ticket type to a draft or published event.","scope":"ticketing:write"}]},{"module":"templates","description":"Email and WhatsApp templates. Long tail: templates_invoke_api_read / _write.","toolCount":9,"tools":[{"name":"templates_invoke_api_read","description":"Invoke template APIs: email builder, WhatsApp template sync, canvas blocks. GET-only read bridge for this module's dashboard API long tail.","scope":"templates:read"},{"name":"templates_invoke_api_write","description":"Invoke template APIs: email builder, WhatsApp template sync, canvas blocks. Mutation bridge (POST, PUT, PATCH, DELETE) for this module's dashboard API long tail. REQUIRED: fill actionSummary in plain English — it appears in the user's approval dialog.","scope":"templates:write"},{"name":"templates_delete_email_template","description":"Permanently remove a email template — same as dashboard delete (not pause/archive).","scope":"templates:write"},{"name":"templates_list_email_templates","description":"List email templates (org + global site-wide templates). Read sendifai://docs/global-email-schedule-templates for convention/festival/program schedules.","scope":"templates:read"},{"name":"templates_get_email_template","description":"Get one email template including its HTML content (org or global site-wide template).","scope":"templates:read"},{"name":"templates_create_email_template","description":"Create an email template from HTML content.","scope":"templates:write"},{"name":"templates_list_whatsapp_templates","description":"List WhatsApp message templates from the org WABA (Meta approval status). Use before send; pair with templates_submit_whatsapp_template to create new templates.","scope":"templates:read"},{"name":"templates_submit_whatsapp_template","description":"Submit a WhatsApp template to Meta for approval (org WABA). IMAGE header: pass mediaLibraryFileId from platform_list_media_library_files (preferred — reads S3 directly). headerImageUrl works for public HTTPS flyers. Call confirm:false first, then confirm:true to submit. Returns speakToUser with pending vs approved status.","scope":"templates:write"},{"name":"templates_sync_whatsapp_templates","description":"Pull latest WhatsApp template statuses from Meta into the org library (after submission or to check approval).","scope":"templates:read"}]},{"module":"groups","description":"Small Groups ministry module (cell/home groups — small_groups table). NOT CRM People groups — use people_list_crm_groups for ministry teams. Long tail: groups_invoke_api_read / _write.","toolCount":7,"tools":[{"name":"groups_invoke_api_read","description":"Invoke small group APIs: rosters, attendance, curriculum, meeting notes. GET-only read bridge for this module's dashboard API long tail.","scope":"groups:read"},{"name":"groups_invoke_api_write","description":"Invoke small group APIs: rosters, attendance, curriculum, meeting notes. Mutation bridge (POST, PUT, PATCH, DELETE) for this module's dashboard API long tail. REQUIRED: fill actionSummary in plain English — it appears in the user's approval dialog.","scope":"groups:write"},{"name":"groups_list","description":"List Small Groups ministry module groups (cell/home groups with meeting schedules — small_groups table). NOT CRM People groups (ministry teams like Gideon Army) — use people_list_crm_groups for those.","scope":"groups:read"},{"name":"groups_create","description":"Create a small group.","scope":"groups:write"},{"name":"groups_deactivate","description":"Deactivate (archive) a small group — sets is_active=false. Pass groupId from groups_list or exact name.","scope":"groups:write"},{"name":"groups_list_members","description":"List members of a small group.","scope":"groups:read"},{"name":"groups_add_member","description":"Add a contact to a small group.","scope":"groups:write"}]},{"module":"billing","description":"In-chat billing widgets (7000+ MCP App surfaces). Upgrades: billing_show_addon_upgrade_widget — never Stripe portal for slider/credits. Long tail: billing_invoke_api_read / _write.","toolCount":10,"tools":[{"name":"billing_invoke_api_read","description":"Invoke billing APIs: subscription changes, invoices, payment methods, add-ons. GET-only read bridge for this module's dashboard API long tail.","scope":"billing:read"},{"name":"billing_invoke_api_write","description":"Invoke billing APIs: subscription changes, invoices, payment methods, add-ons. Mutation bridge (POST, PUT, PATCH, DELETE) for this module's dashboard API long tail. REQUIRED: fill actionSummary in plain English — it appears in the user's approval dialog.","scope":"billing:write"},{"name":"billing_get_subscription","description":"Current subscription, plan tier, Stripe status, and upcoming invoice for the organization.","scope":"billing:read"},{"name":"billing_feature_gates","description":"List active billing add-ons and feature gates for the organization.","scope":"billing:read"},{"name":"billing_estimate_messaging_credits","description":"MANDATORY before quoting messaging allowance or “how many credits for WhatsApp/SMS”. Uses real org phone numbers + published tariff (NOT 1 credit per message). Returns creditsPerRun, optional weekly/monthly automation math, country breakdown, and speakToUser. Read sendifai://docs/messaging-tariff for the rate card.","scope":"billing:read"},{"name":"billing_show_addon_upgrade_widget","description":"PRIMARY when LIMIT_REACHED or INSUFFICIENT_CREDITS. Opens the in-chat billing widget — never send external links. Shows tier options and optional pay-as-you-go overage.","scope":"billing:write"},{"name":"billing_upgrade_addon","description":"Upgrade an addon slider tier in-chat (charges card on file when possible). Use billing_show_addon_upgrade_widget first for LIMIT_REACHED. Never open Stripe portal or dashboard links.","scope":"billing:write"},{"name":"billing_enable_addon_overage","description":"Enable or disable pay-as-you-go overage billing when monthly slider allowance is exhausted (requires card on file). Renders in the billing widget.","scope":"billing:write"},{"name":"billing_create_checkout_session","description":"Legacy plan checkout — prefer billing_show_addon_upgrade_widget for addon sliders. Does not return URLs; use widget flows.","scope":"billing:write"},{"name":"billing_open_portal","description":"Deprecated for upgrades — Stripe portal cannot change messaging sliders. Use billing_show_addon_upgrade_widget. Invoice history remains in widget roadmap.","scope":"billing:write"}]},{"module":"schedule","description":"Recurring service series and upcoming instances.","toolCount":15,"tools":[{"name":"schedule_invoke_api_read","description":"Invoke service schedule APIs: series, occurrences, preview beyond curated schedule tools. GET-only read bridge for this module's dashboard API long tail.","scope":"schedule:read"},{"name":"schedule_invoke_api_write","description":"Invoke service schedule APIs: series, occurrences, preview beyond curated schedule tools. Mutation bridge (POST, PUT, PATCH, DELETE) for this module's dashboard API long tail. REQUIRED: fill actionSummary in plain English — it appears in the user's approval dialog.","scope":"schedule:write"},{"name":"schedule_list_hub_series","description":"List service series with link-health rollup (GET /api/service-schedule/series). Church Services page parity.","scope":"schedule:read"},{"name":"schedule_preview_recurrence","description":"Preview recurrence dates without saving (POST /api/service-schedule/preview).","scope":"schedule:read"},{"name":"schedule_create_hub_series","description":"Create recurring service series + module targets (POST /api/service-schedule/series).","scope":"schedule:write"},{"name":"schedule_get_hub_series","description":"Service series detail with targets, occurrences, link health (GET /api/service-schedule/series/{id}).","scope":"schedule:read"},{"name":"schedule_update_hub_series","description":"Update service series pattern, times, status, or targets (PATCH /api/service-schedule/series/{id}).","scope":"schedule:write"},{"name":"schedule_archive_hub_series","description":"Archive service series and cancel future occurrences (DELETE /api/service-schedule/series/{id}).","scope":"schedule:write"},{"name":"schedule_get_occurrence_detail","description":"Single occurrence with per-module link status (GET /api/service-schedule/occurrences/{id}).","scope":"schedule:read"},{"name":"schedule_update_occurrence","description":"Update occurrence date/time or status (PATCH /api/service-schedule/occurrences/{id}).","scope":"schedule:write"},{"name":"schedule_retry_occurrence_links","description":"Retry failed module links for an occurrence (POST /api/service-schedule/occurrences/{id}/retry).","scope":"schedule:write"},{"name":"schedule_list_series","description":"List recurring service series (weekly services, monthly events) with recurrence rules.","scope":"schedule:read"},{"name":"schedule_list_service_instances","description":"List service instances (past and future). Use daysBack for last Sunday or recent history; daysAhead for upcoming.","scope":"schedule:read"},{"name":"schedule_find_previous_service","description":"Most recent past service instance before a date (default: before today). Ideal for \"last Sunday\".","scope":"schedule:read"},{"name":"schedule_upcoming_services","description":"List upcoming service instances only (today and future). For past services including last Sunday, use schedule_list_service_instances or schedule_find_previous_service.","scope":"schedule:read"}]},{"module":"attendance","description":"Service check-ins and summaries. Check-in writes: attendance_check_in_contact or guests_check_in.","toolCount":5,"tools":[{"name":"attendance_invoke_api_read","description":"Invoke attendance and count-tablet APIs: live check-in, session summary, headcount. GET-only read bridge for this module's dashboard API long tail.","scope":"attendance:read"},{"name":"attendance_invoke_api_write","description":"Invoke attendance and count-tablet APIs: live check-in, session summary, headcount. Mutation bridge (POST, PUT, PATCH, DELETE) for this module's dashboard API long tail. REQUIRED: fill actionSummary in plain English — it appears in the user's approval dialog.","scope":"attendance:write"},{"name":"attendance_recent_checkins","description":"List recent service check-ins with visitor flags.","scope":"attendance:read"},{"name":"attendance_summary","description":"Attendance totals for a date range — total check-ins, first-time visitors, children. If fromDate/toDate omitted, uses daysBack (default 30) through today.","scope":"attendance:read"},{"name":"attendance_check_in_contact","description":"Check a contact into a service (Sunday attendance). Alias for guests_check_in — use when the user says \"check in\" or \"mark attendance\". Provide serviceInstanceId or serviceId (finds/creates today's instance).","scope":"attendance:write"}]},{"module":"audit","description":"Audit log (audit:read scope). Sensitive.","toolCount":1,"tools":[{"name":"audit_list_events","description":"List recent audit-log events for the organization (who did what, when). Sensitive — requires the dedicated audit:read scope. Not for marketing unsubscribe counts — use people_count_unsubscribes.","scope":"audit:read"}]}],"totalTools":999,"workflowTools":949,"dashboardRoutes":1967,"mcpAppWidgets":7841,"widgetUriTemplate":"ui://sendifai/w/{widgetId}","widgetMimeType":"text/html;profile=mcp-app","resources":[{"uri":"sendifai://manifest","description":"Agent-readable manifest of all sendifai modules, tools, scopes, resources, and prompts","mimeType":"application/json"},{"uri":"sendifai://docs/getting-started","description":"How to authenticate, orient, and behave well as an agent on sendifai","mimeType":"text/markdown"},{"uri":"sendifai://docs/security","description":"The five security layers: auth, scopes, feature flags, rate limits, audit trail","mimeType":"text/markdown"},{"uri":"sendifai://docs/workflows","description":"Catalog of pre-built workflow prompts and how to compose them","mimeType":"text/markdown"},{"uri":"sendifai://docs/agents","description":"How the 11 autonomous agents work: modes, proposals, executable action types","mimeType":"text/markdown"},{"uri":"sendifai://docs/billing-and-limits","description":"Metered usage, LIMIT_REACHED responses, runsheet access seats vs roster-only, and platform_usage","mimeType":"text/markdown"},{"uri":"sendifai://docs/messaging-tariff","description":"Published messaging credit rates per destination and channel — agents must use billing_estimate_messaging_credits, never 1:1 math","mimeType":"text/markdown"},{"uri":"sendifai://docs/runsheet-crew-gate","description":"Crew portal and stage display: interaction lock, sync live, follow schedule clock, production notes, MCP tools","mimeType":"text/markdown"},{"uri":"sendifai://docs/contact-list-filters","description":"Unified contact list/search/export filters for People UI, API, MCP people_list_contacts and people_search_contacts","mimeType":"text/markdown"},{"uri":"sendifai://docs/brand-voice-templates","description":"29 org-type brand voice starter templates, API actions, and platform_get_brand_voice / platform_apply_brand_voice_template MCP tools","mimeType":"text/markdown"},{"uri":"sendifai://docs/funnel-ai-variation","description":"Per-recipient funnel email AI variation — not A/B; personalization_ai cost, MCP tools, service reminder defaults","mimeType":"text/markdown"},{"uri":"sendifai://docs/email-personalization","description":"Email merge tags, titles/honorifics, {{salutation_name}}, auto Hi greeting, WhatsApp {{1}} — channels_send_email and blasts","mimeType":"text/markdown"},{"uri":"sendifai://docs/org-media-library","description":"Org Media Library (/media, media_library) vs Media Hub — logos, posters, MCP platform_list_media_library_files","mimeType":"text/markdown"},{"uri":"sendifai://docs/ticketing","description":"Ticketing organizer MCP + ticketingbook host split, Connect, external listing, scopes, and tool catalog","mimeType":"text/markdown"},{"uri":"sendifai://docs/mediahub-library","description":"Media Hub published content (media_items) — media_type vs content_format; NOT org Media Library files","mimeType":"text/markdown"},{"uri":"sendifai://docs/grow-automations","description":"Pause, activate, and permanently delete automation flows — deleteAll/pauseAll, protected platform flows, no pre-pause for delete","mimeType":"text/markdown"},{"uri":"sendifai://docs/mcp-ops","description":"MCP ops audit, connected-agent governance, MCPOps Telegram alerts, and error taxonomy","mimeType":"text/markdown"},{"uri":"sendifai://docs/global-email-schedule-templates","description":"Global email templates for convention, festival, and order-of-program schedules — names, use cases, MCP list/get tools","mimeType":"text/markdown"},{"uri":"sendifai://docs/platform-intelligence","description":"Self-improvement engine: failure fingerprinting, tiered auto-patching, and the retryAdvice recovery contract agents must relay to users","mimeType":"text/markdown"},{"uri":"sendifai://org/snapshot","description":"Live cross-module snapshot of the organization (requires platform:read)","mimeType":"application/json"},{"uri":"sendifai://org/agents","description":"Live autonomous agent status: mode, last run, findings (requires platform:read)","mimeType":"application/json"},{"uri":"sendifai://org/proposals","description":"Pending autonomous-agent proposals awaiting approval (requires platform:read)","mimeType":"application/json"},{"uri":"sendifai://org/usage","description":"Metered usage and billing state per channel, including runsheet access seats (requires platform:read)","mimeType":"application/json"},{"uri":"sendifai://org/brand-voice","description":"Organization brand voice profile, effective template fallback, and starter template library (requires platform:read)","mimeType":"application/json"}],"resourceTemplates":[{"uriTemplate":"sendifai://contacts/{contactId}","description":"Full contact card by UUID: profile, tags, community membership (requires people:read)","mimeType":"application/json"},{"uriTemplate":"sendifai://contacts/{contactId}/notes","description":"Pastoral care notes for one contact — team/public only over MCP (requires people:read)","mimeType":"application/json"},{"uriTemplate":"sendifai://contacts/{contactId}/family","description":"Linked family/household relationships for one contact — spouse, parent, child, sibling (requires people:read)","mimeType":"application/json"},{"uriTemplate":"sendifai://contacts/{contactId}/timeline","description":"Combined pastoral care timeline — notes and interactions for one contact (requires people:read)","mimeType":"application/json"},{"uriTemplate":"sendifai://events/{eventId}","description":"Event sales, revenue, check-in, and capacity by UUID (requires ticketing:read)","mimeType":"application/json"},{"uriTemplate":"ui://sendifai/w/{widgetId}","description":"7841 in-chat MCP App widgets — tools, routes, playbooks, billing (no external links).","mimeType":"text/html;profile=mcp-app"}],"prompts":[{"name":"org_health_review","title":"Organization health review","description":"Full health check across the whole organization: overview, agents, proposals, usage, and recommended actions.","arguments":[]},{"name":"weekly_pastoral_review","title":"Weekly pastoral care review","description":"Review overdue follow-ups, pastoral notes, prayer requests, life events, and visits; propose check-ins.","arguments":[]},{"name":"guest_followup_sprint","title":"Guest follow-up sprint","description":"Work through the guest pipeline: due follow-ups, first-time visitors, and stalled pipeline entries.","arguments":[]},{"name":"event_health_check","title":"Event health check","description":"Deep-dive one event: sales pace, capacity, ticket types, waitlist, and promo recommendations.","arguments":["eventId"]},{"name":"campaign_launch","title":"Campaign launch checklist","description":"Pre-flight a draft email campaign: audience, content, send preview, then schedule at the optimal time.","arguments":["campaignId"]},{"name":"giving_report","title":"Giving report","description":"Produce a giving report for a date range: totals by fund, pledge progress, and notable donors.","arguments":["fromDate","toDate"]},{"name":"crm_cleanup","title":"CRM data cleanup","description":"Find and fix data-quality issues: duplicate contacts, missing emails/phones, and stale segments.","arguments":[]},{"name":"pastoral_care_ops","title":"Pastoral care operations","description":"Full Pastoral Care parity: dashboard, welfare, notes, visits, insights, life events, safeguarding, approvals, automations, teams.","arguments":[]},{"name":"community_ops","title":"Community module full parity","description":"Zero-gap Community parity: hub, search, settings, integration, automations, church services, structure.","arguments":[]},{"name":"channels_ops","title":"Channels module full parity","description":"Zero-gap Channels parity: email, messages, push, calendar — all tabs.","arguments":[]},{"name":"runsheet_ops","title":"Runsheet module full parity","description":"Zero-gap Runsheet parity: plans, schedule, songs, teams, templates, reports, import, live, gate.","arguments":[]},{"name":"giving_ops","title":"Giving module full parity","description":"Zero-gap Giving parity: dashboard, donations, givers, funds, reports, donate pages, counting, gift aid.","arguments":[]},{"name":"spaces_ops","title":"Spaces module full parity","description":"Zero-gap Spaces parity: rooms, calendar, bookings, approvals, buildings, floor plans, assets, maintenance, incidents, visitors, energy, marketplace, reports, settings.","arguments":[]},{"name":"people_ops","title":"People module full parity","description":"Zero-gap People parity: contacts, segments, tags, groups, portal, capture, profile, dashboard.","arguments":[]},{"name":"sunday_service_prep","title":"Sunday service prep","description":"Prepare the next service: unfilled volunteer positions, runsheet plan, song selection, and schedule.","arguments":[]},{"name":"attendance_report","title":"Attendance trends report","description":"Attendance trends over a date range: totals, first-time visitors, children, and follow-up conversion.","arguments":["fromDate","toDate"]},{"name":"new_member_onboarding","title":"New member onboarding","description":"Onboard one contact: profile check, welcome message, group matching, and follow-up task.","arguments":["contactId"]},{"name":"space_booking_assistant","title":"Space booking assistant","description":"Find and book a suitable room: availability check, conflict detection, and booking creation.","arguments":["date","purpose","attendees"]},{"name":"proposal_triage","title":"Agent proposal triage","description":"Review every pending autonomous-agent proposal and approve, reject, or escalate each with reasoning.","arguments":[]},{"name":"mcp_live_watch","title":"MCP live watch & human takeover","description":"Monitor connected MCP agents in real time, triage issues, and suspend agents that need human takeover.","arguments":[]},{"name":"church_sunday_ops","title":"Full Sunday operations runbook","description":"End-to-end Sunday ops: attendance, guests, runsheet, spaces, and follow-ups in one coordinated pass.","arguments":[]},{"name":"attendance_sunday_headcount","title":"Sunday headcount capture","description":"Review today's check-ins and compare to recent Sunday averages.","arguments":[]},{"name":"attendance_trend_alert","title":"Attendance decline alert","description":"Detect declining attendance trends and recommend pastoral/guest responses.","arguments":["weeks"]},{"name":"audit_security_review","title":"Security audit review","description":"Review recent audit events for security-sensitive actions.","arguments":[]},{"name":"audit_compliance_export","title":"Compliance audit export","description":"Prepare an audit trail summary for compliance or board review.","arguments":["fromDate","toDate"]},{"name":"billing_usage_upgrade_review","title":"Billing usage & upgrade review","description":"Check subscription state and whether an upgrade is needed for current usage.","arguments":[]},{"name":"billing_checkout_assist","title":"Billing checkout assist","description":"Help an operator upgrade a specific addon via Stripe checkout.","arguments":["addon"]},{"name":"channels_sms_not_delivered","title":"Text message did not arrive","description":"User-friendly help when an SMS was not received — diagnose sender, quiet hours, and recent sends.","arguments":["phone","contactId"]},{"name":"channels_register_sms_sender","title":"Register and activate an SMS sender ID","description":"End-to-end sender setup: shorten name if needed, create (pending review), set default when approved, optional test send after approval.","arguments":["desiredName","setAsDefault"]},{"name":"channels_manage_sms_senders","title":"Delete or switch default SMS sender","description":"Delete a sender (e.g. RCCGWT) and/or set another as default (e.g. MTZionFA).","arguments":["deleteSenderName","defaultSenderName"]},{"name":"channels_pastoral_checkin","title":"Pastoral SMS/email check-in","description":"Draft and send a personal pastoral check-in to one contact.","arguments":["contactId","channel"]},{"name":"channels_whatsapp_broadcast_prep","title":"WhatsApp broadcast prep","description":"Pre-flight a WhatsApp message: template check, audience, and send.","arguments":["templateName"]},{"name":"channels_transactional_notify","title":"Transactional notification send","description":"Send a one-off transactional email or SMS (receipt, reminder, confirmation).","arguments":["contactId","type"]},{"name":"community_prayer_triage","title":"Prayer request triage","description":"Review open prayer requests, prioritise urgent, and propose responses.","arguments":[]},{"name":"community_life_event_response","title":"Life event pastoral response","description":"Respond to recent life events (bereavement, illness, celebration) with appropriate care.","arguments":[]},{"name":"community_safeguarding_review","title":"Safeguarding check review","description":"Review open safeguarding checks and escalate amber/red items.","arguments":[]},{"name":"community_followup_completion","title":"Pastoral follow-up completion","description":"Work through pending pastoral follow-ups and close completed ones.","arguments":[]},{"name":"giving_who_counted","title":"Who ran the offering count","description":"Find counting sessions for a day and report which volunteer counted.","arguments":["date"]},{"name":"giving_pledge_followup","title":"Pledge follow-up","description":"Identify at-risk pledges and propose donor follow-up.","arguments":[]},{"name":"giving_first_time_donor_welcome","title":"First-time donor welcome","description":"Welcome first-time donors with a personal thank-you.","arguments":["fromDate"]},{"name":"giving_fund_setup","title":"New giving fund setup","description":"Create a new fund and verify it appears in giving reports.","arguments":["fundName"]},{"name":"giving_card_donation","title":"Process a card donation","description":"Charge a card via Stripe or share a public donate page — never collect raw card numbers in chat.","arguments":[]},{"name":"giving_gift_aid_setup","title":"Gift Aid declaration setup","description":"Check and record UK Gift Aid declarations for a donor.","arguments":["contactId"]},{"name":"groups_health_review","title":"Small groups health review","description":"Review all small groups: size, leaders, and inactive groups.","arguments":[]},{"name":"groups_new_member_placement","title":"Small group placement","description":"Place a contact into the best-matching small group.","arguments":["contactId"]},{"name":"grow_automation_audit","title":"Automation health audit","description":"Review all automations: active, paused, erroring, and enrollment counts.","arguments":[]},{"name":"grow_form_lead_triage","title":"Form submission triage","description":"Process new form submissions: dedupe, tag, and enroll in automations.","arguments":[]},{"name":"grow_landing_page_publish","title":"Landing page publish","description":"Create and publish a landing page for an event or campaign.","arguments":["title"]},{"name":"grow_ab_test_review","title":"A/B test review","description":"Review running A/B tests and recommend winner or extension.","arguments":[]},{"name":"guests_stalled_pipeline_review","title":"Stalled guest pipeline review","description":"Find guests stuck in early pipeline stages and recommend moves or follow-ups.","arguments":[]},{"name":"guests_checkin_welcome","title":"Guest check-in & welcome","description":"Check in a guest visitor and create their follow-up journey.","arguments":["contactId"]},{"name":"guests_sunday_operations","title":"Sunday check-in operations (agent-native)","description":"Full Sunday flow: services, roster, check-ins, pipeline report — optimized for MCP/agents.","arguments":["serviceId"]},{"name":"guests_copy_welcome_team","title":"Copy Welcome Team from previous service","description":"Copy Welcome Team volunteer roster from a past service to an upcoming one.","arguments":["targetServiceInstanceId","sourceServiceInstanceId"]},{"name":"guests_welcome_team_gaps","title":"Welcome Team gaps and assignments","description":"Review welcome team schedules, fill gaps, assign greeters and ushers.","arguments":[]},{"name":"guests_analytics_review","title":"Guest analytics and retention review","description":"Attendance trends, heatmap, pipeline summary, and follow-up priorities.","arguments":[]},{"name":"guests_locations_setup","title":"Check-in locations setup","description":"Configure kids rooms and check-in locations; optional Spaces import.","arguments":[]},{"name":"live_stream_prep","title":"Live stream prep","description":"Prepare an upcoming live stream: schedule, stats baseline, and poll setup.","arguments":["streamId"]},{"name":"live_post_stream_summary","title":"Post-stream summary","description":"Summarise stream performance and recommend follow-up content.","arguments":["streamId"]},{"name":"mediahub_podcast_publish","title":"Podcast episode publish","description":"Publish a podcast episode: create media item, metadata, and publish.","arguments":["title"]},{"name":"mediahub_playlist_curation","title":"Playlist curation","description":"Create or update a media playlist for a series or sermon archive.","arguments":["playlistName"]},{"name":"people_welcome_desk_daily","title":"Welcome Desk daily review","description":"Process Welcome Desk visitors and follow-up tasks for first-time guests.","arguments":[]},{"name":"people_contact_enrichment","title":"Contact profile enrichment","description":"Review and enrich a contact profile with custom fields and tags.","arguments":["contactId"]},{"name":"people_segment_audience_build","title":"Segment audience build","description":"Build or refine a CRM segment for campaigns or pastoral outreach.","arguments":["segmentName"]},{"name":"people_meeting_prep_brief","title":"Meeting prep brief","description":"Generate a pastoral or leadership meeting brief for one contact.","arguments":["contactId"]},{"name":"people_link_family_member","title":"Link two contacts as family","description":"Link existing contacts as family (e.g. Grace as James's daughter) using the native Relationships graph.","arguments":["contactNameA","contactNameB","relationship"]},{"name":"people_family_household_review","title":"Family & household review","description":"Review family relationships and household groupings for one contact.","arguments":["contactId"]},{"name":"platform_discovery_orientation","title":"MCP discovery orientation","description":"Orient a new MCP agent: manifest, tools, scopes, and golden path.","arguments":[]},{"name":"platform_agent_configuration","title":"Autonomous agent configuration","description":"Review and recommend autonomy modes for all 11 platform agents.","arguments":[]},{"name":"platform_route_explorer","title":"Dashboard API route explorer","description":"Find a dashboard API route for UI features not covered by workflow tools.","arguments":["query"]},{"name":"platform_dashboard_write","title":"Execute any dashboard setting or module action","description":"Find and invoke any dashboard API write when no workflow tool exists — full platform parity.","arguments":["action"]},{"name":"platform_invite_team_member","title":"Invite a team member","description":"Invite someone to the organization with a role — same as Settings → Team → Invite. Requires platform:write (intent=team or intent=platform).","arguments":["email","roleLabel"]},{"name":"runsheet_team_roster_audit","title":"Runsheet team roster audit","description":"Audit team roster, access seats, and unfilled positions.","arguments":[]},{"name":"runsheet_song_selection","title":"Worship song selection","description":"Select songs for an upcoming plan based on keys, recency, and theme.","arguments":["theme"]},{"name":"runsheet_publish_plan","title":"Publish runsheet plan","description":"Final review and publish of a runsheet plan to the team portal.","arguments":["planId"]},{"name":"runsheet_setup_from_previous_service","title":"Set up plan from previous service","description":"Copy service order and production team from the last similar service.","arguments":["targetPlanId","sourcePlanId"]},{"name":"runsheet_crew_gate_live","title":"Crew gate live service guide","description":"Explain crew portal stage display, interaction lock, sync live, and production notes for operators.","arguments":[]},{"name":"schedule_service_calendar_review","title":"Service calendar review","description":"Review upcoming services and recurring series for gaps or conflicts.","arguments":[]},{"name":"spaces_incident_response","title":"Facilities incident response","description":"Log and triage a facilities incident; notify relevant parties.","arguments":["roomId","description"]},{"name":"spaces_weekly_bookings_review","title":"Weekly bookings review","description":"Review this week's bookings, cancellations, and utilisation.","arguments":[]},{"name":"spaces_new_room_setup","title":"New room setup","description":"Add a new room to the spaces module.","arguments":["buildingId","roomName"]},{"name":"store_product_launch","title":"Store product launch","description":"Create and list a new product in the org store.","arguments":["productName"]},{"name":"store_order_review","title":"Store order review","description":"Review recent store orders and flag fulfilment priorities.","arguments":[]},{"name":"templates_email_series_build","title":"Email template series build","description":"Create a series of email templates for onboarding or nurture.","arguments":["seriesName"]},{"name":"templates_whatsapp_compliance","title":"WhatsApp template compliance check","description":"Verify WhatsApp templates are approved before a broadcast campaign.","arguments":[]},{"name":"ticketing_refund_handling","title":"Ticketing refund handling","description":"Process a refund request with human approval for money movement.","arguments":["orderId"]},{"name":"ticketing_day_of_checkin","title":"Day-of event check-in","description":"Run check-in operations on event day.","arguments":["eventId"]},{"name":"ticketing_event_launch","title":"Event create and publish","description":"Create a new event, ticket types, and publish to registration.","arguments":["eventName"]}],"examplePrompts":["Give me an overview of the organization","Search workflow tools for family relationships, then link Grace as child of James","Find the contact John Smith and log a bereavement life event for last Sunday","How much did we raise for the Building fund this month?","Is the Main Hall free next Saturday 2-5pm? If so book it for \"Youth rehearsal\"","List overdue pastoral follow-ups and draft a check-in SMS for each","Show open pastoral note follow-ups at /community/care/notes","List Welcome Desk visitors due for follow-up (people_list_welcome_desk_visitors)","How many Runsheet portal access seats are in use vs our limit?","Search dashboard API for gift aid report, then invoke via giving_invoke_api_read","Which volunteer positions are still unfilled for Sunday's service?","Show me last Sunday's run sheet / service plan","Copy last Sunday's service order and production team into this week's plan","Copy Welcome Team volunteers from last week to this Sunday","Invite htayenterprise@gmail.com as Finance — use platform_invite_team_member","Which guests have follow-ups due this week?"]}