{"name":"Rhiz Protocol","description":"Rhiz is the coordination layer for a world where relationships, not jobs, determine how work gets done. AI is the cognition layer; Rhiz is the coordination layer.","version":"0.2.0","protocol":"a2a","url":"https://rhiz.network","capabilities":{"mcp":{"endpoint":"https://rhiz.network/api/mcp","transport":"streamable-http","protocol_version":"2025-06-18","tool_discovery":"tools/list","tools":["rhiz_site_get","rhiz_site_update","rhiz_me","rhiz_today","rhiz_portfolio","rhiz_next_moves","rhiz_mission_create","rhiz_mission_read","rhiz_mission_refine","rhiz_mission_list","rhiz_mission_outcome_record","rhiz_people_search","rhiz_role_coach","rhiz_coach_seats","rhiz_coach_seat_request","rhiz_capture_record","rhiz_capture_list","rhiz_capture_get","rhiz_contact_check","rhiz_capture_dismiss","rhiz_approval_list","rhiz_approval_get","rhiz_approval_review","rhiz_approval_decide","rhiz_invitation_create","rhiz_invitation_list","rhiz_invitation_revoke"],"tool_details":[{"name":"rhiz_site_get","title":"Read a Site draft","required_scopes":["site.write:<slug>"],"notes":"Read an owned Site draft, including pages, design and revision. Requires Read or Edit access for this Site granted to the connected client in Connections, or a scoped Site token, plus current ownership. Application source and repositories are separate resources. Never infer a Site slug from an /apps/ URL. This is private working content, not proof of what visitors see. No Context ref is needed: existing Site ownership governs this resource."},{"name":"rhiz_site_update","title":"Save a Site draft","required_scopes":["site.write:<slug>"],"notes":"Replace supplied fields on an owned Site draft. Read with rhiz_site_get first and pass its revision as expectedRevision to prevent overwriting newer work. Requires Edit access for this Site granted to the connected client in Connections, or a Site write token, plus current ownership. Does not publish; review and publish in Studio."},{"name":"rhiz_me","title":"Who am I in Rhiz","required_scopes":["mcp.access"],"notes":"Start here for Context work. Returns who Rhiz recognizes as the signed-in member, which client this connection is, and the Contexts the member can act in. Context tools need a contextRef from this result; Site draft tools use a Site slug and its write grant instead. If this client has not been granted access yet, returns the link where the member grants it. Reads only."},{"name":"rhiz_today","title":"What needs me today","required_scopes":["mcp.access"],"notes":"The member's current operating read in one Context: decisions Rhiz is holding for them, their open goals (Missions), most recently moved first, each with its subgoal links, last movement, blockers and next step, recent evidence they recorded with unfinished next steps, and ranked next moves derived from that state. A member usually carries several goals at once; `goalsTruncated` is true when they hold more open goals than this read returns. Each move names the goal it serves in `servesMission`, or null when Rhiz holds no link from the move to a goal; never assume one goal or choose one for the member. Use for 'what should I focus on', 'what is waiting on me', 'where are things'. Built only from what Rhiz holds; if a section could not be read it is named in `unavailable`, never shown as empty. Reads only."},{"name":"rhiz_portfolio","title":"What needs attention across my work","required_scopes":["mcp.access"],"notes":"Read the member's open Missions, held decisions and next moves across 1–5 Contexts the member explicitly chose from rhiz_me. Keeps each Context separate, with its own source coverage, Mission IDs, evidence and actions. Never selects Contexts or transfers information between them. Use when the member asks what needs attention across clients, ventures or initiatives. Read-only; no work is delegated or performed."},{"name":"rhiz_next_moves","title":"Suggest next moves","required_scopes":["mcp.access"],"notes":"Ranked candidate next moves for one Context across all the member's goals, or for one Mission when missionId is given. Held decisions and due follow-throughs come first; after them, moves from different goals are interleaved so one goal's suggestions do not crowd out another's. Each move names the goal it serves (`servesMission`, null when Rhiz holds no link), says what should happen, why, who owns it, whether Rhiz can do it, whether the member's approval is required, and what evidence is missing. Advisory only: it performs nothing. Reads only."},{"name":"rhiz_mission_create","title":"State a Mission","required_scopes":["mcp.access"],"notes":"Record a Mission the member has stated: something they are trying to make happen, in their own words. It becomes the same Mission the member sees in Rhiz, opened as a Rhiz conversation they can continue there. Use only when the member has said what they want to pursue; do not invent or embellish it. A member can carry several Missions at once and this never replaces, closes or merges another, so call it once per distinct goal the member states. Pass parentMissionId only when the member said this is a part of a Mission they already have. Writes. Does not contact anyone or attach people; use rhiz_people_search and rhiz_capture_record for that. Returns the missionId."},{"name":"rhiz_mission_read","title":"Read a Mission","required_scopes":["mcp.access"],"notes":"Read one Mission's current state: the member's statement, desired Outcome if stated, status, which client relayed it, the decisions Rhiz is holding on it, and next moves. Use when the member refers to a Mission by id or after rhiz_today listed it. Reads only."},{"name":"rhiz_mission_refine","title":"Correct a Mission","required_scopes":["mcp.access"],"notes":"Record the member's correction to a Mission they stated: new wording, or what finished looks like. Use only when the member said it in their own words; never infer an Outcome. Pass the full statement as it should now read (unchanged if they only named the Outcome). desiredOutcome: a string states it, null clears it, omitted leaves it alone. The Mission keeps its id. Refused for a closed, abandoned or parked Mission. Writes inside Rhiz only; contacts no one."},{"name":"rhiz_mission_list","title":"List open Missions","required_scopes":["mcp.access"],"notes":"The member's open Missions in one Context, most recently moved first, whether they were stated in Rhiz or through a client like this one. These are the member's several goals, each with its own state; rhiz_today adds their subgoal links, blockers and next steps. Reads only."},{"name":"rhiz_mission_outcome_record","title":"Propose recording a Mission Outcome","required_scopes":["mcp.access"],"notes":"Ask the member to approve recording a real Outcome against one of their Missions. Use when the member said something actually happened: a paying customer, a reader who joined, a milestone, a live URL. This does NOT record anything: it opens a held decision the member answers with rhiz_approval_decide in their own words. Pass the member's own words as `statement`; never invent one. Rhiz decides from its own records whether the receipt verifies the Outcome; a receipt it cannot match is recorded as the member's assertion and never closes the Mission."},{"name":"rhiz_people_search","title":"Find people in my network","required_scopes":["mcp.access"],"notes":"Find people in the member's own saved network by name, organization, city or tag. Give at least one. For a goal like 'who can help grow a business beyond New Jersey', search by the concrete facts that matter (a city, an industry tag, an organization) and reason over the matches yourself. Each person says which filter matched. Results are records in the member's network, NOT evidence of a relationship's strength or of willingness to help; say so. With a name, also returns the evidence the member recorded about that name in this Context. Never returns contact details. Reads only."},{"name":"rhiz_role_coach","title":"Company Coach role method","required_scopes":["mcp.access"],"notes":"Returns the Company Coach role-clarity method so you can coach the member in this conversation. Use the returned method: ask the four questions one at a time, wait for each answer, and give the result in the stated output shape. Never send the member’s answers to Rhiz; this tool takes none. Follow the guidance and safety instructions exactly. Offer rhiz_capture_record only if the member asks to save the result. Available only in Contexts where the member holds a Company Coach grant; otherwise it says so. Reads only."},{"name":"rhiz_coach_seats","title":"Company Coach seats in this Context","required_scopes":["mcp.access"],"notes":"For an owner or steward of this Context: list its active members and whether each holds a Company Coach seat, with the Membership id rhiz_coach_seat_request needs. Anyone else is told they do not administer the Context. Reads only."},{"name":"rhiz_coach_seat_request","title":"Ask to grant a Company Coach seat","required_scopes":["mcp.access"],"notes":"Ask to grant one member of this Context a Company Coach seat. Only an owner or steward of the Context may ask. This does NOT grant anything: it opens a held decision the admin answers with rhiz_approval_decide in their own words, or in Rhiz Console under Company Coach seats. Name the member by the membershipId rhiz_coach_seats returned."},{"name":"rhiz_capture_record","title":"Record evidence","required_scopes":["mcp.access"],"notes":"Record something the member told you happened or matters: a conversation, a promise, an ask, a need, an opportunity, a fact about someone they know. Stored in their chosen Context as evidence they asserted, marked as relayed by this client, awaiting their review. If it names a person new to their network, Rhiz adds them as an unclaimed person. Use only for things the member actually said; never record your own inferences. Pass `missionId` to attach the Capture to a Mission the member stated, the way the Surface does; the Mission's evidence projection will include it. After you send a message to someone for the member, record it with `direction: \"sent\"` and the `channel`; when they reply, record it with `direction: \"received\"`. Pass `occurredAt` (when it was sent or received) with `direction`, and name the person the same way every time. That is what lets every connected client see what was already sent (see rhiz_contact_check). Writes inside Rhiz only; contacts no one."},{"name":"rhiz_capture_list","title":"Read recorded evidence","required_scopes":["mcp.access"],"notes":"Recent evidence the member recorded in one Context, newest first, optionally only what mentions a person or matches an exact clientCaptureId/sourceSystem retry identity. `contextEmpty` distinguishes 'nothing recorded here at all' from 'nothing matching'. Reads only."},{"name":"rhiz_capture_get","title":"Read one piece of evidence","required_scopes":["mcp.access"],"notes":"Read one recorded piece of evidence by its captureId, inside the Context that holds it. Returns nothing when it is not the member's in that Context. Reads only."},{"name":"rhiz_contact_check","title":"Check before contacting","required_scopes":["mcp.access"],"notes":"Call before contacting a person. Shows what was already sent to and received from them in this Context, across every connected client, and suggests holding when earlier messages are unanswered. The suggestion is advisory: the member decides, and Rhiz never blocks or sends anything itself. Only messages recorded with rhiz_capture_record (direction and channel) are counted; anything else shows as unknown. Reads only."},{"name":"rhiz_capture_dismiss","title":"Dismiss recorded evidence","required_scopes":["mcp.access"],"notes":"Dismiss one piece of recorded evidence as not applicable: wrong, a duplicate, or test data the member never meant to keep in Rhiz. Pass `expectedReviewStatus` as the review state the member last saw (from rhiz_capture_get or rhiz_capture_list); dismissal fails honestly if it moved since. A dismissed Capture drops out of rhiz_today and stops being suggested as a follow-through. It is kept, not deleted; this doorway cannot reopen it, so do not promise the member that it can. Refuses if the evidence already became an Interaction or Signal. Writes inside Rhiz only; contacts no one."},{"name":"rhiz_approval_list","title":"What needs my approval","required_scopes":["mcp.access"],"notes":"List the decisions Rhiz is holding for the member and not yet answered. Use whenever they ask what needs their attention or what is blocked. Each entry says whether it is `decidable` now or `needs-review` because its authorization expired. An empty list is a real answer. Never infer a pending decision from the conversation; this is the only source. Reads only."},{"name":"rhiz_approval_get","title":"Read one decision","required_scopes":["mcp.access"],"notes":"Read one decision by id. While it is held: `proposedArgs`, the exact arguments that run if the member approves; show the member what it would actually do before they decide. Once answered: `state` (executed, declined, rejected, or approved with no result yet), `receiptId` and `outcomeId`. When a rhiz_approval_decide response was lost or its outcome is unknown, call this to learn whether the action ran and find its receipt; never decide again to find out. Reads only."},{"name":"rhiz_approval_review","title":"Re-check a held decision","required_scopes":["mcp.access"],"notes":"Have Rhiz re-run the checks for a decision whose authorization expired, so the member can answer it. Approves nothing and runs nothing. If it answers `changed`, the proposal moved: tell the member what changed and let them decide on the new facts."},{"name":"rhiz_approval_decide","title":"Relay the member's answer","required_scopes":["mcp.access"],"notes":"Relay the member's own answer to one held decision. `approve` runs the held action for real (it may send, publish or change something outside Rhiz) and records a receipt; `reject` closes it and runs nothing. Call ONLY after the member explicitly said which, about this specific decision, in this conversation. Enthusiasm, a past approval of something similar, or your judgment are not an answer; ask. `approve` answers needs-review when the authorization expired."},{"name":"rhiz_invitation_create","title":"Invite someone by verified email","required_scopes":["mcp.access"],"notes":"Create a referral invitation for one person, bound to their email address, and return a one-time link. Use only when the member asked to invite that specific person and gave their email. Rhiz does NOT send anything: give the link to the member to send themselves, and say so. The invitation works only for that email once it is verified on the recipient's Rhiz account, and the link alone accepts nothing. It does not create their account, add them to any Context, or change a parent they already have. The link is shown once and cannot be listed again; if it is lost, revoke and create a new one. Writes inside Rhiz only; contacts no one."},{"name":"rhiz_invitation_list","title":"List my invitations","required_scopes":["mcp.access"],"notes":"List the referral invitations the member issued, newest first, with each one's status (pending, accepted, revoked, expired, conflicted). Never returns links or email addresses. Reads only."},{"name":"rhiz_invitation_revoke","title":"Revoke an invitation","required_scopes":["mcp.access"],"notes":"Revoke one pending referral invitation the member issued, by id from rhiz_invitation_list. A revoked invitation can never be accepted. An invitation that was already accepted, expired or revoked is reported unchanged. Writes inside Rhiz only."}],"auth":"bearer","auth_schemes":["bearer_pat","bearer_oauth_delegated"],"required_scope":"mcp.access","site_tools_scope":"site.write:<slug> (a PAT holding only this reaches rhiz_site_get and rhiz_site_update, nothing else)","scoping":"owner_only_fail_closed","rate_limited":true,"rate_limit_scope":"per_process_principal_tool","oauth":"supported_via_clerk","capability_grant":"https://rhiz.network/console/connections"}},"authentication":{"schemes":["bearer_pat","bearer_oauth_delegated"],"oauth":"supported_via_clerk"}}