Make sure nothing falls through the cracks in your cleaning business, even when you're not watching.
Connect Remote server
claude mcp add --transport http sergio https://sergio.serviche.com/api/agent/mcp
{
"mcpServers": {
"sergio": {
"url": "https://sergio.serviche.com/api/agent/mcp"
}
}
}
{
"servers": {
"sergio": {
"type": "http",
"url": "https://sergio.serviche.com/api/agent/mcp"
}
}
}
Settings > Connectors > Add custom connector
URL: https://sergio.serviche.com/api/agent/mcp
Tools 80 found in our last check
whoamiReturns this agent seat: its name, role, member id, the organization it belongs to, the key id this call used, whether the owner allowed it to run SQL queries, and what it reads as (readsAs: "owner" when the owner allowed owner-level reading for this key, else its role) versus w…
catalogReturns `asks`, a short list of things a person can ask (give your user these when they ask what you can do), then lists every tool this seat can call right now, grouped by family, with whether each one changes anything, and under `held` the actions only a person can do (sending…
report_feedbackFiles a bug report or feature request with the Sergio team. It lands in the team's one Feedback inbox, the same place the in-app help bubble's reports go, tagged with this agent seat, and the team is notified the moment it is filed. There is no other feedback channel to try. Che…
events_subscribeCreate or update this seat's one event subscription. inputs: which arrivals (omit for all: text_in, text_out, email_in, email_out, call_answered, call_missed, voicemail, booking_created, booking_changed, booking_cancelled, staff_clocked_in, staff_not_clocked_in, job_finished, vi…
events_listReturns the next events for this seat, oldest first, after `cursor` (omit it to continue from your last ack). Each event names an arrival by id (a text, email, call, or booking change); fetch its detail with read(). Delivery is at-least-once: dedupe on event_id. Pass next_cursor…
events_ackStores `cursor` (a next_cursor you received) as this seat's high-water mark, so events_list with no cursor resumes after it. It only moves forward; an older cursor changes nothing.
readRead ANYTHING about the business: read(entity, filters). ENTITIES (key: purpose [main filters]): conversations: The inbox list of conversations [status, from, to, needs_reply, conversation_id, ...] | conversation_transcript: A client's whole history in one timeline [conversation…
queryRun a read-only SQL SELECT over the business database and get rows back. It is the FALLBACK, not the first move: when a read(entity) answers the question (leads, clients, conversations, bookings and the rest of read's catalog), use read, which carries the business's own definiti…
findClientByIdentifierLook up a client ID by a single identifier (phone or email). Returns the client ID or null. Simpler than resolveClient. No creation, no merge. Use for a quick check: "is this phone number already a client?".
send_textTexts a client or teammate on your person's order, from the business number, as a Manual send under the business's Sending setting. Use it whenever your person asks you to text someone now, with their words or words you wrote for them ("text today's cleaners about the weather");…
start_group_textOpens the one group text thread for 2 to 9 contacts who each have a phone, as the inbox's New conversation with several people checked does (an existing group for the same people is reused). Nothing is sent; texting it is send_conversational_message, which shows your person the…
open_conversation_by_phoneOpens (or finds) the one conversation for a phone number nobody is saved under, as the inbox search's Text <number> does. Nothing is sent. Pass the same idempotency_key when retrying.
assign_conversationAssigns a conversation to a teammate, as the thread header's Assign menu does: assigned_member_id is the teammate's id (read entity org_members), or null to unassign; assigned_to (the teammate's exact name) is accepted instead. A name that is not exactly one current teammate is…
set_conversation_statusMarks a thread done (status resolved) or reopens it (status new), as the inbox's Done and Reopen do; the Quo inbox follows when the business's write setting allows. A thread that still owes the customer a reply is refused unless replyOwedOverride is true (say why to your person…
bulk_clear_conversationsClears every thread older than a cutoff at once, as the inbox's bulk Clear does (owner or admin seats only): mode date clears threads quiet for olderThanDays (default 14) or since cutoff (ISO date); mode leads clears threads a lead follow-up owns. includeTasks also closes their…
snooze_conversationMutes a conversation until snoozed_until (ISO 8601, in the future), at most 10 minutes from now (a later time is cut to 10 minutes), as the inbox's Mute does while someone is on a call. note is optional. For a later follow-up, use set_conversation_reminder. Pass the same idempot…
unsnooze_conversationEnds a conversation's mute now, as the inbox's Unmute does. Pass the same idempotency_key when retrying.
set_conversation_reminderAdds a reminder on a conversation, as the thread's bell does: remind_at (ISO 8601) and an optional note become a task due then. hide_until_due: true also tucks the thread away until the reminder is due (a reply from the person brings it back). Pass the same idempotency_key when…
dismiss_conversation_remindersDismisses every open reminder on a conversation, as the bell's Dismiss does. Pass the same idempotency_key when retrying.
link_conversation_to_clientLinks a conversation to a contact, as the inbox's Link to a contact does: if the contact already has a one-to-one thread, it is folded into this one, and an email thread's address is saved to the contact. Sergio learns the correction for later emails. Pass the same idempotency_k…
merge_conversationsMoves everything in conversation_id (messages, calls, emails, tasks) into target_conversation_id and removes the empty one, as the thread menu's Merge does. It cannot be split back. Pass the same idempotency_key when retrying; the same pair merges once.
track_conversation_as_leadOpens a lead for this thread's contact, as the thread header's Track this as a new lead does, for a customer asking about new work. request is what they asked for, in a line. Refused when lead follow-up is off, the thread has no contact, or the contact is staff, an applicant or…
disposition_conversationRecords why a quiet thread needs no reply, as the clear gate's picker does: spam (the contact becomes spam; its lead work stops and its Quo card is tagged when the business's write setting allows), lead (the contact becomes a lead), reengage (tags the contact for a later marketi…
start_conversation_flowStarts a flow on a conversation, as the thread's flow picker does: flowId names an active flow (read entity flows); its steps become tasks with deadlines. label is optional. Pass the same idempotency_key when retrying.
close_conversation_flowMarks a conversation's flow done, as the flow chip's Mark done does. conversationFlowId names the flow when the thread has more than one. outcome (for example declined) closes it early without marking its steps done; close_note is optional. Pass the same idempotency_key when ret…
remove_conversation_flowTakes one flow off a conversation, as the flow chip's Remove does; its open step tasks are removed. conversationFlowId names the flow. reason is optional. Pass the same idempotency_key when retrying.
edit_draftEdits a draft in a conversation's draft box, as a person typing in it does: body, subject (email), whyNote, isReady, or status 'discarded' to throw it away. Nothing is sent; a person still presses Send. draft_id comes from create_draft or read. Pass the same idempotency_key when…
send_emailEmails a client from the business mailbox on your person's order, as a Manual send under the business's Sending setting. First call without confirm_token: nothing is sent; you get a preview (to, subject and the exact text) and a confirm_token. Show your person the preview word f…
create_draftWrites a message into a client conversation's draft box. It never sends: a person on the team reviews the exact text and presses Send in Sergio, where the organization's sending policy applies. Give conversationId, or clientId to use that client's conversation. Pass the same ide…
redraft_lead_stepRewrites the text of a lead's upcoming step that a person sends, from the conversation so far, as the journey's Update draft does (one AI draft, billed like the composer's Draft). Refused for a call step, a step Sergio sends on its own, or a step already past. Nothing is sent. t…
set_lead_outcomeRecords what happened with a lead, as the lead card's Close menu and taps do. tap: quoted (they have a price); booked (closes it won, on the booking when one for them exists, else on your word); confirmed_booked (the same as booked); call_back_on (date YYYY-MM-DD, or at as an IS…
move_lead_journeyMoves a lead to another follow-up journey (segmentId, as Settings > Lead follow-ups names them: read the lead program), at the same place in the sequence, as the lead's journey tag does. Pass the same idempotency_key when retrying.
hold_follow_upsPuts a lap's automatic follow-ups on hold, as its Hold follow-ups switch does: lead follow-ups, a feedback check-in and a review request all obey the one hold. No step goes out on its own; each is drafted for a person. Turning them back on is your person's, in the app. Pass the…
hold_lead_follow_upsPuts a lap's automatic follow-ups on hold, as its Hold follow-ups switch does: lead follow-ups, a feedback check-in and a review request all obey the one hold. No step goes out on its own; each is drafted for a person. Turning them back on is your person's, in the app. Pass the…
edit_lead_stepChanges one step of one lead's follow-ups, as the journey list does. Send one or more of: dueAt (ISO time, or null for the plan's timing; must stay after the step before it), channel ('message', 'email', 'call', 'reply', or null for the plan), removed (true takes it out, false p…
update_payroll_settingsChanges one payroll setting per call, as Payroll settings on the staff page does: providerPayFallbackPct (0 to 1), providerPayDefault ({ unit: visit or hour, cents }), or payHoursFrom (booked or approved_time_logs). Staff pay settings only; no money moves. Pass the same idempote…
add_staff_memberTo rename someone already on the roster, pass rename_staff_id with the new name; the old spelling keeps pointing at them. Otherwise adds a field worker to the roster, as the staff page's Add staff does: name (a profile with that name is reused, never duplicated), optional employ…
edit_staff_memberChanges one staff member (staff_id, from read staff_roster or staff_detail) as Save in their staff drawer does. Pass only what changes: employmentType (employee reads Staff, contractor reads Contractor), payRateCents with payRateUnit (hour, visit or percent; null clears), public…
clear_staff_availability_overrideClears one field worker's schedule change on a date (YYYY-MM-DD), so their normal weekly hours apply again, as Clear on the staff calendar does. To set a change, use set_staff_availability. Nothing is sent. Pass the same idempotency_key when retrying.
set_staff_weekly_hoursReplaces the regular weekly hours of the workers named in staffNames with exactly the windows in entries (day_of_week 0 = Sunday to 6 = Saturday, HH:MM times; several windows a day allowed; a named worker with no entries has no regular hours). Workers not in staffNames are untou…
record_staff_eventAdds one entry to a field worker's (staff_id) staff log and their attendance and feedback counts: kind warning (a conduct warning), kudos, note, client_feedback (with sentiment), or sick, late, no_show. A sick day, late arrival or no-show that cancelled or moved a visit is recor…
add_staff_scheduling_ruleAdds a plain-English scheduling rule for one field worker (staff_id), as Add rule on their Rules tab does, e.g. "Won't work Tuesdays" or "Only mornings in Brooklyn". hardness hard (default: never scheduled against it) or soft (avoided when possible). The same wording again updat…
remove_staff_scheduling_ruleRemoves one plain-English scheduling rule (ruleId, from add_staff_scheduling_rule or read staff_scheduling_rules) from a field worker (staff_id), as remove on their Rules tab does. Answers the rules left. Pass the same idempotency_key when retrying. An owner-level change: Sergio…
review_cleaner_rosterSorts one cleaner name found on bookings, as the Get started card's Review your cleaner roster does: action add (adds them to the roster and links their past jobs), not_staff (this name is not one of our cleaners), or link (it is staffId under another spelling; links their past…
answer_google_review_matchSays which client wrote a Google review, as Contacts > Needs review does: client_id links it (also moving a review linked to the wrong client), client_id null says no client wrote it (unlinking a linked review). A link closes that client's review requests. Find reviews and their…
edit_contactsApplies one edit to up to 5000 contacts, as the Contacts page's selection bar does: op add_to_list / remove_from_list (listId), add_tags / remove_tags (tagIds), set_service_category (value residential, commercial, both or null), set_lead_source (value thumbtack, google_lsa, yelp…
accept_smaller_syncApplies a booking sync Sergio held back for returning far fewer bookings than it holds, once, and makes that size the new normal, as Accept this smaller sync on Data sources does. job_id is the held sync's import job. Pass the same idempotency_key when retrying. An owner-level c…
upload_spreadsheetUploads a bookings or clients spreadsheet (CSV text) and queues its import, as Upload on the Imports page does; nothing is written to customers until its columns are checked. source is the import source spelling, not a free label: a booking platform's key for its bookings export…
start_spreadsheet_importStarts the import of a spreadsheet uploaded with upload_spreadsheet, as Start in the import drawer does: Sergio checks its columns; a confident mapping imports, an uncertain one answers status needs_review and waits for review_import_mapping. Pass the same idempotency_key when r…
review_import_mappingSettles an import waiting at the column review, as its review card does: decision approve (the import runs with the confident columns plus keepFields; keepValues and assignValues teach status words) or discard (nothing is written). Pass the same idempotency_key when retrying. An…
set_scanner_onTurns one of the business's Scanners on or off, as the On switch in Automations > Scanners does. A Scanner is only ever on or off (never a trial mode). scanner_id comes from read('scanners'). Pass the same idempotency_key when retrying. An owner-level change: Sergio tells the ow…
create_scannerSaves a new Scanner, as Save on New Scanner does: question (required), and optionally name, inputs, look-again timing, who gets the task, due rule, destination, contact types, and enabled (on or off; there is no trial mode). Pass the same idempotency_key when retrying. An owner-…
edit_scannerChanges a Scanner, as its editor on the Scanners page does: any of name, question, inputs, look-again timing, who gets the task, due rule, destination, contact types, enabled. scanner_id comes from read('scanners'). Pass the same idempotency_key when retrying. An owner-level cha…
delete_scannerDeletes a Scanner, as Delete in its editor does; the tasks it already made stay. To pause it instead, use set_scanner_on with enabled false. Pass the same idempotency_key when retrying. An owner-level change: Sergio tells the owner after it is made.
create_contact_listMakes a contact list on the Contacts page, or answers the live one with that name. Add people to it with edit_contacts (op add_to_list). Pass the same idempotency_key when retrying.
edit_contact_listRenames a contact list or archives it (archived: true; its people keep their other lists), as the Contacts page's list menu does. Pass the same idempotency_key when retrying.
create_contact_tagMakes a tag on the Contacts page, or answers the live one with that name. Tag people with edit_contacts (op add_tags). Pass the same idempotency_key when retrying.
edit_contact_tagRenames a Contacts tag or archives it (archived: true), as the Contacts page's tag menu does. Pass the same idempotency_key when retrying.
create_campaignBuilds a campaign as the Campaigns page's New campaign does, always saved as a draft: name, the messages (steps: the opener first, each { template, delayDays?, channel? text | email | call }), offer, audience (audience_filter, or audience_source { kind: list | view | people | fi…
edit_campaignEdits a campaign as its builder does (the fields you pass change; the rest stay), or pauses (status paused, pulls back its queued sends) or archives it. Turning automatic sending off (auto_send false) is open. To start or resume one, use start_campaign (your person confirms firs…
delete_campaignDeletes a campaign as Delete on its card does: its queued messages are pulled back first; messages already sent stay in their threads. It cannot be undone; to stop it for now, edit_campaign with status paused. Pass the same idempotency_key when retrying.
start_campaignStarts a draft or paused campaign on your person's order, as Start campaign does: it enrolls the people waiting and drafts their first message; starting sends nothing by itself. First call without confirm_token: nothing changes; you get a preview (every message's exact words, ho…
send_campaign_messagesSends a started campaign's drafted messages that are ready, on your person's order, as Send in its Ready to send does, as Manual sends under the business's Sending setting, spread over the campaign's send window. First call without confirm_token: nothing is sent; you get a previ…
start_history_importStarts importing the past messages of a connected inbox into Sergio, as Import history on Data sources does: source openphone (Quo) or gmail, or transcripts; days back (default 90). The account must already be connected (connecting is the owner's, in Settings). A second start wh…
cancel_importCancels a running import (message history or a spreadsheet), as Cancel in the import drawer does; what it already brought in stays. job_id comes from start_history_import or the import list. Pass the same idempotency_key when retrying.
record_tools_accessRecords the tools the business uses today and whether Serviche was given access to each, as Get started's Your tools step does: action pick (tools: [{ id } or { name }]), none, mark (tool, provided, note) or unmark (tool). Nothing leaves Sergio. Pass the same idempotency_key whe…
declare_lead_sourcesRecords where the business gets its leads (keys from the setup guide list, for example thumbtack, google_lsa, yelp, website, other; other needs its words), as Get started's lead sources step does. An answer only: it opens and sends nothing. Pass the same idempotency_key when ret…
approve_follow_up_styleRecords the owner's approval of the lead journeys drafted from how the business follows up today, as Get started's follow-up step does. The journeys must already be saved as the answers draw them (answers: firstChannel, speed, followUpChannel, tries, overDays, giveUpDays; source…
set_flow_archivedArchives a flow as its Archive on the Automations page does (archived true): it leaves the flow pickers and the router but is kept, and runs in progress are unaffected. archived false un-archives it. flow_id comes from read('flows'); archive several by calling once per flow. Pas…
set_flow_onTurns a flow on or off, as its On switch on the Automations page does. Turning it on runs the same publish check (a refusal says what is missing); turning it off ends its runs in progress. flow_id comes from read('flows'). Pass the same idempotency_key when retrying.
edit_flowChanges a flow's name or description, as its editor on the Automations page does. Send only what changes. Its steps and how it starts are set in the editor (how it starts: set_flow_start). flow_id comes from read('flows'). Pass the same idempotency_key when retrying.
set_staff_availabilitySets one field worker's availability for a date, or a date range (end_date, up to 92 days): a day off (day_off: true), one shift (available_from + available_until, HH:MM), or split shifts (windows). It replaces that day's override; hours equal to the weekly default clear it. Not…
create_taskAdds a task to the team's work queue, optionally tied to a client or conversation and due at a time (ISO 8601). Pass the same idempotency_key when retrying; a repeat returns the original task.
complete_taskMarks a task done, recorded as completed by this seat. A flow-step task also completes its step, as the check box does. Pass the same idempotency_key when retrying; a repeat returns the task, reports what the original call applied, and changes nothing if the task changed since.
skip_taskDismisses a task as not needed (terminal, distinct from done). A client check-in needs a skip_reason. Pass the same idempotency_key when retrying; a repeat returns the task, reports what the original call applied, and changes nothing if the task changed since.
reopen_taskReopens a done or dismissed task, clearing its completion. A lead follow-up (pursuit) task is refused: reopening it can queue a message, so a person does it. Pass the same idempotency_key when retrying; a repeat returns the task, reports what the original call applied, and chang…
snooze_taskMoves a task's due time (ISO 8601 with offset). A flow-step task shifts its later steps by the same gap, as in the app. Pass the same idempotency_key when retrying; a repeat returns the task, reports what the original call applied, and changes nothing if the task changed since.
assign_taskAssigns a task to a team member (their member id from read('team_members') or whoami), or unassigns it with null. Pass the same idempotency_key when retrying; a repeat returns the task, reports what the original call applied, and changes nothing if the task changed since.
update_taskEdits a task as a person can on its row: title, description (details), due_date (ISO 8601 with offset, or null to clear), priority, client_id or conversation_id (null unlinks). Send only the fields to change. A flow-step task shifts its later steps when its due time moves, as in…
delete_taskDeletes a task outright, as the task menu's Delete does. It cannot be undone; to say a task is not needed, use skip_task instead. Deleting a Scanner's task tells that Scanner it was wrong. Pass the same idempotency_key when retrying; a repeat returns the first delete's answer.
Details
| Endpoint | https://sergio.serviche.com/api/agent/mcp (Streamable HTTP) |
| First published | 8 Nov 2026 |
| Last updated | 8 Nov 2026 |
| Registry name | com.serviche/sergio |
More communication servers See all
Listing data from the official MCP registry. Status and tools from NestDaddy's daily check. Browse all MCP servers.
