Alteryx
FreeNot checkedEnables AI assistants to read, analyze, edit, and create Alteryx workflows, including summarizing workflows, finding tools, editing configurations, updating SQL
About
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
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.
Install Alteryx in Claude Desktop, Claude Code & Cursor
unyly install alteryx-mcpInstalls into Claude Desktop, Claude Code, Cursor & VS Code — handles npx, uvx and build-from-source repos for you.
First time? Get the CLI: curl -fsSL https://unyly.org/install | sh
Or configure manually
Run in your terminal:
claude mcp add alteryx-mcp -- uvx --from git+https://github.com/thinhdao276/alteryx-mcp alteryx-mcpFAQ
Is Alteryx MCP free?
Yes, Alteryx MCP is free — one-click install via Unyly at no cost.
Does Alteryx need an API key?
No, Alteryx runs without API keys or environment variables.
Is Alteryx hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install Alteryx in Claude Desktop, Claude Code or Cursor?
Open Alteryx on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
wenb1n-dev/SmartDB_MCP
A universal database MCP server supporting simultaneous connections to multiple databases. It provides tools for database operations, health analysis, SQL optim
by wenb1n-devPostgres Server
This server enables interaction with PostgreSQL databases through the Model Context Protocol, optimized for the AWS Bedrock AgentCore Runtime. It provides tools
by madhurprashPostgres
Query your database in natural language
by AnthropicPostgreSQL
Read-only database access with schema inspection.
by modelcontextprotocolCompare Alteryx with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All data MCPs
