@sonisoft/now-sdk-ext-mcp 4.4.0 → 4.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Tool packages — named subsets of the tool surface.
3
+ *
4
+ * All 86 tools are registered by default, and their descriptions are long by
5
+ * design (`execute_script`'s runs to about thirteen lines, because it has to
6
+ * teach scoped-vs-global name qualification). That is a fixed cost paid on every
7
+ * session, and model tool-selection accuracy degrades as the option count grows.
8
+ * A user doing service-desk work does not need Flow Designer, ATF, or app
9
+ * publishing in front of them.
10
+ *
11
+ * Selected with MCP_TOOL_PACKAGE. Unset means "full", so the default behaviour
12
+ * is unchanged.
13
+ *
14
+ * ---
15
+ *
16
+ * ON NAMING TOOLS THAT DO NOT EXIST YET
17
+ *
18
+ * Packages may reference tools this server does not have. That is deliberate,
19
+ * not sloppiness: NEX-38 (user and group tools), NEX-39 (incident and change
20
+ * tools) and NEX-46 (workflow execution) are all open, and their tools belong in
21
+ * these packages the day they land. Naming them now means the package is already
22
+ * right rather than something someone has to remember to revisit.
23
+ *
24
+ * Unknown names are reported once at startup and skipped. They are a warning
25
+ * rather than an error precisely because forward references are expected — but
26
+ * they are still surfaced, because the same warning catches a genuine typo.
27
+ */
28
+ export const TOOL_PACKAGES = {
29
+ full: {
30
+ description: "Every tool. The default when MCP_TOOL_PACKAGE is unset.",
31
+ tools: ["*"],
32
+ },
33
+ readonly: {
34
+ description: "Only tools that cannot modify anything — safe to expose when the session " +
35
+ "should be able to investigate but never change the instance. Derived from " +
36
+ "the readOnlyHint annotations rather than hand-listed, so it cannot drift.",
37
+ // Resolved dynamically; see resolveReadonlyPackage in common/tool-packages.ts.
38
+ tools: ["@readonly"],
39
+ },
40
+ developer: {
41
+ description: "Building and debugging on an instance: scripts, schema, source sync, " +
42
+ "update sets, scope, logs and code search.",
43
+ tools: [
44
+ "execute_script",
45
+ "query_table",
46
+ "query_syslog",
47
+ "count_records",
48
+ "aggregate_query",
49
+ "aggregate_grouped",
50
+ "discover_table_schema",
51
+ "explain_field",
52
+ "lookup_table",
53
+ "lookup_columns",
54
+ "lookup_app",
55
+ "list_instance_tables",
56
+ "pull_script",
57
+ "push_script",
58
+ "code_search",
59
+ "list_code_search_groups",
60
+ "list_code_search_tables",
61
+ "add_code_search_table",
62
+ "get_current_update_set",
63
+ "list_update_sets",
64
+ "create_update_set",
65
+ "set_current_update_set",
66
+ "inspect_update_set",
67
+ "clone_update_set",
68
+ "move_update_set_records",
69
+ "get_current_scope",
70
+ "set_current_scope",
71
+ "list_scoped_apps",
72
+ "check_instance_health",
73
+ "find_task",
74
+ "export_record_xml",
75
+ "import_records_xml",
76
+ ],
77
+ },
78
+ service_desk: {
79
+ description: "Working tickets: find and update tasks, read knowledge, raise catalog " +
80
+ "requests. No scripting, no schema, no app lifecycle.",
81
+ tools: [
82
+ "find_task",
83
+ "query_table",
84
+ "add_task_comment",
85
+ "assign_task",
86
+ "resolve_incident",
87
+ "close_incident",
88
+ "approve_change",
89
+ "list_knowledge_bases",
90
+ "list_kb_articles",
91
+ "get_kb_article",
92
+ "list_catalog_items",
93
+ "get_catalog_item",
94
+ "list_catalog_item_variables",
95
+ "submit_catalog_request",
96
+ "list_attachments",
97
+ "get_attachment_info",
98
+ // Pending NEX-39.
99
+ "create_incident",
100
+ "update_incident",
101
+ "add_work_note",
102
+ ],
103
+ },
104
+ admin: {
105
+ description: "Instance administration: users and groups, plugins, health, logs, and " +
106
+ "scripting. Deliberately includes execute_script — an admin package " +
107
+ "without it is not an admin package.",
108
+ tools: [
109
+ "query_table",
110
+ "query_syslog",
111
+ "count_records",
112
+ "find_task",
113
+ "execute_script",
114
+ "list_plugins",
115
+ "list_instance_tables",
116
+ "check_instance_health",
117
+ "list_scoped_apps",
118
+ "get_app_details",
119
+ "list_company_apps",
120
+ "search_store_apps",
121
+ "validate_app_install",
122
+ "install_store_app",
123
+ "update_store_app",
124
+ // Pending NEX-38.
125
+ "find_user",
126
+ "list_users",
127
+ "create_user",
128
+ "update_user",
129
+ "list_groups",
130
+ "get_group_members",
131
+ "add_group_members",
132
+ "remove_group_members",
133
+ "assign_user_role",
134
+ "remove_user_role",
135
+ ],
136
+ },
137
+ change_manager: {
138
+ description: "Change and release work: change approvals, update sets, flows and " +
139
+ "workflows, and the app repo.",
140
+ tools: [
141
+ "find_task",
142
+ "query_table",
143
+ "approve_change",
144
+ "add_task_comment",
145
+ "get_current_update_set",
146
+ "list_update_sets",
147
+ "create_update_set",
148
+ "set_current_update_set",
149
+ "inspect_update_set",
150
+ "clone_update_set",
151
+ "move_update_set_records",
152
+ "execute_flow",
153
+ "get_flow_context_status",
154
+ "get_flow_outputs",
155
+ "get_flow_error",
156
+ "get_flow_logs",
157
+ "cancel_flow",
158
+ "create_workflow",
159
+ "install_from_app_repo",
160
+ "publish_to_app_repo",
161
+ // Pending NEX-39 and NEX-46.
162
+ "create_change_request",
163
+ "update_change_request",
164
+ "get_change_details",
165
+ "add_change_task",
166
+ "get_workflow_versions",
167
+ "execute_workflow",
168
+ ],
169
+ },
170
+ flow_developer: {
171
+ description: "Flow Designer work end to end: run, test, copy, inspect and diagnose " +
172
+ "flows, plus the schema and logs needed to debug them.",
173
+ tools: [
174
+ "execute_flow",
175
+ "execute_subflow",
176
+ "execute_action",
177
+ "test_flow",
178
+ "copy_flow",
179
+ "cancel_flow",
180
+ "get_flow_context_status",
181
+ "get_flow_outputs",
182
+ "get_flow_error",
183
+ "get_flow_execution_details",
184
+ "get_flow_logs",
185
+ "query_table",
186
+ "query_syslog",
187
+ "discover_table_schema",
188
+ "lookup_table",
189
+ "get_current_scope",
190
+ "set_current_scope",
191
+ "list_scoped_apps",
192
+ ],
193
+ },
194
+ };
195
+ /** The package used when MCP_TOOL_PACKAGE is unset or unusable. */
196
+ export const DEFAULT_PACKAGE = "full";
197
+ //# sourceMappingURL=tool-packages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-packages.js","sourceRoot":"","sources":["../../src/config/tool-packages.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AASH,MAAM,CAAC,MAAM,aAAa,GAAgC;IACtD,IAAI,EAAE;QACF,WAAW,EAAE,yDAAyD;QACtE,KAAK,EAAE,CAAC,GAAG,CAAC;KACf;IAED,QAAQ,EAAE;QACN,WAAW,EACP,2EAA2E;YAC3E,4EAA4E;YAC5E,2EAA2E;QAC/E,+EAA+E;QAC/E,KAAK,EAAE,CAAC,WAAW,CAAC;KACvB;IAED,SAAS,EAAE;QACP,WAAW,EACP,uEAAuE;YACvE,2CAA2C;QAC/C,KAAK,EAAE;YACH,gBAAgB;YAChB,aAAa;YACb,cAAc;YACd,eAAe;YACf,iBAAiB;YACjB,mBAAmB;YACnB,uBAAuB;YACvB,eAAe;YACf,cAAc;YACd,gBAAgB;YAChB,YAAY;YACZ,sBAAsB;YACtB,aAAa;YACb,aAAa;YACb,aAAa;YACb,yBAAyB;YACzB,yBAAyB;YACzB,uBAAuB;YACvB,wBAAwB;YACxB,kBAAkB;YAClB,mBAAmB;YACnB,wBAAwB;YACxB,oBAAoB;YACpB,kBAAkB;YAClB,yBAAyB;YACzB,mBAAmB;YACnB,mBAAmB;YACnB,kBAAkB;YAClB,uBAAuB;YACvB,WAAW;YACX,mBAAmB;YACnB,oBAAoB;SACvB;KACJ;IAED,YAAY,EAAE;QACV,WAAW,EACP,wEAAwE;YACxE,sDAAsD;QAC1D,KAAK,EAAE;YACH,WAAW;YACX,aAAa;YACb,kBAAkB;YAClB,aAAa;YACb,kBAAkB;YAClB,gBAAgB;YAChB,gBAAgB;YAChB,sBAAsB;YACtB,kBAAkB;YAClB,gBAAgB;YAChB,oBAAoB;YACpB,kBAAkB;YAClB,6BAA6B;YAC7B,wBAAwB;YACxB,kBAAkB;YAClB,qBAAqB;YACrB,kBAAkB;YAClB,iBAAiB;YACjB,iBAAiB;YACjB,eAAe;SAClB;KACJ;IAED,KAAK,EAAE;QACH,WAAW,EACP,wEAAwE;YACxE,qEAAqE;YACrE,qCAAqC;QACzC,KAAK,EAAE;YACH,aAAa;YACb,cAAc;YACd,eAAe;YACf,WAAW;YACX,gBAAgB;YAChB,cAAc;YACd,sBAAsB;YACtB,uBAAuB;YACvB,kBAAkB;YAClB,iBAAiB;YACjB,mBAAmB;YACnB,mBAAmB;YACnB,sBAAsB;YACtB,mBAAmB;YACnB,kBAAkB;YAClB,kBAAkB;YAClB,WAAW;YACX,YAAY;YACZ,aAAa;YACb,aAAa;YACb,aAAa;YACb,mBAAmB;YACnB,mBAAmB;YACnB,sBAAsB;YACtB,kBAAkB;YAClB,kBAAkB;SACrB;KACJ;IAED,cAAc,EAAE;QACZ,WAAW,EACP,oEAAoE;YACpE,8BAA8B;QAClC,KAAK,EAAE;YACH,WAAW;YACX,aAAa;YACb,gBAAgB;YAChB,kBAAkB;YAClB,wBAAwB;YACxB,kBAAkB;YAClB,mBAAmB;YACnB,wBAAwB;YACxB,oBAAoB;YACpB,kBAAkB;YAClB,yBAAyB;YACzB,cAAc;YACd,yBAAyB;YACzB,kBAAkB;YAClB,gBAAgB;YAChB,eAAe;YACf,aAAa;YACb,iBAAiB;YACjB,uBAAuB;YACvB,qBAAqB;YACrB,6BAA6B;YAC7B,uBAAuB;YACvB,uBAAuB;YACvB,oBAAoB;YACpB,iBAAiB;YACjB,uBAAuB;YACvB,kBAAkB;SACrB;KACJ;IAED,cAAc,EAAE;QACZ,WAAW,EACP,uEAAuE;YACvE,uDAAuD;QAC3D,KAAK,EAAE;YACH,cAAc;YACd,iBAAiB;YACjB,gBAAgB;YAChB,WAAW;YACX,WAAW;YACX,aAAa;YACb,yBAAyB;YACzB,kBAAkB;YAClB,gBAAgB;YAChB,4BAA4B;YAC5B,eAAe;YACf,aAAa;YACb,cAAc;YACd,uBAAuB;YACvB,cAAc;YACd,mBAAmB;YACnB,mBAAmB;YACnB,kBAAkB;SACrB;KACJ;CACJ,CAAC;AAEF,mEAAmE;AACnE,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC"}
package/dist/index.js CHANGED
@@ -3,37 +3,20 @@
3
3
  // anything can read credentials. An MCP server is always launched as a
4
4
  // non-interactive child process, where the keyring cannot be unlocked.
5
5
  import "./common/credstore-boot.js";
6
+ // Second, and before anything constructs a core manager: core's loggers are field
7
+ // initializers, and until NEX-3 merely constructing one created ./logs/ in whatever
8
+ // directory the client happened to launch this server from.
9
+ import { flushLogs } from "@sonisoft/now-sdk-ext-core";
10
+ import { initLogging, getLogger } from "./common/logging.js";
11
+ initLogging();
6
12
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7
13
  import { registerServiceNowResources } from "./resources/servicenow.js";
14
+ import { TOOL_REGISTRY } from "./tools/registry.js";
15
+ import { registerListToolPackagesTool } from "./tools/tool-packages.js";
16
+ import { resolveToolPackage, reportResolution } from "./common/tool-packages.js";
8
17
  import { readServerVersion } from "./common/version.js";
9
18
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
10
- import { registerExecuteScriptTool } from "./tools/execute-script.js";
11
- import { registerRunAtfTestTool, registerRunAtfTestSuiteTool, } from "./tools/atf.js";
12
- import { registerQueryTableTool } from "./tools/query-table.js";
13
- import { registerFindAtfTestsTool } from "./tools/find-atf-tests.js";
14
- import { registerQuerySyslogTool } from "./tools/query-syslog.js";
15
- import { registerLookupAppTool } from "./tools/lookup-app.js";
16
- import { registerLookupTableTool } from "./tools/lookup-table.js";
17
- import { registerLookupColumnsTool } from "./tools/lookup-columns.js";
18
- import { registerCodeSearchTool, registerListCodeSearchGroupsTool, registerListCodeSearchTablesTool, registerAddCodeSearchTableTool, } from "./tools/codesearch.js";
19
- import { registerDiscoverTableSchemaTool, registerExplainFieldTool, registerValidateCatalogTool, } from "./tools/schema.js";
20
- import { registerGetCurrentScopeTool, registerSetCurrentScopeTool, registerListScopedAppsTool, } from "./tools/scope.js";
21
- import { registerGetCurrentUpdateSetTool, registerListUpdateSetsTool, registerCreateUpdateSetTool, registerSetCurrentUpdateSetTool, registerInspectUpdateSetTool, registerCloneUpdateSetTool, registerMoveUpdateSetRecordsTool, } from "./tools/updateset.js";
22
- import { registerAddTaskCommentTool, registerAssignTaskTool, registerResolveIncidentTool, registerCloseIncidentTool, registerApproveChangeTool, registerFindTaskTool, } from "./tools/task.js";
23
- import { registerBatchCreateRecordsTool, registerBatchUpdateRecordsTool, } from "./tools/batch.js";
24
- import { registerListAttachmentsTool, registerGetAttachmentInfoTool, registerUploadAttachmentTool, } from "./tools/attachment.js";
25
- import { registerGetAppDetailsTool, registerValidateAppInstallTool, registerSearchStoreAppsTool, registerListCompanyAppsTool, registerInstallStoreAppTool, registerUpdateStoreAppTool, registerInstallFromAppRepoTool, registerPublishToAppRepoTool, } from "./tools/app-manager.js";
26
- import { registerCreateWorkflowTool } from "./tools/workflow.js";
27
- import { registerPullScriptTool, registerPushScriptTool, } from "./tools/scriptsync.js";
28
- import { registerCountRecordsTool, registerAggregateQueryTool, registerAggregateGroupedTool, } from "./tools/aggregate.js";
29
- import { registerCheckInstanceHealthTool } from "./tools/health.js";
30
- import { registerGetCmdbRelationshipsTool, registerTraverseCmdbGraphTool, } from "./tools/cmdb.js";
31
- import { registerListInstanceTablesTool, registerListPluginsTool, } from "./tools/discovery.js";
32
- import { registerQueryUpdateRecordsTool, registerQueryDeleteRecordsTool, } from "./tools/query-batch.js";
33
- import { registerExportRecordXmlTool, registerImportRecordsXmlTool, } from "./tools/xml-record.js";
34
- import { registerListKnowledgeBasesTool, registerGetKnowledgeBaseTool, registerListKbCategoriesTool, registerCreateKbCategoryTool, registerListKbArticlesTool, registerGetKbArticleTool, registerCreateKbArticleTool, registerUpdateKbArticleTool, registerPublishKbArticleTool, } from "./tools/knowledge.js";
35
- import { registerListCatalogItemsTool, registerGetCatalogItemTool, registerListCatalogCategoriesTool, registerGetCatalogCategoryTool, registerListCatalogItemVariablesTool, registerSubmitCatalogRequestTool, } from "./tools/catalog.js";
36
- import { registerExecuteFlowTool, registerExecuteSubflowTool, registerExecuteActionTool, registerGetFlowContextStatusTool, registerGetFlowOutputsTool, registerGetFlowErrorTool, registerCancelFlowTool, registerTestFlowTool, registerCopyFlowTool, registerGetFlowExecutionDetailsTool, registerGetFlowLogsTool, } from "./tools/flow.js";
19
+ const log = getLogger("mcp");
37
20
  const server = new McpServer({
38
21
  name: "now-sdk-ext-mcp",
39
22
  version: readServerVersion(),
@@ -49,109 +32,89 @@ const server = new McpServer({
49
32
  },
50
33
  });
51
34
  registerServiceNowResources(server);
52
- // Register tools
53
- registerExecuteScriptTool(server);
54
- registerRunAtfTestTool(server);
55
- registerRunAtfTestSuiteTool(server);
56
- registerQueryTableTool(server);
57
- registerFindAtfTestsTool(server);
58
- registerQuerySyslogTool(server);
59
- registerLookupAppTool(server);
60
- registerLookupTableTool(server);
61
- registerLookupColumnsTool(server);
62
- registerCodeSearchTool(server);
63
- registerListCodeSearchGroupsTool(server);
64
- registerListCodeSearchTablesTool(server);
65
- registerAddCodeSearchTableTool(server);
66
- registerDiscoverTableSchemaTool(server);
67
- registerExplainFieldTool(server);
68
- registerValidateCatalogTool(server);
69
- registerGetCurrentScopeTool(server);
70
- registerSetCurrentScopeTool(server);
71
- registerListScopedAppsTool(server);
72
- registerGetCurrentUpdateSetTool(server);
73
- registerListUpdateSetsTool(server);
74
- registerCreateUpdateSetTool(server);
75
- registerSetCurrentUpdateSetTool(server);
76
- registerInspectUpdateSetTool(server);
77
- registerAddTaskCommentTool(server);
78
- registerAssignTaskTool(server);
79
- registerResolveIncidentTool(server);
80
- registerCloseIncidentTool(server);
81
- registerApproveChangeTool(server);
82
- registerFindTaskTool(server);
83
- registerBatchCreateRecordsTool(server);
84
- registerBatchUpdateRecordsTool(server);
85
- registerListAttachmentsTool(server);
86
- registerGetAttachmentInfoTool(server);
87
- registerGetAppDetailsTool(server);
88
- registerValidateAppInstallTool(server);
89
- registerSearchStoreAppsTool(server);
90
- registerListCompanyAppsTool(server);
91
- registerInstallStoreAppTool(server);
92
- registerUpdateStoreAppTool(server);
93
- registerInstallFromAppRepoTool(server);
94
- registerPublishToAppRepoTool(server);
95
- registerCreateWorkflowTool(server);
96
- registerPullScriptTool(server);
97
- registerPushScriptTool(server);
98
- registerCountRecordsTool(server);
99
- registerAggregateQueryTool(server);
100
- registerAggregateGroupedTool(server);
101
- registerCheckInstanceHealthTool(server);
102
- registerGetCmdbRelationshipsTool(server);
103
- registerTraverseCmdbGraphTool(server);
104
- registerListInstanceTablesTool(server);
105
- registerListPluginsTool(server);
106
- registerQueryUpdateRecordsTool(server);
107
- registerQueryDeleteRecordsTool(server);
108
- registerCloneUpdateSetTool(server);
109
- registerMoveUpdateSetRecordsTool(server);
110
- registerUploadAttachmentTool(server);
111
- registerExportRecordXmlTool(server);
112
- registerImportRecordsXmlTool(server);
113
- registerListKnowledgeBasesTool(server);
114
- registerGetKnowledgeBaseTool(server);
115
- registerListKbCategoriesTool(server);
116
- registerCreateKbCategoryTool(server);
117
- registerListKbArticlesTool(server);
118
- registerGetKbArticleTool(server);
119
- registerCreateKbArticleTool(server);
120
- registerUpdateKbArticleTool(server);
121
- registerPublishKbArticleTool(server);
122
- registerListCatalogItemsTool(server);
123
- registerGetCatalogItemTool(server);
124
- registerListCatalogCategoriesTool(server);
125
- registerGetCatalogCategoryTool(server);
126
- registerListCatalogItemVariablesTool(server);
127
- registerSubmitCatalogRequestTool(server);
128
- registerExecuteFlowTool(server);
129
- registerExecuteSubflowTool(server);
130
- registerExecuteActionTool(server);
131
- registerGetFlowContextStatusTool(server);
132
- registerGetFlowOutputsTool(server);
133
- registerGetFlowErrorTool(server);
134
- registerCancelFlowTool(server);
135
- registerTestFlowTool(server);
136
- registerCopyFlowTool(server);
137
- registerGetFlowExecutionDetailsTool(server);
138
- registerGetFlowLogsTool(server);
35
+ // Tools are registered through the registry rather than 86 direct calls, so a
36
+ // package can select a subset. Resolution happens once, before registration —
37
+ // filtering after the fact would still pay the import cost and still advertise
38
+ // the tools in tools/list.
39
+ const activePackage = resolveToolPackage(process.env.MCP_TOOL_PACKAGE);
40
+ reportResolution(activePackage);
41
+ for (const name of activePackage.tools) {
42
+ TOOL_REGISTRY[name](server);
43
+ }
44
+ // Always registered, whatever the package. A filtered session otherwise has no
45
+ // way to tell "this server cannot do that" from "that tool is filtered out of
46
+ // this session".
47
+ registerListToolPackagesTool(server, activePackage);
139
48
  // Prevent the process from crashing silently on unexpected errors.
140
49
  // Log to stderr (stdout is reserved for JSON-RPC).
50
+ // Through the logger, not console.error: an uncaught error here can be an auth or
51
+ // HTTP failure carrying a live session, and only the logger redacts.
141
52
  process.on("uncaughtException", (error) => {
142
- console.error("[now-sdk-ext-mcp] Uncaught exception:", error);
53
+ log.error("Uncaught exception", { error });
143
54
  });
144
55
  process.on("unhandledRejection", (reason) => {
145
- console.error("[now-sdk-ext-mcp] Unhandled rejection:", reason);
56
+ log.error("Unhandled rejection", { reason });
146
57
  });
58
+ /** Longest a shutdown will wait on the logger before giving up on it. */
59
+ const FLUSH_TIMEOUT_MS = 2000;
60
+ /**
61
+ * Flushes buffered log records, then exits — but never lets the flush prevent the exit.
62
+ *
63
+ * Awaiting `flushLogs()` unguarded would make termination depend on that promise
64
+ * settling. Stuck I/O would then turn a graceful SIGTERM into a process that has to be
65
+ * SIGKILLed, which is strictly worse than the lost log lines this exists to save.
66
+ * `unref` so a pending timer cannot itself hold the process open.
67
+ *
68
+ * The rejection is swallowed on purpose: `void p.finally(cb)` re-throws after running
69
+ * the callback, so a failing flush would surface as an unhandled rejection during
70
+ * shutdown. Exiting regardless is the intent, so say so rather than rely on
71
+ * `process.exit` winning the race against the rejection being reported.
72
+ */
73
+ async function flushAndExit(code) {
74
+ let timer;
75
+ try {
76
+ await Promise.race([
77
+ flushLogs(),
78
+ new Promise((resolve) => {
79
+ timer = setTimeout(resolve, FLUSH_TIMEOUT_MS);
80
+ timer.unref?.();
81
+ }),
82
+ ]);
83
+ }
84
+ catch {
85
+ // Nothing useful to do while shutting down; the exit below still happens.
86
+ }
87
+ finally {
88
+ // Tidy even though process.exit follows: leaving it dangling would be one more
89
+ // thing to reason about if this ever grows a path that does not exit.
90
+ if (timer)
91
+ clearTimeout(timer);
92
+ }
93
+ process.exit(code);
94
+ }
95
+ // A client stops this server by signalling it, which is the ORDINARY way it exits —
96
+ // not an error path. Winston's file transport buffers, so without a flush here the
97
+ // last records before shutdown are lost whenever NEX_LOG_FILE is on, which is exactly
98
+ // when someone is reading the file to find out what happened.
99
+ //
100
+ // `once`, so a second signal from an impatient client still terminates immediately
101
+ // rather than queueing another flush.
102
+ for (const signal of ["SIGINT", "SIGTERM"]) {
103
+ process.once(signal, () => {
104
+ void flushAndExit(0);
105
+ });
106
+ }
147
107
  // Start the server on stdio transport
148
108
  async function main() {
149
109
  const transport = new StdioServerTransport();
150
110
  await server.connect(transport);
151
- console.error("now-sdk-ext-mcp server running on stdio");
111
+ log.info("now-sdk-ext-mcp server running on stdio");
152
112
  }
153
113
  main().catch((error) => {
154
- console.error("Fatal error:", error);
155
- process.exit(1);
114
+ log.error("Fatal error starting server", { error });
115
+ // Flush before exiting: winston buffers, and this is the line that explains why
116
+ // the server is not there. Same timeout guard — a stuck flush must not leave a
117
+ // failed startup hanging instead of exiting non-zero.
118
+ void flushAndExit(1);
156
119
  });
157
120
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Tool name -> registration function.
3
+ *
4
+ * index.ts used to call all 86 registration functions directly, which meant the
5
+ * only way to know which tools exist was to read 86 lines of imports. Nothing
6
+ * could ask "which tools are there?" without registering them.
7
+ *
8
+ * This table makes the set addressable, so a package can name a subset and
9
+ * something can register exactly that. It is the same shape as TOOL_ANNOTATIONS
10
+ * in common/annotations.ts — deliberately, since they are keyed identically and
11
+ * a test asserts they cover the same set. Two tables that must agree are worth
12
+ * having only if something checks that they do.
13
+ *
14
+ * GENERATED-ISH: derived from src/tools/*.ts, but checked in and maintained by
15
+ * hand. A new tool has to be added here or it cannot be registered at all —
16
+ * which is the point, and is asserted by a test rather than left to memory.
17
+ */
18
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
19
+ /** Registers exactly one tool on the server. */
20
+ export type ToolRegistrar = (server: McpServer) => void;
21
+ export declare const TOOL_REGISTRY: Record<string, ToolRegistrar>;
22
+ /** Every tool name this server knows how to register. */
23
+ export declare function allToolNames(): string[];
24
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA+IpE,gDAAgD;AAChD,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC;AAExD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAkHvD,CAAC;AAEF,yDAAyD;AACzD,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAEvC"}