关于 servicenow-mcp-ai
servicenow-mcp-ai 通过 REST API 将 MCP 客户端连接到 ServiceNow 实例。它结合记录与流程操作、代码搜索和流程追踪,并提供写入预览及访问控制。
主要功能
- 01ServiceNow REST API 与插件操作
- 02搜索脚本并追踪自动化流程
- 03比较不同配置档的实例差异
- 04预览写入并撤销已记录的更改
- 05可配置工具组和访问控制
适用场景
- 01检查 ServiceNow 字段被哪些位置引用
- 02追踪记录更新触发的操作
- 03部署前审查配置差异
- 04安全地应用或撤销记录更改
MCP 相关
该 MCP 服务向 MCP 客户端提供 ServiceNow API 操作、工具、资源和工作流提示词。使用 stdio,并支持通过 HTTPS 进行 Basic 或 OAuth 2.0 身份验证。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y servicenow-mcp-aiSN_INSTANCEServiceNow instance host, e.g. dev12345.service-now.com.SN_AUTH密钥Auth mode: basic | oauth | apikey | token | none. Auto-detected from the keys present if omitted.SN_USERUsername for basic auth or the OAuth password grant.SN_PASSWORD密钥Password for basic auth or the OAuth password grant.SN_API_KEY密钥ServiceNow API key, sent as the x-sn-apikey header (apikey auth).SN_TOOL_PACKAGESWhich tool packages to expose, e.g. core (default), all, or a comma-separated list.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
原文在翻译后有更新,译文可能不是最新。
servicenow-mcp-ai — ServiceNow MCP 服务
📖 文档网站 →
这是一个 Model Context Protocol 服务,可让 MCP 客户端(VS Code、Claude Desktop 等)通过 REST API 对 ServiceNow 实例执行命令,包括 Table、Aggregate、Attachment、Import Set、Batch 和 CMDB,以及 Service Catalog、Change Management 和 Knowledge 插件 API。 凭据保存在本地 env 文件中,并可在运行时通过工具更新。
从 2.x 升级? 3.0 的默认设置存在重大变化(破坏性应用需要计划令牌、系统表受到保护、默认工具集更小)。运行一次
npx servicenow-mcp-ai migrate --write:它会迁移你的 env 文件和 MCP 客户端配置,并添加SN_COMPAT=2,以保留所有尚未设置的 2.x 默认值。 每项变更请参阅 CHANGELOG →“迁移概览”。
从 1.x 升级? v2.0 默认采用先计划再写入:
create/update/delete及其他记录写入工具会返回不执行修改的预览,除非传入apply: true(或设置SN_WRITE_MODE=apply,以恢复 v1“立即执行”的行为)。完整迁移说明请参阅 CHANGELOG → 2.0.0。
目录: 快速演示 · 功能 · 要求 · 设置 · 配置凭据 · 运行 / 调试 · 开发 · 工具 · 资源 · 提示词 · 项目结构 · 安全说明 · 项目文档 · 支持
这是我利用业余时间开发和维护的项目——如果它对你有帮助,可以通过 GitHub Sponsors 赞助支持,让项目持续运行。 完整的支持选项位于文末。
快速演示
平台让三件事变得棘手,而每件事只需调用一次。将 MCP 客户端指向一个实例(设置),然后提问:
1. “这个字段实际上在哪里用到?” — 所有涉及该字段的脚本、业务规则、客户端脚本、UI 策略/操作和 ACL,以 JSON 或 Mermaid 图的形式呈现。ServiceNow 没有按钮可实现的 IDE 级 查找用法:
// servicenow_where_used
{
"kind": "field", // "table" | "field" | "script"
"name": "u_cost_center",
"mermaid": true, // also render a reference graph
}
2. “保存这条记录时会运行什么?” — 按执行顺序列出完整的自动化链(display → before → after → async 业务规则,然后是流、工作流和通知),并附上每项的条件——这是一个什么都不执行的逻辑测试:
// servicenow_trace_table_event
{
"table": "incident",
"operation": "update", // insert | update | delete | query
}
3. “开发环境和生产环境之间有哪些差异?” — 对两个已配置的配置文件中的表、列、脚本(先按 sys_id、再按名称匹配,并提供每个已更改脚本的统一差异)和插件生成 Markdown 差异报告;还可按需包含属性、选项、ACL、通知、流、服务目录项目和角色;并提供适合 CI 的退出代码,让流水线能够阻止有风险的部署:
servicenow-mcp-ai drift dev prod # report on stdout; exit 1 on drift, 0 if clean
这三项功能均为只读,适用于任何实例——包括免费的 PDI——模型和客户端均可自行选择。
功能
- 完整的 Table API:在任何表上查询、读取、创建、更新和删除记录,并支持编码查询、字段选择和分页。
- 其他 ServiceNow API:Aggregate(统计)、Attachment(列出/上传/下载/删除)、Import Set、Batch(在单个请求中执行多个 REST 调用),以及表/列元数据(
sys_db_object、sys_dictionary)。 - 流程与插件 API:CMDB(支持类的 CI CRUD 和元数据、从
cmdb_rel_ci读取关系、IRE 识别与协调并提供仅识别计划)、 Service Catalog(浏览/订购条目)、Change Management(类型化创建和冲突检测)以及 Knowledge(文章搜索)。 如果实例未启用相应插件,插件专属 API 会明确报告。 - 脚本智能:读取和搜索实例自身的代码(业务规则、脚本包含项、客户端脚本、UI 策略/操作、计划作业、转换/REST 脚本、ACL、Service Portal 小组件、UI 页面/脚本/宏、处理器、电子邮件/修复/验证脚本、脚本操作、数据源、REST 消息函数、转换映射/条目、目录客户端脚本和字典计算/默认值),并获取表的完整自动化概况——所有操作都通过 Table API 以只读方式完成。
servicenow_search_code会返回每个工件中所有匹配的行(最多 20 行,并附带前后各一行上下文),与servicenow_where_used一样,支持可选的应用scope。servicenow_where_used还会查找结构性引用——字典引用字段、列表和表单布局、目录变量、流程输入和报表——并在单独的structural部分中列出。 - 流程追踪与代码检查(Phase 8):确定性地追踪表操作会触发的内容(
flows包——按顺序列出业务规则、流程、工作流和通知,并生成 Mermaid 流程图);读取 Flow Designer 流程和运行历史;解释 Process Automation Designer 操作手册(servicenow_explain_flow使用kind: "playbook"——以 Mermaid 子图表示泳道,并列出活动、触发器和变体);依据本地规则集检查脚本,并生成汇总代码健康报告(codecheck;设置domains: true可启用流程、Service Portal 和旧版工作流分析器)。通过 CI/CD API 运行 ATF 测试(atf,需选择启用,默认关闭——运行工具会在实例上执行)。 - 基于日志的撤销(
revert):列出本地写入日志,并撤销一项已应用的创建/更新/删除操作——同时检查后续编辑导致的偏移。 - 通用工件读取(
artifacts,需选择启用):列出并读取任何已注册的工件类型——包括带操作项的 UI 策略、带布局的门户页面、流程、目录条目等——并显示范围和 SDK 管理状态。 - 更新集支持(
updatesets,需选择启用):列出更新集,按工件汇总某个更新集,与另一个配置档案或快照进行比较——并将已应用的 Table 写入绑定到指定名称的更新集(update_set/SN_UPDATE_SET),之后恢复用户当前的更新集。 - 运维与数据健康(
ops,需选择启用):有界读取系统日志、调度器队列、出站电子邮件队列和信号量,以排查“为何变慢”;此外还提供servicenow_check_data_health——通过 Aggregate API 统计单个表中的重复键、孤立引用和过期引用。 - 运维读取(需选择启用):通过
sys_audit和sys_journal_field查看记录的变更历史(history——包括 Table API 读取时为空的评论和工作备注);查看经过机密遮罩且写入日志、可撤销的系统属性集合(properties);以及查询用户/组/角色和成员关系(directory)。ATF 运行可以等待结果(wait_seconds),Import Set 插入操作会报告转换运行和映射。 - 自我文档化:本地 Markdown 知识库(读取/写入/搜索),以及确定性的 Mermaid 生成器(从引用生成 ER 图、从业务规则生成记录生命周期流程图),帮助服务端构建持久且可复用的上下文。
- 提示词:现成的工作流(事件分诊、变更影响分析、记录表文档、诊断实例性能问题、安全写入、偏移审查、架构影响、实例发现),用于编排各项工具;每个插件技能都有对应的提示词,供未安装插件的客户端使用。
- 工具包:通过
SN_TOOL_PACKAGES仅加载所需的工具组(默认配置档案为discovery;all会启用全部工具)。 - 通过 HTTPS 使用 Basic 或 OAuth 2.0 身份验证;密码/令牌绝不会回显。
- 最小权限控制:表允许/拒绝列表,以及全局只读模式。
- 弹性保障:每请求超时、带退避和
Retry-After的重试、SSRF 防护和结果大小限制。 - MCP 工具注解和资源、结构化错误载荷,以及输出到 stderr 的结构化日志。
- 凭据存储于环境文件(项目目录、
~/.config或SN_ENV_FILE),并可在运行时通过servicenow_set_credentials更新。
要求
- Node.js 22.12+(强制要求:通过
engines和带有明确提示信息的运行时检查;项目以.nvmrc中的版本为目标)。
设置
从源代码安装(用于开发):
npm install
npm run build
或直接运行已发布的软件包,无需克隆:
npx servicenow-mcp-ai
在 MCP 客户端中安装
每个客户端都会启动相同的 stdio 命令 npx -y servicenow-mcp-ai(Node.js 22.12+),服务器名称为 servicenow。下面的一键链接和代码片段不包含任何凭据:请将凭据保存在环境文件中(~/.config/servicenow-mcp-ai/.env,参见配置凭据),运行一次性命令 npx servicenow-mcp-ai login 进行 OAuth 登录,或在连接服务器后让助手调用一次 servicenow_set_credentials。客户端配置中设置的实际环境变量会覆盖环境文件,因此只有在确有需要时才添加 env 代码块;切勿将 SN_PASSWORD 或其他机密写入你要分享或提交的客户端配置(参见 SECURITY.md)。
| 客户端 | 一行命令 | 配置文件 |
|---|---|---|
| VS Code (Copilot Chat) | 使用上方按钮,或运行 code --add-mcp(见下文)——也可使用 ServiceNow MCP 扩展 | .vscode/mcp.json (servers) |
| VS Code Insiders | 使用上方按钮,或运行 code-insiders --add-mcp(见下文) | .vscode/mcp.json (servers) |
| Claude Code | claude mcp add servicenow -- npx -y servicenow-mcp-ai,或使用插件 | .mcp.json (mcpServers) |
| Claude Desktop | —(编辑配置文件) | claude_desktop_config.json (mcpServers) |
| Cursor | 使用上方按钮,或使用 cursor:// 深层链接(见下文) | ~/.cursor/mcp.json 或 .cursor/mcp.json (mcpServers) |
| Windsurf | —(编辑配置文件) | ~/.codeium/windsurf/mcp_config.json (mcpServers) |
| Cline | —(MCP Servers → Configure MCP Servers) | cline_mcp_settings.json (mcpServers) |
| Zed | —(编辑设置) | settings.json (context_servers) |
| JetBrains AI Assistant | —(Settings → Tools → AI Assistant → Model Context Protocol) | JSON 对话框 (mcpServers) |
| Gemini CLI | —(编辑设置) | ~/.gemini/settings.json (mcpServers) |
| Codex CLI | codex mcp add servicenow -- npx -y servicenow-mcp-ai | ~/.codex/config.toml ([mcp_servers.servicenow]) |
VS Code / VS Code Insiders
零配置方式是从 Marketplace 安装 ServiceNow MCP 扩展
(code --install-extension ivanbbaev.servicenow-mcp-ai);它会自动在 Copilot Chat(Agent 模式)中注册服务器,无需 mcp.json。源代码:extension/。
如果不使用该扩展,可从终端添加服务器(用户配置文件):
code --add-mcp '{"name":"servicenow","command":"npx","args":["-y","servicenow-mcp-ai"]}'
code-insiders --add-mcp '{"name":"servicenow","command":"npx","args":["-y","servicenow-mcp-ai"]}'
按钮对应的原始深层链接(粘贴到浏览器地址栏):
vscode:mcp/install?%7B%22name%22%3A%22servicenow%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22servicenow-mcp-ai%22%5D%7D
vscode-insiders:mcp/install?%7B%22name%22%3A%22servicenow%22%2C%22command%22%3A%22npx%22%2C%22args%22%3A%5B%22-y%22%2C%22servicenow-mcp-ai%22%5D%7D
也可以使用工作区文件 .vscode/mcp.json:
{
"servers": {
"servicenow": {
"type": "stdio",
"command": "npx",
"args": ["-y", "servicenow-mcp-ai"]
}
}
}
Claude Code
插件(零配置——安装后即可连接服务器):
/plugin marketplace add IvanBBaev/servicenow-mcp-ai
/plugin install servicenow-mcp-ai
该插件还提供 8 个工作流技能、2 个只读子 Agent 和 3 个钩子——请参阅 插件技能。
CLI — --scope user 会使其在每个项目中都可用;--env 会设置一个非机密变量(实例主机),并将机密信息保留在环境文件中。通过此方式设置的值优先于环境文件,因此如果使用 servicenow_set_credentials 切换实例,请移除 --env:
claude mcp add servicenow --scope user --env SN_INSTANCE=your-instance.service-now.com -- npx -y servicenow-mcp-ai
Claude Desktop
claude_desktop_config.json — macOS:~/Library/Application Support/Claude/,Windows:
%APPDATA%\Claude\(Settings → Developer → Edit Config):
{
"mcpServers": {
"servicenow": {
"command": "npx",
"args": ["-y", "servicenow-mcp-ai"]
}
}
}
保存后重启 Claude Desktop。
Cursor
使用上方的按钮,或直接打开深层链接:
cursor://anysphere.cursor-deeplink/mcp/install?name=servicenow&config=eyJjb21tYW5kIjoibnB4IiwiYXJncyI6WyIteSIsInNlcnZpY2Vub3ctbWNwLWFpIl19
也可以编辑 ~/.cursor/mcp.json(全局)/ .cursor/mcp.json(项目),使用与 Claude Desktop 相同的
mcpServers 配置块。
Windsurf、Cline、JetBrains AI Assistant
这三者都可直接使用 Claude Desktop 的 mcpServers 配置块:
- Windsurf —
~/.codeium/windsurf/mcp_config.json(Cascade → MCP servers → View raw config),然后刷新服务列表。 - Cline — 点击 MCP Servers 图标 → Configure MCP Servers,打开
cline_mcp_settings.json。 - JetBrains AI Assistant — Settings → Tools → AI Assistant → Model Context Protocol (MCP) → Add → As JSON,粘贴该配置块。
{
"mcpServers": {
"servicenow": {
"command": "npx",
"args": ["-y", "servicenow-mcp-ai"]
}
}
}
Zed
在 Zed 的 settings.json 中(Zed → Settings → Open Settings):
{
"context_servers": {
"servicenow": {
"source": "custom",
"command": "npx",
"args": ["-y", "servicenow-mcp-ai"],
"env": {}
}
}
}
Gemini CLI
~/.gemini/settings.json(用户)或 .gemini/settings.json(项目):
{
"mcpServers": {
"servicenow": {
"command": "npx",
"args": ["-y", "servicenow-mcp-ai"]
}
}
}
在 Gemini CLI 会话中使用 /mcp 检查。
Codex CLI
codex mcp add servicenow --env SN_INSTANCE=your-instance.service-now.com -- npx -y servicenow-mcp-ai
或者使用 ~/.codex/config.toml:
[mcp_servers.servicenow]
command = "npx"
args = ["-y", "servicenow-mcp-ai"]
# Optional, non-secret only — secrets stay in ~/.config/servicenow-mcp-ai/.env:
# env = { SN_INSTANCE = "your-instance.service-now.com" }
更倾向于全局安装(npm install -g servicenow-mcp-ai)?在任意代码片段中,将
"command": "npx", "args": ["-y", "servicenow-mcp-ai"] 替换为
"command": "servicenow-mcp-ai"。MCP Inspector 的用法也相同:
npx @modelcontextprotocol/inspector npx -y servicenow-mcp-ai。
一键链接由 scripts/install-links.mjs 根据 package.json 生成(运行 node scripts/install-links.mjs 可打印链接);如果本 README 或文档网站与生成的字符串不一致,test/install-links.test.js 会报错。
通过 MCP bundle(.mcpb)安装
MCP bundle 是一个包含服务及其依赖项的 .mcpb 文件;Claude Desktop(或任何 MCPB 主机)可一键安装,无需使用 npm / npx。安装表单会要求填写连接密钥(仅 SN_INSTANCE 为必填项)和 SN_TOOL_PACKAGES;机密信息会标记为敏感数据(并保存在操作系统的密钥链中)。字段留空时会回退到环境文件。目前尚未发布(O-22)——使用 npm run mcpb:pack 构建(位于 dist/mcpb/;-- --validate 会运行官方验证器)。
Docker
仓库提供了一个多阶段 Dockerfile(精简版 Node 22 运行时,非 root 用户 uid 65532)。镜像中仅包含 npm pack 发布的内容和生产依赖,默认通过 0.0.0.0:3000 启动 HTTP 传输。目前尚未将镜像发布到镜像仓库,请在本地构建:
docker build -t servicenow-mcp-ai .
# Secrets as files (Docker / Kubernetes secrets), mounted read-only
mkdir -p secrets && printf '%s' 'your-password' > secrets/sn_password
openssl rand -hex 32 > secrets/sn_http_token
docker run --rm -p 127.0.0.1:3000:3000 \
-e SN_INSTANCE=your-instance.service-now.com -e SN_USER=your.user \
-e SN_PASSWORD_FILE=/run/secrets/sn_password \
-e SN_HTTP_TOKEN_FILE=/run/secrets/sn_http_token \
-v "$PWD/secrets:/run/secrets:ro" -v sn-data:/data \
servicenow-mcp-ai
- 任何非回环地址绑定都必须设置
SN_HTTP_TOKEN。 镜像绑定到0.0.0.0,以便已发布的端口正常工作;如果未设置令牌(或 OAuth),服务将拒绝启动(3.0,B6)。设置SN_HTTP_REQUIRE_TOKEN=0可让服务在发出警告后启动;此时,任何能访问该端口的客户端都可以使用已配置的凭据操作你的实例。客户端需发送Authorization: Bearer <token>;请在容器前终止 TLS。 - 使用 OAuth 代替共享令牌(N-17): 设置
SN_HTTP_OAUTH_ISSUER(你的 OIDC 提供商)和SN_HTTP_OAUTH_RESOURCE(此服务的公开 URL,例如https://mcp.example.com/mcp)。客户端会从/.well-known/oauth-protected-resource发现发行方,并发送其 JWT 访问令牌;令牌的受众必须为该资源。可选设置:SN_HTTP_OAUTH_SCOPES、SN_HTTP_OAUTH_AUDIENCE、SN_HTTP_OAUTH_JWKS_URI。如果发行方提供不透明令牌,请设置SN_HTTP_OAUTH_INTROSPECTION_URI及其客户端 ID 和密钥(RFC 7662)。默认情况下,实例仍使用已配置的服务帐户调用。 - 按用户访问 ServiceNow(N-17 第 2 阶段): 添加
SN_HTTP_OAUTH_USER_TOKENS=true、32 字节的SN_HTTP_OAUTH_TOKEN_KEY(base64 或 hex,例如openssl rand -base64 32),并在实例上创建 OAuth 客户端(设置SN_OAUTH_CLIENT_ID/SN_OAUTH_CLIENT_SECRET,并启用刷新令牌),其重定向 URL 需为SN_HTTP_OAUTH_RESOURCE源上的/oauth/servicenow/callback。用户首次调用时,会收到指向实例登录页面的链接(URL 引导;2025 会话会收到-32042,不支持 URL 引导的客户端和后台任务会收到包含该链接的错误)。用户登录后,服务会检查帐户的sys_user字段是否与令牌声明匹配(SN_HTTP_OAUTH_USER_MATCH,默认值为email=email),使用 AES-256-GCM 加密刷新令牌并保存在SN_HTTP_OAUTH_TOKEN_STORE中;此后会以该用户身份调用实例,因此 ServiceNow ACL 会按用户生效。用户可通过DELETE /oauth/servicenow/link删除自己的关联(使用其 bearer 令牌;响应为{ unlinked, revoked });服务也会尽力在实例上撤销刷新令牌。共用一个SN_HTTP_OAUTH_RESOURCE的副本,只要共享SN_HTTP_OAUTH_TOKEN_KEY和存储区,就都可以完成关联。限制:使用SN_HTTP_TOKEN授权的请求仍使用共享凭据。 /data存放文档目录(SN_DOCS_DIR=/data/docs)和环境文件(SN_ENV_FILE=/data/.env);请在此处挂载卷以保留这些文件。- 每个
<KEY>_FILE密钥来源均在从文件读取密钥中说明。 - 对于通过 stdio 启动容器的 MCP 客户端,请传入
-i -e SN_TRANSPORT=stdio(docker run --rm -i -e SN_TRANSPORT=stdio -e SN_INSTANCE=… servicenow-mcp-ai)。 HEALTHCHECK是 TCP 存活探针。GET /healthz(存活)和GET /readyz(已配置凭据)无需令牌即可响应,供编排探针使用;GET /readyz?probe=1还会调用实例,并且与所有 MCP 路由一样,需要通过令牌验证。设置SN_HTTP_ALLOWED_HOSTS为客户端使用的名称,以便在绑定到0.0.0.0时检查 Host 标头。smithery.yaml为 Smithery 描述了相同的镜像(stdio,配置键映射到SN_*设置)。
HTTP 传输:会话、探测与关闭
设置 SN_TRANSPORT=http 后,每个 MCP 会话(一次 initialize)都会获得自己的服务:
- 每会话状态。 启用的包、MCP 日志级别、列表变更通知、计划令牌、任务和写入上限均属于会话。连接池、OAuth 令牌和架构缓存由各会话共享,并按配置文件 + 主机进行键控。
servicenow_use_instance在 HTTP 下按会话生效。 它只切换调用该工具的会话所用的配置文件;其他会话保留各自的配置,且不会写入任何内容。传入persist: true,还会将SN_ACTIVE_PROFILE写入环境变量文件(并记录日志)——这会更改尚未切换配置文件的会话所用的默认值。使用 stdio 时,切换会持续到进程退出;persist: true也会将其写入文件(3.0,B12)。- 生命周期。 会话在收到
DELETE或空闲达到SN_HTTP_SESSION_TTL_SEC后结束(默认 30 min);使用已结束会话 ID 的请求会收到 404,客户端随后会重新初始化。同时最多可有SN_HTTP_MAX_SESSIONS(64)个会话处于打开状态。 - DNS 重绑定防护。
Host标头必须与SN_HTTP_ALLOWED_HOSTS匹配(默认值:绑定到环回地址时使用的环回名称),浏览器的Origin必须与SN_HTTP_ALLOWED_ORIGINS匹配(默认值:环回源);否则返回 403。 - 探测。 服务运行时,
GET /healthz→200 {"status":"ok"}。已配置凭据时,GET /readyz返回 200,否则返回 503。两者均无需令牌即可响应。GET /readyz?probe=1(需要令牌)还会读取一行sys_user记录;实例无法访问时返回 503。结果会缓存 5 s。 - 关闭。 收到 SIGTERM / SIGINT 后,监听器停止接受连接,新请求返回 503,正在运行的工具调用最多有 5 s 完成;之后所有会话都会关闭,进程以 0 退出。
- 保活。 打开的 SSE 流会每隔
SN_HTTP_KEEPALIVE_MS(25 s)收到一条注释。
快速入门
最快的方式是使用三行 Basic auth — 在环境变量文件或真实环境中设置以下变量,即可连接:
SN_INSTANCE=dev12345.service-now.com
SN_USER=your.username
SN_PASSWORD=your-password
其他设置均为可选调优;其余内容请参阅完整的环境变量参考。
快速试用后,建议使用 OAuth,而不是存储密码。 对于共享或长期使用的场景,请改为运行一次性命令
npx servicenow-mcp-ai login——它存储的是刷新令牌,而不是密码。请参阅配置凭据 → OAuth 2.1。
验证设置
设置好这三个变量后,请在开始前确认连接:
- 运行
servicenow_test_connection工具——它会读取一条sys_user记录,并报告ok、HTTP 状态和延迟。 - 运行
servicenow_check_capabilities——它会预览已连接用户实际可以读取的、受管理员限制的sys_*表。
或者,在 shell 中一次性完成这两项:
npx servicenow-mcp-ai doctor # checks credentials, reachability and capabilities
希望通过提示完成设置?运行 npx servicenow-mcp-ai init,按提示输入实例、认证方法和凭据;该命令会写入环境变量文件并运行 doctor——请参阅命令行界面。
配置凭据
凭据保存在 ~/.config/servicenow-mcp-ai/.env 中(或由 SN_ENV_FILE 指定的文件中):
SN_INSTANCE=your-instance.service-now.com
[email protected]
SN_PASSWORD=your-password
SN_INSTANCE 接受 dev12345、dev12345.service-now.com 或完整的 https:// URL。
你也可以在运行时调用 servicenow_set_credentials 工具来设置或更改凭据——新值会直接写回 env 文件。
将已配置的配置档迁移到其他实例时,必须在同一次调用中提供 user 和 password(存储的密钥绝不会发送到其他主机),并且客户端必须确认此更改——不支持征询的客户端会被拒绝,除非设置了 SN_ALLOW_UNCONFIRMED_CREDENTIAL_CHANGE=1。
该工具还会设置身份验证方式(auth)、OAuth 客户端 ID(oauth_client_id)和授权类型(oauth_grant)。密钥——API 密钥和 OAuth 客户端密钥——绝不会作为工具参数传递:将它们列在 request_secrets 中,服务端会通过征询提示词索取,因此它们不会出现在已记录的工具调用、结果或写入日志中。不支持征询的客户端会被拒绝(上述退出选项不适用于密钥);请改为在 env 文件中设置这些密钥。实例变更规则取决于最终的身份验证方式:API 密钥配置档需要新的 API 密钥,OAuth client_credentials 配置档需要新的客户端密钥,OAuth password 授权类型需要 user、password 和客户端密钥,Basic / none 需要 user 和 password;使用 bearer-token、refresh_token 和 jwt_bearer 的配置档无法通过此工具迁移。
servicenow_get_status(authWarnings)、servicenow_list_instances 和 doctor 会根据每个配置档自身的身份验证方式进行检查——API 密钥配置档不需要密码——并报告身份验证方式、OAuth 授权类型、刷新令牌状态和写入模式,但绝不报告密钥值。当刷新令牌授权类型返回轮换后的刷新令牌时,该令牌会写回读取它时所用的 env 键;如果无法写入 env 文件,新令牌会保存在内存中(重启后丢失),并记录警告,该警告也会显示在 get_status / doctor 中。服务端写入的值会保留 Windows 路径原样(反斜杠会用单引号括起),CRLF 格式的 env 文件也会继续保持 CRLF。在 Windows 上,env 文件会继承其所在文件夹的 ACL——请自行限制权限(例如 icacls .env /inheritance:r /grant:r "%USERNAME%:F");服务端只会发出警告,绝不会运行 icacls。
env 文件按以下顺序解析:先检查 SN_ENV_FILE,然后检查 ~/.config/servicenow-mcp-ai/.env(XDG)。项目根目录中的 .env 已弃用(3.0,B5):如果该文件存在,且上述两个位置均未使用,仍会读取它,并在启动时提示应将其移至何处。
因此,全局 / npx 安装会将文件写入用户配置目录,而不是 node_modules。实际环境变量始终优先于文件中的值。
首次运行:模型自行配置
在 initialize 时,服务端会根据实时配置发送 instructions:启用的包和工具数量、写入模式、活动配置档;如果尚未配置任何内容,还会说明缺少什么以及如何修复——此外还会提供关于提示词、参考资源和大结果处理(分页、format "file")的指引。在此之前,每个实例工具都会失败,并返回 code: "NOT_CONFIGURED",以及一条指出 servicenow_set_credentials 的提示。使用空 env 文件启动的首个会话如下所示(节选):
instructions Credentials: NOT configured (missing instance, user, password). Instance tools
fail with code NOT_CONFIGURED until fixed. To configure: ask the user for
the instance and credentials, call servicenow_set_credentials, then
servicenow_test_connection. Never guess or echo a password.
user How many open P1 incidents do we have?
model Which instance, user and password should I connect with?
user dev12345, admin, ••••••
tool call servicenow_set_credentials { instance: "dev12345", user: "admin", password: … }
tool result { message: "Credentials saved", profile: "default", configured: true, password: "***" }
tool call servicenow_test_connection {}
tool result { ok: true, … }
tool call servicenow_aggregate { table: "incident", query: "active=true^priority=1" }
model There are 7 open P1 incidents.
servicenow_get_status 随后会显示实时状态:服务端版本、运行时间和传输方式、policy.summary、限制、脱敏设置、文档目录、写入计数器、配置档来源以及 profileDetails(每个配置档的身份验证模式、写入模式和缺失的键)——但绝不包含密钥值。
OAuth 2.1(Authorization Code + PKCE)— 推荐
在 ServiceNow 中注册一个 Authorization Code OAuth API 端点,并设置
loopback 重定向 URL(例如 http://localhost:53682/callback),设置
SN_OAUTH_CLIENT_ID(对于机密客户端,还需设置 SN_OAUTH_CLIENT_SECRET),
然后运行一次性交互式登录:
npx servicenow-mcp-ai login
浏览器会打开,批准授权后,获取的 refresh token 会存储在环境文件中。随后服务将以非交互方式运行(refresh_token grant)—— 不会存储密码。始终使用 PKCE(S256)。
OAuth 2.0 password grant(ROPC)已在 OAuth 2.1 中弃用,且在许多实例上已禁用;请优先使用
login。client_credentials和refresh_tokengrant 仍支持服务帐户。请参阅 .env.example。
支持的身份验证方法
ServiceNow 提供的所有入站 REST 身份验证方法均已涵盖:
| 方法 | SN_AUTH | 设置 | 备注 |
|---|---|---|---|
| Basic | basic | SN_USER / SN_PASSWORD | 默认值。 |
| OAuth 2.1 — Authorization Code + PKCE | oauth | npx servicenow-mcp-ai login | 推荐。 交互式登录,并存储 refresh token。 |
| OAuth — Client Credentials | oauth | SN_OAUTH_GRANT=client_credentials | 服务到服务。 |
| OAuth — Refresh Token | oauth | SN_OAUTH_GRANT=refresh_token + SN_OAUTH_REFRESH_TOKEN | 由 login 设置。 |
| OAuth — JWT Bearer | oauth | SN_OAUTH_GRANT=jwt_bearer + SN_OAUTH_JWT_KEY | RS256 断言;无需密码。 |
| OAuth — Password(ROPC) | oauth | SN_OAUTH_GRANT=password | 已弃用。 |
| API Key | apikey | SN_API_KEY | x-sn-apikey 请求头。 |
| Bearer token | token | SN_BEARER_TOKEN 或 SN_TOKEN_FILE | 预先获取的令牌,按原样使用。如果令牌被拒绝(401),会重新读取一次 SN_TOKEN_FILE,否则返回 AUTH_EXPIRED 错误。 |
| Mutual TLS(客户端证书) | none(或叠加使用) | SN_TLS_CLIENT_CERT / _KEY | 证书映射到用户;需要可选的 undici。 |
环境变量
所有设置均从环境文件(SN_ENV_FILE,否则为
~/.config/servicenow-mcp-ai/.env)或实际进程环境中读取,后者优先级更高。只有前三项为必填项,其余均为可选的调优参数。
请参阅 .env.example 获取模板。启动时会验证每个值:无效值会导致服务停止,并显示列出所有问题键的错误
(3.0,B5);或者,如果设置了 SN_STRICT_SETTINGS=0,则会记录为警告,并继续使用该设置的默认值。
这些表格由设置清单
(src/core/settings-manifest.ts)生成 — 编辑清单,然后运行
npm run docs:env。
连接与身份验证
实例及其凭据。始终只需要 SN_INSTANCE;除非通过 SN_AUTH 指定身份验证方法,否则会根据现有密钥自动检测(API 密钥 → bearer 令牌 → OAuth → Basic)。
| 变量 | 必需 | 默认值 | 起始版本 | 说明 |
|---|---|---|---|---|
SN_INSTANCE | 是 | — | 1.0.0 | 实例名称、主机名或 https:// URL(dev12345、dev12345.service-now.com)。 |
SN_USER | 是 | — | 1.0.0 | 用于 Basic 身份验证的 ServiceNow 用户名。 |
SN_PASSWORD | 是 | — | 1.0.0 | ServiceNow 密码。任何工具都不会记录或返回此密码。 |
SN_AUTH | 否 | auto | 1.1.0 | 身份验证方法:basic、oauth、apikey、token 或 none(仅证书 mTLS)。根据现有密钥自动检测(API 密钥 → bearer 令牌 → OAuth → Basic)。 |
SN_API_KEY | 否 | — | 1.1.0 | ServiceNow 入站 API 密钥,通过 x-sn-apikey 标头发送(启用 apikey 模式)。 |
SN_BEARER_TOKEN | 否 | — | 1.1.0 | 预先获取的 bearer 令牌,按原样通过 Authorization: Bearer … 发送(启用 token 模式)。 |
SN_TOKEN_FILE | 否 | — | next | 保存 bearer 令牌的文件(启用 token 模式;优先于 SN_BEARER_TOKEN)。如果实例以 401 拒绝该令牌,会重新读取一次,以便外部签发方可以轮换令牌;否则调用会以 AUTH_EXPIRED 失败。 |
SN_TOKEN_EXPIRES_AT | 否 | — | next | bearer 令牌的 ISO 8601 到期时间。剩余时间少于 24 小时、令牌已过期或无法解析时,get_status / doctor 会发出警告。 |
SN_OAUTH_CLIENT_ID | 否 | — | 1.1.0 | OAuth 客户端 ID(设置后启用 OAuth)。 |
SN_OAUTH_CLIENT_SECRET | 否 | — | 1.1.0 | OAuth 客户端密钥。 |
SN_OAUTH_GRANT | 否 | password | 1.1.0 | OAuth 授权类型:password(已弃用 — ROPC)、client_credentials、refresh_token 或 jwt_bearer。login 命令会为你将此项设为 refresh_token。任何其他值都会导致所有 OAuth 请求失败。 |
SN_OAUTH_REFRESH_TOKEN | 否 | — | 1.1.0 | 用于 refresh_token 授权的刷新令牌。通过 npx servicenow-mcp-ai login 自动获取(Authorization Code + PKCE)。 |
SN_OAUTH_REDIRECT_URI | 否 | http://localhost:53682/callback | 1.1.0 | PKCE login 流程的环回重定向 URL。必须与 OAuth 端点上注册的重定向地址一致。 |
SN_OAUTH_SCOPE | 否 | — | 1.1.0 | login 期间请求的可选 OAuth 作用域。 |
SN_OAUTH_JWT_KEY | 否 | — | 1.1.0 | 用于 jwt_bearer 授权的 PEM 私钥(或使用 SN_OAUTH_JWT_KEY_FILE);公钥证书需在 ServiceNow JWT 提供方处注册。 |
SN_OAUTH_JWT_KEY_FILE | 否 | — | 1.1.0 | 用于 jwt_bearer 授权的 PEM 私钥路径。 |
SN_OAUTH_JWT_ISS | 否 | client id | 1.1.0 | JWT bearer 断言的 iss 声明。 |
SN_OAUTH_JWT_SUB | 否 | SN_USER | 1.1.0 | JWT bearer 断言的 sub 声明(用户)。 |
SN_OAUTH_JWT_AUD | 否 | https://<host>/oauth_token.do | 1.1.0 | JWT bearer 断言的 aud 声明。 |
SN_OAUTH_JWT_KID | 否 | — | 1.1.0 | JWT bearer 断言的 kid 标头(提供方要求时)。 |
SN_OAUTH_JWT_EXP_SEC | 否 | 300 | 1.1.0 | JWT bearer 断言的有效期(秒)。 |
SN_ALLOW_UNCONFIRMED_CREDENTIAL_CHANGE | 否 | false | next | H-2:操作员选择退出 — 允许 servicenow_set_credentials 在不支持 elicitation 的 MCP 客户端上继续执行(不显示确认提示,也不连接实时服务)。仍会拒绝明确拒绝的操作。默认关闭。 |
文件中的机密
容器机密(D-5):<KEY>_FILE=/path 会在启动时从该文件加载 <KEY>(去掉一个末尾换行符)。同时设置 <KEY> 和 <KEY>_FILE 会导致启动错误;文件不可读或为空也会导致启动错误。以这种方式加载的值不会写回环境文件。每个配置文件的 ServiceNow 机密:SN_PROFILE_<NAME>_<KEY>_FILE。
| 变量 | 必填 | 默认值 | 起始版本 | 描述 |
|---|---|---|---|---|
SN_PASSWORD_FILE | 否 | — | next | D-5:从此文件读取 SN_PASSWORD(Docker / Kubernetes 机密)。 |
SN_API_KEY_FILE | 否 | — | next | D-5:从此文件读取 SN_API_KEY(Docker / Kubernetes 机密)。 |
SN_BEARER_TOKEN_FILE | 否 | — | next | D-5:从此文件读取 SN_BEARER_TOKEN(Docker / Kubernetes 机密)。启动时读取一次(SN_TOKEN_FILE 在收到 401 时会重新读取,且优先级仍更高)。 |
SN_OAUTH_CLIENT_SECRET_FILE | 否 | — | next | D-5:从此文件读取 SN_OAUTH_CLIENT_SECRET(Docker / Kubernetes 机密)。 |
SN_OAUTH_REFRESH_TOKEN_FILE | 否 | — | next | D-5:从此文件读取 SN_OAUTH_REFRESH_TOKEN(Docker / Kubernetes 机密)。刷新后的令牌仅保留在内存中(请自行更新文件)。 |
SN_HTTP_TOKEN_FILE | 否 | — | next | D-5:从此文件读取 SN_HTTP_TOKEN(Docker / Kubernetes 机密)。 |
SN_HTTP_OAUTH_INTROSPECTION_SECRET_FILE | 否 | — | next | D-5:从此文件读取 SN_HTTP_OAUTH_INTROSPECTION_SECRET(Docker / Kubernetes 机密)。 |
SN_HTTP_OAUTH_TOKEN_KEY_FILE | 否 | — | next | D-5:从此文件读取 SN_HTTP_OAUTH_TOKEN_KEY(Docker / Kubernetes 机密)。 |
配置文件与环境文件
未加前缀的 SN_INSTANCE / SN_USER / SN_PASSWORD 键属于“default”配置文件。更多实例通过 SN_PROFILE__* 键配置;使用 SN_ACTIVE_PROFILE 或 servicenow_use_instance 工具切换。
| 变量 | 必填 | 默认值 | 起始版本 | 描述 |
|---|---|---|---|---|
SN_PROFILE_<NAME>_* | 否 | — | 1.1.0 | 命名连接配置文件:SN_PROFILE_DEV_INSTANCE / _USER / _PASSWORD 定义配置文件 dev。未加前缀的 SN_INSTANCE/SN_USER/SN_PASSWORD 键属于 default 配置文件。身份验证、策略、写入模式、ENV、PROD_WRITES 和 UPDATE_SET 设置使用相同前缀。例如:SN_PROFILE_DEV_INSTANCE=dev12345.service-now.com、SN_PROFILE_DEV_USER=admin、SN_PROFILE_DEV_PASSWORD=dev-password。 |
SN_ACTIVE_PROFILE | 否 | default | 1.1.0 | 工具使用的配置文件。可在运行时通过 servicenow_use_instance 切换(只有设置 persist: true 时才会写入环境文件)。 |
SN_ENV_FILE | 否 | ~/.config/servicenow-mcp-ai/.env | 1.1.0 | 要读取/写入的环境文件的显式路径。否则,服务会使用 $XDG_CONFIG_HOME/servicenow-mcp-ai/.env(~/.config/…)。如果两者均未生效,仍会读取已安装软件包旁项目根目录中的 .env,作为已弃用的回退方式(B5),并在启动时警告并指出应将其移至何处。doctor 会打印所选文件及选择原因。 |
网络、TLS 与弹性
超时、重试、主机允许列表、出站代理、双向 TLS 以及每主机队列和断路器。这些设置适用于服务的所有 REST 客户端。代理和双向 TLS 需要可选的 undici 软件包。
| 变量 | 必填 | 默认值 | 起始版本 | 描述 |
|---|---|---|---|---|
SN_TIMEOUT_MS | 否 | 30000 | 1.1.0 | 每个请求的超时时间,单位为毫秒。 |
SN_MAX_RETRIES | 否 | 2 | 1.1.0 | 对暂时性故障(429/5xx、网络错误)的重试次数。非幂等写入仅在连接错误时重试。 |
SN_RETRY_AFTER_MAX_MS | 否 | 60000 | next | 对 429/503 响应中的 Retry-After 标头所接受的上限;超出此值时会截断,以免行为异常的上游导致客户端等待数分钟。 |
SN_DEADLINE_MS | 否 | max(120000, 2 × SN_TIMEOUT_MS) | next | 单个逻辑请求在重试、退避、队列等待和 OAuth 重新认证期间可用的总实际时间预算。若重试无法在剩余预算内完成,则不会尝试;调用会以代码 DEADLINE_EXCEEDED 失败。 |
SN_ALLOWED_HOSTS | 否 | — | 1.1.0 | 以逗号分隔的允许主机列表(适用于自定义域或主权云域)。设置后,只会联系匹配的主机。未设置时,仅允许 *.service-now.com 实例,并会阻止内部/环回主机(SSRF 防护)。条目可包含端口(host:8443),也可为带方括号的 IPv6 字面量([2001:db8::1]);只有在存在匹配条目时,实例值中的显式非 443 端口或 IPv6 字面量才会被接受;默认策略下不接受。 |
SN_MAX_BODY_BYTES | 否 | 52428800 | next | 读入内存的最大响应正文大小(字节);声明大小或流式读取大小超过此限制时,将以 RESPONSE_TOO_LARGE 失败。绝不会跟随重定向;遇到 3xx 时会以 REDIRECT_BLOCKED 失败,并指出目标主机。 |
SN_HTTPS_PROXY | 否 | — | next | 用于所有 ServiceNow 和 OAuth 流量的出站 HTTPS 代理 URL(http://user:pass@proxy:3128);需要可选的 undici 包。未设置时,会遵循环境中的 HTTPS_PROXY / HTTP_PROXY 变量以及 NO_PROXY;显式设置 SN_HTTPS_PROXY 时会忽略 NO_PROXY。代理凭据绝不会记录到日志中。 |
SN_USER_AGENT_SUFFIX | 否 | — | next | 附加到每个请求所发送 User-Agent 后的额外标记(servicenow-mcp-ai/<version> (node/<major>; <transport>; <client>)),例如团队或工单 ID,以便在实例的事务日志中进行关联。仅限可打印的 ASCII 字符,最多 80 个字符。 |
SN_TLS_CLIENT_CERT | 否 | — | 1.1.0 | 用于双向 TLS 的客户端证书(PEM),或使用 SN_TLS_CLIENT_CERT_FILE。与 SN_TLS_CLIENT_KEY 配合使用时会提供客户端证书;ServiceNow 的双向认证配置文件会将其映射到用户。需要可选的 undici 包(npm i undici)。证书和密钥必须同时设置;只设置其中一个属于配置错误。 |
SN_TLS_CLIENT_CERT_FILE | 否 | — | 1.1.0 | 双向 TLS 客户端证书(PEM)的路径。 |
SN_TLS_CLIENT_KEY | 否 | — | 1.1.0 | 客户端证书的私钥(PEM),或使用 SN_TLS_CLIENT_KEY_FILE。 |
SN_TLS_CLIENT_KEY_FILE | 否 | — | 1.1.0 | 客户端证书私钥(PEM)的路径。 |
SN_TLS_CA | 否 | — | 1.1.0 | 要信任的可选 CA 证书包(PEM),或使用 SN_TLS_CA_FILE;无论是否提供客户端证书都会应用;需要可选的 undici 包。 |
SN_TLS_CA_FILE | 否 | — | 1.1.0 | 要信任的 CA 证书包(PEM)的路径。 |
SN_TLS_REJECT_UNAUTHORIZED | 否 | true | 1.1.0 | 设为 false 会禁用 TLS 证书验证(不建议这样做;启动时会警告一次)。 |
SN_MAX_CONCURRENT | 否 | 4 | 1.1.0 | 向实例发出的最大并行 HTTP 请求数(简单的进程内信号量)。 |
SN_MAX_QUEUE | 否 | 64 | next | 每个主机等待空闲槽位的最大请求数,超出 SN_MAX_CONCURRENT 的部分也计入。队列溢出时会立即以代码 BUSY 失败,而不会持续堆积。诊断请求(servicenow_test_connection、doctor)会绕过队列,因此即使队列阻塞也仍能响应。 |
SN_QUEUE_TIMEOUT_MS | 否 | SN_TIMEOUT_MS | next | 请求等待槽位的最长时间,超时后会以代码 BUSY 失败。等待时间不计入每次尝试的超时时间,只计入 SN_DEADLINE_MS。 |
SN_BREAKER_THRESHOLD | 否 | 0(关闭) | next | 按主机选择性启用断路器:连续请求失败(传输错误、超过截止时间、5xx)达到此次数后,后续请求会立即以代码 CIRCUIT_OPEN 失败,直到经过 SN_BREAKER_RESET_MS。诊断请求永远不会被阻止。 |
SN_BREAKER_RESET_MS | 否 | 30000 | next | 断路器打开后拒绝请求的时长,经过后会放行一个试探请求;试探请求首次失败会重新打开断路器,首次成功则会关闭断路器。 |
工具包
已注册的工具。管理工具(set_credentials、get_status、use_instance)始终启用。
| Variable | Required | Default | Since | Description |
|---|---|---|---|---|
SN_TOOL_PACKAGES | no | discovery | 1.0.0 | 以逗号或空格分隔的工具包或配置文件,用于启用相应功能。配置文件:discovery(默认;core 是 2.x 的默认配置,另含 attachment)、all,以及预设配置 reader \ |
SN_PACKAGES_DENY | no | — | 1.0.0 | 以逗号或空格分隔的软件包,即使已通过 SN_TOOL_PACKAGES 启用,也会将其排除。这是阻止插件 API(catalog、change、knowledge 等)的唯一方法——表策略不会检查这些 API。 |
SN_PACKAGES_READONLY | no | — | 1.0.0 | 以逗号或空格分隔的软件包,这些软件包的写入工具不会注册;其读取工具仍会保留。用于补充全局设置 SN_READONLY 的逐软件包配置。 |
SN_CODESEARCH | no | false | 1.1.0 | 选择启用 Code Search API(sn_codesearch),供 servicenow_search_code 使用(FT-7)。设为 true 且插件处于启用状态时,将替代 LIKE 遍历;发生任何故障时都会回退到 LIKE。 |
SN_EXPERIMENTAL_TASKS | no | 0 | next | M-9,实验性功能:设为 1 后,snapshot_instance、compare_instances、run_atf、check_code_health、document_app、document_instance 和 query_table(仅限 format:"file")会新增可选参数 run_as_task:true。此类调用会立即返回 MCP 任务句柄(_meta["io.modelcontextprotocol/related-task"]);客户端可轮询 tasks/get,读取 tasks/result(保留 1 h,并已编辑敏感信息),或通过 tasks/cancel 停止任务。关闭时:架构不变。基于 SDK 的实验性任务 API 构建。 |
SN_MCP_APPS | no | 0 | next | N-50,MCP Apps(SEP-1865):设为 1 后,会注册四个独立的 ui://servicenow-mcp/… HTML 视图(text/html;profile=mcp-app:计划差异、Mermaid 图、流程说明、UI Builder 页面树),并通过 _meta.ui.resourceUri 将写入工具与 apply、Mermaid 生成器、explain_flow 和 explain_ui_experience 关联起来——仅适用于声明支持 io.modelcontextprotocol/ui 扩展的客户端。视图会呈现工具自身的结果(无网络访问,严格的 CSP)。关闭时:tools/list、资源和所有结果均不变。 |
SN_LEGACY_TOOL_NAMES | no | 0 | next | M-7(B2),仅在一个次要版本周期内提供的弃用过渡机制:按照 v3 命名约定重命名的每个工具,其旧名称都会成为新名称的别名——别名会调用新工具、接受旧参数名称,并记录一次性弃用警告。关闭时(默认):别名仍会响应 tools/call,但不会列在 tools/list 中。设为 1 后,别名也会列出,并且新工具名称也接受旧参数名称。请参阅 README 中的重命名表。 |
访问策略与写入安全
最小权限表策略、先规划后应用的写入流程、破坏性写入确认、每会话上限、生产环境配置文件、更新集绑定,以及上传、邮件和 SDK 管理范围的防护措施。
| 变量 | 必填 | 默认值 | 起始版本 | 描述 |
|---|---|---|---|---|
SN_TABLES_ALLOW | 否 | — | 1.1.0 | 以逗号分隔的表白名单;设置后,仅这些表可访问。 |
SN_TABLES_DENY | 否 | — | 1.1.0 | 以逗号分隔的表黑名单;始终优先于白名单。 |
SN_READONLY | 否 | false | 1.1.0 | 值为真时,拒绝所有创建、更新和删除操作。 |
SN_WRITE_MODE | 否 | plan | 2.0.0 | plan(默认值)以变更前后差异的形式预览写入,不实际修改;apply 执行写入;传入 apply:true 可强制执行单次调用。 |
SN_COMPAT | 否 | 3 | next | 升级兼容桥(负责人,2026-10-14):2 会为这些未设置的选项保留 2.x 默认值——SN_PROTECTED_TABLES_WRITE=allow、SN_DESTRUCTIVE_CONFIRM=off、SN_BATCH_UNMAPPED=allow、SN_LEGACY_TOOL_NAMES=1 和 SN_TOOL_PACKAGES=core(发现功能加上 attachment);无效值会发出警告并保留默认值,而非停止服务(SN_STRICT_SETTINGS=0)。你自行设置的选项始终优先。servicenow-mcp-ai migrate 在转换 2.x 环境文件时会添加此项。3(默认值)使用 3.0 默认值。此设置用于迁移,不应永久保留。 |
SN_DESTRUCTIVE_CONFIRM | 否 | token | next | H-3:在计划模式下,对破坏性 apply:true 操作(delete_record、delete_attachment、写入型 batch、send_email、order_catalog_item、revert_write、upsert_artifact,以及带 calculate:true 的 check_change_conflicts)进行确认。token(3.0 默认值,B4):计划预览会返回一次性 plan_token,执行时必须用相同参数传回该令牌——不带令牌的执行请求会返回该预览及其令牌(不会执行任何操作);令牌错误、已使用或过期时返回 PLAN_REQUIRED;elicit:在 token 的基础上,向支持征求确认的客户端显示确认提示(拒绝时返回 CONFIRM_DECLINED,并记录为已拒绝)。SN_WRITE_MODE=apply 会跳过此确认,但标记为 prod 的配置文件(SN_ENV)除外;此类配置始终至少要求 elicit,且在 apply 模式下也会确认。off 是显式选择退出(3.0 之前的行为)。 |
SN_PLAN_TOKEN_TTL_SEC | 否 | 600 | next | H-3:plan_token 的有效期,单位为秒(30–86400)。令牌仅保存在服务进程中,并会在执行时用尽。 |
SN_BATCH_UNMAPPED | 否 | deny | next | H-4:servicenow_batch 中 REST 路径不归任何工具包管理的子请求:deny(3.0 默认值,B8)会拒绝该请求(因此新插件 API 无法在批处理中绕过 SN_PACKAGES_DENY / SN_PACKAGES_READONLY);allow 是选择退出,仅依据表策略和只读规则检查该请求。始终拒绝嵌套批处理。 |
SN_BATCH_MAX_REQUESTS | 否 | 50 | next | H-4:单次 servicenow_batch 调用最多可包含的子请求数(1–1000;自 3.0 起为 50),发送任何请求前都会进行检查。 |
SN_PROTECTED_TABLES_WRITE | 否 | confirm | next | H-11:对内置受保护表(身份、角色、ACL、sys_properties、OAuth、脚本、LDAP、证书、数据源、REST 消息)的写入——servicenow_explain_policy 会列出这些表。confirm(3.0 默认值,B11)仅在工具调用本身传入 apply: true 时执行写入;在 SN_WRITE_MODE=apply 下,未传入此参数的调用会被拒绝并返回 POLICY_DENIED,同时提示重新运行;deny 会拒绝所有此类操作;allow 是 2.x 的行为。精确匹配的 SN_TABLES_ALLOW 条目可解除单个表的限制。读取不受影响。 |
SN_IMPORT_SET_TABLES | 否 | u_*,imp_* | next | H-11:导入集暂存表必须匹配的模式(*、?)(3.0 默认值为 u_*,imp_*);* 表示选择退出(允许任何符合表策略的表)。 |
SN_MAX_WRITES_PER_SESSION | 否 | 每个 HTTP 会话 500 次,stdio 不限 | next | H-11:每个会话最多可执行的实例写入次数(stdio 按进程计算,HTTP 按单个 MCP 会话计算;批处理按其写入子请求计数)。超出后,写入会在发送任何请求前以 WRITE_CAP 失败;get_status.writes.caps 会显示用量。未设置 = 每个 HTTP 会话最多 500 次,stdio 不限(3.0 默认值);0 = 不限。 |
SN_MAX_DELETES_PER_SESSION | 否 | 100 | next | H-11:每个会话最多可执行的删除次数(WRITE_CAP;自 3.0 起为 100)。0 = 不限。 |
SN_MAX_BATCH_WRITES | 否 | 50 | next | H-11:单次 servicenow_batch 中最多可包含的写入型(非 GET)子请求数(WRITE_CAP;自 3.0 起为 50)。0 = 不限。 |
SN_ENV | 否 | — | next | H-11:将默认配置文件标记为 prod、test 或 dev(其他配置文件使用 SN_PROFILE_<NAME>_ENV)。prod 配置文件始终保持计划模式,即使已配置 apply 模式也是如此;除非 SN_PROD_WRITES(SN_PROFILE_<NAME>_PROD_WRITES)为 I_UNDERSTAND。此类配置文件的破坏性执行始终需要确认(至少设置 SN_DESTRUCTIVE_CONFIRM=elicit,apply 模式下也如此;不支持征求确认的客户端会收到 CONFIRM_REQUIRED);结果包含 _meta.environment;use_instance 会发出警告。SN_PROFILE_<NAME>_WRITE_MODE 可为每个配置文件设置写入模式。 |
SN_PROD_WRITES | 否 | — | next | H-11:I_UNDERSTAND 允许 prod 默认配置文件以 apply 模式运行。 |
SN_UPDATE_SET | 否 | — | next | S-6:已执行的表工具写入(创建 / 更新 / upsert / 删除)所使用的更新集(sys_id 或精确名称);单次调用中的 update_set 可覆盖此项。计划会标明该更新集;写入期间会切换用户当前更新集,并在完成后恢复。数据行表的写入不变。 |
SN_EMAIL_ALLOWED_DOMAINS | 否 | — | next | servicenow_send_email 可发送到的收件人域名(to/cc/bcc;域名包含其子域名,* 允许任意域名)。未设置时,每位收件人都必须是实例自身 sys_user 表中某个用户的电子邮件地址;否则会返回 RECIPIENT_NOT_ALLOWED。 |
SN_MAX_UPLOAD_BYTES | 否 | 10485760 | next | 附件上传解码后的最大大小;解码前会根据 base64 长度检查(PAYLOAD_TOO_LARGE)。 |
SN_UPLOAD_MIME_ALLOW | 否 | — | next | 可选的上传内容类型白名单(精确匹配或 type/*);其他类型会返回 MIME_NOT_ALLOWED。 |
SN_SDK_MANAGED_SCOPES | 否 | — | next | P-3:以逗号或空格分隔的应用作用域(如 x_acme_app 这样的命名空间,或 sys_scope sys_id),用于声明由 ServiceNow SDK(Fluent)项目管理的作用域。这是检测 SDK 管理作用域时优先级最高的信息来源;在 get_status / check_capabilities 的 sdkManaged 下列出。 |
SN_SDK_MANAGED_WRITES | 否 | warn | next | P-22:从 create_record、update_record、upsert_record、delete_record、set_property、revert_write、upsert_artifact(计划中的每条记录)以及 batch 的 Table API 写入子请求,向 SDK 管理的作用域(其 sys_scope 被 P-3 检测为 SDK 管理的记录)写入时适用;在 sys_metadata 表上创建时若未提供 sys_scope,则根据会话当前应用判断(apps.current_app 首选项;无法读取时会生成 sdkScopeWarning,不会导致崩溃):warn 会预览并执行,同时返回 sdkManaged 区块,说明 Fluent 替代方案;deny 会以 SDK_MANAGED_SCOPE 拒绝执行(计划会标示 would_refuse);allow 跳过检查。此检查在表策略之后运行;只有设置了 SN_SDK_MANAGED_SCOPES 或 SN_SDK_PROJECT_DIRS 时才会产生开销。 |
SN_SDK_PROJECT_DIRS | 否 | — | next | P-3:以逗号或平台路径分隔符分隔的目录,只读扫描其中的 SDK 项目:每个 now.config.json 都会将其 scope / scopeId 声明为 SDK 管理的作用域。扫描范围受限(深度 4、2000 个目录、100 个配置文件、每个文件 256 KiB),绝不跟随符号链接,跳过隐藏目录、node_modules 和构建目录,除 now.config.json 外不会读取任何文件。 |
结果、脱敏与导出
结果大小预算、输出整形、记录值脱敏、写入日志和 CSV 导出安全性。
| 变量 | 必需 | 默认值 | 起始版本 | 说明 |
|---|---|---|---|---|
SN_MAX_RECORDS | 否 | 10000 | 1.1.0 | fetchAll 查询返回记录数的硬性上限。 |
SN_MAX_RESULT_CHARS | 否 | 48000 | 1.1.0 | 工具结果的字符数预算(自 O-21 (b) 起为 48,000,低于 Claude Code 的 50,000 字符阈值)。启用 SN_OVERSIZE_TO_FILE 时,较大的结果会写入文件;否则会缩减结果并附上说明,指出 format:"file",而快照、比较或图表结果会完整返回,并附带 note。 |
SN_OVERSIZE_TO_FILE | 否 | true | next | S-11 / N-61(自 O-21 (b) 起默认启用):将超过 SN_MAX_RESULT_CHARS 的 query_table(JSON 行)、快照、比较或图表结果写入 SN_DOCS_DIR 下的文件(<profile>/exports/、<profile>/diagrams/),并改为返回 {path, bytes, preview}。 |
SN_RESULT_SIZE_HINTS | 否 | true | next | N-65(默认启用,O-21 (c)):大型读取工具(document_*、snapshot_instance、compare_*、get_script)会在 tools/list 中携带 _meta["anthropic/maxResultSizeChars"] = SN_MAX_RESULT_CHARS。设为 false 可移除这些提示。 |
SN_STRUCTURED | 否 | true | next | N-39(默认启用,O-21 (d)):具有输出结构的工具会在 tools/list 中发布 outputSchema,并在 JSON 文本旁返回 structuredContent。设为 false 可同时移除两者:此时每个结果仅以文本形式携带一次载荷,且 tools/list 会更小。 |
SN_INCLUDE_REF_LINKS | 否 | false | 1.1.0 | 默认情况下,引用字段不会返回其 link URL,以节省令牌。设为 true 可将其包含在内。 |
SN_RESULT_PRETTY | 否 | false | 1.1.0 | 工具结果默认采用紧凑 JSON(美化输出会使令牌数约翻倍)。设为 true 可输出缩进格式。 |
SN_REDACT_FIELDS | 否 | — | 2.0.0 | DF-5:在记录传给模型前,屏蔽这些字段值(以逗号或空格分隔)。 |
SN_REDACT_PII | 否 | false | 2.0.0 | DF-5:同时屏蔽字符串值中的电子邮件、电话和国家身份证号码模式。自 H-5 起,这两项脱敏设置会深度应用于每个工具结果(成功和错误)以及写入日志。 |
SN_JOURNAL_MAX_BYTES | 否 | 20971520 | next | H-5:达到此大小(字节,默认 20 MiB)时,write-journal.jsonl 会轮换为 write-journal.<ISO-time>.jsonl;哈希链会跨文件延续。 |
SN_CSV_FORMULA_GUARD | 否 | true | next | H-5:对以 =、+、-、@、制表符或 CR 开头的 CSV 文本单元格加上 ' 前缀,避免电子表格执行其中的内容(文本 -5 导出为 '-5)。设为 0 可关闭此功能。 |
SN_CSV_BOM | 否 | true | next | H-5:在 format:"csv" 导出内容前添加 UTF-8 BOM,以便 Excel 正确解码非 ASCII 文本。设为 0 可关闭此功能。 |
缓存
用于读取架构的缓存,以及能力 / 插件 API 探测缓存。
| 变量 | 必需 | 默认值 | 起始版本 | 说明 |
|---|---|---|---|---|
SN_RECORD_WATCH_INTERVAL_MS | 否 | 30000 | next | N-10:记录监视订阅(servicenow://profiles/<profile>/records/<table>/<sys_id>)的轮询间隔;每次轮询都会读取 sys_updated_on / sys_mod_count。下限为 30000。 |
SN_RECORD_WATCH_MAX_PER_SESSION | 否 | 10 | next | N-10:单个客户端会话可持有的记录监视订阅数;超出一个时将以 WATCH_LIMIT 拒绝。 |
SN_RECORD_WATCH_MAX | 否 | 50 | next | N-10:整个进程(所有会话)的记录监视订阅数;超出一个时将以 WATCH_LIMIT 拒绝。 |
SN_SCHEMA_CACHE_TTL_SEC | 否 | 300 | 1.1.0 | 近乎静态的架构读取缓存(list_tables、describe_table、get_cmdb_meta)的 TTL。0 表示禁用缓存。 |
SN_SCHEMA_CACHE_MAX | 否 | 256 | next | 架构读取缓存中的最大条目数;缓存已满时,会淘汰最近最少使用的条目。计数器(size、hits、misses、evictions)会显示在 get_status 的 schemaCache 下。 |
SN_CAPABILITY_TTL_MS | 否 | 600000 | next | 成功的能力探测缓存时长——包括 servicenow_check_capabilities 矩阵和插件 API 可用性(CI/CD、代码搜索、批处理……)。传入 refresh: true 可提前重新探测。 |
SN_PLUGIN_NEGATIVE_TTL_MS | 否 | 60000 | next | 失败的能力探测(HTTP 401/403/404/5xx)或缺失的插件 API 在重试前缓存的时长。传输错误不会被缓存。 |
文档存储和图表
本地 Markdown 文档存储(也是写入日志的存放位置——请勿纳入版本控制)以及生成的 Mermaid 图表。
| 变量 | 必需 | 默认值 | 起始版本 | 说明 |
|---|---|---|---|---|
SN_DOCS_DIR | 否 | docs/instance | 1.0.0 | docs 包读取 / 写入 Markdown 的目录。相对路径以工作目录为基准解析。此目录也存放各配置文件的写入日志——请将 docs/instance/ 添加到运行服务的任何仓库的 .gitignore 中。 |
SN_DOCS_MAX_FILE_BYTES | 否 | 5242880 | next | 文档工具的单文件大小上限:超出上限的写入会被拒绝;读取仅返回前若干字节,并设置 truncated: true;搜索会跳过该文件。 |
SN_DOCS_STALE_DAYS | 否 | 30 | next | 当生成文档的 sn_generated_at 距今超过指定天数时,servicenow_list_docs 会将其标记为 stale。 |
SN_DOCS_SEARCH_MAX | 否 | 200 | next | servicenow_search_docs 返回的最大匹配数;超过此数量时,结果会带有 truncated: true。 |
SN_DIAGRAM_MAX_NODES | 否 | 200 | next | 生成的 Mermaid 图表(表流、事件跟踪、使用位置;详细 ER 图中的表)的节点上限。超出上限的节点会折叠为一个 +N more 节点。 |
HTTP 传输
stdio(默认,单个本地客户端)或用于远程客户端和 Agent 客户端的 Streamable HTTP。HTTP 端点的安全防护(TLS、身份验证、网络)由运营者负责。
| 变量 | 必填 | 默认值 | 起始版本 | 描述 |
|---|---|---|---|---|
SN_TRANSPORT | 否 | stdio | 2.0.0 | DF-6:stdio(默认)或 http(供远程客户端/Agent 客户端使用的 Streamable HTTP)。 |
SN_PORT | 否 | 3000 | 2.0.0 | DF-6:http 传输使用的 TCP 端口。 |
SN_HTTP_HOST | 否 | 127.0.0.1 | 2.0.0 | DF-6:http 传输的绑定地址(默认绑定到回环地址)。 |
SN_HTTP_TOKEN | 否 | — | 2.0.0 | DF-6:设置后,http 请求必须发送 Authorization: Bearer <token>。当 SN_HTTP_HOST 不是回环地址时(例如 Docker 镜像中的 0.0.0.0),必须设置此项;否则所有能访问该端口的客户端都会被接受,并记录一条警告。 |
SN_HTTP_OAUTH_ISSUER | 否 | — | next | N-17:OAuth 2.1 / OpenID Connect 授权服务器的颁发者,其 JWT 访问令牌由 http 传输接受(根据其 JWKS 验证签名;强制检查 iss、aud、exp、nbf 和作用域)。启用 /.well-known/oauth-protected-resource 处的 RFC 9728 元数据。需要设置 SN_HTTP_OAUTH_RESOURCE;此项旁边仍可同时使用 SN_HTTP_TOKEN。 |
SN_HTTP_OAUTH_RESOURCE | 否 | — | next | N-17:此服务的规范公共 URI(RFC 8707 资源标识符)。仅当令牌的 aud 包含此值(或某个 SN_HTTP_OAUTH_AUDIENCE 值)时才会接受该令牌。 |
SN_HTTP_OAUTH_AUDIENCE | 否 | — | next | N-17:除 SN_HTTP_OAUTH_RESOURCE 外,额外接受的 aud 值,适用于会颁发自有受众标识符的授权服务器。 |
SN_HTTP_OAUTH_JWKS_URI | 否 | — | next | N-17:颁发者的 JWKS URI。未设置时,将从颁发者的 OpenID Connect 或 RFC 8414 元数据中发现。 |
SN_HTTP_OAUTH_INTROSPECTION_URI | 否 | — | next | N-17:颁发者的 RFC 7662 令牌内省端点。设置后,若该端点返回 active,且响应中包含此资源的 aud、sub、exp 和所需作用域,则接受不透明(非 JWT)访问令牌;有效响应会复用至多 60 s。未设置时,仅接受 JWT 访问令牌。需要设置 SN_HTTP_OAUTH_INTROSPECTION_CLIENT_ID 和 SN_HTTP_OAUTH_INTROSPECTION_SECRET。 |
SN_HTTP_OAUTH_INTROSPECTION_CLIENT_ID | 否 | — | next | N-17:此服务在令牌内省端点上的客户端 ID(HTTP Basic,client_secret_basic)。 |
SN_HTTP_OAUTH_INTROSPECTION_SECRET | 否 | — | next | N-17:此服务在令牌内省端点上的客户端密钥。 |
SN_HTTP_OAUTH_SCOPES | 否 | — | next | N-17:每个请求的令牌都必须携带的作用域;这些作用域会发布在 scopes_supported 和 WWW-Authenticate 挑战中。缺少这些作用域的令牌会收到 403 insufficient_scope。 |
SN_HTTP_OAUTH_USER_TOKENS | 否 | off | next | N-17:以 OAuth 主体身份调用 ServiceNow,而不是使用共享配置凭据。每个主体都需自行关联一个 ServiceNow 账户(通过 URL elicitation 执行 Authorization Code + PKCE,回调地址为 SN_HTTP_OAUTH_RESOURCE 源上的 /oauth/servicenow/callback),并使用配置中的 SN_OAUTH_CLIENT_ID / SN_OAUTH_CLIENT_SECRET;刷新令牌会加密后保存在 SN_HTTP_OAUTH_TOKEN_STORE 中。需要设置 SN_HTTP_OAUTH_ISSUER 和 SN_HTTP_OAUTH_TOKEN_KEY。 |
SN_HTTP_OAUTH_USER_MATCH | 否 | email=email | next | N-17:<token claim>=<sys_user field> — 仅当关联的 ServiceNow 账户的 sys_user 字段与主体的声明匹配(不区分大小写)时才会接受该账户,以防用户关联他人的账户。 |
SN_HTTP_OAUTH_TOKEN_KEY | 否 | — | next | N-17:用于加密静态存储的各用户刷新令牌的 AES-256-GCM 密钥(32 字节,base64 或 hex)。轮换密钥会移除所有关联。 |
SN_HTTP_OAUTH_TOKEN_STORE | 否 | 与 env 文件同目录下的 oauth-user-tokens.json | next | N-17:各用户的加密令牌存储文件(文件权限为 0600,所在目录权限为 0700)。 |
SN_HTTP_REQUIRE_TOKEN | 否 | on | next | H-7 / B6:当 SN_HTTP_HOST 不是回环地址且未设置 SN_HTTP_TOKEN 或 OAuth 时,拒绝启动 http 传输。设为 0 可改为记录警告并接受所有客户端。 |
SN_HTTP_SESSION_TTL_SEC | 否 | 1800 | next | H-7:http 会话的空闲 TTL(秒);空闲会话将关闭,其运行时也会被释放。设为 0 可使会话保持打开状态,直到客户端发送 DELETE。 |
SN_HTTP_MAX_SESSIONS | 否 | 64 | next | H-7:并发 http 会话上限;超过上限的新会话请求会收到 503 并被拒绝。 |
SN_HTTP_KEEPALIVE_MS | 否 | 25000 | next | H-7:开放流中 SSE 保活注释的发送间隔(低于常见代理的空闲超时)。设为 0 可禁用。 |
SN_HTTP_ALLOWED_HOSTS | 否 | — | next | H-7:http 传输接受的 Host 标头值(用于防范 DNS 重绑定);不带端口的条目会匹配任意端口。未设置时,绑定到回环地址则仅允许回环名称,否则不进行检查(会记录警告)。 |
SN_HTTP_ALLOWED_ORIGINS | 否 | — | next | H-7:http 传输接受的浏览器 Origin 值(* = 任意来源)。未设置时仅允许回环来源;此检查绝不会拒绝不带 Origin 标头的请求。 |
SN_METRICS | 否 | off | next | E-5:仅适用于 HTTP 传输 — 在 GET /metrics 提供 Prometheus 指标,并受 SN_HTTP_TOKEN 保护(未设置令牌时禁用)。 |
日志记录
stderr 日志、可选的日志文件,以及镜像到 MCP 客户端的日志行。
| 变量 | 必填 | 默认值 | 起始版本 | 描述 |
|---|---|---|---|---|
SN_LOG_LEVEL | 否 | info | 1.1.0 | stderr 日志详细程度:error、warn、info、debug。未设置此项时,会读取旧版 LOG_LEVEL。也读取为 LOG_LEVEL。 |
SN_LOG_FORMAT | 否 | json | next | E-5:stderr 日志行格式——json(每行一个对象)或 text(HH:MM:SS level message key=value)。 |
SN_LOG_FILE | 否 | — | next | E-5:同时将每条日志行(JSON Lines,已脱敏,权限模式为 0600)追加到此文件,并按大小轮转(<file>.1 … <file>.5)。stderr 仍正常工作。 |
SN_LOG_FILE_MAX_BYTES | 否 | 10485760 | next | E-5:SN_LOG_FILE 的轮转阈值(字节)。 |
SN_LOG_NOTIFY_RATE | 否 | 20 | next | M-8:通过 MCP 日志记录能力发送的每秒日志通知数(按客户端会话计算,突发上限为 50,或大于 50 时按设定速率计算)。超出限制的日志行会被计数,并每分钟通过一条“已抑制 N 条日志消息”警告报告;stderr 不会被限流。0 = 不限流。 |
SN_OTEL | 否 | 关闭 | next | N-55:将工具调用和 HTTP diagnostics_channel 事件映射为 OpenTelemetry span(遵循 MCP / GenAI 语义约定)。需要可选的对等依赖 @opentelemetry/api,以及在进程中注册的 OpenTelemetry SDK(例如使用 node --import);如果没有该软件包,会记录一条警告,其他行为不变。 |
SN_OTEL_PROPAGATE | 否 | 关闭 | next | N-55:在发往 ServiceNow REST 的请求中发送 W3C traceparent / tracestate 标头——如果启用了 SN_OTEL,则使用 HTTP 客户端 span 的上下文;否则使用客户端在 params._meta 中发送的上下文。关闭时,跟踪 ID 不会离开服务。 |
设置验证
每项设置都会在启动时验证。无效的安全设置值会导致启动错误;无效的调优设置值会作为警告记录,且设置保留默认值(参见 SN_STRICT_SETTINGS)。
| 变量 | 必填 | 默认值 | 起始版本 | 描述 |
|---|---|---|---|---|
SN_STRICT_SETTINGS | 否 | 仅安全设置 | next | E-4 / B5:哪些无效设置值(非数字、未知的枚举值、超出范围的端口……)会导致服务启动错误,并指出所有出错的键。未设置:仅安全设置——连接、配置文件、软件包、策略、传输,以及信任 / 隐私键(SN_ALLOWED_HOSTS、SN_TLS_*、SN_REDACT_*、SN_CSV_FORMULA_GUARD);无效的调优设置值(超时、上限、缓存、日志记录)会记录警告并保留默认值,与 2.x 一致。1:所有无效值都视为错误。0:无效值均不视为错误(SN_COMPAT=2 时的默认值)。未知的 SN_* 键仍会产生警告。 |
标准变量
SN_ 命名空间之外,服务也会遵循的常规变量。
| 变量 | 必填 | 默认值 | 起始版本 | 描述 |
|---|---|---|---|---|
HTTPS_PROXY | 否 | — | next | HTTPS 流量的标准代理;未设置 SN_HTTPS_PROXY 时会遵循此项(并遵循 NO_PROXY)。也读取为 https_proxy。 |
HTTP_PROXY | 否 | — | next | 未设置 HTTPS_PROXY 时使用的备用代理。也读取为 http_proxy。 |
NO_PROXY | 否 | — | next | 绕过 HTTPS_PROXY / HTTP_PROXY 的主机(绝不绕过 SN_HTTPS_PROXY)。也读取为 no_proxy。 |
XDG_CONFIG_HOME | 否 | ~/.config | 1.1.0 | 默认环境文件的基目录($XDG_CONFIG_HOME/servicenow-mcp-ai/.env)。 |
从文件读取密钥
每项密钥设置都可以从文件读取,遵循 Docker、Compose / Swarm 和 Kubernetes 密钥的惯例:将 <KEY>_FILE 设为路径,服务器会在启动时从该文件加载 <KEY>。这适用于 SN_PASSWORD、SN_API_KEY、SN_BEARER_TOKEN、SN_OAUTH_CLIENT_SECRET、SN_OAUTH_REFRESH_TOKEN 和 SN_HTTP_TOKEN,也适用于各配置文件对应的形式(SN_PROFILE_PROD_PASSWORD_FILE、SN_PROFILE_PROD_API_KEY_FILE,……)。
- 会去掉一个末尾换行符,因此
echo secret > file可正常使用;其他空白字符会保留。 - 同时设置
<KEY>和<KEY>_FILE会导致启动错误,并指出冲突的设置对——服务器绝不会静默选择其中一个。 - 文件不可读或为空会导致启动错误,并指出设置名称和原因,但绝不泄露文件内容。
- 从文件加载的值绝不会写回环境文件:
servicenow_set_credentials和 OAuth 刷新令牌轮换会拒绝持久化该值(轮换后的刷新令牌会保留在内存中,并显示警告)——请更新文件。 - 现有文件设置的含义保持不变:
SN_TOKEN_FILE(收到 401 时重新读取的 bearer token)、SN_OAUTH_JWT_KEY_FILE和SN_TLS_*_FILEPEM 路径,都是由服务器自行读取的路径,而非<KEY>_FILE来源。
双轴访问策略
访问权限由两个独立的轴控制:表和工具包。
| 轴 | 启用 / 拒绝 / 只读 | 示例 |
|---|---|---|
| 表 | SN_TABLES_ALLOW / SN_TABLES_DENY / SN_READONLY | SN_TABLES_DENY=change_request 会阻止 Table API,并且(自 H-4 起)阻止 Change 工具,后者会检查其对应的表。 |
| 工具包 | SN_TOOL_PACKAGES / SN_PACKAGES_DENY / SN_PACKAGES_READONLY | SN_PACKAGES_DENY=change 会移除 Change Management 工具,并阻止 sn_chg_rest 插件 API,包括在批处理中。 |
自 H-4 起,由插件提供支持的工具(Change、Catalog、Knowledge、Email、ATF)和附件(通过父记录的表)也遵循表轴策略;工具包轴仍会移除整个功能面。完整模型(包括 Batch API 如何同时遵循两个轴)请参阅安全说明。
列表语法:表列表(SN_TABLES_ALLOW / SN_TABLES_DENY)以逗号分隔;工具包列表(SN_TOOL_PACKAGES、SN_PACKAGES_DENY、SN_PACKAGES_READONLY)接受逗号或空白字符。两者都会去除首尾空格,且表名匹配不区分大小写——因此 SN_TABLES_DENY=Change_Request, sys_user 可以正常使用。自 H-11 起,表项可以是模式(* 表示任意长度的字符序列,? 表示一个字符):SN_TABLES_DENY=sys_* 会阻止 sys_user,但不影响 incident。匹配顺序为:精确拒绝、精确允许、模式拒绝、受保护的表(写入;自 3.0 起需要调用自身设置 apply: true——SN_PROTECTED_TABLES_WRITE=confirm;deny 会拒绝访问,allow 会解除此规则),然后是允许列表中的模式。调用
servicenow_explain_policy({table, action}) 查看由哪条规则决定,或读取
servicenow://policy。
运行 / 调试
- VS Code:打开命令面板,启动 .vscode/mcp.json 中定义的服务器,然后在 Chat 中使用。
- MCP Inspector:
npm run inspector - 直接运行:
npm start
可观测性
-
状态。
servicenow_get_status包含一个observability区块:每个工具的{count, errors, p50, p95, totalMs}(各工具最近 256 次调用的百分位数,单位为 ms —— 内存占用保持有界),以及结果大小{bytesTotal, textBytes, structuredBytes, bytesP50, bytesP95}(文本块和structuredContent的 UTF-8 字节数,即每个工具的网络传输开销)、架构缓存命中数/未命中数、每个主机的重试计数器、 队列限制和占用情况、熔断器状态,以及每个主机最近发送的X-RateLimit-*标头。它绝不会调用实例。 -
日志。 日志仅写入 stderr(stdout 用于 MCP 协议)。
SN_LOG_FORMAT=text可将 JSON 行切换为人类可读的格式;SN_LOG_FILE还会将 JSON 行追加到按大小轮转的文件中。所有输出目标中的凭据字段(password、token、authorization等)都会被遮盖,此外还会应用SN_REDACT_FIELDS/SN_REDACT_PII规则以及机密列遮盖。 -
追踪钩子。 每次工具调用和请求循环都会通过
node:diagnostics_channel发布消息,因此 OpenTelemetry(或任何)订阅者都可以接入,无需依赖此服务。 只有在某个通道存在订阅者时才会构建消息:通道 时机 消息字段 servicenow-mcp:mcp.tool.call.start工具调用开始 id、tool、package、requestId,以及已知时的sessionId/traceparent/tracestateservicenow-mcp:mcp.tool.call.end返回成功结果 起始字段,以及 profile、outcome(ok)、ms、resultBytesservicenow-mcp:mcp.tool.call.error返回错误结果或抛出异常 起始字段,以及 profile、outcome(error/cancelled)、ms,以及code/resultBytes或errorNameservicenow-mcp:http.request.start逻辑请求开始 id、system、method、host、telemetryKey、url,以及调用中的profile/requestId/sessionId/tool/callId/traceparent/tracestateservicenow-mcp:http.request.end收到成功响应并完成 起始字段,以及 status、attempts、msservicenow-mcp:http.request.error请求失败 起始字段,以及 attempts、ms、status、code、errorName、errorMessageservicenow-mcp:http.request.retry重放一次尝试(退避、401 重新认证) id、system、method、host、url、attempt、reason、waitMsurl绝不包含查询字符串;绝不会发布标头、正文和凭据,并且errorMessage会遵循脱敏规则。绝不会发布工具参数和结果(只发布结果的字节数)。 HTTP 消息中的
callId是发起该请求的工具调用的id。traceparent/tracestate是客户端在调用的params._meta中发送的 W3C Trace Context;格式错误的值会被丢弃。 -
OpenTelemetry span。
SN_OTEL=1会通过@opentelemetry/api将这些通道映射为 span。它是可选的对等依赖(在服务旁边运行npm install @opentelemetry/api,并通过node --import注册你的 SDK 和导出器)。如果未安装此包,服务会记录一条警告并在不生成 span 的情况下运行;如果关闭SN_OTEL,则不会加载此包。- 每次工具调用都会生成一个名为
tools/call <tool>的SERVERspan;如果客户端发送了traceparent,此 span 会作为其子 span。属性包括:mcp.method.name、gen_ai.operation.name(execute_tool)、gen_ai.tool.name、jsonrpc.request.id、mcp.session.id、network.transport、error.type,以及servicenow_mcp.package/.profile/.outcome/.result.bytes。 - 每个出站请求都会生成一个以方法命名的
CLIENTspan,作为其工具 span 的子 span;属性包括:http.request.method、server.address、url.full(不含查询字符串)、http.response.status_code、http.request.resend_count、error.type,并且每次重放都会生成一个retry事件。 - MCP 和 GenAI 语义约定仍在开发中,因此这些名称是暂定的,可能会随规范变更。
SN_OTEL_PROPAGATE=1(默认关闭)还会在向 ServiceNow 实例发送的请求中加入traceparent/tracestate标头:如果启用了SN_OTEL,则使用 HTTP span 的上下文;否则,原样使用客户端的上下文。此功能需要显式启用,因为它会将 trace ID 发送给实例;OAuth 令牌端点不会收到这些信息。
- 每次工具调用都会生成一个名为
-
Prometheus。 使用 HTTP 传输时,设置
SN_METRICS=1和SN_HTTP_TOKEN后,GET /metrics(使用相同的 bearer token)会以 Prometheus 文本格式提供相同的指标(servicenow_mcp_*指标族,仅按tool/host标记)。未设置令牌时,该端点会保持关闭状态,并记录一条警告。
命令行界面
已发布的 servicenow-mcp-ai 二进制文件(直接运行或通过 npx servicenow-mcp-ai 运行)在未指定命令时会启动 MCP 服务;否则会运行下列命令之一并退出。连接设置来自环境变量 / env 文件(参见环境变量)。servicenow-mcp-ai --help 会列出所有内容;--version 会输出版本。未知命令或选项会将用法说明输出到 stderr,并以 2 退出——绝不会启动服务。
| 命令 | 选项 | 功能说明 | 退出代码 |
|---|---|---|---|
servicenow-mcp-ai | (none) | 启动 MCP 服务。传输方式(默认为 stdio,也可以是 http)由 SN_TRANSPORT 选择;进程会一直运行,直到收到 SIGINT/SIGTERM。stdout 是协议通道。 | 0 正常关闭 · 1 启动时发生致命错误 |
servicenow-mcp-ai init | --profile <name>、--skip-doctor | 交互式设置:询问实例、身份验证方式及其凭据(通过隐藏提示输入机密),写入环境文件,然后运行 doctor。 | doctor 的退出代码 · 使用 --skip-doctor 时为 0 · 拒绝 / 答案无效时为 2 |
servicenow-mcp-ai doctor | --json、--ascii、--profile <name> | 健康检查:检查凭据、实时连接情况和功能预检。第一行会指出所用的环境文件。 | 0 健康 · 1 状态降级或无法连接 · 2 尚未配置 |
servicenow-mcp-ai login | --profile <name> | 一次性 OAuth 2.1 Authorization Code + PKCE 登录:打开浏览器、捕获环回重定向,并存储刷新令牌。 | 0 成功 · 1 登录失败 |
servicenow-mcp-ai drift <profileA> <profileB> | (none) | DF-3 CI 漂移检查:比较两个实例并生成 Markdown 差异报告。 | 0 无漂移 · 1 发现漂移 · 2 用法错误 / 出错 |
servicenow-mcp-ai support-bundle | --out <file>、--profile <name> | 写入一个用于错误报告的 JSON 文件,并在 stdout 中输出其路径。 | 0 已写入 · 1 写入失败 |
servicenow-mcp-ai migrate | --write、--from <file>、--v3-defaults | 将 2.x 设置(环境文件、MCP 客户端 env 块)迁移到 3.x,并打印每项更改;除非使用 --write,否则仅执行试运行。 | 0 已完成或无需处理 · 1 拒绝 / 写入失败 |
init 使用与 servicenow_set_credentials 相同的原子写入器写入环境文件,该写入器仅允许文件所有者访问(0600)。文件路径由 doctor 指出(默认为
~/.config/servicenow-mcp-ai/.env)。它会依次询问:实例(dev12345
或完整主机名;自定义域名需要设置 SN_ALLOWED_HOSTS)、身份验证方式
(basic / oauth / apikey / token),然后询问该方式的设置——对于
oauth,还会询问授权类型(client_credentials、password 或 authorization_code;选择最后一种时会提示运行 login)。绝不会回显或记录机密;摘要中只会列出键名。使用 --profile qa 时,键会写入为
SN_PROFILE_QA_*。只有在输入 y 后,才会覆盖现有配置文件。可以按每行一个答案的方式通过管道传入答案,CI 和测试就是这样驱动此命令的:
printf 'dev12345\nbasic\nalice\n%s\n' "$SN_PASSWORD" | npx servicenow-mcp-ai init
如果没有终端且未通过管道传入答案,init 会拒绝执行(退出代码为 2),并且不会写入任何内容。
doctor 会打印纯 ASCII 文本(使用 [ok] / [x] 代替勾号):使用 --ascii 时、标准输出不是终端时,以及在 Windows Terminal 之外的 Windows 环境中。
--json 则会打印单个 JSON 文档,包含 envFile、status、summary、
checks[](name、ok、detail)、config、connection、capabilities 和
serverStatus(servicenow_get_status 的载荷)——例如
servicenow-mcp-ai doctor --json | jq .checks。退出代码相同。
support-bundle 会收集 doctor --json 载荷、所有 SN_* 设置(将机密内容遮蔽为 ***)、npm ls --omit=dev(尽力执行)、工具清单摘要(版本、工具和软件包数量、启用的工具),以及 SN_LOG_FILE 已设置时该文件末尾的 200 行。所有被遮蔽的值也会从整个文件中清除。默认路径为
./servicenow-mcp-ai-support-<timestamp>.json(模式为 0600)。实例名和用户名不会被遮蔽——将文件附加到问题报告前,请先检查文件内容。
migrate 会升级 2.x 安装的设置。它会读取服务解析到的 env 文件(或 --from <file>),但不会加载该文件;因此,即使 3.x 会拒绝该文件,迁移仍会继续,并保留所有键、值和注释,以下情况除外:
- 项目根目录中的
.env(已弃用,B5)或--from指定的文件会复制到~/.config/servicenow-mcp-ai/.env(或SN_ENV_FILE);原文件会保留; - 名为
capabilities、docs、policy、profiles、reference、schema或status的配置文件(保留名称,B13)会改名为<name>_v2,其所有SN_PROFILE_<NAME>_*键和SN_ACTIVE_PROFILE也会相应更新,其文档和写入日志文件夹<SN_DOCS_DIR>/<name>也会随之改名(相对路径的SN_DOCS_DIR会以运行migrate的目录为基准解析;如果<name>_v2文件夹已存在,则不会覆盖); - 3.x 在启动时会拒绝的值(B5)会被注释掉,因此会应用默认值,与 2.x 中的行为一致;
KEY: value行(2.x 解析器接受、3.x 跳过)会转换为KEY=value;- 除非文件已设置
SN_COMPAT=2或指定了--v3-defaults,否则会追加SN_COMPAT=2。
MCP 客户端 env 块中的设置会优先于 env 文件传递给服务,因此 migrate 还会在 Claude Desktop、Claude Code(~/.claude.json、.mcp.json)、Cursor、VS Code(用户级和 .vscode/mcp.json)以及 Windsurf 配置文件中查找此服务,并对设置了 SN_* 键的 env 块应用相同规则(无效值会被移除)。含有注释的文件会被报告,但不会被重写;VS Code 的 envFile 会列出名称,以便你对其运行 migrate --from。重写后请重启客户端。
使用 --write 时,每个被就地重写的文件都会先复制为 <file>.v2.bak(0600);env 文件的模式也会设为 0600,客户端文件则保留原有模式。升级后运行一次:
npx servicenow-mcp-ai migrate # review the plan
npx servicenow-mcp-ai migrate --write # apply it
login 会针对当前启用的配置文件(SN_ACTIVE_PROFILE,默认值为 default)运行,并读取该配置文件的以下设置:
SN_INSTANCE— 必需;目标实例。SN_OAUTH_CLIENT_ID— 必需;Authorization Code OAuth API 端点的客户端 ID。SN_OAUTH_CLIENT_SECRET— 可选;用于机密客户端。SN_OAUTH_REDIRECT_URI— 可选;环回 URL,默认值为http://localhost:53682/callback。必须与端点上注册的重定向 URI 匹配。SN_OAUTH_SCOPE— 可选;请求的 OAuth 范围。
成功后,会将 SN_AUTH=oauth、SN_OAUTH_GRANT=refresh_token 和
SN_OAUTH_REFRESH_TOKEN 写回 env 文件(当前配置文件不是 default 时,会使用带配置文件前缀的键)。如果浏览器未自动打开,授权 URL 会打印到 stderr。
drift 接受两个位置参数作为配置文件名称;每个名称都必须解析为已配置的配置文件(SN_PROFILE_<NAME>_*,或 default 对应的裸 SN_INSTANCE / SN_USER /
SN_PASSWORD 键)。Markdown 报告会写入标准输出(可将其保存为 CI 工件);一行式偏差摘要会写入 stderr。
CI 偏移门禁(DF-3)
比较两个已配置的配置档,在配置出现偏移时使流水线失败:
servicenow-mcp-ai drift dev prod # report on stdout; exit 1 on drift, 0 if clean, 2 on error
报告会将每个变更的脚本显示为 diff 块。CLI 会比较表、列、脚本、插件和应用;记录分区(servicenow_compare_instances 上的 sections)为可选项,因此退出码不会改变。
servicenow_snapshot_instance 会将相同内容写入文档文件夹,每个分区一个文件,每次最多处理四个分区。运行中断时,会在 index.json 中标记为 partial;使用 resume: true 重新运行,即可跳过文件未变更的所有分区。
开发
npm run check # full gate: build, lint, format check, coverage-gated tests, tarball guard, prod audit
npm test # unit tests only (node:test; needs a prior npm run build)
npm run lint # ESLint (flat config + typescript-eslint)
npm run format # format with Prettier
有关约定(每项任务提交一个 commit、随变更提交测试、生成文档),请参阅 CONTRIBUTING.md。
工具
完整参考文档涵盖每个参数、输出字段、各工具的写入方式以及错误码,位于 docs/tools/,每个软件包对应一个页面。docs/llms-full.txt 将本 README、SECURITY.md 和该参考文档合并到一个文件中,供大模型上下文使用。
tools/list 中的每个 inputSchema 和 outputSchema 都采用 JSON Schema 2020-12 编写,这是 MCP 的默认方言,且不包含 $schema 字段。服务不支持其他方言,也不会读取客户端提供的架构。
此表由工具注册信息生成——请编辑 src/tools/ 中的工具定义,然后运行 npm run docs:readme。每个工具名称都带有 servicenow_ 前缀,下文省略该前缀。
| 软件包 | 默认 discovery | 读取工具 | 写入工具 |
|---|---|---|---|
table | 是 | query_table, get_record | create_record, update_record, upsert_record, delete_record |
schema | 是 | list_tables, describe_table | — |
aggregate | 是 | aggregate | — |
attachment | 否 | list_attachments, get_attachment, download_attachment | upload_attachment, delete_attachment |
importset | 否 | get_import_set_row | insert_import_set_row |
batch | 否 | — | batch |
catalog | 否 | list_catalogs, list_catalog_categories, list_catalog_items, get_catalog_item | order_catalog_item |
change | 否 | list_changes, get_change | create_change, update_change, check_change_conflicts |
knowledge | 否 | search_knowledge, get_knowledge_article, get_knowledge_highlights | — |
cmdb | 否 | list_cis, get_ci, get_cmdb_meta, list_ci_relations | create_ci, update_ci, identify_reconcile |
scripts | 否 | list_scripts, get_script, search_code, describe_table_logic, where_used | — |
flows | 否 | trace_table_event, list_flows, get_flow, get_flow_runs, explain_flow | — |
codecheck | 否 | lint_script, lint_table | check_code_health |
docs | 否 | list_docs, read_doc, search_docs, generate_er_diagram, generate_table_flow | write_doc, document_table, document_app, document_instance |
instance | 否 | review_upgrade | snapshot_instance, compare_instances |
email | 否 | get_email | send_email |
atf | 否 | list_atf, get_atf_result | run_atf |
revert | 否 | list_writes | revert_write |
artifacts | 否 | list_artifacts, get_artifact, explain_artifact, get_artifact_dependencies | upsert_artifact |
updatesets | 否 | list_update_sets, get_update_set, compare_update_set | — |
cicd | 否 | — | commit_update_set |
access | 否 | — | change_access |
ops | 否 | read_ops, check_data_health | — |
history | 否 | get_record_history, get_task_context | — |
properties | 否 | get_properties | set_property |
directory | 否 | lookup_directory, explain_access | — |
ui | 否 | explain_portal, explain_ui_experience | — |
admin | 是 | list_instances, explain_policy, get_status, test_connection, check_capabilities, list_packages, find_tools | set_credentials, use_instance, enable_package, disable_package |
所有工具均带有 MCP 注解(readOnlyHint、destructiveHint、
idempotentHint),以便客户端应用恰当的确认交互体验。
工具名称(v3)
每个工具都采用 servicenow_<verb>_<noun> 命名。参数遵循一套统一词汇:sys_id 是记录 ID,table 是表名(CMDB 工具仍接受 class_name 作为已弃用的别名),fields 是要返回的列列表,values 是写入负载。3.0 版重命名了这些工具:
由 src/mcp/naming.ts 中的 TOOL_RENAMES 生成 — 更改后运行
npm run docs:readme。
| v2 名称 | v3 名称 | 原因 |
|---|---|---|
servicenow_artifact_dependencies | servicenow_get_artifact_dependencies | 缺少动词。 |
servicenow_change_conflicts | servicenow_check_change_conflicts | 缺少动词。 |
servicenow_code_health | servicenow_check_code_health | 缺少动词。 |
servicenow_data_health | servicenow_check_data_health | 缺少动词;与 check_code_health 保持一致。 |
servicenow_docs_list | servicenow_list_docs | 名词在动词前。 |
servicenow_docs_read | servicenow_read_doc | 名词在动词前。 |
servicenow_docs_search | servicenow_search_docs | 名词在动词前。 |
servicenow_docs_write | servicenow_write_doc | 名词在动词前。 |
servicenow_knowledge_highlights | servicenow_get_knowledge_highlights | 缺少动词。 |
servicenow_list_atf_suites | servicenow_list_atf | 与 list_atf_tests 合并(kind: suite)。 |
servicenow_list_atf_tests | servicenow_list_atf | 与 list_atf_suites 合并(kind: test)。 |
servicenow_ops_read | servicenow_read_ops | 名词在动词前。 |
servicenow_run_atf_suite | servicenow_run_atf | 与 run_atf_test 合并(kind: suite)。 |
servicenow_run_atf_test | servicenow_run_atf | 与 run_atf_suite 合并(kind: test)。 |
servicenow_table_logic | servicenow_describe_table_logic | 缺少动词。 |
2.x 客户端仍可正常工作:每个旧名称仍会通过 tools/call 响应,作为新工具隐藏且已弃用的别名,并接受旧参数名称,且不会占用 tools/list 名额。设置 SN_LEGACY_TOOL_NAMES=1,即可在一个次要版本发布周期内同时在 tools/list 中列出这些别名,并接受旧参数名称(attachment_sys_id、item_sys_id、
catalog_sys_id、test_sys_id、suite_sys_id、staging_table、作为写入负载的 fields、
attributes)。每次使用都会记录一条弃用警告。工具清单会列出重命名映射(toolRenames)以及每个工具接受的别名。
迁移期间若要保持所有 2.x 默认行为,请设置 SN_COMPAT=2:未设置的选项将按 2.x 的方式处理(受保护的表可写入、没有 plan token、允许未映射的批次行、列出旧名称、使用 core 软件包集)。显式设置仍优先生效。
工具包
工具按包分组,因此你可以只向特定客户端公开所需的工具
(工具越少,模型越专注)。将 SN_TOOL_PACKAGES 设置为以逗号或空格
分隔的配置文件或包名称列表:
discovery(默认)——table、schema、aggregate,以及始终启用的 管理工具;对于其他任何工具,servicenow_find_tools会指出其所属的包。core(2.x 默认配置)是在 discovery 的基础上加上attachment(B20)。all——以下所有包。- 单个包:
table、schema、aggregate、attachment、importset、batch、catalog、change、knowledge、cmdb、scripts、flows、codecheck、docs、instance、email、atf、revert、artifacts、updatesets、ops、history、properties、directory、ui。
管理工具(servicenow_set_credentials、servicenow_get_status、
servicenow_enable_package 以及管理包中的其他工具)始终会被注册,
无论当前启用了哪些包。未知名称会被忽略。
servicenow_get_status 会报告解析后的 enabledPackages。
# Only table + batch tools (plus the always-on admin tools)
SN_TOOL_PACKAGES=table,batch
预设
如果你不想自行整理列表,三个命名预设涵盖了常见角色。管理工具始终启用,因此不会列出。每个预设
还有一个单词别名——SN_TOOL_PACKAGES=reader|developer|admin——
会展开为相同的包集合。
| 预设 | SN_TOOL_PACKAGES=… | 适用对象 |
|---|---|---|
reader | table,schema,aggregate | 初次接触者、分析师、PDI 演练——仅供读取和查询。 |
developer | table,schema,aggregate,scripts,flows,codecheck,docs | 核心开发者:脚本智能分析、流程追踪、Lint 检查、文档和图表。 |
admin | all | 所有功能,包括插件和写入密集型包。 |
developer 预设以 reader 集合为基础;docs 包包含 Mermaid 图表生成器。可以使用别名以简化配置,也可以逐一列出包,以添加或移除某个包。
运行时切换包
客户端无需重启即可扩展或收缩可用功能:
servicenow_list_packages 会显示本次会话中每个包及其状态(已启用、已配置、已拒绝、只读、工具数量),而
servicenow_enable_package / servicenow_disable_package 可切换单个包。服务端会通过 notifications/tools/list_changed 通知变更(提示词和资源变更时也会发送相应通知),每次切换会为每个列表发送一条通知。
切换操作不会超出策略限制:SN_PACKAGES_DENY 中的包会被拒绝(PACKAGE_DENIED),SN_PACKAGES_READONLY 中的包只会启用其读取工具,管理工具则无法禁用。切换仅在当前会话中有效;HTTP 会话关闭后会恢复为 SN_TOOL_PACKAGES 的设置。除非客户端调用这些工具,否则不会发生任何变化。
服务端还会声明 resources.subscribe:在调用 servicenow_use_instance 或 servicenow_set_credentials 后,服务端会发送 notifications/resources/list_changed,并向订阅者发送 notifications/resources/updated,通知其 servicenow://status 资源已更新。
按键值插入或更新
servicenow_upsert_record({table, key, fields}) 会创建或更新一条由 key 匹配的记录;key 是一个或多个字段/值对的精确匹配(例如
{"u_external_id": "A-17"};空字符串匹配空字段)。没有匹配项时,会使用键和值字段创建记录;恰好有一条匹配项时,会更新该记录;如果有多条匹配项,则会拒绝操作并返回 AMBIGUOUS_KEY。如果用户无法读取匹配到的记录,也会拒绝操作,因为创建另一条记录会造成重复。
操作类型在计划中决定:如果没有 apply:true,工具会返回
create 或 update(包含 sys_id 和 before 值),以及
apply_with: {expected_action, expected_sys_id}。将这些值传回并设置
apply:true;如果此时键解析出的结果发生变化(记录出现、消失或换成了另一条记录),调用会失败并返回 STALE_RECORD,且不会写入任何内容。
已应用的写入会记录为创建或更新,因此
servicenow_revert_write 可以像撤销直接调用 create_record /
update_record 一样撤销它。
撤销写入(基于日志的还原)
每次已应用的写入都会记录在本地、采用哈希链的写入日志中
(<SN_DOCS_DIR>/<profile>/write-journal.jsonl)。选择启用的
revert 软件包可用该日志撤销写入:
servicenow_list_writes— 按时间从新到旧列出日志,并可按profile、table、since(ISO 日期/时间)、result和action筛选。每行包含条目id,以及该行是否单独满足还原条件(revertible+reason)。servicenow_revert_write—entry_id→ 通过 Table API 执行逆向写入:update 会将日志中记录的before值写回;create 会删除记录;delete 会根据其before记录重新创建记录(丢弃系统字段,并请求使用原始sys_id;结果会报告sys_id_preserved)。与所有写入工具一样,它遵循计划/应用流程:如果没有apply:true,它会返回逆向操作、记录当前状态和漂移检查结果,不会更改任何内容。
安全规则:
- 漂移检查。 将记录的
sys_mod_count与日志中记录的写入所留下的值(after_mod_count,或before.sys_mod_count + 1)进行比较;如果没有可用的计数,则改为比较已写入的字段值。如果记录之后发生了变化,或者无法进行比较,则会拒绝还原并返回STALE_RECORD;传入force:true可强制覆盖(还原对应的日志行会记录force: true)。 - 如果条目未知、日志链断裂、写入未处于
applied状态、该行没有before状态、before值已被脱敏(SN_REDACT_FIELDS/SN_REDACT_PII)、条目已还原,或其来源没有安全的逆向操作,则返回NOT_REVERTIBLE,并附带原因:附件上传/删除、send_email、导入集行、目录订单、Batch API 子请求、ATF 运行、CMDB 创建(IRE 可能匹配到了现有 CI)以及本地/配置条目。脱敏值绝不会以[redacted]的形式还原:整个条目都会被拒绝还原,不会部分还原——请手动恢复这些字段。 - 还原操作本身也会记入日志(
reverts: <entry_id>、tool: servicenow_revert_write),因此还原还原操作即可重做。策略与直接写入相同:适用SN_READONLY、表允许/拒绝列表,以及原始软件包和table的软件包维度。将revert加入SN_PACKAGES_READONLY,即可保留list_writes而不启用撤销功能。
更新集
可选启用的 updatesets 软件包用于读取更新集(这 3 个工具均为只读工具,并且与所有读取工具一样遵循表策略和脱敏规则):
servicenow_list_update_sets— 可选的state、name片段、application(范围命名空间、global或 sys_id)、query、limit/offset→ 按时间从新到旧列出更新集,并标记用户当前使用的更新集。servicenow_get_update_set—update_set(sys_id 或精确名称)→ 按项目列出该更新集的 客户更新(sys_update_xml):类型、目标名称、操作、表,以及by_type/by_action计数。除非设置include_payload: true,否则不返回有效载荷; 设置后会将有效载荷解析为字段值,每个字段的长度上限为payload_max_chars(默认为 500),看起来像机密的字段会被遮蔽。servicenow_compare_update_set—update_set加上with_profile(实时读取) 或with_snapshot(servicenow_snapshot_instance快照)→ 对每个项目返回same/different(仅列出不同的字段名称)/missing/not_comparable/not_covered/unknown。仅比较更新有效载荷中的字段; 忽略审计列。
写入:servicenow_create_record、servicenow_update_record、
servicenow_upsert_record 和 servicenow_delete_record 可接受可选的
update_set(sys_id 或精确名称;默认为 SN_UPDATE_SET)。计划预览会显示目标更新集;应用计划时会切换用户的
sys_update_set 首选项(如果是范围更新集,还会切换范围的 updateSetForScope<scope> 首选项),
执行写入,然后恢复先前的值 — 结果会报告 update_set: { bound, previous, restored },日志条目
会记录 update_set。如果更新集不是 in progress,则会拒绝操作
(UPDATE_SET_NOT_IN_PROGRESS);对于数据行表(不扩展 sys_metadata 且没有
update_synch 属性的任何表),写入时不会切换更新集,计划也会说明这一点。如果未提供此参数且未设置相关配置,则不会发生任何变化。其他写入工具(批处理、目录、变更……)不会绑定更新集。
运维和数据健康状况
可选启用的 ops 软件包包含两个只读工具,用于排查“实例运行缓慢”问题和数据质量问题。每个部分都会读取自己的表;如果表不可读取(ACL、表策略、表不存在),则会报告 available: false 和原因,而不是让调用失败,因此空白部分绝不会被视为健康。
-
servicenow_read_ops—kind:overview— 在一次调用中返回以下所有部分的计数。syslog— 最近minutes(默认为 60,最大为 1440)内、级别不低于level(默认为warning)的条目,可选source片段:按级别统计数量、列出主要来源和最新行(消息最长为 500 个字符)。jobs— 按状态统计调度器队列(sys_trigger)、已超过下次执行时间overdue_minutes分钟的就绪作业数量,以及带有领取节点信息的overdue(默认)、running或queued作业。email_queue— 出站sys_email:可发送积压邮件及其最早条目、时间窗口内按类型统计的数量,以及近期发送失败记录。semaphores— 按时间从新到旧列出sys_semaphore行。
行数受
limit限制(默认为 25,最大为 200)。 -
servicenow_check_data_health— 针对一个table的数据版servicenow_check_code_health,可选通过query指定范围(不允许^NQ/ORDERBY):按key_fields检查重复组(使用 Aggregate API 分组,计数 > 1,数量受limit限制);对每个引用字段(reference_fields,默认取前 10 个非系统字段)检查孤立引用(目标行不存在),以及 — 如果目标表有active列且stale不为false— 检查过期引用(目标行未激活),并为每项检查提供列出相关行的编码查询。字段名称会先通过数据字典进行检查。用户无权读取的目标行也会被计为孤立引用。
servicenow_why_is_it_slow 提示词会引导用户完成这些读取;如果提供了 table,还会介绍该表写入时运行的逻辑。
记录历史、属性和目录
有 3 个可选软件包可用于处理日常运维问题。每次读取都会像其他读取器一样遵循表策略并进行脱敏。
-
servicenow_get_record_history(history)——table+sys_id→ 来自sys_audit的字段变更,以及来自sys_journal_field的日志条目(评论、工作备注),合并后按时间从新到旧排列。可通过source(all/audit/journal)、fields、since(YYYY-MM-DD[ HH:MM:SS])、limit(默认值为 100)和value_max_chars(默认值为 2000)缩小范围。重复日志条目的审计行会被跳过。如果某个来源无法读取(ACL 或策略限制),会在sources下报告,但仍会返回另一个来源的结果。 -
servicenow_get_properties(properties)——精确的name或名称prefix→sys_properties行。密码类型或看起来像机密信息的属性会以[redacted]返回,过长的值会被截断。 -
servicenow_set_property(properties)——设置一个现有属性的值。它按计划/应用方式运行:计划会显示当前值和新值,应用操作会记录在日志中。servicenow_revert_write可撤销此操作,但不会明文记录机密属性。它遵循SN_READONLY和SN_PACKAGES_READONLY=properties。属性不存在时会返回PROPERTY_NOT_FOUND;该工具不会创建属性。 -
servicenow_lookup_directory(directory)——kind(user/group/role)以及搜索term或sys_id。启用include_details且匹配结果恰好为 1 条时,结果会增加以下内容:- 对于用户,显示其角色和群组;
- 对于群组,显示其成员和角色;
- 对于角色,显示其包含的角色以及授予该角色的群组。
无法读取的详情表会列在
details_unavailable中。将directory加入SN_PACKAGES_DENY可移除用户数据功能。
实例发现
servicenow_document_instance(docs)接受可选的 depth,用于在 README.md 旁添加发现文件夹 <SN_DOCS_DIR>/<profile>/discovery/。各级内容逐级累加:
depth | 文件 |
|---|---|
overview | overview.md — 版本、数量、自动化信息、写入的文件 |
apps | + apps.md 和每个作用域各一个 tables-<scope>.md(表及其字典) |
artefacts | + 每个作用域各一个 artifacts-<scope>.md |
作用域为指定的 apps,否则为每个非全局 sys_app 作用域,数量不超过每次运行的目标上限(其余会列为已跳过)。artifacts-<scope>.md 会列出每种工件类型,并包含 已收集 / 未收集及原因 一列:已收集(含数量)、达到上限、未经验证(此处无法读取该表)、无此表、当前用户无法读取、软件包已关闭,或此作用域中没有记录。每次读取都会像其他生成器一样遵循相同的策略、脱敏、能力预检和写入日志。未指定 depth 时,工具行为与之前相同。
插件技能
Claude Code 插件(/plugin install servicenow-mcp-ai)在 skills/ 下提供八项技能。每项技能都只负责协调此服务器的工具;没有任何一项会保存凭据或自行调用 ServiceNow。
| 技能 | 用途 |
|---|---|
sn-discover | 使用 servicenow_document_instance({depth}) 绘制实例或其自定义应用的图谱 |
sn-triage | 调查失败的记录、流或脚本(状态、历史记录、逻辑、日志) |
sn-impact | 评估对表、字段或脚本的更改会影响哪些内容(使用位置、表逻辑) |
sn-drift | 比较两个实例或已保存的快照,或审查更新集 |
sn-safe-write | 使用计划并应用、写入日志和还原路径来更改记录 |
sn-uib | 审查 UI Builder 页面:页面映射、更改影响范围、数据代理安全性、页面大小 |
sn-upgrade | 审查升级准备情况:未解决的跳过记录、基础版本与客户版本、应用商店应用更新 |
sn-security | 说明用户为何能够或无法访问某个表、记录或字段;审查 ACL、加固和跨范围访问 |
测试(test/plugin-skills.test.js)会检查技能中每个 servicenow_* 名称是否都存在于工具清单中。这些技能不属于 npm 包的一部分。
子 Agent
agents/ 下提供两个只读子 Agent。它们的 tools 允许列表仅包含此服务器的只读工具(readOnlyHint),因此都无法计划、应用、还原或切换实例;test/plugin-agents.test.js 会强制执行此限制。
| Agent | 用途 |
|---|---|
sn-investigator | 回答有关实例的问题(记录、表的自动化、某内容的使用位置、失败的流),并返回附有证据的简短报告,而非原始记录 |
sn-change-reviewer | 在计划预览或更新集应用之前进行审查——目标记录、表逻辑、使用位置、lint、策略、历史记录——并给出通过/暂缓的判定 |
变更审查 Agent 没有 servicenow_check_code_health(它会写入本地报告);当更改涉及 ACL 时,它会建议执行扫描。
钩子
hooks/hooks.json 注册了三个纯 Node 脚本(无依赖):
| 事件 | 脚本 | 功能 |
|---|---|---|
SessionStart | session-context.mjs | 将活动配置、其实例主机、写入模式(计划/应用、只读、被暂停的生产配置)、工具包和其他配置名称添加到会话中。它仅读取环境和本地 env 文件(SN_ENV_FILE 或 ~/.config/servicenow-mcp-ai/.env)——不会发起网络调用,也不会在输出中包含凭据;如果其中任一项缺失或无法读取,则不输出任何内容。客户端启动的服务器可能会看到不同的环境,因此 servicenow_get_status 仍是权威信息来源。 |
PreToolUse | require-plan-token.mjs | 拒绝不带 plan_token 的破坏性 apply:true(D-8)。 |
PostToolUse | truncation-hint.mjs | 当 ServiceNow 结果显示 truncated: true 时,添加一行,列出该工具支持的参数(fields、offset、limit、format: "file")。否则不做任何提示。 |
在其他 Agent 中使用这些技能
这八项技能是可移植的 Agent Skills:它们的
SKILL.md frontmatter 仅使用 name 和 description,并使用裸 MCP 名称
(servicenow_query_table)指称工具,因此任何配置了此服务的客户端都可以运行它们。将
skills/ 下的文件夹复制或创建符号链接到客户端会扫描的目录中:
| 客户端 | 项目级 | 个人级 |
|---|---|---|
| VS Code(GitHub Copilot) | .github/skills/、.agents/skills/ 或 .claude/skills/ | ~/.copilot/skills/、~/.agents/skills/ 或 ~/.claude/skills/ |
| OpenAI Codex | .agents/skills/(工作目录中,或直到存储库根目录的任一父目录中) | ~/.agents/skills/ |
| Cursor | .agents/skills/ 或 .cursor/skills/ | ~/.agents/skills/ 或 .cursor/skills/ |
.agents/skills/ 适用于以上三种客户端。例如,在克隆此
存储库后:
mkdir -p ~/.agents/skills
cp -R skills/sn-* ~/.agents/skills/ # or: ln -s "$PWD"/skills/sn-* ~/.agents/skills/
在 VS Code 中,扩展的 ServiceNow MCP: Add Agent Skills to Workspace 命令会将八项技能复制到上述某个项目文件夹中(如果目标位置已存在某项技能,它会先征求是否替换)。
子 Agent 和钩子是 Claude Code 的插件功能,无法移植。
Service Portal 树
servicenow_explain_portal(ui,选择启用)以树形结构说明 Service Portal(portal:
url_suffix 或 sys_id)或单个页面(page:页面 id 或 sys_id)。
树的层级为:页面 → 容器 → 行 → 列 → 小组件实例 → 小组件。实例的
widget_parameters 会映射到小组件的 option_schema,并且每个小组件都会列出其依赖项、
JS / CSS 引入文件、Angular 提供程序和模板。主题、菜单、页眉 / 页脚和路由映射也会包含在内。
嵌套行会递归到 depth(默认值为 3,最大值为 6),并读取前 5 个页面的布局。
format 可以是 json、markdown、mermaid(布局树)或 file。无法读取的
Service Portal 表会作为注意事项报告,而不会导致失败。
UI Builder 体验地图
servicenow_explain_ui_experience(ui,选择启用)会将 UI Builder 体验或工作区(sys_ux_page_registry 的 sys_id 或 path)说明为页面地图。它会读取页面属性、应用配置、路由、屏幕(及其适用性)和每个屏幕的宏组件。它通过 uib-composition 解码器解析宏组件的构成、数据资源、客户端状态和事件连接,并列出其客户端脚本以及转换 / 脚本片段数据代理,各自附带对应的 ux_data_broker ACL。它还涵盖工作区着陆页、仪表板、列表菜单(类别、列表、适用性)和表单操作布局。读取范围有限,调用会报告进度,也可以取消。format 可以是 json、markdown、mermaid(页面地图)或 file。所有 UI Builder 表名和字段名,以及所有宏组件 JSON 结构,在实时实例上检查之前均未经验证(U),因此结果会带有 verified: false。无法读取的表会作为注意事项报告,而不会导致失败。
cmdb 包还提供 servicenow_list_ci_relations(CI 的 cmdb_rel_ci 关系,支持两个方向,并包含相关 CI 的名称和类别)和 servicenow_identify_reconcile,后者会发送包含项目和关系的 IRE 负载。在计划模式下,servicenow_identify_reconcile 会调用仅识别端点,并显示 IRE 会匹配哪些内容;如果缺少该端点,计划会标记为 degraded。应用操作会记录在日志中,但无法撤销,因为 IRE 会逐项决定处理方式。
servicenow_run_atf(单个测试,或 kind: "suite" 的测试套件)接受 wait_seconds(0–300)。该工具会轮询 CI/CD 进度端点并发送进度通知,取消请求会停止等待。如果到达等待时限时运行仍在进行中,则会返回 wait.state: "running",并提供一个用于 servicenow_get_atf_result 的 tracker。
servicenow_insert_import_set_row 还会返回 import_set_run(该导入集的 sys_import_set_run 行)和 transform_maps(临时表的映射,其中标出此行使用的映射,标记为 used: true)。如果任一后续读取失败,工具会返回 warnings,而不是错误。
通用工件读取
选择启用的 artifacts 包可读取工件注册表中的任意类型(servicenow://artifact-types 资源会列出这些类型及其表、键字段和子表):
servicenow_list_artifacts—artifactType,以及可选的scope(命名空间或 sys_id)、active、query和limit→ 摘要:sys_id、名称、自然键、范围、活动标志、是否由 SDK 管理的判定结果,以及该类型的元数据。不包含脚本正文。servicenow_get_artifact—artifactType,以及sys_id或自然key→ 完整记录、按注册表顺序排列的子记录(UI 策略的操作;门户页面的容器、行、列和小组件实例;流程的操作实例)、其范围,以及该范围是否由 SDK 管理。servicenow_explain_artifact— 相同的标识参数 → 结构化说明:一行summary、运行时机when(已设置的触发器字段)、非空的fields、作为精简items列出的子记录、其引用的记录references,以及解码后的 JSON 字段decoded(小组件参数、UI Builder 属性和数据、流程标签缓存)。无法解码的值会以原始内容返回,并带有decoded: false和reason— 单个字段出错不会导致调用失败。长值会按SN_MAX_RESULT_CHARS限制(单个值最多占其二十分之一,整份说明最多占五分之四);truncatedFields、truncated/preview和子项的omitted计数会说明哪些内容被截断。流程操作值和 UI Builder 组合在专用解码器发布前,会使用普通 JSON 解码器读取(via: "json")。 部分类型还会提供包含说明文字lines的explanation:状态模型会列出其状态和带条件的from -> to转换;选项集或表格会按顺序列出每个元素的选项;UI 策略或数据策略会说明条件成立时对每个字段的影响(如果启用了反向条件,也会说明条件不成立时的影响)。servicenow_get_artifact_dependencies— 相同的标识参数,以及direction(outbound/inbound/both,默认值)、depth(1–3,默认值为 1)、limit(每个入站来源 1–100 行)和format(json或mermaid)→ 依赖关系图,包含nodes和edges(from依赖to,并带有via和field)。出站边来自记录及其子记录中的注册表引用字段、已解码的 JSON(流程步骤值、小组件选项、UI Builder 数据)和脚本文本(脚本包含调用、GlideAjax类、字面值GlideRecord表)。入站边来自反向引用查询;对于脚本包含,还包括脚本调用者、值调用它的流程步骤,以及 where-used 图的结构化扫描。遍历每个节点仅一次(可安全处理循环),达到 150 个节点时停止(truncated),并将无法读取的来源转换为unavailable条目,而非报错。
每次表读取都遵守 SN_TABLES_ALLOW / SN_TABLES_DENY;被拒绝的子表会以 redacted: true 返回,而不会导致读取失败;SN_REDACT_FIELDS / SN_REDACT_PII 也会像其他情况一样生效。尚未在实时实例上确认其表的类型会带有 verified: false 和 caveat;如果实例拒绝此类表,结果将为空,并提供 degraded 原因而非报错;如果 sys_db_object 显示该实例上不存在此表,还会包含 available: false。
Artifact 写入
servicenow_upsert_artifact({artifactType, key, fields, children?}) 将一条主记录及其子记录作为一个整体进行规划(每条记录对应 S-8 create / update / noop),然后先应用父记录,再应用子记录;所有记录都使用同一个 artifact_write id 记录日志,因此 servicenow_revert_write 可以撤销每一行。H-11 表策略、P-22 SDK 防护和 H-3 计划令牌适用于计划中的每条记录。
- 嵌套子记录。 从属于另一条子记录的子记录通过
parent按位置指定父记录(即children中更早的索引):例如门户页面的sp_container→sp_row→sp_column→sp_instance树、目录变量的question_choice行、目录 UI 策略的操作。子记录键可以是{sys_id},因此servicenow_get_artifact的结果可以原样往返。parent错误或缺失时会返回CHILD_PARENT_INVALID。 - SDK 预检。 门户小组件、页面、模板、依赖项、提供程序、页眉 / 页脚和门户,以及目录项、记录生成器、变量、变量集和类别,都会在计划阶段按照 ServiceNow SDK 的方式进行检查:
sp_widget.id(涵盖所有扩展该表的表)、sp_page.id、sp_portal.url_suffix、sp_dependency名称 / 模块以及sp_ng_template.id在实例中及计划内都必须唯一(DUPLICATE_UNIQUE_FIELD,409);目录变量名称必须是有效标识符(PREFLIGHT_INVALID);在 id 缺少<scope>_前缀的范围应用中创建记录时,会发出SCOPE_PREFIX警告。 - 流。 对现有流,
flow只接受{active};任何其他字段、子记录或创建操作都会触发FLOW_ACTIVE_ONLY。O-5 前未经验证:尚未在实时实例上确认通过 Table API 切换active会保持master_snapshot不变,并且每个流计划都会带有UNVERIFIED警告。
门户和目录写入字段在 O-5 前均未经验证(注册表中为 verified: false)。
示例
查询最近 5 条处于活动状态的事件:
// servicenow_query_table
{
"table": "incident",
"query": "active=true^ORDERBYDESCsys_created_on",
"fields": ["number", "short_description", "priority", "state"],
"limit": 5,
}
创建事件:
// servicenow_create_record
{
"table": "incident",
"values": {
"short_description": "Printer on 3rd floor is down",
"urgency": "2",
"impact": "2",
},
}
在运行时更新凭据:
// servicenow_set_credentials
{
"instance": "dev98765.service-now.com",
"user": "admin",
"password": "••••••",
}
资源
只读元数据也会作为 MCP 资源公开,因此客户端可以通过声明式方式附加这些元数据,而无需调用工具:
| URI | 描述 |
|---|---|
servicenow://status | 连接状态、身份验证模式、访问策略(绝不包含密码)。 |
servicenow://capabilities | 能力预检:已连接用户实际能够执行哪些受管理员限制的 sys_* 读取操作(架构、脚本智能分析、ACL 审计),以及各组能力矩阵。 |
servicenow://tables | sys_db_object 中的表列表。 |
servicenow://schema/{table} | sys_dictionary 中某个表的列(绑定到当前配置)。 |
servicenow://instances | 已配置的连接配置:名称、主机、用户、只读标记、凭据完整性。 |
servicenow://profiles/{profile}/schema/{table} | 通过指定名称的连接配置读取的表列。v2 URI servicenow://{profile}/schema/{table} 在下一个次要版本发布前仍可使用(已弃用)。 |
servicenow://docs/{+path} | 本地文档存储中的 Markdown 文档(允许嵌套路径),包装在不可信内容块中。 |
servicenow://exports/{+path} | format: "file" 结果写入的文件(.json、.jsonl、.csv、.mmd),包装在不可信内容块中。不会列出;当 docs 包未启用时,文件交付的 resource_link 会指向此处。 |
servicenow://artifact-types | 通用制品工具接受的制品类型:表、名称 / 键 / 作用域字段、子表、SDK API、已验证标记(artifacts 包)。 |
servicenow://reference/encoded-query | 编码查询参考:语法、javascript: 值、限制(不支持 ^ 转义、URL 长度、被静默忽略的字段、ACL 隐藏的行),以及 fetchAll 的分页方式。 |
servicenow://reference/tools | Markdown 格式的工具清单:按包列出的所有工具、读 / 写属性,以及此会话是否根据包策略注册了相应工具。 |
servicenow://reference/tools/{name} | 单个工具的完整信息:描述、注释、已发布的输入和输出架构、调用示例、所属包和注册状态。 |
servicenow://profiles/{profile}/records/{table}/{sys_id} | 通过指定名称的配置读取的一条记录,按 servicenow_get_record 的方式屏蔽敏感信息。订阅后,记录发生变化时会收到 notifications/resources/updated 通知(每隔 SN_RECORD_WATCH_INTERVAL_MS 轮询一次,最低 30 s;每个会话和进程均设有上限)。 |
资源与工具一样受包控制:status、capabilities 和工具参考始终启用;encoded-query 和记录模板随 table 包提供,tables/schema 随 schema 包提供,instances/每个配置对应的 schema 随 instance 包提供,docs 随 docs 包提供。除非拒绝启用 docs(SN_PACKAGES_DENY=docs),否则 exports 会启用。
三个模板都支持补全和列出:{table} 从架构缓存中已有的表以及一小组常见表种子列表补全,{profile} 从已配置的连接配置中补全,{path} 根据前缀从 docs 清单(index.json)中补全,并限定在当前配置的文件夹内。resources/list 会显示缓存的表和文档(生成的文档优先,标题取自清单;每个模板最多 100 个,docs 的 index.md 始终列在最后)。列出和补全操作绝不会调用实例。
提示词
现成的工作流以 MCP 提示词的形式提供;它们会编排工具,并要求从实例中读取真实值。table 和 profile 参数的自动补全方式与资源模板相同。参数(最多 200 个字符)会以不可信内容块的形式传给模型,每个提示词都会告诉模型,将实例数据视为数据,而非指令。只有在其工具所属的软件包已启用时,提示词才会列出(分类:table;变更影响:change 或 table;文档表:docs 和 scripts;为何速度慢:ops;安全态势:codecheck;UIB 页面审查:ui;安全写入:table;漂移审查:instance;架构影响:scripts;发现实例:docs;实例概览仅使用管理工具,始终列出)。安全写入、漂移审查、架构影响和发现实例提示词分别对应插件技能 sn-safe-write、sn-drift、sn-impact 和 sn-discover(分类、UIB 审查、升级审查和安全态势分别对应 sn-triage、sn-uib、sn-upgrade 和 sn-security)。该列表会实时响应 servicenow_enable_package / servicenow_disable_package,并通过 notifications/prompts/list_changed 更新:
| 提示词 | 参数 | 用途 |
|---|---|---|
servicenow_incident_triage | incident | 总结、评估优先级、分类并建议后续步骤。 |
servicenow_change_impact_analysis | change | 受影响的 CI、日程冲突以及是否继续的判断。 |
servicenow_document_table | table, profile | 运行 servicenow_document_table,然后填写 <profile>/tables/<table>.md 中的手动 Purpose 区块;附加编码查询参考。 |
servicenow_why_is_it_slow | symptom, table (both optional) | 系统日志、调度器积压、邮件队列和信号量(ops),然后检查表上的逻辑 → 按优先级排列的原因。 |
servicenow_uib_page_review | experience, page (optional) | 说明 UI Builder 体验(ui),然后说明变更会影响哪些内容(依赖项、使用位置)、数据代理安全性和页面体量;未启用相应 package 的步骤会跳过。 |
servicenow_instance_overview | goal (optional) | 能力矩阵(servicenow_check_capabilities)、状态和会话的 package;注意事项依据 profile 的环境标记(SN_ENV / SN_PROFILE_<NAME>_ENV);未标记的 profile 将视为生产环境。 |
servicenow_security_posture | scope, profile (both optional) | ACL 扫描和加固合规性(check_code_health)、实例的 security 文档,然后检查一个应用的跨范围访问(文档使用 docs package)。 |
servicenow_safe_write | change, table (optional) | 先检查写入模式,然后按读取 → 规划 → 获批后应用 → 验证 → 回滚路径执行。应用模式(SN_WRITE_MODE=apply)下没有预览,因此模型必须在每次写入调用前询问用户;生产环境 profile 会添加注意事项。 |
servicenow_drift_review | a, b, update_set (last two optional) | 为参考 profile 创建快照,比较两个 profile(或一个 profile 与其快照),审查更新集,然后深入检查差异;优先检查与安全相关的漂移。 |
servicenow_upgrade_review | upgrade (optional) | 升级历史、升级中未解决的跳过记录、某条跳过记录的基准版本与客户版本、有更新的 Store 应用(instance),然后读取 upgrade 文档(docs)。 |
servicenow_schema_impact | kind (table / field / script), name | 使用位置(结构和文本)、表上的逻辑和事件、可选的 ER 图 → 依赖项和风险判断。 |
servicenow_discover_instance | depth (overview / apps / artefacts), profile (both optional) | 按指定深度运行 servicenow_document_instance,读取结果并总结数量、范围和注意事项。 |
项目结构
.
├── .env # credentials (git-ignored; or ~/.config/servicenow-mcp-ai/.env)
├── .env.example # template
├── .github/workflows/ # CI matrix, CodeQL, npm / MCP Registry / Marketplace publishing
├── .vscode/mcp.json # VS Code MCP server registration
├── bin/ # CLI launcher (servicenow-mcp-ai.cjs, incl. the doctor command)
├── extension/ # VS Code extension (thin wrapper that registers the server)
├── docs/ # GitHub Pages site
├── scripts/ # generators + guards (README tools table, tool manifest, coverage guard)
├── src/
│ ├── index.ts # bootstrap: load env, register, connect transport
│ ├── core/ # HTTP client (auth, retry, SSRF guard), OAuth/JWT/mTLS, policy,
│ │ # settings, logging, config store, write journal, request
│ │ # context (profiles)
│ ├── api/ # one module per REST area: table, aggregate, attachment,
│ │ # importset, batch, catalog, change, knowledge, cmdb, scripts,
│ │ # flows, codecheck, atf, email, docs, diagrams, meta, doctor,
│ │ # history, properties, directory, portal…
│ ├── mcp/ # MCP surface: package registry/manifest, tool definition,
│ │ # resources, prompts, result envelopes, redaction, write mode
│ │ # (plan/apply), CSV export, stdio + HTTP transports
│ └── tools/ # tool registrations, one file per package (28 packages)
├── test/ # node:test suite (406 tests): unit, mock-fetch api, MCP smoke, doc guards
└── build/ # compiled output (after npm run build)
名称说明: npm 包和 GitHub 仓库都叫
servicenow-mcp-ai( npm 上不带作用域的servicenow-mcp已被占用);本地工作目录 名为servicenow-mcp。这一区别仅为表面差异,不影响构建 或运行时。
安全说明
- 环境文件已加入 Git 忽略规则——切勿提交真实凭据。
- 环境文件仅允许所有者访问(
0600)——其中存有明文密码。 - 服务使用 stdio 传输,且只向
stderr写入日志;不会记录密钥或原始编码查询。 - 任何工具都不会返回密码或令牌。
- 密钥列始终会被掩码处理。 字典类型为
password、password2或glide_encrypted(列级加密)的列,在所有返回记录的工具(query_table、get_record、批处理、比较、导出等)中都会显示为[redacted],且绝不会存入写入日志,无论SN_REDACT_FIELDS设置为何值。每个配置文件的类型只会从sys_dictionary读取一次,并像其他架构信息一样缓存(SN_SCHEMA_CACHE_TTL_SEC);如果无法读取字典,则改用一份 OOTB 密钥列名称列表(password、user_password、client_secret等),读取操作仍会继续。无法关闭此掩码处理。 - 主机受到限制:未设置
SN_ALLOWED_HOSTS时,只会连接*.service-now.com实例(除非允许列表中的条目明确指定该主机,否则会阻止内部主机和环回地址),因此拼错主机名不会导致凭据被悄然发送。不会跟随重定向(REDIRECT_BLOCKED),响应正文大小上限为SN_MAX_BODY_BYTES。设置SN_ALLOWED_HOSTS可选择使用自定义域名或主权云域名。只有当允许列表中的条目明确指定该主机时,实例值中才允许使用显式的非 443 端口或 IPv6 字面地址(host:8443、[2001:db8::1])。 - 每个请求(包括 OAuth 令牌请求)都会携带标识用的
User-Agent: servicenow-mcp-ai/<version> (node/<major>; <transport>; <client>),以便实例的事务日志归属该流量;可通过SN_USER_AGENT_SUFFIX扩展此值。每个请求都会使用代理 URL(SN_HTTPS_PROXY、HTTPS_PROXY),但绝不会记录代理凭据。 - 在可行时,优先使用 OAuth 2.0,而非 Basic(
SN_OAUTH_CLIENT_ID)。 - 对只读部署,请使用
SN_TABLES_ALLOW/SN_TABLES_DENY和SN_READONLY=true落实最小权限原则。 - 表策略不适用于插件 API。
SN_TABLES_DENY=change_request会阻止 Table API 路径,但 Change Management API(sn_chg_rest)仍可读取或写入变更。若要限制由插件提供的接口,可使用SN_PACKAGES_DENY(移除整个包)或SN_PACKAGES_READONLY(仅注册其读取工具)。Batch API 同样遵循这两类策略:会拒绝发往被拒绝包路径的子请求,并阻止对只读包的写入——无法通过批处理绕过包策略。
项目文档
| 文档 | 内容 |
|---|---|
| ARCHITECTURE.md | 分层架构、Mermaid 图(模块、请求生命周期、安全模型、身份验证、软件包)、精简版 ADR |
| PRODUCT-STATE.md | 当前产品状态:API 覆盖图、质量状态、历史时间线、路线图 |
| ROADMAP.md | 后续计划:已发布阶段、2.x 加固路线、拟议的 3.0 里程碑、可选和推迟的事项 |
| ROADMAP-V3.md / DEEP-REVIEW-2026-09.md | 拟议的 v3.0 执行跟踪表(正确性、治理、大规模应用)/其条目所依据的五维审查 |
| GAP-ANALYSIS-2026-09.md | 2026-09-09 对 v3.0 计划的第二轮审查:九个更细分的维度、67 项发现,每项均包含设计、验收标准和测试,并映射到跟踪表条目 |
| INSTANCE-DOCS-ANALYSIS-2026-09.md | 2026-09-23 对实例文档的审查:文档存储、Mermaid 生成器、document_table 提示词和缺失的文档类型 — 共 17 项发现,每项均包含设计、验收标准和测试,并映射到 S-14 … S-16 |
| INSTANCE-DOCS-ANALYSIS-2026-09-25.md | 2026-09-25 对实例文档的第二轮审查:文档存储、制品注册表、制品读取器和安全扫描上线后,对首批 17 项发现的处理结果,以及 12 项新发现(ID-18 … ID-29),每项均包含设计、验收标准和测试,并映射到 S-15、S-16、M-4、M-8、S-7、E-6、E-7 |
| COMPETITIVE-ANALYSIS.md | 与官方 ServiceNow MCP Server Console 的定位对比:比较、结构性差距、第 9 阶段的提升计划和平台风险 |
| IMPLEMENTATION-PLAN.md | 后续阶段的详细规格(测试框架 2.0、多实例、流程测试) |
| DONE.md / TODO.md | 已完成的工作及提交引用 / 待决事项 |
| WORKLOG.md / CHANGELOG.md | 详细工作日志 / 面向用户的变更日志 |
| CONTRIBUTING.md / SECURITY.md | 开发环境设置、门禁和约定 / 安全模型和问题报告 |
支持
这个项目由我利用业余时间构建和维护。如果它为你或你的团队节省了时间, 请考虑支持项目持续开发 — 赞助资金将直接用于开发新工具、修复 bug,以及跟上 ServiceNow REST 接口的变化。
- GitHub Sponsors — 一次性或 定期赞助,平台不收取费用(首选方式)。
- Ko-fi — 快速的一次性支持;它也 支持 PayPal,因此没有 GitHub 账户的用户可以选择此方式。
- 捐赠(Donatree) — 无需账户的捐赠 页面(支持银行卡、PayPal 等),可用于一次性打赏。
商标
servicenow-mcp-ai 是一个独立的社区项目。它与 ServiceNow, Inc. 无关联,也未获得其认可或赞助。
“ServiceNow”、ServiceNow 徽标、“Now”及相关标志均为 ServiceNow, Inc. 在美国及其他国家/地区的商标或注册商标。它们仅以指称性用途用于本项目的名称和文档中,以标识本软件可互操作的平台,并不表示存在任何关联或认可。所有其他产品名称和标志均为其各自所有者的财产。
Copyright (C) 2026 Ivan Baev。本项目根据GNU GPL v3.0 or later授权;该许可证适用于源代码,不授予使用 ServiceNow 商标的任何权利。3.0.0-beta.1 及之前的版本均根据 MIT License 发布。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。