servicenow-platform-mcp
This MCP server provides a comprehensive interface for ServiceNow, enabling platform introspection, record management, automated investigations, and service catalog operations.
Platform Introspection & Data Querying
Query records, aggregates, or single records from any table using encoded queries, field filters, pagination, ordering, and aggregations (count, avg, sum, min, max).
Describe table schemas, retrieve field metadata, and identify script-bearing fields.
Build complex encoded query strings from structured JSON conditions (comparison, string, null, time, date, range, field comparison, reference, change detection, and logical operators).
Resolve human-readable choice labels (e.g., "high" priority) to their underlying system values.
Record Management
Create, update, or delete records with a mandatory preview-then-apply safety pattern (preview generates a token; a separate apply step commits the change).
Read records by
sys_idor name, with sensitive field masking and dynamic script field discovery.Write script content from local files into script-bearing fields.
Attachment Operations
List, get, download (by name or directly), upload (base64-encoded), or delete attachments on any record.
Automated Investigations
Run pre-defined investigations covering: stale automations, deprecated APIs, table health, ACL conflicts, error analysis, slow transactions, and performance bottlenecks.
Service Catalog
Browse catalogs, categories, and items; view item variables; order items directly or manage a cart.
Audit & Change Intelligence
Inspect audit configuration for tables and fields.
Retrieve audit trail history for specific records (default 90-day window).
Flow Designer
Inspect Flow Designer flows, triggers, and decode gzip/base64 value blobs (read-only).
Safety Features
Write operations are blocked in production (
SERVICENOW_ENV=prod).Sensitive fields (passwords, tokens, secrets) are automatically masked.
Access to sensitive system tables is blocked via a deny list.
Row limits and mandatory date filters are enforced on high-volume tables.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@servicenow-platform-mcpshow me all open incidents with high priority"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
servicenow-platform-mcp
servicenow-platform-mcp is an asynchronous Python 3.12+ server that gives AI
tools access to ServiceNow. It uses the Model Context Protocol (MCP) as the
AI and tool access layer. It still uses ServiceNow REST APIs underneath.
Use it to discover schemas, read bounded record data, inspect attachments and Flow Designer records, inspect audit configuration and history, run investigations, analyse fulfilled catalog requests, and perform gated writes.
Contents
Related MCP server: snow-mcp
Capabilities
Schema discovery. Describe ServiceNow tables, inherited fields, field types, documentation, and dictionary provenance.
Bounded reads. Query records and aggregates with encoded queries, explicit projections, pagination, and display values.
Generic table support. The same tools work with Incident, Problem, REQ/RITM,
sc_task,task_sla, CMDB relations such ascmdb_rel_ci, and custom tables and fields. These are examples, not a hardcoded table list.Attachments. List, inspect, and download attachments. Upload and delete operations are in a separate, explicit tool group.
Flow inspection. Read Flow Designer flows and subflows from their table records, including triggers, inputs, outputs, variables, actions, logic, and warnings.
Audit inspection. Check table and field audit posture and read a masked, date-bounded audit trail.
Investigations. Run registered investigations and explain findings.
Read-only analysis. Compose submitted variables for one fulfilled RITM and read dictionary-confirmed journal history.
Gated writes. Create, update, delete, and write script-bearing records through a preview/apply workflow by default. Service Catalog ordering and state-changing cart actions are also gated.
Choice resolution. Map a human-readable choice label to its stored value.
Code search. Search script-bearing artifacts through ServiceNow Code Search.
Architecture and transport
The server uses MCP SDK v2 (mcp>=2.1.1) and MCPServer. It runs over stdio.
MCP clients launch or connect to the process and call its tools.
ServiceNow calls are asynchronous and use httpx. The server shares one HTTP
pool for its lifetime. Choice, dictionary, and audit configuration use shared
metadata registries and a bounded TTL cache. Records, query results, previews,
attachments, and audit row counts are not metadata-cache entries.
Each operational tool wrapped by @tool_handler receives a generated
correlation ID and returns a serialized JSON response envelope. The envelope
has a stable status, data, and correlation_id shape. The bootstrap
list_tool_packages tool returns the preset-to-group registry directly and is
the only public tool that does not use this envelope.
Install and run
The current project version is 0.11.0. Supported Python versions are 3.12,
3.13, and 3.14. The project uses uv.
git clone https://github.com/Xerrion/servicenow-platform-mcp.git
cd servicenow-platform-mcp
uv sync --group devFor local development, run the installed editable entry point:
uv run servicenow-platform-mcpRun this command with the cloned project as the working directory, unless the package is installed in another managed environment.
The entry point is servicenow_mcp.server:main. To build a distribution:
uv buildThe process uses stdio. Do not start it as an HTTP endpoint for an MCP client.
Configuration and authentication
Settings use environment variables. The process also reads .env and
.env.local from its working directory. With the current pydantic-settings
configuration, later dotenv sources override earlier ones, and process
environment variables override dotenv values. Start the process from the
directory that contains the intended dotenv files. A client that starts the
process with another working directory will not read the files you expect.
Environment variable | Required | Default | Valid range or values | Purpose |
| Yes | None | Must start with lowercase | ServiceNow instance base URL. Trailing |
| Conditional | Empty | Must contain a non-whitespace character when used | API-key authentication. Takes precedence over Basic Auth. |
| Conditional | Empty | Required when API key is empty | Basic Auth username. |
| Conditional | Empty | Required when API key is empty | Basic Auth password. |
| No |
| Preset or comma-separated groups | Selects loaded tool groups. |
| No |
| Any string; | Local environment label and write policy input. |
| No |
|
| Maximum row count for bounded generic and query-oriented tool paths that use this setting. It is not a universal response or egress cap. |
| No |
| Comma-separated table names | Tables that require date-bounded queries. |
| No |
|
| ServiceNow HTTP timeout. |
| No |
|
| Metadata freshness window. |
| No | Empty | String accepted by the Sentry SDK as a DSN | Enables optional Sentry error reporting. |
| No | Empty | Any string | Sentry environment; empty uses |
The instance URL and usable authentication settings are validated at startup,
even when no selected tool will perform a request. URL validation requires the
literal https:// prefix; use a complete instance base URL such as
https://your-instance.service-now.com. Authentication validation requires
either a usable API key or both a username and password.
For API-key authentication, configure a key placeholder only. The server sends
the exact x-sn-apikey header. It does not send an Authorization header in
this mode. If the API key is empty, the server sends HTTP Basic Auth from the
username and password.
Never place a real key or password in this README, a committed configuration file, or a log. Restart the full server process after changing environment variables. Settings are loaded at startup.
MCP client configuration
MCP clients normally start the command below and communicate over stdio. The following generic shape avoids client-specific fields. Use the equivalent stdio configuration fields supported by your client.
API key variant:
{
"command": "uv",
"args": ["run", "servicenow-platform-mcp"],
"env": {
"SERVICENOW_INSTANCE_URL": "https://your-instance.service-now.com",
"SERVICENOW_API_KEY": "${SERVICENOW_API_KEY}",
"MCP_TOOL_PACKAGE": "readonly"
}
}Basic Auth variant:
{
"command": "uv",
"args": ["run", "servicenow-platform-mcp"],
"env": {
"SERVICENOW_INSTANCE_URL": "https://your-instance.service-now.com",
"SERVICENOW_USERNAME": "${SERVICENOW_USERNAME}",
"SERVICENOW_PASSWORD": "${SERVICENOW_PASSWORD}",
"MCP_TOOL_PACKAGE": "readonly"
}
}${...} is a placeholder pattern. Whether a client expands it depends on that
client. Prefer its documented environment forwarding feature, or start the
client from a shell where the variables already exist. Do not commit a file
with substituted secrets.
Tool packages
A tool group is a loader module. A public MCP tool is a callable tool
registered by a group. The record_write group registers two public tools.
The server always registers list_tool_packages. The preset package counts
below include that tool.
Preset | Groups | Public MCP tools | Purpose |
| All 13 groups | 15 | Complete surface, including all writes. |
|
| 11 | Read-only operational and analysis surface. |
|
| 4 | Small read-only core. |
| No groups | 1 | Only |
full includes both attachment and attachment_write. attachment is
read-only. attachment_write is explicit opt-in in custom packages.
readonly and core_readonly exclude attachment writes. analysis is in
full and readonly, but not core_readonly.
Custom packages use comma-separated group names:
MCP_TOOL_PACKAGE=query,describe,record_read,attachment uv run servicenow-platform-mcpValid groups are query, describe, record_write, record_read,
attachment, attachment_write, investigate, resolve_choice,
service_catalog, analysis, audit, flow, and code_search.
list_tool_packages reports the preset-to-group mapping. It does not expand
groups into the public tool names shown below.
Tool reference
All tools return JSON strings. The correlation_id argument is generated by
the server and is not part of the client-facing schema.
Tool | Purpose and important actions | Essential inputs and behavior | Packages |
| Lists preset packages and their groups. | No inputs. Always available. Returns the registry as JSON without the standard response envelope. | All |
| Reads records or aggregates. |
|
|
| Describes fields, tables, or script fields. | Default table description; |
|
| Reads one record by |
|
|
| Creates, updates, or deletes a record. |
|
|
| Applies a record-write preview. |
|
|
| Reads attachment metadata and content. |
|
|
| Uploads or deletes attachments. |
|
|
| Runs or explains investigations. |
|
|
| Resolves choice labels. |
|
|
| Reads catalogs and performs catalog/cart actions. | Actions are listed below. Reads use IDs, filters, and paging. |
|
| Inspects audit posture and history. |
|
|
| Inspects Flow Designer data. |
|
|
| Searches ServiceNow script artifacts. |
|
|
| Composes RITM variables or reads journal history. |
|
|
Use each tool's describe action where available for the runtime action
registry. The public tool schemas are the authoritative input contract.
Schema defaults are empty strings for optional string inputs unless stated otherwise. Important exceptions and effective defaults are:
query:limit=20,offset=0, anddisplay_values=false;describe: emptyactionselects table description,field_limit=25,field_offset=0,verbose=false, andinclude_docs=false;record_write:preview=true;attachment_write:content_type="application/octet-stream";investigate:params="{}";service_catalog:limit=20,offset=0, andtop_level_only=false;code_search:action="search"andlimit=20;analysis: schema valueslimit=0andwindow_days=0select the effective defaults described below;audit: schema valueslimit=0andwindow_days=0selectMAX_ROW_LIMITand 90 days where the action uses them; andflow: schema valueslimit=0andsection_limit=0select effective defaults of 100, with section limits still capped byMAX_ROW_LIMIT.
All other required inputs and action-specific combinations are shown in the
tool table or the detailed sections below. Optional booleans not listed above
default to false.
Analysis details
Fulfilled RITM variables
Call analysis(action="ritm_variables", sys_id="<32-char-sys-id>"). Optional
limit and offset are bounded by MAX_ROW_LIMIT. The tool first confirms
the sc_req_item, then composes submitted answers through:
sc_item_option_mtomfor submitted-answer links;sc_item_optionfor submitted values; anditem_option_newfor variable definitions.
The response contains data.table, data.sys_id, entry_count, and
entries. A resolved entry includes answer and definition IDs, name,
label, type, raw_value, display_value, reference_target,
variable_set, multi_value, masked, and status. Degraded entries for
missing options or definitions are intentionally sparse and identify their
condition through status. The response also contains pagination and
selection metadata.
Variable names and labels that indicate a password, token, secret, credential, API key, or private key cause masking. If either the name or label is missing, the affected answer is masked conservatively.
Variable types 21, list_collector, and List Collector are all treated as
List Collectors. Unmasked List Collector values retain their raw identifiers.
The response includes a warning, sets multi_value=true when a
comma-separated value contains more than one non-empty identifier, and sets
display_value to null. Reference values also keep raw sys_ids and do not
receive generic display-value resolution.
Every successful ritm_variables response contains:
{
"unsupported_features": {
"multi_row_variable_sets": {
"present": false,
"payload_fields_retrieved": false
}
}
}The present value reflects a bounded presence query on
sc_multi_row_question_answer. MRVS payload fields are not retrieved or
decoded. This metadata does not change answer pagination.
An inaccessible or missing submitted option produces an orphaned_option
entry and a warning. An inaccessible or missing definition produces an
inaccessible_definition entry, masked values, and a warning. Duplicate
submitted-answer links are preserved and reported. Row ACLs, field ACLs,
missing definitions, and instance data affect completeness.
Journal history
Call analysis(action="journal_history", table="incident", sys_id="<32-char-sys-id>"). Optional inputs are:
fields_csv: comma-separatedcomments,work_notes, andclose_notes. The default iscomments,work_notes.since:YYYY-MM-DD; it overrideswindow_days.window_days: non-negative integer. The default is 90 days.limitandoffset: bounded pagination. The default limit isMAX_ROW_LIMIT.
Each requested field must exist in the resolved dictionary and have a journal
type. Entries come from sys_journal_field and are ordered by
sys_created_on, then sys_id, ascending. The response reports the effective
date window, fields, entries, selection, pagination, and an ACL/retention
warning.
This is journal history. It is different from audit(action="history"),
which reads field changes from sys_audit.
Query, selection, pagination, and schema discovery
query has three modes: exact-record mode when sys_id is set, aggregate
mode when aggregate is set, and list mode otherwise. List-mode calls require
an explicit fields projection. Use
fields="*" only when all masked fields are intentional. sys_id is always
included. Exact-record mode defaults to sys_id,sys_updated_on and accepts an
explicit projection or *.
query and code_search report the effective row cap in pagination.limit,
without a redundant limit-cap warning. Query offsets, totals, and selection
metadata remain available for continuing bounded reads. Empty warning lists
are omitted from response envelopes; non-empty warnings are preserved.
code_search defaults to extended_matching=false to avoid additional
context fields from the search group's configuration. Set
extended_matching=true to request that context. Search result fields and
platform metadata are otherwise passed through unchanged. Its pagination
reports only the effective limit; it does not imply offset support or a known
total. Keep platform completeness signals and narrow the search when needed.
record_read with empty fields returns compact identity and update fields
plus all discovered script-bearing fields. fields="*" returns the full
masked record. record_read always includes script_fields and sys_id.
describe walks sys_db_object.super_class child-first. Child declarations
override ancestor declarations. Each field includes inherited_from where
the response shape supports provenance. Empty fields returns an alphabetical
page of 25 fields by default. field_offset continues the page and
field_limit accepts 1-100. fields="*" requests all fields. Use
action=list_script_fields to return discovered script fields and their
resolved chain.
The default and verbose describe shapes include a choice_count. Choice
counts are read from the queried table first and then from each inherited
field's declaring table when needed. include_docs=true adds matching
sys_documentation records for the selected fields, with the same fallback to
the declaring table. Choice-count failures produce a warning and zero counts;
documentation failures follow normal tool error handling.
Choice, dictionary, and audit-configuration caches use
METADATA_CACHE_TTL_SECONDS. Each metadata cache is limited to 1,000 entries,
uses least-recently-used eviction, shares one in-flight load for the same key,
and permits different keys to load concurrently. Expired entries are reloaded
before the requesting call returns. These caches do not store records, query
results, previews, attachments, or audit row counts.
Encoded queries are passed to ServiceNow. Identifiers are validated and query
safety caps the effective limit at MAX_ROW_LIMIT. Tables in
LARGE_TABLE_NAMES_CSV require a structural date constraint such as
sys_created_on>=YYYY-MM-DD. Aggregate requests use the Aggregate API.
MAX_ROW_LIMIT applies only to bounded generic and query-oriented paths that
use it. It is not a universal response or egress cap. Service Catalog actions
have action-specific limits. The attachment list has a fixed maximum of 100
metadata records and no caller-controlled offset or pagination.
Successful bounded reads can include selection and pagination metadata.
Use next_offset, truncated, total, and returned-field metadata to
continue a read. A tool may add warnings when a platform or local limit caps a
request.
Writes and safety
The policy layer blocks these tables:
sys_user_has_password, oauth_credential, oauth_entity, sys_certificate,
sys_ssh_key, sys_credentials, discovery_credentials, and
sys_user_token.
Key-name masking for names containing password, token, secret, credential,
api_key, or private_key applies only on specific record-oriented paths that
call the local masking helpers. It is not a global output filter. Query
aggregate mode returns Stats API results directly, without local field-value
masking. Code Search, Flow, Service Catalog, and other arbitrary payload
surfaces are not universally masked. Do not group or aggregate sensitive
fields. Enforce ServiceNow field ACLs as the primary control. Audit rows use
the audit field name to mask old and new values.
Writes are blocked when SERVICENOW_ENV is prod or production. This local
gate does not replace ServiceNow ACLs. ServiceNow remains the authority for
authorization.
record_write defaults to preview mode. A preview returns a single-use
preview_token and a masked preview. record_apply consumes the token and
re-checks policy before applying it. Tokens expire after five minutes and are
single-use, are held only in the server process that created them, and are
consumed before the application attempt. A failed attempt cannot be retried
with the same token. Set preview=false only when an immediate write is
appropriate.
record_write.data is the only field-value input. Supply a JSON string such as
{"script":"run();\n","active":true}. Include the complete value for each
field you change; omitted fields stay unchanged on update. Multiple script
fields can be changed in one payload. Use record_read or
describe(action="list_script_fields", table=...) to discover field names.
The server does not read local script files.
The complete UTF-8 JSON input is limited to 256 KiB (262144 bytes), including field names and JSON escaping. Before staging or writing, the server queries dictionary types for supplied fields only, resolving inherited fields child-first. Values for XML fields must be strings containing well-formed XML; empty, null, and malformed values are rejected. Metadata request errors block the write. Dictionary visibility depends on ServiceNow ACLs; fields not returned by the dictionary cannot receive local type validation. These checks do not validate script syntax or replace ServiceNow authorization.
Attachment upload and delete are in attachment_write, which is separate from
read-only attachment and is gated again at runtime. Attachment transfer size
is limited to 10 MiB.
Service Catalog write actions are order_now, add_to_cart, cart_submit,
and cart_checkout. They apply write gates to the relevant request or cart
table. A read of fulfilled RITM variables through analysis is read-only and
does not order or change a catalog item.
For a true read-only deployment, combine all of the following:
MCP_TOOL_PACKAGE=readonly, or a smaller custom package containing only read groups;GET-only ServiceNow REST API resources;
read-only table and field ACLs; and
a production environment label so local writes are blocked.
Package selection is not a replacement for ServiceNow authorization.
ServiceNow permissions
Authentication and authorization are separate controls. An API key must be permitted to use the required REST API resources. Table ACLs and field ACLs then control the records and fields that those resources can return or change.
The registered tools use these ServiceNow APIs and resources as applicable. API titles match the local OpenAPI specifications:
API title | Paths and methods used by registered tools | Use |
Table API |
| Query, describe metadata reads, record reads and writes, Flow inspection, analysis composition, and attachment-by-name metadata lookup. |
Aggregate API |
| Query aggregates and audit positive-control counts. |
Attachment API |
| Attachment metadata, downloads, uploads, and deletes. |
Code Search |
|
|
Service Catalog API | GET under | Catalog, item, variable, cart, and order actions. |
For a read-only package, allow GET on the Table, Aggregate, Attachment metadata/download, Code Search, and read-only Service Catalog paths used by the selected tools. For writes, add only the POST, PATCH, and DELETE resource permissions needed by the selected Table, Attachment, and Service Catalog actions. The client retains methods for some APIs that no registered tool uses; those endpoints are not required for the tool surface documented here. The exact API-key REST-resource policy depends on the instance and must be configured in ServiceNow.
Analysis needs Table API access and applicable read ACLs for sc_req_item,
sc_item_option_mtom, sc_item_option, item_option_new,
sc_multi_row_question_answer, sys_journal_field, sys_db_object, and
sys_dictionary. General tools also need read access to the target tables and
their selected fields. Flow inspection uses Table API records. It does not
use Workflow Studio APIs or undocumented processflow endpoints.
Dynamic table access and instance-specific ACL design must be configured in ServiceNow. The MCP package cannot grant access that the instance denies.
Flow, audit, investigations, and Service Catalog
Flow
flow supports contract, inspect, find_by_table, decode_values,
list_triggers, and describe. It reads both V1 and V2 Flow Designer tables.
It joins V2 record-trigger conditions through the remote trigger ID. The
decoder handles gzip plus Base64 plus JSON values blobs. A decode failure is
reported on the affected node while the enclosing inspection can still
succeed.
The implementation deliberately does not call undocumented
/api/now/processflow/* endpoints. It also skips sys_hub_flow_snapshot, an
opaque compiled cache.
Audit
audit supports check_field, check_fields, check_table, history, and
describe. Audit reads use a default 90-day window because sys_audit is a
large table. since on history overrides window_days.
Verdicts include audited, not_audited_field_flag,
not_audited_table_flag, audited_but_inactive, and inconclusive. Field
configuration is resolved child-first. The no_audit=true attribute vetoes a
field audit flag. Positive-control counts distinguish configured but inactive
fields from cases that cannot be determined.
Investigations
investigate supports run, explain, and describe. The seven registered
modules are:
stale_automations- finds unused or stale automation rules;deprecated_apis- detects deprecated API usage;table_health- analyses table structure and data quality;acl_conflicts- finds conflicting ACL rules;error_analysis- analyses error patterns;slow_transactions- identifies slow transactions; andperformance_bottlenecks- identifies performance issues.
Service Catalog
service_catalog supports catalogs_list, catalog_get,
categories_list, category_get, items_list, item_get,
item_variables, order_now, add_to_cart, cart_get, cart_submit, and
cart_checkout. List actions support text, catalog/category filters, limits,
offsets, and top-level category selection. order_now and cart actions that
change state are write-gated. This surface is separate from read-only
inspection of fulfilled RITM answers through analysis.
Attachments
The read-only attachment tool supports:
list- list metadata for a parent table and record;get- return masked metadata for one attachment;download- return masked metadata and Base64 content; anddownload_by_name- resolve metadata by parent and file name, then download the earliest-created match when multiple rows match.
Reads validate parent table access and attachment metadata. Downloads check the
declared and received size. The maximum supported transfer size is 10 MiB.
Attachment content is returned as data and is not content-classified by MCP.
attachment(action="list") returns at most 100 metadata records. It has no
caller-controlled offset or pagination, so do not assume that a list is
complete beyond that fixed bound.
The separate attachment_write tool supports upload and delete. Uploads
use Base64 content and a default MIME type of
application/octet-stream. Among presets, upload and delete are available
only in full; a custom package can opt in with attachment_write. Both
actions are subject to write gates and ServiceNow authorization.
Responses, errors, and observability
The standard success envelope is:
{
"correlation_id": "generated-id",
"status": "success",
"data": {}
}Depending on the tool, the envelope can also contain pagination, selection,
and warnings. An error envelope has status: "error", data: null, and an
error object with a message field:
{
"correlation_id": "generated-id",
"status": "error",
"data": null,
"error": {"message": "reason"}
}@tool_handler generates correlation IDs, records redacted tool context for
Sentry, and routes exceptions through safe tool handling. Tool functions do
not leak Python exceptions to MCP callers. If Sentry is enabled, unexpected
exceptions are captured before the error envelope is returned.
Troubleshooting
Missing instance URL: set
SERVICENOW_INSTANCE_URLto a full HTTPS URL. Startup validation errors list setting names and constraints without input values.401
User Not Authenticated: verify the API key or Basic Auth values, the exact instance URL, and the authentication policy on the instance. API key mode usesx-sn-apikey.API key policy failure: check API-key REST-resource permissions. A valid key does not automatically grant table or field access.
Table or field denial: check the target table ACL and field ACL. The selected MCP package only controls which tools are exposed.
Changed environment values have no effect: restart the full MCP process.
-32000: this can be a client-level wrapper. Inspect the MCP client's stderr and the underlying server process error before choosing a cause.
Development and verification
uv sync --group dev
uv run pytest
uv run pytest tests/test_client.py
uv run pytest -m integration
uv run ruff check .
uv run ruff format --check .
uv run mypy src/
uv buildIntegration tests use a live instance and require credentials in .env.local.
Do not use production credentials for tests.
Source uses a src/servicenow_mcp/ layout. Tool groups live in
src/servicenow_mcp/tools/. Tests live in tests/ and use pytest,
pytest-asyncio, and respx for HTTP mocking. The default test command
excludes tests marked integration.
Known limitations and non-goals
Custom fields require dictionary discovery and suitable ServiceNow ACLs.
RITM reference and List Collector answers retain raw sys_ids. Generic display-value resolution is not provided.
List Collector display values are not fabricated from raw identifiers.
MRVS payload fields are not retrieved or decoded.
RITM results can contain orphaned options or inaccessible definitions.
Journal and audit completeness depends on row ACLs, field ACLs, and instance retention.
Flow inspection reads documented table records and does not inspect opaque compiled snapshots.
Attachment content is not classified by MCP. Treat downloaded content as untrusted.
ServiceNow instance configuration, API-key resource policy, ACLs, and row visibility can limit results beyond the local tool limits.
Security
Use least-privilege API keys and ServiceNow ACLs. Expose only the tool groups
that operators need. Prefer readonly or a smaller custom package for read
workflows. Keep write operations in a non-production environment until they
are understood and tested.
Do not commit .env, .env.local, credentials, API keys, or generated files
that contain sensitive values. Do not log secrets, tokens, passwords, or PII.
Review attachment content and submitted catalog values before forwarding them
to other systems.
Contributing and license
Open an issue for a bug or feature request: https://github.com/Xerrion/servicenow-platform-mcp/issues.
The project is licensed under the MIT License.
Available Tools
15 toolsanalysisA
Run bounded, read-only analysis over catalog answers or journals.
Args: action: 'ritm_variables' | 'journal_history' | 'describe'. table: Target table for journal_history. sys_id: Target record sys_id for ritm_variables or journal_history. fields_csv: Allowed journal fields: comments, work_notes, close_notes. since: ISO date floor for journal_history; overrides window_days. window_days: Journal window; defaults to 90 days. limit: Row cap; defaults to MAX_ROW_LIMIT and is capped by it. offset: Zero-based row offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| since | No | ||
| table | No | ||
| action | Yes | ||
| offset | No | ||
| sys_id | No | ||
| fields_csv | No | ||
| window_days | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and explicitly discloses that the operation is 'read-only' and 'bounded'. It also adds useful operational details: 'window_days' defaults to 90 days, 'since' overrides it, and 'limit' is capped by MAX_ROW_LIMIT. It omits auth requirements and per-action effects, but the core safety profile is clearly stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The one-sentence summary is front-loaded and the Args block is compact with no filler. Each line adds parameter semantics or a default/cap that the schema does not provide, making it appropriately sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Parameter semantics and the read-only/bounded behavior are well covered, and an output schema exists so return values need not be documented. However, the three action modes are not explained at the semantic level, and there is no guidance on how 'analysis' relates to overlapping siblings, which leaves the description incomplete for tool selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for all 8 parameters, and it does. Every parameter is explained with allowed values, targets, defaults, or overrides, including the permitted journal fields and the row cap/offset behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line states a specific operation ('bounded, read-only analysis') over defined resources ('catalog answers or journals'), and the Args section names concrete action modes ('ritm_variables', 'journal_history', 'describe'). This is clear but does not distinguish the tool from siblings such as 'query', 'audit', or the sibling also named 'describe'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to choose this tool over the sibling alternatives or when not to use it. The parameter notes explain mechanics but not the selection context, so an agent must infer usage from the generic word 'analysis'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
attachmentA
Read attachments. action: 'list' | 'get' | 'download' | 'download_by_name'.
Args: action: One of: list, get, download, download_by_name. sys_id: Attachment sys_id (for get, download). table: Parent table (for list, download_by_name). table_sys_id: Parent record sys_id (for list, download_by_name). file_name: File name (for download_by_name).
| Name | Required | Description | Default |
|---|---|---|---|
| table | No | ||
| action | Yes | ||
| sys_id | No | ||
| file_name | No | ||
| table_sys_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must convey behavioral traits. It indicates read-only operation ('Read attachments') but does not disclose idempotency, authentication needs, rate limits, or side effects. The transparency is adequate but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, using a clear list format for actions and parameters. Every sentence adds value, and there is no extraneous text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (5 parameters, no annotations, output schema exists), the description sufficiently covers the action types and parameter mappings. It does not explain return values (handled by output schema), but could benefit from more context on when each action is appropriate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, but the tool description compensates well by explaining each parameter's purpose (e.g., 'sys_id: Attachment sys_id (for get, download)'). This adds significant meaning beyond the raw schema fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Read attachments' and enumerates specific actions (list, get, download, download_by_name), making the tool's purpose unambiguous and distinguishing it from the sibling tool 'attachment_write'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage via the action parameter but provides no explicit guidance on when to choose this tool over siblings like 'attachment_write' or when not to use it. There is no mention of prerequisites or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
attachment_writeA
Write attachments. action: 'upload' | 'delete'.
Args: action: 'upload' or 'delete'. table: Parent table (upload). table_sys_id: Parent record sys_id (upload). file_name: Attachment file name (upload). content_base64: Base64-encoded file bytes (upload). content_type: MIME type (upload, default 'application/octet-stream'). sys_id: Attachment sys_id (delete).
| Name | Required | Description | Default |
|---|---|---|---|
| table | No | ||
| action | Yes | ||
| sys_id | No | ||
| file_name | No | ||
| content_type | No | application/octet-stream | |
| table_sys_id | No | ||
| content_base64 | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided. The description lacks disclosure of side effects (e.g., deletion permanence), permission requirements, or error behavior. It only explains parameter usage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, front-loaded with the core purpose, and uses a clear bullet-like list for arguments. No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers parameter semantics adequately but lacks higher-level context such as success/failure responses or limitations. With output schema present, return values may be addressed externally.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description compensates for 0% schema coverage by explaining each parameter's role and conditionally grouping them under upload or delete actions. This adds significant meaning beyond the schema titles.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Write attachments' and specifies two actions: 'upload' and 'delete'. This distinguishes it from sibling tool 'attachment' which likely reads attachments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use upload vs delete, nor prerequisites or alternatives. The description only lists parameters without usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
auditA
Inspect ServiceNow audit posture (table/field config) and audit trail.
IMPORTANT: sys_audit is one of the largest tables on the platform.
Every action keeps a default 90-day window for that reason. Override
window_days (or since on history) only when you genuinely
need older rows - wider windows cause slow queries and can time out.
Args: action: 'check_field' | 'check_fields' | 'check_table' | 'history' | 'describe'. table: ServiceNow table name (required for all actions except 'describe'). field: Field name (required for 'check_field'). fields_csv: Comma-separated field names (required for 'check_fields', 1..50). sys_id: 32-char record sys_id (required for 'history'). since: YYYY-MM-DD cutoff (history only; overrides window_days). window_days: Audit-trail/positive-control window (defaults to 90). limit: Row cap for 'history' (defaults to settings.max_row_limit).
| Name | Required | Description | Default |
|---|---|---|---|
| field | No | ||
| limit | No | ||
| since | No | ||
| table | No | ||
| action | Yes | ||
| sys_id | No | ||
| fields_csv | No | ||
| window_days | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It explains that the tool inspects posture and trail, and warns about performance implications of wide windows. However, it doesn't explicitly state whether the tool is read-only or if it modifies data, though 'inspect' implies read-only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is well-structured with a brief intro, an important warning, and a clear Args list. It is informative but not overly verbose. Could be slightly more concise by removing redundant 'required for' phrasing, but overall effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (8 parameters, 5 actions), the description covers all necessary usage and constraints. An output schema exists (not shown) which would further help, but the description itself is complete enough for an agent to understand behavior and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema has 0% description coverage, but the description provides detailed explanations for all 8 parameters including the allowed action values, required fields for each action, and constraints like 1..50 for fields_csv and 32-char sys_id. This adds significant meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states 'Inspect ServiceNow audit posture (table/field config) and audit trail.' This is a specific verb-resource combination that distinguishes it from sibling tools like query (which retrieves records) and record_read (reads specific records).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on when to use the tool and when to be cautious: warns about sys_audit table size, default 90-day window, and advises to override window_days or since only when necessary. Also implicitly differentiates from siblings by focusing on audit trail vs general querying.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
code_searchA
Search ServiceNow code or inspect Code Search table coverage.
Args: action: One of 'search', 'list_tables', or 'describe'. term: Search term for action='search'. table: Optional table filter for action='search' (e.g. 'sys_script_include'). search_group: ServiceNow Code Search group; empty uses sn_codesearch.Default Search Group. limit: Max search results for action='search'. Default 20. extended_matching: Include additional Code Search context fields. Default false. Set true when the extra context is needed.
| Name | Required | Description | Default |
|---|---|---|---|
| term | No | ||
| limit | No | ||
| table | No | ||
| action | No | search | |
| search_group | No | ||
| extended_matching | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral burden. It does disclose useful behavioral details: default limit, default search group, and the effect of extended_matching. But it does not state whether the operation is read-only, what each action returns, or any side effects or permissions needed, so transparency is partial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the tool's purpose and then uses a clean Arg list without redundant prose. Each line carries meaningful information, and the formatting is scannable for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
All parameters are explained and defaults are supplied, and an output schema exists so return-value details are not the description's burden. Minor gaps remain in the semantics of 'list_tables' and 'describe' actions, but overall the description provides sufficient context for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, yet the Args block fully documents all six parameters, including allowed action values, defaults, and when each parameter applies. This more than compensates for the schema's lack of descriptions and gives an agent enough to construct valid calls.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a clear verb and resource: 'Search ServiceNow code or inspect Code Search table coverage.' The action parameter further clarifies three operational modes, making the tool's purpose concrete. It does not explicitly contrast with siblings like 'query' or 'investigate', but the name and core sentence are specific enough.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context through the action choices and parameter explanations, such as 'term: Search term for action='search'' and 'extended_matching... Set true when the extra context is needed.' However, it never says when to choose this tool over alternatives or when not to use it, leaving the selection guidance mostly implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describeA
Return slim field metadata for a table, or list tables / script fields.
Args:
table: ServiceNow table name. Required for the default flow and for
action='list_script_fields'. Ignored by
action='list_tables'.
fields: Comma-separated fields to include. Empty returns a bounded
compact page. '*' explicitly returns all fields.
verbose: When True, return the full sys_dictionary row per field
minus a fixed deny-list of high-noise keys. Default False.
include_docs: When True, attach the matching sys_documentation entry
(label/help/hint/url) per field. Default False.
action: When 'list_script_fields', return the dictionary-driven
script-bearing fields for table with its resolved super_class
chain. When 'list_tables', list tables from sys_db_object
(optionally filtered by name_filter). Empty (default) runs
the standard table-describe flow.
name_filter: Substring matched against table name and label when
action='list_tables'. Empty returns all tables (capped).
field_offset: Zero-based field offset for compact default pages.
field_limit: Field count for compact default pages (1-100).
| Name | Required | Description | Default |
|---|---|---|---|
| table | No | ||
| action | No | ||
| fields | No | ||
| verbose | No | ||
| field_limit | No | ||
| name_filter | No | ||
| field_offset | No | ||
| include_docs | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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 it delivers: it discloses bounded pages, capping, a fixed deny-list for verbose output, the resolved super_class chain for script fields, and default behavior. The read-only nature is implied consistently through 'Return' and 'list' language, and no destructive or surprising side effects are hidden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, followed by a tight, well-organized Args list. Each parameter entry earns its place with concrete behavioral detail, and there is no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has eight parameters, no annotations, and an output schema; the description covers all parameter semantics, action modes, defaults, edge cases, and return-behavior nuances. The presence of an output schema relieves it from explaining return value shape, and nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully explain all eight parameters, and it does. Every parameter is described with its role, allowed values like '*' or 'list_tables', defaults, and mode-specific behavior, adding meaning far beyond the bare schema names and types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Return slim field metadata for a table, or list tables / script fields.' This makes the core purpose clear, and the action modes further clarify behavior. However, it does not explicitly distinguish this tool from sibling tools such as query or record_read, so it stops short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear contextual guidance for each action mode, including which parameters are required or ignored for each flow, and how empty vs. explicit values behave. It does not explicitly state when to prefer this tool over sibling alternatives, but the internal usage conditions are strong and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
flowA
Inspect Flow Designer flows, triggers, and value blobs (read-only).
Args: action: 'contract' | 'inspect' | 'find_by_table' | 'decode_values' | 'list_triggers' | 'describe'. sys_id: Flow sys_id (contract/inspect; mutually exclusive with name). name: Flow name (contract/inspect; mutually exclusive with sys_id). value: gzip+base64+JSON blob to decode (decode_values). table: Target table (find_by_table; optional filter for list_triggers). trigger_type: Trigger type filter (list_triggers, e.g. 'record_update'). active: 'true' | 'false' filter (list_triggers). limit: Row cap for list_triggers (default 100). sections: Comma-separated inspect/contract sections. Empty uses the compact default; '*' returns all. section_limit: Shared cap for selected flow rows/nodes (default 100, max MAX_ROW_LIMIT).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| limit | No | ||
| table | No | ||
| value | No | ||
| action | Yes | ||
| active | No | ||
| sys_id | No | ||
| sections | No | ||
| trigger_type | No | ||
| section_limit | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the full safety burden and explicitly declares 'read-only' up front. It also discloses defaults and caps for limit, section_limit, and sections behavior, plus the sys_id/name mutual exclusion, which are meaningful beyond the schema fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a compact, front-loaded docstring: one purpose sentence followed by a parameter-to-action map. No line is redundant; the actionable constraints (mutual exclusivity, defaults, wildcard behavior) are included without fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a ten-parameter, six-action tool with no schema descriptions, the description addresses almost all invocation details, and an output schema is available for return values. The main residual gap is that the 'contract' action is named and referenced by 'sections' but never defined, which leaves some ambiguity for an agent deciding to use it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description compensates completely by defining the action enum, which parameter applies to which action, value encoding, defaults, and the sys_id/name exclusivity constraint. Every parameter receives semantic context that is not visible in the input schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line names a specific action and resource: 'Inspect Flow Designer flows, triggers, and value blobs (read-only).' The args list clarifies it is a multi-action utility, but it does not explicitly contrast itself with sibling tools such as query, record_read, or describe, so sibling differentiation is left to the reader.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The Args section associates each parameter with the action in which it is used (e.g., 'value: gzip+base64+JSON blob to decode (decode_values)'), which implies the appropriate invocation pattern. It never states when to prefer this tool over sibling alternatives or when not to use it, leaving the selection criteria implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
investigateA
Run an investigation or explain a finding.
Args: action: 'run' | 'explain' | 'describe'. name: Investigation name (required for 'run'; optional direct selector for 'explain' and filter for 'describe'). Available: stale_automations, deprecated_apis, table_health, acl_conflicts, error_analysis, slow_transactions, performance_bottlenecks. params: JSON string of run parameters (run only). element_id: 'table:sys_id' identifier of a finding (explain only).
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| action | Yes | ||
| params | No | {} | |
| element_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
'There are no annotations, so the description carries the full burden of behavior explanation. It does disclose the mode-based behavior and parameter applicability, which is useful. However, it does not describe the effects of running an investigation, whether it creates or modifies state, what the output looks like beyond the output schema, or any side effects or failure conditions.'
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the single-sentence purpose, followed by a tight Args block that covers all four parameters without redundancy. Every sentence contributes operational information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter tool with no annotations and 0% schema coverage, the description is largely complete: it provides action values, investigation name options, and parameter-specific rules. The main remaining gap is the expected inner structure of the 'params' JSON string for 'run', which is left to the caller to know. The existence of an output schema reduces the need to document return values, so the overall definition is still quite complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the parameter burden falls entirely on the description, and it delivers. It explains each parameter in plain language: the accepted values of action, the role of name across modes, that params is a JSON string used only for 'run', and that element_id is a 'table:sys_id' identifier for 'explain'. It even lists available investigation names, making parameter choice actionable.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Run an investigation or explain a finding,' and then defines three distinct actions: 'run', 'explain', and 'describe'. It clearly maps the tool's scope, though it does not explicitly differentiate itself from siblings like 'describe', 'analysis', or 'audit', which leaves a small ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'The description gives clear action-specific usage context: name is 'required for 'run'', optional as a direct selector for 'explain', and a filter for 'describe'; params is 'run only'; and element_id is 'explain only'. This is strong contextual guidance, but it does not explicitly state when to prefer this tool over alternatives 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.
list_tool_packagesA
List all available tool packages and their tool groups.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the basic read operation but provides no details on authentication requirements, potential rate limits, or any side effects. With no annotations, more behavioral context would be helpful, but the simplicity of a list operation mitigates the gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no unnecessary words. It is front-loaded with the action and resource, making it easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool (no parameters, no annotations, output schema exists), the description is minimally sufficient. However, it could clarify what 'tool packages' and 'tool groups' are or if any preconditions exist.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so schema coverage is 100%. The description does not need to add parameter meaning; the baseline score of 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List') and the resource ('all available tool packages and their tool groups'). It distinguishes from sibling tools like 'query' or 'record_read' which have different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives. There is no mention of prerequisites, context, or exclusions, leaving the agent to infer usage solely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
queryA
Read records, aggregates, or a single record from any ServiceNow table.
Args:
table: ServiceNow table name (e.g. 'incident').
sys_id: When set, fetch a single record by sys_id (other filter args ignored
except fields and display_values).
encoded_query: ServiceNow encoded query string (e.g. 'state=1^priority=2').
Empty = no filter.
fields: Comma-separated field projection. List mode requires this argument.
'*' explicitly requests all masked fields. Exact sys_id mode defaults
to the compact sys_id,sys_updated_on projection.
limit: Max rows (1-max_row_limit). Default 20.
offset: Pagination offset.
order_by: Field name; prefix with '-' for descending (e.g. '-sys_created_on').
display_values: True returns display_value form for reference and choice fields.
aggregate: Comma-separated aggregations: 'count', 'avg:', 'sum:',
'min:', 'max:'. When set, returns aggregate result instead of rows.
group_by: Comma-separated fields to group by, e.g. state,active (aggregate mode only).
resolve_labels: Comma-separated 'field=label' pairs (e.g. 'state=open,priority=high').
Each label is resolved via ChoiceRegistry to its underlying value, then ANDed
into encoded_query as 'field=value'.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| table | Yes | ||
| fields | No | ||
| offset | No | ||
| sys_id | No | ||
| group_by | No | ||
| order_by | No | ||
| aggregate | No | ||
| encoded_query | No | ||
| display_values | No | ||
| resolve_labels | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it does a good job: it discloses that sys_id ignores other filter args except fields and display_values, that aggregate mode returns aggregates instead of rows, that list mode requires fields, and exactly how resolve_labels gets ANDed into the encoded query. It could add permission and max-row-limit specifics, but the core behavioral quirks 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
A one-line summary is front-loaded, and the Args block that follows is dense but justified: 11 parameters each get behavior that the schema lacks, so every sentence earns its place. It is long because it must be, not because of wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter tool with no annotations and an output schema (so return shapes needn't be explained), the description covers all argument semantics and mode behaviors thoroughly. The remaining gaps are minor: max_row_limit is referenced but never quantified, and the description gives no hint about when to choose this over record_read, so selection across read siblings is left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% — the schema provides only titles, types, and defaults — so the description must compensate, and it fully does. All 11 parameters get precise semantics: prefixes such as '-' for descending order_by, comma-separated aggregate/group_by syntax, the fields projection rules, and the interaction between sys_id, fields, and display_values. This is exactly the compensation a 0%-coverage schema requires.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening line 'Read records, aggregates, or a single record from any ServiceNow table' states a specific verb, resource, and three distinct modes, so the tool's job is immediately clear. However, it never distinguishes itself from the sibling record_read tool, which appears to overlap in purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use vs. when-not-to-use guidance and no mention of the record_read sibling, so an agent must infer which read tool to pick. Usage context is only implied through argument semantics (e.g., sys_id selects single-record mode, aggregate returns aggregates instead of rows).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_applyA
Commit a previously previewed write. Single-use token.
Args:
preview_token: The token returned by record_write in preview
mode. Single-use - consumed on success or failure.
| Name | Required | Description | Default |
|---|---|---|---|
| preview_token | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, it discloses key behavior: the token is single-use and consumed on success or failure, indicating idempotency and ensuring the agent understands the token's lifecycle.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences plus a bullet, no fluff, purpose is front-loaded. Every word adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple commit tool with one parameter and an output schema, the description covers the essential behavior and usage. Minor gaps in error details, but overall sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates by explaining the preview_token parameter's origin and single-use nature, adding crucial context beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states 'Commit a previously previewed write', using a specific verb ('commit') and resource ('previewed write'), differentiating it from siblings like 'record_write' which handles previews.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states to use after a preview with record_write, and specifies the token origin. Though it does not explicitly list when not to use, the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_readA
Fetch a record by sys_id or name from any table.
Exactly one of sys_id or name must be supplied. Sensitive fields
are masked. The response includes a script_fields list (resolved
dynamically via sys_dictionary plus the table's super_class chain)
so callers can discover which script-bearing fields are writable on a
subsequent record_write.
Args:
table: ServiceNow table name (e.g. sys_script,
catalog_script_client, incident). Tables with zero
script fields return script_fields: [] and succeed.
sys_id: Mutually exclusive with name. Direct lookup by sys_id.
name: Mutually exclusive with sys_id. Resolves via
name=<value> query; ambiguous matches return an error.
fields: Comma-separated field projection. Empty returns compact
identity/update metadata plus all discovered script-bearing fields.
'*' returns the full masked record.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| table | Yes | ||
| fields | No | ||
| sys_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it delivers: sensitive fields are masked, script_fields is resolved via sys_dictionary and super_class chain, zero-script-field tables succeed with an empty list, and ambiguous name lookups error. This gives an agent accurate expectations beyond the input schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average but well-organized with a front-loaded purpose sentence and an Args section. The behavioral details about script_fields are relevant and earn their place. Minor redundancy exists because mutual exclusivity is stated both up front and within each parameter, but overall structure is effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read tool with no annotations and no schema-level parameter descriptions, this definition covers the key operational context: required/optional parameters, edge cases, return behavior, and integration with a subsequent record_write. The presence of an output schema means return-value structure does not need to be duplicated in the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must fully compensate, and it does. Every parameter is explained: table with examples, sys_id with mutual exclusivity, name with resolution semantics and ambiguity errors, and fields with projection and empty-value behavior. This is a complete parameter contract.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence clearly states the verb and resource: 'Fetch a record by sys_id or name from any table.' This distinguishes it from siblings like query, record_write, and describe by specifying a direct record-fetch operation by identifier. The scope is concrete and immediately actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear invocation context: exactly one of sys_id or name must be supplied, and ambiguous name matches return an error. It explains the relationship to record_write by mentioning script_fields discovery, but it does not explicitly contrast this tool with query or other read-oriented siblings. Still, the usage conditions are unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_writeA
Create, update, or delete a record. Defaults to preview mode.
Supply all field values, including complete script or markup strings,
in data. Omitted fields stay unchanged on update. Dictionary
metadata identifies supplied XML fields, including inherited fields;
malformed XML is rejected before preview creation or mutation.
Creates also check inherited mandatory fields, with child declarations
taking precedence. Metadata request errors block writes.
Args: action: 'create' | 'update' | 'delete'. table: Target table. Required. sys_id: Required for 'update' and 'delete'. data: JSON string mapping field names to values, including any script fields. Required for 'create' and 'update'. Maximum 256 KiB of UTF-8 JSON, including escaping and field names. preview: When True (default) returns a preview_token; caller invokes record_apply to commit. When False, write commits immediately.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | ||
| table | No | ||
| action | Yes | ||
| sys_id | No | ||
| preview | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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 does so thoroughly. It discloses preview-mode default, commit behavior, update semantics for omitted fields, XML validation, inherited-field checks, metadata error blocking, and size limits. This is unusually transparent for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence carries operational value. It front-loads the core purpose and default behavior, then uses a structured Args list to map details to parameters. The format is scannable and free of filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a five-parameter write tool with no annotations, the description is complete: it covers action constraints, required fields, data format, size limits, preview flow, XML behavior, and error conditions. An output schema exists, so not describing the full return shape is acceptable. Nothing essential for invoking the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description compensates fully for the 0% schema description coverage by documenting every parameter: action enum values, table and sys_id requirements, data format and maximum size, and preview semantics. It adds meaning well beyond the bare schema titles and defaults, including required conditions per action.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool creates, updates, or deletes a record, using specific verbs and a clear resource. It differentiates from siblings like record_apply (which commits previews), record_read (which reads), and attachment_write (which writes attachments). The purpose is immediately understandable and distinct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly defines the actions this tool supports and explains when the preview mode requires calling record_apply to commit. It does not explicitly contrast with record_read or other sibling write tools, but the action-specific guidance and preview/commit flow provide solid contextual direction. It lacks an explicit 'when not to use' statement, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_choiceA
Resolve a choice label to its underlying value via ChoiceRegistry.
Args: table: ServiceNow table name. field: Field name on that table. label: Choice label to resolve. When empty, returns the full {label: value} mapping for the field.
| Name | Required | Description | Default |
|---|---|---|---|
| field | Yes | ||
| label | No | ||
| table | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It explains the conditional behavior (returns mapping if label empty) but does not disclose error handling, authentication requirements, or rate limits. The read-only nature is implied but not explicitly stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with only three sentences, front-loading the purpose and listing parameters efficiently. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity and the existence of an output schema, the description covers key behaviors. It could mention the output format more explicitly, but overall it is sufficiently complete for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite schema description coverage being 0%, the description explicitly explains each parameter: 'ServiceNow table name', 'Field name on that table', and the special behavior of the label parameter when empty. This adds significant meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: resolving a choice label to its underlying value via ChoiceRegistry. It also distinguishes from siblings by specifying a unique function not shared by other tools in the list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for resolving choice labels and optionally getting the full mapping when label is empty. However, it does not provide explicit when-to-use or when-not-to-use guidance, nor does it mention alternatives among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
service_catalogB
Service Catalog operations. Dispatch on action.
Args: action: One of: catalogs_list, catalog_get, categories_list, category_get, items_list, item_get, item_variables, order_now, add_to_cart, cart_get, cart_submit, cart_checkout. sys_id: Record sys_id (catalog_get, category_get, item_get, item_variables). item_sys_id: Catalog item sys_id (order_now, add_to_cart). catalog_sys_id: Catalog sys_id (categories_list). catalog: Filter by catalog sys_id (items_list). category: Filter by category sys_id (items_list). text: Search text (catalogs_list, items_list). variables: JSON object of variable name/value pairs (order_now, add_to_cart). limit: Max results (catalogs_list, categories_list, items_list). Default 20. offset: Pagination offset (categories_list, items_list). Default 0. top_level_only: Return only top-level categories (categories_list).
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | ||
| limit | No | ||
| action | Yes | ||
| offset | No | ||
| sys_id | No | ||
| catalog | No | ||
| category | No | ||
| variables | No | ||
| item_sys_id | No | ||
| catalog_sys_id | No | ||
| top_level_only | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description lacks disclosure of behavioral traits such as idempotency, side effects (e.g., order_now is likely destructive), or required permissions. No annotations exist to compensate. While actions like 'catalogs_list' are read-only, actions like 'cart_checkout' imply write operations, but this is not clarified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear opening line and a bullet list of parameters. It is reasonably concise given the complexity of 11 parameters and multiple actions. Minor redundancy exists (e.g., repeating action names in parameter explanations), but overall it is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 11 parameters and many actions, the description covers most critical usage aspects: parameter-action mappings and defaults. Since an output schema exists, the lack of return value descriptions is acceptable. However, ordering constraints or pagination details could be more explicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no parameter descriptions (0% coverage), but the description adds meaningful context by explicitly listing which parameters apply to which actions (e.g., sys_id for catalog_get). This significantly compensates for the schema gap, though a few parameters like 'variables' could have more detail on format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that this tool handles Service Catalog operations by dispatching on an 'action' parameter. It enumerates specific actions like catalogs_list and order_now, making the resource explicit. However, it does not differentiate from sibling tools like 'query' or 'record_read', which might also handle catalog-related data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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. The description simply lists actions without indicating preferred use cases or dependencies. Given the sibling tools (e.g., 'query', 'record_read'), explicit guidance on when to use this dispatcher would improve clarity.
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.
2 tool updates
v1.0.0- Changed
code_search1 field changed- added
Input schema / properties / extended_matchingAdded value: +{ + "default": false, + "title": "Extended Matching", + "type": "boolean" +}
- Changed
record_write2 fields changed- removed
Input schema / properties / script_fieldRemoved value: -{ - "default": "", - "title": "Script Field", - "type": "string" -} - removed
Input schema / properties / script_pathRemoved value: -{ - "default": "", - "title": "Script Path", - "type": "string" -}
6 tool updates
v0.12.0- Added
analysis - Removed
build_query - Added
code_search - Changed
describe3 fields changed- added
Input schema / properties / field_limitAdded value: +{ + "default": 25, + "title": "Field Limit", + "type": "integer" +} - added
Input schema / properties / field_offsetAdded value: +{ + "default": 0, + "title": "Field Offset", + "type": "integer" +} - added
Input schema / properties / name_filterAdded value: +{ + "default": "", + "title": "Name Filter", + "type": "string" +}
- Changed
flow2 fields changed- added
Input schema / properties / section_limitAdded value: +{ + "default": 0, + "title": "Section Limit", + "type": "integer" +} - added
Input schema / properties / sectionsAdded value: +{ + "default": "", + "title": "Sections", + "type": "string" +}
- Changed
record_read1 field changed- added
Input schema / properties / fieldsAdded value: +{ + "default": "", + "title": "Fields", + "type": "string" +}
14 tool updates
v0.10.0- First observed
attachment - First observed
attachment_write - First observed
audit - First observed
build_query - First observed
describe - First observed
flow - First observed
investigate - First observed
list_tool_packages - First observed
query - First observed
record_apply - First observed
record_read - First observed
record_write - First observed
resolve_choice - First observed
service_catalog
TDQS
Scored across 15 tools
Most tools have distinct purposes, but `query` and `record_read` overlap in single-record fetching, and `attachment` vs `attachment_write` require careful reading to distinguish read vs write operations. Descriptions otherwise clarify boundaries well.
Naming is mixed: some tools use verb_noun (`record_write`, `attachment_write`, `list_tool_packages`), while others are bare nouns (`attachment`, `flow`, `audit`) or bare verbs (`query`, `investigate`, `describe`). Many tools are action-dispatch style with a single name, creating inconsistent patterns.
15 tools is at the upper end of the ideal range, but the broad ServiceNow platform scope (records, attachments, catalog, flows, audit, code search, analysis) justifies each tool's existence. No obvious bloat or missing core utility.
The surface covers CRUD for records, attachments, catalog operations, flow inspection, audit checks, and code search. Minor gaps exist (e.g., no update/delete for attachments besides upload/delete, no flow modification), but the core workflows are well covered.
Maintenance
Related MCP Connectors
Let AI agents query data and act across all your business apps via MCP.
Unified MCP Server is a remote MCP connector for AI agents and vertical AI products that provides access to 22,000+ authorized SaaS tools across 400+ integrations and 24 categories directly inside LLMs (Claude, GPT, Gemini, Cohere). Tools operate only on explicitly authorized customer connections, enabling agents to safely read and write against live third-party systems.
Governed app access for AI agents: 1,000+ apps & 12,000+ tools via Code Mode MCP.
Your org's AI agents, tasks, runs, search, and brain files as MCP tools and resources.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables natural language interaction with ServiceNow instances for managing incidents, changes, CMDB, service catalog, users, groups, and knowledge base via MCP.4120MIT
- AlicenseNot gradedqualityDmaintenanceA comprehensive MCP server for ServiceNow that provides over 60 pre-built tools for ITSM, ITOM, and App Dev operations, enabling AI agents to manage incidents, changes, users, service catalog, and projects through a unified interface.6MIT
- AlicenseBqualityAmaintenanceEnables AI to interact with ServiceNow instances via MCP, providing 400+ tools across all modules for automation, development, and management.10030816Elastic 2.0
- AlicenseCqualityBmaintenanceEnables natural language control of ServiceNow from AI clients like Claude and Cursor. Provides 400+ tools for incidents, changes, CMDB, and scripts via MCP protocol.1003012MIT