HOA.to MCP by usefulapi
Read units, owners, charges and requests, and record payments and violations in HOA.to.
使うべきか
品質と安全性
ツール定義とプロトコルへの準拠に関する自動分析に基づいています。
コンテキストコスト
これは、サーバーのツールがモデルのコンテキストに読み込まれるたびに消費されるおおよそのトークン数です。数が多いほど、ほかのタスクに使える注意が減ります。
インストール
ワンクリックインストール
これを `claude_desktop_config.json` ファイルに追加してください:
{
"mcpServers": {
"hoa-to": {
"url": "https://hoa-to.usefulapi.io/mcp"
}
}
}リモートエンドポイント
https://hoa-to.usefulapi.io/mcpstreamable-httpできること
ツール一覧
ツール(24)
🟢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.
入力スキーマ
{
"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.
入力スキーマ
{
"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}.
入力スキーマ
{
"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.
入力スキーマ
{
"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}.
入力スキーマ
{
"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.
入力スキーマ
{
"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.
入力スキーマ
{
"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}.
入力スキーマ
{
"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.
入力スキーマ
{
"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}.
入力スキーマ
{
"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.
入力スキーマ
{
"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}.
入力スキーマ
{
"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.
入力スキーマ
{
"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.
入力スキーマ
{
"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.
入力スキーマ
{
"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}.
入力スキーマ
{
"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.
入力スキーマ
{
"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.
入力スキーマ
{
"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.
入力スキーマ
{
"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.
入力スキーマ
{
"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.
入力スキーマ
{
"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}.
入力スキーマ
{
"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.
入力スキーマ
{
"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.
入力スキーマ
{
"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"
}コミュニティ
エビデンス