{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_hrvr7ccqb25p","handle":"coordinalo-service-business-operations","url":"https://wellknown.network/agents/coordinalo-service-business-operations","links":{"self":"https://wellknown.network/agents/coordinalo-service-business-operations/record.json","html":"https://wellknown.network/agents/coordinalo-service-business-operations","markdown":"https://wellknown.network/agents/coordinalo-service-business-operations/record.md","api":"https://wellknown.network/api/v1/agents/coordinalo-service-business-operations","status":"https://wellknown.network/api/v1/agents/coordinalo-service-business-operations/status","claim":"https://wellknown.network/agents/coordinalo-service-business-operations/claim","claimApi":"https://wellknown.network/api/v1/claims","badge":"https://wellknown.network/agents/coordinalo-service-business-operations/badge.svg","openapi":"https://wellknown.network/openapi.json"},"ard":{"identifier":"urn:air:coordinalo.com:agent:coordinalo-service-business-operations","type":"application/a2a-agent-card+json"},"kind":"agent","declared":{"name":"Coordinalo","summary":"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.","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.","publisher":{"name":"Coordinalo","url":"https://coordinalo.com"},"homepage":"https://coordinalo.com","repository":"https://github.com/danioni/coordinalo-mcp","version":"1.0.0","license":null,"protocols":["a2a","mcp"],"tags":["booking","sessions","scheduling","retroactive","listing","cancellation","rescheduling","lifecycle","recurring","session-requests","client-portal","confirmation","on-behalf-of","disputes","delivery","provider-portal","clinical-notes","availability","slots","providers","clients","crm","services","catalog","verification","reporting","finance","charges","payments","sales","aging","confirmations","provenance","communications","expenses","invoices","campaigns","audiences","email","preferences"],"pricing":null,"endpoints":[{"url":"https://coordinalo.com/api/mcp","type":"mcp_streamable_http","auth":null,"probeable":true}],"skills":[{"id":"booking_create","name":"Create Booking","tags":["booking","sessions","scheduling","retroactive"],"description":"Create a new session/appointment for a client. providerId is optional — 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…"},{"id":"booking_get","name":"Get Booking","tags":["booking","sessions"],"description":"Get complete details of a session/appointment by its ID, including client, provider, service, financial, and delivery proof information."},{"id":"booking_list","name":"List Bookings","tags":["booking","sessions","listing"],"description":"List sessions for an organization with filters by provider, client, service, status, and date range. Supports cursor-based pagination."},{"id":"booking_cancel","name":"Cancel Booking","tags":["booking","sessions","cancellation"],"description":"Cancel an existing session. By default applies the org cancellation policy: the charge is computed from the no-charge/partial/full windows and, if the policy has autoApply, registered as a penalty transaction (money-write). Set applyCancellationPolicy: false to waive the charge. Requires confirm: true."},{"id":"booking_reschedule","name":"Reschedule Booking","tags":["booking","sessions","rescheduling"],"description":"Reschedule a session to a new time. Cancels the original and creates a new one. Requires confirm: true."},{"id":"booking_update_status","name":"Update Booking Status","tags":["booking","sessions","lifecycle"],"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) — 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."},{"id":"booking_create_recurring","name":"Create Recurring Booking","tags":["booking","sessions","recurring"],"description":"Create recurring sessions (e.g. weekly therapy). Generates multiple individual sessions linked by a recurrence series ID. Max 52 occurrences."},{"id":"booking_list_requests","name":"List Reschedule Requests","tags":["booking","sessions","rescheduling","session-requests"],"description":"List the reschedule requests (SessionRequest) of an organization — the org side of the bilateral coordination loop a client opens from the portal. Filter by status (pending|all|resolved, default pending), sessionId or clientId. Returns the proposed slot, current session state, and who proposed it. Cursor-paginated. Set includePendingCount: true to also get the count of pending requests (powers the sidebar badge). Read-only. Use booking_resolve_request to approve or reject one."},{"id":"booking_resolve_request","name":"Resolve Reschedule Request","tags":["booking","sessions","rescheduling","session-requests"],"description":"Approve or reject a pending reschedule request (SessionRequest) that a client proposed from the portal — closes the bilateral coordination loop. outcome: \"approved\" applies the reschedule atomically (moves the session to the proposed slot in the same transaction); \"rejected\" requires a reason of at least 10 characters. Idempotent: a request already resolved returns a conflict with its current status. Emits the corresponding session lifecycle events."},{"id":"portal_session_confirm","name":"Confirm Session (client portal)","tags":["client-portal","sessions","confirmation","on-behalf-of"],"description":"Confirm a client's attendance to their session, on behalf of the client (e.g. the client called or messaged the org to confirm). Moves scheduled/pending_confirmation → confirmed and notifies the provider. This is the client-portal confirm flow (event role = client), distinct from the org's own admin confirm in booking_update_status. Idempotent: a session already confirmed returns alreadyConfirmed=true. The org API key owner is recorded as the actor acting on behalf of the client (ADR-004 §6)."},{"id":"portal_session_cancel","name":"Cancel Session (client portal)","tags":["client-portal","sessions","cancellation","on-behalf-of"],"description":"Cancel a client's session on behalf of the client (client-initiated cancellation: cancelledBy=client). Allowed from scheduled/pending_confirmation/confirmed; rejects past sessions. Idempotent: a session already cancelled returns alreadyCancelled=true. Distinct from the admin cancellation with cancellation-policy charges — this is the client-portal cancel flow. The org API key owner is recorded as the actor acting on behalf of the client (ADR-004 §6)."},{"id":"portal_propose_reschedule","name":"Propose Reschedule (client portal)","tags":["client-portal","sessions","rescheduling","session-requests","on-behalf-of"],"description":"Propose a new time for a session on behalf of the client — opens the bilateral coordination loop by creating a pending SessionRequest (it does NOT move the session; the org resolves it with booking_resolve_request). Provide requestedScheduledAt as an ISO datetime (must be future, within ~3 months). Gated by the org's session-request flow flag and rate-limited per (client, session). The event records the session's client as the proposer. Use booking_list_requests to track pending requests."},{"id":"portal_report_session","name":"Report Session (client portal)","tags":["client-portal","sessions","disputes","on-behalf-of"],"description":"Report, on behalf of the client, that the professional did not show up (reason=provider_no_show) or that the session was cancelled/not delivered (reason=cancelled). Creates a Dispute(OPEN) for the org to review — it does NOT change the session status. Idempotent: if an open dispute already exists for the session, returns alreadyReported=true with its disputeId. Notifies the org."},{"id":"portal_confirm_delivery","name":"Confirm Delivery (client portal)","tags":["client-portal","sessions","delivery","on-behalf-of"],"description":"Confirm, on behalf of the client, that the service was delivered (writes DeliveryProof.clientConfirmed) — the client-side confirmation that closes dual-confirm verification. Allowed once the session is completed/delivered/documented; rejected if an open dispute exists. Optionally records a 1-5 rating (only if the service captures quality). This is an OVERLAY: it does NOT change session.status (the auto-verify cron advances delivered→verified). Idempotent: alreadyConfirmed=true if already done. …"},{"id":"portal_cancel_reschedule_request","name":"Cancel Reschedule Request (client portal)","tags":["client-portal","sessions","rescheduling","session-requests","on-behalf-of"],"description":"Cancel a pending reschedule request (SessionRequest) on behalf of the client who proposed it — the client-side withdrawal in the bilateral loop (outcome=cancelled_by_client). Idempotent: a request already cancelled_by_client returns wasAlreadyCancelled=true; a request in another terminal state returns a conflict. Use booking_list_requests to find pending requests; use booking_resolve_request for the org's own approve/reject."},{"id":"session_note_upsert","name":"Upsert Session Note","tags":["provider-portal","sessions","clinical-notes"],"description":"Create or update the clinical note (ficha) of a session: evolution, treatmentPerformed, nextSessionPlan, type (evaluacion/tratamiento/derivacion/cierre), progressMetrics, etc. One note per session (upsert). Sensitivity is resolved automatically (health-vertical orgs default to restricted). NOTE: unlike the provider's own UI save, this does NOT create the provider-confirmed DeliveryProof nor award practice points — those are provider-bound actions (PDC-SEC-001); use the provider portal / REST fo…"},{"id":"session_note_get","name":"Get Session Note","tags":["provider-portal","sessions","clinical-notes"],"description":"Read the clinical note of a session. Non-restricted notes return full content. Notes marked dataSensitivity=restricted return metadata only (type, sensitivity, timestamps, which fields are present) with the clinical text withheld — pass includeRestricted: true to retrieve the full content, which logs an audited restricted-access event and increments the access counter. Returns note: null if the session has no note."},{"id":"availability_get_slots","name":"Get Available Slots","tags":["availability","scheduling","slots"],"description":"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 expose. With clientId, resolves the client titular provider and returns their full service catalog. Five modes: (1) orgSlug only — slots from the public agenda grouped by service, provider auto-assigned at booking; (2) orgSlug + clientId — resolves titular provider if set, falls back to agenda; (3) orgSlug + agendaId — slots for a specific…"},{"id":"availability_get_provider_schedule","name":"Get Provider Schedule","tags":["availability","scheduling","providers"],"description":"Get the configured weekly availability schedule for a provider (not free slots, but the base configuration). Use admin_set_availability to modify."},{"id":"client_list","name":"List Clients","tags":["clients","crm","listing"],"description":"List clients of an organization with search and pagination. Can filter by provider or outstanding debt."},{"id":"client_get","name":"Get Client","tags":["clients","crm"],"description":"Get complete details of a client including financial summary and recent sessions."},{"id":"client_create","name":"Create Client","tags":["clients","crm"],"description":"Create a new client in the organization. If a Person with the same email exists, it will be linked (not duplicated)."},{"id":"client_update","name":"Update Client","tags":["clients","crm"],"description":"Update an existing client's personal data. Email cannot be changed via MCP."},{"id":"service_create","name":"Create Service","tags":["services","catalog","verification"],"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. Optional delivery-verification overrides per service: verificationLevel (none = silent auto-complete, legacy; default_confirm = both can confirm and silence auto-confirms after the org window; dua…"},{"id":"service_list","name":"List Services","tags":["services","catalog","listing"],"description":"List services of an organization. Can filter by active status, discoverability, or category."},{"id":"service_update","name":"Update Service","tags":["services","catalog","verification"],"description":"Update an existing service (price, duration, status, etc.). Creates a price history entry if price changes. Delivery-verification overrides can be changed too: verificationLevel (none / default_confirm / dual_confirm / documented — see service_create for semantics) and qualityCapture (1–5 rating on confirmation). Pass null on either to reset that field and inherit the organization default again; omit to leave it unchanged."},{"id":"service_assign_provider","name":"Assign Provider to Service","tags":["services","providers"],"description":"Assign or unassign a provider to/from a service. Controls which providers can deliver which services."},{"id":"provider_get","name":"Get Provider","tags":["providers"],"description":"Get complete details of a provider including services, schedule, and session stats."},{"id":"provider_create","name":"Create Provider","tags":["providers"],"description":"Create a new provider in the organization. Links or creates a Person record by email."},{"id":"provider_update","name":"Update Provider","tags":["providers"],"description":"Update provider data: status, commission, coverage areas, permissions."},{"id":"provider_get_stats","name":"Get Provider Stats","tags":["providers","reporting"],"description":"Get detailed performance metrics for a provider over a date range: sessions, occupancy, no-show rate, revenue."},{"id":"finance_list_cobros","name":"List Charges","tags":["finance","charges","listing"],"description":"List charges (cobros) for an organization. Filter by client, status, or date range. Includes summary totals."},{"id":"finance_get_cobro","name":"Get Charge","tags":["finance","charges"],"description":"Get details of a specific charge (cobro) including all associated payments."},{"id":"finance_create_cobro","name":"Create Charge","tags":["finance","charges"],"description":"Create a manual charge (cobro) for a client. Not linked to a sale/venta. Requires confirm: true."},{"id":"finance_register_payment","name":"Register Payment","tags":["finance","payments"],"description":"Register a manual payment against an existing charge (cobro). Updates cobro status automatically. Requires confirm: true."},{"id":"finance_client_balance","name":"Get Client Balance","tags":["finance","clients"],"description":"Get the complete financial balance for a client: total sales, charges, payments, pending debt, and credits."},{"id":"finance_list_payments","name":"List Payments","tags":["finance","payments","listing"],"description":"List payments received with filters. Includes summary by payment type."},{"id":"finance_list_ventas","name":"List Sales","tags":["finance","sales","listing"],"description":"List sales (ventas) for an organization. Filter by client, service, provider, or status."},{"id":"finance_create_venta","name":"Create Sale","tags":["finance","sales"],"description":"Create a service sale (venta) for a client. Optionally auto-creates a charge (cobro) depending on org configuration. Requires confirm: true."},{"id":"finance_aging","name":"Accounts Receivable Aging","tags":["finance","reporting","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."},{"id":"finance_list_confirmations","name":"List Charge Confirmations","tags":["finance","confirmations","provenance"],"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)."},{"id":"finance_send_confirmations","name":"Send Confirmation Digest","tags":["finance","confirmations","communications"],"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."},{"id":"finance_list_gastos","name":"List Operating Expenses","tags":["finance","expenses","reporting"],"description":"List operational expenses (gastos operacionales) of an organization with their category, plus totals broken down by category type (FIJO/VARIABLE/COSTO_PRODUCTO/PROVISION). Filter by date range (dateFrom/dateTo), category id, type(s), or recurring-only. Read-only — complements finance_list_cobros/finance_list_payments (income side) to complete the financial picture."},{"id":"finance_list_invoices","name":"List Invoices","tags":["finance","invoices","reporting"],"description":"List invoices (facturas) of an organization with total, balance (saldo), status, SII status, linked-sales count and the amount already applied via payment links (with a derived payment status: pendiente/abonada/pagada). Filter by client or status (pendiente/pagada/cancelada). Read-only."},{"id":"comms_list_campaigns","name":"List Campaigns","tags":["communications","campaigns","listing"],"description":"List communication campaigns (WhatsApp/email) for the organization. Filter by status."},{"id":"comms_get_campaign","name":"Get Campaign","tags":["communications","campaigns"],"description":"Get details of a specific campaign with optional delivery logs per recipient."},{"id":"comms_list_audiences","name":"List Audiences","tags":["communications","campaigns","audiences"],"description":"List the saved audiences/segments used for campaign targeting, each with its filter definition and campaign-usage count. Set includeCount: true to also resolve how many clients currently match each audience, and includePredefined: true to include built-in predefined segments. Read-only — use before comms_create_campaign to pick a target audience."},{"id":"comms_create_campaign","name":"Create Email Campaign","tags":["communications","campaigns","email"],"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\"/\"withPhone\"/\"withoutPhone\", or \"adhoc\" with custom filters. On send, links in the body are auto-tagged with UTMs (utm_campaign = stable slug from campaign name) and a legal footer with unsubscribe link is appended. Returns campaign ID and re…"},{"id":"comms_send_campaign","name":"Send Campaign","tags":["communications","campaigns"],"description":"Execute a draft or scheduled campaign. Sends messages to all matching recipients asynchronously, skipping recipients with email opt-out or bounced addresses (logged as \"skipped\"). Campaign must be in draft or scheduled status. Returns immediately — use comms_get_campaign to track progress (sent/delivered/opened/clicked update via provider webhooks). Requires confirm: true."},{"id":"comms_get_preferences","name":"Get Communication Preferences","tags":["communications","preferences"],"description":"Get the communication preferences for an organization (WhatsApp, email, confirmation, reminder channels and messages)."}],"tools":["Create Booking","Get Booking","List Bookings","Cancel Booking","Reschedule Booking","Update Booking Status","Create Recurring Booking","List Reschedule Requests","Resolve Reschedule Request","Confirm Session (client portal)","Cancel Session (client portal)","Propose Reschedule (client portal)","Report Session (client portal)","Confirm Delivery (client portal)","Cancel Reschedule Request (client portal)","Upsert Session Note","Get Session Note","Get Available Slots","Get Provider Schedule","List Clients","Get Client","Create Client","Update Client","Create Service","List Services","Update Service","Assign Provider to Service","Get Provider","Create Provider","Update Provider","Get Provider Stats","List Charges","Get Charge","Create Charge","Register Payment","Get Client Balance","List Payments","List Sales","Create Sale","Accounts Receivable Aging","List Charge Confirmations","Send Confirmation Digest","List Operating Expenses","List Invoices","List Campaigns","Get Campaign","List Audiences","Create Email Campaign","Send Campaign","Get Communication Preferences","Update Communication Preferences","Send Message","Render Visual Message","Dashboard Report","Occupancy Report","Revenue Report","No-Shows Report","SC Summary Report","Real Debt Report","Evidence Gates Report","Organization Summary","List Agendas","Create Agenda","Get Agenda","Update Agenda","Delete Agenda","List Resources","Update Organization","List Members","Invite Member","List Disputes","List Treatment Plans","Get Treatment Plan","List Delivery Confirmations","Get Email Domain","Register Email Domain","Verify Email Domain","Delete Email Domain","Get Dunning Config","Configure Dunning","Get Settings","Update Settings","Get Reminder Configuration","Update Reminder Configuration","Create Organization","List Providers (Admin)","Create Service (Admin)","Set Availability (Admin)","Toggle Discoverable (Admin)","Preview Client Closing","Create Client Closing","List Client Closings","Delete Client Closing","Evaluate Org Closing Readiness","Close Organizational Period","Distribute Profits","List Retained Earnings","List Payroll Records","Payroll Summary","Public Service List"],"extra":{"updatedAt":"2026-07-25T17:42:23.618469Z","inputModes":["application/json"],"outputModes":["application/json"],"publishedAt":"2026-07-25T17:42:23.618469Z","capabilities":{"streaming":false,"pushNotifications":false,"stateTransitionHistory":true},"registryName":"com.coordinalo/mcp-server"},"attribution":{"kind":"a2a_card","name":"a2a_card","repoUrl":"mcp_registry","summary":"a2a_card","version":"a2a_card","description":"a2a_card","homepageUrl":"a2a_card","publisherUrl":"a2a_card","publisherName":"a2a_card"}},"derived":{"capabilities":[{"slug":"content.marketing","name":"Marketing","confidence":1,"provenance":"derived"},{"slug":"documents.invoice-processing","name":"Invoice Processing","confidence":1,"provenance":"declared"},{"slug":"productivity.email","name":"Email","confidence":1,"provenance":"declared"},{"slug":"productivity.crm","name":"CRM & Sales","confidence":1,"provenance":"declared"},{"slug":"commerce.payments","name":"Payments","confidence":1,"provenance":"declared"},{"slug":"commerce.travel","name":"Travel & Booking","confidence":1,"provenance":"declared"},{"slug":"analytics.reporting","name":"Reporting & Dashboards","confidence":1,"provenance":"declared"},{"slug":"automation.scheduling","name":"Scheduling & Cron","confidence":1,"provenance":"declared"},{"slug":"productivity.calendar","name":"Calendar & Scheduling","confidence":1,"provenance":"declared"},{"slug":"commerce.ecommerce","name":"E-commerce Operations","confidence":1,"provenance":"declared"}],"categories":["analytics","automation","commerce","content","documents","productivity"]},"observed":{"status":"unknown","statusReason":"One check so far (27m ago), which failed.","lastOkAt":null,"lastProbedAt":"2026-09-05T20:25:31.438Z","statusComputedAt":"2026-09-05T20:26:16.310Z","reliability30d":{"probes":1,"successRate":0,"p50Ms":null},"latestObservations":[{"at":"2026-09-05T20:25:31.438Z","kind":"http_head","ok":false,"httpStatus":null,"latencyMs":null,"error":"disallowed by robots.txt","detail":null}],"tools":null,"package":null},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"mcp_registry","key":"com.coordinalo/mcp-server","url":"https://registry.modelcontextprotocol.io/v0/servers/com.coordinalo%2Fmcp-server","firstSeenAt":"2026-09-05T17:20:37.433Z","fetchedAt":"2026-09-05T17:20:37.433Z","normalizedAt":"2026-09-05T17:20:37.433Z"},{"source":"a2a_card","key":"https://coordinalo.com/.well-known/agent.json","url":"https://coordinalo.com/.well-known/agent.json","firstSeenAt":"2026-09-05T17:22:16.317Z","fetchedAt":"2026-09-05T17:22:16.317Z","normalizedAt":"2026-09-05T17:22:16.317Z"}]},"firstSeenAt":"2026-09-05T17:20:37.433Z","updatedAt":"2026-09-05T17:26:12.674Z"}