Python MCP server for Kestra that exposes workflow orchestration actions as tools, also usable inside Kestra AI agents.
Setup
Choose your client, copy the config, then fill in any required environment variables.
claude mcp add kestra-server-python --env KESTRA_API_TOKEN='<KESTRA_API_TOKEN>' --env KESTRA_BASE_URL='<KESTRA_BASE_URL>' --env KESTRA_MCP_DISABLED_TOOLS='<KESTRA_MCP_DISABLED_TOOLS>' --env KESTRA_MCP_LOG_LEVEL='<KESTRA_MCP_LOG_LEVEL>' --env KESTRA_PASSWORD='<KESTRA_PASSWORD>' --env KESTRA_TENANT_ID='<KESTRA_TENANT_ID>' --env KESTRA_USERNAME='<KESTRA_USERNAME>' -- docker run -i --rm --pull always -e KESTRA_BASE_URL -e KESTRA_TENANT_ID -e KESTRA_MCP_DISABLED_TOOLS -e KESTRA_MCP_LOG_LEVEL -e KESTRA_USERNAME -e KESTRA_PASSWORD ghcr.io/kestra-io/mcp-server-python:latest~/.codex/config.toml
[mcp_servers.kestra-server-python]
command = "docker"
args = ["run", "-i", "--rm", "--pull", "always", "-e", "KESTRA_BASE_URL", "-e", "KESTRA_TENANT_ID", "-e", "KESTRA_MCP_DISABLED_TOOLS", "-e", "KESTRA_MCP_LOG_LEVEL", "-e", "KESTRA_USERNAME", "-e", "KESTRA_PASSWORD", "ghcr.io/kestra-io/mcp-server-python:latest"]
env = { KESTRA_API_TOKEN = "<KESTRA_API_TOKEN>", KESTRA_BASE_URL = "<KESTRA_BASE_URL>", KESTRA_MCP_DISABLED_TOOLS = "<KESTRA_MCP_DISABLED_TOOLS>", KESTRA_MCP_LOG_LEVEL = "<KESTRA_MCP_LOG_LEVEL>", KESTRA_PASSWORD = "<KESTRA_PASSWORD>", KESTRA_TENANT_ID = "<KESTRA_TENANT_ID>", KESTRA_USERNAME = "<KESTRA_USERNAME>" }
# codex mcp add kestra-server-python --env KESTRA_API_TOKEN='<KESTRA_API_TOKEN>' --env KESTRA_BASE_URL='<KESTRA_BASE_URL>' --env KESTRA_MCP_DISABLED_TOOLS='<KESTRA_MCP_DISABLED_TOOLS>' --env KESTRA_MCP_LOG_LEVEL='<KESTRA_MCP_LOG_LEVEL>' --env KESTRA_PASSWORD='<KESTRA_PASSWORD>' --env KESTRA_TENANT_ID='<KESTRA_TENANT_ID>' --env KESTRA_USERNAME='<KESTRA_USERNAME>' -- docker run -i --rm --pull always -e KESTRA_BASE_URL -e KESTRA_TENANT_ID -e KESTRA_MCP_DISABLED_TOOLS -e KESTRA_MCP_LOG_LEVEL -e KESTRA_USERNAME -e KESTRA_PASSWORD ghcr.io/kestra-io/mcp-server-python:latest~/.cursor/mcp.json
{
"mcpServers": {
"kestra-server-python": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"--pull",
"always",
"-e",
"KESTRA_BASE_URL",
"-e",
"KESTRA_TENANT_ID",
"-e",
"KESTRA_MCP_DISABLED_TOOLS",
"-e",
"KESTRA_MCP_LOG_LEVEL",
"-e",
"KESTRA_USERNAME",
"-e",
"KESTRA_PASSWORD",
"ghcr.io/kestra-io/mcp-server-python:latest"
],
"env": {
"KESTRA_API_TOKEN": "<KESTRA_API_TOKEN>",
"KESTRA_BASE_URL": "<KESTRA_BASE_URL>",
"KESTRA_MCP_DISABLED_TOOLS": "<KESTRA_MCP_DISABLED_TOOLS>",
"KESTRA_MCP_LOG_LEVEL": "<KESTRA_MCP_LOG_LEVEL>",
"KESTRA_PASSWORD": "<KESTRA_PASSWORD>",
"KESTRA_TENANT_ID": "<KESTRA_TENANT_ID>",
"KESTRA_USERNAME": "<KESTRA_USERNAME>"
}
}
}
}.vscode/mcp.json
{
"servers": {
"kestra-server-python": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"--pull",
"always",
"-e",
"KESTRA_BASE_URL",
"-e",
"KESTRA_TENANT_ID",
"-e",
"KESTRA_MCP_DISABLED_TOOLS",
"-e",
"KESTRA_MCP_LOG_LEVEL",
"-e",
"KESTRA_USERNAME",
"-e",
"KESTRA_PASSWORD",
"ghcr.io/kestra-io/mcp-server-python:latest"
],
"env": {
"KESTRA_API_TOKEN": "<KESTRA_API_TOKEN>",
"KESTRA_BASE_URL": "<KESTRA_BASE_URL>",
"KESTRA_MCP_DISABLED_TOOLS": "<KESTRA_MCP_DISABLED_TOOLS>",
"KESTRA_MCP_LOG_LEVEL": "<KESTRA_MCP_LOG_LEVEL>",
"KESTRA_PASSWORD": "<KESTRA_PASSWORD>",
"KESTRA_TENANT_ID": "<KESTRA_TENANT_ID>",
"KESTRA_USERNAME": "<KESTRA_USERNAME>"
}
}
}
}~/.gemini/settings.json
{
"mcpServers": {
"kestra-server-python": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"--pull",
"always",
"-e",
"KESTRA_BASE_URL",
"-e",
"KESTRA_TENANT_ID",
"-e",
"KESTRA_MCP_DISABLED_TOOLS",
"-e",
"KESTRA_MCP_LOG_LEVEL",
"-e",
"KESTRA_USERNAME",
"-e",
"KESTRA_PASSWORD",
"ghcr.io/kestra-io/mcp-server-python:latest"
],
"env": {
"KESTRA_API_TOKEN": "<KESTRA_API_TOKEN>",
"KESTRA_BASE_URL": "<KESTRA_BASE_URL>",
"KESTRA_MCP_DISABLED_TOOLS": "<KESTRA_MCP_DISABLED_TOOLS>",
"KESTRA_MCP_LOG_LEVEL": "<KESTRA_MCP_LOG_LEVEL>",
"KESTRA_PASSWORD": "<KESTRA_PASSWORD>",
"KESTRA_TENANT_ID": "<KESTRA_TENANT_ID>",
"KESTRA_USERNAME": "<KESTRA_USERNAME>"
}
}
}
}claude_desktop_config.json
{
"mcpServers": {
"kestra-server-python": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"--pull",
"always",
"-e",
"KESTRA_BASE_URL",
"-e",
"KESTRA_TENANT_ID",
"-e",
"KESTRA_MCP_DISABLED_TOOLS",
"-e",
"KESTRA_MCP_LOG_LEVEL",
"-e",
"KESTRA_USERNAME",
"-e",
"KESTRA_PASSWORD",
"ghcr.io/kestra-io/mcp-server-python:latest"
],
"env": {
"KESTRA_API_TOKEN": "<KESTRA_API_TOKEN>",
"KESTRA_BASE_URL": "<KESTRA_BASE_URL>",
"KESTRA_MCP_DISABLED_TOOLS": "<KESTRA_MCP_DISABLED_TOOLS>",
"KESTRA_MCP_LOG_LEVEL": "<KESTRA_MCP_LOG_LEVEL>",
"KESTRA_PASSWORD": "<KESTRA_PASSWORD>",
"KESTRA_TENANT_ID": "<KESTRA_TENANT_ID>",
"KESTRA_USERNAME": "<KESTRA_USERNAME>"
}
}
}
}.trae/mcp.json
{
"mcpServers": {
"kestra-server-python": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"--pull",
"always",
"-e",
"KESTRA_BASE_URL",
"-e",
"KESTRA_TENANT_ID",
"-e",
"KESTRA_MCP_DISABLED_TOOLS",
"-e",
"KESTRA_MCP_LOG_LEVEL",
"-e",
"KESTRA_USERNAME",
"-e",
"KESTRA_PASSWORD",
"ghcr.io/kestra-io/mcp-server-python:latest"
],
"env": {
"KESTRA_API_TOKEN": "<KESTRA_API_TOKEN>",
"KESTRA_BASE_URL": "<KESTRA_BASE_URL>",
"KESTRA_MCP_DISABLED_TOOLS": "<KESTRA_MCP_DISABLED_TOOLS>",
"KESTRA_MCP_LOG_LEVEL": "<KESTRA_MCP_LOG_LEVEL>",
"KESTRA_PASSWORD": "<KESTRA_PASSWORD>",
"KESTRA_TENANT_ID": "<KESTRA_TENANT_ID>",
"KESTRA_USERNAME": "<KESTRA_USERNAME>"
}
}
}
}Environment variables
KESTRA_API_TOKENKESTRA_BASE_URLKESTRA_MCP_DISABLED_TOOLSKESTRA_MCP_LOG_LEVELKESTRA_PASSWORDKESTRA_TENANT_IDKESTRA_USERNAME
Replace the placeholders with your own credentials and keep them out of version control.