HOA.to MCP by usefulapi

Read units, owners, charges and requests, and record payments and violations in HOA.to.

¿Debería usar esto?

Calidad y seguridad

A
Calidad de la descripción
95%
Integridad del esquema
88%
Calidad de los nombres
80%
Riesgo de envenenamiento
100%
Coincidencia de permisos
100%
Cumplimiento del protocolo
100%

Basado en el análisis automatizado de las definiciones de herramientas y el cumplimiento del protocolo.

Costo de contexto

~4,489Tokens (definiciones de herramientas)
~1.4 KBTamaño de respuesta típico
Impacto significativo en la atención (3.51% del contexto de 128k)

Este es el número aproximado de tokens que se consumen cada vez que las herramientas del servidor se cargan en el contexto de un modelo. Los recuentos más altos reducen la atención disponible para otras tareas.

Instalar

Instalación con un clic

Agrega esto a tu archivo `claude_desktop_config.json`:

{
  "mcpServers": {
    "hoa-to": {
      "url": "https://hoa-to.usefulapi.io/mcp"
    }
  }
}

Puntos de conexión remotos

https://hoa-to.usefulapi.io/mcpstreamable-http

Qué puede hacer

Inventario de herramientas

Herramientas (24)

🟢 Solo lectura🟡 Escritura🔴 Eliminación⚪ Desconocido
🟢hoato_ping

Show the association this key belongs to, whether it is a live or test key, and its scopes. Write tools need write: true. Call this first. Uses GET /ping.

Esquema de entrada

{
  "type": "object",
  "properties": {},
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢hoato_list_units(limit, cursor)

List every unit in the association, ordered by unit number. Uses GET /units.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "limit": {
      "description": "Rows per page, 1 to 500 (default 100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    },
    "cursor": {
      "description": "nextCursor from the previous page. Omit for the first page.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢hoato_get_unit(id)

Fetch one unit by id, with its current owners and residents. Uses GET /units/{id}.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "description": "Record id, as returned by the list tools."
    }
  },
  "required": [
    "id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴hoato_create_unit(unitNumber, address, type, lotNumber, bedrooms, ...)

Add a unit to the association. unitNumber must be unique; a duplicate returns 409. Needs a write key. Uses POST /units.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "unitNumber": {
      "type": "string",
      "minLength": 1,
      "description": "Unique unit number, e.g. \"101\"."
    },
    "address": {
      "description": "Postal address, e.g. {\"line1\":\"101 Pine St\",\"city\":\"Denver\",\"region\":\"CO\",\"postal\":\"80202\"}.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    },
    "type": {
      "type": "string",
      "enum": [
        "single-family",
        "townhome",
        "condo-unit",
        "lot",
        "commercial"
      ]
    },
    "lotNumber": {
      "type": "string"
    },
    "bedrooms": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "sqft": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "votingInterest": {
      "type": "number"
    },
    "assessmentPct": {
      "type": "number"
    },
    "status": {
      "type": "string",
      "enum": [
        "active",
        "inactive"
      ]
    }
  },
  "required": [
    "unitNumber"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴hoato_update_unit(id, unitNumber, address, type, lotNumber, ...)

Change the fields you send on one unit. Omitted fields stay as they are. Needs a write key. Uses PATCH /units/{id}.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "description": "Record id, as returned by the list tools."
    },
    "unitNumber": {
      "type": "string"
    },
    "address": {
      "description": "Postal address, e.g. {\"line1\":\"101 Pine St\",\"city\":\"Denver\",\"region\":\"CO\",\"postal\":\"80202\"}.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    },
    "type": {
      "type": "string"
    },
    "lotNumber": {
      "type": "string"
    },
    "bedrooms": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "sqft": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "votingInterest": {
      "type": "number"
    },
    "assessmentPct": {
      "type": "number"
    },
    "status": {
      "type": "string",
      "enum": [
        "active",
        "inactive"
      ]
    }
  },
  "required": [
    "id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢hoato_list_owners(unit, includeEnded, limit, cursor)

List owners and residents, optionally for one unit. Past owners appear only when includeEnded is true. Uses GET /owners.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "unit": {
      "description": "Only this unit number.",
      "type": "string"
    },
    "includeEnded": {
      "description": "Include past owners (default false).",
      "type": "boolean"
    },
    "limit": {
      "description": "Rows per page, 1 to 500 (default 100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    },
    "cursor": {
      "description": "nextCursor from the previous page. Omit for the first page.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴hoato_add_owner(unit, email, firstName, lastName, phone, ...)

Attach an owner, co-owner, tenant, occupant or property manager to a unit, matched by email. Needs a write key. Uses POST /owners.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "unit": {
      "type": "string",
      "minLength": 1,
      "description": "Unit number, e.g. \"101\"."
    },
    "email": {
      "type": "string",
      "minLength": 3,
      "description": "Email of the person to attach."
    },
    "firstName": {
      "type": "string"
    },
    "lastName": {
      "type": "string"
    },
    "phone": {
      "type": "string"
    },
    "relation": {
      "type": "string",
      "enum": [
        "OWNER",
        "CO_OWNER",
        "TENANT",
        "OCCUPANT",
        "PROPERTY_MANAGER"
      ]
    },
    "primary": {
      "type": "boolean"
    },
    "startDate": {
      "type": "string",
      "description": "ISO date, e.g. 2026-01-31."
    },
    "notes": {
      "type": "string"
    }
  },
  "required": [
    "unit",
    "email"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴hoato_update_owner(id, relation, primary, endDate, endReason, ...)

Change the relation, primary flag or notes of one ownership, or end it with endDate and endReason. Ending an ownership removes it from current owners. Needs a write key. Uses PATCH /owners/{id}.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "description": "Record id, as returned by the list tools."
    },
    "relation": {
      "type": "string",
      "enum": [
        "OWNER",
        "CO_OWNER",
        "TENANT",
        "OCCUPANT",
        "PROPERTY_MANAGER"
      ]
    },
    "primary": {
      "type": "boolean"
    },
    "endDate": {
      "type": "string",
      "description": "ISO date, e.g. 2026-01-31."
    },
    "endReason": {
      "type": "string",
      "enum": [
        "sold",
        "removed",
        "moved_out",
        "correction"
      ]
    },
    "notes": {
      "type": "string"
    }
  },
  "required": [
    "id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢hoato_list_requests(kind, status, unit, open, limit)

List maintenance and architectural review (ARC) requests. Filter by kind, status, unit or open (not finished). This list pages by limit only; it has no cursor. Uses GET /requests.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "kind": {
      "type": "string",
      "enum": [
        "maintenance",
        "arc"
      ]
    },
    "status": {
      "description": "Status, case-insensitive, e.g. NEW or SUBMITTED.",
      "type": "string"
    },
    "unit": {
      "description": "Only this unit number.",
      "type": "string"
    },
    "open": {
      "description": "Only requests that are not finished.",
      "type": "boolean"
    },
    "limit": {
      "description": "Rows per page, 1 to 500 (default 100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢hoato_get_request(id)

Fetch one maintenance or ARC request by id. Uses GET /requests/{id}.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "description": "Record id, as returned by the list tools."
    }
  },
  "required": [
    "id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴hoato_create_request(kind, title, description, unit, unitId, ...)

Open a maintenance request, or an ARC request (which needs unit and description). Defaults: NEW for maintenance, SUBMITTED for ARC. Needs a write key. Uses POST /requests.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "kind": {
      "type": "string",
      "enum": [
        "maintenance",
        "arc"
      ]
    },
    "title": {
      "type": "string",
      "minLength": 1,
      "description": "Short summary."
    },
    "description": {
      "description": "Detail. Required for ARC requests.",
      "type": "string"
    },
    "unit": {
      "description": "Unit number. Required for ARC requests.",
      "type": "string"
    },
    "unitId": {
      "description": "Unit id, as an alternative to unit.",
      "type": "string"
    },
    "category": {
      "description": "Free text, e.g. plumbing, paint, fence.",
      "type": "string"
    },
    "priority": {
      "description": "Maintenance only. Default normal.",
      "type": "string",
      "enum": [
        "low",
        "normal",
        "high",
        "urgent"
      ]
    },
    "status": {
      "type": "string"
    },
    "photos": {
      "description": "Image URLs.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "requestedByEmail": {
      "description": "Owner this is on behalf of. Matched to an existing account; never creates one.",
      "type": "string"
    },
    "scheduledFor": {
      "description": "Maintenance only. Planned visit.",
      "type": "string"
    },
    "dueBy": {
      "type": "string",
      "description": "ISO 8601 timestamp, e.g. 2026-11-12T15:00:00Z."
    },
    "note": {
      "type": "string"
    }
  },
  "required": [
    "kind",
    "title"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴hoato_update_request(id, status, title, description, category, ...)

Change the fields you send on one request, such as status, priority, schedule, cost or decision note. Omitted fields stay as they are. Needs a write key. Uses PATCH /requests/{id}.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "description": "Record id, as returned by the list tools."
    },
    "status": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "description": {
      "type": "string"
    },
    "category": {
      "type": "string"
    },
    "priority": {
      "type": "string",
      "enum": [
        "low",
        "normal",
        "high",
        "urgent"
      ]
    },
    "photos": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "scheduledFor": {
      "type": "string",
      "description": "ISO 8601 timestamp, e.g. 2026-11-12T15:00:00Z."
    },
    "completedAt": {
      "type": "string",
      "description": "ISO 8601 timestamp, e.g. 2026-11-12T15:00:00Z."
    },
    "cost": {
      "type": "number"
    },
    "decisionNote": {
      "description": "Reason for an ARC decision. A person writes it.",
      "type": "string"
    },
    "dueBy": {
      "type": "string",
      "description": "ISO 8601 timestamp, e.g. 2026-11-12T15:00:00Z."
    },
    "note": {
      "type": "string"
    },
    "ownerVisible": {
      "description": "Whether owners can see this request.",
      "type": "boolean"
    }
  },
  "required": [
    "id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢hoato_list_charges(status, unit, limit, cursor)

List assessments and other charges. status "open" covers OPEN and PARTIAL charges. Uses GET /charges.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "status": {
      "description": "\"open\", or an exact status such as PAID, VOID or WRITTEN_OFF.",
      "type": "string"
    },
    "unit": {
      "description": "Only this unit number.",
      "type": "string"
    },
    "limit": {
      "description": "Rows per page, 1 to 500 (default 100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    },
    "cursor": {
      "description": "nextCursor from the previous page. Omit for the first page.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢hoato_list_payments(limit, cursor)

List payments recorded for the association, newest first. Uses GET /payments.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "limit": {
      "description": "Rows per page, 1 to 500 (default 100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    },
    "cursor": {
      "description": "nextCursor from the previous page. Omit for the first page.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴hoato_record_payment(unitNumber, amount, method, reference, receivedAt)

Record a payment that was already collected elsewhere, for example by check or bank transfer. It applies to the unit's open charges, oldest first. It does NOT charge a card or move money. Needs a write key. Uses POST /payments.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "unitNumber": {
      "type": "string",
      "minLength": 1,
      "description": "Unit number, e.g. \"101\"."
    },
    "amount": {
      "type": "number",
      "exclusiveMinimum": 0,
      "description": "Amount received, in the association currency."
    },
    "method": {
      "description": "How it was paid, e.g. \"check\" or \"ach\".",
      "type": "string"
    },
    "reference": {
      "description": "Check number or bank reference.",
      "type": "string"
    },
    "receivedAt": {
      "type": "string",
      "description": "ISO 8601 timestamp, e.g. 2026-11-12T15:00:00Z."
    }
  },
  "required": [
    "unitNumber",
    "amount"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢hoato_get_ledger(unit, from, to, limit)

Get every charge and payment for one unit as a dated ledger with a running balance and the outstanding total. Charges are debits, payments are credits. Uses GET /ledger/{unit}.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "unit": {
      "type": "string",
      "minLength": 1,
      "description": "Unit number, or the unit id, e.g. \"101\"."
    },
    "from": {
      "description": "Only entries on or after this date.",
      "type": "string"
    },
    "to": {
      "description": "Only entries on or before this date.",
      "type": "string"
    },
    "limit": {
      "description": "Rows per page, 1 to 500 (default 100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    }
  },
  "required": [
    "unit"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢hoato_list_violations(status, unit, limit, cursor)

List open and past violations, newest first. Uses GET /violations.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "enum": [
        "OPEN",
        "IN_PROGRESS",
        "CURED",
        "FINED",
        "HEARING",
        "CLOSED",
        "DISMISSED"
      ]
    },
    "unit": {
      "description": "Only this unit number.",
      "type": "string"
    },
    "limit": {
      "description": "Rows per page, 1 to 500 (default 100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    },
    "cursor": {
      "description": "nextCursor from the previous page. Omit for the first page.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴hoato_file_violation(unit, description, photos, observedAt, dueDate)

Record a violation against a unit, with photo URLs. It records the violation only: it sends no notice and sets no fine. A person decides the next step in HOA.to. Needs a write key. Uses POST /violations.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "unit": {
      "type": "string",
      "minLength": 1,
      "description": "Unit number, e.g. \"101\"."
    },
    "description": {
      "type": "string",
      "minLength": 1,
      "description": "What was observed."
    },
    "photos": {
      "description": "Image URLs.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "observedAt": {
      "type": "string",
      "description": "ISO 8601 timestamp, e.g. 2026-11-12T15:00:00Z."
    },
    "dueDate": {
      "description": "Date by which the issue should be cured.",
      "type": "string"
    }
  },
  "required": [
    "unit",
    "description"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢hoato_list_documents(category, limit, cursor)

List published association documents, optionally in one category. Uses GET /documents.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "category": {
      "type": "string",
      "enum": [
        "governing",
        "financial",
        "meeting",
        "insurance",
        "resale"
      ]
    },
    "limit": {
      "description": "Rows per page, 1 to 500 (default 100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    },
    "cursor": {
      "description": "nextCursor from the previous page. Omit for the first page.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴hoato_publish_document(name, url, category, mime, sizeBytes, ...)

Publish a document that is already hosted at a URL, and set who can see it with visibility. Owners with that access can see it at once. Needs a write key. Uses POST /documents.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "minLength": 1
    },
    "url": {
      "type": "string",
      "format": "uri",
      "description": "Public URL of the file."
    },
    "category": {
      "type": "string",
      "enum": [
        "governing",
        "financial",
        "meeting",
        "insurance",
        "resale"
      ]
    },
    "mime": {
      "description": "MIME type, e.g. application/pdf.",
      "type": "string"
    },
    "sizeBytes": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "visibility": {
      "type": "string",
      "enum": [
        "public",
        "members",
        "board",
        "admin"
      ]
    },
    "version": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "name",
    "url"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢hoato_list_meetings(type, upcoming, limit, cursor)

List board, annual, special and committee meetings with their minutes. upcoming true returns future meetings, oldest first. Uses GET /meetings.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "type": {
      "type": "string",
      "enum": [
        "board",
        "annual",
        "special",
        "committee"
      ]
    },
    "upcoming": {
      "type": "boolean"
    },
    "limit": {
      "description": "Rows per page, 1 to 500 (default 100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    },
    "cursor": {
      "description": "nextCursor from the previous page. Omit for the first page.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢hoato_get_meeting(id)

Fetch one meeting by id, with its agenda and minutes. Uses GET /meetings/{id}.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "minLength": 1,
      "description": "Record id, as returned by the list tools."
    }
  },
  "required": [
    "id"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🔴hoato_schedule_meeting(title, startsAt, type, location, virtualUrl, ...)

Schedule a meeting with an agenda and an optional quorum. Needs a write key. Uses POST /meetings.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "title": {
      "type": "string",
      "minLength": 1
    },
    "startsAt": {
      "type": "string",
      "description": "ISO 8601 timestamp, e.g. 2026-11-12T15:00:00Z."
    },
    "type": {
      "type": "string",
      "enum": [
        "board",
        "annual",
        "special",
        "committee"
      ]
    },
    "location": {
      "type": "string"
    },
    "virtualUrl": {
      "type": "string"
    },
    "agenda": {
      "description": "Agenda items, in order.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "quorum": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    }
  },
  "required": [
    "title",
    "startsAt"
  ],
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}
🟢hoato_list_announcements(limit, cursor)

List published announcements to owners, newest first. Uses GET /announcements.

Esquema de entrada

{
  "type": "object",
  "properties": {
    "limit": {
      "description": "Rows per page, 1 to 500 (default 100).",
      "type": "integer",
      "minimum": 1,
      "maximum": 500
    },
    "cursor": {
      "description": "nextCursor from the previous page. Omit for the first page.",
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema"
}

Comunidad

Califica este servidor

Evidencia

Observaciones recientes

verificadoversión no registrada24 herramientas