AI agents for CRM, mail, calendar, ERP and accounting - you approve. EU-hosted, OAuth.
Connect Remote server
claude mcp add --transport http delegaize https://callpilotai.cf-innov-ai-tive.de/api/sb/functions/v1/mcp-server
{
"mcpServers": {
"delegaize": {
"url": "https://callpilotai.cf-innov-ai-tive.de/api/sb/functions/v1/mcp-server"
}
}
}
{
"servers": {
"delegaize": {
"type": "http",
"url": "https://callpilotai.cf-innov-ai-tive.de/api/sb/functions/v1/mcp-server"
}
}
}
Settings > Connectors > Add custom connector
URL: https://callpilotai.cf-innov-ai-tive.de/api/sb/functions/v1/mcp-server
Tools 80 found in our last check
ingest_messageIngest one incoming message from an external channel (Beeper network, desktop mail, …) forwarded by the local comms-forward bridge. Idempotent on (channel, external_id). Stores the message and, unless auto_draft is false, generates an AI reply DRAFT (never auto-sends) — EXCEPT w…
list_inbound_messagesRead the messages that arrived through the channel ingest (ingest_message — Beeper networks such as WhatsApp/Signal/LinkedIn, desktop mail — plus Mattermost and WhatsApp ad leads), newest first. This is the inbox for those channels; list_whatsapp_messages only covers Twilio. Rea…
classify_messageClassify one incoming item — an e-mail (kind 'email', id from list_emails) or a messenger message (kind 'inbound_message', id from list_inbound_messages): category, priority, responsible agent and a short note. category must be one of the tenant's classification classes (without…
suggest_agentsSuggest 3-6 agents for this tenant from what actually arrives: reads the latest N incoming e-mails and messenger messages (default 200), groups them into topics with the tenant's language model and proposes one agent per topic: name, responsibility, reasoning with its share ('23…
list_leadsList leads for the current tenant. Filters: search (title/email/phone/best_phone — a search term that looks like a NUMBER is additionally matched against the last nine digits of phone, best_phone and fax, so '017612345678' finds a lead stored as '0176 12345678'. To identify a CA…
count_leadsReturn { count } — the TOTAL number of leads matching a filter, without fetching any rows. Accepts the exact same filters as list_leads (search, category, status, campaign_id, no_campaign, owner_id, min_score, stale_days). Use this to size a segment before listing/exporting (e.g…
export_leads_fileExport EVERY lead matching a filter to a downloadable file and return { url, filename, format, count, bytes, truncated }. `url` is a signed link (valid 7 days) to a private file. Unlike export_leads (which pages 100 at a time), this pulls the whole filtered set server-side into…
get_leadGet one lead with its account, recent calls, and upcoming meetings.
export_leadsFull-fidelity export of leads for offline analysis / backup. Returns { leads, count, limit, offset }. Each lead has ALL its columns, ai_memory[] (every AI-memory item attached to the lead — all categories, full untruncated content, newest first), and (unless disabled) nested con…
list_accountsList accounts (companies). Optional search on name, label (name or id: only accounts with this label), stale_days (last activity older than N days), order_by: last_activity|name|created (default last_activity). Returns last_activity_at and labels[].
get_accountGet one account with its contacts (all people linked to it, each with function and whether it is their main organisation), leads, labels and custom_fields.
list_contactsList contacts. Optional search (first/last name, email), account_id (main organisation), category (category name, case-insensitive) or category_id, label (name or id), stale_days (last activity older than N days), order_by: last_activity|name|created (default last_activity). Ret…
get_contactGet one contact with its labels, custom_fields, additional contact points (private/work e-mails, phones, addresses) and all organisations (with function; account_id is the main one).
list_campaignsList campaigns for the current tenant.
get_campaignGet one campaign with its pipeline stages and target counts by state.
list_callsList call history for the current tenant, optionally filtered by lead_id. Newest first.
list_meetingsList meetings for the current tenant, optionally filtered by lead_id or status. Soonest first.
list_email_historyList sent/draft emails (email_drafts) for a lead (lead_id), a person (contact_id) or an organisation (account_id) — or with unassigned=true the SENT mails that belong to no record at all (e.g. sent with send_email before the contact existed); assign them with assign_email (draft…
delete_draftDelete an UNSENT email draft (email_drafts) you no longer need. Only rows with status 'draft' can be removed — a sent email is a record and is refused. Any temporary download links belonging to the draft go with it. Use this after abandoning a draft, so it does not linger on the…
list_draftsList UNSENT email drafts (email_drafts, status 'draft') for the tenant, newest first. Optionally narrowed to one lead. For sent mail use list_email_history.
list_letter_historyList physical letters ('Briefe', letter_briefs) sent for a lead.
add_lead_messageRecord a channel message on a lead's communications timeline (LinkedIn/WhatsApp/Signal/email/note…). Required: lead_id, channel, body. Optional: direction ('inbound'|'outbound', default inbound), sent_at (ISO), sender, contact_id, external_chat_id, external_message_id, inbound_m…
list_lead_messagesList a lead's channel messages (newest first). Optional channel filter.
list_ai_memory_itemsList AI memory items. Scope a note with entity ('lead'|'contact'|'account'|'campaign') + entity_id (the record id). With entity_id: that record's notes PLUS tenant-wide notes. Without: tenant-wide only. category is now a free topical label (e.g. 'positioning-usp') you can filter…
get_tenant_rulesRead the tenant rule book — the rules that apply to ALL agents of this tenant (every agent gets them at start in get_agent_bootstrap). Returns the text and the app link where an admin views and edits it.
add_tenant_ruleAppend ONE rule to the tenant rule book, which every agent reads at start. Use it when a human says a rule applies to all bots ("jeder Bot soll …", "Polizei: ab jetzt immer …") — instead of copying it into each agent's memory. Required: rule (one sentence or short paragraph), re…
create_ai_memory_itemSave an AI memory item. Required: name, content. Scope it with entity ('lead'|'contact'|'account'|'campaign') + entity_id (a CRM record) AND/OR brain_id + agent_id (agent 'brain' memory). category is a free topical label (default 'general'). importance 1-5 (default 3) for rankin…
update_ai_memory_itemUpdate an AI memory item (partial). Stamps updated_at. Set entity + entity_id to re-attach a note to a record (e.g. entity='lead', entity_id=<lead id>); pass entity_id null to make it tenant-wide. category is a free topical label. occurred_at (ISO) = the fact's original date in…
delete_ai_memory_itemDelete an AI memory item.
list_documentsList documents. Documents are typed info (doc_type: email|offer|invoice|order|note|file|other) with a title + description the AI can analyze — e.g. sevDesk offers/invoices imported per lead. Scope with entity ('lead'|'contact'|'account'|'campaign') + entity_id. Pass unfiled:true…
add_documentAttach a document (typed info) to a record BY REFERENCE — no file bytes, url just points at something hosted elsewhere. Required: entity ('lead'|'contact'|'account'|'campaign'), entity_id, title. Optional: doc_type (default 'note'), description (the analyzable text), source, url…
upload_documentAttach an actual FILE to a record (lead/contact/account/campaign) — stored in private Supabase Storage, not just a URL reference. Required: entity, entity_id, and EITHER source_url OR content_base64 (not both). IF YOU HAVE SHELL/CODE-EXECUTION ACCESS (Bash, a script runner, etc.…
create_document_upload_urlStep 1 of the recommended flow for a LOCAL file when you (the calling agent) have shell/code-execution access (Bash, a script, curl, etc.): reserves a document record + a one-time signed upload URL, so the actual file bytes travel via a plain HTTP PUT from your shell — never thr…
finalize_document_uploadStep 2 of the create_document_upload_url flow: call this AFTER your shell has PUT the file to the upload_url. Confirms the object actually landed in storage, backfills its real file_size/mime_type, and (unless analyze:false) runs AI analysis the same way upload_document does. Re…
analyze_documentRe-run AI analysis on an already-uploaded document: extracts the text from the stored file, stores it (get_document_text reads it back), replaces its search sections (search_knowledge finds them, source = document_id + sheet/rows) and writes/refreshes the AI-summary section of d…
list_integration_catalogList supported tenant integrations and the credentials/capabilities available for each. This catalog never returns saved credential values.
set_integration_credentialsStore credentials for a third-party service in the tenant's vault. Secret fields (password, api_token, token, access_token, api_key, client_secret, secret, …) go into Supabase Vault and are addressed by id — they are NEVER written to a plain column and NEVER returned by any tool…
transcribe_audioTurn an audio recording into text via Whisper. Give it EITHER 'url' (fetched server-side — a pre-signed link works, no auth is sent) OR 'base64'. Use it for voicemail from the phone system, call recordings and voice notes: those arrive as sound, and guessing what was said is not…
update_documentUpdate a document (partial). Stamps updated_at. Also files a document against a record after the fact: pass entity + entity_id together (both, never one) to attach a previously unfiled upload once you know where it belongs, or both as null to detach it again. The target record i…
delete_documentDelete a document by id (also removes its uploaded file from storage, if any).
research_leadResearch a lead (person/company) online via web search and save findings as ai_memory_items. Optional focus to steer the research.
draft_messageDraft an email or letter for a lead from its memory + recent activity. Returns {subject, body, attachments: []}; does not send, attaches nothing. channel must be 'email' or 'letter'. To ask for approval, pass it as delegate_to_user questions[].email {to, subject, body, attachmen…
merge_recordsMerge duplicate records. Keeps keep_id, folds each drop_ids record's relations (calls/emails/campaigns/meetings/memory/channels/…) into it, then DELETES the duplicates. Fields: primary wins, its empty fields are filled from the duplicate, and field_overrides forces final values…
list_merge_logList past merges (audit trail) for this tenant — who merged what into what, when, with a full snapshot of the deleted record (for manual recovery). Optional keep_id to see merges into one specific record.
get_ingest_instructionsReturns everything a local messaging orchestrator (e.g. a Beeper MCP client) needs to sync conversations into this CRM: the current sync watermark, the tracking blacklist, the mapping/memory rules, tenant/owner context, and available_agents — the tenant's active specialized agen…
update_sync_stateAdvance the messaging ingest watermark after a sync run. Pass last_sync as an ISO timestamp; the next get_ingest_instructions returns it.
set_ingest_instructionsUpdate this tenant's messaging-ingest instructions. `custom_instructions` = freeform natural-language guidance (e.g. per-network campaign routing). `overrides` = partial object shallow-merged over the default rules. `default_campaign_id` = campaign new Beeper leads are added to.…
find_lead_by_channelMatch a messaging conversation back to a lead/contact. Provide external_chat_id (Beeper chatID, primary key) and/or handle (+optional channel). A phone number as handle is also matched like find_by_phone (incl. contact mobiles) - only a UNIQUE lead or contact is returned. Return…
find_by_phoneWer gehoert zu dieser Rufnummer? Der Alltagsfall ist nicht 'durchsuche Leads', sondern 'es hat jemand angerufen, wer war das'. Sucht ueber leads.phone/best_phone/fax, contacts, accounts und die Anrufhistorie — FORMAT-UNABHAENGIG: verglichen werden die letzten neun Ziffern, wesha…
link_channelUpsert a messaging-channel identity onto a lead/contact/account so future conversations match and provenance is recorded. Required: channel, external_chat_id, lead_id. Pass contact_id + account_id too when known.
list_blacklistList tracking-blacklist entries (persons/chats excluded from ingest) for the tenant.
blacklist_addExclude a person/chat from messaging ingest. Provide external_chat_id (most precise) and/or handle (+optional channel), plus optional reason. Match precedence on ingest: external_chat_id → handle(+channel).
blacklist_removeRemove a tracking-blacklist entry by id.
create_leadCreate a lead. Checks for an existing person FIRST (name, email, phone, social_url) and REFUSES with the candidates if one is found — pass on_duplicate="force" only once you have looked and they really are someone else. A social_url passed here is stored on the lead so the next…
update_leadUpdate a lead (partial — only provided fields change; empty values are NOT cleared). To blank a column, list it in clear_fields.
add_lead_social_urlAdd or update a lead's social/profile link for a platform — upserts by platform, so re-adding the same platform (e.g. 'linkedin') overwrites its url/label instead of duplicating; this is also how you EDIT an existing entry. Stored in leads.social_urls, a jsonb array of {platform…
remove_lead_social_urlRemove a lead's social/profile link for a given platform (leads.social_urls). Required: lead_id, platform. Returns the full updated social_urls array.
create_contactCreate a contact. 'first_name' and 'last_name' required. Optional: email, phone, position, department, salutation, academic_title, account_id (main organisation), notes, gender (m|w|d|x = no answer), birth_date (YYYY-MM-DD) or birth_year. More organisations: set_contact_accounts…
update_contactUpdate a contact (partial; empty values are NOT cleared). To blank a column, list it in clear_fields.
create_accountCreate an account (company). 'name' required. Optional: industry, website, phone, email, address, city, postal_code, country, notes.
update_accountUpdate an account (partial; empty values are NOT cleared). To blank a column, list it in clear_fields.
create_campaignCreate a campaign for the caller's tenant (tenant_id, owner_id and created_by are set from the authenticated user). 'name' required. Optional: description, status (draft|active|paused|completed — default 'active'), start_date/end_date (YYYY-MM-DD), daily_call_target (int, defaul…
update_campaignUpdate a campaign (partial; empty values are NOT cleared — list a column in clear_fields to blank it). status: draft|active|paused|completed.
delete_campaignDelete a campaign. IRREVERSIBLE — cascades to its pipeline stages, target/lead memberships, documents, scripts and other campaign-scoped rows (leads/contacts/accounts themselves are NOT deleted). Refuses if the campaign still has target members unless force=true. Reassign the in…
log_callLog a call record. Optional: outcome, notes, call_status_code, success (1/0), duration_sec, to_number, next_call_at (ISO). For an INCOMING call pass direction:'inbound' and from_number — and lead_id only if you know who it was. An unidentified incoming call is worth recording WI…
schedule_callbackSchedule a follow-up for a lead: sets next_action_at (and optional next_action text) on the lead, and optionally no_call_until.
add_lead_to_campaignAdd a lead to a campaign (creates a campaign_targets row). No-op if already present.
create_meetingCreate a meeting. Required: title, start_at (ISO), end_at (ISO). Optional: lead_id, contact_id, campaign_id, status (pending|confirmed|cancelled), notes (INTERN — wird dem Gast NIE gezeigt), invitation_text (was der eingeladene Gast in der Einladung liest; leer = neutraler Text…
update_meetingUpdate a meeting (partial) — reschedule (start_at/end_at) or cancel (status='cancelled'). Get the meeting_id from find_calendar_event; an id belonging to a calendar event is not accepted here, use update_calendar_event for those. Times without a UTC offset are read as wall-clock…
add_meeting_video_linkAttach (or refresh, e.g. after rescheduling) a Google Meet or Microsoft Teams video link on an existing meeting, via the tenant's connected integration (Integrations page). Required: meeting_id, provider ('google_meet'|'teams'). Re-calling with the same provider updates the SAME…
create_presentationCreate a presentation (a talk/deck) tied to a campaign or event. Slides live once; each variant (language, partner logo) picks order and speaker notes. Required: title. Optional: campaign_id, event_name, event_date (ISO), location, target_duration_sec, template (corporate-design…
get_presentationGet one presentation with its variants, slides (in base order) and per-variant note counts. Required: presentation_id.
list_presentationsList presentations of the tenant, newest first. Optional: campaign_id, status, limit (default 50).
update_presentationUpdate a presentation (partial). Required: presentation_id. Optional: title, campaign_id, event_name, event_date, location, target_duration_sec, template, status.
create_presentation_variantAdd a variant (language + optional partner logo) to a presentation. Required: presentation_id, language (e.g. 'de','en'). Optional: partner_logo, label, slide_order (array of slide ids = talk order; default = slide positions). Returns { variant_id }.
list_presentation_variantsList the variants of a presentation. Required: presentation_id.
upsert_slideCreate or update a slide of a presentation. Slides are shared across all variants. Required: presentation_id. Pass slide_id to update an existing slide, omit to create. Optional: slide_type (title|content|video|solution|questions), position, title, content (structured object; co…
reorder_slidesSet slide order. Required: presentation_id, slide_ids (array in the wanted order). Without variant_id it sets the base order (slides.position). With variant_id it sets only that variant's talk order (which may differ from the slide numbers, e.g. appendix). Returns { ok, count }.
set_slide_notesSet the per-variant speaker notes for a slide. Required: slide_id, variant_id. Optional: speaker_text, seconds (planned duration), bullets (array of cue points), direction (Regie), demo_points (array), insert_clip, bullets_confirmed. Writing notes clears the slide's stale flag f…
get_scheduleCompute the running order and timing of a presentation variant: each slide's start time and duration in TALK order (variant slide_order if set, else slide positions), the total, and a warning if the total exceeds target_duration_sec. Duration per slide comes from the note's seco…
Details
| Endpoint | https://callpilotai.cf-innov-ai-tive.de/api/sb/functions/v1/mcp-server (Streamable HTTP) |
| First published | 12 Nov 2026 |
| Last updated | 12 Nov 2026 |
| Registry name | io.github.toasternet/delegaize |
More ai and media servers See all
Listing data from the official MCP registry. Status and tools from NestDaddy's daily check. Browse all MCP servers.
