MCP Guide
The Daspire MCP Gateway lets AI assistants inspect connector specs, prepare pipeline and Reverse ETL changes, run syncs, and review approvals through the Daspire Control API.
Example local configuration:
{
"mcpServers": {
"daspire": {
"command": "node",
"args": ["/path/to/daspire-mcp/bin/daspire-mcp.js"],
"env": {
"DASPIRE_API_BASE_URL": "https://api.daspire.com/daspire/api/control/v1",
"DASPIRE_TOKEN": "<user-session-token>"
}
}
}
}
Tools
Feishu Native 1.2.0 candidate directory streams use the existing source
create/update/check/discover and pipeline tools below. Once the candidate is
activated, choose ehr_departments and/or ehr_users in source modules, then
select those streams in the connection. See the
Feishu setup guide for permission requirements
and activation status. There is no separate department or user lookup MCP tool.
-
daspire_list_workspaces -
daspire_list_connectors -
daspire_list_sources -
daspire_create_source -
daspire_check_source -
daspire_discover_source -
daspire_update_source -
daspire_set_odbc_sql_streams -
daspire_rename_source -
daspire_delete_source -
daspire_list_pipelines -
daspire_get_pipeline -
daspire_list_connections -
daspire_delete_connection -
daspire_get_connector_specQualified Clean MySQL destination specs may include read-only
capability_binding(profile,connector_id,spec_version,source_hash,runtime_projection_hash). The tool preserves this binding and the schema capability annotations unchanged. They are not customer configuration fields. Preserve explicit false values; when a mode-specific check value is omitted, the runtime uses that mode's default. Do not infer that a legacy fallback spec has the same qualified capabilities. -
daspire_get_source_oauth_consent_url -
daspire_complete_source_oauth -
daspire_prepare_pipeline -
daspire_apply_pipeline -
daspire_pause_pipeline -
daspire_resume_pipeline -
daspire_list_reverse_etl_models -
daspire_apply_reverse_etl_model -
daspire_delete_reverse_etl_model -
daspire_list_reverse_etl_destinations -
daspire_apply_reverse_etl_destination -
daspire_delete_reverse_etl_destination -
daspire_list_reverse_etl_activations -
daspire_prepare_reverse_etl_activation -
daspire_apply_reverse_etl_activation -
daspire_delete_reverse_etl_activation -
daspire_run_reverse_etl_activation -
daspire_get_reverse_etl_run -
daspire_run_sync -
daspire_get_job -
daspire_cancel_job -
daspire_list_approvals -
daspire_list_approval_policies -
daspire_approve_change -
daspire_reject_change
MCP write tools create approval proposals by default. Workspace administrators can turn approval on or off per MCP action category in Workspace Settings > Approval. Pass execution_mode: "proposal" when you explicitly want a proposal even for a category that allows direct execution.
daspire_get_pipeline reads stored metadata without refreshing discovery by default.
The underlying GET /api/control/v1/pipelines/{pipelineId} also treats an omitted
or empty withRefreshedCatalog query parameter as false.
Use daspire_rename_source for source display-name changes. The Control API preserves the existing source connectionConfiguration before applying the rename so a name-only patch does not clear connector configuration. For Amazon Ads regional rename work, include source_identifier to update connectionConfiguration.source_name at the same time:
{
"source_id": "source_123",
"name": "Ads CLEVAST Amazon EU",
"source_identifier": "CLEVAST Amazon EU",
"execution_mode": "proposal"
}
Delete connections before deleting their source. daspire_delete_source rejects sources that still have associated connections and returns a post-delete verification result after execution. Delete requests follow the workspace approval policy for the relevant MCP category. Connection deletion succeeds only after the platform confirms the connection is deleted. Native connections first stop future scheduling and require no queued or running job; cancel and reconcile any active job before retrying deletion. Historical jobs and retry snapshots are retained, while new execution is blocked. If a response is uncertain, read the connection and approval outcome before retrying.
Pipeline Creation
Before preparing a MySQL destination, use daspire_get_connector_spec for its
deployed schema and mode-specific capability metadata. Clean MySQL's
concurrent_safe_check_default_enabled_by_mode distinguishes ordinary and
legacy-raw MySQL (false) from explicitly admitted AnalyticDB (true); the scalar
default describes only the default transactional mode. Leave omitted settings
omitted, and preserve explicit customer values. A JSON Schema conditional default
is not authorization to switch a connection's mode or to modify its configuration.
Clean MySQL does not implement SSH tunnels, arbitrary JDBC parameters, cross-database writes or normalization inside the writer. Do not infer these capabilities from old-engine setup fields or MySQL protocol compatibility. See the mode capability matrix. The generic spec MCP tool passes through the schema/metadata without adding defaults; no new MySQL-specific MCP write tool or automatic configuration migration is introduced.
Use daspire_discover_source first, then copy its exact catalogId (also exposed as catalog_id by some clients) as source_catalog_id and its exact stream names into daspire_prepare_pipeline. Pass the same payload to daspire_apply_pipeline; do not invent or singularize stream names. The server binds the receipt to the selected source, rejects streams absent from that discovery, and restores the authoritative discovered stream schema before execution. Pipeline catalogs accept the product-facing flat stream shape; the Control API keeps selected streams, consumes the top-level product selected hint, and emits the runtime config.selected=true catalog shape. Product-facing schedule input is also normalized to the runtime scheduleData shape; callers should not send runtime legacy and new schedule schemas together.
Use daspire_get_pipeline with pipeline_id to read an existing connection. Set with_refreshed_catalog: true only when requesting a fresh catalog: Native-owned connections use admitted Native discovery, publish a source-bound receipt, preserve selections and leave new streams unselected. This does not start a sync or change credentials or scheduling. Saved Native sources with older unannotated specs inherit the catalog capability without a customer resave; unsupported image/protocol combinations fail explicitly.
For an existing connection, daspire_apply_pipeline accepts a payload.pipeline_id and only the intended stream/settings changes. Set execution_mode: "proposal" to require an approval proposal. The platform rehydrates schemas, validates the discovery receipt and rechecks source/image and connection metadata under the update guard before publishing future execution material. Approval execution revalidates the catalog and rejects changed approved schemas. If a response is uncertain, read the pipeline and approval outcome before submitting another edit.
{
"payload": {
"name": "Amazon BR inventory <> analytic_mysql",
"source_id": "src_source_product_id",
"destination_id": "dst_destination_product_id",
"source_catalog_id": "00000000-0000-0000-0000-000000000000",
"catalog": {
"streams": [
{
"name": "GET_FBA_INVENTORY_PLANNING_DATA",
"selected": true,
"sync_mode": "full_refresh",
"destination_sync_mode": "append",
"cursor_field": ["sku"],
"primary_key": [["sku"]]
}
]
},
"schedule_type": "basic",
"schedule": {
"type": "basic",
"interval_unit": "hours",
"interval": 12
},
"status": "active"
}
}
Use daspire_pause_pipeline and daspire_resume_pipeline for operational status changes. These tools accept pipeline_id, keep schedule/catalog/state unchanged, and do not start a sync job. Legacy runtime connection ids remain accepted during rollout, but product pipeline ids are preferred.
daspire_run_sync requires a stable command_id. Reuse that value only when
reconciling an ambiguous response. An EXECUTION_CONFLICT means a sync/reset is
already active or the registered schedule material changed; refresh pipeline/job
status before deciding whether another command is appropriate.
Connection inventory reads use the latest Native job for Native-owned pipelines,
not the old legacy job history. executionStatusSource: native identifies this
projection. latestSyncJobStatus: not_started with a null timestamp means no
Native job exists; an enabled never-run connection displays incomplete, while
configuredStatus preserves its configured status. A cancelled or failed job
is not a successful recovery. Paused configuration remains paused. Status reads
do not start jobs or modify historical results. The browser pagination helper
keeps unaffected connections visible when one Native status read is unavailable;
the affected active row displays Status unavailable (status: unavailable,
latestSyncJobStatus: unavailable, nativeScheduleState: unavailable).
configuredStatus preserves its configuration; paused connections remain paused.
Unconfirmed schedule details are cleared. These rows have an unavailable filter
and count as attention, separately from incomplete setup. A successful refresh
restores the current status automatically. No old legacy success is substituted.
Direct inventory and status reads remain fail-closed errors. The web page's
filters, pagination and health totals use the same projected results.
The same Connection read surface exposes nativeScheduleEnabled,
nativeScheduleBlocked, nativePendingDestinationCommit and retained blocked
occurrences. DESTINATION_COMMIT_RECEIPT_PENDING means the write is confirmed
but its original receipt/accounting protection has not closed. A null
lastVerifiedAt remains unreported; a ledger transition is not a new target
lookup. Current protection is independent of historical lastSkip. These are
additive read fields, with no new MCP recovery command or write permission.
waiting_source_maintenance means another pipeline using the same Source has
an unfinished maintenance or recovery operation. Keep the original job and
command identity while observing it; status reads do not start another writer
or release its protection. The existing daspire_get_job tool reports the
retained status. This reason requires the qualified execution receiver and its
schema; installing a qualification package alone does not enable it.
Freshness uses latestSyncJobUpdatedAt when available so a long-running job is
not marked delayed merely because its creation time is old. Runtime scheduling
is projected as nativeScheduleEnabled, nativeScheduleNextRunAt and
nativeScheduleMode. If an active timed product connection has a disabled
Native schedule, it is reported as incomplete with
nativeScheduleState: disabled; the UI labels this condition Schedule
disabled rather than Delayed. A successful product update reconciles the
runtime schedule to the customer's saved active/manual/frequency settings. It
does not manually start or replay a sync.
Connection Recent activity retains sync and reset history from before and
following a move to Native execution. Its history API (POST /api/control/v1/jobs/list)
returns jobs: [{job, attempts}] and totalJobCount; configId scopes the
connection and pagination.pageSize / rowOffset paginate the combined history.
Native-owned connections read retained history and job details without depending
on execution readiness or the old per-connection route list. Reads do not submit
syncs or refresh execution callbacks. An unavailable history projection is an
error, not an empty history. This does not change
the latest Native status shown in connection inventory. The MCP gateway's
existing job-detail tool is unchanged; this compatibility repair adds no tool.
Mailcoach email content
After the Native Mailcoach content-update Control release, the Mailcoach 0.0.5+
image and its matching connector spec are qualified for the source, the existing daspire_update_source tool accepts the
partial configuration {"campaign_content_mode":"omit"} for reporting without
campaign email content. inline restores the previous payload shape; separate
exposes an optional campaign_content stream that must be explicitly selected
in the connection catalog. Source settings affect every connection using that
source: check its consumers before updating it. Use execution_mode: proposal
when preparing a reviewable change.
Native saves accept only campaign_content_mode in this partial patch. They
validate every dependent connection before changing credentials or schedules.
MAILCOACH_CONTENT_RUNTIME_NOT_READY means its qualified image or schema is not
ready; MAILCOACH_CONTENT_CATALOG_CONFLICT means an archive stream is still
selected when changing away from separate. Neither error saves the change.
These modes remain full refresh. They do not enable incremental reads, change append/overwrite semantics or remove stored historical data. Reconcile unresolved historical commits before changing a recovering source. An old scheduled image does not gain content filtering merely because the configuration saves. See the Mailcoach setup guide.
ODBC Custom SQL Streams
Use daspire_set_odbc_sql_streams to switch an existing ODBC source into Custom SQL mode and replace its SQL stream definitions. The tool writes source_mode: "custom_sql" and sql_streams into the source configuration while preserving the rest of the source configuration through the Control API partial-update path.
Each stream requires a name and a read-only SELECT or WITH query. namespace is optional. cursor_field is optional and enables the SQL stream to be configured for incremental sync when the query returns that column. primary_key may be a single column string or an array of column strings; the MCP gateway normalizes it to the array format used by the ODBC connector.
{
"source_id": "source_123",
"streams": [
{
"name": "netsuite_may_transactions",
"namespace": "NetSuite2",
"query": "SELECT id, tranid, trandate FROM transaction WHERE trandate >= '2026-05-01' AND trandate < '2026-06-01'",
"cursor_field": "trandate",
"primary_key": "id"
}
],
"execution_mode": "proposal"
}
The gateway rejects empty stream lists, duplicate namespace.name keys, multi-statement SQL, and common write/DDL verbs before sending the proposal. The ODBC connector runtime still performs the final SQL validation when the source is discovered or synced.
Connector OAuth
Use daspire_get_connector_spec first to inspect whether a source requires OAuth. For source connectors such as PayPal and QuickBooks, daspire_get_source_oauth_consent_url returns the provider authorization URL through the Daspire Control API. After the provider redirects back to Daspire, pass the callback payload to daspire_complete_source_oauth.
The completion tool returns a Daspire credential_handle; provider tokens are stored by Daspire and are not returned to the MCP client. Use that handle when creating or updating the source configuration.
The Amazon Ads form uses /api/control/v1/connectors/amazon-ads/profiles/preview to list profiles with the newly returned handle before saving. This form preview intentionally has no dedicated MCP tool: MCP source configuration continues through the existing OAuth and source update tools, without adding a tool that accepts inline provider secrets.
MCP only exposes OAuth flows that are available through the Daspire Control API. Legacy runtime OAuth endpoints are internal compatibility details and are not part of the public MCP surface.
Example consent request:
{
"payload": {
"workspaceId": "workspace_uuid",
"connector_id": "conn_source_product_id",
"redirectUrl": "https://app.daspire.com/auth_flow",
"oAuthInputConfiguration": {}
}
}
Example completion request:
{
"payload": {
"workspaceId": "workspace_uuid",
"connector_id": "conn_source_product_id",
"queryParams": {
"code": "provider_code",
"state": "provider_state"
},
"redirectUrl": "https://app.daspire.com/auth_flow"
}
}
Example source credential reference after completion:
{
"connector_id": "source_definition_uuid",
"name": "PayPal transactions",
"credential_handle": "cred_source_oauth_abc123",
"configuration": {
"start_date": "2026-01-01"
}
}
Reverse ETL Configuration
Reverse ETL configuration is split into three resources:
- Models select a source table or view and define the fields, primary key, and optional cursor.
- Destinations define the operational target such as
httporclickup. - Activations connect a model to a destination, define field mappings, schedule behavior, and compile the underlying sync connection.
Create or update a model with daspire_apply_reverse_etl_model:
{
"payload": {
"name": "Warehouse customers",
"source_id": "source_123",
"stream_namespace": "analytics",
"stream_name": "customers",
"selected_fields": ["id", "email", "company"],
"primary_key": "id",
"cursor_field": "updated_at"
}
}
Create or update a destination with daspire_apply_reverse_etl_destination. Do not send provider secrets through MCP; use Daspire secure credential entry or OAuth and reference the resulting credential_handle.
ClickUp supports OAuth and personal API token entry in the Daspire UI. Both return
the same credential-handle contract for Reverse ETL. The write-only
POST /api/control/v1/credentials/clickup/api-token endpoint is intentionally not
an MCP tool, so provider tokens do not pass through model messages or tool history.
Connect in the secure UI, then use its opaque handle in MCP destination operations.
{
"payload": {
"name": "ClickUp customer list",
"type": "clickup",
"credential_handle": "cred_123",
"configuration": {
"workspace_id": "901",
"list_id": "456"
}
}
}
Create or update an activation with daspire_apply_reverse_etl_activation:
{
"payload": {
"name": "Customer updates to ClickUp",
"model_id": "revmdl_123",
"destination_id": "revdst_123",
"external_key_field": "email",
"field_mappings": {
"name": "company",
"email": "email"
},
"schedule_type": "manual",
"status": "active"
}
}
Include model_id, destination_id, or activation_id in the payload to update an existing resource. Use daspire_prepare_reverse_etl_activation to preview the compiled activation payload before creating an approval, daspire_run_reverse_etl_activation to trigger a manual run, and daspire_get_reverse_etl_run to inspect run status.
Native Qordo Activation
Use daspire_list_native_activation_sources and daspire_probe_native_activation_source for native warehouse setup checks. After a database password is entered through Daspire's secure UI, daspire_create_native_activation_source can submit the opaque credential handle and non-secret host/database configuration for approval. The MCP tool never accepts a database password. Connect Qordo tokens in the Daspire UI; raw Qordo token creation/rotation is also intentionally not exposed through MCP. daspire_check_qordo_credential accepts only a handle, and daspire_discover_qordo_resources browses workspace resources.
Existing Reverse ETL model, destination, prepare and activation tools accept type: qordo and native field policies. The manual-run tool accepts command_id; reuse it after an ambiguous response. daspire_retry_activation_run requires a stable command ID and retries only unfinished records from the original run. It follows the existing manual-run approval policy. Use daspire_list_activation_runs, daspire_get_reverse_etl_run and daspire_list_activation_rows for durable results. not_ready is not an accepted job or successful sync.
Stripe re-authentication
Use the existing source OAuth and source update tools. Stripe returns a connected credential handle only after account verification. In Native mode, apply the owned handle to the same account with unchanged name and replication settings. A scheduling reconciliation error requires support before retrying. No provider key is accepted or returned through this flow; the existing MCP surface is unchanged.
Hubstaff re-authentication
Use the existing OAuth and source update tools with an owned credential handle; do not send provider tokens through MCP. Native source save verifies the original Hubstaff account and access to every original organization, then saves both OAuth tokens while preserving source name, replication settings, checkpoints, enabled/disabled state and cadence. It does not trigger a sync or refresh a token. A SOURCE_REAUTH_RECONCILE_REQUIRED or SOURCE_REAUTH_INTERRUPTED response requires operator reconciliation before retrying. Autonomous Native refresh-token rotation is a separate requirement, not established by this save. No new MCP tool or argument is introduced.
WorldFirst own-application credentials
Enter application signing keys and tokens only through the secure Daspire source settings UI, not an MCP prompt. Choose the application's API region. Response signature verification is the default and requires the WorldFirst platform public key. Explicitly selecting response_verification=private_key_only permits read-only statement queries without that key; HTTPS certificate validation remains enabled, but response digital signatures are not verified. A configured platform key always enables verification, and an existing verified source cannot be downgraded by an update. Editing an existing Native source repairs credentials while keeping Client ID, region, account, name and replication settings unchanged; use a new source for another application/account. Saving is not a successful provider check or sync. Reconciliation errors require support before retrying. No raw-key MCP tool is added intentionally; Daspire-managed WorldFirst authorization remains unavailable until provider onboarding and the complete authorization flow are verified.
Feishu EHR employee roster
For an EHR-enabled source, use the existing source configuration tools with
modules: ["ehr"] and the connection
catalog stream ehr_employees in full_refresh mode. Discover the current source
catalog after configuration; do not copy Approval's default stream list. EHR
requires an approved custom app and a tenant token with employee roster access.
Source settings affect all connections using that source, so keep a dedicated HR
source when the roster has a different access scope or reporting destination.
The existing source configuration and discovery APIs use the Native setup bridge; a separate MCP tool is not planned. Release-owned registry schema publication remains a host operator capability and is not exposed as a customer MCP tool. See the Feishu setup guide for snapshot semantics and downstream validation.
Source setup
Use daspire_create_source with a connector ID, name, configuration and a stable
idempotency_key. Reuse that key when retrying the same creation; use a new key
for a separate source. Supply credentials through credential_handle. Workspace
approval settings still apply. daspire_check_source verifies access, and
daspire_discover_source retrieves stream schemas without starting a sync.
For the Feishu employee roster, create a separate source with modules: ["ehr"];
keep existing approval sources and their selected streams unchanged.
daspire_reuse_native_activation_warehouse accepts name, destination_id, and optional execution_mode. It creates a Native read reference to an existing scoped MySQL warehouse credential binding. It does not accept passwords or return destination credentials. Normal workspace approvals and Native read compatibility checks apply. Use daspire_probe_native_activation_source to check and discover the returned source before configuring an Activation.
Native sync queue status
Native jobs waiting to start or retry return pending. The server's
state_reason distinguishes queued, starting, waiting_retry, waiting_destination, and
waiting_source_spool (temporary source-storage capacity is unavailable).
createdAt records creation, and is not evidence that execution started;
startedAt is absent until a runtime start is known. Connections expose
hasActiveJob separately from isSyncing, and queued jobs keep Sync disabled.
A completed partial_success remains a partial result. Use the same original
command_id after an uncertain submission; do not create another sync to check
progress. Queue counts are observations, not a promised position or ETA.
SOURCE_SPOOL_CAPACITY_EXHAUSTED means a running source reached its qualified
temporary-storage limit. Its retained input is not proof of a destination commit.
This terminal result differs from waiting_source_spool, which waits before
source admission. Check the original job and its recovery status; do not submit
another sync automatically or treat it as a destination authentication failure.
Native jobs also expose state_revision, queued_at, starting_at,
process_started_at, finished_at, wait_reason, and observed_at when known.
Use the revision to identify stale observations. Unknown process start times
remain absent.
Pipeline listing also returns optional nativeScheduleLastSkip: scheduledFor
and observedAt are epoch seconds, and reason is ACTIVE_EXECUTION,
OCCURRENCE_OWNED_BY_RECOVERY, or AMBIGUOUS_DESTINATION_COMMIT. The latter
means the runtime advanced the cadence without creating a job because the same
pipeline has an unresolved destination outcome. Null means no observation is
available. This is the latest recorded skipped occurrence, retained across later
successful runs and schedule edits; it is not a failed job, a queue position, or
a catch-up request. The gateway forwards this server-owned metadata without
inferring a reason.
Use daspire_cancel_job with the opaque product job_id returned by job history.
Use daspire_get_job and the approval tools to read back an uncertain result.
Direct and approved cancellations use the shared runtime adapter and the existing
workspace approval policy. Cancel an active job and verify its terminal state before
retrying connection deletion; cancellation does not submit a replacement sync.
Enabled schedules with an unconfirmed destination outcome
When deployed, nativeScheduleBlocked distinguishes the enabled schedule from
current blocking; latestSyncJobStatus retains the actual most recent sync result.
The UI uses the existing Broken state and shows Enabled · blocked while
an original destination outcome needs confirmation. A recent sync failure alone
does not mean that scheduling is blocked. nativePendingDestinationCommit contains the current reason,
pending count and original commit/job/attempt IDs, duration start, last reported
verification, alert and next action. Historical start times are labelled estimates;
a null time/result means not reported, never confirmed uncommitted.
nativeScheduleBlockedOccurrences exposes up to twelve recent real appointments
from existing diagnostic logs, with their original occurrenceKey, reason,
scheduledFor, observedAt and original commits. These are scheduling decisions,
not failed sync jobs, usage or checkpoints. Older retained entries remain on the
original job's diagnostic log. The normal log retention still applies.
VERIFICATION_FAILED, VERIFICATION_STALLED and VERIFICATION_NOT_REPORTED
require attention. The one-hour attention threshold does not expire commit
protection or grant retry/write permission. Unknown outcomes remain protected while automatic verification continues.
These status fields provide observations; they never authorize another write.
After safe original settlement the current block clears, while appointment history
and the real latest failed sync remain. The next natural appointment resumes without
resaving or Sync Now; skipped appointments are not batch-replayed.
Native pipeline edits, including pause/resume, use the private compatibility metadata consumer behind Control, so retired legacy ingress does not block edits. Known metadata conflicts return an actionable HTTP 409 message. Read the pipeline after an uncertain edit; a previously disabled runtime schedule requires operator reconciliation. Cancelling a queued Native job uses its Native owner directly, including migrated connections, and projects the resulting lifecycle.