Skip to main content
Glama
jshsakura

mfa-servicenow-mcp

by jshsakura

MFA ServiceNow MCP

🌐 English | 🇰🇷 한국어 | 🇯🇵 日本語 | 🇮🇳 हिन्दी | 🇨🇳 简体中文 | 🇪🇸 Español | 🚀 GitHub Pages

MFA-first ServiceNow MCP server. Authenticates via real browser (Playwright) so Okta, Entra ID, SAML, and any MFA/SSO login just works. Also supports API Key for headless/Docker environments.

PyPI version Python Version CI Docker License: Apache 2.0 GitHub Pages

WARNING

Built for personal use — use at your own risk. This project was created primarily for the author's own workflows. Risk is actively minimized (read-only defaults, write guards, dry-run previews, and confirm='approve' gates on every write), but it operates against live ServiceNow instances. You are solely responsible for what it does on your instances. Provided "as is", without warranty of any kind (Apache-2.0, see LICENSE). Review what a tool will do before approving it.


Table of Contents


Related MCP server: servicenow-mcp

Setup

Two steps: install, then add the server to your MCP client config. No installer command, no per-client flags.

1. Install

The default is uvx — no separate install step, it just runs. For most people this is the whole story.

# macOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows PowerShell
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

uvx --refresh --with playwright --from mfa-servicenow-mcp servicenow-mcp --version  # fetch + verify the server
uvx --with playwright playwright install chromium                                   # Chromium for MFA/SSO login

To update — uvx caches the last version it downloaded and keeps reusing it, so a new release has to be pulled in explicitly with --refresh:

uvx --refresh --with playwright --from mfa-servicenow-mcp servicenow-mcp --version
uvx --with playwright playwright install chromium     # a newer Playwright needs a newer Chromium build

If uvx is blocked — pip

Windows Smart App Control stops uvx from running at all: uvx unpacks an unsigned temporary executable on every run, and SAC blocks it. If uvx suddenly stopped working right after a Windows update, this is almost certainly why. Use pip instead:

pip install mfa-servicenow-mcp playwright
python -m playwright install chromium

To update:

pip install --upgrade mfa-servicenow-mcp playwright
python -m playwright install chromium

A Python from the python.org installer (signed, 3.10+) passes SAC as-is. Launch it with python -m servicenow_mcp rather than the servicenow-mcp console script — that script is an unsigned .exe shim pip generates, and SAC blocks it too.

On mac/Linux the one pip caveat is that Homebrew and distro Pythons refuse global installs under PEP 668 (externally-managed-environment). Use the python.org installer, or just stay on uvx.

Installing Chromium up front matters either way. Deferring it to the first tool call means a ~150 MB download racing the MCP host's handshake deadline, which surfaces as connection closed.

Guided setup. Running servicenow-mcp setup with no flags (pip: python -m servicenow_mcp setup) walks you through numbered menus (pick clients and auth type by number or name — no free-text guessing), in English or Korean (auto-detected from your locale; force with SERVICENOW_MCP_LANG=ko|en).

2. Configure your MCP client

Add the server to your client's config file. The env block is identical no matter how you installed — only command/args follow the path you picked above:

Install

command

args

uvx (default)

uvx

["--with","playwright","--from","mfa-servicenow-mcp","servicenow-mcp"]

pip

python

["-m","servicenow_mcp"]

Only two env vars are required; MCP_TOOL_PACKAGE defaults to standard, so leave it out unless you need a different package.

Single instance

If you only use one instance, this is all you need.

Claude Code.mcp.json (project root) / ~/.claude.json (global):

{
  "mcpServers": {
    "servicenow": {
      "command": "uvx",
      "args": ["--with", "playwright", "--from", "mfa-servicenow-mcp", "servicenow-mcp"],
      "env": {
        "SERVICENOW_INSTANCE_URL": "https://your-instance.service-now.com",
        "SERVICENOW_AUTH_TYPE": "browser"
      }
    }
  }
}

If you installed via pip, swap command/args to this — everything else stays the same:

      "command": "python",
      "args": ["-m", "servicenow_mcp"],

Codex.codex/config.toml (project) / ~/.codex/config.toml (global):

[mcp_servers.servicenow]
command = "uvx"
args = ["--with", "playwright", "--from", "mfa-servicenow-mcp", "servicenow-mcp"]
# pip: command = "python"  /  args = ["-m", "servicenow_mcp"]

[mcp_servers.servicenow.env]
SERVICENOW_INSTANCE_URL = "https://your-instance.service-now.com"
SERVICENOW_AUTH_TYPE = "browser"

OpenCodeopencode.json (project root):

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "servicenow": {
      "type": "local",
      "command": ["uvx", "--with", "playwright", "--from", "mfa-servicenow-mcp", "servicenow-mcp"],
      "enabled": true,
      "environment": {
        "SERVICENOW_INSTANCE_URL": "https://your-instance.service-now.com",
        "SERVICENOW_AUTH_TYPE": "browser"
      }
    }
  }
}

Other clients (Cursor, VS Code, Antigravity, Zed, …) and full env options (auth types, tool packages) are in MCP Client Configuration.

Then restart the client. The first browser tool call opens a window for Okta/Entra ID/SAML/MFA login. Sessions persist — no re-login every time.

Multiple instances (dev / test / prod)

If you work across dev / test / prod, don't stand up several servers. Changing only env lets a single connection handle all of them:

      "env": {
        "SERVICENOW_ACTIVE_INSTANCE": "dev",
        "SERVICENOW_INSTANCE_CONFIG": "{ \"dev\": { \"url\": \"https://acme-dev.service-now.com\", \"auth_type\": \"browser\", \"allow_writes\": true }, \"prod\": { \"url\": \"https://acme.service-now.com\", \"auth_type\": \"browser\" } }"
      }

All that changes is an alias list taking the place of SERVICENOW_INSTANCE_URL; command/args stay the same. What you get:

  • Production is protected by default — an alias without allow_writes is read-only. In the example above, prod cannot be written to at all.

  • Query another instance without restarting — pass instance to a read tool, as in sn_query(instance="prod", ...).

  • Compare across instancescompare_instances puts the same component from dev and prod side by side.

  • One login — the browser session is shared across aliases.

The full rules (write routing, gates, ${ENV} references) live in Multiple instances — two approaches. Only reach for B. Multi-process there if the connections have to look separate in your client's UI.

Prefer an AI to do it? Paste into Claude Code / Cursor / Codex / etc.: Install and configure mfa-servicenow-mcp following https://raw.githubusercontent.com/jshsakura/mfa-servicenow-mcp/main/docs/llm-setup.md

If your corporate network blocks the install

TLS-inspecting proxies (Zscaler and friends) and blocked PyPI access have their own path — see Install (offline / corporate).


Features

  • Browser authentication for MFA/SSO environments (Okta, Entra ID, SAML, MFA)

  • 4 auth modes: Browser, Basic, OAuth, API Key

  • 75 registered tools with 6 active package profiles plus disabled none — from minimal read-only to broad bundled CRUD

  • 4 workflow skills with safety gates, sub-agent delegation, and verified pipelines

  • Streamable HTTP transport — keep stdio as the default, or expose /mcp for HTTP-capable clients and bridges

  • Local source audit with HTML report, cross-reference graph, dead code detection, and auto-generated domain knowledge

  • Authoritative relationship graphs on disk_graph.json (widget→Angular Provider, from the live M2M) and _page_graph.json (page→widget, from sp_instance) let the LLM answer dependency questions offline instead of re-querying the instance

  • Incremental sync (incremental=True) — re-download only records changed since last sync (sys_updated_on watermark), like git pull; reconcile_deletions=True flags records deleted on the instance

  • Cross-scope dep auto-resolve in download_app_sources — pulls global-scope Script Includes, Widgets, Angular Providers, and UI Macros that the app references, so the local bundle is self-contained for analysis

  • Attachment download (download_attachment) — save a record's attachment file(s) locally and return saved_path; successful small downloads also carry a short-lived MCP ResourceLink, so isolated clients can explicitly fetch the file as a binary resource without putting base64 in the initial LLM context

  • Excel without boilerplate (manage_workbook) — list sheets, read rows, regex-find across a tracking workbook; write styled sheets from a plain data spec (house header/border/wrap applied server-side); or fill a COPY of a company form, screenshots embedded. Built for test sign-off and hand-over documents; the form itself is an input and is never written to

  • Dry-run preview on every write tool (dry_run=True) — returns field-level diff, dependency counts, and precision notes before any side effect. Uses read-only APIs, works under all auth modes.

  • Write intent gate: every mutation requires an explicit confirm='approve' (accidental-write guardrail, not an adversarial boundary — see Safety Policy)

  • Payload safety limits, per-field truncation, and total response budget (200K chars)

  • Transient network error retry with backoff

  • Tool packages for core, standard, service desk, portal developers, and platform developers — full available for advanced users (see warning)

  • Developer productivity tools: activity tracking, uncommitted changes, dependency mapping, daily summary

  • Full coverage of core ServiceNow artifact tables (see Supported Tables)

  • CI/CD with auto-tagging, PyPI publishing, and Docker multi-platform builds

Attachment delivery in isolated environments

download_attachment always keeps its existing disk-first behavior. Local agents and containers with a shared volume should read saved_path. By default, a successful file up to 10 MiB also returns an MCP ResourceLink; a remote client can explicitly call resources/read within 15 minutes to receive that exact downloaded file as a typed binary blob. The first tool response never contains the file's base64. Server operators can lower or raise the resource limit with SERVICENOW_ATTACHMENT_RESOURCE_MAX_MB, up to a hard maximum of 25 MiB. Links are process-local, are not transferable to another MCP server, and expire when the issuing server restarts. Larger files remain successfully downloaded and the response retains saved_path, while explaining that the resource limit was exceeded.

Supported ServiceNow Tables

Artifact Type

Table Name

Source Search

Developer Tracking

Safety (Heavy Table)

Script Include

sys_script_include

🛡️

Business Rule

sys_script

🛡️

Client Script

sys_script_client

🛡️

Catalog Client Script

catalog_script_client

UI Action

sys_ui_action

🛡️

UI Script

sys_ui_script

🛡️

UI Page

sys_ui_page

🛡️

UI Macro

sys_ui_macro

🛡️

Scripted REST API

sys_ws_operation

🛡️

Fix Script

sys_script_fix

🛡️

Scheduled Job

sysauto_script

Script Action

sysevent_script_action

Email Notification

sysevent_email_action

ACL

sys_security_acl

Transform Script

sys_transform_script

Processor

sys_processor

Service Portal Widget

sp_widget

🛡️

Angular Provider

sp_angular_provider

Portal Header/Footer

sp_header_footer

Portal CSS

sp_css

Angular Template

sp_ng_template

Metadata / XML Definitions

sys_metadata

🛡️

Update XML

sys_update_xml


Install (offline / corporate)

For most users the Setup above (uvx) is all you need. Two corporate-network cases are worth calling out.

The common case is PyPI reachable, but HTTPS is TLS-inspected (Zscaler / Netskope / corporate MITM) — that is what the section below covers.

If PyPI itself is blocked outright, neither uvx nor pip can reach the package. Ask your IT team to allowlist pypi.org and files.pythonhosted.org, or to mirror the package on an internal index you can point pip install --index-url at.

Installing behind a TLS-inspecting proxy (Zscaler etc.)

Use this when PyPI is reachable but a TLS-inspecting proxy re-signs HTTPS, so installs and runtime calls fail with SSL: CERTIFICATE_VERIFY_FAILED. Registering the proxy's root CA in the OS trust store is not enough — Python (pip, requests, httpx), curl_cffi, and Playwright each ship their own CA bundle (certifi / libcurl / node) and ignore the OS store unless you point them at the cert via env.

1. Get the proxy root CA as a PEM file (ask IT, or export it from the OS keychain). Assume it lands at /etc/ssl/zscaler-root.pem (Windows: C:\certs\zscaler-root.pem).

2. Install — point the installer at the cert:

pip install --cert /etc/ssl/zscaler-root.pem mfa-servicenow-mcp
python -m playwright install chromium     # NODE_EXTRA_CA_CERTS (step 3) covers its download

Prefer uvx? uv can use the OS trust store directly (where the proxy CA is already registered):

UV_NATIVE_TLS=1 uvx --with playwright --from mfa-servicenow-mcp servicenow-mcp --version

3. Runtime — set the CA path in your MCP client env. The non-obvious part: live ServiceNow calls go through curl_cffi (libcurl), which reads CURL_CA_BUNDLEnot REQUESTS_CA_BUNDLE. Set all of them so every layer trusts the proxy:

{
  "mcpServers": {
    "servicenow": {
      "command": "python",
      "args": ["-m", "servicenow_mcp"],
      "env": {
        "SERVICENOW_INSTANCE_URL": "https://your-instance.service-now.com",
        "SERVICENOW_AUTH_TYPE": "browser",
        "CURL_CA_BUNDLE": "/etc/ssl/zscaler-root.pem",
        "REQUESTS_CA_BUNDLE": "/etc/ssl/zscaler-root.pem",
        "SSL_CERT_FILE": "/etc/ssl/zscaler-root.pem",
        "NODE_EXTRA_CA_CERTS": "/etc/ssl/zscaler-root.pem"
      }
    }
  }
}

Env var

Layer it fixes

CURL_CA_BUNDLE

curl_cffi / libcurl — the actual ServiceNow API + browser-login probe calls

REQUESTS_CA_BUNDLE

requests (OAuth / API-key token calls, fallback HTTP path)

SSL_CERT_FILE

Python stdlib ssl / httpx / uv

NODE_EXTRA_CA_CERTS

Playwright's Chromium download

PIP_CERT (install only)

pip fetching from PyPI (same as --cert)

In a fully-inspected network the proxy re-signs every host, so the single proxy-root PEM covers all HTTPS. If some hosts bypass the proxy, concatenate the proxy root with certifi's bundle (python -m certifi prints its path) into one PEM and point the env vars at that.

Last resort if you genuinely can't obtain the PEM: pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org mfa-servicenow-mcp skips verification for the install only — it does nothing for runtime ServiceNow calls, which still need CURL_CA_BUNDLE. Prefer the cert path; --trusted-host disables a security control.

MCP Client Configuration

Recommended: use Setup above. Use the copy-paste configs below when you need to inspect, repair, or hand-manage a client config file.

Each project can connect to a different ServiceNow instance. Set the config in your project directory so each project has its own instance URL and credentials.

Client

Project Config

Global Config

Format

Claude Code

.mcp.json

~/.claude.json

JSON

Cursor

.cursor/mcp.json

Project only

JSON

VS Code (Copilot)

.vscode/mcp.json

Project only

JSON

Zed

Global only

~/.config/zed/settings.json

JSON

OpenAI Codex

.codex/config.toml

~/.codex/config.toml

TOML

OpenCode

opencode.json

Project only

JSON

Windsurf

Global only

~/.codeium/windsurf/mcp_config.json

JSON

Claude Desktop

Global only

claude_desktop_config.json

JSON

AntiGravity

Global only

~/.gemini/antigravity/mcp_config.json

JSON

Docker

Env vars only

Env vars only

Env vars

Copy-paste configs for each client: Client Setup Guide

SERVICENOW_USERNAME / SERVICENOW_PASSWORD are optional — they prefill the MFA login form. On Windows, set these as system environment variables.

Profiles vs. multi-process

The examples above are single-instance — that stays the default. With more than one instance there are two ways to go, and it's worth picking one before you configure anything:

A. Profiles (recommended)

B. Multi-process

Server processes

1

one per instance

Connections the client sees

1

3

Choosing an instance

instance="test" per call

pinned to the process

Cross-instance comparison

works (compare_instances)

impossible — processes don't know each other

Browser login

one shared session

one login per process

Write control

allow_writes per alias

per-process config

Most people want A. Write safety is already solved there — leave allow_writes off a prod alias and it's read-only, and writes to a non-active instance have to clear the confirm_instance gate. On top of that, only A gives you cross-instance comparison and a single login.

Pick B only when the connections need to be visibly separate in the client UI. Tool names come through as mcp_snow-prd_*, so a human tells them apart at a glance. The cost is three logins, no comparison, and three copies of the config. Details: Telling multiple connections apart.

A. Profiles

To switch between several instances from one client, list them in SERVICENOW_INSTANCE_CONFIG (alias → settings) and pick the active one with SERVICENOW_ACTIVE_INSTANCE. Each alias can carry its own credentials (username / password / auth_type / api_key); ${ENV} references keep secrets out of the JSON. The single-instance SERVICENOW_INSTANCE_URL form still works as a fallback.

{
  "mcpServers": {
    "servicenow": {
      "command": "uvx",
      "args": ["--with", "playwright", "--from", "mfa-servicenow-mcp", "servicenow-mcp"],
      "env": {
        "MCP_TOOL_PACKAGE": "standard",
        "SERVICENOW_ACTIVE_INSTANCE": "dev",
        "SERVICENOW_INSTANCE_CONFIG": "{ \"dev\": { \"url\": \"https://acme-dev.service-now.com\", \"auth_type\": \"browser\", \"username\": \"dev_user\", \"password\": \"${SERVICENOW_DEV_PASSWORD}\", \"allow_writes\": true }, \"test\": { \"url\": \"https://acme-test.service-now.com\", \"auth_type\": \"browser\", \"username\": \"test_user\", \"password\": \"${SERVICENOW_TEST_PASSWORD}\" } }"
      }
    }
  }
}

SERVICENOW_ACTIVE_INSTANCE is where writes default; read tools peek at the others with instance="test", and a single write can be routed to a non-active instance with instance="test" confirm_instance="test" confirm="approve" (guarded, and verified after it lands). Full rules (write routing, gating, comparison, ${ENV}): Multi-Instance Mode.

B. Multi-process

Only worth it when you want the connections split apart in the client UI. Each entry pins one instance and gets its own name via --server-name:

{
  "mcpServers": {
    "snow-dev": {
      "command": "uvx",
      "args": ["--with", "playwright", "--from", "mfa-servicenow-mcp", "servicenow-mcp", "--server-name", "snow-dev"],
      "env": {
        "SERVICENOW_INSTANCE_URL": "https://acme-dev.service-now.com",
        "SERVICENOW_AUTH_TYPE": "browser"
      }
    },
    "snow-prd": {
      "command": "uvx",
      "args": ["--with", "playwright", "--from", "mfa-servicenow-mcp", "servicenow-mcp", "--server-name", "snow-prd"],
      "env": {
        "SERVICENOW_INSTANCE_URL": "https://acme.service-now.com",
        "SERVICENOW_AUTH_TYPE": "browser",
        "MCP_TOOL_PACKAGE": "standard"
      }
    }
  }
}

Tool names are then pinned to mcp_snow-dev_* / mcp_snow-prd_*. Drop --server-name and both advertise themselves as ServiceNow, so the client numbers them by load order (mcp_servicenow, mcp_servicenow2) — and that numbering can shift between restarts, which means you can never trust which one is production.

To keep the production connection read-only, give it a read-only MCP_TOOL_PACKAGE. Unlike A, there is no allow_writes alias gate here — the tool package is the only thing blocking writes.

Login prompts come up per process, and cross-instance tools like compare_instances are unavailable — each process only knows its own instance. If that bites, go with A.


Authentication

Choose the auth mode based on your ServiceNow environment.

Browser Auth (MFA/SSO) — Default

The Setup command uses browser auth by default. Optional flags:

Flag

Env Variable

Default

Description

--browser-username

SERVICENOW_USERNAME

Prefill login form username

--browser-password

SERVICENOW_PASSWORD

Prefill login form password

--browser-headless

SERVICENOW_BROWSER_HEADLESS

false

Run browser without GUI

--browser-timeout

SERVICENOW_BROWSER_TIMEOUT

120

Login timeout in seconds

--browser-session-ttl

SERVICENOW_BROWSER_SESSION_TTL

30

Session TTL in minutes

--browser-user-data-dir

SERVICENOW_BROWSER_USER_DATA_DIR

Override the Chromium profile path. Rarely needed — see the sandbox note below before setting it.

--browser-probe-path

SERVICENOW_BROWSER_PROBE_PATH

user-specific sys_user lookup when a username is known, otherwise /api/now/table/sys_user_preference?sysparm_limit=1&sysparm_fields=sys_id

Session validation endpoint (avoids 401 on non-admin sessions)

--browser-login-url

SERVICENOW_BROWSER_LOGIN_URL

Custom login page URL

Login sharing across hosts and instances — how it actually works

The server caches two things under ~/.mfa_servicenow_mcp/: the Playwright profile (Chromium SSO cookies) and a session JSON (parsed cookies reused on the next start). Both are scoped per instance + username — files are named profile_<host>_<user> and session_<host>_<user>.json.

That scoping does two things for you automatically, with no configuration:

  • Multiple hosts share one login. Claude Code and Codex on the same machine both resolve ~/.mfa_servicenow_mcp/, so whichever logs in first writes the session and the other reuses it — no second MFA prompt.

  • Different instances / different credentials stay isolated. Each instance+user gets its own profile and session file, so dev and test (or two accounts) never collide. For multiple instances, configure them in SERVICENOW_INSTANCE_CONFIG (JSON) — each alias gets its own scoped cache; you do not manage this with a profile path.

Do not set SERVICENOW_BROWSER_USER_DATA_DIR to "share" logins. It overrides the profile path verbatim — the per-instance scoping is bypassed, so every instance you run is forced into one Chromium profile and their cookies collide. The only legitimate use is a narrow one: a sandboxed host (e.g. Claude Desktop on macOS) that remaps HOME to a container path, so its ~/.mfa_servicenow_mcp/ no longer matches the terminal's. In that single-instance case, point the sandboxed host at the real home path:

# Only when a sandbox remapped HOME, and only for a single-instance host
export SERVICENOW_BROWSER_USER_DATA_DIR="/Users/you/.mfa_servicenow_mcp/profile_acme"

If you run more than one instance, leave this unset and let the per-instance scoping do its job.

Basic Auth

Use this for PDIs or instances without MFA.

python -m servicenow_mcp \
  --instance-url "https://your-instance.service-now.com" \
  --auth-type "basic" \
  --username "your_id" \
  --password "your_password"

OAuth

Current CLI support expects OAuth password grant inputs.

python -m servicenow_mcp \
  --instance-url "https://your-instance.service-now.com" \
  --auth-type "oauth" \
  --client-id "your_client_id" \
  --client-secret "your_client_secret" \
  --username "your_id" \
  --password "your_password"

If --token-url is omitted, the server defaults to https://<instance>/oauth_token.do.

API Key

python -m servicenow_mcp \
  --instance-url "https://your-instance.service-now.com" \
  --auth-type "api_key" \
  --api-key "your_api_key"

Default header: X-ServiceNow-API-Key (customizable with --api-key-header).


Tool Packages

MCP_TOOL_PACKAGE controls which tools the server exposes. Default: standard — no config needed for most users.

WARNING

Any package above standard grants write access and is an advanced option. service_desk, portal_developer, platform_developer, and full all let an AI agent create, update, and delete records — full does so across every domain at once. Most users should stay on the read-only default standard and only opt up to the narrowest write package their task actually requires.

Read-only (safe defaults):

Package

Tools

~Tokens

Description

none

0

0

Disabled profile for intentionally turning tools off

core

12

~3.0K

Minimal read-only essentials for health, schema, discovery, and key artifact lookups

standard

31

~7.3K

(Default) Read-only across incidents, changes, portal, logs, and source analysis

⚠️ Write-capable (advanced — grants create/update/delete):

Package

Tools

~Tokens

Description

service_desk

33

~8.2K

⚠️ standard + incident and change operational writes

portal_developer

50

~10.6K

⚠️ standard + portal, changeset, script include, and local-sync delivery writes

platform_developer

44

~10.8K

⚠️ standard + workflow, Flow Designer, UI policy, incident/change, and script writes

full

61

~13.8K

⚠️ Most advanced — all write tools across all domains at once

~Tokens is the approximate footprint each package's tool schemas add to the model's context per request (measured with tiktoken cl100k_base over the server's compacted schemas; actual Claude counts vary slightly). Staying on the narrowest package keeps the context budget — and cost — down.

Each server process binds to one active ServiceNow instance for ordinary tools. A write to a different configured instance is possible per call, but only through an explicit, guarded acknowledgement (below) — never a silent switch.

Multi-Instance Mode (comparison + guarded single-call writes)

When you need to compare dev/test/prod or deploy to a chosen one, opt into named instances with SERVICENOW_INSTANCE_CONFIG. SERVICENOW_ACTIVE_INSTANCE is still required.

Two things are global, one is per-instance:

  • Tool surface is global — set once with MCP_TOOL_PACKAGE. Only one instance is ever active per server process, so there is no per-instance tool package.

  • Write permission is per-instance — each alias carries allow_writes. It is enforced at call time against the active instance: a write tool can be loaded but still refused if the active instance has allow_writes: false. Writes are opt-in: omit allow_writes and the instance is read-only.

  • Credentials are per-instance with global fallback — put username / password / api_key (and auth_type) on an alias to override; omit them and the alias inherits the global SERVICENOW_USERNAME / SERVICENOW_PASSWORD / etc. So if every instance shares one login, set it once globally and leave the alias entries credential-free.

Other rules:

  • Read tools accept an instance argument to run a single read against a non-active instance — e.g. sn_query(instance="test", table="incident", ...) or sn_health(instance="test") while dev stays active. Every read tool in your package exposes it in its schema (enum of configured aliases). This is how you peek at another instance's data without restarting.

  • A single write can be routed to a non-active instance, but never silently. Pass instance="test" confirm_instance="test" confirm="approve" (target named twice — as intent and acknowledgement) and the target must have allow_writes=true. Only that one write goes there; the active instance is restored immediately after. A target/confirm mismatch or a read-only target is refused with an explicit message, so a dev/test/prod mix-up cannot land on the wrong instance. The write is then re-read on the target and reported as landed (or WRITE_NOT_LANDED), with target_instance echoed — "success" means the content is confirmed present on the intended instance, not just a 200.

  • list_instances reports configured aliases plus the active one and each one's write flag. compare_instances performs read-only table comparisons across aliases.

  • Switching the default active instance requires restarting the MCP client — it is read once at server startup, not refreshed live. (Per-call instance= routing above does not need a restart.)

Example — shared global login, per-instance write gating:

export MCP_TOOL_PACKAGE=standard
export SERVICENOW_USERNAME=svc_account
export SERVICENOW_PASSWORD='...'
export SERVICENOW_ACTIVE_INSTANCE=dev
export SERVICENOW_INSTANCE_CONFIG='{
  "dev":  { "url": "https://acme-dev.service-now.com",  "allow_writes": true },
  "test": { "url": "https://acme-test.service-now.com", "allow_writes": true },
  "prod": { "url": "https://acme-prod.service-now.com", "allow_writes": false }
}'

To give an instance its own login instead, add the fields to that alias (a ${ENV} reference is resolved, so you can keep secrets out of the JSON):

"prod": { "url": "https://acme.service-now.com", "username": "prod_user", "password": "${SERVICENOW_PROD_PASSWORD}" }

Use compare_instances for dev/test drift checks. For promoting MANY records (especially Service Portal / scoped tables), prefer an Update Set (commit on source, retrieve + commit on target in the UI) over per-record cross-instance writes — it bypasses the per-table/SP ACLs that single Table-API writes hit.

If a tool is not available in your current package, the server tells you which package includes it.

For the full reference (all packages, inheritance details, config syntax): Tool Packages Advanced Guide.


CLI Reference

Server Options

Flag

Env Variable

Default

Description

--instance-url

SERVICENOW_INSTANCE_URL

required

ServiceNow instance URL

--auth-type

SERVICENOW_AUTH_TYPE

basic

Auth mode: basic, oauth, api_key, browser

--tool-package

MCP_TOOL_PACKAGE

standard

Tool package to load

--server-name

SERVICENOW_MCP_SERVER_NAME

ServiceNow

MCP server name advertised to the client

--transport

SERVICENOW_MCP_TRANSPORT

stdio

MCP transport: stdio or http

--http-host

SERVICENOW_MCP_HTTP_HOST

127.0.0.1

Host for --transport http

--http-port

SERVICENOW_MCP_HTTP_PORT

8000

Port for --transport http

--http-path

SERVICENOW_MCP_HTTP_PATH

/mcp

Streamable HTTP endpoint path

--http-allowed-hosts

SERVICENOW_MCP_HTTP_ALLOWED_HOSTS

loopback hosts

Comma-separated Host allowlist for DNS rebinding protection

--http-disable-dns-rebinding-protection

SERVICENOW_MCP_HTTP_DISABLE_DNS_REBINDING_PROTECTION

false

Disable DNS rebinding protection behind trusted network controls

--http-json-response

SERVICENOW_MCP_HTTP_JSON_RESPONSE

false

Return JSON responses instead of SSE streams

--timeout

SERVICENOW_TIMEOUT

30

HTTP request timeout (seconds)

--debug

SERVICENOW_DEBUG

false

Enable debug logging

HTTP transport example:

servicenow-mcp --transport http --http-host 127.0.0.1 --http-port 8000

The MCP endpoint is http://127.0.0.1:8000/mcp; /health returns a lightweight health response.

Telling multiple connections apart (--server-name)

If you register several server entries in one client (dev / stg / prd as separate processes), they all default to the name ServiceNow, so the client disambiguates them by load order — mcp_servicenow, mcp_servicenow2, mcp_servicenow3. That numbering can change between restarts, which makes it untrustworthy for telling which one is production. Name each connection instead:

servicenow-mcp --server-name snow-prd          # uvx / console script
python -m servicenow_mcp --server-name snow-prd # pip

The tool namespace is then pinned to mcp_snow-prd_*. SERVICENOW_MCP_SERVER_NAME does the same thing as an env var, and the flag wins if both are set. Unset, it stays ServiceNow, so existing configs keep working.

Looking to switch instances inside one server instead? That's Multi-Instance Mode, not this. The two are unrelated — --server-name is the name the client sees, while a multi-instance alias names an instance inside a single process.

Basic Auth

Flag

Env Variable

--username

SERVICENOW_USERNAME

--password

SERVICENOW_PASSWORD

OAuth

Flag

Env Variable

--client-id

SERVICENOW_CLIENT_ID

--client-secret

SERVICENOW_CLIENT_SECRET

--token-url

SERVICENOW_TOKEN_URL

--username

SERVICENOW_USERNAME

--password

SERVICENOW_PASSWORD

API Key

Flag

Env Variable

Default

--api-key

SERVICENOW_API_KEY

--api-key-header

SERVICENOW_API_KEY_HEADER

X-ServiceNow-API-Key

Script Execution

Flag

Env Variable

--script-execution-api-resource-path

SCRIPT_EXECUTION_API_RESOURCE_PATH


Keeping Up to Date

Pick the one matching how you installed (the same commands are in the Install section):

# uvx — it caches the last version it downloaded, so --refresh is how you pull a new one
uvx --refresh --with playwright --from mfa-servicenow-mcp servicenow-mcp --version
uvx --with playwright playwright install chromium
# pip
pip install --upgrade mfa-servicenow-mcp playwright
python -m playwright install chromium

Chromium gets refreshed alongside in both cases because a newer Playwright wants a different Chromium build (see below).

After refreshing, restart your MCP client (Claude Code, Cursor, etc.) to load the new version.

Check the current version:

uvx --from mfa-servicenow-mcp servicenow-mcp --version   # uvx
python -m servicenow_mcp --version                       # pip

Why Chromium has to be installed up front

A new Playwright release wants a different Chromium build. Left alone, the first browser tool call has to fetch ~150 MB of browser binaries — which on a slow link blows past the MCP host's handshake timeout and surfaces as:

MCP startup failed: handshaking with MCP server failed: connection closed: initialize response

That's why the upgrade commands above run playwright install chromium every time.

Why we no longer auto-install Chromium inside the MCP server: that download used to run during the first tool call. On a slow link the subprocess outlived the host's handshake deadline and the client reported "connection closed". v1.13.1 changed this — the MCP server now only warns if Chromium is missing. Install it ahead of time (out-of-band, no handshake timer).


Safety Policy

All mutating tools require an explicit confirm='approve' argument.

Rules:

  1. Mutating tools with prefixes such as create_, update_, delete_, remove_, add_, move_, activate_, deactivate_, commit_, publish_, submit_, approve_, reject_, resolve_, reorder_, and execute_ require confirmation.

  2. You must pass confirm='approve'.

  3. Without that parameter, the server rejects the request before execution.

This policy applies regardless of the selected tool package.

What this gate is — and is not. The server enforces confirm='approve' before any write, but the argument is supplied by the same LLM that issued the call. So the gate is an intent checkpoint that stops accidental or ambiguous mutations — it forces a deliberate, auditable "yes" and a preview hint. It is not a defense against a determined or prompt-injected agent, which can simply include confirm='approve'. Treat it as guardrails, not a security boundary: review what a tool will do before approving, run against a least-privilege ServiceNow account, and do not rely on confirmation alone in adversarial settings. For high-stakes automation, add out-of-band approval.

Write Guards

Beyond the confirm gate, every write runs through deterministic guards that block unsafe writes before they reach ServiceNow. The concurrent-edit and duplicate-create checks run after the confirm gate, so an unconfirmed write never touches the network. Each guard fails open on a denied/failed pre-read — it never blocks a legitimate write just because it couldn't look first. The intent is simple: you should never be able to silently clobber a teammate's change — if someone else touched the record, the write stops and tells you, rather than overwriting and moving on.

Fail-open vs fail-closed. The default (fail-open) favors availability: if the pre-write audit read cannot run (network error, ACL denial, 5xx), the write proceeds. That means the concurrent-edit guard can silently no-op exactly when the instance is unreachable. Security-sensitive deployments can set SERVICENOW_WRITE_GUARDS_FAIL=closed so a guard that could not verify blocks instead — trading availability for the guarantee that a lost-update check never silently passes. Scoped to genuine read failures; a successful read that finds no conflict still proceeds.

Guard

Protects against

Override / toggle

Concurrent edit (G3/G8)

Blindly overwriting a record a different user edited within the last 10 min. Covers sn_write, manage_portal_component, and the manage_* update tools — including manage_script_include, manage_flow_designer, manage_workflow, manage_kb_article, manage_portal_layout, and manage_widget_dependency. Decided by a live remote read of sys_updated_by/sys_updated_on — never the local copy.

SERVICENOW_CONCURRENT_EDIT_GUARD=off; window via SERVICENOW_CONCURRENT_EDIT_WINDOW_MIN (default 10); fail-closed via SERVICENOW_WRITE_GUARDS_FAIL=closed

Source push drift (live anchor + update-set HOLD)

Pushing edited source back with update_remote_from_local adds two checks the time-window can't catch: a time-independent compare of the remote's current sys_updated_on against the value recorded at download (catches an overwrite hours or days later), and a live check for the record being held in another user's uncommitted update set.

force=true to push past a detected drift

Duplicate create (G9)

Silently creating a second record with a name that already exists, on tables ServiceNow does not make unique (sys_update_set, wf_workflow, sys_user_group, sys_user).

pass allow_duplicate='true' to create anyway

Flow Designer raw write (G6)

Raw sn_write to sys_hub_* tables that corrupt flow snapshots — forces manage_flow_designer.

Publish-class (G7)

Accidental publish/commit/push — needs a second confirm_publish='approve'.

Cross-instance push

Pushing local source downloaded from instance A into instance B (origin read from _settings.json / _manifest.json).

re-download from the correct instance

Disable the whole layer with SERVICENOW_WRITE_GUARDS=off. In multi-instance mode, every write response also carries an instance_target field (and reads routed elsewhere an instance_source) so the instance a call hit is always visible.

Portal Investigation Safety

Portal investigation tools are conservative by default:

  • search_portal_regex_matches starts with widget-only scanning, linked expansion off, and small default limits.

  • trace_portal_route_targets is the preferred follow-up for compact Widget -> Provider -> route target evidence.

  • download_portal_sources does not pull linked Script Includes or Angular Providers unless explicitly requested.

  • Large portal scans are capped server-side and return warnings when the request exceeds safe defaults.

Pattern matching modes:

Mode

Behavior

auto (default)

Plain strings treated literally, regex-looking patterns remain regex

literal

Always escape the pattern first; safest for route/token strings

regex

Use only when you intentionally need regex operators


Performance Optimizations

The server includes several layers of performance optimization to minimize latency and token usage.

Serialization

  • orjson backend: All JSON serialization uses json_fast (orjson when available, stdlib fallback). 2-4x faster than stdlib json for both loads and dumps.

  • Compact output: Tool responses are serialized without indentation or extra whitespace, saving 20-30% tokens per response.

  • Double-parse avoidance: serialize_tool_output detects already-compact JSON strings and skips re-serialization.

Caching

  • OrderedDict LRU cache: Query results are cached with O(1) eviction using OrderedDict.popitem(). 256 max entries, 30-second TTL (600s for stable metadata: schema/scope/choice tables), thread-safe.

  • Tool schema cache: Pydantic model_json_schema() output is cached per model type, avoiding repeated schema generation.

  • Lazy tool discovery: Only tool modules required by the active MCP_TOOL_PACKAGE are imported at startup. Unused modules are skipped entirely.

Network

  • Browser-grade TLS by default: The HTTP layer routes through curl_cffi with a Chrome impersonation profile (chrome120 by default), so the TLS handshake is byte-for-byte like a real browser — instances behind Cloudflare/Akamai or JA3 bot-detection that reject stock Python requests work with no extra config. Opt out with SERVICENOW_TLS_IMPERSONATE=off.

  • Session keep-alive (browser auth): While you're actively working, a background thread pings the instance every 5 minutes with the same lightweight probe the restore path uses, so ServiceNow's sliding idle timeout never kills the session between tool calls — no more surprise MFA windows after a lunch break. It never opens a browser (a dead session just waits for the next real call to re-auth), stops after 6 hours without real activity, and is tunable via SERVICENOW_SESSION_KEEPALIVE=off, SERVICENOW_SESSION_KEEPALIVE_INTERVAL_S (default 300, min 60), and SERVICENOW_SESSION_KEEPALIVE_MAX_IDLE_S (default 21600).

  • HTTP session pooling: Persistent session with TCP keep-alive and gzip/deflate compression (60-80% payload reduction on large JSON). The stock-requests opt-out path mounts a 20-connection HTTPAdapter.

  • Parallel pagination: sn_query_all fetches the first page sequentially for total count, then retrieves remaining pages concurrently via ThreadPoolExecutor (up to 4 workers).

  • Persistent debug-browser connection: The shared debug window is driven over one long-lived worker thread that owns the Playwright driver and a per-endpoint CDP connection, instead of spawning a driver subprocess and a fresh websocket on every tool call. Measured against a real Chromium: ~2ms per warm call vs ~750ms under the old per-call model. A cached connection is revalidated against the window's own DevTools endpoint before every reuse — a killed window reconnects instead of answering from a stale handle.

  • Dynamic page sizing: When remaining records fit in a single page (<=100), the page size is enlarged to avoid extra round-trips.

  • Batch API: sn_batch combines multiple REST sub-requests into a single /api/now/batch POST, with automatic chunking at the 150-request limit.

  • Parallel chunked M2M queries: Widget-to-provider M2M lookups split into 100-ID chunks are executed concurrently rather than sequentially.

Schema & Startup

  • Shallow-copy schema injection: Confirmation schema (confirm='approve') is injected via lightweight dict copy instead of copy.deepcopy, reducing list_tools overhead.

  • No-count optimization: Subsequent pagination pages use sysparm_no_count=true to skip server-side total count computation.

  • Payload safety: Heavy tables (sp_widget, sys_script, etc.) have automatic field clamping and limit restrictions to prevent context window overflow.

Local Source Audit

Download and analyze your entire ServiceNow application locally — no repeated API calls, no context waste.

Step 1: download_app_sources(scope="x_company_app")    → All server-side code + cross-scope deps to disk
Step 2: audit_local_sources(source_root="temp/...")     → Analysis + HTML report

Step 1 runs auto_resolve_deps=True by default: after the in-scope download it scans every .js/.html/.xml file and fetches any referenced sys_script_include, sp_widget, sp_angular_provider, or sys_ui_macro records not already in the bundle — no matter what scope they live in. Pulled deps are saved into the same tree with "is_dependency": true in their _metadata.json, so the audit in Step 2 sees the complete call graph. Set auto_resolve_deps=False if you only want in-scope records.

Tip — pull a whole scope, including global: pass scope="global" to dump every global-scope record, or keep your app scope and let auto_resolve_deps reach into global for the records you actually reference. Either way the local bundle is self-contained, so analysis runs entirely offline against disk.

Incremental Sync

Re-downloading a large app on every run is slow and risks timeouts. Pass incremental=True to fetch only what changed since the last download — like git pull instead of a fresh clone. Works on both download_app_sources and download_portal_sources.

download_app_sources(scope="x_company_app")                      # 1st run: full download
download_app_sources(scope="x_company_app", incremental=True)    # later: changed records only
  • How it works: the first download records each record's sys_updated_on into _sync_meta.json. On an incremental run, every source family queries sys_updated_on >= <latest seen> (server-side timestamps, no clock skew), re-downloads just those records, and leaves unchanged local files untouched.

  • Deletions: timestamp deltas can't see deleted records. Add reconcile_deletions=True to list records present locally but gone on the instance — reported as warnings under deletion_candidates, never deleted automatically.

  • First run / no prior data: falls back to a full download automatically.

  • Run a full (non-incremental) download periodically to stay fully in sync.

Download Safety & Completeness

The download is the source of truth for offline analysis, so it is built to be deterministic and to never look complete when it isn't:

  • Scope auto-resolution. Pass the app namespace (x_company_app), its display name ("My App"), or a sys_scope sys_id — all resolve to the canonical namespace, so the local folder (temp/<instance>/<namespace>/) and every query are identical every run. The resolved value is echoed as scope_resolution.

  • No silent caps. If a source family hits max_records_per_type, it is flagged loudly: a per-family capped: true in source_types, the family in incomplete_types, and a top-level complete: false. A truncated download can never masquerade as a full one.

  • Cross-instance / stale guards. Pushing back (update_remote_from_local) checks the local tree's recorded origin against the connected instance; a resume re-download that keeps a stale local copy preserves the real sync watermark and warns instead of hiding the drift.

  • Relationship metadata at download time. Widget→Angular-Provider edges (_graph.json) and widget→CSS/JS-dependency edges (_dependency_graph.json) are captured from the live M2M tables during the portal download — analysis reads the real graph instead of guessing from code.

  • Transitive dependency depth. Cross-scope deps resolve 2 passes deep by default (conservative). Raise with SERVICENOW_DEP_MAX_DEPTH (clamped to 1–6) to chase longer A→B→C→D chains.

  • One-call graph build. Pass build_graph=True to download_app_sources to run the offline relationship audit right after the download — no extra API cost.

  • Create → local sync nudge. When you create a widget/page on the instance and a local tree exists for that scope, the create response adds a local_out_of_sync message with the exact download_portal_sources(...) command to pull the new record into local. It never writes local files for you.

What Gets Generated

File

Purpose

_audit_report.html

Self-contained dark-theme HTML report — open in browser

_cross_references.json

Who calls who — Script Include chains, GlideRecord table refs

_graph.json

Authoritative widget→Angular Provider edges from the live M2M (not text-guessed)

_dependency_graph.json

Authoritative widget→CSS/JS dependency edges from m2m_sp_widget_dependency

_page_graph.json

Page→widget placements derived locally from sp_instance (no API call)

_orphans.json

Dead code candidates — unreferenced SIs, unused widgets

_execution_order.json

Per-table BR/CS/ACL execution sequence with order numbers

_domain_knowledge.md

Auto-generated app profile — table maps, hub scripts, warnings

_schema/*.json

Field definitions for every referenced table

_sync_meta.json

Per-family sys_updated_on watermark powering incremental sync

Individual Download Tools

Use the orchestrator for a full dump, or download_server_sources for a targeted single-family refresh:

Tool

Sources

download_app_sources

Full app dump (all families + portal + schema + cross-scope deps)

download_portal_sources

Widgets, Angular Providers, linked Script Includes

download_server_sources (families=)

Targeted refresh — script_includes, server_scripts (BR/Client/Catalog Client), ui (Actions/Scripts/Pages/Macros), api (Scripted REST/Processors), security (ACLs, script-only by default), admin (Fix Scripts/Scheduled Jobs/Script Actions/Notifications/Transforms)

download_table_schema

sys_dictionary field definitions

All downloads write full source to disk with zero truncation. Only a summary is returned to the LLM context.


Skills

Tools are raw API calls. Skills are what make your LLM actually useful — verified pipelines with safety gates, rollback, and context-aware sub-agent delegation. MCP server + skills is the complete setup for LLM-driven ServiceNow automation.

4 skills today, more coming with every release.

Tools Only

Tools + Skills

Safety

LLM decides

Gates enforced (diff → preview → confirm → apply)

Tokens

Source dumps in context

Delegate to sub-agent, summary only

Accuracy

LLM guesses tool order

Verified pipeline

Rollback

Might forget

Server-side version history (ServiceNow Versions tab / update sets)

Install Skills

# Claude Code
uvx --from mfa-servicenow-mcp servicenow-mcp-skills claude

# OpenAI Codex
uvx --from mfa-servicenow-mcp servicenow-mcp-skills codex

# OpenCode
uvx --from mfa-servicenow-mcp servicenow-mcp-skills opencode

# Antigravity
uvx --from mfa-servicenow-mcp servicenow-mcp-skills antigravity

The installer downloads the skill files from this repository's skills/ directory and places them in a project-local LLM directory. No authentication or configuration needed.

If servicenow-mcp-skills is blocked by security policy on Windows, call it as a module instead — same behavior:

python -m servicenow_mcp.setup_skills claude

Client

Install Path

Auto-Discovery

Claude Code

.claude/commands/servicenow/

/servicenow slash commands appear on next startup

OpenAI Codex

.codex/skills/servicenow/

Skills loaded on next agent session

OpenCode

.opencode/skills/servicenow/

Skills loaded on next session

Antigravity

.gemini/antigravity/skills/servicenow/

Skills activated on next session

How it works: Each skill is a standalone Markdown file with YAML frontmatter (metadata) and pipeline instructions. The LLM client reads these files from the install path and exposes them as callable commands or skill triggers.

Update: Re-run the same install command — it replaces all existing skill files (clean install, no merge).

Remove skills only: delete the skill install directory manually (for example rm -rf .claude/commands/servicenow/).

Skill Categories

Category

Skills

Purpose

analyze/

1

local source audit — cross-references, dead code, execution order, HTML report

explore/

1

flow trigger tracing — which workflows/flows fire when a table changes

manage/

2

app source download, local sync (diff → push with conflict detection)

Skill Metadata

Each skill includes metadata that helps LLMs optimize execution:

context_cost: low|medium|high    # → high = delegate to sub-agent
safety_level: none|confirm|staged # → staged = mandatory diff/preview/apply
delegatable: true|false           # → can run in sub-agent to save context
triggers: ["위젯 분석", "analyze widget"]  # → LLM trigger matching

For the full skill reference, see skills/SKILL.md.

MCP Resources (Built-in Skill Guides)

Skills are also exposed as MCP resources directly from the server — no client-side installation required. Any MCP-compliant client can discover and read them on demand.

# List available skill guides
list_resources → skill://manage/local-sync, skill://manage/app-source-download, ...

# Read a specific guide
read_resource("skill://manage/local-sync") → full pipeline with safety gates

Tools that have a matching skill guide show a → skill://... hint in their description. The guide content is pull-based — zero token cost until the client actually reads it.

Feature

Client-side Skills

MCP Resources

Availability

Requires install command

Built-in, any client

Token cost

Loaded by client

Pull on demand (0 until read)

Discovery

Slash commands / triggers

list_resources

Best for

Power users, slash commands

Universal guidance

Docker

API Key auth only (MFA browser auth requires GUI, not available in containers).

docker run -it --rm \
  -e SERVICENOW_INSTANCE_URL=https://your-instance.service-now.com \
  -e SERVICENOW_AUTH_TYPE=api_key \
  -e SERVICENOW_API_KEY=your-api-key \
  ghcr.io/jshsakura/mfa-servicenow-mcp:latest

See Client Setup Guide for local build options.

Developer Setup

If you want to modify the source locally:

git clone https://github.com/jshsakura/mfa-servicenow-mcp.git
cd mfa-servicenow-mcp

uv venv
uv pip install -e ".[browser,dev]"
uvx --with playwright playwright install chromium

Running Tests

uv run pytest

Linting & Formatting

uv run black src/ tests/
uv run isort src/ tests/
uv run ruff check src/ tests/
uv run mypy src/

Building

uv build

Windows: see Windows Installation Guide


Documentation


  • This repository includes tools consolidated and refactored from earlier internal / legacy ServiceNow MCP implementations. The current surface is organized around bundled manage_* tools (see tool_utils.py).

  • This project is focused on safe, diff-first MCP server use cases: every write goes through confirm + write-guards (concurrent-edit, duplicate-create, publish, Flow Designer), and source edits are diffed against the live remote before they are pushed.


License

Apache License 2.0

Available Tools

32 tools
analyze_widget_performanceC

Analyze widget performance — code patterns, transaction logs, provider usage. Returns findings with severity.

ParametersJSON Schema
NameRequiredDescriptionDefault
page_idNoOptional page id to correlate with transaction logs
timeframeNoTime window: last_hour, last_24h, last_7dlast_7d
widget_idYesWidget sys_id, id, or name to analyze
analysis_depthNoAnalysis depth: quick, standard, deepstandard
max_script_lengthNo
min_response_time_msNo
include_script_includesNo
include_angular_providersNo
include_auto_fix_suggestionsNo

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states it analyzes and returns findings, but fails to mention whether it is read-only, has side effects, requires specific permissions, or produces irreversible changes. The description is insufficient for an agent to understand the tool's behavioral footprint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two sentences and front-loads the core purpose. However, it could be slightly more informative without being verbose. Still, it earns a high score for minimal wordiness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 9 parameters, no output schema, and many sibling tools, the description lacks completeness. It does not explain the output format, severity levels, or how to use parameters like analysis_depth. The agent would struggle to invoke this tool effectively without additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 44%, meaning 5 out of 9 parameters lack descriptions in the schema. The tool description adds no parameter-level information beyond what is in the schema. It does not explain the meaning or impact of analysis_depth, max_script_length, or other parameters, leaving the agent with incomplete understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'analyze' against 'widget performance' and specifies distinct analysis areas (code patterns, transaction logs, provider usage). It mentions the return type (findings with severity). This effectively distinguishes it from sibling tools that involve downloading or managing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives. With over 20 sibling tools including audit_local_sources, sn_query, and various diagnostic tools, the description fails to provide any usage context or exclusion criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

audit_local_sourcesA

Analyze downloaded sources locally (no API). Generates cross-ref graph, dead code, HTML report.

ParametersJSON Schema
NameRequiredDescriptionDefault
output_fileNoPath for the HTML report. Defaults to <source_root>/_audit_report.html
source_rootYesdownload_app_sources output dir, under temp/<instance>/<scope>.

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, description must bear full behavioral disclosure. It describes outputs but does not clarify if the tool modifies sources, error behavior, or performance characteristics. Lacks detail on side effects or safety profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two-sentence description is concise and front-loaded with purpose and key outputs. No unnecessary words; every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Description covers basic purpose and outputs but lacks detail on report content, cross-ref graph specifics, and dead code detection scope. Given no output schema and simple parameters, more completeness would be beneficial.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and parameter descriptions are present. Description does not add meaning beyond the schema; it provides context that source_root is a download output dir, but that's already in the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states specific verb 'Analyze' and resource 'downloaded sources', and lists deliverables: cross-ref graph, dead code, HTML report. It distinguishes from siblings by noting 'locally (no API)', making purpose clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Description mentions 'locally (no API)', implying use after downloading, but does not specify when to use this tool versus siblings like query_local_graph or extract_table_dependencies. No explicit guidance on prerequisites or alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

diff_local_componentA

Diff local edits vs remote (or compare_to root); verdict=True status-only, refresh=True fast-forwards.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesLocal file, widget dir, or download root (file→diff, root→summary).
refreshNoFast-forward clean local files to the live server body; edits kept.
verdictNoStatus-only: verdict + changed-line counts, no diff bodies; dirs scan all.
compare_toNo2nd download root to diff against instead of remote (dev-vs-test, no network).
context_linesNoNumber of context lines in unified diff output (default 3)

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It discloses that refresh fast-forwards clean local files from server while keeping edits. Also mentions verdict returns counts only. Does not detail network usage or permissions, but main behavioral traits are covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is a single sentence that conveys the main purpose and two key modes. It is front-loaded and avoids redundancy, though slightly dense. Every part adds information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, so description must inform about return values. It describes verdict mode output ('verdict + changed-line counts') but does not describe normal diff output (presumably unified diff). Missing details on context_lines effect and overall structure. Adequate but incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, baseline 3. Description adds meaning beyond schema: clarifies that path behavior differs by type (file→diff, root→summary), explains verdict and refresh modes, and usage of compare_to. This adds value to the schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool diffs local edits vs remote or a compare_to root, with specific modes for verdict and refresh. The verb 'diff' and resources are explicit, and it distinguishes from siblings (no direct diff sibling).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Description provides guidance for different parameter values (verdict=True for status-only, refresh=True for fast-forward, compare_to for offline diff). It doesn't explicitly state when not to use or compare to siblings, but context shows no similar tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

download_app_sourcesC

FULL/all source of an app scope to disk (all groups+deps). scope REQUIRED — ask user. Step 1, not portal.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeYesREQUIRED app namespace (x_...) or app name. Ask the user if not given.
resumeNoSkip stages a prior timed-out call finished. false = download everything again.
page_sizeNo
backgroundNoRun in background; call again (same args) to poll progress, then result.
output_dirNoOmit — default path is canonical and reused. Set only for one-off export.
build_graphNoAlso run the offline audit (relationship graphs) after download. No API cost.
incrementalNoRe-download only records changed since last sync (sys_updated_on).
only_activeNo
include_schemaNo
acl_script_onlyNo
auto_resolve_depsNoAfter download, fetch missing cross-scope SI/widget/provider/ui_macro deps.
reconcile_deletionsNoWarn about local records deleted on the instance. No auto-delete.
max_records_per_typeNo
include_widget_sourcesNo

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the full behavioral burden. It only says source is downloaded to disk; it does not mention long-running/background behavior, where files are written, how resume interacts with prior runs, or whether any instance state is modified.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very short and front-loaded with the essential action. Minor redundancy in 'FULL/all' and the cryptic 'not portal' phrase are the only detractions.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 14 parameters, no annotations, and no output schema, this description is far too thin. It does not explain invocation flow, background polling, output location, or parameter interactions, so an agent would struggle to call it correctly beyond providing the required scope.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 57%, so the description should compensate for undocumented parameters. It only repeats that scope is required, which the schema already states, and provides no help for the six undocumented parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('download ... source of an app scope to disk') and defines the scope granularity ('all groups+deps'). It stops short of a 5 because 'not portal' only hints at differentiation from download_portal_sources without explicitly naming the alternative scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Step 1' gives weak workflow context, but the description never states when to choose this tool over alternatives or when not to use it. 'not portal' is a vague exclusion rather than actionable guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

download_attachmentC

Download attachments. Use saved_path locally; read the ResourceLink remotely when needed.

ParametersJSON Schema
NameRequiredDescriptionDefault
tableNo
recordNoParent record: sys_id or display number (e.g. INC0010023).
filenameNoOverride saved name (single file only). Default: real file_name.
output_dirNoSave dir. Default: ./temp/<instance>/attachments/
max_size_mbNo
download_allNoIf the record has many attachments, fetch all (else list them).
attachment_sys_idNosys_attachment sys_id. Omit to resolve via table+record.

TDQS

C2.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and largely fails: no mention of auth/permission requirements, no indication of what saved_path or ResourceLink actually are, no disclosure of whether many-attachment records list or fetch, and no default-path expectations despite the schema defaulting to ./temp/<instance>/attachments/.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, appropriately sized and front-loaded with the core action. However, the second sentence spends its length on undefined concepts instead of earning its place with usable detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter tool with no annotations and no output schema, the description is far too thin. It omits the sourcing model (table+record vs attachment_sys_id), the list-vs-download behavior, and what the caller receives, none of which are covered by structured fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 71% and the schema itself documents record, filename, output_dir, download_all, and attachment_sys_id well. The description adds no parameter meaning and instead introduces 'saved_path' and 'ResourceLink' — terms that correspond to no schema property, so it confuses rather than informs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (download attachments), but never says from where (ServiceNow records) or which attachments beyond a vague 'attachments'. It competes with siblings like export_record_xml and download_app_sources without any distinguishing scope, leaving the agent to infer from the schema that this is record-attachment retrieval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The second sentence gestures at local-vs-remote usage ('Use saved_path locally; read the ResourceLink remotely'), but neither term maps to any parameter or sibling tool, so it gives no actionable when-to-use guidance. It also never mentions the download_all/attachment listing branch as a selection criterion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

download_portal_sourcesC

Targeted portal widgets/providers. Whole app: download_app_sources. widget_ids=one widget.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoScope namespace (x_app) or app name; auto-resolved to the namespace.
page_sizeNo
output_dirNoOmit — default path is canonical and reused. Set only for one-off export.
widget_idsNoOptional list of widget sys_id/id/name. If empty, exports all widgets in scope.
incrementalNoRe-download only records changed since last sync. Full-scope only.
max_widgetsNo
include_widget_cssNo
reconcile_deletionsNoWarn about local records deleted on the instance. No auto-delete.
include_widget_templateNo
include_widget_link_scriptNo
include_widget_client_scriptNo
include_widget_server_scriptNo
include_linked_script_includesNo
include_linked_angular_providersNo

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. The description is very minimal, only hinting at targeted download behavior. It does not disclose whether downloads are destructive, authentication needs, rate limits, or any other behavioral traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise with two short sentences. The first sentence is vague, and the second provides a contrast with a sibling and a parameter hint. While brevity is good, it sacrifices clarity and completeness. The structure is front-loaded but not efficient in conveying key information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of 14 parameters, no output schema, and no annotations, the description is severely incomplete. It fails to explain default behaviors, the effect of boolean flags, what the output looks like, or any usage context. The tool is not adequately described for an AI agent to use it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 36%, meaning most parameters lack schema descriptions. The tool description adds minimal value by hinting that widget_ids specifies a single widget. For other parameters like scope, output_dir, incremental, reconcile_deletions, the schema already has descriptions, but the tool description does not add further meaning. The remaining 9 parameters with no schema descriptions receive no help from the tool description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Targeted portal widgets/providers' which, combined with the name, implies downloading specific widgets. It distinguishes from 'download_app_sources' for whole app downloads. However, the verb 'download' is not explicitly stated in the description, relying on the name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions when to use this tool (targeted) versus download_app_sources (whole app), providing one key distinction. However, it does not provide any other usage guidance, such as prerequisites, when not to use it, or how to choose among the many sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_record_xmlB

Build deploy XML from the LIVE server — the only legal source. Issues an origin cert. Read saved_path.

ParametersJSON Schema
NameRequiredDescriptionDefault
namesNoAdvanced: raw <table>_<sys_id> names, for a cross-table file.
tableNo
sys_idsNosys_ids to export. Combined with table into update names.
output_dirNoSave dir (auto filename). Default: ./temp/<instance>/xml/
output_pathNoExact .xml file to write. Overrides output_dir.

TDQS

B3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description bears the full burden of disclosing side effects. It mentions 'Issues an origin cert' (a potential side effect) and 'Read saved_path' (unclear output behavior), but it does not explain whether the operation is destructive, whether it writes files, or what the origin certificate implication is. This is too vague.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short (three sentences) and front-loads the main purpose, but 'Read saved_path' is cryptic and does not earn its place without further context. It is concise but not effectively structured, as the last sentence is confusing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 5 parameters, no required ones, no output schema, and no annotations, the description leaves too much ambiguity about how to invoke the tool. It does not clarify the roles of the parameters, the 'origin cert' behavior, or what 'saved_path' refers to. A more complete description is needed for practical use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 80% (4 of 5 parameters described), so the schema carries the meaning. The description does not add parameter-specific detail; in fact, it references 'saved_path' which is not a parameter, potentially confusing the agent. Baseline 3 is appropriate because the schema covers most parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear action ('Build deploy XML') on a specific resource ('the LIVE server') and adds a distinguishing constraint ('the only legal source') that separates it from local/alternative tools. However, it does not name sibling tools, so it falls just short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'the only legal source' gives implicit guidance that this tool should be used for deploy XML from live, not local sources. But it does not explicitly mention alternatives or when not to use it. 'Read saved_path' is an instructional hint but unrelated to usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

extract_table_dependenciesC

GlideRecord table dependency graph from server scripts (SI/BR/widgets). Pass widget_id for one widget.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNoApp scope filter (sys_scope), e.g. x_company_bpm
page_sizeNo
widget_idNoLimit to ONE widget (sys_id/id/name). Omit for a scope-wide scan.
only_activeNo
include_widgetsNo
include_business_rulesNo
max_records_per_sourceNo
include_loose_literal_scanNo
max_linked_script_includesNo
include_linked_script_includesNo

TDQS

C2.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the full burden falls on the description. It does not disclose if the tool is read-only, performance implications, required permissions, or the format of the output. The term 'dependency graph' is vague and does not explain what response to expect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, making it concise, but it is too brief given the tool's complexity (10 parameters). It lacks structure and does not front-load critical information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 10 parameters, no annotations, and no output schema, the description is severely incomplete. It does not explain the output format, scope-wide vs. widget-specific behavior, or limitations. The tool is underspecified for effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is very low (20%), with only scope and widget_id having descriptions. The description adds no extra meaning for the remaining 8 parameters, such as include_loose_literal_scan or max_records_per_source. With low coverage, the description should compensate but fails to do so.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it extracts a 'GlideRecord table dependency graph' from server scripts like Script Includes, Business Rules, and widgets. The mention of 'widget_id' hints at a specific scope. However, it does not differentiate from sibling tools like sn_discover or query_local_graph, which may have overlapping functionality.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides minimal guidance: it mentions passing a widget_id for a single widget, but omitting it implies a scope-wide scan. There is no explicit when-to-use or when-not-to-use, nor any comparison to alternative tools listed as siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_developer_changesB

List developer's recent changes across portal tables. Metadata only, use count_only first.

ParametersJSON Schema
NameRequiredDescriptionDefault
scopeNosys_scope filter
orderbyNoOrder by field-sys_updated_on
developerYessys_updated_by value
filter_byNoFilter mode: updated_by | created_byupdated_by
count_onlyNo
source_typesNoSource types: widget|angular_provider|script_include|ui_script|business_rule
updated_afterNosys_updated_on >= (YYYY-MM-DD)
updated_beforeNosys_updated_on <= (YYYY-MM-DD)
limit_per_tableNoMax records per source type

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must fully disclose behavior. It mentions 'Metadata only' and 'count_only first' but lacks details on side effects, auth, rate limits, or pagination. Inadequate for a tool with 9 parameters.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with purpose, no wasted words. Highly concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 9 parameters, no output schema, and no annotations, the description is too sparse. It lacks information on return structure, error handling, and detailed behavior for a complex tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 89%, so baseline is 3. The description does not add meaning beyond what the schema provides for individual parameters; it only gives overall context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List developer's recent changes across portal tables' with a specific verb and resource, and adds 'Metadata only' to clarify scope. However, it does not explicitly differentiate from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides some guidance with 'use count_only first' implying a workflow, and 'Metadata only' hints at when to use. But no explicit when-not-to-use or alternatives among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_logsC

Query ServiceNow logs. log_type: system/journal/transaction/background. Max 20 rows.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNo[background] Execution name LIKE
levelNo[system] error|warning|info|debug
limitNo
queryNo
stateNo[background] running|complete|cancelled
tableNo
offsetNo
sourceNo[system/background] Source LIKE
containsNoText search (message/value)
log_typeYesLog type
timeframeNoTime filterlast_24h
created_byNo[journal/transaction] User filter
field_nameNo[journal] work_notes|comments
url_containsNo[transaction] URL LIKE
record_sys_idNo[journal] Record sys_id
max_text_lengthNo
response_statusNo[transaction] HTTP status
min_response_time_msNo

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description bears full responsibility. It only discloses a maximum of 20 rows, but omits other behaviors like read-only nature, auth requirements, rate limits, or pagination behavior (despite having offset parameter). The description is minimally transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (two sentences), front-loads the verb and resource, and avoids fluff. However, it could be better structured to clearly list log types and constraints. Overall, it earns its place without being verbose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of 18 parameters and no output schema or annotations, the description is incomplete. It does not explain return values, how parameters interact, or error conditions. The schema covers parameter details but lacks overall context, making it insufficient for an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67%, so many parameters are already documented. The tool description adds no additional meaning beyond the schema; it only mentions log_type. With high coverage, the baseline of 3 is appropriate as the description does not compensate for uncovered parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool queries ServiceNow logs and lists log types (system/journal/transaction/background). It specifies the resource and action, but does not differentiate from sibling tools like sn_query or sn_aggregate, which could also query log data. The purpose is clear but lacks sibling distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool vs alternatives. It mentions a max row limit, but does not explain contexts (e.g., real-time vs historical) or when not to use it. No explicit when/when-not information is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_metadata_sourceB

Get one source record (SI/BR/widget) by name/sys_id. Returns body; 'complete' flags if truncated preview.

ParametersJSON Schema
NameRequiredDescriptionDefault
source_idYessys_id, name, or logical identifier
source_typeYesSpecific source type (not 'all').
max_field_lengthNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that it returns body and a 'complete' flag for truncated preview, but omits details on permissions, error handling, and the effect of max_field_length on truncation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences effectively convey the purpose and a key behavioral detail without wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequate for a simple retrieval tool but lacks details on parameter effects, error responses, and how to interpret the 'complete' flag.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 67% of parameters with descriptions; the tool description adds nothing about parameters and does not compensate for the missing max_field_length description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it retrieves one source record by name/sys_id, with examples (SI/BR/widget), distinguishing it from more specific sibling tools like get_widget_instance or get_page.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives; the description only states what it does without indicating appropriate contexts or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_pageA

Get or list portal pages by URL path, title, or sys_id. Returns layout tree with widget placements.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryNo
offsetNo
page_idNosys_id or URL path (id). Set → page detail+layout; omit → list pages.
include_layoutNo

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so description carries full burden. It discloses the read-only nature (get/list) and output format (layout tree), but lacks information on error handling, permissions, or rate limits. Adequate but not detailed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no redundancy. The first sentence front-loads the action and key filtering methods. Every word adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 5 parameters and no output schema, the description covers the main parameter and output type. It lacks details on pagination (limit/offset) and the query parameter. Sufficient for a simple tool but could be more complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is low (20% for page_id). The description adds meaning by explaining that page_id accepts sys_id or URL path and toggles between detail and list mode. However, other parameters (limit, query, offset) are not elaborated.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: getting or listing portal pages by URL path, title, or sys_id, and returning a layout tree with widget placements. It distinguishes itself from sibling tools that deal with widgets, code, or other entities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use (to retrieve page layout), but does not explicitly mention when not to use or provide alternative tools for similar tasks. No exclusions or guidance on context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_portal_component_codeB

Fetch widget/provider/SI fields. Returns full body by default. Never chunk for analysis.

ParametersJSON Schema
NameRequiredDescriptionDefault
tableYes
fieldsNo
sys_idYes
script_offsetNoRare: only when fetch_complete=False. Leave 0 for normal use.
fetch_completeNoDefault True: full body in one call. False only for >12KB single-field reads.
script_max_lengthNoRare: chunk size when fetch_complete=False. Leave default unless field >12KB.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the full burden. It discloses a key behavioral trait ('Returns full body by default' and 'Never chunk for analysis'), which is valuable. However, it omits details like response format, error conditions, or required permissions, leaving gaps for a 6-parameter tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with front-loaded action. No wasted words. However, the brevity sacrifices important details, making it efficient but slightly under-informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 6 parameters, no output schema, and no annotations, the description is too sparse. It does not explain return values, error handling, or integration with other tools, leaving the agent under-informed for effective invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50%; description adds minimal value beyond what the schema already provides. The description only implicitly covers 'fields' via 'Fetch widget/provider/SI fields', but does not explain 'table', 'sys_id', or 'script_offset' beyond what is in the schema. For parameters without schema descriptions, the description is silent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly specifies the action ('Fetch') and resource ('widget/provider/SI fields'), and distinguishes default behavior ('full body by default'). While not explicitly differentiating from all siblings, the description implies this tool is for fetching code fields, which is a distinct purpose among the listed siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear negative guideline ('Never chunk for analysis'), but lacks positive when-to-use context or direct comparison to alternatives. The agent is not told when to prefer this over siblings like search_server_code or get_widget_instance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_widget_bundleC

Fetch full widget bundle (HTML, scripts, providers, CSS/JS dependencies) in one call. Analysis starting point.

ParametersJSON Schema
NameRequiredDescriptionDefault
widget_idYesThe sys_id or name of the widget
include_providersNo
include_dependenciesNo

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, and the description does not disclose behavioral traits such as read-only nature, required permissions, or side effects. For a fetch operation, it should at minimum indicate it is a read action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence with no wasted words. However, it could be more structured (e.g., bullet points) to improve scanability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 3 parameters, no output schema, and no annotations, the description is incomplete. It does not explain the response format, error conditions, or how the bundle components relate, making it insufficient for complex tool usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 33% with only widget_id described. The description does not explain the boolean parameters (include_providers, include_dependencies) or their defaults, leaving ambiguity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool fetches a full widget bundle including HTML, scripts, providers, and dependencies, and positions it as an analysis starting point. However, it does not explicitly distinguish from sibling tools like 'get_widget_instance'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use versus alternatives (e.g., get_widget_instance). Only mentions 'analysis starting point' which implies initial investigation but lacks explicit when/when-not instructions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_widget_instanceB

Get widget instance placement on a page. Returns column, order, and config. Filter by page or widget.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
page_idNoFilter by page sys_id (list mode)
widget_idNoFilter by widget sys_id — find all placements (list mode)
instance_idNosys_id of the widget instance. Set → detail; omit → list instances.

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description alone must disclose behavioral traits. It only states that the tool returns data (column, order, config) without mentioning side effects, authorization requirements, rate limits, or destructiveness. For a read operation, this is minimally acceptable but incomplete—e.g., it does not confirm that the operation is non-destructive or requires certain permissions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise at two sentences, front-loaded with the action and key details. It avoids unnecessary fluff. It could be slightly more structured, but it effectively communicates the core purpose without verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 5 parameters, no output schema, and no annotations, the description is adequate but not thorough. It covers the primary functionality and filter options but lacks details on parameter defaults (e.g., limit default 20), pagination behavior, error cases, or what the returned data structure looks like. For a simple retrieval tool, this is minimally viable but leaves room for improvement.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 60% (3 of 5 parameters have descriptions). The description adds context for page_id and widget_id by stating 'Filter by page or widget,' and clarifies instance_id's role in list vs. detail mode. However, limit and offset remain undocumented in both the schema and description, leaving their purpose implicit. The description adds moderate value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Get'), the resource ('widget instance placement'), and what it returns ('column, order, and config'). It also mentions filtering by page or widget, making the tool's purpose unambiguous and distinct from sibling tools like get_widget_bundle or analyze_widget_performance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a basic clue on usage ('Filter by page or widget') but does not explicitly state when to use this tool versus alternatives, nor does it mention when not to use it. Sibling tools such as get_widget_bundle or analyze_widget_performance could serve different purposes, but no comparison is made. More guidance would improve clarity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_tool_packagesB

Lists available tool packages and the currently loaded one.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure but only states the basic action. No details about side effects, authentication, or output behavior are provided.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence of 11 words with no filler. Every word earns its place, making it concise and effectively front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of output schema and complexity, the description is minimally adequate. It states the purpose but omits details like return format or package identification, which could improve completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description adds meaning by specifying that it lists available packages and the currently loaded one, which is helpful context beyond the empty schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists tool packages and the currently loaded one, using a specific verb and resource. However, it does not differentiate from sibling tools that also perform listing operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. No context or exclusions are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_flow_designerB

Flow Designer read/edit: action inputs, trigger/branch conditions, add_branch (clone a branch). Publish via action='publish' (needs confirm + confirm_publish). (confirm='approve')

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryNo
scopeNoScope namespace
actionYesWrites (checkout/set_*/add_branch/save/publish/activate/deactivate/copy/update) need browser auth; rest are reads.
offsetNo
confirmYes
flow_idNoFlow sys_id; get_detail also accepts flow_name instead
node_idNoAction/logic/trigger instance id; on get_detail reads that ONE step in full
flow_nameNoFlow name: get_detail exact/contains lookup, or executions filter
flow_typeNoflow (default) | subflow | all | action | playbook | decision
action_refNoAction sys_id/name; discover via action=list with flow_type=action
context_idNoExecution sys_id (sys_flow_context)
count_onlyNo
exec_stateNoComplete/Error/Waiting/Cancelled/In Progress
trace_pillNoTrace data pill through flow
errors_onlyNo
flow_statusNoStatus: Draft/Published/etc
name_filterNoName contains-match
source_recordNoSource record display value
summary_formatNoCompact format; False = raw JSON
confirm_publishNo
include_inactiveNo
include_triggersNo
include_versionsNo
include_structureNo
include_subflow_treeNo
include_executions_summaryNo

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the transparency burden and does disclose the mutation/edit nature, the publish confirmation requirement, and the clone behavior of add_branch. However, it omits side effects, browser-auth requirements for writes, and reversibility details; some of this is available in the schema's action property description but not in the tool description itself.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the resource and main purpose. The parentheticals are dense but efficient; there is almost no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a high-complexity tool with 27 parameters, no output schema, and no annotations. The description covers only a small subset of operations and does not explain return values, auth constraints, or typical publish/edit flows, so an agent would need to infer much from the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 52%, so the description should compensate, but it only clarifies a few parameters: action='publish', confirm='approve', confirm_publish, and add_branch's clone behavior. The remaining 27 parameters, including filters, paging, and include flags, receive no descriptive help beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the resource as Flow Designer and enumerates specific capabilities: reading/editing action inputs, trigger/branch conditions, cloning branches via add_branch, and publishing. It is reasonably specific and distinctive from siblings like manage_workflow, though 'read/edit' is a generic verb pairing rather than a precise statement of what the tool manages.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the resource name and the listed operations: if an agent needs to read or edit Flow Designer flows, this is the tool. No explicit alternatives or when-not-to-use guidance is given, though the publish confirmation caveat provides some task-specific direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_scripted_restC

CRUD Scripted REST services + resources (sys_ws_definition/sys_ws_operation). Use list/get to find sys_ids. (confirm='approve')

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryNo
actionYes
offsetNo
confirmYes
serviceNoService sys_id:<id> or name
count_onlyNo

TDQS

C2.5/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must fully disclose behavior. It claims 'CRUD' but only lists list/get actions, which is contradictory and misleading. The required confirm parameter suggests destructive operations, yet only read actions exist. No details on side effects, authorization, or rate limits are given.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is brief (one sentence), which is concise but lacks structure. It front-loads the purpose but omits important details. Given the tool's complexity, more focused information would improve usability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 7 parameters, no output schema, and a complex domain, the description is severely incomplete. It doesn't explain return format, pagination behavior, query filter syntax, or how count_only works. The discrepancy between CRUD and actual actions further reduces completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 14% (only service has a description). The description adds that list/get are used to find sys_ids and that confirm must be 'approve', which provides some constraint. However, parameters like limit, offset, query, count_only are not explained at all.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the tool as managing Scripted REST services and resources, and specifies using list/get to find sys_ids. It clearly indicates the resource type (sys_ws_definition/sys_ws_operation), distinguishing it from sibling tools. However, the mention of 'CRUD' is misleading since only list and get actions are available.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description advises using list/get to find sys_ids, providing some usage guidance. It also notes the confirm parameter must be 'approve', implying a safety check. However, it does not explain when to prefer this tool over siblings or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_script_includeC

List/get/create/update/delete/execute a script include (table: sys_script_include). (confirm='approve')

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryNo
actionYes
activeNo
offsetNo
confirmYes
count_onlyNo
client_callableNoFilter by client_callable
script_include_idNosys_id or name

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description carries the full burden. It mentions 'confirm='approve'' but does not disclose side effects (e.g., whether create/update/delete are destructive), permission requirements, or behavior of 'execute'. The tool's mutating capabilities are implied but not explained.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence, but it omits essential details. While brevity is positive, the lack of structure (e.g., no bullet points or sections) reduces its utility.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 9 parameters, 2 required, and no output schema, the description is inadequate. It fails to explain parameter roles, return types, or behavior for each action. The tool is complex (CRUD+execute) but the description treats it minimally.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 22%, leaving most parameters undocumented. The description adds no meaning beyond the schema, e.g., it doesn't explain 'query', 'active', or 'script_include_id'. It only hints at the 'confirm' parameter value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description lists all actions (list, get, create, update, delete, execute) and specifies the target table (sys_script_include), making the purpose clear. However, it does not distinguish from sibling tools like manage_scripted_rest or manage_workflow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives, no prerequisites, and no instructions on when not to use it. The description only lists actions without context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_widget_dependencyB

CRUD + link/unlink for widget Angular providers & CSS/JS dependencies. Use action=list first for sys_ids. (confirm='approve')

ParametersJSON Schema
NameRequiredDescriptionDefault
depthNoChain depth 1-3 (source/page read)
scopeNoApp scope filter (list)
actionYeslist|get|create|update|delete|link|unlink
targetNoprovider|dependency|page (page=read only)provider
confirmYes
page_idNoPage sys_id or path (target=page)
developerNosys_updated_by filter (list)
record_idNoProvider/dependency sys_id
widget_idNoSingle widget for get/link/unlink
widget_idsNoWidget sys_id/id/name filter
max_widgetsNo
save_to_diskNoSave page sources to ./temp (page)
include_sourceNo
include_si_refsNo

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description bears full responsibility for disclosing behavioral traits. It mentions CRUD and link/unlink, implying mutation, but gives no details on side effects (e.g., what changes are persisted, whether dependencies are overwritten or appended, permission requirements). The 'save_to_disk' parameter hints at file writes but is not explained. This leaves significant behavioral ambiguity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence plus a parenthetical hint—extremely concise with no filler. It front-loads the core purpose (CRUD + link/unlink) and immediately provides actionable guidance ('Use action=list first'). Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite the tool's complexity (14 parameters, 6 action types, 3 target types), the description is too brief to equip an agent with full understanding. It omits relationships between parameters (e.g., when to use widget_id vs widget_ids), the effect of each action on data, and output behavior. The lack of an output schema exacerbates this. Agents would likely struggle to use this tool correctly without additional context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 71% (10 of 14 parameters have descriptions). The description adds a usage hint for 'action' and 'confirm' but does not significantly elaborate on parameter meaning beyond the schema—e.g., it doesn't explain how 'depth' affects chain reading or how 'scope' filters. This is adequate but not enhanced.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool performs CRUD and link/unlink operations for widget providers and dependencies. The verb 'manage' is broad but the description specifies the exact resource scope (Angular providers & CSS/JS dependencies). While it doesn't explicitly differentiate from sibling tools, the unique combination of CRUD and link/unlink for a specific resource makes the purpose clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description advises 'Use action=list first for sys_ids' and mentions the required confirm parameter value. This provides a basic workflow hint but does not specify when to use this tool versus alternatives, nor does it describe prerequisites or conditions for each action type. The hint is useful but incomplete for guiding the agent's decision.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_workflowB

LEGACY Workflow engine ONLY (wf_workflow/wf_activity). Most flows are Flow Designer -> use manage_flow_designer. (confirm='approve')

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryNo
actionYes
activeNo
offsetNo
confirmYes
count_onlyNo
version_idNoSpecific version for activities
workflow_idNo

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description must convey behavioral traits. It only mentions it is legacy and that confirm='approve', but does not disclose whether actions are read-only, what they return, or any side effects. Essential behavior is missing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very short, which is concise, but it omits critical information about actions and parameters. Brevity comes at the cost of completeness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (9 parameters, no output schema, low schema coverage), the description is vastly incomplete. It lacks explanations for actions, query parameters, pagination, and return values, making it insufficient for an AI agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 11% (only version_id has a description). The description only adds context for the confirm parameter, leaving 8 parameters unexplained. This is insufficient for effective use.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly identifies the tool as targeting the legacy workflow engine (wf_workflow/wf_activity) and distinguishes it from the Flow Designer tool (manage_flow_designer). However, it does not explicitly state the actions (list/get_activities) available in the input schema, so some ambiguity remains.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states 'LEGACY Workflow engine ONLY' and directs to use manage_flow_designer for most flows, giving a clear when-to-use vs when-not-to-use. Also notes that confirm must be 'approve', which is a required parameter.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_local_graphB

Offline dependency/impact answers from audit graph files (0 API). uses|used_by|page|impact.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesSource/page name to look up (widget, SI, provider, page).
actionYesuses | used_by | page | impact (all answered offline).
source_rootYesScope root holding the audit graph files (_cross_references.json).

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description states it's offline and uses local files (0 API), indicating no network calls. However, it does not confirm read-only behavior, permissions needed, or what the 'audit graph files' entail. Without annotations, the description carries full burden and is minimal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, concise and front-loaded with the core purpose. Every word is relevant and no repetition. However, it could benefit from slightly more structure, like separating the overall purpose from parameter details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description does not explain return values or output format, which is a gap since there is no output schema. It also does not clarify what 'audit graph files' are or how they are generated, leaving important context missing for an offline tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all three parameters. The description lists possible values for action (uses|used_by|page|impact), but this is already in the schema description. It adds marginal value beyond what structured fields provide.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it provides offline dependency/impact answers from audit graph files, listing specific actions (uses, used_by, page, impact). It distinguishes from sibling tools like search_server_code or sn_query which are online. However, the term 'audit graph files' is somewhat vague and could be more precise.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this versus other tools, such as when offline analysis is preferred over online queries. The description does not mention prerequisites or alternatives, leaving the agent to infer usage from context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_portal_regex_matchesA

True regex over portal code (widget/provider/SI), offsets+context. Server-table keyword search: search_server_code.

ParametersJSON Schema
NameRequiredDescriptionDefault
regexNoPattern to find in source
scopeNosys_scope filter
page_sizeNo
match_modeNoauto | literal | regexauto
updated_byNosys_updated_by filter
widget_idsNoWidget id/sys_id/name filter
max_matchesNo
max_widgetsNo
output_modeNominimal | compact | full
provider_idsNoAngular provider sys_id/name filter (bypasses M2M)
source_typesNowidget | script_include | angular_provider
updated_afterNosys_updated_on >= (YYYY-MM-DD)
compact_outputNoCompact output
snippet_lengthNoMax snippet length per match
updated_beforeNosys_updated_on <= (YYYY-MM-DD)
include_widget_fieldsNoWidget fields to scan
include_linked_script_includesNo
include_linked_angular_providersNo
linked_components_updated_by_onlyNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description bears the burden of behavioral disclosure. It mentions 'True regex' and 'offsets+context', indicating it returns position and surrounding text, and that it treats input as regex. However, it does not disclose destructive potential (likely read-only), performance considerations, or authentication requirements. The description adds some value but is incomplete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: two sentences that front-load the core functionality. Every sentence provides essential information with no wasted words. It is appropriately sized for a tool with many parameters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 19 parameters, no output schema, and no annotations, the description is too minimal. It does not explain the output format, pagination behavior, or how filters (e.g., updated_by, updated_after) work. A more complete description would include usage examples or output details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The parameter schema has 68% coverage, meaning some parameters are described in the schema. The description adds no parameter-specific meaning; it only gives an overview. With moderate coverage, the description should compensate for missing parameter descriptions but does not. It does not explain any parameter beyond what is in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool performs 'True regex over portal code (widget/provider/SI)' and provides 'offsets+context'. It distinguishes from sibling 'search_server_code' by noting it is for keyword search, implying this tool is for regex search. The verb 'search' and resource 'portal code' are specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions an alternative ('Server-table keyword search: search_server_code') but does not explicitly state when to use this tool vs alternatives. It implies regex search over portal code, but lacks clear context for when to choose this over other search tools. No exclusions or prerequisites are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_server_codeA

Fast keyword search across 22 server-side code types (SI/BR/ACL). Portal regex+snippets: search_portal_regex_matches.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
scopeNoOptional scope filter
updated_byNoOptional updated_by filter
source_typeNoSource type to search; 'all' covers every supported type.all
max_snippet_lengthNo

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries full burden. It only says 'Fast keyword search' but fails to disclose read-only nature, authentication requirements, rate limits, or what the output contains. The behavioral traits are largely undisclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two efficient sentences, front-loading the core purpose and immediately linking to the sibling tool. Every word adds value; no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema, the description omits any mention of return values (e.g., snippets, match structure). It also does not address pagination, limits on scope, or other operational details expected for a search tool with six parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50%, with half of parameters (e.g., limit, query, max_snippet_length) lacking descriptions. The tool description adds no extra parameter meaning beyond listing code types; it does not compensate for the missing schema explanations.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States it performs 'Fast keyword search across 22 server-side code types' with examples (SI/BR/ACL), and explicitly names the sibling tool for portal regex search, clearly distinguishing its scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a direct pointer to the alternative tool (search_portal_regex_matches) for portal regex searches, implying when to use this vs that. However, it does not give explicit when-not-to-use conditions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sn_aggregateA

Run COUNT/SUM/AVG/MIN/MAX on any table with optional group_by. Returns stats without fetching records.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldNoField for SUM/AVG/MIN/MAX
queryNo
tableYes
group_byNoGroup by field
aggregateNoCOUNT, SUM, AVG, MIN, MAXCOUNT

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries the burden. States it returns stats without fetching records (read-only implication), but does not disclose required permissions, rate limits, or other behavioral traits like whether grouping affects the result structure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence that efficiently conveys the tool's purpose and key feature (no record fetching). No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is minimal but covers the core functionality for a simple aggregate tool. Lacks details on output format, error handling, or complex use cases, but given the absence of an output schema, extra context on return structure would be helpful.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 60% (descriptions for field, aggregate, group_by). Description adds no extra meaning beyond summarizing aggregate types; it does not explain the 'query' or 'table' parameters beyond the schema. Baseline 3 is appropriate as schema already provides partial descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the verb 'Run' and resource 'aggregate on any table' with specific operations COUNT/SUM/AVG/MIN/MAX and optional group_by. Distinguishes from sibling tools like sn_query by specifying statistical aggregation without fetching records.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage for statistics without fetching records, but lacks explicit when-to-use versus alternatives (e.g., sn_query for records). No exclusions or prerequisites mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sn_discoverA

Find tables by name or label keyword. Returns table name, label, scope, and parent class.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
keywordYesKeyword to search table names and labels

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided. The description does not disclose any behavioral traits such as read-only nature, performance impact, or side effects. For a tool that searches data, basic transparency on safety is missing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that front-loads the purpose and lists key return fields. No wasted words; every part earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity of the tool (2 parameters, no output schema, no annotations), the description is adequate but not rich. It could mention pagination, ordering, or that results are limited to tables. Without output schema or annotations, the description carries the burden and is minimally complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50% (keyword described, limit not). The description adds value by stating that keyword searches table names and labels, compensating partially for the missing description of limit. However, limit's purpose and default behavior are not explained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool finds tables by name or label keyword, and lists the return fields (table name, label, scope, parent class). It distinguishes itself from siblings by being a table discovery tool, which is specific among the diverse set of sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives like sn_query or search_server_code. The description implies its use for table discovery but does not provide context for exclusion or comparison.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sn_healthB

Check ServiceNow API connectivity, auth status, Chromium install state (browser auth), and MCP server version.

ParametersJSON Schema
NameRequiredDescriptionDefault
deepNoAlso probe undocumented APIs (flow/session tools) for upgrade breakage.
timeoutNoRequest timeout in seconds

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided. The description only lists what is checked; it does not disclose whether the tool is read-only, requires specific permissions, has side effects, or how it behaves on failure. Given the zero annotation burden, this is insufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence of 15 words efficiently lists all check categories. No fluff, no repetition, perfectly front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema and no annotations. The description omits what the response looks like, error handling, or return format. For a health check tool, an agent would need to know if the result is structured text, boolean flags, or a summary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with parameter descriptions already present. The tool description adds no additional meaning to the parameters (deep and timeout). Baseline 3 is appropriate as it does not detract nor enhance beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Check' and lists distinct resources: ServiceNow API connectivity, auth status, Chromium install state, and MCP server version. This clearly distinguishes it from sibling tools like sn_query or manage_script_include.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives, no prerequisites, no when-not-to-use context. Agent must infer from the description alone, which lacks contextual advice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sn_queryB

Generic table query — last resort. Prefer domain tools: search_server_code, manage_workflow, manage_flow_designer.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryNo
tableNo
fieldsNo
offsetNo
orderbyNoOrder by field, supports -field for desc
display_valueNoResolve reference fields to display labels. Slower; opt-in only.
include_countNo

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description does not disclose behavioral traits such as read-only nature, performance implications, or side effects. A query tool likely reads data, but this is not confirmed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely concise: two sentences that front-load the purpose and usage guidelines. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 8 parameters, no output schema, and no annotations, the description is insufficient. It lacks details on how to construct queries, pagination, return format, or parameter usage, which are critical for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is low (25%). The description adds no parameter explanations beyond what the schema partially provides. It does not compensate for the missing parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Generic table query — last resort' specifies the verb (query) and resource (table), and distinguishes from sibling domain tools. It is clear but could be more explicit about the context of 'table'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states 'last resort' and directs users to prefer domain tools like search_server_code, manage_workflow, manage_flow_designer, providing clear when-to-use and alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sn_resolve_urlA

Parse a ServiceNow URL → table, sys_id, scope, suggested next tool. Read-only.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesA ServiceNow screen URL to inspect

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden. It declares 'Read-only' which confirms no side effects, and describes the parsing behavior without ambiguity. This fully discloses the tool's nature and output.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence, front-loading the key action ('Parse a ServiceNow URL') and listing output components succinctly. Every word serves a purpose with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has one parameter and no output schema, the description adequately specifies return components (table, sys_id, scope, suggested next tool). However, it does not mention return format, error handling, or invalid URL behavior, leaving minor gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single 'url' parameter, so baseline is 3. The description does not add extra detail about URL format or constraints beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Parse' and the resource 'ServiceNow URL', and specifies the outputs: table, sys_id, scope, suggested next tool. This distinguishes it from sibling tools like sn_query or sn_aggregate which are for querying or aggregation rather than URL parsing.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

While not explicitly stating when to use vs alternatives, the description mentions 'suggested next tool' implying guidance. The 'Read-only' tag indicates safe usage. The context is clear enough for a single-purpose tool, but lacks explicit exclusions or prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sn_schemaB

Fetch field names, types, labels, and constraints from sys_dictionary for a given table.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
tableYes

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose all behavioral traits. It does not mention whether the operation is read-only, if it has side effects, or any rate limits. The description only states what data is fetched, but not how it behaves.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence that front-loads the core purpose. It contains no unnecessary words or fluff, though it could be slightly improved by adding a brief note about the optional limit parameter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 2 parameters and no output schema, the description reasonably explains what is returned. However, it does not clarify how the 'limit' parameter affects results or if there is pagination, which is important for a data-fetching tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must add meaning for each parameter. It mentions the 'table' parameter implicitly, but the 'limit' parameter is entirely undocumented. The description does not explain the default behavior or constraints of the parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Fetch'), the resource ('field names, types, labels, and constraints from sys_dictionary'), and the context ('for a given table'). It distinguishes from sibling tools that perform different operations like querying or aggregating data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives, nor does it mention any prerequisites or exclusions. An agent receives no context for choosing this over other sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

trace_portal_route_targetsA

Map widget→provider→route relationships. Metadata only, no script bodies.

ParametersJSON Schema
NameRequiredDescriptionDefault
regexNoRoute/target pattern to trace
scopeNosys_scope filter
page_sizeNo
match_modeNoauto | literal | regexauto
max_tracesNo
updated_byNosys_updated_by filter
widget_idsNoWidget id/sys_id/name filter
max_widgetsNo
output_modeNominimal | compact | fullminimal
provider_idsNoProvider id/sys_id/name filter
snippet_lengthNoMax snippet length per match
include_widget_fieldsNoWidget fields to inspect
include_linked_angular_providersNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must convey behavioral traits. It states 'Metadata only, no script bodies', which is a key behavior. However, it does not disclose other important aspects such as read-only nature, required permissions, or potential performance impact, leaving gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that conveys the core purpose and a key constraint. It is maximally concise with no redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 13 parameters and no output schema, the description is too terse. It does not explain what the output looks like, how results are structured, or how this tool fits with siblings. More detail is needed for effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 69%, meaning many parameters already have descriptions. The tool description adds no additional parameter-level guidance beyond 'map relationships'. Baseline 3 is appropriate as the schema handles most of the load.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Map widget→provider→route relationships'), which is a specific verb+resource structure. It further clarifies the scope with 'Metadata only, no script bodies', distinguishing it from siblings like search_portal_regex_matches or get_portal_component_code.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for mapping relationships and excludes script content, but it does not explicitly state when to use this tool versus alternatives (e.g., search_portal_regex_matches for content search). No when-not or alternative tools are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_deployment_xmlA

Compare a deploy XML to the live server. preflight=would it revert work, postflight=did it land.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNopreflight: before import. postflight: after import.preflight
xml_pathYesDeploy .xml built by export_record_xml
show_fieldsNoList differing field NAMES per record (never bodies)
allow_unanchoredNoSecond approval: verify an XML with no origin cert

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It explains the behavioral difference between preflight and postflight, which adds context. However, it does not disclose side effects (even whether it modifies anything), permissions, rate limits, or return behavior. 'Compare' implies read-only, but that is not explicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, tightly worded sentence with no filler. It front-loads the core action and uses compact mode definitions that earn their place. Extremely efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has no output schema and no annotations, yet the description does not explain what the tool returns or any prerequisites. While mode semantics are helpful, the description omits potential side effects, workflow context, and result interpretation. It is adequate but leaves gaps for a 4-parameter tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description adds behavioral meaning to the 'mode' parameter ('would it revert work' vs 'did it land'), which goes beyond the schema's simple 'before import' and 'after import'. Other params are already well-described in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb+resource: 'Compare a deploy XML to the live server.' It further distinguishes itself by defining preflight and postflight modes, which clearly separates it from sibling tools like export_record_xml or query tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear guidance for mode usage: 'preflight=would it revert work, postflight=did it land.' This implies when to use each mode (before vs after import). However, it does not name alternative tools or explicitly state when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updatesv1.24.61
    • Changeddownload_app_sources1 field changed
      • changedInput schema / properties / resume / description
        Previous value: -"Replay finished stages from a prior timed-out call; skip re-downloading them."New value: +"Skip stages a prior timed-out call finished. false = download everything again."
    • Changedmanage_flow_designer1 field changed
      • addedInput schema / properties / node_id
        Added value: +{
        +  "description": "Action/logic/trigger instance id; on get_detail reads that ONE step in full",
        +  "type": "string"
        +}
  2. 1 tool updatev1.23.8
    • Changedmanage_flow_designer1 field changed
      • addedInput schema / properties / confirm_publish
        Added value: +{
        +  "enum": [
        +    "approve"
        +  ],
        +  "type": "string"
        +}
  3. 1 tool updatev1.22.22
    • Addedverify_deployment_xml
  4. 5 tool updatesv1.22.7
    • Addedget_developer_changes
    • Addedget_page
    • Addedget_portal_component_code
    • Addedget_widget_bundle
    • Addedget_widget_instance
  5. 5 tool updatesv1.22.0
    • Removedget_developer_changes
    • Removedget_page
    • Removedget_portal_component_code
    • Removedget_widget_bundle
    • Removedget_widget_instance
  6. 15 tool updatesv1.21.21
    • Addedaudit_local_sources
    • Addeddiff_local_component
    • Addeddownload_portal_sources
    • Addedget_developer_changes
    • Addedget_logs
    • Addedget_page
    • Addedget_widget_bundle
    • Addedget_widget_instance
    • Addedmanage_script_include
    • Addedmanage_widget_dependency
    • Addedmanage_workflow
    • Addedsearch_portal_regex_matches
    • Addedsn_query
    • Addedsn_schema
    • Addedtrace_portal_route_targets
  7. 13 tool updatesv1.21.20
    • Removeddownload_portal_sources
    • Addedextract_table_dependencies
    • Removedget_logs
    • Removedget_page
    • Removedget_widget_bundle
    • Removedget_widget_instance
    • Addedlist_tool_packages
    • Addedmanage_flow_designer
    • Addedmanage_scripted_rest
    • Removedsearch_portal_regex_matches
    • Removedsn_query
    • Removedsn_schema
    • Removedtrace_portal_route_targets
  8. 9 tool updatesv1.21.13
    • Removedaudit_local_sources
    • Removeddiff_local_component
    • Removedextract_table_dependencies
    • Removedget_developer_changes
    • Removedlist_tool_packages
    • Removedmanage_flow_designer
    • Removedmanage_script_include
    • Removedmanage_widget_dependency
    • Removedmanage_workflow

TDQS

C2.9/5.0

Scored across 32 tools

Disambiguation3/5

Several clusters overlap: get_widget_bundle, get_portal_component_code, and get_metadata_source all fetch source/body; search_server_code vs search_portal_regex_matches vs query_local_graph all search; download_portal_sources vs download_app_sources both download. Descriptions work hard to draw boundaries ('last resort', 'LEGACY ONLY', 'portal only'), which mitigates but does not eliminate misselection risk.

Naming Consistency3/5

Most tools follow a verb_noun pattern (get_page, download_attachment, verify_deployment_xml), but the sn_-prefixed namespace tools (sn_health, sn_query, sn_schema, sn_discover) mix a noun-prefix convention with the rest. Readable overall, but conventions are mixed rather than uniform.

Tool Count2/5

At 32 tools this is heavy and well past the 25-tool threshold, with several near-duplicate source-fetching and search tools that could be consolidated. The domain is complex enough to justify a large surface, but the set is over-scoped from a coherence standpoint.

Completeness4/5

Coverage is strong: discovery, CRUD for Scripted REST/script includes/widget dependencies, flow and workflow editing, portal/widget lifecycle, deployment XML export/verify, and offline auditing. Minor gaps exist (e.g. no explicit update-set or user/role management), but core ServiceNow dev workflows are well covered.

Maintenance

ActivityActive
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers