MCP App Store
by KeenEthics

Overview

Joinways is a CRM built for event venues — hotels, coworking spaces, private venues and multi-site operators that host corporate events, seminars, weddings and private parties. The Joinways connector gives Claude secure, OAuth-protected access to your venue workspace so you can run your sales pipeline in plain language: • Inquiries: browse and qualify incoming event requests with AI summaries and extracted requirements, then convert a validated inquiry into an event in one step. • Availability: check a venue or space for booking conflicts, see business hours and closures, block or unblock dates, import public holidays. • Quotes & invoices: create quotes, add priced line items (VAT and discounts computed server-side from the same engine as the app), update status and download the PDF. • Events & BEOs: create and update events, manage function sheets (schedule, setup, staff, day-of contacts, per-day overrides), notes and tasks. • CRM: search, create and update companies and contacts. • Email: draft and send event emails through your connected Gmail or Outlook account. • Analytics: conversion rate, revenue and event volume over the last 12 months. 79 tools, each annotated read-only or destructive. Every action runs with the signed-in user's own permissions inside their workspace.

Tools

add_company_note

ChatGPT
Add a note to a company (logged on its timeline).

add_event_note

ChatGPT
Add a note to an event.

add_quote_items

ChatGPT
Append line items to a quote. Totals are computed server-side from the same VAT engine as the UI (incl. is_offered and discount_amount). Items linked to a catalog (location_item_id) are validated against the catalog minimum price — offered lines bypass the check.

archive_event

ChatGPT
Archive an event, like "Archive" in the app: it leaves the default lists and becomes read-only, its status is kept, its open tasks are cancelled (restored by unarchive_event), the leads of its request move to the request's other live event when there is exactly one, and it is removed from the connected calendars. Reversible with unarchive_event; required before delete_event. Idempotent.

block_venue_dates

ChatGPT
Mark a venue (or sub-space) as unavailable for a date range. Omit start_time/end_time for a full-day block, or pass both for a partial-day block. Returns the created closure with its id.

cancel_quote

ChatGPT
Withdraw a quote without deleting it: status becomes cancelled, the row and its history stay, it stops counting in the confirmed revenue. For a committed quote (accepted, signed, invoiced, paid; refused while an active invoice exists) and for a platform quote (source = platform) whatever its status, pending or refused too: a platform quote is never deleted, and cancelling a version gives its place back to the version it replaced. A replaced version (superseded_by_quote_id set) is refused: cancel the version in force. A draft / pending Joinways quote is deleted with delete_quote instead. Already cancelled = success.

check_venue_availability

ChatGPT
Detect conflicts on a venue/space between two dates.

convert_lead_to_event

ChatGPT
Create an event from a lead and mark the lead validated.

count_companies

ChatGPT
Count companies matching filters.

count_events

ChatGPT
Count events matching filters. Use for "how many" questions.

count_leads

ChatGPT
Count leads matching filters. Use for "how many" questions.

count_people

ChatGPT
Count contacts matching filters.

count_quotes

ChatGPT
Count quotes matching filters.

count_tasks

ChatGPT
Count tasks matching filters.

create_catalog_item

ChatGPT
Add an item to a venue catalog.

create_company

ChatGPT
Create a company.

create_event

ChatGPT
Create an event. company_name and contact_email auto-create rows if needed.

create_event_slot

ChatGPT
Book a space (room) of the event's venue for a day, optionally between two venue wall-clock times. The room joins the event's spaces; a room with slots is only busy during them.

create_lead

ChatGPT
Create a lead (an inquiry) in the inbox. With platform_link (the request page on the booking platform, plus platform = its registry name when known), the request identity is computed like for emailed requests: when a lead already carries that request at that venue, it is returned with existing=true and matched_via instead of creating a duplicate.

create_person

ChatGPT
Create a contact.

create_quote

ChatGPT
Create a quote on an event. Returns quote_id.

create_task

ChatGPT
Create a task, optionally linked to an event.

delete_catalog_item

ChatGPT
Remove a catalog item.

delete_event

ChatGPT
Permanently delete an event and its data.

delete_event_slot

ChatGPT
Remove a space slot. The last slot of a room also removes the room from the event.

delete_person

ChatGPT
Delete a contact.

delete_quote

ChatGPT
Permanently delete a quote and its items.

delete_quote_item

ChatGPT
Remove a single line item from a quote.

delete_task

ChatGPT
Delete a task.

download_quote

ChatGPT
Generate a PDF for a quote (or its invoice once accepted), store it as a new version in quote_pdfs, and return a 1h signed URL the client can download. Mirrors the web download flow: if the quote is accepted without an invoice number, a legal invoice number is generated and persisted.

duplicate_quote

ChatGPT
Clone a quote with all its line items. The copy is a clean draft (status=draft, is_invoiced=false, signature_mode='manual'). Header snapshot (client, terms, reverse-charge flag) is preserved. Returns the new quote id.

generate_email_draft

ChatGPT
AI-draft an email body for an event.

get_accounting_analytics

ChatGPT
Confirmed revenue per month over the last 12 months.

get_beo

ChatGPT
Full BEO (feuille de fonction): event-level fields (schedule, setup, notes, vendors, on-site contact, context), staff, day-of contacts, and per-day overrides. This is the canonical way to inspect everything an event's BEO holds.

get_commercial_analytics

ChatGPT
Conversion rate and revenue over the last 12 months.

get_company

ChatGPT
One company by id, every field (address, state, country, registration and VAT numbers, enrichment data).

get_event

ChatGPT
Full event with company/contact/venue/spaces/BEO. Excludes search vector and embedding.

get_events_analytics

ChatGPT
Monthly event counts by status over the last 12 months.

get_inquiries_analytics

ChatGPT
Inquiries received over a period (the Reports page "Inquiries" tab): received, accepted, rejected, pending, quoted and confirmed counts, acceptance rate (accepted / received) and win rate (confirmed / received), monthly series, breakdown by source and by venue, processing times. analytics keeps the legacy month → counts map (now inquiry counts, no longer events by status). Same numbers and definitions as the Reports page. Every KPI returns current, previous (comparison period) and change_pct (or change_points for rates); period echoes the effective period.

get_lead

ChatGPT
Get full lead with ai_summary, requirements and metadata.

get_person

ChatGPT
One contact by id: name, job title, company, notes, email and phone (never enrichment data).

get_quote_details

ChatGPT
Full quote with line items, totals and status.

get_reports_overview

ChatGPT
The Reports page overview: signed revenue month to date vs the same days last year, monthly goal progress, revenue booked for the next 6 months, open pipeline (value and weighted value), 12-month win rate, median first response time, up to 3 computed insights, action items (quotes expiring within 7 days, quotes viewed recently, inquiries pending for more than 24 h, confirmed events without amount), and a 12-month revenue trend with a 3-month forecast. Uses fixed windows relative to today; only venues filters.

get_responsiveness_analytics

ChatGPT
First response time to inquiries over a period (the Reports page "Responsiveness" tab), counted in each venue's business hours: median, share answered within one business hour, delay buckets, by source, member and venue, arrivals by weekday × 2-hour slot, off-hours inquiries, inquiries still pending. Same numbers and definitions as the Reports page. Every KPI returns current, previous (comparison period) and change_pct (or change_points for rates); period echoes the effective period.

get_task

ChatGPT
Get a full task including description, notes, attachments and dependencies.

get_venue

ChatGPT
Venue with spaces and members.

get_venue_availability

ChatGPT
Business hours, blocked dates (closures) and enforcement mode for a venue or sub-space. Use from/to to scope closures to a date window.

import_signed_quote

ChatGPT
Bring a quote signed on a booking platform (Kactus, Privateaser…) back into Joinways as the signed proof of an event. With quote_id, the existing Joinways quote of that event is stamped signed; without it, an external quote (source = "platform") is created from the platform totals. Both confirm the event and write the activity, like a paper signature. Mirrors POST /api/v1/events/{id}/quotes/import.

import_venue_holidays

ChatGPT
Bulk-create public-holiday closures on a venue (enable=true) or remove all auto-imported ones (enable=false). Country is an ISO-3166 alpha-2 or alpha-3 code, e.g. "FR".

list_catalog_items

ChatGPT
Venue catalog (paginated). detail="full" includes description and tags.

list_companies

ChatGPT
List companies (paginated, compact summary). detail="full" includes enrichment_data.

list_company_notes

ChatGPT
Notes of a company, newest first, with their author name.

list_email_connections

ChatGPT
User Gmail/Outlook connections. Required before send.

list_email_templates

ChatGPT
Available email templates.

list_event_contacts

ChatGPT
Day-of contacts for an event (on-site & remote): display name, role, phone, email, isOnsite, isPrimary, optional day pin. The primary contact is mirrored to events.onsite_contact_person_id.

list_event_days

ChatGPT
Per-day rows for a multi-day event (setup/catering/technical/service overrides). Mono-day events return [] — fall back to the flat events.<col> values in that case. Rows are auto-created by a Postgres trigger when start_date/end_date change.

list_event_emails

ChatGPT
Emails linked to an event.

list_event_files

ChatGPT
Files attached to an event.

list_event_notes

ChatGPT
Notes attached to an event.

list_event_slots

ChatGPT
Space slots of an event: room, day, optional start/end (venue wall clock, no timezone; none = whole day; end before start = ends next day), label, quote line. Ordered by day then time.

list_event_staff

ChatGPT
BEO staff list for an event: display name, role, call/leave time, phone, email, notes, optional day pin.

list_events

ChatGPT
List events with company/contact/venue (paginated, compact summary). detail="full" returns every column.

list_leads

ChatGPT
List inbox leads (paginated, compact summary). The summary omits personal identifiers (client_email, client_phone); use detail="full" or get_lead to retrieve contact details plus ai_summary/requirements/metadata.

list_notifications

ChatGPT
Recent notifications for the current user.

list_people

ChatGPT
List contacts (paginated, compact summary). The summary omits personal identifiers (email, phone); pass detail="full" to include email, phone and enrichment_data when the task requires them.

list_quotes

ChatGPT
List quotes (paginated, compact summary). detail="full" includes terms and client snapshot.

list_tasks

ChatGPT
List tasks (paginated, compact summary). detail="full" includes description/notes/attachments.

list_team_members

ChatGPT
Members of the workspace, for picking task/event assignees. Returns the assignee id and display name only — no email, avatar or other personal identifiers.

list_venue_closures

ChatGPT
Effective blocked-date list for a venue (own closures + those inherited from a parent venue, plus any auto-imported holidays). Filter with from/to.

list_venue_conflicts

ChatGPT
Overlapping events for a venue.

list_venue_spaces

ChatGPT
Sub-spaces of a venue.

list_venues

ChatGPT
Venues with nested spaces.

merge_leads

ChatGPT
Fold a duplicate lead (lead_id) into the lead carrying the same request (into_lead_id), like "Merge" in the inbox. When the target has an event the duplicate joins it; when only the duplicate has one, the direction is inverted; otherwise the duplicate is archived as merged into the target. Refused for a rejected or archived target, a closed event, or two leads with different events. Nothing is deleted.

reorder_quote_items

ChatGPT
Batch update sort_order + event_day on a quote's line items. Use this for drag-and-drop reordering across days. Only items that actually belong to the specified quote are touched.

replace_event_contacts

ChatGPT
Replace the day-of contacts list for an event. Same diff semantics as replace_event_staff: entries with id are updated, without are inserted, missing ids are deleted. Day-of contacts are STANDALONE — free-text entries are NOT auto-linked to the CRM annuaire (use the CRM tools if you need to register them as people). The first onsite contact (or first contact tout court) becomes primary and is mirrored to events.onsite_contact_person_id.

replace_event_staff

ChatGPT
Replace the BEO staff list for an event. The submitted array is the new ground truth: entries with an existing id are updated, entries without id are inserted, and any existing row whose id is missing from the payload is deleted. Free-text entries with an email or phone are auto-linked to (or created in) the CRM annuaire. Use list_event_staff first to fetch the current ids you want to preserve.

search_companies

ChatGPT
Top company matches by name.

send_event_email

ChatGPT
Send email via a Gmail/Outlook connection, linked to an event. Connection must have send permission.

unarchive_event

ChatGPT
Unarchive an event, like "Unarchive" in the app: it is editable again, the tasks its archive cancelled get their previous status back, and it is republished on the connected calendars. Idempotent.

unblock_venue_dates

ChatGPT
Remove a previously-created closure by its id. Use list_venue_closures or get_venue_availability to find the id. Auto-imported holiday closures share the same id surface but should normally be removed via import_venue_holidays(enable=false) to clear the whole batch at once.

update_beo

ChatGPT
Update event-level BEO fields: schedule (rich), setup_type, *_notes, beo_vendors, beo_context, onsite_contact_person_id. Only the fields you pass are written; omit a field to leave it untouched. Pass null on a nullable field to clear it. For staff / day-of contacts / per-day overrides use the dedicated upsert tools.

update_catalog_item

ChatGPT
Update a catalog item.

update_company

ChatGPT
Update company fields.

update_event

ChatGPT
Update event fields.

update_event_days

ChatGPT
Patch per-day overrides for a multi-day event. Keyed by dayDate (YYYY-MM-DD) — the stable identity of a day row — so you can send patches without round-tripping through the trigger-generated ids. The calendar of days itself is owned by the event dates / selected_dates (managed by a DB trigger): a payload day whose dayDate matches no existing row is SKIPPED, never inserted, and reported in the response skippedDates. Use get_beo (or list the days) first to know the valid dates.

update_event_slot

ChatGPT
Change a space slot: room, day, times, label, quote line. null clears a field; start_time and end_time both null = whole day.

update_event_status

ChatGPT
Change event status.

update_lead_requested_spaces

ChatGPT
Set the rooms (spaces of the lead venue, see list_venue_spaces) a lead asks for. Replaces the current list; [] clears it. The lead must have a location_id. Carried to the event on conversion.

update_lead_status

ChatGPT
Validate or reject a lead.

update_person

ChatGPT
Update contact fields.

update_quote

ChatGPT
Patch any subset of quote header fields: title, currency, signature_mode, is_reverse_charge, billing_profile_id, expires_at, due_date, payment_date, purchase_order, the three terms blocks (payment / cancellation / postponement), and the frozen client snapshot (client_first_name, client_email, client_company_name, client_address, client_vat_number, etc.). Use update_quote_status to change status — not this tool. For line items use add_quote_items / update_quote_item. Omit a field to leave it untouched; pass null to clear a nullable field.

update_quote_item

ChatGPT
Patch a single line item. Any of: title, description, quantity, unit_price, vat, location_item_id, is_option, is_discount, is_offered, discount_amount, event_day, sort_order. The stored total is recomputed when any pricing input changes. Catalog min-price is re-validated against the effective post-patch state.

update_quote_status

ChatGPT
Change a quote's status. Setting to accepted is exclusive per event: if another quote on the same event is already accepted, the tool returns a conflict result WITHOUT writing — call again with force_confirm: true to demote the conflicting quotes to pending and proceed. Side effects mirror the editor: signed stamps signed_at; pending stamps sent_at on first transition; draft resets is_signed and clears sent_at.

update_task

ChatGPT
Update task fields.

upsert_event_contacts

ChatGPT
Replace the day-of contacts list for an event. Same diff semantics as upsert_event_staff: entries with id are updated, without are inserted, missing ids are deleted. Day-of contacts are STANDALONE — free-text entries are NOT auto-linked to the CRM annuaire (use the CRM tools if you need to register them as people). The first onsite contact (or first contact tout court) becomes primary and is mirrored to events.onsite_contact_person_id.

upsert_event_days

ChatGPT
Patch per-day overrides for a multi-day event. Keyed by (event_id, day_index) rather than id — that lets you send patches without first round-tripping through the trigger-generated ids. This tool NEVER deletes rows (same rule as the trigger) to protect against silent data loss on accidental date edits — shrink the event date range instead, the UI ignores overflow rows.

upsert_event_staff

ChatGPT
Replace the BEO staff list for an event. The submitted array is the new ground truth: entries with an existing id are updated, entries without id are inserted, and any existing row whose id is missing from the payload is deleted. Free-text entries with an email or phone are auto-linked to (or created in) the CRM annuaire. Use list_event_staff first to fetch the current ids you want to preserve.

add_event_note

Claude

add_quote_items

Claude

block_venue_dates

Claude

check_venue_availability

Claude

convert_lead_to_event

Claude

count_companies

Claude

count_events

Claude

count_leads

Claude

count_people

Claude

count_quotes

Claude

count_tasks

Claude

create_catalog_item

Claude

create_company

Claude

create_event

Claude

create_person

Claude

create_quote

Claude

create_task

Claude

delete_catalog_item

Claude

delete_event

Claude

delete_person

Claude

delete_quote

Claude

delete_quote_item

Claude

delete_task

Claude

download_quote

Claude

duplicate_quote

Claude

generate_email_draft

Claude

get_accounting_analytics

Claude

get_beo

Claude

get_commercial_analytics

Claude

get_event

Claude

get_events_analytics

Claude

get_lead

Claude

get_quote_details

Claude

get_task

Claude

get_venue

Claude

get_venue_availability

Claude

import_signed_quote

Claude

import_venue_holidays

Claude

list_catalog_items

Claude

list_companies

Claude

list_email_connections

Claude

list_email_templates

Claude

list_event_contacts

Claude

list_event_days

Claude

list_event_emails

Claude

list_event_files

Claude

list_event_notes

Claude

list_event_staff

Claude

list_events

Claude

list_leads

Claude

list_notifications

Claude

list_people

Claude

list_quotes

Claude

list_tasks

Claude

list_team_members

Claude

list_venue_closures

Claude

list_venue_conflicts

Claude

list_venue_spaces

Claude

list_venues

Claude

reorder_quote_items

Claude

search_companies

Claude

send_event_email

Claude

unblock_venue_dates

Claude

update_beo

Claude

update_catalog_item

Claude

update_company

Claude

update_event

Claude

update_event_status

Claude

update_lead_status

Claude

update_person

Claude

update_quote

Claude

update_quote_item

Claude

update_quote_status

Claude

update_task

Claude

upsert_event_contacts

Claude

upsert_event_days

Claude

upsert_event_staff

Claude

Capabilities

Writes

Example Prompts

Click any prompt to copy it.

App Stats

178

Tools

3

Prompts

ChatGPT, Claude

Platforms

Category

CRM Records

Works with

ChatGPT
Claude

Data refreshed daily