
Security News
Lovable’s OJ Rewrites Vite’s Dev Server in Rust as AI Lowers the Cost of Forking Open Source
Lovable’s OJ rewrites Vite’s dev server in Rust, reducing memory use and preview times as AI lowers the cost of open source reimplementation.
@syncrona/mcp-server
Advanced tools
MCP server for SyncroNow AI — drives ServiceNow scope automation, record queries, and background script execution from AI chat clients.
MCP server package for automating SyncroNow AI + ServiceNow operational tasks from AI chat clients.
sys.scripts.doNode 22
ServiceNow credentials (SN_INSTANCE, SN_USER, SN_PASSWORD) from any of
the supported sources, resolved in this order (first non-empty value wins,
mirroring the core CLI where project-local sources beat the global store):
.syncrona-mcp/secrets.json (or SYNCRONA_SECRETS_FILE).env in project rootsyncrona login)The resolved secrets are cached for 30 seconds per project directory.
SyncroNow AI CLI available in the target project (npx syncrona ...)
npm run --workspace=@syncrona/mcp-server build
npm run --workspace=@syncrona/mcp-server test
node packages/mcp-server/dist/index.js
This server communicates over stdio (MCP standard transport).
On startup, MCP now auto-pulls all ServiceNow scoped apps (x_*) into local workspace folders under packages/<scope>/.
For each discovered scope it creates/updates:
packages/<scope>/sync.config.jspackages/<scope>/src/** (downloaded record files)packages/<scope>/sync.manifest.jsonTo disable this startup auto-sync, set:
SYNCRONA_MCP_AUTO_PULL_ALL_SCOPES=falseOptional HTTP health endpoint can be enabled with environment variables:
SYNCRONA_HEALTH_HTTP_PORT (required to enable endpoint)SYNCRONA_HEALTH_HTTP_HOST (optional, default: 127.0.0.1)SYNCRONA_HEALTH_HTTP_PATH (optional, default: /healthz)The server writes structured diagnostics to stderr only (stdout is reserved
for the JSON-RPC protocol stream). Each tool call is logged with its
correlationId, tool, and durationMs. Configure logging with:
SYNCRONA_LOG_LEVEL (optional, one of debug | info | warn | error | silent, default: info)SYNCRONA_LOG_FORMAT (optional, text | json, default: text) — or pass the CLI flag --log-format=jsonSet SYNCRONA_LOG_LEVEL=debug to surface otherwise-swallowed diagnostics, such
as failed secrets/.env loading and audit-log write failures.
The server reads the following environment variables (all optional):
| Variable | Purpose |
|---|---|
SYNCRONA_ENV | Selects the active guardrail environment by name, overriding policy.activeEnvironment in the guardrails config (drives per-environment policy such as allowFullNodeAccess and preflight enforcement). Defaults to default. |
SYNCRONA_LOG_LEVEL | Log verbosity: debug | info | warn | error | silent (default info). See Logging. |
SYNCRONA_LOG_FORMAT | Log output format: text | json (default text); equivalent to --log-format=json. See Logging. |
SYNCRONA_MCP_AUTO_PULL_ALL_SCOPES | Set to false to disable the startup auto-pull of every x_* scoped app into packages/<scope>/. Enabled by default. See Run. |
SYNCRONA_MCP_CREATE_TABLE_ALLOWLIST | Comma-separated list of extra tables that sn_create_record may write to, on top of the default allowlist of scoped-app artifact tables. High-risk system tables (sys_user, sys_user_has_role, sys_user_role, sys_user_group, sys_properties, cmdb_ci) stay denied even if listed. |
SYNCRONA_SECRETS_FILE | Absolute path to the MCP secrets JSON file, overriding the default .syncrona-mcp/secrets.json lookup in the project directory. |
SYNCRONA_HEALTH_HTTP_PORT | Port for the optional HTTP health endpoint. Setting it is what enables the endpoint; unset means no HTTP listener. |
SYNCRONA_HEALTH_HTTP_HOST | Bind address for the health endpoint (default 127.0.0.1). Only read when the port is set. |
SYNCRONA_HEALTH_HTTP_PATH | Request path for the health endpoint (default /healthz). Only read when the port is set. |
ServiceNow credentials (SN_INSTANCE, SN_USER, SN_PASSWORD) and Jira
credentials (JIRA_BASE_URL, JIRA_TOKEN, JIRA_EMAIL, JIRA_DEPLOYMENT)
are read from bare environment variables, and those take precedence over
every other source. For ServiceNow the full order is process environment → MCP
secrets file → project .env → encrypted CredentialStore, merged per key (see
Requirements). For Jira, a complete set of JIRA_* env vars
wins over the stored profile, except when a profile is named explicitly. Env
vars are convenient for CI; prefer syncrona login / syncrona jira-login
for developer machines so secrets stay encrypted at rest.
{
"mcpServers": {
"syncrona": {
"command": "node",
"args": [
"/absolute/path/to/syncrona_ai/packages/mcp-server/dist/index.js"
],
"cwd": "/absolute/path/to/your-syncrona-project"
}
}
}
This repository also includes a ready-to-use config at ../../../.vscode/mcp.json.
sync_get_session_context
sync_set_scope
sync_list_scopes
sync_set_update_set
sync_list_update_sets
sync_prepare_session
sync_preflight_check
sync_check_instance_capabilities
sn_query_records
sysparm_queryanalyzeFieldsn_create_record
sn_execute_background_script
sync_create_script_include
sys_script_includesyncrona refresh so local file is downloadedsync_create_script_include_and_sync
syncrona refreshsn_list_metadata_records
sn_get_metadata_record
sys_id with normalized schemasn_update_metadata_record
sn_build_dependency_graph
sn_analyze_impact
sn_diff_dependency_graphs
sync_detect_drift
sync_validate_change_package
sync_build_semantic_index / sync_search_semantic_index
sn_analyze_script_architecture / sn_analyze_script_security / sn_analyze_script_performance
sn_analyze_script_full
suppressedIdssync_symbol_cross_reference
sn_autonomous_remediation_workflow
sync_health_check
sync_metrics_trend
sync_tool_contract_info
version, deprecated, replacement hints)sync_list_recent_changes
sys_update_xml since a timestamp (default 24h), grouped by recordsn_search_scripts
sn_get_record_history
sys_audit for a single recordsync_generate_release_notes
sys_update_xml records in markdown or jsonsync_run_atf_tests
sys_atf_test_result / sys_atf_test_suite_result for pass/fail resultssync_validate_before_push
sync_compare_instances
sync_export_update_set
export_update_set processor and optionally writes it under .syncrona-mcp/exportssync_suggest_tests
sync_diff_instance_vs_local
sync_status / sync_refresh / sync_build / sync_push
run_node_code
confirmDestructive: true and the guardrail policy must enable allowFullNodeAccess (default false), because in-process sandboxing of arbitrary Node code is not a real security boundaryrun_workspace_command
node, npm, npx) in the workspace for automation tasks, with a bounded timeoutMsbash -c, sh -c, etc.) to reduce command-injection risk; confirmation is default-deny — only the bare commands git, ls, cat, pwd, echo and syncrona may run without confirmDestructive: true (and even those confirm for mutating git / syncrona subcommands); anything else, including any command given as a path such as ./git, always requires itsn_render_analysis_markdown
sync_unified_change_workflow
executionMode to avoid confusion between mocked and remote executionsync_table_api_coverage_matrix
sync_plan_minimal_footprint
sync_ai_next_actions
sync_generate_scope_knowledge
sync_generate_scope_docs
.syncrona-mcp/docs/{scope}/ including overview, dependencies, relationships, and per-object pagessync_validate_scope_knowledge
sync_scope_knowledge_auto_update
sync_generate_table_dependency_report
.syncrona-mcp/reports/sync_analyze_scope_relations
sync_onboarding_bootstrap
jira_get_issue
sync_get_session_contextsync_set_scope and sync_set_update_setsync_prepare_session for one-call setupsync_check_instance_capabilitiessync_create_script_include_and_syncsyncrona build and syncrona pushrun_workspace_command blocks unsafe shell interpreter patterns (bash -c, sh -c, etc.) to reduce command-injection risk.
All MCP tool handlers are wrapped with a top-level error boundary so failures return structured tool errors instead of crashing the server.
The safety policy is a guardrail, not a security boundary. The workspace
command filter is a deny-list (rm, sudo, shell interpreters with -c,
shell metacharacters in arguments) and can be bypassed by interpreters or
tools it does not list (node -e, python -c, npx <pkg> and similar).
Likewise, the approval metadata accepted by workflow tools
(approvalId/approvers) is recorded for audit purposes but is not
verified against any external system. Run the server only with credentials
and OS permissions you would trust the calling AI agent to hold directly.
sn_execute_background_script first tries the scoped REST endpoint
(…/sinc/runBackgroundScript). When that endpoint is not installed it falls
back to posting to the instance-internal /sys.scripts.do UI endpoint. That
fallback is best-effort: modern instances usually require a CSRF session
token (sysparm_ck) and an elevated admin session there, so it may return
an HTML login/redirect page instead of executing. It also bypasses the REST
API audit trail on the instance side — prefer installing the scoped app for
auditable script execution.
Create sync.mcp.guardrails.json in project root:
{
"enforcePreflightForMutations": true,
"expectedScope": "x_nuvo_sync",
"expectedUpdateSetName": "AI Work",
"expectedUpdateSetSysId": ""
}
When enforcement is enabled, mutating tools are blocked if preflight fails.
Mutating tools support dryRun=true and return planned actions without applying changes.
packages/mcp-server/docs/operator-runbook.mdpackages/mcp-server/docs/troubleshooting-playbook.mdpackages/mcp-server/docs/release-governance.mdFor long-running AI sessions, use the context pack in packages/mcp-server/docs/ai-context/:
README.md (entry point)architecture.mdworkflow-and-safety.mdtools-catalog.mdtesting-and-quality.mdbacklog-and-roadmap.mdYou can enrich graph inputs with explicit meta relations:
metaRelations: [{"type":"table","target":"task"},{"type":"include","target":"MyUtil"}]affectsTables: ['incident', 'task']callsIncludes: ['RiskHelper']sn_analyze_script_full accepts optional suppressedIds so temporary or accepted risks can be tracked separately from active findings.
It also accepts optional policy:
{
"weights": { "high": 5, "medium": 3, "low": 1 },
"suppressions": [{ "id": "arch.logging.noise", "expiresAt": "2030-01-01T00:00:00.000Z" }]
}
{
"task": "Update validation logic for incident handler",
"taskType": "hybrid",
"executionMode": "mocked",
"script": "gs.log('debug');",
"proposedChanges": [
{ "filePath": "src/sys_script_include/IncidentHandler/script.js", "objectId": "script:IncidentHandler", "estimatedLines": 20 }
],
"approval": { "approvalId": "APR-42", "approvers": ["alice", "bob"] },
"rollbackEvidence": {
"reason": "safety rollback coverage",
"impactedEntities": ["script:IncidentHandler"],
"revertSteps": ["restore previous script body"],
"validationPlan": "run analysis and smoke checks"
},
"apply": false
}
{
"scope": "x_nuvo_sync",
"task": "optimize incident validation",
"entities": [
{ "id": "script:IncidentHandler", "name": "IncidentHandler", "tableName": "incident" }
],
"graph": {
"nodes": [
{ "id": "script:IncidentHandler", "kind": "script", "label": "IncidentHandler" },
{ "id": "table:incident", "kind": "table", "label": "incident" }
],
"edges": [
{ "from": "script:IncidentHandler", "to": "table:incident", "relation": "reads", "why": "GlideRecord reference" }
]
},
"writeFiles": false,
"trigger": "manual"
}
Set writeFiles: true only when you explicitly want to persist artifacts under .syncrona-mcp/.
{
"scope": "x_nuvo_sync",
"task": "table dependencies report",
"writeFiles": false
}
Expected outputs:
.syncrona-mcp/reports/<scope>-table-dependencies.md.syncrona-mcp/reports/<scope>-table-dependencies.jsonFAQs
MCP server for SyncroNow AI — drives ServiceNow scope automation, record queries, and background script execution from AI chat clients.
We found that @syncrona/mcp-server demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Security News
Lovable’s OJ rewrites Vite’s dev server in Rust, reducing memory use and preview times as AI lowers the cost of open source reimplementation.

Security News
It has been one year since Shai-Hulud made its first appearance on npm.

Research
/Security News
Operators behind PolinRider used a compromised GitHub account to plant malware in four development versions of a Packagist package with 700,000+ downloads.