{"openapi":"3.1.0","info":{"title":"Fathom remote lab voice actions","version":"1.0.0","description":"A small open-mode facade over the allowlisted Fathom MCP tools for a voice assistant."},"servers":[{"url":"https://fathom-lab-door.fly.dev"}],"paths":{"/api/knowledge_lens":{"post":{"operationId":"knowledge_lens","summary":"Ask about an interest in a town","description":"Voice assistant guidance: Ask about an interest in a town. Relay only the explorer results, sources, attribution, and reasons returned by Fathom.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"interest":{"type":"string","description":"The interest to explore."},"town":{"type":"string","description":"The town to explore."},"limit":{"type":"integer","minimum":1,"maximum":50}},"additionalProperties":false,"required":["interest","town"]}}}},"responses":{"200":{"description":"A small JSON result from the same Fathom tool."},"400":{"description":"The tool refused the request."},"404":{"description":"The operation is not available on this allowlisted door."},"429":{"description":"The door rate or daily write cap refused the request."}}}},"/api/genesis_items":{"post":{"operationId":"genesis_items","summary":"The places, courses and makers a past search found (the seeded replay when run is omitted), each with its source","description":"Voice assistant guidance: The places, courses and makers a past search found (the seeded replay when run is omitted), each with its source. Relay each source as given.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"run":{"type":"string","description":"A run id; omit for the latest seeded replay."},"since":{"type":"integer","minimum":0}},"additionalProperties":false}}}},"responses":{"200":{"description":"A small JSON result from the same Fathom tool."},"400":{"description":"The tool refused the request."},"404":{"description":"The operation is not available on this allowlisted door."},"429":{"description":"The door rate or daily write cap refused the request."}}}},"/api/spaces_list_public":{"post":{"operationId":"spaces_list_public","summary":"List public synthetic communities the voice assistant can show the person.","description":"Voice assistant guidance: List public synthetic communities the voice assistant can show the person.","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{},"additionalProperties":false}}}},"responses":{"200":{"description":"A small JSON result from the same Fathom tool."},"400":{"description":"The tool refused the request."},"404":{"description":"The operation is not available on this allowlisted door."},"429":{"description":"The door rate or daily write cap refused the request."}}}},"/api/spaces_get":{"post":{"operationId":"spaces_get","summary":"Show one public synthetic community and its activities","description":"Voice assistant guidance: Show one public synthetic community and its activities. Use its exact id from spaces_list_public.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"spaceId":{"type":"string","description":"The community id."}},"additionalProperties":false,"required":["spaceId"]}}}},"responses":{"200":{"description":"A small JSON result from the same Fathom tool."},"400":{"description":"The tool refused the request."},"404":{"description":"The operation is not available on this allowlisted door."},"429":{"description":"The door rate or daily write cap refused the request."}}}},"/api/affiliations_declare":{"post":{"operationId":"affiliations_declare","summary":"Propose a sourced correction or relationship between a synthetic community and an interest","description":"Voice assistant guidance: Propose a sourced correction or relationship between a synthetic community and an interest. It remains recommended until steward review.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"subject":{"type":"string"},"relation":{"type":"string","enum":["kind-of","part-of","serves","alias-of"]},"object":{"type":"string"},"label":{"type":"string"}},"additionalProperties":false,"required":["subject","relation","object"]}}}},"responses":{"200":{"description":"A small JSON result from the same Fathom tool."},"400":{"description":"The tool refused the request."},"404":{"description":"The operation is not available on this allowlisted door."},"429":{"description":"The door rate or daily write cap refused the request."}}}},"/api/activities_get_choice":{"post":{"operationId":"activities_get_choice","summary":"Read the current time or place choices for an activity so the voice assistant can explain them","description":"Voice assistant guidance: Read the current time or place choices for an activity so the voice assistant can explain them. The person chooses; the AI cannot tick for them.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"spaceId":{"type":"string"},"activityId":{"type":"string"}},"additionalProperties":false,"required":["spaceId","activityId"]}}}},"responses":{"200":{"description":"A small JSON result from the same Fathom tool."},"400":{"description":"The tool refused the request."},"404":{"description":"The operation is not available on this allowlisted door."},"429":{"description":"The door rate or daily write cap refused the request."}}}},"/proposals":{"post":{"operationId":"propose","summary":"Propose a place or community for an interest in a town, pending a steward's review","description":"Writes one pending proposal. A place needs an https source page someone published; a community may leave it out. Nothing is shown as fact before review.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["kind","interest","town","name"],"properties":{"kind":{"type":"string","enum":["place","community"]},"interest":{"type":"string","maxLength":120,"description":"the interest, for example pottery"},"town":{"type":"string","maxLength":120,"description":"the town, for example Oslo"},"name":{"type":"string","maxLength":120,"description":"its name"},"source":{"type":"string","maxLength":120,"description":"an https page about it; required for a place"},"note":{"type":"string","maxLength":120,"description":"optional: why it fits"},"newTown":{"type":"string","enum":["yes"],"description":"yes when the town is not one the lab covers yet and the person really means it"}}}},"application/x-www-form-urlencoded":{"schema":{"type":"object","additionalProperties":false,"required":["kind","interest","town","name"],"properties":{"kind":{"type":"string","enum":["place","community"]},"interest":{"type":"string","maxLength":120,"description":"the interest, for example pottery"},"town":{"type":"string","maxLength":120,"description":"the town, for example Oslo"},"name":{"type":"string","maxLength":120,"description":"its name"},"source":{"type":"string","maxLength":120,"description":"an https page about it; required for a place"},"note":{"type":"string","maxLength":120,"description":"optional: why it fits"},"newTown":{"type":"string","enum":["yes"],"description":"yes when the town is not one the lab covers yet and the person really means it"}}}}}},"responses":{"200":{"description":"JSON { id, status, statusUrl } (or { already } when the same proposal exists); plain text for a form post."},"400":{"description":"A field was refused, with the reason."},"429":{"description":"The door rate or daily write cap refused the request."}}}},"/proposals/{id}/interested":{"post":{"operationId":"proposal_interested","summary":"Say you are interested in a pending or approved proposal","description":"Records one anonymous yes (a count, no name or contact).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"properties":{"via":{"type":"string","description":"the visit tag from the link, if any"}}}},"application/x-www-form-urlencoded":{"schema":{"type":"object","additionalProperties":false,"properties":{"via":{"type":"string","description":"the visit tag from the link, if any"}}}}}},"responses":{"200":{"description":"JSON { id, status, statusUrl } (or { already } when the same proposal exists); plain text for a form post."},"400":{"description":"A field was refused, with the reason."},"404":{"description":"No such proposal."},"429":{"description":"The door rate or daily write cap refused the request."}}}},"/proposals/{id}/undo":{"post":{"operationId":"proposal_undo","summary":"Withdraw your own pending proposal","description":"Removes a pending proposal. The undo code is the one returned when it was proposed (undo in the JSON answer, or the ?undo= of the page a form post lands on).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["undo"],"properties":{"undo":{"type":"string","description":"the undo code"}}}},"application/x-www-form-urlencoded":{"schema":{"type":"object","additionalProperties":false,"required":["undo"],"properties":{"undo":{"type":"string","description":"the undo code"}}}}}},"responses":{"200":{"description":"JSON { id, withdrawn: true }; plain text or HTML otherwise."},"400":{"description":"Only a pending proposal can be withdrawn."},"403":{"description":"The undo code does not match."},"404":{"description":"No such proposal."},"429":{"description":"Too many requests."}}}}}}