{
  "server": "https://missionarylane.org/mcp",
  "transport": "Streamable HTTP (JSON responses)",
  "auth": "Authorization: Bearer ml_live_… (a church API key from Settings → API keys)",
  "tools": [
    {
      "name": "list_missionaries",
      "title": "List missionaries",
      "description": "List the church's published missionaries as the public gallery shows them (restricted missionaries appear only by alias and region). Filter by a search phrase, status or kind. Returns up to `limit` (default 25) and a next_cursor for the next page.",
      "required_scopes": [
        "missionaries:read"
      ],
      "rest": "GET /api/v1/missionaries",
      "annotations": {
        "title": "List missionaries",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "query": {
            "type": "string",
            "maxLength": 100,
            "description": "Words to look for in the name, place, country, region or tagline."
          },
          "status": {
            "type": "string",
            "enum": [
              "on_field",
              "furlough",
              "preparing",
              "retired",
              "former"
            ],
            "description": "Only missionaries with this status."
          },
          "kind": {
            "type": "string",
            "enum": [
              "missionary",
              "ministry"
            ],
            "description": "Only missionaries or only ministries."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100,
            "description": "How many to return (default 25)."
          },
          "cursor": {
            "type": "string",
            "maxLength": 500,
            "description": "next_cursor from the previous call."
          }
        }
      },
      "example": {
        "arguments": {
          "query": "Nigeria",
          "limit": 10
        }
      }
    },
    {
      "name": "get_missionary",
      "title": "Get a missionary",
      "description": "Everything the public gallery shows for one missionary: profile, kiosk, photos, newsletters, public family and dates, and place briefing. Restricted missionaries return only what their gallery kiosk shows.",
      "required_scopes": [
        "missionaries:read"
      ],
      "rest": "GET /api/v1/missionaries/{id}",
      "annotations": {
        "title": "Get a missionary",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "missionary"
        ],
        "properties": {
          "missionary": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100,
            "description": "The missionary's id, or their slug exactly as the gallery shows it (restricted missionaries have an r-… slug)."
          }
        }
      },
      "example": {
        "arguments": {
          "missionary": "okafor-family"
        }
      }
    },
    {
      "name": "update_missionary",
      "title": "Update a missionary",
      "description": "Change some of a missionary's details. Only the fields in `changes` are changed; in `contact` and `field_visibility` only the keys sent change. A restricted missionary can't be made visible again from here. Returns the missionary's id, gallery slug and visibility.",
      "required_scopes": [
        "missionaries:write"
      ],
      "rest": "PATCH /api/v1/missionaries/{id}",
      "annotations": {
        "title": "Update a missionary",
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "missionary",
          "changes"
        ],
        "properties": {
          "missionary": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100,
            "description": "The missionary's id, or their slug exactly as the gallery shows it (restricted missionaries have an r-… slug)."
          },
          "changes": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "slug": {
                "type": "string",
                "minLength": 1,
                "maxLength": 81,
                "pattern": "^[a-z0-9][a-z0-9-]{0,80}$",
                "description": "Web address name, unique in the church (lowercase letters, digits, dashes).",
                "examples": [
                  "okafor-family"
                ]
              },
              "kind": {
                "type": "string",
                "enum": [
                  "missionary",
                  "ministry"
                ],
                "description": "A missionary family or a ministry."
              },
              "display_name": {
                "type": "string",
                "minLength": 1,
                "maxLength": 120,
                "description": "Name shown on the kiosk.",
                "examples": [
                  "The Okafor Family"
                ]
              },
              "first_name": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 80,
                "description": "First name."
              },
              "last_name": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 80,
                "description": "Last name."
              },
              "spouse_name": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 80,
                "description": "Spouse's name."
              },
              "members": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 300,
                "description": "Family members, as one line.",
                "examples": [
                  "David, Grace, Ada and Tobi"
                ]
              },
              "tagline": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 200,
                "description": "One-line description."
              },
              "place_label": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 120,
                "description": "Place shown to visitors.",
                "examples": [
                  "Lagos, Nigeria"
                ]
              },
              "country": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 80,
                "description": "Country."
              },
              "region": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 60,
                "description": "World region (shown even for restricted missionaries).",
                "examples": [
                  "Africa"
                ]
              },
              "lat": {
                "type": [
                  "number",
                  "null"
                ],
                "minimum": -90,
                "maximum": 90,
                "description": "Latitude of a public place (never a home)."
              },
              "lng": {
                "type": [
                  "number",
                  "null"
                ],
                "minimum": -180,
                "maximum": 180,
                "description": "Longitude of a public place (never a home)."
              },
              "timezone": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 64,
                "pattern": "^[A-Za-z_]+(/[A-Za-z0-9_+-]+)*$",
                "description": "IANA time zone.",
                "examples": [
                  "Africa/Lagos"
                ]
              },
              "ministry_focus": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 300,
                "description": "Ministry focus."
              },
              "status": {
                "type": "string",
                "enum": [
                  "on_field",
                  "furlough",
                  "preparing",
                  "retired",
                  "former"
                ],
                "description": "Where they are in their ministry."
              },
              "status_note": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 300,
                "description": "Short status note."
              },
              "mission_board": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 120,
                "description": "Mission board."
              },
              "sending_church": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 120,
                "description": "Sending church."
              },
              "support_address": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 500,
                "description": "Where to send support."
              },
              "contact": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "email": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 200,
                    "description": "Email."
                  },
                  "phone": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 60,
                    "description": "Phone."
                  },
                  "website": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "uri",
                    "maxLength": 500,
                    "pattern": "^https?://",
                    "description": "Website (https)."
                  },
                  "facebook": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "format": "uri",
                    "maxLength": 500,
                    "pattern": "^https?://",
                    "description": "Facebook page (https)."
                  },
                  "address": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "maxLength": 300,
                    "description": "Mailing address."
                  }
                },
                "description": "Contact details. Only the keys you send change; send null to clear one. Each one's public display follows field_visibility."
              },
              "portrait_path": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 500,
                "description": "Portrait image: a path in the church's media storage (<church_id>/…)."
              },
              "logo_path": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 500,
                "description": "Logo image: a path in the church's media storage (<church_id>/…)."
              },
              "bio": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 8000,
                "description": "About them."
              },
              "support_amount": {
                "type": [
                  "number",
                  "null"
                ],
                "minimum": 0,
                "maximum": 1000000,
                "description": "Monthly support in dollars (staff only unless shown)."
              },
              "began_support": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date",
                "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
                "description": "Date support began."
              },
              "ended_support": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date",
                "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
                "description": "Date support ended."
              },
              "last_visit": {
                "type": [
                  "string",
                  "null"
                ],
                "format": "date",
                "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
                "description": "Date of their last visit."
              },
              "visibility": {
                "type": "string",
                "enum": [
                  "draft",
                  "public",
                  "limited",
                  "hidden"
                ],
                "description": "draft (not shown), public, limited (restricted: alias and region only), hidden. A restricted missionary can be made public again only in the admin."
              },
              "field_visibility": {
                "type": "object",
                "additionalProperties": false,
                "properties": {
                  "members": {
                    "type": "boolean"
                  },
                  "tagline": {
                    "type": "boolean"
                  },
                  "place_label": {
                    "type": "boolean"
                  },
                  "map_location": {
                    "type": "boolean"
                  },
                  "ministry_focus": {
                    "type": "boolean"
                  },
                  "status_note": {
                    "type": "boolean"
                  },
                  "mission_board": {
                    "type": "boolean"
                  },
                  "sending_church": {
                    "type": "boolean"
                  },
                  "support_address": {
                    "type": "boolean"
                  },
                  "bio": {
                    "type": "boolean"
                  },
                  "contact_email": {
                    "type": "boolean"
                  },
                  "contact_phone": {
                    "type": "boolean"
                  },
                  "contact_website": {
                    "type": "boolean"
                  },
                  "contact_facebook": {
                    "type": "boolean"
                  },
                  "contact_address": {
                    "type": "boolean"
                  },
                  "photos": {
                    "type": "boolean"
                  },
                  "newsletters": {
                    "type": "boolean"
                  },
                  "newsletter_scans": {
                    "type": "boolean"
                  },
                  "briefing": {
                    "type": "boolean"
                  },
                  "began_support": {
                    "type": "boolean"
                  },
                  "last_visit": {
                    "type": "boolean"
                  },
                  "support_amount": {
                    "type": "boolean"
                  },
                  "admin_notes": {
                    "type": "boolean"
                  }
                },
                "description": "Which details show on the public site (true) or stay staff-only (false). Only the keys you send change."
              },
              "security_alias": {
                "type": [
                  "string",
                  "null"
                ],
                "maxLength": 120,
                "description": "Name shown instead of theirs when restricted.",
                "examples": [
                  "The O Family"
                ]
              },
              "sort_order": {
                "type": "integer",
                "minimum": 0,
                "maximum": 100000,
                "description": "Gallery order (lower first)."
              },
              "payment_day": {
                "type": [
                  "integer",
                  "null"
                ],
                "minimum": 1,
                "maximum": 28,
                "description": "Day of the month the church pays their support (used to propose payments; default the 1st)."
              }
            },
            "minProperties": 1,
            "description": "The fields to change."
          }
        }
      },
      "example": {
        "arguments": {
          "missionary": "okafor-family",
          "changes": {
            "status": "furlough",
            "status_note": "Home in Virginia until March"
          }
        }
      }
    },
    {
      "name": "create_announcement",
      "title": "Post an announcement",
      "description": "Post an announcement to the gallery's news ticker and/or big banner, optionally about one missionary. It shows from starts_on (default today) to ends_on.",
      "required_scopes": [
        "announcements:write"
      ],
      "rest": "POST /api/v1/announcements",
      "annotations": {
        "title": "Post an announcement",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "description": "Headline.",
            "examples": [
              "Welcome home, Okafors!"
            ]
          },
          "message": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 2000,
            "description": "Message."
          },
          "kind": {
            "type": "string",
            "enum": [
              "birth",
              "milestone",
              "birthday",
              "anniversary",
              "furlough",
              "praise",
              "prayer",
              "event",
              "general"
            ],
            "description": "Kind (default general)."
          },
          "missionary": {
            "type": [
              "string",
              "null"
            ],
            "minLength": 1,
            "maxLength": 100,
            "description": "Optional missionary: id, or slug as the gallery shows it."
          },
          "image_path": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 500,
            "description": "Image in the church's media storage (<church_id>/…)."
          },
          "link": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "maxLength": 500,
            "pattern": "^https?://",
            "description": "Link (https)."
          },
          "starts_on": {
            "type": "string",
            "format": "date",
            "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
            "description": "First day shown (default today).",
            "examples": [
              "2026-11-01"
            ]
          },
          "ends_on": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
            "description": "Last day shown (optional)."
          },
          "show_in": {
            "type": "string",
            "enum": [
              "ticker",
              "jumbotron",
              "both"
            ],
            "description": "Where it shows: the ticker, the big banner, or both (default both)."
          },
          "is_published": {
            "type": "boolean",
            "description": "Published (default true)."
          }
        },
        "required": [
          "title"
        ]
      },
      "example": {
        "arguments": {
          "title": "Welcome home, Okafors!",
          "message": "Join us Sunday to welcome them back.",
          "kind": "furlough",
          "missionary": "okafor-family",
          "ends_on": "2026-11-15"
        }
      }
    },
    {
      "name": "add_newsletter",
      "title": "Add a newsletter",
      "description": "Add a newsletter (prayer letter) to a missionary. Give its text and summary yourself, or upload page images / a PDF to the church's media storage first and set ai_read to have the AI read it (uses AI credits). Restricted missionaries' letters show publicly only once read under the restricted rules.",
      "required_scopes": [
        "newsletters:write"
      ],
      "rest": "POST /api/v1/newsletters",
      "annotations": {
        "title": "Add a newsletter",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "missionary": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100,
            "description": "The missionary: id, or slug as the gallery shows it.",
            "examples": [
              "okafor-family"
            ]
          },
          "title": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 200,
            "description": "Title.",
            "examples": [
              "Spring 2026 update"
            ]
          },
          "issue_date": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
            "description": "Issue date.",
            "examples": [
              "2026-10-01"
            ]
          },
          "period_label": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 80,
            "description": "Period, e.g. “March & April”."
          },
          "body_text": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 100000,
            "description": "Full text (never shown publicly for restricted missionaries)."
          },
          "summary": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 4000,
            "description": "Short summary."
          },
          "highlights": {
            "type": "array",
            "maxItems": 30,
            "items": {
              "type": "string",
              "maxLength": 1000
            },
            "description": "Highlights."
          },
          "prayer_requests": {
            "type": "array",
            "maxItems": 30,
            "items": {
              "type": "string",
              "maxLength": 1000
            },
            "description": "Prayer requests."
          },
          "praises": {
            "type": "array",
            "maxItems": 30,
            "items": {
              "type": "string",
              "maxLength": 1000
            },
            "description": "Praises."
          },
          "verse": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 500,
            "description": "Bible verse."
          },
          "page_paths": {
            "type": "array",
            "maxItems": 20,
            "items": {
              "type": "string",
              "maxLength": 500
            },
            "description": "Page images in the church's media storage (<church_id>/…)."
          },
          "pdf_path": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 500,
            "description": "PDF in the church's media storage (<church_id>/…)."
          },
          "published": {
            "type": "boolean",
            "description": "Shown in the gallery (default true)."
          },
          "ai_read": {
            "type": "boolean",
            "description": "Ask the AI to read the pages or PDF and fill in the title, summary, highlights, requests and praises (default false). Uses AI credits or the church's AI key."
          }
        },
        "required": [
          "missionary"
        ]
      },
      "example": {
        "arguments": {
          "missionary": "okafor-family",
          "title": "October 2026",
          "issue_date": "2026-10-01",
          "summary": "A new church plant in Ikeja.",
          "prayer_requests": [
            "Visas for the team"
          ]
        }
      }
    },
    {
      "name": "giving_summary",
      "title": "Giving summary",
      "description": "The church's missions giving overview: totals given, traced to missionaries and waiting in funds, connections and recent months. Restricted missionaries appear only by alias.",
      "required_scopes": [
        "giving:read"
      ],
      "rest": "GET /api/v1/giving/summary",
      "annotations": {
        "title": "Giving summary",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {}
      },
      "example": {
        "arguments": {}
      }
    },
    {
      "name": "giving_traces",
      "title": "Where a month's gifts went",
      "description": "Where the gifts received in one month went: traced to each missionary's payments (oldest money first), estimated for undated totals, or still waiting in a fund.",
      "required_scopes": [
        "giving:read"
      ],
      "rest": "GET /api/v1/giving/traces",
      "annotations": {
        "title": "Where a month's gifts went",
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "month"
        ],
        "properties": {
          "month": {
            "type": "string",
            "pattern": "^\\d{4}-(0[1-9]|1[0-2])$",
            "description": "Month as YYYY-MM.",
            "examples": [
              "2026-10"
            ]
          }
        }
      },
      "example": {
        "arguments": {
          "month": "2026-10"
        }
      }
    },
    {
      "name": "import_gifts",
      "title": "Import gifts",
      "description": "Import up to 1000 gifts from another system. Each gift's external_id makes this safe to repeat: sending the same id again updates that gift. Gifts are traced to missionaries' payments afterwards. Missionary Lane never moves money.",
      "required_scopes": [
        "giving:write"
      ],
      "rest": "POST /api/v1/giving/gifts",
      "annotations": {
        "title": "Import gifts",
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "gifts"
        ],
        "properties": {
          "connection_id": {
            "type": "string",
            "format": "uuid",
            "description": "Import under this giving connection (default: the church's API connection)."
          },
          "gifts": {
            "type": "array",
            "minItems": 1,
            "maxItems": 1000,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "external_id": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 200,
                  "description": "Your system's id for this gift. Re-sending the same id updates it instead of adding it again.",
                  "examples": [
                    "pco-donation-88123"
                  ]
                },
                "amount_cents": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 100000000,
                  "description": "Amount in cents.",
                  "examples": [
                    5000
                  ]
                },
                "received_on": {
                  "type": "string",
                  "format": "date",
                  "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
                  "description": "Date received (for an undated monthly total, any day in that month).",
                  "examples": [
                    "2026-10-05"
                  ]
                },
                "dated": {
                  "type": "boolean",
                  "description": "false for an undated monthly total (spread evenly over that month's payments). Default true."
                },
                "refunded": {
                  "type": "boolean",
                  "description": "The gift was refunded (default false)."
                },
                "fund": {
                  "type": "object",
                  "additionalProperties": false,
                  "properties": {
                    "external_id": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "maxLength": 200,
                      "description": "Your system's fund id."
                    },
                    "id": {
                      "type": "string",
                      "minLength": 36,
                      "maxLength": 36,
                      "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$",
                      "description": "An existing Missionary Lane fund id."
                    },
                    "name": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "maxLength": 200,
                      "description": "Fund name (used when the fund is created)."
                    }
                  },
                  "description": "The fund it was given to: your system's fund id (the fund is created on first use, named `name`), or the id of an existing Missionary Lane fund."
                },
                "giver": {
                  "type": "object",
                  "additionalProperties": false,
                  "properties": {
                    "external_id": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "maxLength": 200,
                      "description": "Your system's person id."
                    },
                    "email": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "maxLength": 200,
                      "description": "Email."
                    },
                    "name": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "maxLength": 200,
                      "description": "Name."
                    }
                  },
                  "description": "Who gave it (matched to givers by external id, then email)."
                }
              },
              "required": [
                "external_id",
                "amount_cents",
                "received_on"
              ]
            }
          }
        }
      },
      "example": {
        "arguments": {
          "gifts": [
            {
              "external_id": "pco-88123",
              "amount_cents": 5000,
              "received_on": "2026-10-05",
              "giver": {
                "email": "jordan@example.org",
                "name": "Jordan Ellis"
              },
              "fund": {
                "external_id": "faith-promise",
                "name": "Faith Promise"
              }
            }
          ]
        }
      }
    },
    {
      "name": "set_monthly_payments",
      "title": "Set a month's payments",
      "description": "Set what the church paid missionaries in one month. Each missionary listed has their payments for that month replaced by the ones sent (amount_cents 0 = no payment); missionaries not listed are left as they are. Every paid_on must fall in the month. Gifts are re-traced afterwards.",
      "required_scopes": [
        "giving:write"
      ],
      "rest": "PUT /api/v1/giving/payments",
      "annotations": {
        "title": "Set a month's payments",
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false
      },
      "inputSchema": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "month",
          "payments"
        ],
        "properties": {
          "month": {
            "type": "string",
            "pattern": "^\\d{4}-(0[1-9]|1[0-2])$",
            "description": "Month as YYYY-MM.",
            "examples": [
              "2026-10"
            ]
          },
          "payments": {
            "type": "array",
            "maxItems": 2000,
            "items": {
              "type": "object",
              "additionalProperties": false,
              "properties": {
                "missionary": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 100,
                  "description": "The missionary: id, or slug as the gallery shows it.",
                  "examples": [
                    "okafor-family"
                  ]
                },
                "amount_cents": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 100000000,
                  "description": "Amount paid in cents. 0 means no payment to them this month.",
                  "examples": [
                    25000
                  ]
                },
                "paid_on": {
                  "type": "string",
                  "format": "date",
                  "pattern": "^\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\\d|3[01])$",
                  "description": "Date paid (inside the month).",
                  "examples": [
                    "2026-10-15"
                  ]
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "proposed",
                    "confirmed"
                  ],
                  "description": "confirmed (default) or proposed."
                },
                "note": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "maxLength": 500,
                  "description": "Note for the treasurer (e.g. your accounting reference)."
                }
              },
              "required": [
                "missionary",
                "amount_cents",
                "paid_on"
              ]
            }
          }
        }
      },
      "example": {
        "arguments": {
          "month": "2026-10",
          "payments": [
            {
              "missionary": "okafor-family",
              "amount_cents": 25000,
              "paid_on": "2026-10-15"
            }
          ]
        }
      }
    }
  ]
}
