Skip to main content
Glama

send_code_to_revit

Execute custom C# code in Autodesk Revit to automate BIM workflows, modify project elements, and extend functionality through direct API access.

Instructions

Send C# code to Revit for execution. The code will be inserted into a template with access to the Revit Document and parameters. Your code should be written to work within the Execute method of the template.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
codeYesThe C# code to execute in Revit. This code will be inserted into the Execute method of a template with access to Document and parameters.
parametersNoOptional execution parameters that will be passed to your code

Implementation Reference

  • The asynchronous handler function that implements the core logic of the 'send_code_to_revit' tool. It prepares parameters from the input arguments, uses withRevitConnection to send the command to the Revit client, and formats the response or error as MCP content.
    async (args, extra) => {
      const params = {
        code: args.code,
        parameters: args.parameters || [],
      };
    
      try {
        const response = await withRevitConnection(async (revitClient) => {
          return await revitClient.sendCommand("send_code_to_revit", params);
        });
    
        return {
          content: [
            {
              type: "text",
              text: `Code execution successful!\nResult: ${JSON.stringify(
                response,
                null,
                2
              )}`,
            },
          ],
        };
      } catch (error) {
        return {
          content: [
            {
              type: "text",
              text: `Code execution failed: ${
                error instanceof Error ? error.message : String(error)
              }`,
            },
          ],
        };
      }
    }
  • Zod schema defining the input parameters for the tool: 'code' (required string) and 'parameters' (optional array). Used in server.tool() registration.
    {
      code: z
        .string()
        .describe(
          "The C# code to execute in Revit. This code will be inserted into the Execute method of a template with access to Document and parameters."
        ),
      parameters: z
        .array(z.any())
        .optional()
        .describe(
          "Optional execution parameters that will be passed to your code"
        ),
    },
  • The registration function exported from the tool file. It calls server.tool() to register the 'send_code_to_revit' MCP tool with its name, description, input schema, and handler. This function is dynamically invoked by src/tools/register.ts.
    export function registerSendCodeToRevitTool(server: McpServer) {
      server.tool(
        "send_code_to_revit",
        "Send C# code to Revit for execution. The code will be inserted into a template with access to the Revit Document and parameters. Your code should be written to work within the Execute method of the template.",
        {
          code: z
            .string()
            .describe(
              "The C# code to execute in Revit. This code will be inserted into the Execute method of a template with access to Document and parameters."
            ),
          parameters: z
            .array(z.any())
            .optional()
            .describe(
              "Optional execution parameters that will be passed to your code"
            ),
        },
        async (args, extra) => {
          const params = {
            code: args.code,
            parameters: args.parameters || [],
          };
    
          try {
            const response = await withRevitConnection(async (revitClient) => {
              return await revitClient.sendCommand("send_code_to_revit", params);
            });
    
            return {
              content: [
                {
                  type: "text",
                  text: `Code execution successful!\nResult: ${JSON.stringify(
                    response,
                    null,
                    2
                  )}`,
                },
              ],
            };
          } catch (error) {
            return {
              content: [
                {
                  type: "text",
                  text: `Code execution failed: ${
                    error instanceof Error ? error.message : String(error)
                  }`,
                },
              ],
            };
          }
        }
      );
    }
  • Dynamic registration entrypoint that scans src/tools directory, imports tool modules like send_code_to_revit.ts, discovers and invokes their register* functions to register all MCP tools with the server.
    export async function registerTools(server: McpServer) {
      // 获取当前文件的目录路径
      const __filename = fileURLToPath(import.meta.url);
      const __dirname = path.dirname(__filename);
    
      console.error('[DEBUG] Starting tool registration from directory:', __dirname);
    
      try {
        // 读取tools目录下的所有文件
        const files = fs.readdirSync(__dirname);
        console.error(`[DEBUG] Found ${files.length} files in tools directory`);
    
        // 过滤出.ts或.js文件,但排除index文件和register文件
        const toolFiles = files.filter((file) => (file.endsWith('.ts') || file.endsWith('.js')) && file !== 'index.ts' && file !== 'index.js' && file !== 'register.ts' && file !== 'register.js');
    
        console.error(`[DEBUG] Filtered to ${toolFiles.length} tool files:`, toolFiles);
    
        // 动态导入并注册每个工具
        const registeredTools = [];
    
        for (const file of toolFiles) {
          try {
            console.error(`[DEBUG] Processing tool file: ${file}`);
            // 构建导入路径
            const importPath = `./${file.replace(/\.(ts|js)$/, '.js')}`;
            console.error(`[DEBUG] Import path: ${importPath}`);
    
            // 动态导入模块
            const module = await import(importPath);
            console.error(`[DEBUG] Module imported successfully with keys:`, Object.keys(module));
    
            // 查找并执行注册函数
            const registerFunctionName = Object.keys(module).find((key) => key.startsWith('register') && typeof module[key] === 'function');
    
            if (registerFunctionName) {
              console.error(`[DEBUG] Found register function: ${registerFunctionName}`);
              await module[registerFunctionName](server);
              console.error(`[DEBUG] Registered tool from file: ${file}`);
              registeredTools.push(file);
            } else {
              console.warn(`[DEBUG] WARNING: No register function found in file ${file}. Available exports:`, Object.keys(module));
            }
          } catch (error) {
            console.error(`[DEBUG] ERROR registering tool ${file}:`, error);
          }
        }
    
        console.error(`[DEBUG] Successfully registered ${registeredTools.length} tools:`, registeredTools);
    
        // List all registered tools by tools' names
        try {
          // This is a workaround as we don't have direct access to registry in the type definitions
          const anyServer = server as any;
          if (anyServer.registry && typeof anyServer.registry.getTools === 'function') {
            const registeredToolNames = anyServer.registry.getTools().map((t: any) => t.id);
            console.error(`[DEBUG] Server has ${registeredToolNames.length} registered tools:`, registeredToolNames);
          } else {
            console.error('[DEBUG] Could not access server registry to list tools');
          }
        } catch (err) {
          console.error('[DEBUG] Error trying to list registered tools:', err);
        }
      } catch (error) {
        console.error('[DEBUG] ERROR during tool registration process:', error);
        throw error;
      }
    }

Latest Blog Posts

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/ideook/revit-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server