sn-mcp
ServiceNow MCP Reports
Servidor MCP local que expone dos informes de ServiceNow bajo demanda, construido a partir del plan en [[ServiceNow MCP Server — Syslog & Dev Work Reports (Plan)]]. La narrativa de configuración y la resolución de problemas también están en la bóveda: [[ServiceNow MCP Server — Syslog & Dev Work Reports (Setup Guide)]].
Para ideas sobre cómo extender esto más allá de las dos herramientas actuales, consulta
echelon-ai-labs/servicenow-mcp — un servidor
ServiceNow Python/FastMCP mucho más grande (incidencias, cambios, catálogo, base de conocimiento, script includes, herramientas
Agile). Ya se ha tomado de él: un transporte HTTP accesible de forma remota junto con stdio (paso 7) — ese repositorio
expone tanto stdio como SSE; y sus filtros por rango de fechas usan las palabras clave de fechas relativas propias de ServiceNow
(ONLast week@javascript:gs.beginningOfLastWeek()@javascript:gs.endOfLastWeek()) en lugar de construir
literales de fecha y hora a mano — comparar ese patrón con la consulta de este proyecto es lo que sacó a la luz el
bug de zona horaria corregido en el paso 4/Resolución de problemas más abajo. Aún no tomado: su AuthManager, que soporta
Basic/OAuth/API-key tras una única interfaz (este proyecto es solo Basic).
Herramientas
Ambas son consultas GET de solo lectura contra la Table API — ninguna herramienta escribe nunca en la instancia. Ambas
devuelven únicamente filas crudas/agrupadas; el análisis (sugerencias de corrección, problemas señalados) ocurre en conversación con
Claude, no dentro de la herramienta. Ambas paginan automáticamente (queryTableAll en servicenow-client.ts, 1000
filas/página, tope de seguridad de 10 000 filas) en lugar de un sysparm_limit de una sola página hardcodeado — si una consulta alcanza el
tope, la respuesta comienza con un bloque de texto explícito ⚠ Truncated antes del JSON, en lugar de devolver
silenciosamente un informe parcial. Registradas para ambos puntos de entrada desde el mismo src/create-server.ts.
get_syslog_report
Obtiene las filas de syslog de un solo día, filtradas a warning/error por defecto.
Parámetro | Tipo | Obligatorio | Por defecto | Notas |
|
| no | ayer |
|
|
| no |
| Nombres descriptivos ( |
Devuelve un array JSON de:
{
"sys_created_on": "2026-08-25 17:30:24",
"message": "SG-Azure Request failed with statusCode: 403 Code: AccessDenied ...",
"source": "sn_sg_azure_integ",
"level": "2",
"node": "..."
}get_developer_work_report
Obtiene los cambios de sys_update_xml entre dos fechas, agrupados por autor y update set.
Parámetro | Tipo | Obligatorio | Por defecto | Notas |
|
| sí | — |
|
|
| sí | — |
|
Devuelve un array JSON de:
{
"author": "system",
"updateSet": "Default",
"isDefaultUpdateSet": true,
"changeCount": 2,
"changes": [
{ "name": "...", "type": "Service Graph Connections State", "created": "2026-08-25 10:30:30" }
]
}Related MCP server: ServiceNow MCP Server
1. Aprovisionar una cuenta de servicio de ServiceNow de solo lectura (manual, una sola vez)
Hazlo en el PDI (https://dev203275.service-now.com), con sesión iniciada como admin:
User Administration → Users → New
User ID:
claude_mcp_readonlyEstablece una contraseña, desmarca "Password needs reset"
Marca "Web service access only" — obligatorio. Sin ello,
SNCRestrictBasicAuthUserAuthenticationGatede ServiceNow bloquea la autenticación Basic por REST para esta cuenta incluso con una contraseña correcta, porque la cuenta también tiene permitido el inicio de sesión interactivo en la UI. Síntoma si se omite: cada llamada REST devuelve 401 con"User is not authenticated"mientras que iniciar sesión en la UI con las mismas credenciales funciona bien. Consulta Resolución de problemas.
En ese registro de usuario → lista relacionada Roles → Edit → añade:
rest_api_explorer(acceso a la API REST)Acceso de lectura a
syslogysys_update_xml/sys_update_set— en un PDI,snc_read_onlyo el rolitilintegrado normalmente cubren esto; confirma que el usuario realmente puede leer esas tablas (consulta el paso 3 más abajo) en lugar de asumir el nombre del rol.No concedas
admin— esta cuenta solo debe consultar, según el plan original.
Copia
.env.examplea.envy rellenaSN_USER/SN_PASScon esta nueva cuenta.
2. Compilar
cd C:\Users\willr\projects\servicenow-mcp-reports
npm install
npm run build3. Verificar las credenciales antes de conectarlas a un cliente
$env:SN_INSTANCE="https://dev203275.service-now.com"; $env:SN_USER="claude_mcp_readonly"; $env:SN_PASS="<password>"
node -e "fetch(process.env.SN_INSTANCE+'/api/now/table/sys_user?sysparm_limit=1',{headers:{Authorization:'Basic '+Buffer.from(process.env.SN_USER+':'+process.env.SN_PASS).toString('base64')}}).then(r=>console.log(r.status))"Debería imprimir 200. Si devuelve 401, comprueba la contraseña; si devuelve 403, el rol aún no cubre esa tabla.
4. Nombre de la tabla syslog, valores de level y filtrado por fecha (resuelto)
Confirmado en esta instancia el 2026-08-26:
La tabla es
syslog, nosys_log(sys_logdevuelve400 Invalid table sys_log).syslog.leveles numérico, no las cadenas"warning"/"error":-2=Trace, -1=Debug, 0=Information, 1=Warning, 2=Error, 3=Fatal(confirmado medianteGET /api/now/table/sys_choice?sysparm_query=name=syslog^element=level).El filtro de rango de fechas debe usar literales de fecha y hora simples (
'<date> 00:00:00'@'<date> 23:59:59'), nojavascript:gs.dateGenerate(...)— consulta Resolución de problemas para ver por qué este último desplazaba silenciosamente los resultados al día equivocado.
src/tools/syslog.ts asigna internamente los nombres de nivel descriptivos ("warning", "error", etc.) a estos códigos, de
modo que quienes la invocan pueden seguir pasando nombres — esto solo importa si extiendes la herramienta o la apuntas a una
instancia distinta, donde el mapeo debería re-verificarse con la misma consulta sys_choice.
5. Registrar en Claude Code CLI
claude mcp add --scope user servicenow-reports -- "C:\Program Files\nodejs\node.exe" C:\Users\willr\projects\servicenow-mcp-reports\dist\index.jsUsa la ruta absoluta a node.exe, no node a secas — una sesión de Claude Code iniciada antes de que Node estuviera en
PATH no podrá resolver un comando node a secas al lanzar el servidor (claude mcp list mostrará
CONNECTION_CLOSED). Verifícalo con claude mcp list.
Claude Code CLI lee SN_INSTANCE/SN_USER/SN_PASS desde .env en la carpeta de este proyecto — no se necesita configuración de
env adicional en el lado de la CLI siempre que .env exista aquí. Esto depende de que src/index.ts resuelva
la ruta de .env en relación con el propio script compilado (import.meta.url), no process.cwd() — un simple
import "dotenv/config" fallaría, porque Claude Code lanza este servidor desde un directorio de trabajo no relacionado.
Consulta Resolución de problemas si parece que .env deja de cargarse.
6. Registrar con Claude Desktop
Añade a %APPDATA%\Claude\claude_desktop_config.json (creado de cero — no existía en esta máquina):
{
"mcpServers": {
"servicenow-reports": {
"command": "C:\\Program Files\\nodejs\\node.exe",
"args": ["C:\\Users\\willr\\projects\\servicenow-mcp-reports\\dist\\index.js"],
"env": {
"SN_INSTANCE": "https://dev203275.service-now.com",
"SN_USER": "claude_mcp_readonly",
"SN_PASS": "<password>"
}
}
}
}Claude Desktop lanza el servidor como un proceso propio sin heredar el .env de este proyecto, por lo que las credenciales
se repiten aquí explícitamente. Reinicia Claude Desktop después de editar y luego comprueba el icono de conector 🔌 para
confirmar que se conectó.
7. Opcional: transporte HTTP accesible de forma remota
Los pasos 5–6 usan stdio, que solo funciona para un cliente que pueda lanzar un proceso local (Claude Code, Claude
Desktop). Un cliente que no pueda — p. ej. las Scheduled Tasks alojadas de claude.ai — necesita en su lugar un endpoint HTTP.
src/http.ts expone las mismas dos herramientas sobre el transporte Streamable HTTP de MCP en POST/GET /mcp.
npm run build
$env:MCP_HTTP_TOKEN="<pick something random>"; npm run start:httpValores por defecto: se vincula a 127.0.0.1:3535 (se puede sobrescribir con MCP_HTTP_HOST / MCP_HTTP_PORT en .env). Si
MCP_HTTP_TOKEN está definido, cada solicitud debe enviar Authorization: Bearer <token> o recibe 401; si no está definido,
el servidor registra una advertencia y acepta solicitudes no autenticadas — correcto mientras esté vinculado solo a localhost, no
correcto si alguna vez queda detrás de un túnel público. createMcpExpressApp() (del SDK) también activa automáticamente la protección contra DNS-rebinding
siempre que esté vinculado a un host localhost.
Para alcanzarlo realmente desde las Scheduled Tasks alojadas de claude.ai, 127.0.0.1 no basta — necesita una
URL pública (p. ej. un túnel: ngrok http 3535, o un despliegue real). Eso es un paso aparte, no realizado aquí;
esto solo añade la capacidad. Haz primero una prueba de humo local:
curl.exe -s -X POST http://127.0.0.1:3535/mcp -H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" -H "Authorization: Bearer $env:MCP_HTTP_TOKEN" -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"smoketest","version":"0.0.1"}}}'Debería devolver 200 con una cabecera de respuesta mcp-session-id y un cuerpo JSON-RPC result.
Resolución de problemas
401 en cada llamada REST a pesar de una contraseña correcta, pero iniciar sesión en la UI de ServiceNow con las mismas credenciales funciona — esto es
SNCRestrictBasicAuthUserAuthenticationGate: bloquea la autenticación Basic por REST para cuentas que también pueden iniciar sesión interactivamente. Solución: marca "Web service access only" en el registro de usuario (paso 1). No pierdas tiempo restableciendo la contraseña otra vez — ese patrón (inicio de sesión en la UI OK, REST 401,"User is not authenticated"/"Required to provide Auth information") es esta compuerta, no una credencial incorrecta. Se puede diagnosticar directamente desde System Logs (/syslog_list.do, filtrando por el nombre de la cuenta).Invalid table sys_log(HTTP 400) — la tabla essyslog, sin guion bajo.El informe vuelve vacío aunque existan logs para ese día —
leveles numérico en esta instancia (consulta el paso 4), no las cadenas"warning"/"error". Revisa el mapeo mediante la consultasys_choicesi apuntas esto a una instancia distinta.Missing SN_INSTANCE, SN_USER, or SN_PASS environment variables"cuando se lanza como un servidor MCP real, aunque.envexista y una prueba directa denode dist/index.jsdesde esta carpeta funcione bien — esa prueba directa tiene éxito porque suprocess.cwd()resulta ser la carpeta del proyecto; Claude Code lanza el servidor desde otro lugar, por lo quedotenv/configa secas falla silenciosamente. Confirma quesrc/index.tsresuelve.envmedianteimport.meta.url, no cwd (consulta el paso 5). Verifica siempre con una llamada real a una herramienta MCP, no solo con una ejecución directa del script — los dos pueden no coincidir.get_syslog_reportdevuelve silenciosamente el día equivocado / le faltan varias horas — fue un bug real, encontrado el 2026-08-26 mediante una comprobación puntual comparando con los patrones de consulta de echelon-ai-labs/servicenow-mcp.src/tools/syslog.tssolía construir el filtro de fecha consys_created_onBETWEENjavascript:gs.dateGenerate('<date>','00:00:00')@javascript:gs.dateGenerate(...).gs.dateGenerate()evalúa en la zona horaria configurada de la instancia, perosys_created_onse devuelve como un valor UTC crudo a través de la Table API — por lo que la ventana se desplazaba silenciosamente por el delta UTC de la instancia (~7h en este PDI), arrastrando la cola del día equivocado y perdiendo las primeras horas del correcto. Corregido eliminando por completo el envoltoriojavascript:gs.dateGenerate(...)y pasando cadenas literales simples'<date> 00:00:00'@'<date> 23:59:59', que se comparan directamente con el valor almacenado crudo sin conversión de zona horaria. Verificado: 834 filas en las 24 horas completas para 2026-08-25, frente a 366 filas en 17 horas antes de la corrección. Si la configuración de zona horaria de esta instancia cambia alguna vez, vuelve a verificarlo con la misma comprobación de cobertura de todas las horas (consulta la comprobación puntual estilo paso 4) en lugar de asumir.CONNECTION_CLOSEDenclaude mcp list— la sesión de la CLI se inició antes de que Node.js estuviera en PATH. Registra con la ruta absoluta denode.exe(ya hecho en el paso 5) o inicia una sesión nueva.Se editó el código, se recompiló, pero el comportamiento no cambió — una sesión de Claude Code ya en ejecución mantiene el
dist/antiguo cargado sobre su conexión stdio. Ejecuta/mcpen esa sesión para reconectar; no hace falta reiniciar.
Archivos
src/servicenow-client.ts— envoltorio de la Table API (autenticación Basic) másqueryTableAll, el bucle de paginación que usan ambas herramientas (1000 filas/página, tope de seguridad de 10 000 filas, devuelve{ rows, truncated }). Cambia aquí la autenticación Basic por OAuth más adelante si sales del PDI.src/tools/syslog.ts,src/tools/dev-work-report.ts— las dos consultas de informes.src/create-server.ts— construye unMcpServery registra ambas herramientas; compartido por los dos puntos de entrada siguientes.src/index.ts— punto de entrada stdio (Claude Code/Desktop); resuelve.enven relación consigo mismo (no con cwd).src/http.ts— punto de entrada Streamable HTTP (paso 7); autenticación con bearer token, un servidor+transporte por sesión.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceProvides AI assistants with read access to ServiceNow instances to aid in building and debugging applications. It enables users to query tables, retrieve specific records, and inspect table schemas using standard ServiceNow encoded query strings.
- AlicenseNot gradedqualityDmaintenanceEnables authenticated interaction with ServiceNow via its REST API using per-user OAuth 2.0 tokens. It provides tools for managing incidents, tasks, knowledge articles, and service catalog requests while maintaining user-specific permissions.284MIT
- AlicenseAqualityCmaintenanceA read-only MCP server that enables AI assistants to query ServiceNow instances—incidents, changes, users, CMDB—with malformed query linting and injection protection.7MIT
- FlicenseNot gradedqualityDmaintenanceExposes Azure Log Analytics workspace data with tools for querying AuditLogs and AzureActivity tables, supporting custom KQL queries, time range filters, and pagination.
Related MCP Connectors
Read-only NuMetric.work accounting & ERP data: statements, KPIs, reports, invoices, documents.
Provide seamless access to Appfolio Property Manager Reporting API through a standardized MCP serv…
Investigate errors, track deployments, analyze performance, and manage application monitoring
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/TaiRaven/sn-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server