mcpField
S
servicenow-mcp-ai

servicenow-mcp-ai

本地服务
github.com/IvanBBaev商业与营销91 天前更新

关于 servicenow-mcp-ai

servicenow-mcp-ai 通过 ServiceNow REST API,让 MCP 客户端查询和操作 ServiceNow 实例,适用于配置管理、流程分析和运维场景。它还提供脚本分析、流程追踪、环境差异检查及可配置的写入保护。

主要功能

  1. 01表、聚合和附件 API 操作
  2. 02CMDB、服务目录与变更管理
  3. 03脚本搜索和字段引用分析
  4. 04自动化流程追踪与代码检查
  5. 05环境差异报告和写入回滚
  6. 06认证、访问控制与工具分组

适用场景

  1. 01追踪记录更新触发的规则和流程
  2. 02比较开发与生产环境的配置差异
  3. 03检查脚本中字段的使用位置
  4. 04安全地预览或撤销记录写入

MCP 相关

MCP 服务向客户端提供 ServiceNow REST API 操作、脚本与流程分析等工具,并包含资源和提示词。工具包可按需配置;写入操作可先返回预览。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"ivanbbaev-servicenow-mcp-ai": {
"command": "npx",
"args": [
"-y",
"servicenow-mcp-ai"
],
"env": {
"SN_INSTANCE": "<SN_INSTANCE>",
"SN_USER": "<SN_USER>",
"SN_PASSWORD": "<SN_PASSWORD>",
"SN_AUTH": "<SN_AUTH>",
"SN_API_KEY": "<SN_API_KEY>",
"SN_TOOL_PACKAGES": "<SN_TOOL_PACKAGES>"
}
}
}
}
启动命令npx -y servicenow-mcp-ai
需要配置的环境变量
SN_INSTANCEServiceNow instance host, e.g. dev12345.service-now.com.
SN_USERUsername for basic auth or the OAuth password grant.
SN_PASSWORD密钥Password for basic auth or the OAuth password grant.
SN_AUTH密钥Auth mode: basic | oauth | apikey | token | none. Auto-detected from the keys present if omitted.
SN_API_KEY密钥ServiceNow API key, sent as the x-sn-apikey header (apikey auth).
SN_TOOL_PACKAGESWhich tool packages to expose, e.g. discovery (default), all, or a comma-separated list.

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmservicenow-mcp-ai3.0.0

工具

19

收录的工具列表 · 更新于 1 周前

参数类型必填说明
limitinteger否要返回的最大记录数(默认 10)。
querystring否编码查询(sysparm_query),例如 'active=true^priority=1^ORDERBYDESCsys_created_on'。
tablestring是表名称,例如 'incident'、'sys_user'、'change_request'。
fieldsarray否要返回的列。省略此项则返回所有列。
formatenum否输出格式:'json'(默认),或 'csv'(适合电子表格的导出格式)。json | csv
offsetinteger否要跳过的记录数,用于分页。
fetchAllboolean否为 true 时,分页获取所有匹配记录(最多达到服务器的 SN_MAX_RECORDS 上限),而不是仅获取单页。
instancestring否用于此次调用的连接配置(默认:当前活动配置)。请参阅 servicenow_list_instances。
displayValueenum否返回显示值('true')、原始值('false',默认)或两者('all')。true | false | all

详细介绍

原文在翻译后有更新,译文可能不是最新。

servicenow-mcp-ai — ServiceNow MCP 服务

npm versionnpm downloadsnodetoolsLicense: GPL-3.0
CIcoveragelast commitMCPKnown Vulnerabilities

📖 文档网站 →

这是一个 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 中安装 在 VS Code Insiders 中安装 在 Cursor 中安装

客户端一行命令配置文件
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 Codeclaude 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 CLIcodex 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。

验证设置

设置好这三个变量后,请在开始前确认连接:

  1. 运行 servicenow_test_connection 工具——它会读取一条 sys_user 记录,并报告 ok、HTTP 状态和延迟。
  2. 运行 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_token grant 仍支持服务帐户。请参阅 .env.example。

支持的身份验证方法

ServiceNow 提供的所有入站 REST 身份验证方法均已涵盖:

方法SN_AUTH设置备注
BasicbasicSN_USER / SN_PASSWORD默认值。
OAuth 2.1 — Authorization Code + PKCEoauthnpx servicenow-mcp-ai login推荐。 交互式登录,并存储 refresh token。
OAuth — Client CredentialsoauthSN_OAUTH_GRANT=client_credentials服务到服务。
OAuth — Refresh TokenoauthSN_OAUTH_GRANT=refresh_token + SN_OAUTH_REFRESH_TOKEN由 login 设置。
OAuth — JWT BeareroauthSN_OAUTH_GRANT=jwt_bearer + SN_OAUTH_JWT_KEYRS256 断言;无需密码。
OAuth — Password(ROPC)oauthSN_OAUTH_GRANT=password已弃用。
API KeyapikeySN_API_KEYx-sn-apikey 请求头。
Bearer tokentokenSN_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.0ServiceNow 密码。任何工具都不会记录或返回此密码。
SN_AUTH否auto1.1.0身份验证方法:basic、oauth、apikey、token 或 none(仅证书 mTLS)。根据现有密钥自动检测(API 密钥 → bearer 令牌 → OAuth → Basic)。
SN_API_KEY否—1.1.0ServiceNow 入站 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否—nextbearer 令牌的 ISO 8601 到期时间。剩余时间少于 24 小时、令牌已过期或无法解析时,get_status / doctor 会发出警告。
SN_OAUTH_CLIENT_ID否—1.1.0OAuth 客户端 ID(设置后启用 OAuth)。
SN_OAUTH_CLIENT_SECRET否—1.1.0OAuth 客户端密钥。
SN_OAUTH_GRANT否password1.1.0OAuth 授权类型: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/callback1.1.0PKCE login 流程的环回重定向 URL。必须与 OAuth 端点上注册的重定向地址一致。
SN_OAUTH_SCOPE否—1.1.0login 期间请求的可选 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 id1.1.0JWT bearer 断言的 iss 声明。
SN_OAUTH_JWT_SUB否SN_USER1.1.0JWT bearer 断言的 sub 声明(用户)。
SN_OAUTH_JWT_AUD否https://<host>/oauth_token.do1.1.0JWT bearer 断言的 aud 声明。
SN_OAUTH_JWT_KID否—1.1.0JWT bearer 断言的 kid 标头(提供方要求时)。
SN_OAUTH_JWT_EXP_SEC否3001.1.0JWT bearer 断言的有效期(秒)。
SN_ALLOW_UNCONFIRMED_CREDENTIAL_CHANGE否falsenextH-2:操作员选择退出 — 允许 servicenow_set_credentials 在不支持 elicitation 的 MCP 客户端上继续执行(不显示确认提示,也不连接实时服务)。仍会拒绝明确拒绝的操作。默认关闭。
文件中的机密

容器机密(D-5):<KEY>_FILE=/path 会在启动时从该文件加载 <KEY>(去掉一个末尾换行符)。同时设置 <KEY> 和 <KEY>_FILE 会导致启动错误;文件不可读或为空也会导致启动错误。以这种方式加载的值不会写回环境文件。每个配置文件的 ServiceNow 机密:SN_PROFILE_<NAME>_<KEY>_FILE。

变量必填默认值起始版本描述
SN_PASSWORD_FILE否—nextD-5:从此文件读取 SN_PASSWORD(Docker / Kubernetes 机密)。
SN_API_KEY_FILE否—nextD-5:从此文件读取 SN_API_KEY(Docker / Kubernetes 机密)。
SN_BEARER_TOKEN_FILE否—nextD-5:从此文件读取 SN_BEARER_TOKEN(Docker / Kubernetes 机密)。启动时读取一次(SN_TOKEN_FILE 在收到 401 时会重新读取,且优先级仍更高)。
SN_OAUTH_CLIENT_SECRET_FILE否—nextD-5:从此文件读取 SN_OAUTH_CLIENT_SECRET(Docker / Kubernetes 机密)。
SN_OAUTH_REFRESH_TOKEN_FILE否—nextD-5:从此文件读取 SN_OAUTH_REFRESH_TOKEN(Docker / Kubernetes 机密)。刷新后的令牌仅保留在内存中(请自行更新文件)。
SN_HTTP_TOKEN_FILE否—nextD-5:从此文件读取 SN_HTTP_TOKEN(Docker / Kubernetes 机密)。
SN_HTTP_OAUTH_INTROSPECTION_SECRET_FILE否—nextD-5:从此文件读取 SN_HTTP_OAUTH_INTROSPECTION_SECRET(Docker / Kubernetes 机密)。
SN_HTTP_OAUTH_TOKEN_KEY_FILE否—nextD-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否default1.1.0工具使用的配置文件。可在运行时通过 servicenow_use_instance 切换(只有设置 persist: true 时才会写入环境文件)。
SN_ENV_FILE否~/.config/servicenow-mcp-ai/.env1.1.0要读取/写入的环境文件的显式路径。否则,服务会使用 $XDG_CONFIG_HOME/servicenow-mcp-ai/.env(~/.config/…)。如果两者均未生效,仍会读取已安装软件包旁项目根目录中的 .env,作为已弃用的回退方式(B5),并在启动时警告并指出应将其移至何处。doctor 会打印所选文件及选择原因。
网络、TLS 与弹性

超时、重试、主机允许列表、出站代理、双向 TLS 以及每主机队列和断路器。这些设置适用于服务的所有 REST 客户端。代理和双向 TLS 需要可选的 undici 软件包。

变量必填默认值起始版本描述
SN_TIMEOUT_MS否300001.1.0每个请求的超时时间,单位为毫秒。
SN_MAX_RETRIES否21.1.0对暂时性故障(429/5xx、网络错误)的重试次数。非幂等写入仅在连接错误时重试。
SN_RETRY_AFTER_MAX_MS否60000next对 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否52428800next读入内存的最大响应正文大小(字节);声明大小或流式读取大小超过此限制时,将以 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否true1.1.0设为 false 会禁用 TLS 证书验证(不建议这样做;启动时会警告一次)。
SN_MAX_CONCURRENT否41.1.0向实例发出的最大并行 HTTP 请求数(简单的进程内信号量)。
SN_MAX_QUEUE否64next每个主机等待空闲槽位的最大请求数,超出 SN_MAX_CONCURRENT 的部分也计入。队列溢出时会立即以代码 BUSY 失败,而不会持续堆积。诊断请求(servicenow_test_connection、doctor)会绕过队列,因此即使队列阻塞也仍能响应。
SN_QUEUE_TIMEOUT_MS否SN_TIMEOUT_MSnext请求等待槽位的最长时间,超时后会以代码 BUSY 失败。等待时间不计入每次尝试的超时时间,只计入 SN_DEADLINE_MS。
SN_BREAKER_THRESHOLD否0(关闭)next按主机选择性启用断路器:连续请求失败(传输错误、超过截止时间、5xx)达到此次数后,后续请求会立即以代码 CIRCUIT_OPEN 失败,直到经过 SN_BREAKER_RESET_MS。诊断请求永远不会被阻止。
SN_BREAKER_RESET_MS否30000next断路器打开后拒绝请求的时长,经过后会放行一个试探请求;试探请求首次失败会重新打开断路器,首次成功则会关闭断路器。
工具包

已注册的工具。管理工具(set_credentials、get_status、use_instance)始终启用。

VariableRequiredDefaultSinceDescription
SN_TOOL_PACKAGESnodiscovery1.0.0以逗号或空格分隔的工具包或配置文件,用于启用相应功能。配置文件:discovery(默认;core 是 2.x 的默认配置,另含 attachment)、all,以及预设配置 reader \
SN_PACKAGES_DENYno—1.0.0以逗号或空格分隔的软件包,即使已通过 SN_TOOL_PACKAGES 启用,也会将其排除。这是阻止插件 API(catalog、change、knowledge 等)的唯一方法——表策略不会检查这些 API。
SN_PACKAGES_READONLYno—1.0.0以逗号或空格分隔的软件包,这些软件包的写入工具不会注册;其读取工具仍会保留。用于补充全局设置 SN_READONLY 的逐软件包配置。
SN_CODESEARCHnofalse1.1.0选择启用 Code Search API(sn_codesearch),供 servicenow_search_code 使用(FT-7)。设为 true 且插件处于启用状态时,将替代 LIKE 遍历;发生任何故障时都会回退到 LIKE。
SN_EXPERIMENTAL_TASKSno0nextM-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_APPSno0nextN-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_NAMESno0nextM-7(B2),仅在一个次要版本周期内提供的弃用过渡机制:按照 v3 命名约定重命名的每个工具,其旧名称都会成为新名称的别名——别名会调用新工具、接受旧参数名称,并记录一次性弃用警告。关闭时(默认):别名仍会响应 tools/call,但不会列在 tools/list 中。设为 1 后,别名也会列出,并且新工具名称也接受旧参数名称。请参阅 README 中的重命名表。
访问策略与写入安全

最小权限表策略、先规划后应用的写入流程、破坏性写入确认、每会话上限、生产环境配置文件、更新集绑定,以及上传、邮件和 SDK 管理范围的防护措施。

变量必填默认值起始版本描述
SN_TABLES_ALLOW否—1.1.0以逗号分隔的表白名单;设置后,仅这些表可访问。
SN_TABLES_DENY否—1.1.0以逗号分隔的表黑名单;始终优先于白名单。
SN_READONLY否false1.1.0值为真时,拒绝所有创建、更新和删除操作。
SN_WRITE_MODE否plan2.0.0plan(默认值)以变更前后差异的形式预览写入,不实际修改;apply 执行写入;传入 apply:true 可强制执行单次调用。
SN_COMPAT否3next升级兼容桥(负责人,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否tokennextH-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否600nextH-3:plan_token 的有效期,单位为秒(30–86400)。令牌仅保存在服务进程中,并会在执行时用尽。
SN_BATCH_UNMAPPED否denynextH-4:servicenow_batch 中 REST 路径不归任何工具包管理的子请求:deny(3.0 默认值,B8)会拒绝该请求(因此新插件 API 无法在批处理中绕过 SN_PACKAGES_DENY / SN_PACKAGES_READONLY);allow 是选择退出,仅依据表策略和只读规则检查该请求。始终拒绝嵌套批处理。
SN_BATCH_MAX_REQUESTS否50nextH-4:单次 servicenow_batch 调用最多可包含的子请求数(1–1000;自 3.0 起为 50),发送任何请求前都会进行检查。
SN_PROTECTED_TABLES_WRITE否confirmnextH-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_*nextH-11:导入集暂存表必须匹配的模式(*、?)(3.0 默认值为 u_*,imp_*);* 表示选择退出(允许任何符合表策略的表)。
SN_MAX_WRITES_PER_SESSION否每个 HTTP 会话 500 次,stdio 不限nextH-11:每个会话最多可执行的实例写入次数(stdio 按进程计算,HTTP 按单个 MCP 会话计算;批处理按其写入子请求计数)。超出后,写入会在发送任何请求前以 WRITE_CAP 失败;get_status.writes.caps 会显示用量。未设置 = 每个 HTTP 会话最多 500 次,stdio 不限(3.0 默认值);0 = 不限。
SN_MAX_DELETES_PER_SESSION否100nextH-11:每个会话最多可执行的删除次数(WRITE_CAP;自 3.0 起为 100)。0 = 不限。
SN_MAX_BATCH_WRITES否50nextH-11:单次 servicenow_batch 中最多可包含的写入型(非 GET)子请求数(WRITE_CAP;自 3.0 起为 50)。0 = 不限。
SN_ENV否—nextH-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否—nextH-11:I_UNDERSTAND 允许 prod 默认配置文件以 apply 模式运行。
SN_UPDATE_SET否—nextS-6:已执行的表工具写入(创建 / 更新 / upsert / 删除)所使用的更新集(sys_id 或精确名称);单次调用中的 update_set 可覆盖此项。计划会标明该更新集;写入期间会切换用户当前更新集,并在完成后恢复。数据行表的写入不变。
SN_EMAIL_ALLOWED_DOMAINS否—nextservicenow_send_email 可发送到的收件人域名(to/cc/bcc;域名包含其子域名,* 允许任意域名)。未设置时,每位收件人都必须是实例自身 sys_user 表中某个用户的电子邮件地址;否则会返回 RECIPIENT_NOT_ALLOWED。
SN_MAX_UPLOAD_BYTES否10485760next附件上传解码后的最大大小;解码前会根据 base64 长度检查(PAYLOAD_TOO_LARGE)。
SN_UPLOAD_MIME_ALLOW否—next可选的上传内容类型白名单(精确匹配或 type/*);其他类型会返回 MIME_NOT_ALLOWED。
SN_SDK_MANAGED_SCOPES否—nextP-3:以逗号或空格分隔的应用作用域(如 x_acme_app 这样的命名空间,或 sys_scope sys_id),用于声明由 ServiceNow SDK(Fluent)项目管理的作用域。这是检测 SDK 管理作用域时优先级最高的信息来源;在 get_status / check_capabilities 的 sdkManaged 下列出。
SN_SDK_MANAGED_WRITES否warnnextP-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否—nextP-3:以逗号或平台路径分隔符分隔的目录,只读扫描其中的 SDK 项目:每个 now.config.json 都会将其 scope / scopeId 声明为 SDK 管理的作用域。扫描范围受限(深度 4、2000 个目录、100 个配置文件、每个文件 256 KiB),绝不跟随符号链接,跳过隐藏目录、node_modules 和构建目录,除 now.config.json 外不会读取任何文件。
结果、脱敏与导出

结果大小预算、输出整形、记录值脱敏、写入日志和 CSV 导出安全性。

变量必需默认值起始版本说明
SN_MAX_RECORDS否100001.1.0fetchAll 查询返回记录数的硬性上限。
SN_MAX_RESULT_CHARS否480001.1.0工具结果的字符数预算(自 O-21 (b) 起为 48,000,低于 Claude Code 的 50,000 字符阈值)。启用 SN_OVERSIZE_TO_FILE 时,较大的结果会写入文件;否则会缩减结果并附上说明,指出 format:"file",而快照、比较或图表结果会完整返回,并附带 note。
SN_OVERSIZE_TO_FILE否truenextS-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否truenextN-65(默认启用,O-21 (c)):大型读取工具(document_*、snapshot_instance、compare_*、get_script)会在 tools/list 中携带 _meta["anthropic/maxResultSizeChars"] = SN_MAX_RESULT_CHARS。设为 false 可移除这些提示。
SN_STRUCTURED否truenextN-39(默认启用,O-21 (d)):具有输出结构的工具会在 tools/list 中发布 outputSchema,并在 JSON 文本旁返回 structuredContent。设为 false 可同时移除两者:此时每个结果仅以文本形式携带一次载荷,且 tools/list 会更小。
SN_INCLUDE_REF_LINKS否false1.1.0默认情况下,引用字段不会返回其 link URL,以节省令牌。设为 true 可将其包含在内。
SN_RESULT_PRETTY否false1.1.0工具结果默认采用紧凑 JSON(美化输出会使令牌数约翻倍)。设为 true 可输出缩进格式。
SN_REDACT_FIELDS否—2.0.0DF-5:在记录传给模型前,屏蔽这些字段值(以逗号或空格分隔)。
SN_REDACT_PII否false2.0.0DF-5:同时屏蔽字符串值中的电子邮件、电话和国家身份证号码模式。自 H-5 起,这两项脱敏设置会深度应用于每个工具结果(成功和错误)以及写入日志。
SN_JOURNAL_MAX_BYTES否20971520nextH-5:达到此大小(字节,默认 20 MiB)时,write-journal.jsonl 会轮换为 write-journal.<ISO-time>.jsonl;哈希链会跨文件延续。
SN_CSV_FORMULA_GUARD否truenextH-5:对以 =、+、-、@、制表符或 CR 开头的 CSV 文本单元格加上 ' 前缀,避免电子表格执行其中的内容(文本 -5 导出为 '-5)。设为 0 可关闭此功能。
SN_CSV_BOM否truenextH-5:在 format:"csv" 导出内容前添加 UTF-8 BOM,以便 Excel 正确解码非 ASCII 文本。设为 0 可关闭此功能。
缓存

用于读取架构的缓存,以及能力 / 插件 API 探测缓存。

变量必需默认值起始版本说明
SN_RECORD_WATCH_INTERVAL_MS否30000nextN-10:记录监视订阅(servicenow://profiles/<profile>/records/<table>/<sys_id>)的轮询间隔;每次轮询都会读取 sys_updated_on / sys_mod_count。下限为 30000。
SN_RECORD_WATCH_MAX_PER_SESSION否10nextN-10:单个客户端会话可持有的记录监视订阅数;超出一个时将以 WATCH_LIMIT 拒绝。
SN_RECORD_WATCH_MAX否50nextN-10:整个进程(所有会话)的记录监视订阅数;超出一个时将以 WATCH_LIMIT 拒绝。
SN_SCHEMA_CACHE_TTL_SEC否3001.1.0近乎静态的架构读取缓存(list_tables、describe_table、get_cmdb_meta)的 TTL。0 表示禁用缓存。
SN_SCHEMA_CACHE_MAX否256next架构读取缓存中的最大条目数;缓存已满时,会淘汰最近最少使用的条目。计数器(size、hits、misses、evictions)会显示在 get_status 的 schemaCache 下。
SN_CAPABILITY_TTL_MS否600000next成功的能力探测缓存时长——包括 servicenow_check_capabilities 矩阵和插件 API 可用性(CI/CD、代码搜索、批处理……)。传入 refresh: true 可提前重新探测。
SN_PLUGIN_NEGATIVE_TTL_MS否60000next失败的能力探测(HTTP 401/403/404/5xx)或缺失的插件 API 在重试前缓存的时长。传输错误不会被缓存。
文档存储和图表

本地 Markdown 文档存储(也是写入日志的存放位置——请勿纳入版本控制)以及生成的 Mermaid 图表。

变量必需默认值起始版本说明
SN_DOCS_DIR否docs/instance1.0.0docs 包读取 / 写入 Markdown 的目录。相对路径以工作目录为基准解析。此目录也存放各配置文件的写入日志——请将 docs/instance/ 添加到运行服务的任何仓库的 .gitignore 中。
SN_DOCS_MAX_FILE_BYTES否5242880next文档工具的单文件大小上限:超出上限的写入会被拒绝;读取仅返回前若干字节,并设置 truncated: true;搜索会跳过该文件。
SN_DOCS_STALE_DAYS否30next当生成文档的 sn_generated_at 距今超过指定天数时,servicenow_list_docs 会将其标记为 stale。
SN_DOCS_SEARCH_MAX否200nextservicenow_search_docs 返回的最大匹配数;超过此数量时,结果会带有 truncated: true。
SN_DIAGRAM_MAX_NODES否200next生成的 Mermaid 图表(表流、事件跟踪、使用位置;详细 ER 图中的表)的节点上限。超出上限的节点会折叠为一个 +N more 节点。
HTTP 传输

stdio(默认,单个本地客户端)或用于远程客户端和 Agent 客户端的 Streamable HTTP。HTTP 端点的安全防护(TLS、身份验证、网络)由运营者负责。

变量必填默认值起始版本描述
SN_TRANSPORT否stdio2.0.0DF-6:stdio(默认)或 http(供远程客户端/Agent 客户端使用的 Streamable HTTP)。
SN_PORT否30002.0.0DF-6:http 传输使用的 TCP 端口。
SN_HTTP_HOST否127.0.0.12.0.0DF-6:http 传输的绑定地址(默认绑定到回环地址)。
SN_HTTP_TOKEN否—2.0.0DF-6:设置后,http 请求必须发送 Authorization: Bearer <token>。当 SN_HTTP_HOST 不是回环地址时(例如 Docker 镜像中的 0.0.0.0),必须设置此项;否则所有能访问该端口的客户端都会被接受,并记录一条警告。
SN_HTTP_OAUTH_ISSUER否—nextN-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否—nextN-17:此服务的规范公共 URI(RFC 8707 资源标识符)。仅当令牌的 aud 包含此值(或某个 SN_HTTP_OAUTH_AUDIENCE 值)时才会接受该令牌。
SN_HTTP_OAUTH_AUDIENCE否—nextN-17:除 SN_HTTP_OAUTH_RESOURCE 外,额外接受的 aud 值,适用于会颁发自有受众标识符的授权服务器。
SN_HTTP_OAUTH_JWKS_URI否—nextN-17:颁发者的 JWKS URI。未设置时,将从颁发者的 OpenID Connect 或 RFC 8414 元数据中发现。
SN_HTTP_OAUTH_INTROSPECTION_URI否—nextN-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否—nextN-17:此服务在令牌内省端点上的客户端 ID(HTTP Basic,client_secret_basic)。
SN_HTTP_OAUTH_INTROSPECTION_SECRET否—nextN-17:此服务在令牌内省端点上的客户端密钥。
SN_HTTP_OAUTH_SCOPES否—nextN-17:每个请求的令牌都必须携带的作用域;这些作用域会发布在 scopes_supported 和 WWW-Authenticate 挑战中。缺少这些作用域的令牌会收到 403 insufficient_scope。
SN_HTTP_OAUTH_USER_TOKENS否offnextN-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=emailnextN-17:<token claim>=<sys_user field> — 仅当关联的 ServiceNow 账户的 sys_user 字段与主体的声明匹配(不区分大小写)时才会接受该账户,以防用户关联他人的账户。
SN_HTTP_OAUTH_TOKEN_KEY否—nextN-17:用于加密静态存储的各用户刷新令牌的 AES-256-GCM 密钥(32 字节,base64 或 hex)。轮换密钥会移除所有关联。
SN_HTTP_OAUTH_TOKEN_STORE否与 env 文件同目录下的 oauth-user-tokens.jsonnextN-17:各用户的加密令牌存储文件(文件权限为 0600,所在目录权限为 0700)。
SN_HTTP_REQUIRE_TOKEN否onnextH-7 / B6:当 SN_HTTP_HOST 不是回环地址且未设置 SN_HTTP_TOKEN 或 OAuth 时,拒绝启动 http 传输。设为 0 可改为记录警告并接受所有客户端。
SN_HTTP_SESSION_TTL_SEC否1800nextH-7:http 会话的空闲 TTL(秒);空闲会话将关闭,其运行时也会被释放。设为 0 可使会话保持打开状态,直到客户端发送 DELETE。
SN_HTTP_MAX_SESSIONS否64nextH-7:并发 http 会话上限;超过上限的新会话请求会收到 503 并被拒绝。
SN_HTTP_KEEPALIVE_MS否25000nextH-7:开放流中 SSE 保活注释的发送间隔(低于常见代理的空闲超时)。设为 0 可禁用。
SN_HTTP_ALLOWED_HOSTS否—nextH-7:http 传输接受的 Host 标头值(用于防范 DNS 重绑定);不带端口的条目会匹配任意端口。未设置时,绑定到回环地址则仅允许回环名称,否则不进行检查(会记录警告)。
SN_HTTP_ALLOWED_ORIGINS否—nextH-7:http 传输接受的浏览器 Origin 值(* = 任意来源)。未设置时仅允许回环来源;此检查绝不会拒绝不带 Origin 标头的请求。
SN_METRICS否offnextE-5:仅适用于 HTTP 传输 — 在 GET /metrics 提供 Prometheus 指标,并受 SN_HTTP_TOKEN 保护(未设置令牌时禁用)。
日志记录

stderr 日志、可选的日志文件,以及镜像到 MCP 客户端的日志行。

变量必填默认值起始版本描述
SN_LOG_LEVEL否info1.1.0stderr 日志详细程度:error、warn、info、debug。未设置此项时,会读取旧版 LOG_LEVEL。也读取为 LOG_LEVEL。
SN_LOG_FORMAT否jsonnextE-5:stderr 日志行格式——json(每行一个对象)或 text(HH:MM:SS level message key=value)。
SN_LOG_FILE否—nextE-5:同时将每条日志行(JSON Lines,已脱敏,权限模式为 0600)追加到此文件,并按大小轮转(<file>.1 … <file>.5)。stderr 仍正常工作。
SN_LOG_FILE_MAX_BYTES否10485760nextE-5:SN_LOG_FILE 的轮转阈值(字节)。
SN_LOG_NOTIFY_RATE否20nextM-8:通过 MCP 日志记录能力发送的每秒日志通知数(按客户端会话计算,突发上限为 50,或大于 50 时按设定速率计算)。超出限制的日志行会被计数,并每分钟通过一条“已抑制 N 条日志消息”警告报告;stderr 不会被限流。0 = 不限流。
SN_OTEL否关闭nextN-55:将工具调用和 HTTP diagnostics_channel 事件映射为 OpenTelemetry span(遵循 MCP / GenAI 语义约定)。需要可选的对等依赖 @opentelemetry/api,以及在进程中注册的 OpenTelemetry SDK(例如使用 node --import);如果没有该软件包,会记录一条警告,其他行为不变。
SN_OTEL_PROPAGATE否关闭nextN-55:在发往 ServiceNow REST 的请求中发送 W3C traceparent / tracestate 标头——如果启用了 SN_OTEL,则使用 HTTP 客户端 span 的上下文;否则使用客户端在 params._meta 中发送的上下文。关闭时,跟踪 ID 不会离开服务。
设置验证

每项设置都会在启动时验证。无效的安全设置值会导致启动错误;无效的调优设置值会作为警告记录,且设置保留默认值(参见 SN_STRICT_SETTINGS)。

变量必填默认值起始版本描述
SN_STRICT_SETTINGS否仅安全设置nextE-4 / B5:哪些无效设置值(非数字、未知的枚举值、超出范围的端口……)会导致服务启动错误,并指出所有出错的键。未设置:仅安全设置——连接、配置文件、软件包、策略、传输,以及信任 / 隐私键(SN_ALLOWED_HOSTS、SN_TLS_*、SN_REDACT_*、SN_CSV_FORMULA_GUARD);无效的调优设置值(超时、上限、缓存、日志记录)会记录警告并保留默认值,与 2.x 一致。1:所有无效值都视为错误。0:无效值均不视为错误(SN_COMPAT=2 时的默认值)。未知的 SN_* 键仍会产生警告。
标准变量

SN_ 命名空间之外,服务也会遵循的常规变量。

变量必填默认值起始版本描述
HTTPS_PROXY否—nextHTTPS 流量的标准代理;未设置 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否~/.config1.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_*_FILE PEM 路径,都是由服务器自行读取的路径,而非 <KEY>_FILE 来源。
双轴访问策略

访问权限由两个独立的轴控制:表和工具包。

轴启用 / 拒绝 / 只读示例
表SN_TABLES_ALLOW / SN_TABLES_DENY / SN_READONLYSN_TABLES_DENY=change_request 会阻止 Table API,并且(自 H-4 起)阻止 Change 工具,后者会检查其对应的表。
工具包SN_TOOL_PACKAGES / SN_PACKAGES_DENY / SN_PACKAGES_READONLYSN_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 / tracestate
    servicenow-mcp:mcp.tool.call.end返回成功结果起始字段,以及 profile、outcome(ok)、ms、resultBytes
    servicenow-mcp:mcp.tool.call.error返回错误结果或抛出异常起始字段,以及 profile、outcome(error / cancelled)、ms,以及 code / resultBytes 或 errorName
    servicenow-mcp:http.request.start逻辑请求开始id、system、method、host、telemetryKey、url,以及调用中的 profile / requestId / sessionId / tool / callId / traceparent / tracestate
    servicenow-mcp:http.request.end收到成功响应并完成起始字段,以及 status、attempts、ms
    servicenow-mcp:http.request.error请求失败起始字段,以及 attempts、ms、status、code、errorName、errorMessage
    servicenow-mcp:http.request.retry重放一次尝试(退避、401 重新认证)id、system、method、host、url、attempt、reason、waitMs

    url 绝不包含查询字符串;绝不会发布标头、正文和凭据,并且 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> 的 SERVER span;如果客户端发送了 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。
    • 每个出站请求都会生成一个以方法命名的 CLIENT span,作为其工具 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_recordcreate_record, update_record, upsert_record, delete_record
schema是list_tables, describe_table—
aggregate是aggregate—
attachment否list_attachments, get_attachment, download_attachmentupload_attachment, delete_attachment
importset否get_import_set_rowinsert_import_set_row
batch否—batch
catalog否list_catalogs, list_catalog_categories, list_catalog_items, get_catalog_itemorder_catalog_item
change否list_changes, get_changecreate_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_relationscreate_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_tablecheck_code_health
docs否list_docs, read_doc, search_docs, generate_er_diagram, generate_table_flowwrite_doc, document_table, document_app, document_instance
instance否review_upgradesnapshot_instance, compare_instances
email否get_emailsend_email
atf否list_atf, get_atf_resultrun_atf
revert否list_writesrevert_write
artifacts否list_artifacts, get_artifact, explain_artifact, get_artifact_dependenciesupsert_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_propertiesset_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_toolsset_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_dependenciesservicenow_get_artifact_dependencies缺少动词。
servicenow_change_conflictsservicenow_check_change_conflicts缺少动词。
servicenow_code_healthservicenow_check_code_health缺少动词。
servicenow_data_healthservicenow_check_data_health缺少动词;与 check_code_health 保持一致。
servicenow_docs_listservicenow_list_docs名词在动词前。
servicenow_docs_readservicenow_read_doc名词在动词前。
servicenow_docs_searchservicenow_search_docs名词在动词前。
servicenow_docs_writeservicenow_write_doc名词在动词前。
servicenow_knowledge_highlightsservicenow_get_knowledge_highlights缺少动词。
servicenow_list_atf_suitesservicenow_list_atf与 list_atf_tests 合并(kind: suite)。
servicenow_list_atf_testsservicenow_list_atf与 list_atf_suites 合并(kind: test)。
servicenow_ops_readservicenow_read_ops名词在动词前。
servicenow_run_atf_suiteservicenow_run_atf与 run_atf_test 合并(kind: suite)。
servicenow_run_atf_testservicenow_run_atf与 run_atf_suite 合并(kind: test)。
servicenow_table_logicservicenow_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=…适用对象
readertable,schema,aggregate初次接触者、分析师、PDI 演练——仅供读取和查询。
developertable,schema,aggregate,scripts,flows,codecheck,docs核心开发者:脚本智能分析、流程追踪、Lint 检查、文档和图表。
adminall所有功能,包括插件和写入密集型包。

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文件
overviewoverview.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 脚本(无依赖):

事件脚本功能
SessionStartsession-context.mjs将活动配置、其实例主机、写入模式(计划/应用、只读、被暂停的生产配置)、工具包和其他配置名称添加到会话中。它仅读取环境和本地 env 文件(SN_ENV_FILE 或 ~/.config/servicenow-mcp-ai/.env)——不会发起网络调用,也不会在输出中包含凭据;如果其中任一项缺失或无法读取,则不输出任何内容。客户端启动的服务器可能会看到不同的环境,因此 servicenow_get_status 仍是权威信息来源。
PreToolUserequire-plan-token.mjs拒绝不带 plan_token 的破坏性 apply:true(D-8)。
PostToolUsetruncation-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://tablessys_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/toolsMarkdown 格式的工具清单:按包列出的所有工具、读 / 写属性,以及此会话是否根据包策略注册了相应工具。
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_triageincident总结、评估优先级、分类并建议后续步骤。
servicenow_change_impact_analysischange受影响的 CI、日程冲突以及是否继续的判断。
servicenow_document_tabletable, profile运行 servicenow_document_table,然后填写 <profile>/tables/<table>.md 中的手动 Purpose 区块;附加编码查询参考。
servicenow_why_is_it_slowsymptom, table (both optional)系统日志、调度器积压、邮件队列和信号量(ops),然后检查表上的逻辑 → 按优先级排列的原因。
servicenow_uib_page_reviewexperience, page (optional)说明 UI Builder 体验(ui),然后说明变更会影响哪些内容(依赖项、使用位置)、数据代理安全性和页面体量;未启用相应 package 的步骤会跳过。
servicenow_instance_overviewgoal (optional)能力矩阵(servicenow_check_capabilities)、状态和会话的 package;注意事项依据 profile 的环境标记(SN_ENV / SN_PROFILE_<NAME>_ENV);未标记的 profile 将视为生产环境。
servicenow_security_posturescope, profile (both optional)ACL 扫描和加固合规性(check_code_health)、实例的 security 文档,然后检查一个应用的跨范围访问(文档使用 docs package)。
servicenow_safe_writechange, table (optional)先检查写入模式,然后按读取 → 规划 → 获批后应用 → 验证 → 回滚路径执行。应用模式(SN_WRITE_MODE=apply)下没有预览,因此模型必须在每次写入调用前询问用户;生产环境 profile 会添加注意事项。
servicenow_drift_reviewa, b, update_set (last two optional)为参考 profile 创建快照,比较两个 profile(或一个 profile 与其快照),审查更新集,然后深入检查差异;优先检查与安全相关的漂移。
servicenow_upgrade_reviewupgrade (optional)升级历史、升级中未解决的跳过记录、某条跳过记录的基准版本与客户版本、有更新的 Store 应用(instance),然后读取 upgrade 文档(docs)。
servicenow_schema_impactkind (table / field / script), name使用位置(结构和文本)、表上的逻辑和事件、可选的 ER 图 → 依赖项和风险判断。
servicenow_discover_instancedepth (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.md2026-09-09 对 v3.0 计划的第二轮审查:九个更细分的维度、67 项发现,每项均包含设计、验收标准和测试,并映射到跟踪表条目
INSTANCE-DOCS-ANALYSIS-2026-09.md2026-09-23 对实例文档的审查:文档存储、Mermaid 生成器、document_table 提示词和缺失的文档类型 — 共 17 项发现,每项均包含设计、验收标准和测试,并映射到 S-14 … S-16
INSTANCE-DOCS-ANALYSIS-2026-09-25.md2026-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 等),可用于一次性打赏。

在 GitHub 上赞助 在 Ko-fi 上支持 通过 Donatree 捐赠

商标

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 发布。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。