Mooi MCP
An official MCP server for the Mooi planning platform that enables AI agents to autonomously coordinate group events. It supports creating events, managing participant availability, conducting polls, making decisions, and updating event details like date, time, and location without requiring human approval at each step.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://mooi.fyi/mcpWhat its tools do
18 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Read-only (3)
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Passed Official MCP Registry namespace is tied to mooi.fyi ·
- Passed Endpoint is on the registry namespace domain ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Create events and register hosts
- Propose dates and coordinate availability
- Conduct polls and record decisions
- Update event status and location
Source and maintenance
Protocol and capabilities
- Server
- Mooi 1.0.0
- MCP protocol negotiated in check
- 2025-11-25
- Tools
- 18 advertised
- Resources
- Not advertised
- Resource templates
- Not advertised
- Prompts
- Not advertised
{
"tools": {
"listChanged": true
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
18 advertised
create_event — Create a gathering
Create an event and register its host. Supply a random UUID requestId and reuse it for uncertain retries, including across HTTP/MCP clients. Give personalUrl only to the host; share the plain url with invitees. Email is required for event updates.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"title",
"timezone",
"name",
"email"
],
"properties": {
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"agent": {
"type": "string",
"default": "",
"maxLength": 80
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"maxLength": 254
},
"title": {
"type": "string",
"maxLength": 500,
"minLength": 1
},
"timezone": {
"type": "string",
"maxLength": 80
},
"requestId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"description": {
"type": "string",
"default": "",
"maxLength": 3000
},
"emailAccess": {
"type": "boolean",
"default": false
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}get_event — Read the plan
Read the event, dates, availability, questions, decisions and activity. Emails are private and never returned.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"eventId"
],
"properties": {
"eventId": {
"type": "string",
"pattern": "^[a-f0-9]{48}$"
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}join_event — Join the gathering
Register yourself or the person you represent, with their email. Set emailAccess to whether your agent can monitor that inbox. Do not register other people without their permission.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"eventId",
"name",
"email",
"requestId"
],
"properties": {
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"agent": {
"type": "string",
"default": "",
"maxLength": 80
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"maxLength": 254
},
"eventId": {
"type": "string",
"pattern": "^[a-f0-9]{48}$"
},
"requestId": {
"type": "string",
"maxLength": 100,
"minLength": 8
},
"emailAccess": {
"type": "boolean",
"default": false
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}update_event — Edit the gathering
Update the title, description, timezone, location or event status. Agents may select and confirm the current proposed plan without per-step human approval; confirmation requires a proposed date. Humans may veto later: set status to planning, coordinate alternatives and select a revised plan.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"eventId",
"participantId",
"requestId"
],
"properties": {
"agent": {
"type": "string",
"default": "",
"maxLength": 80
},
"title": {
"type": "string",
"maxLength": 500,
"minLength": 1
},
"status": {
"enum": [
"planning",
"confirmed",
"cancelled"
],
"type": "string"
},
"eventId": {
"type": "string",
"pattern": "^[a-f0-9]{48}$"
},
"location": {
"type": "string",
"maxLength": 500
},
"timezone": {
"type": "string",
"maxLength": 80
},
"requestId": {
"type": "string",
"maxLength": 100,
"minLength": 8
},
"description": {
"type": "string",
"maxLength": 3000
},
"participantId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"confirmedDateId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}update_participant — Your preferences
Change your display name, agent, email monitoring mode or email notification preference. Reading and cursor acknowledgements do not trigger emails.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"eventId",
"participantId",
"requestId"
],
"properties": {
"name": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"agent": {
"type": "string",
"default": "",
"maxLength": 80
},
"eventId": {
"type": "string",
"pattern": "^[a-f0-9]{48}$"
},
"requestId": {
"type": "string",
"maxLength": 100,
"minLength": 8
},
"emailAccess": {
"type": "boolean"
},
"notifications": {
"type": "boolean"
},
"participantId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}propose_date — Suggest a time
Add a date option with ISO 8601 start and end including UTC offset. The event timezone controls display. Check accessible calendars and propose suitable options autonomously; do not claim unverified availability as certain.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"eventId",
"participantId",
"requestId",
"start",
"end"
],
"properties": {
"end": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"agent": {
"type": "string",
"default": "",
"maxLength": 80
},
"label": {
"type": "string",
"default": "",
"maxLength": 120
},
"start": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"eventId": {
"type": "string",
"pattern": "^[a-f0-9]{48}$"
},
"requestId": {
"type": "string",
"maxLength": 100,
"minLength": 8
},
"participantId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}remove_date — Remove a time
Remove a proposed date. A confirmed date must first be changed or the event reopened.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"eventId",
"participantId",
"requestId",
"dateId"
],
"properties": {
"agent": {
"type": "string",
"default": "",
"maxLength": 80
},
"dateId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"eventId": {
"type": "string",
"pattern": "^[a-f0-9]{48}$"
},
"requestId": {
"type": "string",
"maxLength": 100,
"minLength": 8
},
"participantId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}set_availability — Share availability
Set or change your yes/maybe/no response to one or more proposed dates. Check accessible calendars and respond autonomously without asking for approval for each vote; use maybe for uncertainty. Change responses when the human vetoes or circumstances change. Omitted dates remain unchanged.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"eventId",
"participantId",
"requestId",
"responses"
],
"properties": {
"agent": {
"type": "string",
"default": "",
"maxLength": 80
},
"eventId": {
"type": "string",
"pattern": "^[a-f0-9]{48}$"
},
"requestId": {
"type": "string",
"maxLength": 100,
"minLength": 8
},
"responses": {
"type": "array",
"items": {
"type": "object",
"required": [
"dateId",
"response"
],
"properties": {
"dateId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"response": {
"enum": [
"yes",
"maybe",
"no"
],
"type": "string"
}
}
},
"maxItems": 40,
"minItems": 1
},
"participantId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}ask_question — Ask everyone
Ask a question or create a poll. Use kind city first, then restaurant with parentId pointing to the city question. Empty options allow an open discussion.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"eventId",
"participantId",
"requestId",
"title"
],
"properties": {
"kind": {
"enum": [
"city",
"restaurant",
"general"
],
"type": "string",
"default": "general"
},
"agent": {
"type": "string",
"default": "",
"maxLength": 80
},
"title": {
"type": "string",
"maxLength": 500,
"minLength": 1
},
"eventId": {
"type": "string",
"pattern": "^[a-f0-9]{48}$"
},
"options": {
"type": "array",
"items": {
"type": "string",
"maxLength": 500,
"minLength": 1
},
"default": [],
"maxItems": 20
},
"parentId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"requestId": {
"type": "string",
"maxLength": 100,
"minLength": 8
},
"participantId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}add_poll_option — Suggest an answer
Add an option to an open question, such as a city or restaurant.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"eventId",
"participantId",
"requestId",
"questionId",
"label"
],
"properties": {
"agent": {
"type": "string",
"default": "",
"maxLength": 80
},
"label": {
"type": "string",
"maxLength": 500,
"minLength": 1
},
"eventId": {
"type": "string",
"pattern": "^[a-f0-9]{48}$"
},
"requestId": {
"type": "string",
"maxLength": 100,
"minLength": 8
},
"questionId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"participantId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}vote — Vote on a question
Replace your votes on a question. Choose all acceptable options; an empty array clears your votes. Agents may vote and revise votes autonomously using known preferences and reasonable stated assumptions. Reopen decided questions with decide_question before changing votes. Votes do not decide the question automatically; use decide_question to record the selected plan.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"eventId",
"participantId",
"requestId",
"questionId",
"optionIds"
],
"properties": {
"agent": {
"type": "string",
"default": "",
"maxLength": 80
},
"eventId": {
"type": "string",
"pattern": "^[a-f0-9]{48}$"
},
"optionIds": {
"type": "array",
"items": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"maxItems": 20
},
"requestId": {
"type": "string",
"maxLength": 100,
"minLength": 8
},
"questionId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"participantId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}decide_question — Record a decision
Record the current choice of city, restaurant or other detail, or reopen a question. Agents may decide using the group’s responses and discussion without separate human approval. State unresolved assumptions; do not claim unanimous human approval from vote counts or silence. A human veto requires reopening and finding an alternative.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"eventId",
"participantId",
"requestId",
"questionId"
],
"properties": {
"agent": {
"type": "string",
"default": "",
"maxLength": 80
},
"reopen": {
"type": "boolean",
"default": false
},
"eventId": {
"type": "string",
"pattern": "^[a-f0-9]{48}$"
},
"decision": {
"type": "string",
"maxLength": 500,
"minLength": 1
},
"requestId": {
"type": "string",
"maxLength": 100,
"minLength": 8
},
"questionId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"participantId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}add_comment — Leave a note
Post a message or answer a question. questionId attaches it to that discussion. Returns a direct comment link.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"eventId",
"participantId",
"requestId",
"body"
],
"properties": {
"body": {
"type": "string",
"maxLength": 4000,
"minLength": 1
},
"agent": {
"type": "string",
"default": "",
"maxLength": 80
},
"eventId": {
"type": "string",
"pattern": "^[a-f0-9]{48}$"
},
"requestId": {
"type": "string",
"maxLength": 100,
"minLength": 8
},
"questionId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"participantId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}get_changes — Catch up
Fetch changes strictly after sinceVersion. Save nextVersion only after processing. Read-only: never emails participants. Poll every 300 seconds if you cannot monitor email.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"eventId"
],
"properties": {
"eventId": {
"type": "string",
"pattern": "^[a-f0-9]{48}$"
},
"sinceVersion": {
"type": "integer",
"default": 0,
"maximum": 9007199254740991,
"minimum": 0
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}acknowledge_changes — Mark as seen
Record that you have read changes up to a version. Does not send email or create a new change.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"eventId",
"participantId",
"requestId",
"version"
],
"properties": {
"agent": {
"type": "string",
"default": "",
"maxLength": 80
},
"eventId": {
"type": "string",
"pattern": "^[a-f0-9]{48}$"
},
"version": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"requestId": {
"type": "string",
"maxLength": 100,
"minLength": 8
},
"participantId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}set_channels — Group channels
Set where the group communicates. These are labels for participants’ agents, not credentials or automatic integrations. Agents prepare updates and use their own authorized messaging tools.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"eventId",
"participantId",
"requestId",
"channels"
],
"properties": {
"agent": {
"type": "string",
"default": "",
"maxLength": 80
},
"eventId": {
"type": "string",
"pattern": "^[a-f0-9]{48}$"
},
"channels": {
"type": "array",
"items": {
"type": "object",
"required": [
"type",
"label"
],
"properties": {
"type": {
"enum": [
"whatsapp",
"signal",
"email"
],
"type": "string"
},
"label": {
"type": "string",
"maxLength": 120,
"minLength": 1
}
}
},
"maxItems": 3
},
"requestId": {
"type": "string",
"maxLength": 100,
"minLength": 8
},
"participantId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}get_channel_update — Prepare a group update
Build a linked message for WhatsApp, Signal or email, excluding already-recorded deliveries. Only send when shouldSend is true. This does not send anything. Send with your authorized channel connector and record delivery afterwards.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"eventId",
"channel"
],
"properties": {
"channel": {
"enum": [
"whatsapp",
"signal",
"email"
],
"type": "string"
},
"eventId": {
"type": "string",
"pattern": "^[a-f0-9]{48}$"
},
"sinceVersion": {
"type": "integer",
"default": 0,
"maximum": 9007199254740991,
"minimum": 0
}
},
"additionalProperties": false
}{
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}record_channel_update — Record a shared update
Record a successful external message delivery. Only call after your channel confirms the message was sent. Does not trigger more emails.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"eventId",
"participantId",
"requestId",
"channel",
"version"
],
"properties": {
"agent": {
"type": "string",
"default": "",
"maxLength": 80
},
"channel": {
"enum": [
"whatsapp",
"signal",
"email"
],
"type": "string"
},
"eventId": {
"type": "string",
"pattern": "^[a-f0-9]{48}$"
},
"version": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": 0
},
"requestId": {
"type": "string",
"maxLength": 100,
"minLength": 8
},
"participantId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
}
},
"additionalProperties": false
}{
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}Prompts
Not advertised
Resources
Not advertised
90-day uptime
A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.
- 2026-11-07: 1 of 1 checks answered
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 229 ms
- 95th percentile latency
- 229 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 229 ms · metadata changed · 18 tool(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http mooi-mcp https://mooi.fyi/mcpCodex
codex mcp add mooi-mcp --url https://mooi.fyi/mcpCursor
{
"mcpServers": {
"mooi-mcp": {
"url": "https://mooi.fyi/mcp"
}
}
}Cline
{
"mcpServers": {
"mooi-mcp": {
"type": "streamableHttp",
"url": "https://mooi.fyi/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"mooi-mcp": {
"type": "http",
"url": "https://mooi.fyi/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http mooi-mcp https://mooi.fyi/mcpClaude Desktop
https://mooi.fyi/mcpWindsurf
{
"mcpServers": {
"mooi-mcp": {
"serverUrl": "https://mooi.fyi/mcp"
}
}
}Let your agent find its tools
Find servers like Mooi MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other productivity and knowledge servers
Do you run Mooi MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.