OfficeRnD MCP by usefulapi
Browse OfficeRnD members, bookings, memberships, invoices and tickets, with optional write access.
Should I use this
Quality & Safety
Findings (1)
- LOWin officernd_list_booking_occurrences
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"officernd": {
"url": "https://officernd.usefulapi.io/mcp"
}
}
}Remote endpoints
https://officernd.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (20)
🟢officernd_get_organization
Fetch the OfficeRnD organization these credentials belong to — name, slug and region. A cheap way to confirm the setup works. OfficeRnD: GET /api/v2/organizations/{orgSlug}.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢officernd_list_locations(name, is_open, is_public, limit, cursor_next, ...)
List the organization's locations (coworking spaces/buildings) with address, timezone and open/public flags. Location _ids are needed by most other filters and by officernd_create_member. OfficeRnD: GET /locations.
Input Schema
{
"type": "object",
"properties": {
"name": {
"description": "Exact location name.",
"type": "string"
},
"is_open": {
"description": "Only operational (true) or non-operational (false) locations.",
"type": "boolean"
},
"is_public": {
"description": "Only locations shown (true) or hidden (false) in the members portal.",
"type": "boolean"
},
"limit": {
"description": "Page size, 1-50 (OfficeRnD's max; default 50).",
"type": "integer",
"minimum": 1,
"maximum": 50
},
"cursor_next": {
"description": "The cursorNext from the previous page. Omit for the first page.",
"type": "string"
},
"cursor_prev": {
"description": "The cursorPrev from a page, to go one page back.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢officernd_list_members(email, name, location, company, status, ...)
List members (people) of the workspace, filterable by exact email or name, location, company, status and creation/modification date. OfficeRnD: GET /members.
Input Schema
{
"type": "object",
"properties": {
"email": {
"description": "Exact email match.",
"type": "string"
},
"name": {
"description": "Exact name match.",
"type": "string"
},
"location": {
"description": "Only items for this location _id.",
"type": "string"
},
"company": {
"description": "Only items for this company _id.",
"type": "string"
},
"status": {
"description": "One or more member statuses.",
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"enum": [
"active",
"former",
"pending",
"contact",
"not_approved",
"drop-in",
"lead"
]
}
},
"is_billing_person": {
"description": "Only (non-)billing persons of their company.",
"type": "boolean"
},
"created_from": {
"description": "Only members created at or after this time (ISO 8601 date-time, e.g. 2026-01-01T00:00:00.000Z).",
"type": "string"
},
"created_before": {
"description": "Only members created before this time (ISO 8601 date-time, e.g. 2026-01-01T00:00:00.000Z).",
"type": "string"
},
"modified_since": {
"description": "Only items modified at or after this time (ISO 8601 date-time, e.g. 2026-01-01T00:00:00.000Z).",
"type": "string"
},
"sort": {
"description": "Sort expression <field>:asc|desc, e.g. createdAt:desc.",
"type": "string",
"pattern": "^[^:]+:(asc|desc)$"
},
"limit": {
"description": "Page size, 1-50 (OfficeRnD's max; default 50).",
"type": "integer",
"minimum": 1,
"maximum": 50
},
"cursor_next": {
"description": "The cursorNext from the previous page. Omit for the first page.",
"type": "string"
},
"cursor_prev": {
"description": "The cursorPrev from a page, to go one page back.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢officernd_get_member(member_id)
Fetch one member by _id — contact details, company, location, status, billing details and custom properties. OfficeRnD: GET /members/{memberId}.
Input Schema
{
"type": "object",
"properties": {
"member_id": {
"type": "string",
"minLength": 1,
"description": "The member _id."
}
},
"required": [
"member_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢officernd_list_companies(company_id, name, location, status, modified_since, ...)
List companies (teams/tenants renting space), filterable by exact name or _id, location and status. OfficeRnD: GET /companies.
Input Schema
{
"type": "object",
"properties": {
"company_id": {
"description": "Exact company _id (use to fetch a single company).",
"type": "string"
},
"name": {
"description": "Exact company name.",
"type": "string"
},
"location": {
"description": "Only items for this location _id.",
"type": "string"
},
"status": {
"description": "One or more company statuses.",
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"enum": [
"active",
"former",
"pending",
"inactive",
"not_approved",
"drop-in",
"lead"
]
}
},
"modified_since": {
"description": "Only items modified at or after this time (ISO 8601 date-time, e.g. 2026-01-01T00:00:00.000Z).",
"type": "string"
},
"sort": {
"description": "Sort expression <field>:asc|desc, e.g. createdAt:desc.",
"type": "string",
"pattern": "^[^:]+:(asc|desc)$"
},
"limit": {
"description": "Page size, 1-50 (OfficeRnD's max; default 50).",
"type": "integer",
"minimum": 1,
"maximum": 50
},
"cursor_next": {
"description": "The cursorNext from the previous page. Omit for the first page.",
"type": "string"
},
"cursor_prev": {
"description": "The cursorPrev from a page, to go one page back.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢officernd_list_resources(name, location, type, limit, cursor_next, ...)
List bookable/assignable resources — meeting rooms, desks, hot desks, private offices — with capacity, price, rate, floor and amenities. Resource _ids are needed by officernd_create_booking. OfficeRnD: GET /resources.
Input Schema
{
"type": "object",
"properties": {
"name": {
"description": "Exact resource name.",
"type": "string"
},
"location": {
"description": "Only items for this location _id.",
"type": "string"
},
"type": {
"description": "One or more resource types. System types: meeting_room (bookable meeting rooms), hotdesk (bookable hot desks), team_room (private offices), desk (dedicated desks), desk_tr (desks inside private offices), desk_na (not available); orgs may add custom types.",
"maxItems": 50,
"type": "array",
"items": {
"type": "string"
}
},
"limit": {
"description": "Page size, 1-50 (OfficeRnD's max; default 50).",
"type": "integer",
"minimum": 1,
"maximum": 50
},
"cursor_next": {
"description": "The cursorNext from the previous page. Omit for the first page.",
"type": "string"
},
"cursor_prev": {
"description": "The cursorPrev from a page, to go one page back.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢officernd_list_bookings(member, company, location, resource, is_cancelled, ...)
List bookings: one entry per one-off booking and one per recurring series (first instance only). Filter by member, company, location, resource, series start window and status. For every individual occurrence in a date window use officernd_list_booking_occurrences. OfficeRnD: GET /bookings.
Input Schema
{
"type": "object",
"properties": {
"member": {
"description": "Only items for this member _id.",
"type": "string"
},
"company": {
"description": "Only items for this company _id.",
"type": "string"
},
"location": {
"description": "Only items for this location _id.",
"type": "string"
},
"resource": {
"description": "One or more resource _ids.",
"maxItems": 50,
"type": "array",
"items": {
"type": "string"
}
},
"is_cancelled": {
"description": "Only (non-)cancelled bookings.",
"type": "boolean"
},
"is_tentative": {
"description": "Only tentative (unconfirmed) or confirmed bookings.",
"type": "boolean"
},
"starts_from": {
"description": "Only bookings/series starting at or after this time (ISO 8601 date-time, e.g. 2026-01-01T00:00:00.000Z).",
"type": "string"
},
"starts_before": {
"description": "Only bookings/series starting before this time (ISO 8601 date-time, e.g. 2026-01-01T00:00:00.000Z).",
"type": "string"
},
"modified_since": {
"description": "Only items modified at or after this time (ISO 8601 date-time, e.g. 2026-01-01T00:00:00.000Z).",
"type": "string"
},
"limit": {
"description": "Page size, 1-50 (OfficeRnD's max; default 50).",
"type": "integer",
"minimum": 1,
"maximum": 50
},
"cursor_next": {
"description": "The cursorNext from the previous page. Omit for the first page.",
"type": "string"
},
"cursor_prev": {
"description": "The cursorPrev from a page, to go one page back.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢officernd_list_booking_occurrences(from, to, member, company, location, ...)
List every individual booking occurrence between two times — one-off bookings plus each expanded instance of recurring series. The right tool for calendars, room availability and utilisation. Without pagination the window may be at most 1 year. OfficeRnD: GET /bookings/occurrences.
Input Schema
{
"type": "object",
"properties": {
"from": {
"type": "string",
"minLength": 1,
"description": "Window start (ISO 8601 date-time), e.g. 2026-10-01T00:00:00.000Z."
},
"to": {
"type": "string",
"minLength": 1,
"description": "Window end (ISO 8601 date-time), e.g. 2026-10-08T00:00:00.000Z."
},
"member": {
"description": "Only items for this member _id.",
"type": "string"
},
"company": {
"description": "Only items for this company _id.",
"type": "string"
},
"location": {
"description": "Only items for this location _id.",
"type": "string"
},
"resource": {
"description": "One or more resource _ids.",
"maxItems": 50,
"type": "array",
"items": {
"type": "string"
}
},
"is_cancelled": {
"description": "Only (non-)cancelled bookings.",
"type": "boolean"
},
"is_tentative": {
"description": "Only tentative (unconfirmed) or confirmed bookings.",
"type": "boolean"
},
"limit": {
"description": "Page size, 1-50 (OfficeRnD's max; default 50).",
"type": "integer",
"minimum": 1,
"maximum": 50
},
"cursor_next": {
"description": "The cursorNext from the previous page. Omit for the first page.",
"type": "string"
},
"cursor_prev": {
"description": "The cursorPrev from a page, to go one page back.",
"type": "string"
}
},
"required": [
"from",
"to"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢officernd_get_booking(booking_id)
Fetch one booking by _id — resource, member/company, times, recurrence rule, fees, extras, visitors and status. OfficeRnD: GET /bookings/{bookingId}.
Input Schema
{
"type": "object",
"properties": {
"booking_id": {
"type": "string",
"minLength": 1,
"description": "The booking _id."
}
},
"required": [
"booking_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢officernd_list_memberships(member, company, location, plan, calculated_status, ...)
List memberships (recurring plans sold to members/companies) with plan, price, discount, start/end dates and calculated status. OfficeRnD: GET /memberships.
Input Schema
{
"type": "object",
"properties": {
"member": {
"description": "Only items for this member _id.",
"type": "string"
},
"company": {
"description": "Only items for this company _id.",
"type": "string"
},
"location": {
"description": "Only items for this location _id.",
"type": "string"
},
"plan": {
"description": "One or more plan _ids.",
"maxItems": 50,
"type": "array",
"items": {
"type": "string"
}
},
"calculated_status": {
"description": "The platform-calculated membership status.",
"type": "string",
"enum": [
"not_started",
"active",
"expired",
"not_approved"
]
},
"modified_since": {
"description": "Only items modified at or after this time (ISO 8601 date-time, e.g. 2026-01-01T00:00:00.000Z).",
"type": "string"
},
"limit": {
"description": "Page size, 1-50 (OfficeRnD's max; default 50).",
"type": "integer",
"minimum": 1,
"maximum": 50
},
"cursor_next": {
"description": "The cursorNext from the previous page. Omit for the first page.",
"type": "string"
},
"cursor_prev": {
"description": "The cursorPrev from a page, to go one page back.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢officernd_list_contracts(company, location, status, stage, modified_since, ...)
List contracts (agreements for plans and resources) with totals, dates, notice period, status and lifecycle stage — e.g. find contracts up for renewal or serving notice. OfficeRnD: GET /contracts.
Input Schema
{
"type": "object",
"properties": {
"company": {
"description": "Only items for this company _id.",
"type": "string"
},
"location": {
"description": "Only items for this location _id.",
"type": "string"
},
"status": {
"description": "Contract status.",
"type": "string",
"enum": [
"signed",
"draft",
"terminated",
"not_signed",
"canceled"
]
},
"stage": {
"description": "Contract lifecycle stage.",
"type": "string",
"enum": [
"terminated",
"served_notice",
"active",
"up_for_renewal",
"not_renewed",
"expired",
"rolling"
]
},
"modified_since": {
"description": "Only items modified at or after this time (ISO 8601 date-time, e.g. 2026-01-01T00:00:00.000Z).",
"type": "string"
},
"sort": {
"description": "Sort expression <field>:asc|desc, e.g. createdAt:desc.",
"type": "string",
"pattern": "^[^:]+:(asc|desc)$"
},
"limit": {
"description": "Page size, 1-50 (OfficeRnD's max; default 50).",
"type": "integer",
"minimum": 1,
"maximum": 50
},
"cursor_next": {
"description": "The cursorNext from the previous page. Omit for the first page.",
"type": "string"
},
"cursor_prev": {
"description": "The cursorPrev from a page, to go one page back.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢officernd_list_checkins(member, company, location, started_from, started_before, ...)
List member check-ins (who was on site, when, and via which booking or pass) — useful for occupancy and attendance. OfficeRnD: GET /checkins.
Input Schema
{
"type": "object",
"properties": {
"member": {
"description": "Only items for this member _id.",
"type": "string"
},
"company": {
"description": "Only items for this company _id.",
"type": "string"
},
"location": {
"description": "Only items for this location _id.",
"type": "string"
},
"started_from": {
"description": "Only check-ins starting at or after this time (ISO 8601 date-time, e.g. 2026-01-01T00:00:00.000Z).",
"type": "string"
},
"started_before": {
"description": "Only check-ins starting before this time (ISO 8601 date-time, e.g. 2026-01-01T00:00:00.000Z).",
"type": "string"
},
"limit": {
"description": "Page size, 1-50 (OfficeRnD's max; default 50).",
"type": "integer",
"minimum": 1,
"maximum": 50
},
"cursor_next": {
"description": "The cursorNext from the previous page. Omit for the first page.",
"type": "string"
},
"cursor_prev": {
"description": "The cursorPrev from a page, to go one page back.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢officernd_list_payments(member, company, location, document_type, status, ...)
List billing documents — invoices, credit notes, overpayments — with totals, paid/pending amounts, due dates and status. Filter by member, company, location, document type, status, number and issue/due date (e.g. overdue invoices). OfficeRnD: GET /payments.
Input Schema
{
"type": "object",
"properties": {
"member": {
"description": "Only items for this member _id.",
"type": "string"
},
"company": {
"description": "Only items for this company _id.",
"type": "string"
},
"location": {
"description": "Only items for this location _id.",
"type": "string"
},
"document_type": {
"description": "Document type.",
"type": "string",
"enum": [
"creditNote",
"invoice",
"overpayment",
"paymentCharge"
]
},
"status": {
"description": "One or more statuses, e.g. paid, pending.",
"maxItems": 50,
"type": "array",
"items": {
"type": "string"
}
},
"number": {
"description": "Exact document number.",
"type": "string"
},
"issued_from": {
"description": "Only documents issued at or after this date (ISO 8601 date-time, e.g. 2026-01-01T00:00:00.000Z).",
"type": "string"
},
"issued_before": {
"description": "Only documents issued before this date (ISO 8601 date-time, e.g. 2026-01-01T00:00:00.000Z).",
"type": "string"
},
"due_before": {
"description": "Only documents due before this date (ISO 8601 date-time, e.g. 2026-01-01T00:00:00.000Z).",
"type": "string"
},
"modified_since": {
"description": "Only items modified at or after this time (ISO 8601 date-time, e.g. 2026-01-01T00:00:00.000Z).",
"type": "string"
},
"sort": {
"description": "Sort expression <field>:asc|desc, e.g. createdAt:desc.",
"type": "string",
"pattern": "^[^:]+:(asc|desc)$"
},
"limit": {
"description": "Page size, 1-50 (OfficeRnD's max; default 50).",
"type": "integer",
"minimum": 1,
"maximum": 50
},
"cursor_next": {
"description": "The cursorNext from the previous page. Omit for the first page.",
"type": "string"
},
"cursor_prev": {
"description": "The cursorPrev from a page, to go one page back.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢officernd_list_tickets(limit, cursor_next, cursor_prev)
List helpdesk tickets (member requests/issues) with subject, message, status (open/new/pending/resolved), priority, severity and assignee. OfficeRnD: GET /tickets.
Input Schema
{
"type": "object",
"properties": {
"limit": {
"description": "Page size, 1-50 (OfficeRnD's max; default 50).",
"type": "integer",
"minimum": 1,
"maximum": 50
},
"cursor_next": {
"description": "The cursorNext from the previous page. Omit for the first page.",
"type": "string"
},
"cursor_prev": {
"description": "The cursorPrev from a page, to go one page back.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢officernd_list_ticket_options(limit, cursor_next, cursor_prev)
List the helpdesk ticket options — the configured types, priorities and severities (each with an _id, category and label). Their _ids are required by officernd_create_ticket. OfficeRnD: GET /ticket-options.
Input Schema
{
"type": "object",
"properties": {
"limit": {
"description": "Page size, 1-50 (OfficeRnD's max; default 50).",
"type": "integer",
"minimum": 1,
"maximum": 50
},
"cursor_next": {
"description": "The cursorNext from the previous page. Omit for the first page.",
"type": "string"
},
"cursor_prev": {
"description": "The cursorPrev from a page, to go one page back.",
"type": "string"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴officernd_create_member(name, location, start_date, email, phone, ...)
WRITE. Add a new member (person) to a location, optionally attached to a company. Needs scope flex.community.members.create. OfficeRnD: POST /members.
Input Schema
{
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "The member's full name."
},
"location": {
"type": "string",
"minLength": 1,
"description": "The _id of the member's location (see officernd_list_locations)."
},
"start_date": {
"type": "string",
"minLength": 1,
"description": "Start date (ISO 8601), e.g. 2026-10-01T00:00:00.000Z."
},
"email": {
"description": "The member's email address.",
"type": "string"
},
"phone": {
"description": "Primary phone number.",
"type": "string"
},
"company": {
"description": "The _id of the company the member belongs to.",
"type": "string"
},
"description": {
"description": "Description/bio.",
"type": "string"
},
"is_billing_person": {
"description": "Whether the member receives the company's invoices.",
"type": "boolean"
},
"is_contact_person": {
"description": "Whether the member is a contact person of the company.",
"type": "boolean"
},
"tags": {
"description": "Tags.",
"type": "array",
"items": {
"type": "string"
}
},
"properties": {
"description": "Custom properties, keyed by property name.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"required": [
"name",
"location",
"start_date"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴officernd_update_member(member_id, name, email, phone, start_date, ...)
WRITE. Update a member's name, email, phone, start date, billing/contact flags, tags or custom properties. Only the fields you pass are changed; `tags` replaces the whole tag list. Needs scope flex.community.members.update. OfficeRnD: PUT /members/{memberId}.
Input Schema
{
"type": "object",
"properties": {
"member_id": {
"type": "string",
"minLength": 1,
"description": "The member _id."
},
"name": {
"description": "New name.",
"type": "string"
},
"email": {
"description": "New email.",
"type": "string"
},
"phone": {
"description": "New phone number.",
"type": "string"
},
"start_date": {
"description": "New start date (ISO 8601).",
"type": "string"
},
"is_billing_person": {
"description": "Whether the member receives the company's invoices.",
"type": "boolean"
},
"is_contact_person": {
"description": "Whether the member is a contact person of the company.",
"type": "boolean"
},
"tags": {
"description": "Replaces the member's entire tag list.",
"type": "array",
"items": {
"type": "string"
}
},
"properties": {
"description": "Custom properties to set.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"required": [
"member_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴officernd_create_booking(resource, start, end, member, company, ...)
WRITE. Book a resource (e.g. a meeting room) for a member and/or company. Unless is_free or is_tentative is set, the booking is charged per the resource's rate, and the member is notified unless is_silent. Needs scope flex.space.bookings.create. OfficeRnD: POST /bookings.
Input Schema
{
"type": "object",
"properties": {
"resource": {
"type": "string",
"minLength": 1,
"description": "The _id of the resource to book (see officernd_list_resources)."
},
"start": {
"type": "string",
"minLength": 1,
"description": "Start (ISO 8601 date-time), e.g. 2026-10-01T13:00:00.000Z."
},
"end": {
"type": "string",
"minLength": 1,
"description": "End (ISO 8601 date-time)."
},
"member": {
"description": "The _id of the member the booking is for.",
"type": "string"
},
"company": {
"description": "The _id of the company the booking is for.",
"type": "string"
},
"title": {
"description": "Booking title.",
"type": "string"
},
"description": {
"description": "Longer description.",
"type": "string"
},
"is_tentative": {
"description": "Create as tentative (unconfirmed, not charged).",
"type": "boolean"
},
"is_free": {
"description": "Mark as free — no fees are generated.",
"type": "boolean"
},
"members": {
"description": "_ids of teammates (same company) attending.",
"type": "array",
"items": {
"type": "string"
}
},
"visitors": {
"description": "_ids of external visitors attending.",
"type": "array",
"items": {
"type": "string"
}
},
"is_silent": {
"description": "If true, no notification is sent to the member.",
"type": "boolean"
},
"enforce_booking_policy": {
"description": "If true, apply member validations (business hours, durations, limits) and booking-policy approval flagging.",
"type": "boolean"
}
},
"required": [
"resource",
"start",
"end"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴officernd_create_ticket(member, subject, type, priority, severity, ...)
WRITE. Open a helpdesk ticket on behalf of a member. type, priority and severity are ticket-option _ids from officernd_list_ticket_options. Needs scope flex.collaboration.tickets.create. OfficeRnD: POST /tickets.
Input Schema
{
"type": "object",
"properties": {
"member": {
"type": "string",
"minLength": 1,
"description": "The _id of the member raising the ticket."
},
"subject": {
"type": "string",
"minLength": 1,
"description": "Short summary of the issue."
},
"type": {
"type": "string",
"minLength": 1,
"description": "Ticket-option _id with category 'type'."
},
"priority": {
"type": "string",
"minLength": 1,
"description": "Ticket-option _id with category 'priority'."
},
"severity": {
"type": "string",
"minLength": 1,
"description": "Ticket-option _id with category 'severity'."
},
"message": {
"description": "Full description.",
"type": "string"
},
"attachments": {
"description": "Image attachment URLs.",
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"member",
"subject",
"type",
"priority",
"severity"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴officernd_add_ticket_comment(ticket_id, text, member, is_public)
WRITE. Post a comment on a helpdesk ticket. Public comments are visible to the member; comments attributed to members must be public. Needs scope flex.collaboration.ticketComments.create. OfficeRnD: POST /ticket-comments/{ticketId}.
Input Schema
{
"type": "object",
"properties": {
"ticket_id": {
"type": "string",
"minLength": 1,
"description": "The ticket _id."
},
"text": {
"type": "string",
"minLength": 1,
"description": "The comment text."
},
"member": {
"type": "string",
"minLength": 1,
"description": "The _id of the member the comment is posted as."
},
"is_public": {
"type": "boolean",
"description": "Whether the comment is public (visible to the member)."
}
},
"required": [
"ticket_id",
"text",
"member",
"is_public"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence