Yogesh Shinde
ServiceNow Employee

 

An upgrade to my earlier Virtual Agent + Microsoft Teams build guide

My earlier community article, Integrating ServiceNow Virtual Agent with Microsoft Teams, walked the configuration using the pre-published "Now Virtual Agent" bot. This article documents an alternative path on the same integration surface: the self-configured bot, integrating Now Assist in Virtual Agent (NA-VA) and AI Agents from AI Agent Studio with the Microsoft Copilot Custom Engine Agent surface.

 

Self-configured bot vs pre-published "Now Virtual Agent" bot:

Decision factor Self-configured Pre-published "Now Virtual Agent"
Bot identity ownership Customer-owned in Entra tenant ServiceNow-owned, multi-tenant
Multi-instance support Yes No
Custom branding + Copilot integration Yes Limited

Selected: self-configured bot. Drivers: developer M365 E5 sandbox, non-production ServiceNow instance, design includes Now Assist + Microsoft Copilot.

Build scope:

  • Plugin. sn_va_teams v10.1.1 or later. This article documents an implementation on the ServiceNow Australia release.
  • NA-VA(default) assistant provides LLM-backed conversation responses with citations and Genius Result cards, plus AI Agent execution results delivered to Teams.
  • AI Agents from AI Agent Studio surface in the Teams bot's topic catalog. Execution lives in sn_aia_execution_plan and sn_aia_execution_task, not the classic sys_cs_message ledger — important to know when diagnosing.
  • Microsoft Copilot Custom Engine Agent (CEA) picks up the bot when the manifest carries a copilotAgents.customEngineAgents block (auto-generated when you tick Copilot in Step 6).

The rest of this article walks the build end to end and gives you the verification commands to prove each step.


Why does this matter?

ServiceNow ships the channel adapter (sn_va_teams), Microsoft ships the bot framework + CEA, and the integration between them is configuration, not code. But the sequencing is unforgiving — and the troubleshooting surface is wide if you get it wrong. Knowing the shape of the build up front saves a working day.

BEFORE the integration: NA-VA only available in the ServiceNow web/mobile client. Users alt-tab out of Teams to ask the assistant, lose conversational context, and skip the AI Agents they don't know exist. Adoption stays low even when the underlying Now Assist quality is high.

AFTER the integration: A single Teams bot exposes NA-VA in the conversation pane the user is already in. Topics, OAuth account linking, KB citations, Genius Results, and AI Agent invocations all land in the same chat thread. The Microsoft Copilot surface picks the bot up automatically once the manifest carries the CEA capability.


How the integration is wired

The end-to-end conversation crosses two tenants, three runtimes, and one bot framework. The plugin sn_va_teams is the seam.

The key components:

  • sn_va_teams plugin — the ServiceNow-side channel adapter, manifest generator, and OAuth bridge. Required version: v10.1.1 or later.
  • Microsoft Bot in Developer Portal — the identity registered in dev.teams.microsoft.com. Carries Bot ID, Client Secret, Endpoint URL.
  • Self-configured bot integration record — created on the ServiceNow side; auto-creates the OAuth provider, OIDC provider, message_auth row, and the sys_cs_provider_application adapter row + its -cea sibling (the Copilot-tagged record).
  • NA-VA(default) assistant — your existing Now Assist in Virtual Agent assistant. The conversation experience that the Teams bot routes to.
  • Display Experience binding — the Teams bot, added as a channel under NA-VA's Display experiences in Assistant Designer.
  • Custom Engine Agent activation — the Copilot checkbox on the bot's integration record. This is what makes the manifest carry the copilotAgents.customEngineAgents block.
  • Teams app manifest — ServiceNow-generated zip, uploaded to Teams Admin Center. Carries bots[0].scopes: ["personal", "copilot"].
  • AI Agent Studio execution surface — any AI Agent visible to NA-VA gets a topic-catalog entry automatically. Execution lives in sn_aia_* tables, not the standard sys_cs_message ledger.

Identity flow at a glance

  • Inbound (Teams → ServiceNow): Bot Framework signs every callback with a Microsoft-issued bearer token. sn_va_teams validates via the OIDC metadata URL.
  • Outbound (ServiceNow → Bot Framework): Authorization Code grant scoped to https://api.botframework.com/.default.
  • End-user identity: Teams user is mapped to a ServiceNow user via email match on first interaction (account linking flow).

The fixed activation order

NA-VA surfacing on Teams Copilot requires two ServiceNow modules in this exact order:

  1. Assistant Designer binds the Teams self-configured bot under NA-VA(default)'s Display experiences > Channels.
  2. Channels and Integrations > Edit configuration ticks the Copilot checkbox and re-downloads the manifest.

Reverse the order and the bot's integration form offers Message Extension instead of Copilot — the manifest is built without the CEA capability — end users see "Turn on AI features for Now Virtual Agent."


Where this fits on the ServiceNow platform

Capability Provider Plugin / App Role in this build
Virtual Agent core Glide Virtual Agent com.glide.cs.chatbot Conversation runtime
Microsoft Teams channel adapter Conversational Integration with Microsoft Teams (Store) sn_va_teams (v10.1.1+) Channel adapter, manifest generator, OAuth bridge
Microsoft Teams Graph spoke Auto-installed with sn_va_teams sn_msteams_ahv2 Microsoft Graph integration
Now Assist in Virtual Agent NAVA store app NAVA Generative LLM conversation layer
Assistant Designer Conversational Interfaces Core (Australia release) Configure assistants, display experiences, channels
AI Agent Studio Now Assist AI Agents sn_aia_* Surfaces OOB and customer-authored AI Agents into the Teams bot's topic catalog
Build context: this article documents an implementation on the ServiceNow Australia release. Validate platform compatibility against your own release/patch level before starting.

Build the integration — the 10 steps

Each step has an explicit verification check so you can prove it before moving on.

Step 0 — Prerequisites

Check How
ServiceNow Australia release, latest patch sys_properties.list filter glide.product.version + glide.buildname
Glide Virtual Agent active sys_plugins.list filter com.glide.cs.chatbot
AI Search enabled ais_status.do
Now Assist for ITSM (or relevant Now Assist module) installed sys_store_app.list
NA-VA(default) assistant exists Assistant Designer
NowLLM connection URL set sys_connection record points at an active datacenter
Microsoft 365 E5 Developer Sandbox tenant active admin.microsoft.com
You are Global Administrator (or Application Administrator) on the Microsoft tenant M365 Admin Center

Verify: all checks pass.

Step 1 — Install or upgrade sn_va_teams

  1. Open https://<your-instance>.service-now.com/sys_store_app_list.do, filter id=sn_va_teams.
  2. If row exists with version ≥ 10.1.1, skip to verify.
  3. Otherwise: ServiceNow Store > Conversational Integration with Microsoft Teams > Get/Update.
  4. Confirm dependents: sn_msteams_ahv2 present (required); sn_now_teams is a positive signal.

Verify: sn_va_teams version ≥ 10.1.1, Active=true; sn_msteams_ahv2 present.

Step 2 — Microsoft 365 developer sandbox readiness

  1. Sign in to https://admin.microsoft.com in an incognito window as the developer-tenant Global Administrator.
  2. Confirm the tenant is Active and the 90-day auto-renew is engaged.
  3. Have at least one test user other than yourself (the prepopulated sample users like Adele Vance are fine).

Verify: tenant ID is visible in the admin home; at least two users Active.

Step 3 — Microsoft Developer Portal — create the bot

  1. Open https://dev.teams.microsoft.com in an incognito browser, signed in to the dev tenant.
  2. Tools > Bot management > Create a new bot. Name it (example: Now Assist VA — Lab) > Add.
  3. Open the bot > Configure tab > Endpoint address = https://<your-instance>.service-now.com/api/now/v1/cs/adapter/msft/events > Save.
Critical: the endpoint must match the ServiceNow instance where you'll run Step 4. A wrong endpoint = silent no-response in Teams. If you pivot test targets later, update the endpoint, save, wait ~60 seconds for Bot Framework propagation.
  1. Channels tab > tick Microsoft Teams. Leave Microsoft 365 Extensions (Preview) unticked.
  2. Client secrets tab > Create your first client secret, 12-month validity. Copy it immediately — Microsoft will never re-display it.
  3. Capture four values for Step 4:
    • Bot ID (<bot-app-id>)
    • Tenant ID (<tenant-id>) — fastest source is https://entra.microsoft.com home page
    • Client Secret (<client-secret>)
    • Bot Name

Verify: bot is listed in Tools > Bot management; endpoint reflects your instance URL exactly.

Step 4 — ServiceNow — register the self-configured bot

This single Submit auto-creates every ServiceNow-side record the integration needs.

  1. All > Conversational Interfaces > Settings > General Settings > Channels and routing > View All.
  2. Microsoft Teams tile > Add Integrations > Integrate with your self-configured bot.
  3. Fill the form:
Field Value
Name of the bot <bot-name>
Tenant ID <tenant-id>
Client ID (App ID) <bot-app-id>
Client Secret <client-secret>
Single tenant bot Tick if the bot was created after October 2025
  1. Submit.
Ordering trap: the success screen shows a Configure button. It's a shortcut to the same Edit configuration form Step 6 uses. Do not click it yet. Run Step 5 first, or the form will offer Message Extension instead of Copilot.

Verify (records auto-created):

  • Microsoft Teams tile shows your bot under Self-configured.
  • sys_cs_provider_application.list filter nameLIKE<bot-name> shows two rows: <bot-name> and <bot-name>-cea.
  • oauth_entity.list shows one new External OIDC row named sample-msteams-oauth-consumer-<tenant-id>.
  • message_auth.list filter group_name=<tenant-id> shows one row.

Step 5 — Assistant Designer — bind the Teams bot to NA-VA

  1. All > Conversational Interfaces > Assistant Designer.
  2. Now Assist in Virtual Agent (default) > Edit.
  3. Settings tab > Display experiences > Channels.
  4. Tick Select row for your Teams self-configured bot.
  5. Save and continue.

Verify: re-open the same page — the row is checked; the Review page lists the Teams bot.

Step 6 — Activate Now Assist Copilot on the bot

  1. All > Conversational Interfaces > Channels and Integrations.
  2. Microsoft Teams tile > Manage > Self-configured tile > 3-dot menu > Manage bot.
  3. Edit configuration. The form must show Copilot (not Message Extension). If it shows Message Extension, return to Step 5.
  4. Tick Copilot. Sample Prompts window opens — leave defaults or add your own.
  5. Save.
  6. Configuration tab now shows Download under "Your package" — download the manifest zip.

Verify: sys_cs_provider_application.list shows the -cea Copilot-tagged sibling row; the local zip contains manifest.json, color.png, outline.png; manifest.json has a copilotAgents.customEngineAgents block.

Step 7 — Microsoft Teams Admin Center — upload the manifest

  1. Open https://admin.teams.microsoft.com in incognito (dev tenant).
  2. Teams apps > Setup policies > Global (Org-wide default)Upload custom apps = ON → Save.
  3. Teams apps > Manage apps. If a prior version exists, either Delete it or ensure the new manifest Version is higher.
  4. Actions > Upload new app > pick the manifest zip from Step 6.
  5. Wait until app state = Allowed. Capture the new Teams App ID (<teams-app-id>).

Verify: Manage apps lists the bot at the new version, capabilities row shows Custom Engine Agent.

Step 8 — First-run smoke test (account linking)

  1. Open Microsoft Teams (web or desktop), signed in as a test user.
  2. From Teams Admin Center > Manage apps > your app > Users and groups > Install app (or open the in-Teams app store and Add).
  3. In the bot chat, type hi.
  4. The bot replies with Link to ServiceNow, Continue as Guest, Check out Tips.
  5. Click Link to ServiceNow, complete OAuth, confirm linking.

Verify: the bot returns the welcome card and greets you by name; sys_cs_conversation.list shows a new conversation device=Teams^state≠Faulted.

If there's no response at all, the #1 cause is a Step-3 endpoint URL pointing at the wrong instance.

Step 9 — Now Assist + AI Agent smoke tests

9a. Topic invocation:

  1. From the welcome card, pick Create Incident.
  2. Bot prompts for short description, then remaining slots.

Verify (9a): sys_generative_ai_log filtered to the conversation shows Unified Skill Slotfill + VA Input Response Generation entries; conversation reaches state=Completed.

9b. AI Agent invocation:

  1. Type a query that maps to one of the AI Agents in the topic catalog (e.g., <your-agent-trigger-phrase> <record-number>).
  2. The agent reasons over the target record and delivers verdict + closure to Teams.

Verify (9b): sn_aia_execution_plan.list shows one row state=Completed with sn_aia_execution_task children all status=Success; Teams chat shows agent reasoning + citations + verdict.

Troubleshooting the silent failures

Symptom Most likely cause Fix
Teams shows "Turn on AI features for Now Virtual Agent" Copilot activated before Assistant Designer binding Re-run Step 5, then Step 6
Bot is silent — no response, no Faulted row Bot endpoint in Developer Portal points at the wrong ServiceNow instance Correct endpoint in Developer Portal Configure tab, wait ~60s
Outbound conversation stuck in pending; syslog has AADSTS90038 Wrong tenant ID on the auto-created OIDC oauth_entity Edit the OIDC row, correct the Token URL tenant id
Outbound pending; syslog has AADSTS7000222 or invalid_client Client secret expired in Microsoft Issue new secret in Developer Portal; update the OAuth row
sys_cs_provider_application has the adapter row but no -cea sibling Copilot not activated, or activation didn't persist Re-run Step 6
Teams Admin Center shows older app version after re-upload Manifest Version not bumped Bump version on download in Step 6, re-upload
Free-text question returns generic Greeting topic; sys_generative_ai_log has no entries No matching topic or AI Agent in the NA-VA catalog — not a Teams integration issue Add an AI Agent or KB-search skill for that query domain
Tables to cross-check for AI Agent execution:
  • sys_cs_message — message ledger for topic-driven flows
  • sn_aia_execution_plan — one row per AI Agent invocation
  • sn_aia_execution_task — per-task status inside a plan
  • sys_generative_ai_log — LLM call telemetry
A conversation can show zero sys_cs_message Inbound rows yet have a complete AI Agent execution. Always cross-check both.

Architecture diagram

VA_MSTeams_Integration.png


Resources

Resource Where
Conversational Integration with Microsoft Teams (channel adapter) ServiceNow Store — search sn_va_teams
Now Assist in Virtual Agent (NAVA) ServiceNow Store — NAVA app
Microsoft Developer Portal for Teams https://dev.teams.microsoft.com
Microsoft Teams Admin Center https://admin.teams.microsoft.com
Microsoft Entra (tenant ID, app registrations) https://entra.microsoft.com
Microsoft 365 Developer Program (E5 sandbox) https://developer.microsoft.com/microsoft-365/dev-program
Custom Engine Agent (Microsoft Copilot) docs Microsoft Learn — search "Custom Engine Agent"
AI Agent Studio (OOB and customer-authored AI Agents) ServiceNow product docs — AI Agent Studio

#NowAssist #VirtualAgent #MicrosoftTeams #AIAgentStudio #NowAssistVA #CustomEngineAgent #MicrosoftCopilot #ServiceNow #ConversationalAI #AIAgents #ChatBot #DigitalWorkplace #sn_va_teams #ITSM #AustraliaRelease


Version history
Last update:
4 hours ago
Updated by:
Contributors