关于 service-itsm-teams-itservice-configure
此技能通过 headless-360 配置 Salesforce IT Service 的 Teams 员工端,包括启用偏好设置、分配访问权限和选择 Digital Experience Site。它还说明人工安装应用及登录前置条件。
主要功能
- 01启用员工端 Teams 偏好设置
- 02提供应用安装链接与帮助文档
- 03为指定用户分配权限集
- 04选择 Digital Experience Site
- 05检查员工登录前置条件
适用场景
- 01为员工启用 Teams 工单自助服务
- 02为特定员工配置 IT Service 访问
- 03排查 Teams 员工端登录障碍
MCP 相关
技能通过 headless-360 调用 Salesforce API 配置 Teams 员工端;Teams 应用安装仍需用户在 Microsoft 管理中心手动完成。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ forcedotcom/ sf-skills --skill service-itsm-teams-itservice-configure安装后在 Claude Code 中输入/service-itsm-teams-itservice-configure确认已加载。
详细介绍
设置 Salesforce IT Service(Microsoft Teams)
完成 Teams ITSM Go 页(service-cloud-itsm-teams-integration 的功能页面)上的 “设置 Salesforce IT Service” 检查清单组——这是 Teams ITSM 集成的员工端,供员工在 Teams 中创建和管理自己的工单。每项操作都通过 headless-360 执行。
范围
- 包含:启用
OrgHasEmployeeServiceTeams偏好设置;向用户提供准确的 Teams Marketplace 链接和 IT Service 应用安装帮助文档;为已确认的用户分配TeamsForEmployeeUser权限集;通过SLACK_PREFERRED_SITE组织值选择要关联 Teams 的 Digital Experience Site。 - 不包含:Teams Salesforce Go 页面的基础开关(
ITSMTeamsEnabled)、Azure/Entra 应用注册、Named Credential 填充,以及 Teams 扩展程序/首选站点注册——请使用service-itsm-teams-configure(此技能的前置条件)。检查清单中 IT Desk/处理人员的部分——请使用service-itsm-teams-itdesk-configure。
**前置条件:**先运行 service-itsm-teams-configure(也可同时运行)——此技能假定 service-cloud-itsm-teams-integration Go 功能已启用。
每次只执行一个步骤。 这些步骤会发起实际的状态变更 API 调用。每次只运行一项操作,展示结果并确认成功,然后再继续——不要将多个设置调用合并到一个并行代码块中。
工作流
步骤 1 — 启用 Salesforce IT Service
这是一项直接的组织偏好设置开关(与 ITSMTeamsEnabled 不同,此项支持直接 PATCH)——请自行通过 API 启用,不要让用户点击 Setup 开关:
mcp__headless-360__dispatch(
method: "PATCH",
url: "/services/data/v67.0/setup/org/preferences/OrgHasEmployeeServiceTeams",
body: { "desiredState": true }
)
预期结果为 200 {"isPreferenceEnabled": true}。告知用户该功能已启用——不要让他们自行切换开关。
步骤 2 — 在 Teams 上安装 Salesforce IT Service 应用(由用户负责)
此技能无法调用 Salesforce 或 Microsoft API 将 Teams 应用安装到租户的应用目录中——这始终需要用户使用拥有足够租户权限的账号登录 Microsoft Teams 管理中心 / AppSource,并手动点击“添加”。请向用户提供准确的 Marketplace 链接和帮助文档;不要尝试自动执行此步骤。
- Marketplace(已通过 Go 页面的“前往 Microsoft Marketplace”按钮在线验证):
https://marketplace.microsoft.com/en-us/product/teams-app/WA200009838?tab=Overview - 帮助文档:
https://help.salesforce.com/s/articleView?id=service.it_srvcs_msteams_config_emplye_srvcs_app.htm&type=5
请同时打印这两项。还要告知用户:员工登录时使用的 Microsoft 电子邮件地址必须与该 Salesforce 用户的 Username 一致(SSO 会将 MS UPN 映射到 Username;不一致会导致登录失败且不显示任何提示)。
然后暂停,直到用户回复 “已安装”——这是只能由人工执行的操作;不要继续,也不要伪造确认。
步骤 3 — 管理用户访问权限
“管理用户访问权限”(Go 页面上的“管理”按钮)用于分配权限集 — 已通过“管理 Microsoft Teams for Employee 服务用户访问权限”对话框确认:
TeamsForEmployeeUser(标签为 “Teams for Employee”,由 PSLTeamsForEmployeePsl支持)
不要直接为所有活跃用户分配权限。 询问用户具体要为哪些用户授予访问权限。 如果他们想先查看用户列表(而不是直接指定用户),请分页显示 — 每页最多显示 10 个用户,然后在显示下一页之前询问“还要查看更多吗?”,因为有些组织可能有数百甚至数千名用户:
mcp__headless-360__dispatch_readonly(
method: "GET",
url: "/services/data/v67.0/query",
queryParams: { "q": "SELECT Id, Name, Username, Email FROM User WHERE IsActive = true ORDER BY Name LIMIT 10 OFFSET <page * 10>" }
)
授予对象 — 提前提醒用户: 目标必须是真实员工 / UEL 用户,且其电子邮件地址必须存在于 Azure/Entra 侧(同一租户中的 Microsoft 账号)。登录使用 SSO(MS UPN → Salesforce Username),因此如果将权限分配给没有匹配 Azure 账号的用户 — 或电子邮件地址与 UPN 不一致 — 登录会静默失败(参见上文 UPN↔Username 说明)。分配前请说明这一点;切勿分配给系统 / 集成账号。
已确认的注意事项(识别不应选择的用户): 在临时 / 测试组织中,第一页或前几页通常以非员工账号为主 — 例如 Automated Process、Bot User、Insights Integration、*.ext 集成用户、ESW_* / *Site Guest User 访客、DigitalAgent.* Agent — 这些都不是员工 / UEL 用户,也没有 Azure 身份。请标记这类行可能不是员工(不要静默过滤 — 请明确指出);如果用户说“不是员工用户,跳过”,就转到下一页。
用户确认具体用户后,查询权限集的 Id(该值在每个组织中都稳定,但不要硬编码 — 每次都重新查询):
mcp__headless-360__dispatch_readonly(
method: "GET",
url: "/services/data/v67.0/query",
queryParams: { "q": "SELECT Id, Name FROM PermissionSet WHERE Name = 'TeamsForEmployeeUser'" }
)
然后通过 PermissionSetAssignment 为每位已确认的用户分配权限集(每位用户一条记录 — 可根据需要分批调用,此处没有公开批量分配端点):
mcp__headless-360__dispatch(
method: "POST",
url: "/services/data/v67.0/sobjects/PermissionSetAssignment",
body: { "AssigneeId": "<user id>", "PermissionSetId": "<permission set id>" }
)
通过重新查询该 AssigneeId 对应的 PermissionSetAssignment 来验证,或者直接信任分配调用返回的 201,并通过 SELECT ... FROM PermissionSetAssignment WHERE AssigneeId = '<user id>' AND PermissionSetId = '<permset id>' 进行回读。
登录前提条件(用户要在 Teams 中实际登录 IT Service 的必备条件)
分配上述权限集是必要条件,但并非充分条件——UEL 用户在 Teams 中打开 IT Service 应用后,仍可能遇到无提示的登录失败,除非以下三项条件也全部满足。启用用户时,请一并核实(并设置)这些条件:
-
员工登录配置文件(例如 Unified Employee)中的 “Allow OAuth for employees” — Setup → Profiles → (profile) → Session Settings → 勾选 Allow OAuth for employees。 请在 Setup UI 中设置此项。 它不是 Profile SObject 字段(在
Profiledescribe 中不会显示 OAuth 字段),也不是 Metadata 元素Profile.sessionSettings.allowOauthForEmployees——包含<sessionSettings><allowOauthForEmployees>的 Profile metadata 部署会验证失败:Element {…}sessionSettings invalid at this location in type Profile(已于 2026 年 8 月验证)。此项也无法通过无头 360 Connect/REST/Tooling dispatch 读取或写入。请使用 Setup UI 中的复选框。已确认的阻塞原因:关闭此项时,嵌入式应用的 OAuth 握手会失败,登录也不会完成,且不会显示提示——社区登录成功(LoginHistory 中 “Employee Login to Community” = Success),但不会为该用户创建任何OauthToken,Teams 应用会再次弹出 “Single Sign-On / Login with URL” 选择器(通常还会弹出/…/setup/secur/RemoteAccessAuthorizationPage“Service Not Available” 窗口)。 -
CORS Allowed Origins 必须包含两个 Teams 来源。通过
dispatch_readonly GET /services/data/v67.0/query查询SELECT Id, UrlPattern FROM CorsWhitelistEntry,并使用dispatch POST /services/data/v67.0/sobjects/CorsWhitelistEntry请求体{"UrlPattern": "<origin>"}创建缺少的条目(这是一个数据 API sobject,不是 Tooling 类型——ToolingPOST/query 会返回NOT_FOUND/INVALID_TYPE):https://teams.cloud.microsofthttps://cdn.scs.static.lightning.force.com——嵌入式 IT Service 界面加载所用的 Lightning 静态资源 CDN。已确认的阻塞原因:缺少此来源时(即使已添加teams.cloud.microsoft),浏览器也会阻止资源/OAuth 预检请求,导致登录无提示失败。添加后,请让用户强制刷新页面 / 清除 Teams 应用缓存。
-
用户的系统权限集中必须启用 “API Enabled” 系统权限(
PermissionsApiEnabled = true)——不能只在基础配置文件中启用,否则嵌入式应用的 API 调用会被拒绝,用户无法登录。请使用 IT Desk 采用的全组织通用、仅创建一次的权限集(通常名为Teams_Employee_ApiAccess):查询PermissionSet WHERE Name = 'Teams_Employee_ApiAccess';如果不存在,则创建一次(POST /sobjects/PermissionSet{"Name":"Teams_Employee_ApiAccess","Label":"Teams Employee API Access","PermissionsApiEnabled":true}); 然后分配该权限集。不要创建重复项。请参阅service-itsm-teams-itdesk-configure中的 Login prerequisite。
如果用户反馈“无法在 Teams 中登录 IT Service”,且步骤 1–4 看起来都已完成,请先逐一检查这三个前提条件——它们是最常见的无提示登录阻塞原因。有关完整的通过/失败诊断流程(包括用于定位门户用户 OAuth 故障的 OAuth 令牌创建检查),请参阅下方的故障排除:Teams 中的 Employee Service 登录与 Agent。
第 4 步 — 选择数字体验站点
此清单项(“数字体验站点名称”下拉菜单,设置前当前显示为“无”)
读取/写入组织值 SLACK_PREFERRED_SITE——与 Swarming 的 SWARM_COLLABORATION_TOOL 使用相同的 OrgValueUtil.OrgValues Java 枚举机制——且不受任何 Teams 许可证或 Azure/Entra 凭据限制,因此无需依赖 Teams 设置的其他部分即可使用。
- 列出组织中的所有数字体验站点:
如果组织还没有数字体验站点(列表为空),必须先创建一个才能完成此步骤——转交给mcp__headless-360__dispatch_readonly(method: "GET", url: "/services/data/v67.0/connect/communities")experience-portal-create来配置新站点(员工服务 / IT 支持门户适用于此用例),然后返回此处并提供其Id。 - 向用户展示完整列表并请其选择一个。如果用户没有选择,就自行选一个(如果只有一个站点,则选该站点;否则选择合理的默认项,例如最近修改的
Live站点),并明确告知用户选了哪个站点——不要默默继续。 - 先检查当前值(如果已设置为所选站点的 Id,则跳过写入):
mcp__headless-360__dispatch_readonly(method: "GET", url: "/services/data/v67.0/setup/org/values/SLACK_PREFERRED_SITE")stringValue保存当前选择——所选站点的Id,或"None"。 - 使用站点的
Id写入所选项(来自步骤 1 的connect/communities响应中的Network记录 Id,而不是urlPathPrefix):
已在实际环境中验证:使用站点的 Networkmcp__headless-360__dispatch( method: "PATCH", url: "/services/data/v67.0/setup/org/values/SLACK_PREFERRED_SITE", body: { "orgValue": "<site Id>" } )Id(例如0DBSB000002EYwj4AG)执行PATCH后返回200 {"stringValue": "<that Id>", ...},随后执行GET确认该值已持久化。 - 重新执行步骤 3 的
GET以确认。
第 5 步 — 让嵌入式 Agentforce Agent 在 Teams 中回复
完成步骤 1–4 后会配置 IT Service 门户,但不会让嵌入式 Agentforce Agent 真正在 Teams 自定义客户端(“Salesforce Employee Assist” / “Ask AI Agent”)中回复。这是 IT Service Agent 设置中最后也是最难的一步,由专门的技能介绍:
→ service-itsm-teams-employee-agent-configure
用户希望 Teams 内的 Agent 回复时,请在步骤 4 后调用该技能(或转交给它)。该技能介绍了经验证的架构——一个启用用户验证 + JWKS_URL 密钥集的 Web 渠道、Teams_AgentForce 部署、将请求路由到真实且处于活动状态的 Agent 的 Omni-Flow 路由流,以及为门户用户设置的 Agent Access 权限集——并提供了常见的“Agent 加入后又离开”问题诊断方法(已启用身份验证但没有密钥集,或缺少 Agent Access)。其中针对每位用户分配 Agent Access,是上述“管理用户访问”步骤(步骤 3)的自然后续操作。
已验证的问题 — UI 在 API 写入后仍显示旧的“无”。 Go 页面中的下拉菜单使用 LDS 缓存读取此组织值;直接执行 Connect PATCH 不会使缓存失效。写入确实成功且已持久化(后续 GET 可确认)——如果 Setup 页面仍处于打开状态,请告知用户对标签页执行强制刷新,以查看新的选择。
名称具有误导性 — 这是跨功能共享设置,并非 Teams 专用。 尽管前缀为 SLACK_(这是该组织值最初用于 Slack-ITSM 时留下的旧名称),它为 Teams ITSM Go 页面和对应的 Slack ITSM Go 页面中的“选择数字体验站点”选择器提供数据——从一个界面写入会改变另一个界面显示的内容。如果用户也配置了 Slack ITSM,请提醒用户,此设置也会更改 Slack 的首选站点。
注意事项
| 问题 | 详情 |
|---|---|
| 需要先启用 Teams Salesforce Go 页面功能 | OrgHasEmployeeServiceTeams 不会直接限制或依赖 ITSMTeamsEnabled,但只有启用 service-cloud-itsm-teams-integration 后,Go 页面检查清单才会显示 — 请先运行 service-itsm-teams-configure。 |
OrgHasEmployeeServiceTeams 不会解除对 ITSMTeamsEnabled 的限制 | 这是两个独立的设置 — 启用此首选项本身不会解除对 Teams Salesforce Go 页面切换首选项的限制,反之亦然。 |
| “选择 Digital Experience 站点”会写入组织值,而非调用 Teams API | 此检查清单项目会通过 PATCH /services/data/v67.0/setup/org/values/SLACK_PREFERRED_SITE 写入组织值 SLACK_PREFERRED_SITE(请求正文 {"orgValue": "<site Id>"})— 无需 Azure/Entra 凭据,也不需要 Teams 许可证。已在线验证:使用某个站点的 Network Id 执行 PATCH 后成功(200),且不依赖 Teams 设置的其他部分。如果组织没有 Digital Experience 站点,请先通过 experience-portal-create 创建一个。请注意,尽管名称中有 SLACK_,此组织值与 Slack ITSM 集成中对应的选择器共用,并非 Teams 专属。 |
| 权限集 / PSL | 本次会话中,功能启用后立即自动配置了 TeamsForEmployeeUser(权限集)和 PSL TeamsForEmployeePsl,并确认状态为 Active(10 个许可证)— 只要已获得 TeamsITSrvcsAddOn+IncidentManagementAddOn 许可证,就无需手动创建 PSL/权限集。 |
| 必须指定版本前缀 | headless-360 dispatch/dispatch_readonly 无法解析 API 版本 — 始终传入完整的 /services/data/vXX.0/... 前缀。 |
| UEL 用户无法在 Teams 中登录 IT Service | 仅分配 TeamsForEmployeeUser 并不足够。登录还受另外三项先决条件限制(参见 步骤 3 → 登录先决条件):登录配置文件中的 Allow OAuth for employees(仅限 Setup UI — Metadata/SObject/Tooling 均没有可用的写入路径;已验证全部失败)、CORS Allowed Origins 中同时包含 https://teams.cloud.microsoft 和 https://cdn.scs.static.lightning.force.com,以及用户的 API Enabled 系统权限。每一项都已确认会单独导致静默登录失败。 |
故障排除:Teams for Employee Service 登录与 Agent
当用户报告 Teams for Employee Service 出现故障(无法登录、弹出“Service Not Available”窗口,或 Agent 不回复)时,请按顺序执行这些检查 — 每一项都是带有精确查询和修复方法的通过/失败检查点。遇到第一项失败时即停止;这些检查按最常见且最易处理到最深入的顺序排列。
如需对所有 Teams ITSM 症状进行更广泛的引导式诊断(IT Desk 登录、功能启用、选项卡加载、服务目录、Agentforce、Swarming、SSO — 不仅限于 IT Service 登录),请使用专用的
service-itsm-teams-debug技能,它会将报告的问题导向匹配的通过/失败检查清单。以下流程是其中专注于 IT Service 登录的子集。
使用
dispatch_readonly执行只读检查(需要 Tooling API 的查询会特别注明 Tooling 对象检查)。在检查过程中,将占位符 ID 替换为找到的实际 ID。
A. Community 登录本身
SELECT LoginTime, Status, LoginType FROM LoginHistory
WHERE UserId='<userId>' ORDER BY LoginTime DESC LIMIT 5
No community access→ 对于内部/UEL 用户,该站点的Network.OptionsAllowInternalUserLogin已关闭。请在站点的登录设置中启用“Allow internal users to log in directly”(参见 portal-create 技能中的内部登录标志)。这与下文所述的故障不同 — 如果遇到此问题,请先修复。Employee Login to Community=Success→ 登录正常;故障发生在后续的 OAuth 或 Agent 运行时环节。继续执行 B。
B. 静默登录的三个前提条件(参见 步骤 3 → 登录前提条件)
- 在登录配置文件中允许员工使用 OAuth(仅限 Setup UI 的复选框)。没有 API 读取方式 — 请通过下文 C 中的 OAuth 令牌检查(实际症状)进行验证。
- CORS 允许的来源 — 必须包含以下两个来源:
缺少SELECT Id, UrlPattern FROM CorsWhitelistEntryhttps://teams.cloud.microsoft或https://cdn.scs.static.lightning.force.com→ 创建条目(POST /sobjects/CorsWhitelistEntry{"UrlPattern":"<origin>"}),然后强制刷新。 - 为用户启用系统权限 API Enabled(通过权限集,而非仅通过配置文件)。
C. OAuth 令牌签发 — 判定门户用户问题的关键检查
此检查可区分门户/UEL OAuth 故障与登录故障。用户从一个新 Teams 聊天中重试登录后:
SELECT Id, AppName, UserId, User.Username, CreatedDate FROM OauthToken
WHERE AppName='ServiceCloudMSTeamsEca'
- 存在失败用户的令牌记录 → OAuth 成功;问题出在 Agent 运行时,而非登录 — 跳转到 E。
- 不存在失败用户的令牌,但社区登录显示
Success(B) → OAuth 授权步骤没有签发令牌。这对应/<sitePrefix>/setup/secur/RemoteAccessAuthorizationPage上的“Service Not Available”弹窗。请按 D 处理。
诊断提示(已验证):如果 Standard 配置文件用户可以签发
ServiceCloudMSTeamsEca令牌,而 UEL / portal 用户不能 — 即使权限集完全相同 — 则阻碍来自门户用户的 OAuth 授权路径(配置文件中的 OAuth 标志,或在社区主机上提供的自批准页面),而非任何 ECA 权限授权。在已验证的组织中,Standard 用户在没有任何SetupEntityAccess记录的情况下签发了令牌,而拥有所有权限的 UEL 用户却无法签发,因此 ECASetupEntityAccess配置无法解释这一差异。
D. 门户用户 OAuth 授权(社区主机上的自批准页面)
ServiceCloudMSTeamsEca External Client App 由 Go 页面开关自动安装,无需配置 — 不要更改其 OAuth 策略或添加 SetupEntityAccess 记录。症状:Teams 弹窗标题为 “Service Not Available / An unexpected connection error occurred”,显示在
/<sitePrefix>/setup/secur/RemoteAccessAuthorizationPage,和/或流式端点返回访问检查错误正文
{"acc":8}。
此故障仅出现在门户/UEL 用户中,并非 ECA 权限问题(根据上述诊断提示,Standard 用户在没有任何 SetupEntityAccess 记录的情况下可以签发令牌)。OAuth 授权请求被路由到社区主机(https://<org>.my.site.com/<prefix>/setup/secur/...),而不是 My Domain;社区主机无法呈现自批准页面。ECA 是打包的第一方应用 — 不要手动编辑其 OAuth 策略、callbackUrl、isFirstPartyAppEnabled 或 oauthLink。先确认“允许员工使用 OAuth”(B)和 API Enabled(C);如果门户令牌仍无法签发,请记录弹窗 URL 和任何 acc 代码,并升级给 Teams ITSM 产品团队 — 这超出了可配置设置修复的范围。
E. 嵌入式 Agentforce Agent 加入后离开(没有回复)
如果登录和 OAuth 均成功,但“Ask AI Agent” Agent 不回复,请转交给
service-itsm-teams-employee-agent-configure — 已验证的两个修复方案是:(1) Teams_AgentForce
通道的用户验证已开启,并由 JWKS_URL Key Set 提供支持;(2) 设置 Agent Access 权限集,为门户用户启用 IT
Service Employee Agent。该技能的参考文档包含完整的运行时链路诊断(scrt2 令牌、SSE 401、ConversationEntry 查询)。
相关技能
| 技能 | 何时单独或配合使用 |
|---|---|
service-itsm-teams-configure | 启用基础 Teams Salesforce Go 页面开关、注册 Azure/Entra 应用、填充 Named Credential,以及注册 Teams 扩展——这是使用本技能的前置条件 |
service-itsm-teams-itdesk-configure | 清单中 IT Desk/服务人员部分(Turn on IT Desk、Install IT Desk app、Manage User Access、Set Teams as Collaboration Tool for Swarming) |
service-itsm-teams-employee-agent-configure | IT Service Agent 设置的最后一部分——让嵌入式 Agentforce Agent 真正能在 Teams 自定义客户端中回复(Web 渠道、User Verification ON + JWKS_URL Key Set、Teams_AgentForce 部署、将路由流指向实际启用的 Agent、Agent Access 权限集)。完成第 4 步后转交给此技能。 |
service-itsm-teams-debug | 诊断 Teams ITSM 设置中的各种故障(登录、功能启用、选项卡加载、Agentforce、Swarming、SSO)——将问题导向通过/失败清单,并报告修复方案 |
service-itsm-channels-coordinate | Teams、Slack、Swarming、Notifications、Portal 的顶层菜单 |