SkillAgentSearch skills...

Aps Sample MCP Server Revit Automation

Sample MCP server to automate Revit via Automation API using SSA

Install / Use

/learn @autodesk-platform-services/Aps Sample MCP Server Revit Automation
About this skill

Quality Score

0/100

Supported Platforms

Claude Code
Cursor

README

Sample MCP Server for Revit Automation

Automation API Revit-2026 .NET C# MCP

A sample Model Context Protocol (MCP) remote server (HTTP) that enables AI assistants like Claude to automate Autodesk Revit operations via Automation API using Service-to-Service Authentication (SSA).

https://github.com/user-attachments/assets/43a5aabc-d2a3-47ff-a9e1-8bd61d24a81e


⚠️ Disclaimer
This is a vibe-coded sample solution - an exploratory proof-of-concept developed iteratively. It demonstrates patterns and possibilities but may not follow all production-grade practices. This README was generated by GitHub Copilot based on analyzing the actual codebase, ensuring documentation matches implementation.

🔗 Companion Repository
This MCP server works with the APS Automation API Revit MCP Tools Sample - the Revit AppBundle that executes the actual tools in Automation API. Deploy that AppBundle to use this MCP server.


🎯 Overview

MCP Revit Automation bridges AI assistants with Autodesk Revit through the Model Context Protocol. It enables headless, scalable automation of Revit operations on cloud-hosted models (ACC/BIM360) without manual interaction.

Target Audience: AEC Firms, BIM Managers, BIM Coordinators, Developers building AI-powered BIM workflows

Key Features

  • 🔐 SSA Authentication - JWT bearer tokens with RSA signing for service-to-service auth
  • 🏗️ Fluent API - Type-safe model configuration with compile-time validation
  • 📦 Dual JSON Architecture - Separates model context from tool inputs
  • 🤖 MCP Integration - Exposes tools to AI assistants naturally
  • ☁️ Cloud-Native - Works with Autodesk Cloud Models

🔧 Extensible Tool System

  • Easy to add new Revit automation tools
  • Consistent pattern for all operations
  • No core service changes required

🤖 MCP Protocol Support

  • Exposes tools to AI assistants like Claude or VS Code Copilot
  • Natural language to Revit automation
  • HTTP transport for broad compatibility

☁️ Cloud-Native

  • Works with Autodesk Cloud Models (ACC/BIM360) - Workshared and Non-Workshared
  • Scalable workitem submission
  • Automation API for Revit integration

🏛️ Architecture

MCP Client (Claude/VS Code) 
    ↓ MCP Protocol
MCP Server (This Project)
    ├─ RevitAutomationTools (MCP tool definitions)
    ├─ RevitAutomationService (Workitem submission)
    └─ SsaTokenService
    ↓ HTTPS + Bearer Token
Autodesk Automation API for Revit (Cloud execution)

Dual JSON Pattern:

  • revitmodel.json - Model context (region, project, model GUIDs, tool name)
  • toolinputs.json - Tool-specific parameters

📦 Prerequisites


🚀 Installation

git clone https://github.com/autodesk-platform-services/aps-sample-mcp-server-revit-automation.git
cd mcp-revit-automation
dotnet restore
dotnet build --configuration Release

Create appsettings.json:

{
  "Forge": {
    "ClientId": "your-client-id",
    "ClientSecret": "your-client-secret",
    "ServiceAccountId": "your-service-account-id",
    "KeyId": "your-key-id",
    "PrivateKeyPath": "path/to/private-key.pem"
  }
}

Run (http): dotnet run


⚙️ Configuration

Obtain credentials from APS Developer Portal:

  1. Create APS application with Automation API enabled → Get ClientId & ClientSecret
  2. Create Service Account → Generate RSA key pair → Get ServiceAccountId & KeyId
  3. Download private key as .pem file → Set path in PrivateKeyPath

📘 Usage

MCP Client Configuration

Visual Studio Code: See how to configure an MCP Server here

{
 "inputs": [],
  "servers": {
    "revit-automation-mcp": {
      "url": "http://localhost:6223",
      "type": "http"
    }
  }
}

Fluent API Example

// Model configuration (type-safe, compile-time validated)
var modelConfig = ModelConfiguration.Create()
    .WithRegion("US")
    .WithProject("project-guid")
    .WithModelGuid("model-guid")
    .WithToolName("link_models")
    .Save(true)
    .Configure();

// Tool-specific inputs (flexible dictionary)
var toolInputs = new Dictionary<string, object>
{
    { "modelName", "My Model" },
    { "linksToAdd", new[] { new { modelName = "Link1", modelGuid = "guid1" } } },
    { "linksToRemove", Array.Empty<object>() }
};

var result = await service.SubmitWorkItemAsync(modelConfig, toolInputs);

🛠️ Available Tools

| Tool | Description | |------|-------------| | create_model | Creates a new Revit model from template | | link_models | Adds/removes Revit model links |

Creating a Revit Model

revitmodel.json

{
  "region": "US",
  "projectGuid": "00000000-0000-0000-0000-000000000000",
  "modelGuid": "11111111-1111-1111-1111-111111111111",
  "toolName": "create_model",
  "save": false
}

toolinputs.json

{
  "enableWorksharing": true,
  "accountId": "00000000-0000-0000-0000-000000000000",
  "projectId": "00000000-0000-0000-0000-000000000000",
  "folderId": "urn:adsk.wipprod:fs.folder:co.example",
  "modelName": "NewModel.rvt"
}

Managing Model Links

revitmodel.json

{
  "region": "US",
  "projectGuid": "00000000-0000-0000-0000-000000000000",
  "modelGuid": "00000000-0000-0000-0000-000000000000",
  "toolName": "link_models",
  "save": true
}

toolinputs.json

{
  "region": "US",
  "projectGuid": "00000000-0000-0000-0000-000000000000",
  "linksToAdd": [
    {
      "modelName": "Architectural_Link.rvt",
      "modelGuid": "11111111-1111-1111-1111-111111111111"
    },
    {
      "modelName": "Structural_Link.rvt",
      "modelGuid": "22222222-2222-2222-2222-222222222222"
    }
  ],
  "linksToRemove": [
    {
      "modelName": "Old_Link.rvt",
      "modelGuid": "99999999-9999-9999-9999-999999999999"
    }
  ]
}

➕ Adding New Tools

1. In Tools/RevitAutomationTools.cs

[McpServerTool(Name = "my_tool")]
public async Task<WorkItemSubmissionResult> MyTool(...)
{
    var modelConfig = ModelConfiguration.Create()
        .WithRegion(region)
        .WithProject(projectGuid)
        .WithModelGuid(modelGuid)
        .WithToolName("my_tool")
        .Configure();
    
    var toolInputs = new Dictionary<string, object> { /* tool params */ };
    return await revitAutomationService.SubmitWorkItemAsync(modelConfig, toolInputs);
}

2. In your Revit AppBundle: add case for "my_tool". See how to add new tools here


Resources


License

This sample is licensed under the terms of the MIT License. Please see the LICENSE file for full details.


Made with ❤️ for the AEC community | Vibe-coded with GitHub Copilot

View on GitHub
GitHub Stars4
CategoryDevelopment
Updated18h ago
Forks1

Languages

C#

Security Score

90/100

Audited on Mar 24, 2026

No findings