Back to search
📊 Intel view 📋 Audit JSON 🔄 Changelog
75
A2A v1.0.0

Coordinalo

coordinalo.com · Coordinalo

Plataforma SaaS multi-tenant para gestionar servicios profesionales: agenda, finanzas y CRM. Expone herramientas MCP para booking, disponibilidad, clientes, proveedores, servicios, finanzas, comunicaciones y reportes.

🛡
Own this agent?
Verify the domain coordinalo.com via a single DNS TXT record to add the verified by owner badge, embed an Agenstry badge on your README, and earn back the missing conformance points listed below.
Verify ownership
🔔 Watch this agent for changes. Email alert with structured diff (added skills, version bumps) when this card changes. Structured JSON via card-changes API. Sign in to subscribe
Trust score
51/100
grade D · 9 criteria
Uptime
100.0%
6 probes
Revenue · 30d
no payment wallet declared
Usage · 7d
1
impressions + calls
Card drift · 7d
changed
1 snapshots tracked
Owner
unverified
claim this listing →
D
Conformance score: 51/100
D-grade: significant issues — auth-gated, partially broken, or stale.
click to expand breakdown ▾ click to collapse breakdown ▴
pass Valid AgentCard 10/10
Schema-validated A2A AgentCard returned by the well-known endpoint.
fail Live JSON-RPC 5/25
Endpoint replies but body isn't a valid JSON-RPC 2.0 A2A response.
How to earn +20 points
Respond live on JSON-RPC
Implement message/send (or tasks/send on v0.x). Return a 200 with a valid JSON-RPC response. Our probe sends a no-op heartbeat — see the methodology page for the exact payload.
Docs →
fail Protocol version 0/10
No protocolVersion in card.
How to earn +10 points
Declare protocolVersion
Add `"protocolVersion": "1.0"` to the AgentCard root. Without it, callers can't negotiate v0.x vs v1.0 compatibility.
Docs →
info JWS signature 0/10
Card is unsigned (most published agents are).
pass Uptime track record 15/15
6/6 probes succeeded (100% uptime).
pass Skill declaration 10/10
Declares 96 skills with structured metadata.
partial Verified Identity 5/10
Provider declared: Coordinalo (https://coordinalo.com). Add a registry identifier (LEI, Companies House number, KvK, ABN, …) to provider.legalEntity for full verified-business credit.
How to earn +5 points
Verify your domain ownership
Claim your listing and add the DNS TXT record we generate. Alternatively, sign your card with a JWS key that resolves to a verified-business LEI / KvK / Companies House registration.
Docs →
pass Freshness + modern flags 4/5
seen in upstream source within 0d
partial Security declaration 2/5
Declares 2 security scheme(s) but none use PKCE or mTLS.
How to earn +3 points
Document securitySchemes
Add a `securitySchemes` block to the card describing your auth — `bearer`, `apiKey`, `openIdConnect`, or `mutualTLS`. Routers refuse to call agents that declare no auth model.
Docs →
⚠ Card drift detected — this agent's agent-card.json changed within the last 7 days. We track these so downstream callers can react.

Activity (audit trail)

last 24h · 0 calls Public aggregate · no PII recorded
0
calls 24h
1
calls 7d
1
routed 7d
Recent events (last 20)
When Event Method Status Latency
2026-05-21T14:55:35 routed 200 ok

Card history

1 snapshot Every change to agent-card.json
Captured Hash
2026-05-18 14:43:28 current 98d9b1818f1f… view →
Uptime
100.0%
6 probes
Response
929ms
last probe
Skills
96
declared
Streaming
SSE-capable

Endpoints

Agent cardhttps://coordinalo.com/.well-known/agent.json
Providerhttps://coordinalo.com
Discovered via
mcp_registry recrawl_hot

Skills · 96 declared · mapped to canonical taxonomy

Create Booking

Create a new session/appointment for a client. providerId is optional — if omitted, the system auto-assigns a provider using the agenda assignment strategy (rou…

canonical Physiotherapy Booking and Triage match 82%
bookingsessionsschedulingretroactive
Get Booking

Get complete details of a session/appointment by its ID, including client, provider, service, financial, and delivery proof information.

canonical Hair Salon Booking match 88%
bookingsessions
List Bookings

List sessions for an organization with filters by provider, client, service, status, and date range. Supports cursor-based pagination.

canonical Hair Salon Booking match 88%
bookingsessionslisting
Cancel Booking

Cancel an existing session. Optionally applies cancellation policy charges. Requires confirm: true.

canonical Hair Salon Booking match 87%
bookingsessionscancellation
Reschedule Booking

Reschedule a session to a new time. Cancels the original and creates a new one. Requires confirm: true.

canonical Hair Salon Booking match 87%
bookingsessionsrescheduling
Update Booking Status

Advance a session through the Servicialo lifecycle: confirm, start, complete, or mark as no-show. NOTE: the "deliver" action is NOT available via MCP (ref PDC-S…

canonical Agent Profiles match 83%
bookingsessionslifecycle
Create Recurring Booking

Create recurring sessions (e.g. weekly therapy). Generates multiple individual sessions linked by a recurrence series ID. Max 52 occurrences.

canonical Recurring Job Scheduling match 85%
bookingsessionsrecurring
Get Available Slots

Query available time slots within a date range. Agenda-aware: without clientId, filters by the org default public agenda — each org decides which services to ex…

canonical Calendar Scheduling match 81%
availabilityschedulingslots
Get Provider Schedule

Get the configured weekly availability schedule for a provider (not free slots, but the base configuration). Use admin_set_availability to modify.

canonical Calendar Scheduling match 83%
availabilityschedulingproviders
List Clients

List clients of an organization with search and pagination. Can filter by provider or outstanding debt.

canonical Lodging and Stays match 85%
clientscrmlisting
Get Client

Get complete details of a client including financial summary and recent sessions.

canonical Document Summarization match 85%
clientscrm
Create Client

Create a new client in the organization. If a Person with the same email exists, it will be linked (not duplicated).

canonical Community Coordination match 83%
clientscrm
Update Client

Update an existing client's personal data. Email cannot be changed via MCP.

canonical CRM Updates match 85%
clientscrm
Create Service

Create a new bookable service in an existing organization. Use this for day-to-day service management (requires X-Org-Api-Key). For initial org setup, prefer ad…

canonical Hair Salon Booking match 82%
servicescatalog
List Services

List services of an organization. Can filter by active status, discoverability, or category.

canonical Parts and Components Lookup match 86%
servicescataloglisting
Update Service

Update an existing service (price, duration, status, etc.). Creates a price history entry if price changes.

canonical HVAC Service and Maintenance match 85%
servicescatalog
Assign Provider to Service

Assign or unassign a provider to/from a service. Controls which providers can deliver which services.

canonical Role Assignment match 87%
servicesproviders
Get Provider

Get complete details of a provider including services, schedule, and session stats.

canonical Lodging and Stays match 87%
providers
Create Provider

Create a new provider in the organization. Links or creates a Person record by email.

canonical Invoicing and Billing match 85%
providers
Update Provider

Update provider data: status, commission, coverage areas, permissions.

canonical Privacy and DPIA match 85%
providers
Get Provider Stats

Get detailed performance metrics for a provider over a date range: sessions, occupancy, no-show rate, revenue.

canonical Performance Monitoring match 86%
providersreporting
List Charges

List charges (cobros) for an organization. Filter by client, status, or date range. Includes summary totals.

canonical Moving and Storage Quotes match 83%
financechargeslisting
Get Charge

Get details of a specific charge (cobro) including all associated payments.

canonical Invoicing and Billing match 85%
financecharges
Create Charge

Create a manual charge (cobro) for a client. Not linked to a sale/venta.

canonical Invoicing and Billing match 84%
financecharges
Register Payment

Register a manual payment against an existing charge (cobro). Updates cobro status automatically. Requires confirm: true.

canonical Invoicing and Billing match 83%
financepayments
Get Client Balance

Get the complete financial balance for a client: total sales, charges, payments, pending debt, and credits.

canonical Invoicing and Billing match 86%
financeclients
List Payments

List payments received with filters. Includes summary by payment type.

canonical Invoicing and Billing match 86%
financepaymentslisting
List Sales

List sales (ventas) for an organization. Filter by client, service, provider, or status.

canonical Real Estate Listings Search match 85%
financesaleslisting
Create Sale

Create a service sale (venta) for a client. Optionally auto-creates a charge (cobro) depending on org configuration. Requires confirm: true.

canonical Proposal and SOW Generation match 85%
financesales
Accounts Receivable Aging

Get accounts receivable aging report: pending charges grouped by age buckets (0-7, 7-30, 30-90, 90+ days). Use to answer "who owes money" or "old debts" questio…

canonical Invoicing and Billing match 86%
financereportingaging
List Charge Confirmations

List pending charge confirmations and their status. Shows cobros in pending_confirmation state that await client verification. Filter by client or confirmation …

canonical ConfirmAction match 83%
financeconfirmationsprovenance
Send Confirmation Digest

Send pending confirmation digest to clients. Groups all pending_confirmation charges by client and sends a single message per client via WhatsApp or email. Crea…

canonical Invoicing and Billing match 82%
financeconfirmationscommunications
Get Communication Preferences

Get the communication preferences for an organization (WhatsApp, email, confirmation, reminder channels and messages).

canonical Calendar Scheduling match 84%
communicationspreferences
Update Communication Preferences

Enable or disable communication channels and features for an organization. Partial update — only provided fields are changed. Creates preferences if none exist.

canonical Hotel Reservations match 81%
communicationspreferences
List Campaigns

List communication campaigns (WhatsApp/email) for the organization. Filter by status.

canonical Calendar Scheduling match 85%
communicationscampaignslisting
Get Campaign

Get details of a specific campaign with optional delivery logs per recipient.

communicationscampaigns
Send Message

Send a single WhatsApp or email message to a specific client. Use templateKey for predefined templates or customMessage for free text. Requires confirm: true.

canonical Slack Messaging match 85%
communicationsmessaging
Render Visual Message

Render a communication template as a visual image (PNG). Available templates: session-confirmation, session-reminder, payment-reminder. Use action "preview" to …

canonical Image-Text-to-Text match 83%
communicationsrenderingvisual
Create Email Campaign

Create a new email campaign with HTML body to send to a segmented audience. Supports variable substitution: {nombre}, {apellido}, {nombre_completo}, {email}, {t…

canonical Ad Campaign Operations match 82%
communicationscampaignsemail
Send Campaign

Execute a draft or scheduled campaign. Sends messages to all matching recipients asynchronously. Campaign must be in draft or scheduled status. Returns immediat…

canonical Email Send and Manage match 86%
communicationscampaigns
Dashboard Report

Executive summary of the organization: today's sessions, monthly metrics, revenue, pending charges, and alerts.

canonical Budgeting and Forecasting match 85%
reportingdashboard
Occupancy Report

Calculate provider occupancy rates for a period. Group by provider, day, or week.

canonical Lodging and Stays match 87%
reportingoccupancy
Revenue Report

Calculate revenue for a period grouped by day, week, month, service, or provider.

canonical Budgeting and Forecasting match 88%
reportingrevenue
No-Shows Report

Report no-show statistics for a period. Group by client, provider, service, or day.

canonical Barbershop Appointments match 86%
reportingno-shows
SC Summary Report

Breakdown of Servicio Coordinado (SC) events by month and resolver path (backfill, cac-native, live, compensalo). Use to validate SC coverage and monitor live S…

canonical Audit Trail Summarization match 82%
reportingscvalidation
Real Debt Report

Real-time report of clients with genuine outstanding debt. Excludes temporal payment mismatches (prepaid clients whose global balance is covered). Shows: client…

canonical Tax Compliance and Filing match 82%
reportingfinancedeudacac
Organization Summary

Compact organization overview (~500 tokens). Returns services, providers, schedules, active features, key counts, and an onboarding_status checklist showing wha…

canonical Document Summarization match 82%
reportingorganizationonboarding
List Agendas

List public agendas for an organization. Returns agendas with their provider, service, and session counts.

canonical Government Open Data match 85%
agendasbooking
Create Agenda

Create a public agenda — a shareable booking page where external clients can self-book appointments. Links to a specific provider and/or service. The agenda get…

canonical Calendar Scheduling match 85%
agendasbooking
Get Agenda

Get complete details of a public agenda by ID. Returns all configuration including booking flow (service_first, provider_first, auto), selection modes, assignme…

canonical Get Article match 83%
agendasbooking
Update Agenda

Update a public agenda’s configuration. Partial update — only provided fields are changed. Supports modifying: title, description, visibility (isPublic/isActive…

canonical UpdateAction match 80%
agendasbookingsettings
Delete Agenda

Delete a public agenda permanently. Cascades to related sessions booked through this agenda, comments, and service configs. Requires confirm: true. Cannot be un…

canonical Calendar Scheduling match 82%
agendasbooking
Update Organization

Update organization profile fields: name, description, logo URL, or vertical. Only provided fields are updated.

canonical CRM Updates match 83%
organizationsettings
List Members

List members of an organization with their roles and status.

canonical Role Assignment match 86%
membersteam
Invite Member

Invite a new member to the organization by email. Sends an invitation email. Requires confirm: true.

canonical Calendar Scheduling match 85%
membersteam
List Disputes

List disputes for an organization. Filter by status or type. Returns disputes with client and provider info.

canonical Parts and Components Lookup match 84%
disputessupport
Get Email Domain

Get the email sending domain configured for an organization and its verification status (PENDING, VERIFIED, FAILED). Returns null if no domain is configured. Us…

canonical Email Send and Manage match 84%
emaildomainconfiguration
Register Email Domain

Register a custom email sending domain for an organization via Resend. Returns DNS records that must be configured in the domain provider before verification. R…

canonical Email Send and Manage match 86%
emaildomainconfiguration
Verify Email Domain

Trigger DNS verification for the configured email domain and return updated status. Call this after the organization has added the required DNS records. Status …

canonical Email Send and Manage match 84%
emaildomainverification
Delete Email Domain

Remove the configured email sending domain from the organization. This deletes it from both Resend and the database. The organization will revert to using the d…

canonical Email Send and Manage match 85%
emaildomainconfiguration
Get Dunning Config

Get the current dunning (payment recovery) configuration for an organization. Returns whether dunning is enabled, grace period, step timings, and blocking setti…

canonical Payroll Processing match 83%
dunningfinanceconfiguration
Configure Dunning

Update dunning (payment recovery) configuration for an organization. All fields except organizationSlug are optional — only provided fields are updated, rest st…

canonical Ci Cd Configuration match 81%
dunningfinanceconfiguration
Get Settings

Get organization settings by chapter or specific keys. Chapters: basics (name, description, vertical, timezone, currency), availability (weekday hours, saturday…

canonical Physiotherapy Booking and Triage match 81%
settingsconfiguration
Update Settings

Update organization settings. Partial update — only provided keys are changed. Pass a settings object with key-value pairs (e.g. {"policies.noShowMaxStrikes": 3…

canonical Dependency Audit and Update match 80%
settingsconfiguration
Get Reminder Configuration

Get the full reminder/notification configuration for an organization. Returns detailed settings for each reminder type: bookingReminder (post-booking follow-up)…

canonical Invoicing and Billing match 82%
remindersnotificationsconfiguration
Update Reminder Configuration

Update reminder/notification configuration for an organization. Partial update — only provided sections are changed. Sections: bookingReminder {enabled, daysAft…

canonical Invoicing and Billing match 80%
remindersnotificationsconfiguration
Create Organization

Create a new organization from scratch. Use this first when onboarding a new client — no org needs to exist yet. Requires X-Bootstrap-Key header (not X-Org-Api-…

canonical Community Coordination match 80%
adminonboardingorganization
List Providers (Admin)

List active providers (professionals) for an organization. Use this to get providerId before calling admin_set_availability. The org owner is auto-provisioned a…

canonical Infrastructure Provisioning match 81%
adminproviders
Create Service (Admin)

Add a bookable service to an organization. Use after admin_create_organization. Auto-discoverable by default. If the org has exactly one active provider, the se…

adminservicesonboarding
Set Availability (Admin)

Replace the weekly availability schedule for a provider (not additive — overwrites all existing blocks). Get providerId from admin_list_providers first. Schedul…

canonical Calendar Scheduling match 83%
adminavailabilityscheduling
Toggle Discoverable (Admin)

Publish or unpublish an organization in the Servicialo global registry. Use as the last step after configuring services and availability. Note: first call after…

canonical UCP Catalog Exposure match 81%
adminregistrydiscovery
Preview Client Closing

Preview the financial snapshot for a client in a period WITHOUT creating the closing. Returns totals for ventas, cobros, pagos, sessions.

cierrefinancepreview
Create Client Closing

Create a client monthly closing (immutable financial snapshot). Requires historialCompleto=true on the client. One closing per client per period.

cierrefinance
List Client Closings

List client closings for an organization. Filter by period and/or client.

canonical Real Estate Listings Search match 84%
cierrefinancelisting
Delete Client Closing

Delete (reopen) a client closing. Only allowed if the organizational period is not frozen. Requires confirm: true.

cierrefinance
Evaluate Org Closing Readiness

Evaluate organizational closing readiness for a period. Returns: active clients, closed count, excluded count, pending count, completion percentage, and whether…

canonical Resume Screening match 83%
cierrefinancereporting
Close Organizational Period

Close the organizational period. Requires ALL active clients with historialCompleto=true to be closed first. Freezes the period.

canonical Agent Profiles match 80%
cierrefinance
Distribute Profits

Distribute profits for a closed period. Freezes the current period and all prior open periods. Requires the period to be organizationally closed first. Requires…

canonical Payroll Processing match 82%
cierrefinance
List Retained Earnings

List retained earnings (utilidades retenidas) for an organization. Returns per-period records with accumulated totals: ingresos, costos, utilidadNeta, distribui…

canonical Accounting and Bookkeeping Intake match 82%
cierrefinancelisting
NPS Summary

Get NPS summary for the organization: score, trend, promoter/passive/detractor counts. Use to answer questions about customer satisfaction.

canonical Document Summarization match 84%
npsreportingsatisfaction
List Payroll Records

List payroll records for an organization. Filter by period, provider, or status.

canonical Payroll Processing match 87%
payrollfinancelisting
Payroll Summary

Get payroll summary for a period: total per provider, total cost, pending approvals.

canonical Accounting and Bookkeeping Intake match 88%
payrollfinancereporting
Public Service List

List publicly bookable services for an organization. Does NOT require an API key. Returns only active, discoverable services with assigned providers. Use this a…

canonical Government Open Data match 83%
publicservicesdiscoverybooking
Public Availability Slots

Query available time slots for public booking. Does NOT require an API key. Returns slots grouped by service from the organization's public agenda. Provider det…

canonical Calendar Scheduling match 83%
publicavailabilityslotsbooking
Public Booking Create

Create a public booking request. Does NOT require an API key, but DOES require: (1) requester identity — fullName plus at least email or phone, (2) submission c…

canonical Hotel Reservations match 81%
publicbookingidentity-validated
Public Booking Confirm

Confirm a pending public booking using the confirmationToken returned by public_booking_create. Advances the booking from pending_confirmation to scheduled. The…

canonical ConfirmAction match 82%
publicbookingconfirmation
Public Booking Get

Get details of a public booking using the bookingToken returned by public_booking_create. Returns status, scheduled time, service, and requester info. Does NOT …

canonical Nail Salon Booking match 82%
publicbookinglifecycle
Public Booking Cancel

Cancel a public booking using the bookingToken. Only works for bookings in pending_confirmation, scheduled, or confirmed status. Optionally include a reason. Do…

canonical Hotel Reservations match 82%
publicbookinglifecyclecancellation
Public Booking Reschedule

Reschedule a public booking using the bookingToken. Cancels the original and creates a new pending_confirmation booking at the new time. Returns new confirmatio…

canonical Hotel Reservations match 81%
publicbookinglifecyclerescheduling
Get Lifecycle History

Get the SCEvent stream for a session — all observed transitions reconstructed from status_history. Returns events[] with discriminated union by event_type (sc.s…

canonical SeekToAction match 80%
servicialolifecyclespec-compliantsc-eventsstream
Get Lifecycle State

Get the current lifecycle state of a session, including available transitions, state history, and SC resolution. Returns current_state, available_transitions, v…

canonical Agent Profiles match 81%
servicialolifecyclespec-compliantsc-resolution
Lifecycle Transition

Execute a state transition on a session. Accepts either to_state (target state name per Servicialo spec: confirmed, in_progress, completed, verified, documented…

canonical Agent Profiles match 82%
servicialolifecyclespec-compliant
Book Session

Book a session (Servicialo spec). Returns confirmation_credential (opaque token, valid 30 min) and booking_id. Use scheduling_confirm with the credential to fin…

canonical Agent Profiles match 83%
servicialoschedulingspec-compliantpublic
Confirm Scheduling

Confirm a booking (Servicialo spec). Dual-mode: (1) with credential — uses the confirmation token from scheduling_book, no API key needed; (2) with booking_id —…

canonical Agent Profiles match 82%
servicialoschedulingspec-compliant
Cancel Session

Cancel a session (Servicialo spec). Applies cancellation policy based on time remaining before scheduled time. Requires confirm: true and X-Org-Api-Key.

canonical ScheduleAction match 83%
servicialoschedulingspec-compliant
Reschedule Session

Reschedule a session to a new time (Servicialo spec). Cancels the original session and creates a new one at the specified datetime. Requires confirm: true and X…

canonical ScheduleAction match 84%
servicialoschedulingspec-compliant

Health · last 6 probes

When HTTP Live JSON-RPC Latency
2026-05-22 12:51:35 200 929ms
2026-05-22 06:38:38 200 881ms
2026-05-21 00:28:49 200 497ms
2026-05-18 23:40:35 200 520ms
2026-05-18 20:59:34 200 802ms
2026-05-18 14:43:28 200 979ms

Who's calling this agent 30d

1 interactions captured (impressions + lookups + A2A calls) · 1 routing decisions picked this agent

By AI host (caller_kind)
curl 1 (100%)
Via which API surface
rest 1
Top search intents that surfaced this agent
hotel · 1

Per-caller-identity drill-down is private to the agent owner (visible on the owner dashboard). Cross-platform context + competitor benchmarks in the Enterprise tier.

Cheaper or better alternatives per-skill

↑ 10 higher quality

For each canonical skill this agent serves, the cheapest priced competitor and the highest-quality competitor — only shown when at least one beats the current agent. Skills where this agent is already best on both axes are hidden.

Similar agents embedding-nearest

hive-mcp-compute-grid
MCP server for the Hive Compute Grid. 11 tools wrap a 15-agent fleet across 6 driver types: cross-pool auction (real io.net/Akash/Render ada
Hive Civilization · q 75%
Agenda Intelligence MD live
Live discovery wrapper for Agenda Intelligence MD, an evidence-discipline MCP layer for strategic-risk agents. The hosted wrapper supports A
Vassiliy Lakhonin · q 100%
Whaber Oracle live
Ground truth operational layer for urban transfers in LatAm. Verified place nodes, carrier ANT compliance, safe pickup points, and operation
Whaber Travel-Ops · q 100%
LastMinuteDeals Booking Agent
Search and book last-minute deals across events, wellness, beauty, and hospitality. Deals available within 72 hours. Supports fully autonomo
q 0%
pAIchart MCP Hub
AI-native service orchestration platform. Discovers MCP services by capability, chains multi-service workflows at runtime, and authenticates
pAIchart · q 75%
FeedOracle
EU Compliance Evidence Infrastructure — Verifiable compliance evidence layer for AI agents operating in European financial markets. 44 MCP s
FeedOracle Technologies · q 80%

Embed your Agenstry badge

Paste any of these into your README, agent card, or marketing page. Each badge auto-updates and links back to this page.

Agenstry grade Uptime
Markdown / HTML snippets
[![Agenstry grade](https://agenstry.com/badge/coordinalo.com.svg)](https://agenstry.com/agents/coordinalo.com)
[![Verified Business](https://agenstry.com/badge/coordinalo.com/identity.svg)](https://agenstry.com/agents/coordinalo.com)
[![Uptime](https://agenstry.com/badge/coordinalo.com/uptime.svg)](https://agenstry.com/agents/coordinalo.com)
[![A2A version](https://agenstry.com/badge/coordinalo.com/protocol.svg)](https://agenstry.com/agents/coordinalo.com)

Audit-grade evidence bundle

JSON snapshot for vendor-review files. Add ?sign=true for a JWS-signed envelope verifiable against our JWKS. See the methodology.

audit.json audit.json (JWS-signed) verification history
Raw agent card JSON
{
  "name": "Coordinalo",
  "description": "Plataforma SaaS multi-tenant para gestionar servicios profesionales: agenda, finanzas y CRM. Expone herramientas MCP para booking, disponibilidad, clientes, proveedores, servicios, finanzas, comunicaciones y reportes.",
  "url": "https://coordinalo.com/api/mcp",
  "version": "1.0.0",
  "instructions": "Coordinalo \u2014 SaaS platform for managing organizations that offer appointment-based professional services (therapy, consulting, education, fitness, legal).\n\n## Quick Start: Set Up a New Organization\nFirst, get a bootstrap key at https://coordinalo.com/developers (free, self-service, issued in minutes).\n1. admin_create_organization (with X-Bootstrap-Key header) \u2192 returns admin API key for all subsequent calls\n2. admin_create_service \u2192 add at least one bookable service (auto-assigns if single provider)\n3. admin_list_providers \u2192 get provider IDs (org owner is auto-provisioned as provider)\n4. admin_set_availability \u2192 set weekly schedule for each provider\n5. admin_toggle_discoverable \u2192 publish org (validates all services have providers)\n\n## Existing Organization\nCall org_summary first \u2014 it returns services, providers, schedules, and an onboarding_status checklist showing what is configured vs missing.\n\n## Public Booking Lane (no API key required)\nExternal agents and booking pages can use the public lane without X-Org-Api-Key:\n- public_service_list(orgSlug) \u2192 list publicly bookable services\n- public_availability_get_slots(orgSlug, serviceId?, date?) \u2192 available time slots\n- public_booking_create(orgSlug, serviceId, startAt, requester, submission, authorization) \u2192 create booking (pending_confirmation)\n- public_booking_confirm(orgSlug, confirmationToken) \u2192 confirm \u2192 scheduled\n- public_booking_get(orgSlug, bookingToken) \u2192 view booking details\n- public_booking_cancel(orgSlug, bookingToken, reason?) \u2192 cancel booking\n- public_booking_reschedule(orgSlug, bookingToken, newStartAt) \u2192 reschedule booking\n\nPublic lane requirements:\n- requester must include fullName + (email or phone) \u2014 no anonymous bookings\n- authorization.humanIntentConfirmed must be true \u2014 a human must authorize the booking\n- submission must declare channel and whether an agent assisted\n- Booking starts as pending_confirmation \u2014 must be confirmed via token within 30 minutes\n- bookingToken (7-day TTL) enables get, cancel, reschedule \u2014 no API key needed\n- Rate-limited per IP + org. All requests audited with semantic decision codes\n- Provider is auto-assigned; internal details are not exposed\n- Also available via HTTP: POST /api/public-booking?action=<action>\n\n## Day-to-Day Operations (API key required)\n- Book (new client): availability_get_slots(orgSlug, date) \u2192 client_create \u2192 booking_create (no providerId needed, auto-assigned)\n- Book (existing client): availability_get_slots(orgSlug, date, clientId) \u2192 booking_create (titular provider auto-resolved)\n- Session lifecycle: booking_update_status (confirm \u2192 start \u2192 complete \u2192 deliver)\n- Finance: finance_create_venta \u2192 finance_create_cobro \u2192 finance_register_payment\n- Monthly closing: cierre_evaluar_org \u2192 cierre_crear_cliente (each) \u2192 cierre_cerrar_org",
  "provider": {
    "organization": "Coordinalo",
    "url": "https://coordinalo.com"
  },
  "capabilities": {
    "streaming": false,
    "pushNotifications": false,
    "stateTransitionHistory": true
  },
  "defaultInputModes": [
    "application/json"
  ],
  "defaultOutputModes": [
    "application/json"
  ],
  "skills": [
    {
      "id": "booking_create",
      "name": "Create Booking",
      "description": "Create a new session/appointment for a client. providerId is optional \u2014 if omitted, the system auto-assigns a provider using the agenda assignment strategy (round_robin, least_booked, etc.). When a client has a titular provider, that provider is preferred automatically. Without providerId and without publicAgendaId, the org default public agenda is used. Preconditions: (1) service must exist and be active, (2) client must exist (use client_create first). Use availability_get_slots to find valid time slots before calling this. Set retroactive: true to register past sessions (skips slot validation, sets status to completed by default). Use autoCharge: true with retroactive to auto-generate the charge. Retroactive sessions are tagged with self_declared provenance. Max 365 days in the past. Past dates are auto-detected as retroactive \u2014 the retroactive flag is optional (system infers it from scheduledAt).",
      "tags": [
        "booking",
        "sessions",
        "scheduling",
        "retroactive"
      ]
    },
    {
      "id": "booking_get",
      "name": "Get Booking",
      "description": "Get complete details of a session/appointment by its ID, including client, provider, service, financial, and delivery proof information.",
      "tags": [
        "booking",
        "sessions"
      ]
    },
    {
      "id": "booking_list",
      "name": "List Bookings",
      "description": "List sessions for an organization with filters by provider, client, service, status, and date range. Supports cursor-based pagination.",
      "tags": [
        "booking",
        "sessions",
        "listing"
      ]
    },
    {
      "id": "booking_cancel",
      "name": "Cancel Booking",
      "description": "Cancel an existing session. Optionally applies cancellation policy charges. Requires confirm: true.",
      "tags": [
        "booking",
        "sessions",
        "cancellation"
      ]
    },
    {
      "id": "booking_reschedule",
      "name": "Reschedule Booking",
      "description": "Reschedule a session to a new time. Cancels the original and creates a new one. Requires confirm: true.",
      "tags": [
        "booking",
        "sessions",
        "rescheduling"
      ]
    },
    {
      "id": "booking_update_status",
      "name": "Update Booking Status",
      "description": "Advance a session through the Servicialo lifecycle: confirm, start, complete, or mark as no-show. NOTE: the \"deliver\" action is NOT available via MCP (ref PDC-SEC-001) \u2014 MCP authentication cannot validate actor-as-Proveedor. Delivery must be performed via the REST endpoint PATCH /api/organizations/[orgSlug]/coordinalo/sessions/[sessionId]/deliver which enforces provider binding.",
      "tags": [
        "booking",
        "sessions",
        "lifecycle"
      ]
    },
    {
      "id": "booking_create_recurring",
      "name": "Create Recurring Booking",
      "description": "Create recurring sessions (e.g. weekly therapy). Generates multiple individual sessions linked by a recurrence series ID. Max 52 occurrences.",
      "tags": [
        "booking",
        "sessions",
        "recurring"
      ]
    },
    {
      "id": "availability_get_slots",
      "name": "Get Available Slots",
      "description": "Query available time slots within a date range. Agenda-aware: without clientId, filters by the org default public agenda \u2014 each org decides which services to expose. With clientId, resolves the client titular provider and returns their full service catalog. Five modes: (1) orgSlug only \u2014 slots from the public agenda grouped by service, provider auto-assigned at booking; (2) orgSlug + clientId \u2014 resolves titular provider if set, falls back to agenda; (3) orgSlug + agendaId \u2014 slots for a specific agenda; (4) serviceId \u2014 slots for all providers assigned to that service; (5) providerId \u2014 slots for a specific provider. Modes 1\u20133 hide provider details. Use before booking_create.",
      "tags": [
        "availability",
        "scheduling",
        "slots"
      ]
    },
    {
      "id": "availability_get_provider_schedule",
      "name": "Get Provider Schedule",
      "description": "Get the configured weekly availability schedule for a provider (not free slots, but the base configuration). Use admin_set_availability to modify.",
      "tags": [
        "availability",
        "scheduling",
        "providers"
      ]
    },
    {
      "id": "client_list",
      "name": "List Clients",
      "description": "List clients of an organization with search and pagination. Can filter by provider or outstanding debt.",
      "tags": [
        "clients",
        "crm",
        "listing"
      ]
    },
    {
      "id": "client_get",
      "name": "Get Client",
      "description": "Get complete details of a client including financial summary and recent sessions.",
      "tags": [
        "clients",
        "crm"
      ]
    },
    {
      "id": "client_create",
      "name": "Create Client",
      "description": "Create a new client in the organization. If a Person with the same email exists, it will be linked (not duplicated).",
      "tags": [
        "clients",
        "crm"
      ]
    },
    {
      "id": "client_update",
      "name": "Update Client",
      "description": "Update an existing client's personal data. Email cannot be changed via MCP.",
      "tags": [
        "clients",
        "crm"
      ]
    },
    {
      "id": "service_create",
      "name": "Create Service",
      "description": "Create a new bookable service in an existing organization. Use this for day-to-day service management (requires X-Org-Api-Key). For initial org setup, prefer admin_create_service instead. After creating, use service_assign_provider to link providers. A service without providers cannot accept bookings.",
      "tags": [
        "services",
        "catalog"
      ]
    },
    {
      "id": "service_list",
      "name": "List Services",
      "description": "List services of an organization. Can filter by active status, discoverability, or category.",
      "tags": [
        "services",
        "catalog",
        "listing"
      ]
    },
    {
      "id": "service_update",
      "name": "Update Service",
      "description": "Update an existing service (price, duration, status, etc.). Creates a price history entry if price changes.",
      "tags": [
        "services",
        "catalog"
      ]
    },
    {
      "id": "service_assign_provider",
      "name": "Assign Provider to Service",
      "description": "Assign or unassign a provider to/from a service. Controls which providers can deliver which services.",
      "tags": [
        "services",
        "providers"
      ]
    },
    {
      "id": "provider_get",
      "name": "Get Provider",
      "description": "Get complete details of a provider including services, schedule, and session stats.",
      "tags": [
        "providers"
      ]
    },
    {
      "id": "provider_create",
      "name": "Create Provider",
      "description": "Create a new provider in the organization. Links or creates a Person record by email.",
      "tags": [
        "providers"
      ]
    },
    {
      "id": "provider_update",
      "name": "Update Provider",
      "description": "Update provider data: status, commission, coverage areas, permissions.",
      "tags": [
        "providers"
      ]
    },
    {
      "id": "provider_get_stats",
      "name": "Get Provider Stats",
      "description": "Get detailed performance metrics for a provider over a date range: sessions, occupancy, no-show rate, revenue.",
      "tags": [
        "providers",
        "reporting"
      ]
    },
    {
      "id": "finance_list_cobros",
      "name": "List Charges",
      "description": "List charges (cobros) for an organization. Filter by client, status, or date range. Includes summary totals.",
      "tags": [
        "finance",
        "charges",
        "listing"
      ]
    },
    {
      "id": "finance_get_cobro",
      "name": "Get Charge",
      "description": "Get details of a specific charge (cobro) including all associated payments.",
      "tags": [
        "finance",
        "charges"
      ]
    },
    {
      "id": "finance_create_cobro",
      "name": "Create Charge",
      "description": "Create a manual charge (cobro) for a client. Not linked to a sale/venta.",
      "tags": [
        "finance",
        "charges"
      ]
    },
    {
      "id": "finance_register_payment",
      "name": "Register Payment",
      "description": "Register a manual payment against an existing charge (cobro). Updates cobro status automatically. Requires confirm: true.",
      "tags": [
        "finance",
        "payments"
      ]
    },
    {
      "id": "finance_client_balance",
      "name": "Get Client Balance",
      "description": "Get the complete financial balance for a client: total sales, charges, payments, pending debt, and credits.",
      "tags": [
        "finance",
        "clients"
      ]
    },
    {
      "id": "finance_list_payments",
      "name": "List Payments",
      "description": "List payments received with filters. Includes summary by payment type.",
      "tags": [
        "finance",
        "payments",
        "listing"
      ]
    },
    {
      "id": "finance_list_ventas",
      "name": "List Sales",
      "description": "List sales (ventas) for an organization. Filter by client, service, provider, or status.",
      "tags": [
        "finance",
        "sales",
        "listing"
      ]
    },
    {
      "id": "finance_create_venta",
      "name": "Create Sale",
      "description": "Create a service sale (venta) for a client. Optionally auto-creates a charge (cobro) depending on org configuration. Requires confirm: true.",
      "tags": [
        "finance",
        "sales"
      ]
    },
    {
      "id": "finance_aging",
      "name": "Accounts Receivable Aging",
      "description": "Get accounts receivable aging report: pending charges grouped by age buckets (0-7, 7-30, 30-90, 90+ days). Use to answer \"who owes money\" or \"old debts\" questions.",
      "tags": [
        "finance",
        "reporting",
        "aging"
      ]
    },
    {
      "id": "finance_list_confirmations",
      "name": "List Charge Confirmations",
      "description": "List pending charge confirmations and their status. Shows cobros in pending_confirmation state that await client verification. Filter by client or confirmation status (pending, confirmed, disputed, auto_confirmed).",
      "tags": [
        "finance",
        "confirmations",
        "provenance"
      ]
    },
    {
      "id": "finance_send_confirmations",
      "name": "Send Confirmation Digest",
      "description": "Send pending confirmation digest to clients. Groups all pending_confirmation charges by client and sends a single message per client via WhatsApp or email. Creates confirmation tokens and sets a grace period for auto-confirmation. Requires confirm: true.",
      "tags": [
        "finance",
        "confirmations",
        "communications"
      ]
    },
    {
      "id": "comms_get_preferences",
      "name": "Get Communication Preferences",
      "description": "Get the communication preferences for an organization (WhatsApp, email, confirmation, reminder channels and messages).",
      "tags": [
        "communications",
        "preferences"
      ]
    },
    {
      "id": "comms_update_preferences",
      "name": "Update Communication Preferences",
      "description": "Enable or disable communication channels and features for an organization. Partial update \u2014 only provided fields are changed. Creates preferences if none exist.",
      "tags": [
        "communications",
        "preferences"
      ]
    },
    {
      "id": "comms_list_campaigns",
      "name": "List Campaigns",
      "description": "List communication campaigns (WhatsApp/email) for the organization. Filter by status.",
      "tags": [
        "communications",
        "campaigns",
        "listing"
      ]
    },
    {
      "id": "comms_get_campaign",
      "name": "Get Campaign",
      "description": "Get details of a specific campaign with optional delivery logs per recipient.",
      "tags": [
        "communications",
        "campaigns"
      ]
    },
    {
      "id": "comms_send_message",
      "name": "Send Message",
      "description": "Send a single WhatsApp or email message to a specific client. Use templateKey for predefined templates or customMessage for free text. Requires confirm: true.",
      "tags": [
        "communications",
        "messaging"
      ]
    },
    {
      "id": "comms_render_message",
      "name": "Render Visual Message",
      "description": "Render a communication template as a visual image (PNG). Available templates: session-confirmation, session-reminder, payment-reminder. Use action \"preview\" to get the image URL, \"send\" to render and send via WhatsApp with the image attached. Each template requires specific data fields (clientName, providerName, date, time, etc.).",
      "tags": [
        "communications",
        "rendering",
        "visual"
      ]
    },
    {
      "id": "comms_create_campaign",
      "name": "Create Email Campaign",
      "description": "Create a new email campaign with HTML body to send to a segmented audience. Supports variable substitution: {nombre}, {apellido}, {nombre_completo}, {email}, {telefono}, {organizacion}. Use audienceType \"predefined\" with audienceId \"active\"/\"inactive\"/\"new\"/\"with_whatsapp\"/\"without_whatsapp\", or \"adhoc\" with custom filters. Returns campaign ID and recipient count. Campaign starts as draft \u2014 use comms_send_campaign to execute. Requires confirm: true.",
      "tags": [
        "communications",
        "campaigns",
        "email"
      ]
    },
    {
      "id": "comms_send_campaign",
      "name": "Send Campaign",
      "description": "Execute a draft or scheduled campaign. Sends messages to all matching recipients asynchronously. Campaign must be in draft or scheduled status. Returns immediately \u2014 use comms_get_campaign to track progress. Requires confirm: true.",
      "tags": [
        "communications",
        "campaigns"
      ]
    },
    {
      "id": "report_dashboard",
      "name": "Dashboard Report",
      "description": "Executive summary of the organization: today's sessions, monthly metrics, revenue, pending charges, and alerts.",
      "tags": [
        "reporting",
        "dashboard"
      ]
    },
    {
      "id": "report_occupancy",
      "name": "Occupancy Report",
      "description": "Calculate provider occupancy rates for a period. Group by provider, day, or week.",
      "tags": [
        "reporting",
        "occupancy"
      ]
    },
    {
      "id": "report_revenue",
      "name": "Revenue Report",
      "description": "Calculate revenue for a period grouped by day, week, month, service, or provider.",
      "tags": [
        "reporting",
        "revenue"
      ]
    },
    {
      "id": "report_no_shows",
      "name": "No-Shows Report",
      "description": "Report no-show statistics for a period. Group by client, provider, service, or day.",
      "tags": [
        "reporting",
        "no-shows"
      ]
    },
    {
      "id": "report_sc_summary",
      "name": "SC Summary Report",
      "description": "Breakdown of Servicio Coordinado (SC) events by month and resolver path (backfill, cac-native, live, compensalo). Use to validate SC coverage and monitor live SC resolution growth. Key metric: sc_live shows SCs resolved in production (not backfill).",
      "tags": [
        "reporting",
        "sc",
        "validation"
      ]
    },
    {
      "id": "report_deuda_real",
      "name": "Real Debt Report",
      "description": "Real-time report of clients with genuine outstanding debt. Excludes temporal payment mismatches (prepaid clients whose global balance is covered). Shows: client name, debt amount, periods with debt, last payment date, and collection status (active/inactive/never_paid). Use to answer \"who actually owes money\" questions.",
      "tags": [
        "reporting",
        "finance",
        "deuda",
        "cac"
      ]
    },
    {
      "id": "org_summary",
      "name": "Organization Summary",
      "description": "Compact organization overview (~500 tokens). Returns services, providers, schedules, active features, key counts, and an onboarding_status checklist showing what is configured vs missing (services, providers, availability, public agenda). Use as first call to orient yourself \u2014 cheaper than report_dashboard. If onboarding_status.ready is false, follow the missing steps before booking.",
      "tags": [
        "reporting",
        "organization",
        "onboarding"
      ]
    },
    {
      "id": "agendas_list",
      "name": "List Agendas",
      "description": "List public agendas for an organization. Returns agendas with their provider, service, and session counts.",
      "tags": [
        "agendas",
        "booking"
      ]
    },
    {
      "id": "agendas_create",
      "name": "Create Agenda",
      "description": "Create a public agenda \u2014 a shareable booking page where external clients can self-book appointments. Links to a specific provider and/or service. The agenda gets a public URL at /{orgSlug}/agenda/{slug}. Create this after services and availability are configured. Without a public agenda, clients can only be booked via the API or dashboard.",
      "tags": [
        "agendas",
        "booking"
      ]
    },
    {
      "id": "agendas_get",
      "name": "Get Agenda",
      "description": "Get complete details of a public agenda by ID. Returns all configuration including booking flow (service_first, provider_first, auto), selection modes, assignment strategy, booking policies (advance booking, same-day, on-demand), cancellation policies, privacy settings, linked provider/service, and session count. Use before agendas_update to inspect current settings.",
      "tags": [
        "agendas",
        "booking"
      ]
    },
    {
      "id": "agendas_update",
      "name": "Update Agenda",
      "description": "Update a public agenda\u2019s configuration. Partial update \u2014 only provided fields are changed. Supports modifying: title, description, visibility (isPublic/isActive), booking flow order (service_first/provider_first/auto), selection modes for service and provider (required/optional/auto/hidden), assignment strategy (manual/round_robin/least_booked/most_available/priority/random), booking policies (min/max advance, same-day, on-demand), cancellation policies (type, deadline, penalty), privacy flags (showSessions, showClientNames, showProviderUtilization, showProviderList), prepayment, and provider/service linking. When a provider is assigned, their services are auto-linked to the agenda.",
      "tags": [
        "agendas",
        "booking",
        "settings"
      ]
    },
    {
      "id": "agendas_delete",
      "name": "Delete Agenda",
      "description": "Delete a public agenda permanently. Cascades to related sessions booked through this agenda, comments, and service configs. Requires confirm: true. Cannot be undone.",
      "tags": [
        "agendas",
        "booking"
      ]
    },
    {
      "id": "org_update",
      "name": "Update Organization",
      "description": "Update organization profile fields: name, description, logo URL, or vertical. Only provided fields are updated.",
      "tags": [
        "organization",
        "settings"
      ]
    },
    {
      "id": "members_list",
      "name": "List Members",
      "description": "List members of an organization with their roles and status.",
      "tags": [
        "members",
        "team"
      ]
    },
    {
      "id": "members_invite",
      "name": "Invite Member",
      "description": "Invite a new member to the organization by email. Sends an invitation email. Requires confirm: true.",
      "tags": [
        "members",
        "team"
      ]
    },
    {
      "id": "disputes_list",
      "name": "List Disputes",
      "description": "List disputes for an organization. Filter by status or type. Returns disputes with client and provider info.",
      "tags": [
        "disputes",
        "support"
      ]
    },
    {
      "id": "email_domain_get",
      "name": "Get Email Domain",
      "description": "Get the email sending domain configured for an organization and its verification status (PENDING, VERIFIED, FAILED). Returns null if no domain is configured. Use email_domain_register to set one up.",
      "tags": [
        "email",
        "domain",
        "configuration"
      ]
    },
    {
      "id": "email_domain_register",
      "name": "Register Email Domain",
      "description": "Register a custom email sending domain for an organization via Resend. Returns DNS records that must be configured in the domain provider before verification. Replaces any previously configured domain. After adding DNS records, call email_domain_verify to check status.",
      "tags": [
        "email",
        "domain",
        "configuration"
      ]
    },
    {
      "id": "email_domain_verify",
      "name": "Verify Email Domain",
      "description": "Trigger DNS verification for the configured email domain and return updated status. Call this after the organization has added the required DNS records. Status will be VERIFIED (ready to send), PENDING (DNS not yet propagated), or FAILED.",
      "tags": [
        "email",
        "domain",
        "verification"
      ]
    },
    {
      "id": "email_domain_delete",
      "name": "Delete Email Domain",
      "description": "Remove the configured email sending domain from the organization. This deletes it from both Resend and the database. The organization will revert to using the default Coordinalo sending address. Requires confirm: true.",
      "tags": [
        "email",
        "domain",
        "configuration"
      ]
    },
    {
      "id": "dunning_get_config",
      "name": "Get Dunning Config",
      "description": "Get the current dunning (payment recovery) configuration for an organization. Returns whether dunning is enabled, grace period, step timings, and blocking settings.",
      "tags": [
        "dunning",
        "finance",
        "configuration"
      ]
    },
    {
      "id": "dunning_configure",
      "name": "Configure Dunning",
      "description": "Update dunning (payment recovery) configuration for an organization. All fields except organizationSlug are optional \u2014 only provided fields are updated, rest stays unchanged.",
      "tags": [
        "dunning",
        "finance",
        "configuration"
      ]
    },
    {
      "id": "settings_get",
      "name": "Get Settings",
      "description": "Get organization settings by chapter or specific keys. Chapters: basics (name, description, vertical, timezone, currency), availability (weekday hours, saturday, assisted assignment), communication (channels, phone required), finances (provider payment type, client payment timing, max balance), policies (no-show strikes, blocking duration, no-show charge, auto-apply), reminders (session 24h, booking, payment, confirmation timeout), client_data (required fields: lastName, rut, email, phone, direccion). Use chapter param for a group, or keys param for specific settings (comma-separated, e.g. \"policies.noShowMaxStrikes,finances.clientPaymentTiming\").",
      "tags": [
        "settings",
        "configuration"
      ]
    },
    {
      "id": "settings_update",
      "name": "Update Settings",
      "description": "Update organization settings. Partial update \u2014 only provided keys are changed. Pass a settings object with key-value pairs (e.g. {\"policies.noShowMaxStrikes\": 3, \"finances.clientPaymentTiming\": \"BEFORE\"}). All values are validated before writing \u2014 if any key fails validation, no changes are applied. Returns the full updated settings for the affected chapters. See settings_get for available keys and valid values.",
      "tags": [
        "settings",
        "configuration"
      ]
    },
    {
      "id": "reminders_get_config",
      "name": "Get Reminder Configuration",
      "description": "Get the full reminder/notification configuration for an organization. Returns detailed settings for each reminder type: bookingReminder (post-booking follow-up), sessionReminder24h (24h before), sessionReminder1h (1h before), paymentReminder (payment due), paymentOverdue (overdue payment), notificationFollowup (post-session NPS/follow-up), pendingConfirmation (auto-cancel unconfirmed). Each has enabled, timing, and frequency settings. More granular than settings_get reminders chapter.",
      "tags": [
        "reminders",
        "notifications",
        "configuration"
      ]
    },
    {
      "id": "reminders_update_config",
      "name": "Update Reminder Configuration",
      "description": "Update reminder/notification configuration for an organization. Partial update \u2014 only provided sections are changed. Sections: bookingReminder {enabled, daysAfter, maxReminders, interval}, sessionReminder24h {enabled, hoursBefore, sendTime}, sessionReminder1h {enabled, hoursBefore}, paymentReminder {enabled, daysAfter, maxReminders, interval}, paymentOverdue {enabled, daysOverdue, maxReminders, interval}, notificationFollowup {enabled, daysAfter, maxFollowups, interval}, pendingConfirmation {enabled, timeoutHours, autoConfirm}. Returns the full configuration after update.",
      "tags": [
        "reminders",
        "notifications",
        "configuration"
      ]
    },
    {
      "id": "admin_create_organization",
      "name": "Create Organization",
      "description": "Create a new organization from scratch. Use this first when onboarding a new client \u2014 no org needs to exist yet. Requires X-Bootstrap-Key header (not X-Org-Api-Key, because the org does not exist yet). Returns a one-time admin API key (sk_admin_...) for subsequent admin_create_service, admin_set_availability, and admin_toggle_discoverable calls. To get a bootstrap key, visit https://coordinalo.com/developers \u2014 free, self-service, issued in minutes. IMPORTANT: Always pass an idempotencyKey (e.g. a UUID) to safely handle retries \u2014 if a previous call with the same key and slug succeeded, the existing org is returned without creating a duplicate. Errors with isRetryable: false should NOT be retried with the same parameters.",
      "tags": [
        "admin",
        "onboarding",
        "organization"
      ]
    },
    {
      "id": "admin_list_providers",
      "name": "List Providers (Admin)",
      "description": "List active providers (professionals) for an organization. Use this to get providerId before calling admin_set_availability. The org owner is auto-provisioned as a provider. Requires X-Org-Api-Key header.",
      "tags": [
        "admin",
        "providers"
      ]
    },
    {
      "id": "admin_create_service",
      "name": "Create Service (Admin)",
      "description": "Add a bookable service to an organization. Use after admin_create_organization. Auto-discoverable by default. If the org has exactly one active provider, the service is auto-assigned to them. With multiple providers, use service_assign_provider to assign manually \u2014 unassigned services block admin_toggle_discoverable. Next step: admin_set_availability to configure the provider schedule. Requires X-Org-Api-Key header.",
      "tags": [
        "admin",
        "services",
        "onboarding"
      ]
    },
    {
      "id": "admin_set_availability",
      "name": "Set Availability (Admin)",
      "description": "Replace the weekly availability schedule for a provider (not additive \u2014 overwrites all existing blocks). Get providerId from admin_list_providers first. Schedule uses day names and HH:MM times. Requires X-Org-Api-Key header.",
      "tags": [
        "admin",
        "availability",
        "scheduling"
      ]
    },
    {
      "id": "admin_toggle_discoverable",
      "name": "Toggle Discoverable (Admin)",
      "description": "Publish or unpublish an organization in the Servicialo global registry. Use as the last step after configuring services and availability. Note: first call after admin_create_organization may return registry_updated: false \u2014 call again to confirm. Requires X-Org-Api-Key header.",
      "tags": [
        "admin",
        "registry",
        "discovery"
      ]
    },
    {
      "id": "cierre_preview_cliente",
      "name": "Preview Client Closing",
      "description": "Preview the financial snapshot for a client in a period WITHOUT creating the closing. Returns totals for ventas, cobros, pagos, sessions.",
      "tags": [
        "cierre",
        "finance",
        "preview"
      ]
    },
    {
      "id": "cierre_crear_cliente",
      "name": "Create Client Closing",
      "description": "Create a client monthly closing (immutable financial snapshot). Requires historialCompleto=true on the client. One closing per client per period.",
      "tags": [
        "cierre",
        "finance"
      ]
    },
    {
      "id": "cierre_listar_clientes",
      "name": "List Client Closings",
      "description": "List client closings for an organization. Filter by period and/or client.",
      "tags": [
        "cierre",
        "finance",
        "listing"
      ]
    },
    {
      "id": "cierre_eliminar_cliente",
      "name": "Delete Client Closing",
      "description": "Delete (reopen) a client closing. Only allowed if the organizational period is not frozen. Requires confirm: true.",
      "tags": [
        "cierre",
        "finance"
      ]
    },
    {
      "id": "cierre_evaluar_org",
      "name": "Evaluate Org Closing Readiness",
      "description": "Evaluate organizational closing readiness for a period. Returns: active clients, closed count, excluded count, pending count, completion percentage, and whether closing is possible.",
      "tags": [
        "cierre",
        "finance",
        "reporting"
      ]
    },
    {
      "id": "cierre_cerrar_org",
      "name": "Close Organizational Period",
      "description": "Close the organizational period. Requires ALL active clients with historialCompleto=true to be closed first. Freezes the period.",
      "tags": [
        "cierre",
        "finance"
      ]
    },
    {
      "id": "cierre_distribuir_utilidades",
      "name": "Distribute Profits",
      "description": "Distribute profits for a closed period. Freezes the current period and all prior open periods. Requires the period to be organizationally closed first. Requires confirm: true.",
      "tags": [
        "cierre",
        "finance"
      ]
    },
    {
      "id": "cierre_listar_utilidades",
      "name": "List Retained Earnings",
      "description": "List retained earnings (utilidades retenidas) for an organization. Returns per-period records with accumulated totals: ingresos, costos, utilidadNeta, distribuido, retenido.",
      "tags": [
        "cierre",
        "finance",
        "listing"
      ]
    },
    {
      "id": "nps_get_summary",
      "name": "NPS Summary",
      "description": "Get NPS summary for the organization: score, trend, promoter/passive/detractor counts. Use to answer questions about customer satisfaction.",
      "tags": [
        "nps",
        "reporting",
        "satisfaction"
      ]
    },
    {
      "id": "payroll_list_records",
      "name": "List Payroll Records",
      "description": "List payroll records for an organization. Filter by period, provider, or status.",
      "tags": [
        "payroll",
        "finance",
        "listing"
      ]
    },
    {
      "id": "payroll_get_summary",
      "name": "Payroll Summary",
      "description": "Get payroll summary for a period: total per provider, total cost, pending approvals.",
      "tags": [
        "payroll",
        "finance",
        "reporting"
      ]
    },
    {
      "id": "public_service_list",
      "name": "Public Service List",
      "description": "List publicly bookable services for an organization. Does NOT require an API key. Returns only active, discoverable services with assigned providers. Use this as the first step in the public booking flow to show available services to end users or agents.",
      "tags": [
        "public",
        "services",
        "discovery",
        "booking"
      ]
    },
    {
      "id": "public_availability_get_slots",
      "name": "Public Availability Slots",
      "description": "Query available time slots for public booking. Does NOT require an API key. Returns slots grouped by service from the organization's public agenda. Provider details are hidden \u2014 the system auto-assigns at booking time. Use after public_service_list to find bookable times.",
      "tags": [
        "public",
        "availability",
        "slots",
        "booking"
      ]
    },
    {
      "id": "public_booking_create",
      "name": "Public Booking Create",
      "description": "Create a public booking request. Does NOT require an API key, but DOES require: (1) requester identity \u2014 fullName plus at least email or phone, (2) submission context \u2014 channel and whether an agent assisted, (3) authorization.humanIntentConfirmed must be true. The booking is created as pending_confirmation \u2014 use public_booking_confirm with the returned confirmationToken to confirm. A bookingToken is also returned for future lifecycle management (cancel, reschedule). Rate-limited per IP+org. All requests are audited with semantic decision codes. Use public_service_list \u2192 public_availability_get_slots \u2192 public_booking_create \u2192 public_booking_confirm as the complete public booking flow.",
      "tags": [
        "public",
        "booking",
        "identity-validated"
      ]
    },
    {
      "id": "public_booking_confirm",
      "name": "Public Booking Confirm",
      "description": "Confirm a pending public booking using the confirmationToken returned by public_booking_create. Advances the booking from pending_confirmation to scheduled. The token expires after 30 minutes. Does NOT require an API key. Rate-limited.",
      "tags": [
        "public",
        "booking",
        "confirmation"
      ]
    },
    {
      "id": "public_booking_get",
      "name": "Public Booking Get",
      "description": "Get details of a public booking using the bookingToken returned by public_booking_create. Returns status, scheduled time, service, and requester info. Does NOT require an API key \u2014 the booking token is the credential. Only returns public-safe data.",
      "tags": [
        "public",
        "booking",
        "lifecycle"
      ]
    },
    {
      "id": "public_booking_cancel",
      "name": "Public Booking Cancel",
      "description": "Cancel a public booking using the bookingToken. Only works for bookings in pending_confirmation, scheduled, or confirmed status. Optionally include a reason. Does NOT require an API key. The booking token scopes access to a single booking.",
      "tags": [
        "public",
        "booking",
        "lifecycle",
        "cancellation"
      ]
    },
    {
      "id": "public_booking_reschedule",
      "name": "Public Booking Reschedule",
      "description": "Reschedule a public booking using the bookingToken. Cancels the original and creates a new pending_confirmation booking at the new time. Returns new confirmationToken and bookingToken. Only works for bookings in pending_confirmation, scheduled, or confirmed status. Does NOT require an API key.",
      "tags": [
        "public",
        "booking",
        "lifecycle",
        "rescheduling"
      ]
    },
    {
      "id": "lifecycle_history",
      "name": "Get Lifecycle History",
      "description": "Get the SCEvent stream for a session \u2014 all observed transitions reconstructed from status_history. Returns events[] with discriminated union by event_type (sc.scheduled, sc.confirmed, sc.completed, sc.delivered, sc.verified, sc.cancelled, etc.), plus stream_completeness (\"complete\" | \"partial_pre_trigger\") and pagination cursor. Events carry origin=\"reprojected_from_status_history\" and canonical SCEvent shape per docs/protocol/sc-event-canonical-schema-2026-04-18.md \u00a77.2. Filters: event_types (e.g. [\"sc.delivered\"]), from_sequence (cursor), limit (default 50, max 500). PII note: delivery_proof clinical fields (summary, outcome, next_steps) are returned only for admin-scoped keys. IMPORTANT: backfilled sc_resolved timestamps do NOT emit sc.resolved events in this stream (Forma B, see decisions log 2026-04-18-lifecycle-history-backfill-policy). For current resolution status, use lifecycle_get_state.sc_resolution. Requires X-Org-Api-Key.",
      "tags": [
        "servicialo",
        "lifecycle",
        "spec-compliant",
        "sc-events",
        "stream"
      ]
    },
    {
      "id": "lifecycle_get_state",
      "name": "Get Lifecycle State",
      "description": "Get the current lifecycle state of a session, including available transitions, state history, and SC resolution. Returns current_state, available_transitions, verification_deadline (when state=delivered), timestamps, duration, sc_resolution (the fundamental SC event: resolved, resolved_at, resolved_by, billing_model), and recent transition history with from/to/at/by/method fields. Requires X-Org-Api-Key. Shape per docs/protocol/sc-event-canonical-schema-2026-04-18.md \u00a77.1.",
      "tags": [
        "servicialo",
        "lifecycle",
        "spec-compliant",
        "sc-resolution"
      ]
    },
    {
      "id": "lifecycle_transition",
      "name": "Lifecycle Transition",
      "description": "Execute a state transition on a session. Accepts either to_state (target state name per Servicialo spec: confirmed, in_progress, completed, verified, documented, cancelled, no_show) or action (semantic verb: confirm, start, complete, verify, document, cancel, no_show). When to_state=no_show, no_show_type is required. NOTE: to_state=\"delivered\" / action=\"deliver\" is NOT available via MCP (ref PDC-SEC-001) \u2014 MCP authentication cannot validate actor-as-Proveedor. Delivery must be performed via the REST endpoint PATCH /api/organizations/[orgSlug]/coordinalo/sessions/[sessionId]/deliver which enforces provider binding. Returns transition record with from, to, at, by, method fields. Requires X-Org-Api-Key.",
      "tags": [
        "servicialo",
        "lifecycle",
        "spec-compliant"
      ]
    },
    {
      "id": "scheduling_book",
      "name": "Book Session",
      "description": "Book a session (Servicialo spec). Returns confirmation_credential (opaque token, valid 30 min) and booking_id. Use scheduling_confirm with the credential to finalize. Does NOT require an API key \u2014 uses requester identity (fullName + email or phone). Accepts optional submission context for audit trail.",
      "tags": [
        "servicialo",
        "scheduling",
        "spec-compliant",
        "public"
      ]
    },
    {
      "id": "scheduling_confirm",
      "name": "Confirm Scheduling",
      "description": "Confirm a booking (Servicialo spec). Dual-mode: (1) with credential \u2014 uses the confirmation token from scheduling_book, no API key needed; (2) with booking_id \u2014 uses API key to confirm an existing session. Returns confirmed status with timestamp.",
      "tags": [
        "servicialo",
        "scheduling",
        "spec-compliant"
      ]
    },
    {
      "id": "scheduling_cancel",
      "name": "Cancel Session",
      "description": "Cancel a session (Servicialo spec). Applies cancellation policy based on time remaining before scheduled time. Requires confirm: true and X-Org-Api-Key.",
      "tags": [
        "servicialo",
        "scheduling",
        "spec-compliant"
      ]
    },
    {
      "id": "scheduling_reschedule",
      "name": "Reschedule Session",
      "description": "Reschedule a session to a new time (Servicialo spec). Cancels the original session and creates a new one at the specified datetime. Requires confirm: true and X-Org-Api-Key.",
      "tags": [
        "servicialo",
        "scheduling",
        "spec-compliant"
      ]
    }
  ],
  "securitySchemes": {
    "apiKey": {
      "type": "apiKey",
      "in": "header",
      "name": "X-Org-Api-Key",
      "description": "Organization API key. Required for all org-scoped operations. Admin tools also accept X-Bootstrap-Key for initial setup."
    },
    "publicIdentity": {
      "type": "http",
      "scheme": "identity",
      "description": "Public booking lane \u2014 no API key needed. Requires human identity (fullName + email/phone) and humanIntentConfirmed: true. Used by all public_booking_* and public_service_list, public_availability_get_slots tools."
    }
  },
  "security": [
    {
      "apiKey": []
    },
    {
      "publicIdentity": []
    }
  ],
  "extensions": {
    "mcp": {
      "url": "https://coordinalo.com/api/mcp",
      "version": "4.1.0",
      "toolCount": 96,
      "description": "MCP server endpoint for Claude and compatible AI assistants."
    },
    "a2a": {
      "globalRegistry": "https://coordinalo.com/.well-known/agents.json",
      "perOrgCardTemplate": "https://coordinalo.com/api/servicialo/{orgSlug}/.well-known/agent.json",
      "perOrgTaskRouter": "https://coordinalo.com/api/servicialo/{orgSlug}/a2a"
    },
    "publicBooking": {
      "enabled": true,
      "httpEndpoint": "https://coordinalo.com/api/public-booking",
      "mcpTools": [
        "public_service_list",
        "public_availability_get_slots",
        "public_booking_create",
        "public_booking_confirm",
        "public_booking_get",
        "public_booking_cancel",
        "public_booking_reschedule"
      ],
      "flow": [
        "list_services",
        "get_slots",
        "create",
        "confirm",
        "get",
        "cancel",
        "reschedule"
      ],
      "authModel": "identity-validated",
      "requiresApiKey": false,
      "requiresHumanIdentity": true,
      "requiresHumanIntentConfirmed": true,
      "confirmationRequired": true,
      "bookingTokenLifecycle": true
    },
    "errorModel": {
      "status": "in_flux",
      "currentShapes": [
        "{ error: string }",
        "{ error: string, details: unknown }",
        "{ error: string, code?: string, decision?: string }"
      ],
      "canonicalShape": {
        "planned": "{ error: string, code: string, details?: object, retryable?: boolean }",
        "deferredTo": "Sprint 2 audit item S2.2"
      },
      "documentation": "/docs/MCP-DESIGN.md#4-politicas-de-protocolo",
      "note": "Hoy 3 shapes coexisten. Agentes deben parsear defensivamente hasta cierre de gap."
    },
    "idempotency": {
      "header": "Idempotency-Key (alias: X-Request-Id)",
      "status": "supported_optional",
      "endpointsAccepting": [
        "POST /api/.../sessions",
        "POST /api/.../charges",
        "POST /api/.../register-payment",
        "POST /api/.../movimientos"
      ],
      "enforcementPlanned": {
        "phase": "Sprint 2 audit item S2.3",
        "behavior": "POST a dominios event-sourced sin Idempotency-Key retornan 400",
        "referencedAdr": "/docs/adrs/event-sourced-migration/ADR-005-idempotencia-y-idempotency-key.md"
      },
      "fallback": "Server genera key autom\u00e1tica si caller no env\u00eda. Pierde idempotencia entre retries de cliente."
    },
    "rateLimit": {
      "status": "selective",
      "schemesWithLimit": [
        {
          "scheme": "publicIdentity",
          "endpoint": "public_booking_*",
          "limit": "ver public-rate-limiter.ts",
          "responseHeader": "Retry-After (segundos)"
        },
        {
          "scheme": "client_token",
          "endpoint": "POST /clientes/[token]/.../reschedule-request",
          "limit": "implementado per-token",
          "responseHeader": "Retry-After"
        }
      ],
      "schemesWithoutLimit": [
        "X-Org-Api-Key admin lane",
        "X-Bootstrap-Key onboarding"
      ],
      "gapTracked": "Sprint 3 audit item S3.3, trigger: piloto > Mam\u00e1 Pro o primer abuso"
    },
    "eventStreamAccess": {
      "status": "not_exposed_via_rest",
      "perSessionAccess": {
        "tool": "lifecycle_history",
        "scope": "single_session",
        "currentSource": "status_history (legacy)",
        "knownGap": "no lee de sc_events Event Store can\u00f3nico, ver ADR-012"
      },
      "bulkQueryAccess": {
        "available": false,
        "plannedAt": "Sprint 1 audit item S1.1, parqueado pendiente reapertura ADR-012",
        "referencedAdr": "/docs/adrs/event-sourced-migration/ADR-012-cierre-sistema-dual-status-history-vs-sc-events.md"
      },
      "directDbAccess": "solo via admin / debugging, no contractual"
    }
  }
}