Here at Kentico, we're fans of using agentic AI software development workflows to help us experiment more and move faster. With the speed of AI innovation happening across the software development tool landscape, it can be easy to miss AI capabilities in the tools you're already using.

One of those recently released and potentially overlooked tools is VS Code's custom chat modes for GitHub Copilot. Let's see how we can combine a custom chat mode and Context7's MCP server to bring Xperience by Kentico's guides and documentation directly into our Copilot experience.

This post was written for Xperience by Kentico v30.8.0. Please consult the documentation for any feature or API changes when using a different version. Be sure to check the System Requirements in the product documentation.

Goal: Keeping our agent on track

General purpose large language models, like ChatGPT, Claude, or Gemini have expert-level knowledge about many topics but they can easily be tripped up by niche context details - like the difference between Xperience by Kentico's features and those in older versions of Kentico's products.

This product confusion can make it difficult to reliably use agentic software development in tools like Copilot, Cursor, or Claude Code - we know the difference between the products, but the LLM does not.

We'd like to focus the agent's attention and context on Xperience by Kentico exclusively when we ask questions about architecture, features, code examples, and best practices.

Context7 MCP server configuration

We already have a fantastic resource of well organized and detailed information about Xperience by Kentico - the Kentico Learn Portal!

If only we could give our agent access to all that context when asking questions...

Thankfully, our team here at Kentico already set up an open-source markdown repository containing all of our docs and training guides. This repository is indexed by Context7 - a service that parses and generates vector embeddings from software library documentation. We can query those embeddings using the Context7 MCP server.

VS Code added support for MCP servers earlier this year and Context7's repo documents how to configure theirs in one simple step.

The MCP server is delivered via an npm package, but VS Code handles the installation.

{
  "servers": {
    "context7": {
      "command": "npx",
      "args": ["-y", "@upstash/context7-mcp@latest"]
    }
  },
  "inputs": []
}

We just need to create a file .vscode\mcp.json and add the server configuration above to the file.

Once added, you can start the MCP server by hovering over the context7 JSON property key, using the VS Code menu, the visual management interface.

We now have the documentation data source set up, but we need our AI agent to use it and not get distracted with older Kentico product information.

Create a new chat mode definition

Chat modes in GitHub Copilot let you change how the LLM model is used by Copilot. There are 3 built-in modes, with Agent mode being the most commonly used for agentic AI software development workflows.

Custom chat modes give us even more control over the AI chat experience.

Let's create a custom chat mode for documentation search.

---
description: "Search through Xperience by Kentico's 
documentation and training materials for information about product 
architecture, features, best practices, API information, 
and code examples."
tools: ["context7"]
---

# Xperience Docs Search instructions

You are in search mode. Your job is to search Xperience by Kentico's 
documentation and guide materials to answer questions about specific 
product architecture, feature, best practices, API information, 
and code example topics.

When searching, always prioritize the documentation resources for 
answers on features, tools, and APIs.

## Response style

The response should be brief and to the point. Prefer concise answers
that directly address the request. The goal of the response is to 
help the user find the information they need quickly and efficiently.

## Response content

You should respond to questions with the following information

- The product architecture, feature, or API that is most applicable 
   to the request
- Related product concepts that might give helpful context to the 
   request
- Example code, if this has been requested
- Inline links and citations to the source documentation to make it 
   easy to navigate to the docs and discover more on the requested topic
- Best practices and tips related to the request and potential issues
   to watch out for

We're being very explicit with the chat mode description, request, and response guidelines and also limiting the tools that the AI has access to. In this case it can only use Context7 to do documentation searches and cannot access the repository, so I don't need to worry about surprise edits when I just want to learn about a feature.

If we wanted a general purpose set of rules we could instead use custom instructions, but we want to make sure that when we're doing product or API exploration we aren't accidentally misled by outdated information coming from a web search or the model's training.

Using a custom chat mode also lets us avoid overloading the context window for the agent with a bunch of rules about code or git commit conventions that aren't relevant to a documentation search and summary.

Ask Copilot about Xperience by Kentico's product features

Now let's open the GitHub Copilot chat interface and change the chat mode to the one we just created.

Here's an example request I made to Copilot using this documentation search chat mode.

How does digital commerce work with the Email Builder?

And here's the response that came back from Copilot, using the Context7 MCP server and the Xperience by Kentico documentation and guides.

How Digital Commerce Works with Email Builder in Xperience by Kentico

Digital commerce in Xperience by Kentico integrates seamlessly with the Email Builder for order notification emails. Here's how they work together:

Order Status Change Emails

The primary integration between digital commerce and Email Builder is for order notification emails that are triggered when order statuses change. These emails have specific purposes:

  • Email Purpose: Order status change

  • Availability: Email Builder is specifically supported for emails with 'Regular', 'Automation', and 'Order status change' purposes

  • Dynamic Content: You can include order-specific information using dynamic placeholders and Email Builder components

Key Integration Points

1. Order Context Access in Email Builder Components

Email Builder components can access order data through the IEmailBuilderOrderContextAccessor service:

[Inject]
private IEmailBuilderOrderContextAccessor OrderContextAccessor { get; set; } = default!;

[Inject]
private IInfoProvider<OrderInfo> OrderInfoProvider { get; set; } = default!;

protected override async Task OnInitializedAsync()
{
    if (!EmailContextAccessor.GetContext().IsPreview)
    {
        // Get order ID from context
        int orderId = OrderContextAccessor.Context.OrderId;
        
        // Retrieve order details
        OrderInfo order = await OrderInfoProvider.GetAsync(orderId);
        decimal? orderGrandTotal = order?.OrderGrandTotal;
        
        // Get order items
        IEnumerable<OrderItemInfo> orderItems = await OrderItemInfoProvider.Get()
                    .WhereEquals(nameof(OrderItemInfo.OrderItemOrderID), orderId)
                    .GetEnumerableTypedResultAsync();
    }
}

2. Order Status Configuration

Configure order statuses in the Commerce application to send notifications:

  • Navigate to Commerce configuration

  • Create order statuses with the "Notify users/customer when order reaches this status" option enabled

  • This triggers both customer and internal notifications

3. Commerce-Specific Email Features

Your Dancing Goat project already has commerce and email builder enabled:

// From your Program.cs
builder.Services.AddKentico(features =>
{
    features.UseCommerce();           // Digital commerce
    features.UseEmailBuilder();      // Email Builder
    features.UseEmailMarketing();    // Email marketing
});

Dedicated Commerce Email Channel

Best Practice: Use a dedicated email channel for commerce notifications to:

  • Protect sender reputation with a separate sending domain

  • Prevent delays from other email operations (like newsletters)

  • Ensure timely order notification delivery

Email Builder Components for Commerce

You can create custom Email Builder widgets that display:

  • Order summaries with product details

  • Order totals and pricing information

  • Product images from order items

  • Customer information and shipping details

  • Order tracking links and status updates

Preview Mode Handling

Email Builder components should handle preview modes appropriately:

if (!EmailContextAccessor.GetContext().IsPreview)
{
    // Use real order data
}
else
{
    // Use sample order data for preview
}

The integration allows you to create rich, branded order confirmation and status update emails using the visual Email Builder interface while accessing real-time order data from your commerce system.


This is a pretty good summary about how to use the Email Builder in a digital commerce scenario and I especially like the simple best practices called out near the bottom with additional links to the docs if I want to investigate related topics in detail.

Where do we go from here?

I got the idea for this Xperience Docs Search chat mode by watching this video from the VS Code team about custom chat modes and in my limited experiments it has worked really well.

If I were to further enhance this custom chat mode I think I would include instructions to identify where I could apply the topic I searched for in my project, or where I wasn't following best practices.

I might try defining a couple styles of response

  • Detailed - basically what we have now

  • Brief - a short description and links to the docs but nothing else

  • Example code - just showing example code that I could quickly copy and paste into my project or ask an agent to reference to build a new feature

Have you had any experience with custom chat modes or have you preferred to stick to things like prompt files and custom instructions?

Let me and others know what's working for you in the discussion for this post!

For those who are curious, I was able to easily access my agent chat history to paste into this blog post using SpecStory, an extension that works in both VS Code and Cursor. I think this is a really useful extension if you want to share your agent conversation experiences with others to compare notes or learn something new.