Files
windmill/backend/generate_mcp_endpoints_tools
Ruben FiszelandClaude Opus 5.5 d18d7043df feat: infer a script's schema when a deploy (e.g. MCP) sends none (#11339)
* feat: infer a script's schema from its code when a deploy sends none

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix: merge an inferred schema into the previous one the way the editor does

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix: parse non-JSON TS defaults natively and keep the schema on a failed inference

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix: type untyped TS params from their literal shape when the default can't be evaluated

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* fix: read literal TS defaults off the AST so the server types them like the editor

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* docs: word the script schema description for both create and update

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

* docs: note that dbt scripts derive their schema from the descriptor

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 10:00:49 +00:00
..

MCP Tools Generator

The generate_mcp_tools.py script parses the OpenAPI specification and generates Rust code for MCP (Model Context Protocol) tools.

Setup

cd backend/generate_mcp_endpoints_tools
pip install -r requirements.txt

Usage

python3 generate_mcp_tools.py

The script will:

  1. Parse backend/windmill-api/openapi.yaml
  2. Find all endpoints marked with x-mcp-tool: true
  3. Generate backend/windmill-api/src/mcp_tools.rs with a const array of tools

Adding MCP Tools

To mark an endpoint as an MCP tool, add x-mcp-tool: true to the operation in the OpenAPI spec. You can also add x-mcp-instructions to complete the description of the tool with instructions on how to correctly use the endpoint:

/w/{workspace}/scripts/list:
  get:
    x-mcp-tool: true
    x-mcp-instructions: you should call that with this or that arg
    summary: list scripts in workspace
    operationId: listScripts
    # ... rest of endpoint definition