Alteryx MCP
Enables AI assistants to read, analyze, edit, and create Alteryx workflows, including summarizing workflows, finding tools, editing configurations, updating SQL, managing connections, and building new workflows programmatically.
README
Alteryx MCP
An MCP server that exposes comprehensive Alteryx workflow manipulation tools over stdio, enabling AI assistants to:
- Read & Analyze: Summarize workflows into Markdown (containers, connections, SQL, diagrams)
- Find Tools: Search for tools by ID, type, or annotation patterns
- Edit Configurations: Modify tool settings, field selections, annotations
- Update SQL: Change database queries with OCI compliance (auto-removes
--comments) - Manage Connections: Update DCM connection identifiers
- Create Workflows: Build new
.yxmdfiles programmatically
It wraps alteryx_mcp/alteryx_mcp.py from this repository.
Demo
Features
1. Workflow Analysis
- Parse and summarize entire workflows
- Extract container hierarchies, tool types, database connections
- Generate Mermaid diagrams for data flow visualization
2. Tool Discovery
- Find tools by ToolID, plugin type (e.g.,
AlteryxSelect,DbFileInput) - NEW:
find_tools_fast()- Optimized regex-based search (10-100x faster for specific ToolID lookups) - Search by annotation text patterns
- Get complete tool configuration details
3. Direct Editing
- Select Tools: Update field selections (
selected: true/false) and rename fields - Annotations: Change tool annotations/labels
- SQL Queries: Update DbFileInput queries with automatic comment removal for OCI
- Connections: Swap DCM connection IDs across tools
- NEW: Row Limits: Get, update, and batch-modify row limits for Sample/Filter tools
- All edits support dry-run mode for safe previewing
4. Connection Management
- Batch Update Connections: Update multiple tools with the same connection ID
- Copy connection from reference tool or use provided connection ID
- Update entire workflow at once
5. Row Limit Management (NEW)
- Get Row Limits: Read current First N, Last N, Sample N settings
- Update Single Tool: Change row limit for specific tool
- Batch Update: Mass-modify row limits across entire workflow
- Update by specific tool IDs or by plugin type (e.g., all Sample tools)
6. Workflow Creation
- Build workflows from scratch with JSON configuration
- Define tools, positions, connections programmatically
- Specify custom metadata
Install (editable dev)
# From repo root
pip install -e .
Run (stdio)
alteryx-mcp
Tools Reference
Analysis Tools
summarize_workflow
summarize_workflow(
workflow: str, # Path to .yxmd file
mapping: str | None # Optional JSON mapping for connection aliases
) -> str # Returns Markdown summary
Example:
{
"workflow": "c:/projects/VCI/VCIProjectionBaseLine.yxmd",
"mapping": "c:/projects/connections.json"
}
Returns comprehensive Markdown with:
- Metadata (WorkflowId, Description)
- Container hierarchy
- Top tool types
- Database connections with queries
- Output destinations
- Mermaid flowcharts
find_tools
find_tools(
workflow: str, # Path to .yxmd file
tool_id: int | None = None, # Find specific tool ID
plugin_type: str | None = None, # e.g., 'AlteryxSelect', 'DbFileInput'
annotation_pattern: str | None = None # Search in annotations
) -> str # Returns JSON with matching tools
Examples:
// Find all Select tools
{
"workflow": "path/to/workflow.yxmd",
"plugin_type": "AlteryxSelect"
}
// Find tools mentioning "v12Live" in annotations
{
"workflow": "path/to/workflow.yxmd",
"annotation_pattern": "v12Live"
}
// Find specific tool
{
"workflow": "path/to/workflow.yxmd",
"tool_id": 375
}
Supported plugin types:
AlteryxSelect,DbFileInput,DbFileOutputFilter,Join,Sort,FormulaBrowse,TextBox,ToolContainerUnion,Summarize,Sample,UniqueRecordID,MultiRowFormula,TextInput,DateTimeInput
Editing Tools
update_select_tool
update_select_tool(
workflow: str, # Path to .yxmd file
tool_id: int, # Tool ID of Select tool
field_updates: str, # JSON string with field updates
dry_run: bool = False
) -> str # Status message
Example - Update field selections:
{
"workflow": "path/to/workflow.yxmd",
"tool_id": 375,
"field_updates": "{\"SCM37_CTRA22_IBCONO\": {\"selected\": false}, \"SCM37_CTRA22_IBFACI\": {\"selected\": true, \"rename\": \"FACILITY_CODE\"}}",
"dry_run": true
}
Field update options:
selected:trueorfalserename: New field name
update_annotation
update_annotation(
workflow: str, # Path to .yxmd file
tool_id: int, # Tool ID to update
new_annotation: str, # New annotation text
dry_run: bool = False
) -> str
Example:
{
"workflow": "path/to/workflow.yxmd",
"tool_id": 12,
"new_annotation": "dcm:prod-oracle\nQuery=SELECT * FROM MPHEAD WHERE CONO=1",
"dry_run": false
}
update_sql_query
update_sql_query(
workflow: str, # Path to .yxmd file
tool_id: int, # Tool ID of DbFileInput
new_query: str, # New SQL query
remove_comments: bool = True, # Strip -- comments for OCI
dry_run: bool = False
) -> str
Example - Update query with OCI compliance:
{
"workflow": "path/to/workflow.yxmd",
"tool_id": 12,
"new_query": "SELECT IACONO, IAPUNO, IACUCD -- Company info\nFROM MVXCDTA.MPHEAD\nWHERE IACONO = 1",
"remove_comments": true,
"dry_run": false
}
Result (after comment removal):
SELECT IACONO, IAPUNO, IACUCD
FROM MVXCDTA.MPHEAD
WHERE IACONO = 1
update_connection_id
update_connection_id(
workflow: str, # Path to .yxmd file
tool_id: int, # Tool ID to update
new_connection_id: str, # New DCM connection ID (UUID)
dry_run: bool = False
) -> str
Example:
{
"workflow": "path/to/workflow.yxmd",
"tool_id": 12,
"new_connection_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"dry_run": false
}
batch_update_connections
batch_update_connections(
workflow: str,
tool_ids: List[int],
source_connection_id: str | None = None,
source_tool_id: int | None = None,
dry_run: bool = False
) -> str
Example:
{
"workflow": "path/to/workflow.yxmd",
"tool_ids": [12, 14, 16],
"source_tool_id": 13,
"dry_run": true
}
rewrite_connections
rewrite_connections(
workflow: str, # Path to .yxmd file
config: str, # Path to JSON config
dry_run: bool = False
) -> str
Config JSON format:
{
"connections": {
"old-uuid-1": {
"new_id": "new-uuid-1",
"old_label": "dev-db",
"new_label": "prod-db"
}
}
}
Row Limit Tools
get_row_limit
get_row_limit(
workflow: str,
tool_id: int
) -> str
Example:
{
"workflow": "path/to/workflow.yxmd",
"tool_id": 10
}
update_row_limit
update_row_limit(
workflow: str,
tool_id: int,
first_n: int | None = None,
last_n: int | None = None,
sample_n: int | None = None,
dry_run: bool = False
) -> str
Example:
{
"workflow": "path/to/workflow.yxmd",
"tool_id": 10,
"first_n": 500,
"dry_run": false
}
batch_update_row_limits
batch_update_row_limits(
workflow: str,
tool_ids: List[int] | None = None,
plugin_type: str | None = None,
first_n: int | None = None,
last_n: int | None = None,
sample_n: int | None = None,
dry_run: bool = False
) -> str
Example:
{
"workflow": "path/to/workflow.yxmd",
"plugin_type": "Sample",
"first_n": 1000,
"dry_run": false
}
Creation Tools
create_workflow
create_workflow(
output_path: str, # Where to save .yxmd
tools_config: str, # JSON array of tool configs
connections: str | None, # Optional JSON array of connections
metadata: str | None # Optional JSON dict of metadata
) -> str
Example - Create simple workflow:
{
"output_path": "c:/temp/new_workflow.yxmd",
"tools_config": "[{\"tool_id\": 1, \"plugin\": \"TextInput\", \"position\": {\"x\": 100, \"y\": 100}, \"configuration\": {\"Text\": \"Hello World\"}, \"annotation\": \"Data source\"}, {\"tool_id\": 2, \"plugin\": \"Browse\", \"position\": {\"x\": 300, \"y\": 100}, \"annotation\": \"View output\"}]",
"connections": "[{\"origin\": 1, \"destination\": 2}]",
"metadata": "{\"Name\": \"My Workflow\", \"Description\": \"Auto-generated test workflow\"}"
}
Tool configuration structure:
{
tool_id?: number, // Optional, defaults to index
plugin: string, // Plugin type name
position: {x: number, y: number},
configuration: object, // Tool-specific config
annotation?: string // Optional annotation
}
Connection structure:
{
origin: number, // Source tool ID
destination: number, // Target tool ID
origin_connection?: string, // Default: "Output"
destination_connection?: string // Default: "Input"
}
MCP Client Configuration
Point your MCP client (e.g., GitHub Copilot, Claude Desktop) to launch the script on stdio:
{
"mcpServers": {
"alteryx": {
"command": "alteryx-mcp",
"args": []
}
}
}
Or with full path:
{
"mcpServers": {
"alteryx": {
"command": "python",
"args": ["-m", "alteryx_mcp.server"]
}
}
}
Usage Patterns
Pattern 1: Find and Update Field Selections
1. User: "Find all Select tools in the workflow"
→ find_tools(workflow="...", plugin_type="AlteryxSelect")
2. User: "In tool 375, deselect field IBCONO and rename IBFACI to FACILITY"
→ update_select_tool(workflow="...", tool_id=375,
field_updates='{"IBCONO": {"selected": false},
"IBFACI": {"rename": "FACILITY"}}')
Pattern 2: Update SQL for OCI Compliance
1. User: "Show me all database input tools"
→ find_tools(workflow="...", plugin_type="DbFileInput")
2. User: "Update the SQL in tool 12 and remove all comments"
→ update_sql_query(workflow="...", tool_id=12,
new_query="SELECT...", remove_comments=true)
Pattern 3: Change Annotations
1. User: "Find tools connected to v12Live"
→ find_tools(workflow="...", annotation_pattern="v12Live")
2. User: "Update annotation for tool 12 to show production connection"
→ update_annotation(workflow="...", tool_id=12,
new_annotation="dcm:prod-oracle\\nQuery=...")
Pattern 4: Create New Workflow
User: "Create a workflow that reads from TextInput and shows Browse output"
→ create_workflow(output_path="...",
tools_config='[{"plugin": "TextInput", ...},
{"plugin": "Browse", ...}]',
connections='[{"origin": 1, "destination": 2}]')
Advanced Features
OCI Compliance
All SQL operations automatically handle Oracle Instant Client requirements:
- Removes
--style comments (not supported in OCI) - Preserves multi-line queries
- Maintains query formatting
Dry Run Mode
All editing tools support dry_run=true to preview changes without writing to disk.
Pattern Matching
The MCP uses efficient XML pattern matching to locate tools:
- By Plugin type (partial match supported)
- By ToolID (exact match)
- By annotation text (case-insensitive substring)
Container Support
Tools within containers are fully supported:
- Search recurses into nested containers
- Container paths preserved in results
- Edits work on tools at any depth
Architecture
alteryx-mcp/
├── alteryx_mcp/
│ ├── server.py # MCP FastMCP server exposing 8 tools
│ └── __init__.py
├── pyproject.toml # Package metadata
└── README.md # This file
The server is a thin wrapper around alteryx_mcp.py which provides:
- XML parsing and manipulation
- Tool configuration updates
- Workflow creation
- Safe file writing with proper encoding
Troubleshooting
Tool not found: Verify ToolID exists using find_tools()
SQL comments not removed: Ensure remove_comments=true is set
Workflow won't open in Alteryx: Check XML formatting; use dry_run first
Connection update failed: Verify UUID format for connection IDs
Field not updated: Check exact field name spelling (case-sensitive)
Contributing
This MCP server is part of the Alteryx MCP project. To extend:
- Add new functions to
alteryx_mcp/alteryx_mcp.py - Expose via
@mcp.tool()decorators inserver.py - Update this README with examples
- Test with real workflows
License
Internal tool for Alteryx MCP project use.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.