Tools: Essential Visual Studio Extensions
Introduction ## 📌 .github + MCP ## Features ## Works with ## 📌 File Explorer ## Works with ## 📌 Markdown Editor v2 ## Works with ## Features (not all are listed) ## 📌 EF Core Power Tools ## Works with ## Requirements ## Features ## 📌 Solution Favorites ## Works with ## 📌 ReSharper ## Works with ## 📌 CSV Editor ## Works with ## 📌 VSColorOutput64 ## Works with Microsoft Visual Studio extensions are add-ons that expand the capabilities of the Visual Studio IDE beyond what comes built in. They allow developers to install additional tools, language support, templates, analyzers, productivity helpers, and integrations with other services. Extensions can modify the editor, add new menus or windows, automate tasks, provide debugging or profiling tools, or support frameworks and technologies not included by default. In practice, they let developers customize Visual Studio to better fit their workflow, whether that means improving code quality, speeding up development, or integrating external tools directly into the environment. Although Microsoft Visual Studio provides everything a developer needs for daily work, installing the right extensions can make working in Visual Studio easier and more productive. The extensions listed here are not in any order. .github + MCP Adds GitHub, optional Claude and Agents, and MCP Servers nodes to Solution Explorer. Quickly access and manage AI customization files and GitHub-specific files, plus Model Context Protocol (MCP) server configurations - all without leaving Visual Studio. AI Nodes in Solution Explorer The extension adds dedicated AI nodes directly under your solution: Copilot Customization These commands are available only when you right-click in the GitHub (.github) node tree: Folder-Specific Commands When you right-click on a specific folder (e.g., agents, prompts, skills, instructions, or workflows), the relevant "Add" command appears directly in the context menu for quick access. File and Folder Management Files and folders display Git status icons, similar to Solution Explorer: MCP Servers Node in Solution Explorer The extension adds an MCP Servers node that provides centralized access to all Model Context Protocol (MCP) server configurations in your solution. The MCP Servers node appears directly below the GitHub node, making it easy to manage both GitHub-specific files and MCP server configurations from one place. Community Templates with Provider Selection When creating Copilot agents, instructions, prompts, or skills, the dialog supports multiple template providers. Currently included providers*:
* Visual Studio 2026 (Arm64), 2026 (amd64), 2022 (Arm64), 2022 (amd64) File Explorer gives access to all files and folders from the file system under the solution root folder. All in the same Solution Explorer view. Visual Studio 2026 (Arm64), 2026 (amd64), 2022 (Arm64), 2022 (amd64) Documenting project purpose, important instructions, and code should be done at the solution, project, and folder levels, where appropriate, separately from written business requirements done outside of a Microsoft solution. The markdown editor provides everything a developer or documenter needs to write documentation using GitHub Markdown syntax. Visual Studio 2026 (Arm64), 2026 (amd64), 2022 (Arm64), 2022 (amd64) ❇️ Must have for working with EF Core This extension is perfect for developers at all levels working with Entity Framework Core and an existing database to generate POCO classes (Plain Old CLR/C# Object) and configure database properties, along with views, stored procedures, and functions supported by the selected database. Watch a 25-minute demo to get an introduction to the tool. Visual Studio 2026 (Arm64), 2026 (amd64), 2022 (Arm64), 2022 (amd64) Visual Studio 2022/2026 (amd64) and the .NET 6 x64 (for EF Core 6 unsupported) or .NET 8 x64 (for EF Core 8 and 9) runtime. If you do not use Visual Studio, a cross-platform command line tool for reverse engineering is available, more information here Solution Favorites pins your most important files to the top of Solution Explorer, whether they're in your solution or anywhere else on disk. Stop digging through folders This extension adds a Favorites node to Solution Explorer where you can organize quick links to the files you use most, including files outside your solution. Built in response to a highly requested feature from the Visual Studio community. Favorites are stored in favorites.json in your solution directory. Visual Studio 2026 (Arm64), 2026 (amd64), 2022 (Arm64), 2022 (amd64) JetBrains ReSharper is a powerful productivity extension for Microsoft Visual Studio designed to help developers write cleaner, more maintainable code with greater efficiency. It integrates directly into the IDE and enhances the development experience by providing advanced code analysis, refactoring tools, navigation features, and automated code generation. ReSharper continuously analyzes code as you type, highlighting issues and suggesting improvements that follow best practices and established coding standards. For developers working in C#, .NET, and related technologies, it can dramatically reduce repetitive work and make large codebases easier to manage. Key features include: Subscription Options and Pricing Visual Studio 2026, 2022, 2019, 2017, 2015, 2013 CSV Editor transforms flat, hard-to-read data files into colorful, navigable documents. Supports both CSV and TSV files ✨ Key Features at a Glance Visual Studio 2026 (Arm64), 2026 (amd64), 2022 (Arm64), 2022 (amd64) VSColorOutput can change the color of a line emitted to the output window based on specified rules. The rules consist of regular expressions. Rules map to classifications, which in turn map to colors. Visual Studio 2026 (Arm64), 2026 (amd64), 2022 (Arm64), 2022 (amd64) Templates let you quickly answer FAQs or store snippets for re-use. Are you sure you want to ? It will become hidden in your post, but will still be visible via the comment's permalink. Hide child comments as well For further actions, you may consider blocking this person and/or reporting abuse COMMAND_BLOCK:
modelBuilder.Entity<Employees>(entity =>
{ entity.HasKey(e => e.EmployeeID); entity.HasIndex(e => e.ContactTypeIdentifier, "IX_Employees_ContactTypeIdentifier"); entity.HasIndex(e => e.CountryIdentifier, "IX_Employees_CountryIdentifier"); entity.HasIndex(e => e.ReportsToNavigationEmployeeID, "IX_Employees_ReportsToNavigationEmployeeID"); entity.Property(e => e.Address).HasMaxLength(60); entity.Property(e => e.BirthDate).HasColumnType("datetime"); entity.Property(e => e.City).HasMaxLength(15); entity.Property(e => e.Extension).HasMaxLength(4); entity.Property(e => e.FirstName) .IsRequired() .HasMaxLength(10); entity.Property(e => e.HireDate).HasColumnType("datetime"); entity.Property(e => e.HomePhone).HasMaxLength(24); entity.Property(e => e.LastName) .IsRequired() .HasMaxLength(20); entity.Property(e => e.PostalCode).HasMaxLength(10); entity.Property(e => e.Region).HasMaxLength(15); entity.Property(e => e.TitleOfCourtesy).HasMaxLength(25); entity.HasOne(d => d.ContactTypeIdentifierNavigation).WithMany(p => p.Employees) .HasForeignKey(d => d.ContactTypeIdentifier) .HasConstraintName("FK_Employees_ContactType"); entity.HasOne(d => d.CountryIdentifierNavigation).WithMany(p => p.Employees) .HasForeignKey(d => d.CountryIdentifier) .HasConstraintName("FK_Employees_Countries"); entity.HasOne(d => d.ReportsToNavigationEmployee).WithMany(p => p.InverseReportsToNavigationEmployee).HasForeignKey(d => d.ReportsToNavigationEmployeeID); entity.HasMany(d => d.Territory).WithMany(p => p.Employee) .UsingEntity<Dictionary<string, object>>( "EmployeeTerritories", r => r.HasOne<Territories>().WithMany() .HasForeignKey("TerritoryID") .OnDelete(DeleteBehavior.ClientSetNull) .HasConstraintName("FK_EmployeeTerritories_Territories"), l => l.HasOne<Employees>().WithMany() .HasForeignKey("EmployeeID") .OnDelete(DeleteBehavior.ClientSetNull) .HasConstraintName("FK_EmployeeTerritories_Employees"), j => { j.HasKey("EmployeeID", "TerritoryID").IsClustered(false); j.HasIndex(new[] { "TerritoryID" }, "IX_EmployeeTerritories_TerritoryID"); j.IndexerProperty<string>("TerritoryID").HasMaxLength(20); });
}); COMMAND_BLOCK:
modelBuilder.Entity<Employees>(entity =>
{ entity.HasKey(e => e.EmployeeID); entity.HasIndex(e => e.ContactTypeIdentifier, "IX_Employees_ContactTypeIdentifier"); entity.HasIndex(e => e.CountryIdentifier, "IX_Employees_CountryIdentifier"); entity.HasIndex(e => e.ReportsToNavigationEmployeeID, "IX_Employees_ReportsToNavigationEmployeeID"); entity.Property(e => e.Address).HasMaxLength(60); entity.Property(e => e.BirthDate).HasColumnType("datetime"); entity.Property(e => e.City).HasMaxLength(15); entity.Property(e => e.Extension).HasMaxLength(4); entity.Property(e => e.FirstName) .IsRequired() .HasMaxLength(10); entity.Property(e => e.HireDate).HasColumnType("datetime"); entity.Property(e => e.HomePhone).HasMaxLength(24); entity.Property(e => e.LastName) .IsRequired() .HasMaxLength(20); entity.Property(e => e.PostalCode).HasMaxLength(10); entity.Property(e => e.Region).HasMaxLength(15); entity.Property(e => e.TitleOfCourtesy).HasMaxLength(25); entity.HasOne(d => d.ContactTypeIdentifierNavigation).WithMany(p => p.Employees) .HasForeignKey(d => d.ContactTypeIdentifier) .HasConstraintName("FK_Employees_ContactType"); entity.HasOne(d => d.CountryIdentifierNavigation).WithMany(p => p.Employees) .HasForeignKey(d => d.CountryIdentifier) .HasConstraintName("FK_Employees_Countries"); entity.HasOne(d => d.ReportsToNavigationEmployee).WithMany(p => p.InverseReportsToNavigationEmployee).HasForeignKey(d => d.ReportsToNavigationEmployeeID); entity.HasMany(d => d.Territory).WithMany(p => p.Employee) .UsingEntity<Dictionary<string, object>>( "EmployeeTerritories", r => r.HasOne<Territories>().WithMany() .HasForeignKey("TerritoryID") .OnDelete(DeleteBehavior.ClientSetNull) .HasConstraintName("FK_EmployeeTerritories_Territories"), l => l.HasOne<Employees>().WithMany() .HasForeignKey("EmployeeID") .OnDelete(DeleteBehavior.ClientSetNull) .HasConstraintName("FK_EmployeeTerritories_Employees"), j => { j.HasKey("EmployeeID", "TerritoryID").IsClustered(false); j.HasIndex(new[] { "TerritoryID" }, "IX_EmployeeTerritories_TerritoryID"); j.IndexerProperty<string>("TerritoryID").HasMaxLength(20); });
}); COMMAND_BLOCK:
modelBuilder.Entity<Employees>(entity =>
{ entity.HasKey(e => e.EmployeeID); entity.HasIndex(e => e.ContactTypeIdentifier, "IX_Employees_ContactTypeIdentifier"); entity.HasIndex(e => e.CountryIdentifier, "IX_Employees_CountryIdentifier"); entity.HasIndex(e => e.ReportsToNavigationEmployeeID, "IX_Employees_ReportsToNavigationEmployeeID"); entity.Property(e => e.Address).HasMaxLength(60); entity.Property(e => e.BirthDate).HasColumnType("datetime"); entity.Property(e => e.City).HasMaxLength(15); entity.Property(e => e.Extension).HasMaxLength(4); entity.Property(e => e.FirstName) .IsRequired() .HasMaxLength(10); entity.Property(e => e.HireDate).HasColumnType("datetime"); entity.Property(e => e.HomePhone).HasMaxLength(24); entity.Property(e => e.LastName) .IsRequired() .HasMaxLength(20); entity.Property(e => e.PostalCode).HasMaxLength(10); entity.Property(e => e.Region).HasMaxLength(15); entity.Property(e => e.TitleOfCourtesy).HasMaxLength(25); entity.HasOne(d => d.ContactTypeIdentifierNavigation).WithMany(p => p.Employees) .HasForeignKey(d => d.ContactTypeIdentifier) .HasConstraintName("FK_Employees_ContactType"); entity.HasOne(d => d.CountryIdentifierNavigation).WithMany(p => p.Employees) .HasForeignKey(d => d.CountryIdentifier) .HasConstraintName("FK_Employees_Countries"); entity.HasOne(d => d.ReportsToNavigationEmployee).WithMany(p => p.InverseReportsToNavigationEmployee).HasForeignKey(d => d.ReportsToNavigationEmployeeID); entity.HasMany(d => d.Territory).WithMany(p => p.Employee) .UsingEntity<Dictionary<string, object>>( "EmployeeTerritories", r => r.HasOne<Territories>().WithMany() .HasForeignKey("TerritoryID") .OnDelete(DeleteBehavior.ClientSetNull) .HasConstraintName("FK_EmployeeTerritories_Territories"), l => l.HasOne<Employees>().WithMany() .HasForeignKey("EmployeeID") .OnDelete(DeleteBehavior.ClientSetNull) .HasConstraintName("FK_EmployeeTerritories_Employees"), j => { j.HasKey("EmployeeID", "TerritoryID").IsClustered(false); j.HasIndex(new[] { "TerritoryID" }, "IX_EmployeeTerritories_TerritoryID"); j.IndexerProperty<string>("TerritoryID").HasMaxLength(20); });
}); - GitHub - always shown, backed by the .github folder
- Claude - shown when a .claude folder exists
- Agents - shown when a .agents folder exists - Add Copilot Instructions - Create an instructions file (.instructions.md) in the instructions folder
- Add Agent - Create a custom Copilot agent (.agent.md) in the agents folder
- Add Prompt - Create a reusable prompt file (.prompt.md) in the prompts folder
- Add Skill - Create an agent skill folder with skill.md in the skills folder - Add Workflow - Create a new GitHub Actions workflow (.yml) in the workflows folder
- Add Dependabot Config - Create a dependabot.yml for automated dependency updates
- Add Issue Template - Create an issue template in the ISSUE_TEMPLATE folder
- Add Pull Request Template - Create a PULL_REQUEST_TEMPLATE.md file
- Add CODEOWNERS - Create a CODEOWNERS file for automatic reviewer assignment
- Add FUNDING.yml - Create a FUNDING.yml file for sponsor button configuration
- Add SECURITY.md - Create a SECURITY.md file for security policy documentation - Copy Path - Copy the full path to the clipboard
- Rename - Rename files or folders directly from the context menu
- Delete - Delete files or folders with confirmation - Open in File Explorer - Open the folder in Windows File Explorer
- Open Containing Folder - Open the parent folder and select the file in File Explorer
- Open on GitHub - Open the file or folder directly on GitHub.com in your browser - Unchanged - Files committed to the repository with no changes
- Modified - Files with local changes
- Staged - Files staged for commit
- Added/Untracked - New files not yet tracked by Git
- Deleted - Files marked for deletion
- Conflict - Files with merge conflicts
- Renamed - Files that have been renamed - GitHub Awesome Copilot - Community templates from awesome-copilot for agents, prompts, instructions, and skills
- dotnet/skills plugins - Templates from dotnet/skills/plugins for agents and skills
- anthropics/skills - Templates from anthropics/skills for skills - Supports CommonMark, GitHub-flavored Markdown, FrontMatter YAML, Mermaid, and math notation.
- Floating toolbar: When you select text in the markdown editor, a floating toolbar appears near the selection with quick access to common formatting commands
- Live preview window with scroll sync and dark theme support.
- Drag and drop images directly from Solution Explorer or File Explorer.
- Generating table of contents
- Fenced code blocks
- Supports all Mermaid diagram types for visualizing complex information.
- Emoji IntelliSense
- Anchor IntelliSense
- Heading-based navigation - To get started in most cases all that is needed is the server name and database name to reverse engineer a database
- Provides and option to install EF Core NuGet packages
- Working with PostgreSQL, SQLite, Oracle, MySql or FireBird refer to the following documentation.
- DbContext Model Diagram - Adds a DGML graph from your DbContext Model
- Option to store the connection string in code, which is good for testing the generated code. Once an initial test is done, it's recommended to move the connection string to appsettings.json.
- With EF Power Tools, each database table is configured as shown below: indices, related tables, constraints, and various property configurations. - Reverse engineer options - Share with team: Commit the file to source control
- Keep personal: Add favorites.json to .gitignore - Advanced Code Analysis – Detects errors, code smells, and potential bugs in real time.
- Powerful Refactoring Tools – Safely rename, extract methods, change signatures, and restructure code.
- Intelligent Code Navigation – Quickly jump to files, types, symbols, or usages across large solutions.
- Automated Code Generation – Generate constructors, properties, equality members, and more.
- Code Cleanup and Formatting – Enforce consistent coding styles automatically.
- Unit Testing Support – Built-in integration with common .NET testing frameworks.
- Context-Aware Suggestions – Offers quick fixes and improvements directly within the editor. - Syntax Highlighting — Color-coded columns for instant visual parsing
- Column Alignment — Align columns visually with a single command for table-like readability
- Shrink Columns — Remove leading/trailing whitespace from all cells
- Alternate Row Colors — Toggle alternating row backgrounds for improved readability
- Copy as Markdown — Copy selection as a formatted Markdown table
- Smart Header Detection — Automatically identifies header rows
- QuickInfo Tooltips — Hover over any cell to see column name, index, and detected data type
- Column Sorting — Sort ascending or descending directly from the tooltip
- Error Detection — Rows with inconsistent column counts are highlighted
- Go To Column — Jump to any column by number
- Large File Support — Optimized for files with 100K+ lines