dolphin-mcp-pilot
OfficialServer Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| DS_URL | Yes | The base URL of the Apache DolphinScheduler server. | |
| DS_USER | No | Username for authentication. | |
| DS_TOKEN | No | API token for authentication. | |
| DS_PASSWORD | No | Password for authentication. |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| ds_test_connectionA | Test DolphinScheduler login and connectivity. |
| ds_list_projectsA | List all projects. Returns [{id, code, name, description}]. |
| ds_create_projectC | Create a new project. Args: name: Project name description: Optional description |
| ds_rename_projectA | Rename a project. Args: old_name: Current project name new_name: New project name description: Optional new description; keeps the existing one if omitted |
| ds_delete_projectA | Delete an entire project, cascading to all workflows, schedules and instances. This is irreversible - use with caution. |
| ds_list_datasourcesB | List data sources. Args: ds_type: HIVE / MYSQL / POSTGRESQL / SPARK / CLICKHOUSE etc. |
| ds_list_workflowsA | List workflow definitions with pagination, search and exact-match support. v2.0.12: merged ds_list_workflows_simple and ds_get_workflow_by_name.
Args: project_name: Project name page_no: Page number, starting at 1 page_size: Items per page (max recommended 100) search: Fuzzy search keyword (name + description) name: Exact workflow name match use_simple: Use simple-list endpoint when True |
| ds_get_workflowA | Read a single workflow definition (DAG, global params, node coordinates, etc.). Args: project_name: Project name workflow_code: Process-definition code (from ds_list_workflows) compact: Compact mode (default False). When True, returns only metadata and task summary without full taskParams/SQL, greatly reducing token usage. Suitable when you only need to understand DAG structure. |
| ds_create_workflowB | Create a workflow (supports simple SQL mode and complex DAG mode). Mode 1 - Simple SQL (backward compatible):
Mode 2 - Complex DAG:
Args: project_name: Project name name: Workflow name description: Description sql_statements: [Mode 1] SQL, multiple separated by ";;;" datasource_id: [Mode 1] Datasource ID sql_ds_type: [Mode 1] SQL type (HIVE/MYSQL) tasks_json: [Mode 2] Task definition JSON array string relations_json: [Mode 2] Task relation JSON array string schedule: Whether to create a schedule schedule_cron: Quartz 7-field cron expression schedule_start: Schedule start time (defaults to today) schedule_end: Schedule end time (defaults to 2030-12-31) auto_online: Whether to auto-release workflow and schedule |
| ds_release_workflowA | Bring a workflow online or offline. When bringing online (online=True), auto_online_schedule will also re-activate the associated schedule if it was taken offline (DS takes schedules offline when the workflow goes offline). Args: project_name: Project name workflow_code: Process-definition code online: True=online, False=offline auto_online_schedule: Auto-reactivate associated schedule when going online (default True) Returns: { "workflow_code": int, "releaseState": "ONLINE" / "OFFLINE", "schedule_action": str, "schedule_id": int, } |
| ds_run_workflowA | Manually trigger a workflow run (brings it online first). Args: project_name: Project name workflow_code: Process-definition code start_task_names: Optional list of task names to start from (including their downstream tasks). Leave empty to run the entire workflow. Example: ["partition_check"] starts from that task and all its successors. |
| ds_delete_workflowA | Delete workflow(s) by code (takes offline first). Supports single or batch delete. v2.0.12: merged ds_batch_delete_workflows.
Args: project_name: Project name workflow_code: Process-definition code (int for single, list for batch) Returns: Single: {"workflow_code": int, "status": "deleted"} Batch: {"total": int, "deleted": int, "failed": int, "deleted_codes": [...], "failed_details": [...]} |
| ds_update_workflowA | Update workflow definition (PUT method, preserves code, auto-increments version). This is a fallback when ds_modify_workflow_dag cannot handle the change. Supports full task definition override with complete replacement. Args: project_name: Project name workflow_code: Process-definition code task_definitions: Task definition list (list or JSON string) task_relations: Task relation list (list or JSON string) locations: Node coordinates (list or JSON string, default "[]") name: Workflow name (empty = keep original) description: Description (empty = keep original) auto_offline: Auto-offline before update (default True) auto_online: Auto-online after update (default True) |
| ds_get_task_detailA | Read full parameters of a single task (returns only that task, not the whole DAG). Added in v2.0.12 for the "verify a task change took effect" scenario, avoiding pulling a huge DAG payload. Args: project_name: Project name workflow_code: Process-definition code task_name: Task name (exact match) Returns: { "task_code": int, "task_name": str, "task_type": str, "task_params": {...}, # Full taskParams (preStatements/postStatements/sql/script etc.) "description": str, "fail_retry_times": int, "timeout": int, ... } |
| ds_list_workflow_versionsC | List historical versions of a workflow. Args: project_name: Project name workflow_code: Process-definition code page_size: Number of items to return |
| ds_rollback_workflow_versionA | Roll back a workflow to a specific historical version. Args: project_name: Project name workflow_code: Process-definition code version: Target version number (from ds_list_workflow_versions) |
| ds_clone_workflowA | Clone/copy a workflow. Args: project_name: Project name source_workflow_code: Source workflow code new_name: New workflow name description: New workflow description (empty = copy source description) auto_online: Auto-release after cloning Returns: { 'success': True, 'workflow_code': int, # New workflow code 'source_code': int, 'name': str, ... } |
| ds_create_dag_workflowA | Create a generic DAG workflow supporting any task type (SQL/SHELL/PYTHON/DEPENDENT/SUB_PROCESS/HTTP etc.). python3 /public/check_partition.py table_name $[yyyyMMdd-1]", "resource_list": [67], # optional: referenced resource id or path "fail_retry_times": 3}, # optional: retry count on failure |
| ds_modify_workflow_dagA | Modify existing workflow DAG (add/delete/update tasks + adjust dependencies). export PATH=/xxx/bin:$PATH python3 script.py", # or "rawScript" |
| ds_update_task_paramA | Lightweight single-task parameter update — no need to pass full DAG definition. This tool is a convenience wrapper around ds_modify_workflow_dag's update_task, automatically handling the "read → modify → write → online/offline" flow. Use case: Change a single task's SQL/script/name/retry params without constructing a full operations list. Args: project_name: Project name workflow_code: Workflow code task_name: Task name to modify (exact match) updates: Fields to update (flat dict, field names same as update_task's updates) auto_offline: Auto-offline before modification (default True) auto_online: Auto-online after modification (default True) auto_online_schedule: Auto-restore schedule after onlining (default True, v2.0.11) Supported updates fields (snake_case and camelCase both accepted): Common: name, description, fail_retry_times(failRetryTimes), fail_retry_interval(failRetryInterval), timeout, timeout_flag(timeoutFlag), timeout_notify_strategy(timeoutNotifyStrategy), worker_group(workerGroup), task_priority(taskPriority), delay_time(delayTime), flag SQL: sql, datasource_id(datasource), sql_type, sql_type_select(sqlType), pre_statements(preStatements), post_statements(postStatements), local_params(localParams), resource_list(resourceList) SHELL/PYTHON: script(rawScript), resource_list(resourceList), local_params(localParams) ⚠️ Unrecognized fields are reported in the return value's ignored_fields (not silently dropped). Returns: { "workflow_code": int, "task_name": str, "schedule_action": str, "status": "updated", } Examples: # Change a single task's retry params ds_update_task_param( project_name="my_project", workflow_code=21583255237888, task_name="check_partition", updates={"fail_retry_times": 8, "fail_retry_interval": 1} ) |
| ds_list_process_instancesA | List process instances (filter by workflow_code, state). v2.0.12: merged ds_list_workflow_instances.
Troubleshooting / Progress Tracking (v2.0.18): After getting instances, to understand execution details (which tasks running/failed/stuck), use ds_list_task_instances(process_instance_id=, include_full=True) to view task states:
Args: project_name: Project name workflow_code: Process-definition code (0 = no filter, list all instances) state: State filter (FAILURE / SUCCESS / RUNNING_EXECUTION / STOP, empty = no filter) page_size: Number of items to return |
| ds_stop_process_instanceA | Stop a running workflow instance (force kill). |
| ds_pause_process_instanceB | Pause a running workflow instance. |
| ds_resume_process_instanceC | Resume a paused workflow instance. |
| ds_rerun_process_instanceA | Rerun entire workflow instance (from the beginning). |
| ds_rerun_from_failureA | Resume from failed tasks (rerun only failed and pending tasks, skip succeeded ones). |
| ds_delete_process_instanceC | Delete a historical process instance. |
| ds_complement_dataA | Backfill (complement) workflow data for date range or single partition. Recommended usage (v2.0.14):
⚠️ Important (v2.0.19):
Args: project_name: Project name workflow_code: Process-definition code start_date: Start date yyyy-MM-dd (for range backfill) end_date: End date yyyy-MM-dd (for range backfill) partition_date: Single partition yyyy-MM-dd (alternative to start_date+end_date, recommended for clarity) start_task_names: Optional list of task names to start from (backfills these + their downstream tasks) task_depend_type: Dependency type (default TASK_POST: from start tasks forward; TASK_ONLY: start tasks only; TASK_PRE: start tasks + upstream) run_mode: RUN_MODE_SERIAL (default, one at a time) or RUN_MODE_PARALLEL (concurrent) Serial ordering guarantee (v2.0.18): In RUN_MODE_SERIAL, the request is submitted using DS's continuous range fields complementStartDate / complementEndDate, so DS generates instances strictly in ascending day order. Discrete date-list formats (complementScheduleDateList / comma-separated) do not guarantee ordering and are only used as fallbacks. The chosen format is reported in the return value's "format" field ("date_range" / "comma_separated" / "json_list"). Examples: # Single partition (recommended) ds_complement_data(workflow_code=123, partition_date="2024-01-01") |
| ds_list_task_instancesA | List task instances for a process instance (filter by state, optionally include full details). v2.0.18: Added include_full parameter for detailed troubleshooting. Args: project_name: Project name process_instance_id: Process instance ID state: State filter (FAILURE / SUCCESS / RUNNING_EXECUTION, empty = no filter) include_full: When True, returns full taskParams/SQL/script for each task (useful for detailed analysis but consumes more tokens) Returns: List of task instances with: - Basic info: id, name, taskType, state, startTime, endTime, retryTimes - If include_full=True: also includes taskParams (SQL/script/dependency config) |
| ds_get_task_logA | Fetch task execution log (supports pagination). Args: task_instance_id: Task instance ID (from ds_list_task_instances) skip_line_num: Skip first N lines (for pagination) limit: Max lines to fetch (default 1000) Returns: { "task_instance_id": int, "log": str, "line_start": int, "line_count": int, "hint": str } |
| ds_force_task_successA | Force mark a task as success (dangerous — bypasses actual execution). ⚠️ Warning: Use only when task is stuck/failed but you've verified data correctness. This does NOT rerun the task — it only changes the state flag. |
| ds_skip_taskA | Skip a task (mark as success without running). ⚠️ Warning: Use only for non-critical tasks (e.g., notifications). Downstream tasks will proceed as if this task succeeded. |
| ds_get_latest_failure_logA | One-click fetch of all failed task logs from the latest failed instance. Combines 3 common troubleshooting steps (list instances → list tasks → fetch logs). v2.0.10: Added per-step error handling — returns partial diagnostic info even if some steps fail. Args: project_name: Project name workflow_code: Process-definition code log_limit: Lines of log to fetch per failed task (default 500) Returns: { "workflow_code": int, "instance_id": int, # Latest failed instance ID "instance_state": "FAILURE", "start_time": str, "failed_tasks": [ # All failed tasks { "task_instance_id": int, "task_name": str, "task_type": str, "start_time": str, "end_time": str, "log_tail": str # Last log_limit lines } ], "errors": [...] # v2.0.10: Per-step error messages "hint": ... } |
| ds_list_schedulesA | List schedule configurations (optionally filtered by workflow_code). v2.0.12: merged ds_list_schedules_in_project and ds_get_workflow_schedule.
Args: project_name: Project name workflow_code: Process-definition code (0 = no filter) simplify: Return summary dict instead of raw list page_no: Page number page_size: Items per page |
| ds_set_scheduleA | Create a schedule for a workflow (created OFFLINE; activate with ds_online_schedule). v2.0.12: cron is now required (no default) to prevent silent misuse. Args: project_name: Project name workflow_code: Process-definition code cron: Quartz 7-field expression (required, e.g. "0 0 6 * * ? *") start_time: Start time yyyy-MM-dd HH:mm:ss; defaults to today 00:00:00 end_time: End time; defaults to 2030-12-31 23:59:59 |
| ds_online_scheduleC | Activate (bring online) a schedule. |
| ds_offline_scheduleC | Deactivate (take offline) a schedule. |
| ds_delete_scheduleA | Delete a schedule (takes it offline first). |
| ds_update_schedule_cronA | Update only the cron expression of a schedule (keeps all other settings). Flow: read current state → offline if needed → update → re-online (default). v2.0.10: queries the target schedule directly instead of scanning the full list. Args: project_name: Project name schedule_id: Schedule ID (from ds_list_schedules) cron: New Quartz 7-field expression start_time: New start time yyyy-MM-dd HH:mm:ss (keep original if empty) end_time: New end time (keep original if empty) auto_online: Re-activate after update (default True) Returns: { "schedule_id": int, "new_cron": str, "release_state": "ONLINE" | "OFFLINE", "status": "updated", "online_retry_detail": str } |
| ds_list_resourcesA | List resources (files and folders) at a given path. Args: resource_type: Resource type — FILE / UDF / ALL (default, lists both) full_name: Path prefix filter; empty = list everything from root |
| ds_view_resourceA | View resource file content (paginated, text files only). Args: resource_id: Resource ID (from ds_list_resources or ds_get_resource_by_name) skip_line_num: Number of lines to skip limit: Max lines to read |
| ds_get_resource_by_nameA | Find a resource (file or folder) by full path, returning id and metadata. Implementation: uses /resources/list recursive search (avoids /resources/query-by-name due to known DS bug). Args: full_name: Full resource path, e.g. "public/test.py" or "scripts" resource_type: Resource type, default FILE |
| ds_download_resourceA | Download a resource file (supports binary, e.g. jar, zip). Args: resource_id: Resource ID save_to: Optional local save path (accessible to MCP server process). If empty, returns base64-encoded content. Returns: If save_to provided: {"resource_id", "saved_to", "size"} Otherwise: {"resource_id", "size", "content_base64"} |
| ds_create_folderA | Create a folder in the resource area. Args: name: Folder name (no path prefix, e.g. "scripts") current_dir: Parent directory path, default root "/" resource_type: FILE or UDF |
| ds_online_create_fileA | Create a text file inline (no upload required). Args: file_name: Filename without extension (e.g. "my_script") suffix: File extension without dot (e.g. "py" / "sh" / "sql") content: Text content to write current_dir: Parent directory path, default root "/" description: File description resource_type: FILE or UDF |
| ds_upload_fileA | Upload a file to the resource area (supports binary, e.g. jar / zip). Two ways to provide file content: Method 1: local_path — path to a file accessible by the MCP server process Method 2: file_name + file_content_base64 — base64-encoded content Args: local_path: Local file path (Method 1) file_name: Filename with extension (Method 2) file_content_base64: Base64-encoded file content (Method 2) current_dir: Parent directory path, default root "/" resource_type: FILE or UDF |
| ds_update_resource_contentA | Update resource file content (text files only). ⚠️ Changes take effect immediately. Workflows referencing this script will use the new version on their next execution. Args: resource_id: Resource ID content: New file content description: Update note (optional) |
| ds_rename_resourceA | Rename a resource file or folder. ⚠️ Warning: DS may implement rename as delete + recreate, which changes the resource_id. If this resource is referenced by workflow tasks, the reference will become invalid after renaming. Check references with ds_list_workflows before proceeding. Args: resource_id: Resource ID new_name: New name (filename or folder name only, no path prefix) description: Description resource_type: FILE or UDF |
| ds_delete_resourceA | Delete a resource (file or folder). ⚠️ Warning: Deletion is irreversible. Resources referenced by workflow tasks will cause those tasks to fail on next execution. DS behavior: Deleting a non-empty folder returns error 20018. Use recursive=True to delete children first, then the folder. Args: resource_id: Resource ID recursive: Delete children recursively (for folders, default False) Returns: {"resource_id", "status", "deleted_children"} |
| ds_monitor_mastersA | Check DS master node status (verify scheduler is alive). |
| ds_monitor_workersA | Check DS worker node status (verify task executors are alive). |
| ds_list_usersA | List all DS users (useful for debugging workflow user_id foreign key issues). |
| ds_list_tenantsA | List all tenants (useful for debugging workflow tenant_id foreign key issues). |
| ds_raw_getA | Pass GET through to DolphinScheduler API (path must start with /, excluding the /dolphinscheduler prefix). |
| ds_raw_deleteC | Pass DELETE through to DolphinScheduler API. |
| ds_raw_postA | Pass POST through to DolphinScheduler API. Args: path: API path (starting with /) form_data_json: form-urlencoded params as a JSON string (choose one) json_body_json: JSON body as a JSON string (choose one) |
| ds_raw_putC | Pass PUT through to DolphinScheduler API. |
| ds_helpA | Interactive guide to DolphinScheduler MCP tools. Call without arguments to see all categories, or pass a category name to view tools and workflows for that category. Available categories:
Args: category: Category name (empty string returns all categories) Returns: If category is empty: overview with tool counts If category is specified: {category, name, tools, workflow, hint} |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/iflytek/dolphin-mcp-pilot'
If you have feedback or need assistance with the MCP directory API, please join our Discord server