Whalesync keeps data in sync between the tools your team already uses —
Airtable, Webflow, HubSpot, Salesforce, Notion, Postgres, and more — with
two-way sync that feels native in every app.
With this connector, Claude can set up and run syncs for you: create a sync
between two apps, map tables and fields, validate the mapping, and turn the
sync on. Once data is flowing, Claude can monitor it — check sync status,
find out why a record isn’t syncing, review held deletes, and retry failed
work after you fix the cause.
Connecting your apps and approving anything irreversible always stays in
your hands: OAuth connections, starting a sync, and approving deletes happen
in the Whalesync app, and Claude hands you a link at each of those steps.
Protocol
MCP 2025-11-25
Server version
1.0.0
Supports
Tools
Resources
Prompts
Overall score
A
Overall quality score: 87 out of 10087/100
Server metadata
5 of 8 fields60/1006 / 10 pts
Identity, discovery, and usage metadata advertised during the MCP handshake.
Whalesync creates live two-way syncs between apps (Airtable, Webflow, HubSpot, Postgres, Notion, …). You build and monitor syncs; the data then flows on its own.
The flow that works:
1. sync_list_connectors — find the two connectors and what auth each needs.
2. sync_create — NEVER ask a person for credentials in chat. The default for every connector is connector name ONLY (no auth, no base): the sync comes back with a browser link per unconnected side where the person enters credentials or signs in securely in the app. OAuth connectors allow nothing else (the person picks the base in the browser, and even a remote_id known from another sync cannot be pre-selected); for API-key connectors include auth inline only when the credentials were already handed to you programmatically.
3. If the sync reports pending_actions: relay each url and instruction to the person VERBATIM, then poll sync_get until the side is connected. Never fetch those urls yourself — they are browser steps only a person can do.
4. sync_list_tables / sync_list_fields — read both sides' schemas (these can block up to a minute while a fetch runs).
5. sync_validate_mappings, then sync_update_mappings. Reference tables and fields by remote id, not name. Use {"create": {"name": "…"}} to have Whalesync create a missing table or field on the other side.
6. A sync only runs under mappings a person has reviewed and started: relay the user_confirmation pending action (review_url), then poll sync_get until status is active.
7. Monitor with sync_get_status, sync_list_operations, and sync_list_issues; sync_retry_issue after fixing an issue's remediation — an issue is what blocks syncing, so that tool is also how you "retry syncing" a record someone asks about. When a person asks about one specific record ("why isn't my Airtable record syncing?"), use sync_search_records then sync_get_record_status.
8. Deletes wait for a person. A record that goes missing on one side does not get deleted on the other until someon
Protocol
Pass100/10020 / 20 pts
Connection, authentication, and protocol compatibility.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description80/100
Every connector Whalesync supports, with its auth method (API key fields vs browser OAuth) and capabilities. Start here to learn what a sync side needs.
Describe the returned information so the agent knows whether it will answer the request.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
No input fields.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Turns a paused sync on. A draft whose mappings a person has not yet reviewed fails with confirmation_required — relay the required_action's url so they can review and start it in the app. A sync still working through its initial sync fails with initial_sync_running — it turns itself on at the end, so poll instead.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
sync_id
The sync id, e.g. "sync_ab12…", from sync_list or sync_create.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "sync_activate",
"title": "Activate a sync",
"description": "Turns a paused sync on. A draft whose mappings a person has not yet reviewed fails with confirmation_required — relay the required_action's url so they can review and start it in the app. A sync still working through its initial sync fails with initial_sync_running — it turns itself on at the end, so poll instead.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"sync_id"
],
"properties": {
"sync_id": {
"type": "string",
"description": "The sync id, e.g. \"sync_ab12…\", from sync_list or sync_create."
}
}
},
"annotations": {
"title": "Activate a sync",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
A live snapshot: pending pushes and each side's polling/initializing state. Makes live calls, so it can take a few seconds — use sync_get for the cheap summary.
Describe the returned information so the agent knows whether it will answer the request.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
sync_id
The sync id, e.g. "sync_ab12…", from sync_list or sync_create.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "sync_get_status",
"title": "Get live sync status",
"description": "A live snapshot: pending pushes and each side's polling/initializing state. Makes live calls, so it can take a few seconds — use sync_get for the cheap summary.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"sync_id"
],
"properties": {
"sync_id": {
"type": "string",
"description": "The sync id, e.g. \"sync_ab12…\", from sync_list or sync_create."
}
}
},
"annotations": {
"title": "Get live sync status",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description79/100
The bases/sites/databases the credential on one side can reach, fetched live from the connected app (can take a few seconds). Reference a base by its remote id — names are not unique.
Describe the returned information so the agent knows whether it will answer the request.
Inputs50/100
1 of 2 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
sync_id
The sync id, e.g. "sync_ab12…", from sync_list or sync_create.
Clear enough to supply this argument.
side
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "sync_list_bases",
"title": "List a side's bases",
"description": "The bases/sites/databases the credential on one side can reach, fetched live from the connected app (can take a few seconds). Reference a base by its remote id — names are not unique.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"sync_id",
"side"
],
"properties": {
"side": {
"enum": [
"left",
"right"
],
"type": "string"
},
"sync_id": {
"type": "string",
"description": "The sync id, e.g. \"sync_ab12…\", from sync_list or sync_create."
}
}
},
"annotations": {
"title": "List a side's bases",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
The record-level change log for one sync, newest first: what was created, updated, or deleted, where, and why. The place to verify a sync is actually moving data.
The description explains the capability, when to use it, and what to expect.
Inputs96/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
sync_id
The sync id, e.g. "sync_ab12…", from sync_list or sync_create.
Clear enough to supply this argument.
limit
Page size, 1-100 (default 20).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
Opaque cursor from a previous page's next_cursor; omit for the first page.
Clear enough to supply this argument.
table
Filter to one table (a table_… id from sync_list_tables).
Clear enough to supply this argument.
record
Filter to one record (a rec_… id), both sides of it.
Clear enough to supply this argument.
since
Only operations after this ISO-8601 timestamp.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "sync_list_operations",
"title": "List operations",
"description": "The record-level change log for one sync, newest first: what was created, updated, or deleted, where, and why. The place to verify a sync is actually moving data.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"sync_id"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100 (default 20)."
},
"since": {
"type": "string",
"description": "Only operations after this ISO-8601 timestamp."
},
"table": {
"type": "string",
"description": "Filter to one table (a table_… id from sync_list_tables)."
},
"cursor": {
"type": "string",
"description": "Opaque cursor from a previous page's next_cursor; omit for the first page."
},
"record": {
"type": "string",
"description": "Filter to one record (a rec_… id), both sides of it."
},
"sync_id": {
"type": "string",
"description": "The sync id, e.g. \"sync_ab12…\", from sync_list or sync_create."
}
}
},
"annotations": {
"title": "List operations",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
Deletes waiting on a person for one sync. When a record goes missing on one side, Whalesync holds the delete rather than applying it to the other side, so an accidental delete or an app outage cannot destroy data. Each entry links to the record in the connected app so a person can look before deciding. Approving or ignoring is irreversible and deliberately not in this API — relay the entry's review_url. A sync that auto-approves deletes has no queue and answers delete_approval_disabled; sync_get reports which mode a sync is in before you call.
Describe the returned information so the agent knows whether it will answer the request.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
sync_id
The sync id, e.g. "sync_ab12…", from sync_list or sync_create.
Clear enough to supply this argument.
limit
Page size, 1-100 (default 20).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
Opaque cursor from a previous page's next_cursor; omit for the first page.
Clear enough to supply this argument.
state
Defaults to awaiting_review. "ignored" lists the deletes a person chose to keep the record for — dormant, but not resolved.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "sync_list_pending_deletes",
"title": "List pending deletes",
"description": "Deletes waiting on a person for one sync. When a record goes missing on one side, Whalesync holds the delete rather than applying it to the other side, so an accidental delete or an app outage cannot destroy data. Each entry links to the record in the connected app so a person can look before deciding. Approving or ignoring is irreversible and deliberately not in this API — relay the entry's review_url. A sync that auto-approves deletes has no queue and answers delete_approval_disabled; sync_get reports which mode a sync is in before you call.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"sync_id"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1-100 (default 20)."
},
"state": {
"enum": [
"awaiting_review",
"ignored"
],
"type": "string",
"description": "Defaults to awaiting_review. \"ignored\" lists the deletes a person chose to keep the record for — dormant, but not resolved."
},
"cursor": {
"type": "string",
"description": "Opaque cursor from a previous page's next_cursor; omit for the first page."
},
"sync_id": {
"type": "string",
"description": "The sync id, e.g. \"sync_ab12…\", from sync_list or sync_create."
}
}
},
"annotations": {
"title": "List pending deletes",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
Re-attempts the failed work behind an issue. An issue is what holds a record or table back, so clearing it is how syncing runs again — "retry syncing", "sync that record again" and "try it again" all mean this tool, and there is no other retry. Fix the cause (see remediation) first, or it fails the same way. When a person names a record instead of an issue, sync_search_records then sync_get_record_status name the issue blocking it; sync_list_issues lists them for a whole sync.
The description explains the capability, when to use it, and what to expect.
Inputs87/100
Input documentation gives an agent enough context to populate the arguments.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "sync_retry_issue",
"title": "Retry an issue",
"description": "Re-attempts the failed work behind an issue. An issue is what holds a record or table back, so clearing it is how syncing runs again — \"retry syncing\", \"sync that record again\" and \"try it again\" all mean this tool, and there is no other retry. Fix the cause (see remediation) first, or it fails the same way. When a person names a record instead of an issue, sync_search_records then sync_get_record_status name the issue blocking it; sync_list_issues lists them for a whole sync.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"issue_id"
],
"properties": {
"issue_id": {
"type": "string",
"description": "An iss_… id from sync_list_issues."
}
}
},
"annotations": {
"title": "Retry an issue",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
Find a record in one sync by its id in the connected app (e.g. an Airtable "rec…" id), its Whalesync rec_… id, or its display text (fuzzy). The first step when a person asks why a specific record is not syncing — take a result's id to sync_get_record_status. Exact id matches come first. Results are capped, not paginated: when has_more is true, narrow the query.
Describe the returned information so the agent knows whether it will answer the request.
Inputs81/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
sync_id
The sync id, e.g. "sync_ab12…", from sync_list or sync_create.
Clear enough to supply this argument.
query
A record id from the connected app (e.g. "recXYZ"), a rec_… Whalesync id, or display text for a fuzzy match (e.g. the value shown as the record name).
Clear enough to supply this argument.
table
Only search one table (a table_… id).
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
limit
Max results, 1-25 (default 10).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "sync_search_records",
"title": "Search records",
"description": "Find a record in one sync by its id in the connected app (e.g. an Airtable \"rec…\" id), its Whalesync rec_… id, or its display text (fuzzy). The first step when a person asks why a specific record is not syncing — take a result's id to sync_get_record_status. Exact id matches come first. Results are capped, not paginated: when has_more is true, narrow the query.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"sync_id",
"query"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 25,
"minimum": 1,
"description": "Max results, 1-25 (default 10)."
},
"query": {
"type": "string",
"description": "A record id from the connected app (e.g. \"recXYZ\"), a rec_… Whalesync id, or display text for a fuzzy match (e.g. the value shown as the record name)."
},
"table": {
"type": "string",
"description": "Only search one table (a table_… id)."
},
"sync_id": {
"type": "string",
"description": "The sync id, e.g. \"sync_ab12…\", from sync_list or sync_create."
}
}
},
"annotations": {
"title": "Search records",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Everything known about one record's sync state — the diagnosis tool for "why isn't this record syncing". Returns open issues blocking it, a pending delete awaiting a person's review, operations queued right now, per-side flags (deleted / filtered out by a sync filter / sync disabled), links to the record in both apps, and its most recent operations. queued_operations null means the queue could not be consulted, not that it is empty. For older history call sync_list_operations with record. Diagnose from the flags and issues before assuming the sync itself is broken: a filtered or sync-disabled record is excluded on purpose, and a pending delete waits for a person to approve it in the app.
The description explains the capability, when to use it, and what to expect.
Inputs94/100
Input documentation gives an agent enough context to populate the arguments.
record_id
A rec_… id (from sync_search_records), or the record's id in the connected app — then sync_id is required.
Clear enough to supply this argument.
sync_id
The sync to look in ("sync_ab12…"). Required when record_id is a connected-app id.
Clear enough to supply this argument.
table
The table to look in (a table_… id), when the same connected-app id exists in more than one.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "sync_get_record_status",
"title": "Get a record's sync status",
"description": "Everything known about one record's sync state — the diagnosis tool for \"why isn't this record syncing\". Returns open issues blocking it, a pending delete awaiting a person's review, operations queued right now, per-side flags (deleted / filtered out by a sync filter / sync disabled), links to the record in both apps, and its most recent operations. queued_operations null means the queue could not be consulted, not that it is empty. For older history call sync_list_operations with record. Diagnose from the flags and issues before assuming the sync itself is broken: a filtered or sync-disabled record is excluded on purpose, and a pending delete waits for a person to approve it in the app.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"record_id"
],
"properties": {
"table": {
"type": "string",
"description": "The table to look in (a table_… id), when the same connected-app id exists in more than one."
},
"sync_id": {
"type": "string",
"description": "The sync to look in (\"sync_ab12…\"). Required when record_id is a connected-app id."
},
"record_id": {
"type": "string",
"description": "A rec_… id (from sync_search_records), or the record's id in the connected app — then sync_id is required."
}
}
},
"annotations": {
"title": "Get a record's sync status",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Full sync details: status, both sides, open issue count, review_url, and pending_actions. When pending_actions is non-empty, relay each action's url and instruction to the person verbatim — those steps (browser sign-in, reviewing before starting) can only be done by a human.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
sync_id
The sync id, e.g. "sync_ab12…", from sync_list or sync_create.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "sync_get",
"title": "Get a sync",
"description": "Full sync details: status, both sides, open issue count, review_url, and pending_actions. When pending_actions is non-empty, relay each action's url and instruction to the person verbatim — those steps (browser sign-in, reviewing before starting) can only be done by a human.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"sync_id"
],
"properties": {
"sync_id": {
"type": "string",
"description": "The sync id, e.g. \"sync_ab12…\", from sync_list or sync_create."
}
}
},
"annotations": {
"title": "Get a sync",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Creates a draft sync between two connectors. NEVER ask the person for credentials in chat: create the sync with connector names only (no auth, no base) and it comes back with a pending_actions link per side where the person connects securely in the app — relay each link. That is the only option for OAuth connectors (the person picks the base in the browser; even a remote_id you know from another sync cannot be pre-selected), and the default for API-key connectors too; include auth inline only when the credentials were already handed to you programmatically. Validation reports the first problem it finds, so fix and retry rather than expecting every issue at once. Not idempotent: if a call fails ambiguously, check sync_list before retrying.
The description explains the capability, when to use it, and what to expect.
Inputs86/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
A name the person will recognize, e.g. "CRM sync".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
left › connector
A connector type from sync_list_connectors.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
left › auth
Credentials for API-key connectors, per the connector's auth fields from sync_list_connectors. Always optional: when omitted the sync reports a pending browser step where the person enters them securely in the app — never collect credentials in chat. OAuth connectors must omit it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
left › base
API-key connectors with inline auth only: the base/site/database to sync, by remote id (preferred) or exact name. Omit whenever auth is omitted — the person picks it in the browser.
Clear enough to supply this argument.
right › connector
A connector type from sync_list_connectors.
Clear enough to supply this argument.
right › auth
Credentials for API-key connectors, per the connector's auth fields from sync_list_connectors. Always optional: when omitted the sync reports a pending browser step where the person enters them securely in the app — never collect credentials in chat. OAuth connectors must omit it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
right › base
API-key connectors with inline auth only: the base/site/database to sync, by remote id (preferred) or exact name. Omit whenever auth is omitted — the person picks it in the browser.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "sync_create",
"title": "Create a sync",
"description": "Creates a draft sync between two connectors. NEVER ask the person for credentials in chat: create the sync with connector names only (no auth, no base) and it comes back with a pending_actions link per side where the person connects securely in the app — relay each link. That is the only option for OAuth connectors (the person picks the base in the browser; even a remote_id you know from another sync cannot be pre-selected), and the default for API-key connectors too; include auth inline only when the credentials were already handed to you programmatically. Validation reports the first problem it finds, so fix and retry rather than expecting every issue at once. Not idempotent: if a call fails ambiguously, check sync_list before retrying.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name",
"left",
"right"
],
"properties": {
"left": {
"type": "object",
"required": [
"connector"
],
"properties": {
"auth": {
"type": "object",
"description": "Credentials for API-key connectors, per the connector's auth fields from sync_list_connectors. Always optional: when omitted the sync reports a pending browser step where the person enters them securely in the app — never collect credentials in chat. OAuth connectors must omit it.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"base": {
"type": "string",
"description": "API-key connectors with inline auth only: the base/site/database to sync, by remote id (preferred) or exact name. Omit whenever auth is omitted — the person picks it in the browser."
},
"connector": {
"type": "string",
"description": "A connector type from sync_list_connectors."
}
}
},
"name": {
"type": "string",
"maxLength": 200,
"description": "A name the person will recognize, e.g. \"CRM sync\"."
},
"right": {
"type": "object",
"required": [
"connector"
],
"properties": {
"auth": {
"type": "object",
"description": "Credentials for API-key connectors, per the connector's auth fields from sync_list_connectors. Always optional: when omitted the sync reports a pending browser step where the person enters them securely in the app — never collect credentials in chat. OAuth connectors must omit it.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"base": {
"type": "string",
"description": "API-key connectors with inline auth only: the base/site/database to sync, by remote id (preferred) or exact name. Omit whenever auth is omitted — the person picks it in the browser."
},
"connector": {
"type": "string",
"description": "A connector type from sync_list_connectors."
}
}
}
}
},
"annotations": {
"title": "Create a sync",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "sync_update",
"title": "Update a sync",
"description": "Rename the sync, amend a draft side, or update credentials.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"sync_id"
],
"properties": {
"left": {
"type": "object",
"properties": {
"auth": {
"type": "object",
"description": "New credentials, revalidated live. Only for sides created with credentials, never a sign-in.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"base": {
"type": "string",
"description": "Point this side at a different base (draft syncs only)."
},
"connector": {
"type": "string",
"description": "Replace the connector on this side (draft syncs only)."
}
}
},
"name": {
"type": "string",
"maxLength": 200
},
"right": {
"type": "object",
"properties": {
"auth": {
"type": "object",
"description": "New credentials, revalidated live. Only for sides created with credentials, never a sign-in.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"base": {
"type": "string",
"description": "Point this side at a different base (draft syncs only)."
},
"connector": {
"type": "string",
"description": "Replace the connector on this side (draft syncs only)."
}
}
},
"sync_id": {
"type": "string",
"description": "The sync id, e.g. \"sync_ab12…\", from sync_list or sync_create."
}
}
},
"annotations": {
"title": "Update a sync",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "sync_delete",
"title": "Delete a sync",
"description": "Stops and deletes the sync. The connected apps and their data are not touched.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"sync_id"
],
"properties": {
"sync_id": {
"type": "string",
"description": "The sync id, e.g. \"sync_ab12…\", from sync_list or sync_create."
}
}
},
"annotations": {
"title": "Delete a sync",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description83/100
The tables on one side of the sync, from Whalesync's cached schema (fetched automatically the first time). Pass refresh: true after changing the connected app's schema; refresh requires the sync to be off. May block for up to a minute while a fetch completes.
Describe the returned information so the agent knows whether it will answer the request.
Inputs67/100
2 of 3 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
sync_id
The sync id, e.g. "sync_ab12…", from sync_list or sync_create.
Clear enough to supply this argument.
side
Which side of the sync.
Clear enough to supply this argument.
refresh
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "sync_list_tables",
"title": "List a side's tables",
"description": "The tables on one side of the sync, from Whalesync's cached schema (fetched automatically the first time). Pass refresh: true after changing the connected app's schema; refresh requires the sync to be off. May block for up to a minute while a fetch completes.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"sync_id",
"side"
],
"properties": {
"side": {
"enum": [
"left",
"right"
],
"type": "string",
"description": "Which side of the sync."
},
"refresh": {
"type": "boolean"
},
"sync_id": {
"type": "string",
"description": "The sync id, e.g. \"sync_ab12…\", from sync_list or sync_create."
}
}
},
"annotations": {
"title": "List a side's tables",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description86/100
The fields of one table with type metadata, from the cached schema. Reference the table by table_… id, remote id, or exact name — resolution tries them in that order, so when the same string names tables on both sides (Postgres remote ids are bare table names), pass side to pin which one you mean. May block for up to a minute while a fetch completes. When choosing what to map: fields with write: false (formulas, created-time, Whalesync's synthesized record id, …) can only be the SOURCE side of a one-way mapping — include them only when the person wants that value in the other app (syncing a record id across is a common, legitimate case). Skip fields whose type_details.mapping_disabled is true, and map link/reference fields only when the table they point at is also mapped.
Describe the returned information so the agent knows whether it will answer the request.
Inputs75/100
3 of 4 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
sync_id
The sync id, e.g. "sync_ab12…", from sync_list or sync_create.
Clear enough to supply this argument.
table
A table_… id, remote id, or exact table name.
Clear enough to supply this argument.
side
Restrict resolution to one side; recommended whenever names collide.
Clear enough to supply this argument.
refresh
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "sync_list_fields",
"title": "List a table's fields",
"description": "The fields of one table with type metadata, from the cached schema. Reference the table by table_… id, remote id, or exact name — resolution tries them in that order, so when the same string names tables on both sides (Postgres remote ids are bare table names), pass side to pin which one you mean. May block for up to a minute while a fetch completes. When choosing what to map: fields with write: false (formulas, created-time, Whalesync's synthesized record id, …) can only be the SOURCE side of a one-way mapping — include them only when the person wants that value in the other app (syncing a record id across is a common, legitimate case). Skip fields whose type_details.mapping_disabled is true, and map link/reference fields only when the table they point at is also mapped.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"sync_id",
"table"
],
"properties": {
"side": {
"enum": [
"left",
"right"
],
"type": "string",
"description": "Restrict resolution to one side; recommended whenever names collide."
},
"table": {
"type": "string",
"description": "A table_… id, remote id, or exact table name."
},
"refresh": {
"type": "boolean"
},
"sync_id": {
"type": "string",
"description": "The sync id, e.g. \"sync_ab12…\", from sync_list or sync_create."
}
}
},
"annotations": {
"title": "List a table's fields",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
The sync's declarative mappings document plus its revision. Keep the revision and send it back with sync_update_mappings so a concurrent edit fails instead of being silently overwritten. Also the place to find a table pair's sync filter and advanced settings when asked why some records never sync.
Describe the returned information so the agent knows whether it will answer the request.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
sync_id
The sync id, e.g. "sync_ab12…", from sync_list or sync_create.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "sync_get_mappings",
"title": "Get the mappings",
"description": "The sync's declarative mappings document plus its revision. Keep the revision and send it back with sync_update_mappings so a concurrent edit fails instead of being silently overwritten. Also the place to find a table pair's sync filter and advanced settings when asked why some records never sync.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"sync_id"
],
"properties": {
"sync_id": {
"type": "string",
"description": "The sync id, e.g. \"sync_ab12…\", from sync_list or sync_create."
}
}
},
"annotations": {
"title": "Get the mappings",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
Replaces the whole mappings document (fetch with sync_get_mappings, modify, send back — there is no partial edit). Validate first with sync_validate_mappings. Referenced tables whose fields were never fetched are fetched during the call, so a first update can take a few seconds. The sync must be paused or draft.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Input documentation gives an agent enough context to populate the arguments.
sync_id
The sync id, e.g. "sync_ab12…", from sync_list or sync_create.
Clear enough to supply this argument.
tables
The full mappings document's tables array. Each tables[] entry: {left_table, right_table, direction: "left_to_right"|"right_to_left"|"two_way", left?: {view?, record_delete_behavior?}, right?: {…}, fields: [{left_field, right_field, direction?}]}. Table/field references are remote ids (preferred), prefixed ids, or exact names — or {"create": {"name": "…"}} to have Whalesync create the table/field on the other side (a created table requires all its fields to be creates too; only one side of any pair may be a create). view is REQUIRED for sides whose table reports views in sync_list_tables (Airtable, Salesforce): pass a value from views.options, or "ALL_RECORDS" for the whole table — omitting view CLEARS a prior selection. record_delete_behavior is "sync" (default) or "do_nothing", and says what a delete on the OTHER side does to records in this table — "do_nothing" is Delete Protection for this table. A pair may also report filter and advanced_settings: these are READ-ONLY (set in the app, ignored on write) but explain why records are skipped — each carries a plain-English summary/description and a docs link.
Clear enough to supply this argument.
revision
The revision from sync_get_mappings; the edit fails if it went stale.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "sync_update_mappings",
"title": "Replace the mappings",
"description": "Replaces the whole mappings document (fetch with sync_get_mappings, modify, send back — there is no partial edit). Validate first with sync_validate_mappings. Referenced tables whose fields were never fetched are fetched during the call, so a first update can take a few seconds. The sync must be paused or draft.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"sync_id",
"tables"
],
"properties": {
"tables": {
"type": "array",
"items": {},
"description": "The full mappings document's tables array. Each tables[] entry: {left_table, right_table, direction: \"left_to_right\"|\"right_to_left\"|\"two_way\", left?: {view?, record_delete_behavior?}, right?: {…}, fields: [{left_field, right_field, direction?}]}. Table/field references are remote ids (preferred), prefixed ids, or exact names — or {\"create\": {\"name\": \"…\"}} to have Whalesync create the table/field on the other side (a created table requires all its fields to be creates too; only one side of any pair may be a create). view is REQUIRED for sides whose table reports views in sync_list_tables (Airtable, Salesforce): pass a value from views.options, or \"ALL_RECORDS\" for the whole table — omitting view CLEARS a prior selection. record_delete_behavior is \"sync\" (default) or \"do_nothing\", and says what a delete on the OTHER side does to records in this table — \"do_nothing\" is Delete Protection for this table. A pair may also report filter and advanced_settings: these are READ-ONLY (set in the app, ignored on write) but explain why records are skipped — each carries a plain-English summary/description and a docs link."
},
"sync_id": {
"type": "string",
"description": "The sync id, e.g. \"sync_ab12…\", from sync_list or sync_create."
},
"revision": {
"type": "string",
"description": "The revision from sync_get_mappings; the edit fails if it went stale."
}
}
},
"annotations": {
"title": "Replace the mappings",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Checks a candidate mappings document (or the stored one, if tables is omitted) without changing anything. Empty issues means valid. Can take a few seconds if referenced tables need a schema fetch.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
sync_id
The sync id, e.g. "sync_ab12…", from sync_list or sync_create.
Clear enough to supply this argument.
tables
The full mappings document's tables array. Each tables[] entry: {left_table, right_table, direction: "left_to_right"|"right_to_left"|"two_way", left?: {view?, record_delete_behavior?}, right?: {…}, fields: [{left_field, right_field, direction?}]}. Table/field references are remote ids (preferred), prefixed ids, or exact names — or {"create": {"name": "…"}} to have Whalesync create the table/field on the other side (a created table requires all its fields to be creates too; only one side of any pair may be a create). view is REQUIRED for sides whose table reports views in sync_list_tables (Airtable, Salesforce): pass a value from views.options, or "ALL_RECORDS" for the whole table — omitting view CLEARS a prior selection. record_delete_behavior is "sync" (default) or "do_nothing", and says what a delete on the OTHER side does to records in this table — "do_nothing" is Delete Protection for this table. A pair may also report filter and advanced_settings: these are READ-ONLY (set in the app, ignored on write) but explain why records are skipped — each carries a plain-English summary/description and a docs link.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "sync_validate_mappings",
"title": "Validate mappings",
"description": "Checks a candidate mappings document (or the stored one, if tables is omitted) without changing anything. Empty issues means valid. Can take a few seconds if referenced tables need a schema fetch.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"sync_id"
],
"properties": {
"tables": {
"type": "array",
"items": {},
"description": "The full mappings document's tables array. Each tables[] entry: {left_table, right_table, direction: \"left_to_right\"|\"right_to_left\"|\"two_way\", left?: {view?, record_delete_behavior?}, right?: {…}, fields: [{left_field, right_field, direction?}]}. Table/field references are remote ids (preferred), prefixed ids, or exact names — or {\"create\": {\"name\": \"…\"}} to have Whalesync create the table/field on the other side (a created table requires all its fields to be creates too; only one side of any pair may be a create). view is REQUIRED for sides whose table reports views in sync_list_tables (Airtable, Salesforce): pass a value from views.options, or \"ALL_RECORDS\" for the whole table — omitting view CLEARS a prior selection. record_delete_behavior is \"sync\" (default) or \"do_nothing\", and says what a delete on the OTHER side does to records in this table — \"do_nothing\" is Delete Protection for this table. A pair may also report filter and advanced_settings: these are READ-ONLY (set in the app, ignored on write) but explain why records are skipped — each carries a plain-English summary/description and a docs link."
},
"sync_id": {
"type": "string",
"description": "The sync id, e.g. \"sync_ab12…\", from sync_list or sync_create."
}
}
},
"annotations": {
"title": "Validate mappings",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description79/100
The connectors usable for live exports, each with the roles it can play (source, destination) and its auth. A separate registry from sync_list_connectors — the same brand can differ per surface.
Describe the returned information so the agent knows whether it will answer the request.
Inputs100/100
This tool declares no inputs, so argument descriptions are not needed.
No input fields.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "live_export_list_connectors",
"title": "List live export connectors",
"description": "The connectors usable for live exports, each with the roles it can play (source, destination) and its auth. A separate registry from sync_list_connectors — the same brand can differ per surface.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
},
"annotations": {
"title": "List live export connectors",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Full live export details: status, both sides, schedule, last run, and pending_actions. When pending_actions is non-empty, relay each action's url and instruction to the person verbatim — browser sign-ins can only be done by a human.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
live_export_id
The live export id, e.g. "lex_ab12…", from live_export_list or live_export_create.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
{
"title": "Get a live export",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "live_export_get",
"title": "Get a live export",
"description": "Full live export details: status, both sides, schedule, last run, and pending_actions. When pending_actions is non-empty, relay each action's url and instruction to the person verbatim — browser sign-ins can only be done by a human.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"live_export_id"
],
"properties": {
"live_export_id": {
"type": "string",
"description": "The live export id, e.g. \"lex_ab12…\", from live_export_list or live_export_create."
}
}
},
"annotations": {
"title": "Get a live export",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
Creates a draft live export: a one-way scheduled copy from a source app into destination tables the export creates. NEVER ask the person for credentials in chat: create with connector names only and the export comes back with a pending_actions link per side where the person connects securely in the app — relay each link. Include auth inline only for api_key connectors whose credentials were already handed to you programmatically. Not idempotent: if a call fails ambiguously, check live_export_list before retrying.
Describe the returned information so the agent knows whether it will answer the request.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
Defaults to "<Source> to <Destination>".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
source › connector
A connector type from live_export_list_connectors.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
source › auth
Credentials for api_key connectors, per the connector's auth fields from live_export_list_connectors. Always optional: when omitted the export reports a pending browser step where the person enters them securely in the app — never collect credentials in chat. OAuth connectors must omit it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
destination › connector
A connector type from live_export_list_connectors.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
destination › auth
Credentials for api_key connectors, per the connector's auth fields from live_export_list_connectors. Always optional: when omitted the export reports a pending browser step where the person enters them securely in the app — never collect credentials in chat. OAuth connectors must omit it.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations100/100
All four behavior hints are declared.
{
"title": "Create a live export",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "live_export_create",
"title": "Create a live export",
"description": "Creates a draft live export: a one-way scheduled copy from a source app into destination tables the export creates. NEVER ask the person for credentials in chat: create with connector names only and the export comes back with a pending_actions link per side where the person connects securely in the app — relay each link. Include auth inline only for api_key connectors whose credentials were already handed to you programmatically. Not idempotent: if a call fails ambiguously, check live_export_list before retrying.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"source",
"destination"
],
"properties": {
"name": {
"type": "string",
"maxLength": 200,
"description": "Defaults to \"<Source> to <Destination>\"."
},
"source": {
"type": "object",
"required": [
"connector"
],
"properties": {
"auth": {
"type": "object",
"description": "Credentials for api_key connectors, per the connector's auth fields from live_export_list_connectors. Always optional: when omitted the export reports a pending browser step where the person enters them securely in the app — never collect credentials in chat. OAuth connectors must omit it.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"connector": {
"type": "string",
"description": "A connector type from live_export_list_connectors."
}
},
"description": "The app records are read from."
},
"destination": {
"type": "object",
"required": [
"connector"
],
"properties": {
"auth": {
"type": "object",
"description": "Credentials for api_key connectors, per the connector's auth fields from live_export_list_connectors. Always optional: when omitted the export reports a pending browser step where the person enters them securely in the app — never collect credentials in chat. OAuth connectors must omit it.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"connector": {
"type": "string",
"description": "A connector type from live_export_list_connectors."
}
},
"description": "The app tables are written into."
}
}
},
"annotations": {
"title": "Create a live export",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description72/100
Rename it, complete an api_key side's withheld auth, or set the destination's location (where created tables live, from live_export_list_locations).
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs80/100
4 of 5 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
live_export_id
The live export id, e.g. "lex_ab12…", from live_export_list or live_export_create.
Clear enough to supply this argument.
name
Not provided
Missing description. Explain what this value means and how to supply it.
source › auth
Credentials for api_key connectors, per the connector's auth fields from live_export_list_connectors. Always optional: when omitted the export reports a pending browser step where the person enters them securely in the app — never collect credentials in chat. OAuth connectors must omit it.
Clear enough to supply this argument.
destination › auth
Credentials for api_key connectors, per the connector's auth fields from live_export_list_connectors. Always optional: when omitted the export reports a pending browser step where the person enters them securely in the app — never collect credentials in chat. OAuth connectors must omit it.
Clear enough to supply this argument.
destination › location
A location id from live_export_list_locations.
Clear enough to supply this argument.
Annotations100/100
All four behavior hints are declared.
{
"title": "Update a live export",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "live_export_update",
"title": "Update a live export",
"description": "Rename it, complete an api_key side's withheld auth, or set the destination's location (where created tables live, from live_export_list_locations).",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"live_export_id"
],
"properties": {
"name": {
"type": "string",
"maxLength": 200
},
"source": {
"type": "object",
"properties": {
"auth": {
"type": "object",
"description": "Credentials for api_key connectors, per the connector's auth fields from live_export_list_connectors. Always optional: when omitted the export reports a pending browser step where the person enters them securely in the app — never collect credentials in chat. OAuth connectors must omit it.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
}
}
},
"destination": {
"type": "object",
"properties": {
"auth": {
"type": "object",
"description": "Credentials for api_key connectors, per the connector's auth fields from live_export_list_connectors. Always optional: when omitted the export reports a pending browser step where the person enters them securely in the app — never collect credentials in chat. OAuth connectors must omit it.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"location": {
"type": "string",
"description": "A location id from live_export_list_locations."
}
}
},
"live_export_id": {
"type": "string",
"description": "The live export id, e.g. \"lex_ab12…\", from live_export_list or live_export_create."
}
}
},
"annotations": {
"title": "Update a live export",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
Deletes the live export and its schedule. Tables already created in the destination stay put.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
live_export_id
The live export id, e.g. "lex_ab12…", from live_export_list or live_export_create.
Clear enough to supply this argument.
Annotations100/100
All four behavior hints are declared.
{
"title": "Delete a live export",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "live_export_delete",
"title": "Delete a live export",
"description": "Deletes the live export and its schedule. Tables already created in the destination stay put.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"live_export_id"
],
"properties": {
"live_export_id": {
"type": "string",
"description": "The live export id, e.g. \"lex_ab12…\", from live_export_list or live_export_create."
}
}
},
"annotations": {
"title": "Delete a live export",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "live_export_list_source_tables",
"title": "List source tables",
"description": "The exportable tables in the source app. Live — the connector enumerates them, so it can be slow.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"live_export_id"
],
"properties": {
"live_export_id": {
"type": "string",
"description": "The live export id, e.g. \"lex_ab12…\", from live_export_list or live_export_create."
}
}
},
"annotations": {
"title": "List source tables",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description84/100
One source table's exportable fields, each with the name and type it would get in the destination. Pick from these when writing mappings — field types are planned by the server, never chosen by you.
Describe the returned information so the agent knows whether it will answer the request.
Inputs96/100
Input documentation gives an agent enough context to populate the arguments.
live_export_id
The live export id, e.g. "lex_ab12…", from live_export_list or live_export_create.
Clear enough to supply this argument.
table_id
An id from live_export_list_source_tables.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "live_export_list_source_fields",
"title": "List source fields",
"description": "One source table's exportable fields, each with the name and type it would get in the destination. Pick from these when writing mappings — field types are planned by the server, never chosen by you.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"live_export_id",
"table_id"
],
"properties": {
"table_id": {
"type": "string",
"description": "An id from live_export_list_source_tables."
},
"live_export_id": {
"type": "string",
"description": "The live export id, e.g. \"lex_ab12…\", from live_export_list or live_export_create."
}
}
},
"annotations": {
"title": "List source fields",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description73/100
Where the destination can host created tables (an Airtable base, a Notion parent page). Pick one with live_export_update. Only destinations with pickable locations return any.
Describe the returned information so the agent knows whether it will answer the request.
Inputs75/100
Explain the meaning of this value, not just its name.
live_export_id
The live export id, e.g. "lex_ab12…", from live_export_list or live_export_create.
Clear enough to supply this argument.
search
Server-side search, for destinations with capped lists.
Explain the meaning of this value, not just its name.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description82/100
The working mappings document: which source tables copy into which to-be-created destination tables, field by field. Carries the revision to send back on live_export_update_mappings.
Describe the returned information so the agent knows whether it will answer the request.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
live_export_id
The live export id, e.g. "lex_ab12…", from live_export_list or live_export_create.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "live_export_get_mappings",
"title": "Get live export mappings",
"description": "The working mappings document: which source tables copy into which to-be-created destination tables, field by field. Carries the revision to send back on live_export_update_mappings.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"live_export_id"
],
"properties": {
"live_export_id": {
"type": "string",
"description": "The live export id, e.g. \"lex_ab12…\", from live_export_list or live_export_create."
}
}
},
"annotations": {
"title": "Get live export mappings",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Declarative full replace of the mappings document. Edits the working draft only — nothing is created in the destination until live_export_save. The document: {"tables": [{"source_table", "destination_table": {"create": {"name"}}, "fields": [{"source_field", "destination_field": {"create": {"name", "primary?"}}}]}]}. Reference source tables/fields by the ids the list tools return. Send back the revision you read — a stale revision fails instead of overwriting someone's edit.
The description explains the capability, when to use it, and what to expect.
Inputs72/100
Explain the meaning of this value, not just its name.
live_export_id
The live export id, e.g. "lex_ab12…", from live_export_list or live_export_create.
Clear enough to supply this argument.
tables
The full document — see the description.
Explain the meaning of this value, not just its name.
revision
The revision from live_export_get_mappings.
Explain what happens when this optional value is omitted.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "live_export_update_mappings",
"title": "Replace live export mappings",
"description": "Declarative full replace of the mappings document. Edits the working draft only — nothing is created in the destination until live_export_save. The document: {\"tables\": [{\"source_table\", \"destination_table\": {\"create\": {\"name\"}}, \"fields\": [{\"source_field\", \"destination_field\": {\"create\": {\"name\", \"primary?\"}}}]}]}. Reference source tables/fields by the ids the list tools return. Send back the revision you read — a stale revision fails instead of overwriting someone's edit.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"live_export_id",
"tables"
],
"properties": {
"tables": {
"type": "array",
"items": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"description": "The full document — see the description."
},
"revision": {
"type": "string",
"description": "The revision from live_export_get_mappings."
},
"live_export_id": {
"type": "string",
"description": "The live export id, e.g. \"lex_ab12…\", from live_export_list or live_export_create."
}
}
},
"annotations": {
"title": "Replace live export mappings",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Create the mapped tables and fields in the destination app, then apply the runnable pipeline. This is the apply point: mapping edits change nothing until a save lands. The call stays on the line while the save runs (usually well under a minute), streaming progress; a still-running result says to call live_export_get_save for the outcome. succeeded is authoritative — it also requires unsaved_changes to be false on the export. Runs overwrite the destination tables this export manages — treat destination data as replaceable before pointing an export at anything a person cares about.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
live_export_id
The live export id, e.g. "lex_ab12…", from live_export_list or live_export_create.
Clear enough to supply this argument.
Annotations100/100
All four behavior hints are declared.
{
"title": "Save a live export",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "live_export_save",
"title": "Save a live export",
"description": "Create the mapped tables and fields in the destination app, then apply the runnable pipeline. This is the apply point: mapping edits change nothing until a save lands. The call stays on the line while the save runs (usually well under a minute), streaming progress; a still-running result says to call live_export_get_save for the outcome. succeeded is authoritative — it also requires unsaved_changes to be false on the export. Runs overwrite the destination tables this export manages — treat destination data as replaceable before pointing an export at anything a person cares about.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"live_export_id"
],
"properties": {
"live_export_id": {
"type": "string",
"description": "The live export id, e.g. \"lex_ab12…\", from live_export_list or live_export_create."
}
}
},
"annotations": {
"title": "Save a live export",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
The latest save: how it ended (with per-table errors), staying on the line while one is still running. succeeded is authoritative — it is only reported when no edits remain unsaved. If it returns a still-running state, simply call it again.
Describe the returned information so the agent knows whether it will answer the request.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
live_export_id
The live export id, e.g. "lex_ab12…", from live_export_list or live_export_create.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
{
"title": "Await a live export save",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "live_export_get_save",
"title": "Await a live export save",
"description": "The latest save: how it ended (with per-table errors), staying on the line while one is still running. succeeded is authoritative — it is only reported when no edits remain unsaved. If it returns a still-running state, simply call it again.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"live_export_id"
],
"properties": {
"live_export_id": {
"type": "string",
"description": "The live export id, e.g. \"lex_ab12…\", from live_export_list or live_export_create."
}
}
},
"annotations": {
"title": "Await a live export save",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description79/100
The export's cadence and on/off switch, plus allowed_cadences from the person's plan. There is no pause/activate — the schedule IS the lifecycle switch.
Describe the returned information so the agent knows whether it will answer the request.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
live_export_id
The live export id, e.g. "lex_ab12…", from live_export_list or live_export_create.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
{
"title": "Get a live export schedule",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "live_export_get_schedule",
"title": "Get a live export schedule",
"description": "The export's cadence and on/off switch, plus allowed_cadences from the person's plan. There is no pause/activate — the schedule IS the lifecycle switch.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"live_export_id"
],
"properties": {
"live_export_id": {
"type": "string",
"description": "The live export id, e.g. \"lex_ab12…\", from live_export_list or live_export_create."
}
}
},
"annotations": {
"title": "Get a live export schedule",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
Turn the export on or off and set its cadence. Creates the schedule on first use; missing fields keep their current values. Requires a saved export. Runs overwrite the destination tables this export manages — treat destination data as replaceable before pointing an export at anything a person cares about.
The description explains the capability, when to use it, and what to expect.
Inputs69/100
3 of 4 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
live_export_id
The live export id, e.g. "lex_ab12…", from live_export_list or live_export_create.
Clear enough to supply this argument.
enabled
The on/off switch. live_export_trigger works even while off.
Clear enough to supply this argument.
cadence
How often scheduled runs fire. Cadences above the plan are rejected — see allowed_cadences.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
timezone
Not provided
Missing description. Explain what this value means and how to supply it.
Annotations100/100
All four behavior hints are declared.
{
"title": "Update a live export schedule",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "live_export_update_schedule",
"title": "Update a live export schedule",
"description": "Turn the export on or off and set its cadence. Creates the schedule on first use; missing fields keep their current values. Requires a saved export. Runs overwrite the destination tables this export manages — treat destination data as replaceable before pointing an export at anything a person cares about.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"live_export_id"
],
"properties": {
"cadence": {
"enum": [
"every_10_minutes",
"every_30_minutes",
"hourly",
"daily"
],
"type": "string",
"description": "How often scheduled runs fire. Cadences above the plan are rejected — see allowed_cadences."
},
"enabled": {
"type": "boolean",
"description": "The on/off switch. live_export_trigger works even while off."
},
"timezone": {
"type": "string",
"maxLength": 64
},
"live_export_id": {
"type": "string",
"description": "The live export id, e.g. \"lex_ab12…\", from live_export_list or live_export_create."
}
}
},
"annotations": {
"title": "Update a live export schedule",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "live_export_get_status",
"title": "Get live export status",
"description": "The live view: whether a run is in flight right now, and when the next scheduled run fires.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"live_export_id"
],
"properties": {
"live_export_id": {
"type": "string",
"description": "The live export id, e.g. \"lex_ab12…\", from live_export_list or live_export_create."
}
}
},
"annotations": {
"title": "Get live export status",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Run the export now, regardless of the schedule. One run at a time — a trigger while one is active returns run_in_progress. Unsaved mapping edits return the unsaved_changes conflict (the run would use the last-saved pipeline, not them): live_export_save first, or — only if the person explicitly wants the old pipeline — pass force. Runs overwrite the destination tables this export manages — treat destination data as replaceable before pointing an export at anything a person cares about.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
live_export_id
The live export id, e.g. "lex_ab12…", from live_export_list or live_export_create.
Clear enough to supply this argument.
force
Run despite unsaved mapping edits (using the last-saved pipeline). Ask the person first.
Clear enough to supply this argument.
Annotations100/100
All four behavior hints are declared.
{
"title": "Trigger a live export run",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": true
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "live_export_trigger",
"title": "Trigger a live export run",
"description": "Run the export now, regardless of the schedule. One run at a time — a trigger while one is active returns run_in_progress. Unsaved mapping edits return the unsaved_changes conflict (the run would use the last-saved pipeline, not them): live_export_save first, or — only if the person explicitly wants the old pipeline — pass force. Runs overwrite the destination tables this export manages — treat destination data as replaceable before pointing an export at anything a person cares about.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"live_export_id"
],
"properties": {
"force": {
"type": "boolean",
"description": "Run despite unsaved mapping edits (using the last-saved pipeline). Ask the person first."
},
"live_export_id": {
"type": "string",
"description": "The live export id, e.g. \"lex_ab12…\", from live_export_list or live_export_create."
}
}
},
"annotations": {
"title": "Trigger a live export run",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description80/100
One export's recent runs, newest first — the monitoring surface (live exports have runs, not issues; a failed run's error is the diagnostic). History is retention-bounded.
Describe the returned information so the agent knows whether it will answer the request.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
live_export_id
The live export id, e.g. "lex_ab12…", from live_export_list or live_export_create.
Clear enough to supply this argument.
limit
Page size, 1-25 (default 10).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
cursor
Opaque cursor from a previous page's next_cursor; omit for the first page.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description68/100
One run with its ordered steps (pull → map → write) — where a failed run explains itself.
Describe the returned information so the agent knows whether it will answer the request.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
run_id
The run id, e.g. "run_ab12.cd34…", from live_export_list_runs or a trigger.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
{
"title": "Get a live export run",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "live_export_get_run",
"title": "Get a live export run",
"description": "One run with its ordered steps (pull → map → write) — where a failed run explains itself.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"run_id"
],
"properties": {
"run_id": {
"type": "string",
"description": "The run id, e.g. \"run_ab12.cd34…\", from live_export_list_runs or a trigger."
}
}
},
"annotations": {
"title": "Get a live export run",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
Stop an in-flight run. A run that already finished returns run_not_active.
Describe the returned information so the agent knows whether it will answer the request.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
run_id
The run id, e.g. "run_ab12.cd34…", from live_export_list_runs or a trigger.
Clear enough to supply this argument.
Annotations100/100
All four behavior hints are declared.
{
"title": "Cancel a live export run",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "live_export_cancel_run",
"title": "Cancel a live export run",
"description": "Stop an in-flight run. A run that already finished returns run_not_active.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"run_id"
],
"properties": {
"run_id": {
"type": "string",
"description": "The run id, e.g. \"run_ab12.cd34…\", from live_export_list_runs or a trigger."
}
}
},
"annotations": {
"title": "Cancel a live export run",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
The happy-path compass for live exports: given where an export actually is, the ordered next steps — including the browser connection steps only a person can do (relay those verbatim). Call it with no arguments to get oriented, or whenever unsure.
Describe the returned information so the agent knows whether it will answer the request.
Inputs50/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
live_export_id
Omit to get oriented across the account.
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
{
"title": "What's next for a live export",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "live_export_whats_next",
"title": "What's next for a live export",
"description": "The happy-path compass for live exports: given where an export actually is, the ordered next steps — including the browser connection steps only a person can do (relay those verbatim). Call it with no arguments to get oriented, or whenever unsure.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"live_export_id": {
"type": "string",
"description": "Omit to get oriented across the account."
}
}
},
"annotations": {
"title": "What's next for a live export",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Reports where a sync is in the setup flow and the recommended next steps, including any action only a person can do (relay those verbatim). Call it with no arguments to get oriented, or whenever unsure.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
sync_id
The sync id, e.g. "sync_ab12…", from sync_list or sync_create.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
{
"title": "What should I do next?",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
Output schema0/100
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "sync_whats_next",
"title": "What should I do next?",
"description": "Reports where a sync is in the setup flow and the recommended next steps, including any action only a person can do (relay those verbatim). Call it with no arguments to get oriented, or whenever unsure.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"sync_id": {
"type": "string",
"description": "The sync id, e.g. \"sync_ab12…\", from sync_list or sync_create."
}
}
},
"annotations": {
"title": "What should I do next?",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
Loading score analytics…
Put your MCP to the test
A few tasks worth trying with this server, chosen from its reviewed tools. These have not been run.
01List syncsThe account's syncs, newest first.
02List connectorsEvery connector Whalesync supports, with its auth method (API key fields vs browser OAuth) and capabilities.
03List live exportsThe account's live exports, newest first.
04Search recordsFind a record in one sync by its id in the connected app (e.g.
05Get a syncFull sync details: status, both sides, open issue count, review_url, and pending_actions.
Want to run these tasks against your MCP server with us?
activate_synccreate_syncdelete_syncget_issueget_mappingsget_operationget_record_statusget_syncget_sync_statuslist_baseslist_connectorslist_fields+12 more
Whalesync setup, tools, quality score, publishing readiness, and alternatives.
How do I add Whalesync to Claude, ChatGPT, or Cursor?
Add Whalesync to Claude, ChatGPT, or Cursor by connecting its remote MCP URL in each client's MCP settings. In Claude, add a custom connector. In ChatGPT, add an MCP app. In Cursor, add an MCP server under Settings. The MCP URL is https://api.whalesync.com/mcp. This server requires OAuth, so complete the login prompt after you connect.
Is Whalesync MCP ready for ChatGPT and Claude?
As of October 6, 2026, Whalesync scores 96/100 on Manufact's MCP publishing checklist. The scan meets ChatGPT publishing checks and meets Claude publishing checks. Passing these checks does not guarantee marketplace approval.
How clear is Whalesync's MCP tool documentation?
As of October 6, 2026, Whalesync scores 80/100 in Manufact's review of tool titles, descriptions, input and output schemas, and behavior annotations. The review covers 46 of 46 discovered tools. The quality score measures documentation clarity; runtime behavior and marketplace readiness require separate checks.
What tools does the Whalesync MCP server provide?
Whalesync lists 24 MCP tools, including activate_sync, create_sync, delete_sync, get_issue, get_mappings, get_operation, get_record_status, get_sync, get_sync_status, list_bases, list_connectors, and list_fields.
What are the best alternatives to Whalesync?
As of October 20, 2026, alternatives to Whalesync in automation-workflows on the Manufact MCP leaderboard include Sidewave Maggiordomo, Corsair Cloud, Fleet Workspace, typenode-mcp, and tinyfish.
Does Whalesync MCP require authentication?
Whalesync requires authentication. Connect it in Claude, ChatGPT, or Cursor and complete the OAuth login prompt.
How can Whalesync improve its MCP documentation?
live_export_validate_mappings is the lowest-scoring reviewed tool at 61/100. No output schema is declared. Add one for structured results so clients can interpret returned fields. Open its review for feedback and a copyable fix prompt, then rerun the documentation review after updating your tool metadata.
Who develops Whalesync?
Whalesync is developed by Whalesync. It is listed as community on the Claude connector directory.
Not your MCP?
Review any public or OAuth MCP server for protocol compatibility, tool documentation, and ChatGPT and Claude publishing readiness. No account required.