Progenda MCP by usefulapi
Read patients, calendars, appointments and open slots; book and move appointments in Progenda.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"progenda": {
"url": "https://progenda.usefulapi.io/mcp"
}
}
}Remote endpoints
https://progenda.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (12)
🟢progenda_list_centers
List the centers (practices) your Progenda user can access. Start here: the center id is needed by the patient tools. Progenda API: GET /api/v2/centers.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢progenda_list_calendars
List the calendars (one agenda per practitioner) your Progenda user can access. The calendar id is needed by the appointment and service tools. Progenda API: GET /api/v2/calendars.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢progenda_list_patients(center_id, page, since)
List the patients of a center, 1000 per page. Contains personal and health-adjacent data: fetch only what the user asks for. Progenda API: GET /api/v2/centers/{center_id}/patients.
Input Schema
{
"type": "object",
"properties": {
"center_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Center id (from progenda_list_centers)."
},
"page": {
"description": "Page number (1000 patients per page).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"since": {
"description": "Unix timestamp in seconds: return only records updated after this time (use the X-Date of your last sync).",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"center_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢progenda_get_patient(center_id, remote_id)
Get one patient by your own remote_id. Progenda API: GET /api/v2/centers/{center_id}/patients/remote_id:{remote_id}.
Input Schema
{
"type": "object",
"properties": {
"center_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Center id (from progenda_list_centers)."
},
"remote_id": {
"type": "string",
"minLength": 1,
"description": "Your own identifier for the record (the remote_id you set when you created it)."
}
},
"required": [
"center_id",
"remote_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢progenda_list_appointments(calendar_id, start, stop, since)
List the appointments of one calendar, optionally between two Unix times (start, stop) or updated since a time. Progenda API: GET /api/v2/calendars/{calendar_id}/appointments.
Input Schema
{
"type": "object",
"properties": {
"calendar_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Calendar id (from progenda_list_calendars)."
},
"start": {
"description": "Only appointments from this Unix time.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"stop": {
"description": "Only appointments until this Unix time.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"since": {
"description": "Unix timestamp in seconds: return only records updated after this time (use the X-Date of your last sync).",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"calendar_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢progenda_get_appointment(calendar_id, remote_id)
Get one appointment by your own remote_id. Progenda API: GET /api/v2/calendars/{calendar_id}/appointments/remote_id:{remote_id}.
Input Schema
{
"type": "object",
"properties": {
"calendar_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Calendar id (from progenda_list_calendars)."
},
"remote_id": {
"type": "string",
"minLength": 1,
"description": "Your own identifier for the record (the remote_id you set when you created it)."
}
},
"required": [
"calendar_id",
"remote_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢progenda_list_services(calendar_id)
List the services (appointment types) of one calendar. The service remote_id is used when you create an appointment. Progenda API: GET /api/v2/calendars/{calendar_id}/services.
Input Schema
{
"type": "object",
"properties": {
"calendar_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Calendar id (from progenda_list_calendars)."
}
},
"required": [
"calendar_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢progenda_get_suggestions(calendar_id, service_id)
Compute suggested free slots in one calendar for one service. Live route: GET /api/v2/calendars/{calendar_id}/suggestions?service_id= (the route named in the docs answers 404).
Input Schema
{
"type": "object",
"properties": {
"calendar_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Calendar id (from progenda_list_calendars)."
},
"service_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Service id (the Progenda id of the service)."
}
},
"required": [
"calendar_id",
"service_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴progenda_create_patient(center_id, remote_id, first_name, last_name, email, ...)
Create a patient in a center under your own remote_id. Creates a new record each time it runs with a new remote_id; use progenda_update_patient to change an existing one. Progenda API: POST /api/v2/centers/{center_id}/patients.
Input Schema
{
"type": "object",
"properties": {
"center_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Center id (from progenda_list_centers)."
},
"remote_id": {
"type": "string",
"minLength": 1,
"description": "Your own identifier for the record (the remote_id you set when you created it)."
},
"first_name": {
"type": "string",
"description": "Patient's first name (may be blank)."
},
"last_name": {
"type": "string",
"description": "Patient's last name (may be blank)."
},
"email": {
"type": "string",
"description": "Patient's e-mail address (may be blank)."
},
"phone_number": {
"type": "string",
"description": "Patient's phone number, preferably mobile (text reminders are sent to it; may be blank)."
},
"birthdate": {
"description": "Birthdate, yyyy-mm-dd.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"address": {
"description": "Postal address.",
"type": "string"
},
"notes": {
"description": "Personal notes about the patient.",
"type": "string"
},
"language_code": {
"description": "Patient language code, e.g. en, fr, nl, es.",
"type": "string"
}
},
"required": [
"center_id",
"remote_id",
"first_name",
"last_name",
"email",
"phone_number"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡progenda_update_patient(center_id, remote_id, first_name, last_name, email, ...)
Update a patient found by your own remote_id. The four contact fields are required by the API: send the current values for the ones you do not change. Progenda API: PUT /api/v2/centers/{center_id}/patients/remote_id:{remote_id}.
Input Schema
{
"type": "object",
"properties": {
"center_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Center id (from progenda_list_centers)."
},
"remote_id": {
"type": "string",
"minLength": 1,
"description": "Your own identifier for the record (the remote_id you set when you created it)."
},
"first_name": {
"type": "string",
"description": "Patient's first name (may be blank)."
},
"last_name": {
"type": "string",
"description": "Patient's last name (may be blank)."
},
"email": {
"type": "string",
"description": "Patient's e-mail address (may be blank)."
},
"phone_number": {
"type": "string",
"description": "Patient's phone number, preferably mobile (text reminders are sent to it; may be blank)."
},
"birthdate": {
"description": "Birthdate, yyyy-mm-dd.",
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"address": {
"description": "Postal address.",
"type": "string"
},
"notes": {
"description": "Personal notes about the patient.",
"type": "string"
},
"language_code": {
"description": "Patient language code, e.g. en, fr, nl, es.",
"type": "string"
}
},
"required": [
"center_id",
"remote_id",
"first_name",
"last_name",
"email",
"phone_number"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴progenda_create_appointment(calendar_id, remote_id, start, stop, patient_remote_id, ...)
Create an appointment in a calendar under your own remote_id, for a patient remote_id and a service remote_id. Each run creates a new appointment. Progenda API: POST /api/v2/calendars/{calendar_id}/appointments.
Input Schema
{
"type": "object",
"properties": {
"calendar_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Calendar id (from progenda_list_calendars)."
},
"remote_id": {
"type": "string",
"minLength": 1,
"description": "Your own identifier for the record (the remote_id you set when you created it)."
},
"start": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Start time, Unix seconds (UTC)."
},
"stop": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "End time, Unix seconds (UTC)."
},
"patient_remote_id": {
"description": "Your identifier of the patient (must exist in Progenda).",
"type": "string"
},
"service_remote_id": {
"description": "Your identifier of the service (appointment type).",
"type": "string"
},
"title": {
"description": "Title, e.g. Meeting or Lunch.",
"type": "string"
},
"notes": {
"description": "Notes about the appointment.",
"type": "string"
},
"color": {
"type": "string",
"pattern": "^#[0-9A-Fa-f]{6}$",
"description": "Colour on the Progenda calendar, as #rrggbb."
},
"status": {
"type": "string",
"enum": [
"booked",
"cancelled",
"noshow"
],
"description": "Appointment status. A cancelled appointment cannot become booked again."
},
"noshow": {
"description": "True if the patient missed the appointment.",
"type": "boolean"
},
"patient_arrived_at": {
"description": "Unix time the patient arrived, or null.",
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Unix timestamp in seconds, UTC."
},
{
"type": "null"
}
]
}
},
"required": [
"calendar_id",
"remote_id",
"start",
"stop"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟡progenda_update_appointment(calendar_id, remote_id, start, stop, patient_remote_id, ...)
Change an appointment found by your remote_id: time, status (booked, cancelled, noshow), arrival or no-show. Send only the fields to change. Progenda API: PUT /api/v2/calendars/{calendar_id}/appointments/remote_id:{remote_id}.
Input Schema
{
"type": "object",
"properties": {
"calendar_id": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991,
"description": "Calendar id (from progenda_list_calendars)."
},
"remote_id": {
"type": "string",
"minLength": 1,
"description": "Your own identifier for the record (the remote_id you set when you created it)."
},
"start": {
"description": "New start time, Unix seconds.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"stop": {
"description": "New end time, Unix seconds.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"patient_remote_id": {
"type": "string"
},
"service_remote_id": {
"type": "string"
},
"title": {
"type": "string"
},
"notes": {
"type": "string"
},
"color": {
"type": "string",
"pattern": "^#[0-9A-Fa-f]{6}$",
"description": "Colour on the Progenda calendar, as #rrggbb."
},
"status": {
"type": "string",
"enum": [
"booked",
"cancelled",
"noshow"
],
"description": "Appointment status. A cancelled appointment cannot become booked again."
},
"noshow": {
"type": "boolean"
},
"patient_arrived_at": {
"anyOf": [
{
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "Unix timestamp in seconds, UTC."
},
{
"type": "null"
}
]
}
},
"required": [
"calendar_id",
"remote_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence