@greensecurity/javascript-sdk 0.9.1 → 0.11.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.
Files changed (223) hide show
  1. package/README.md +81 -16
  2. package/bin/mcp-server.js +39384 -0
  3. package/bin/mcp-server.js.map +301 -0
  4. package/funcs/organizationsGetFacility.d.ts +2 -1
  5. package/funcs/organizationsGetFacility.d.ts.map +1 -1
  6. package/funcs/organizationsGetFacility.js +11 -7
  7. package/funcs/organizationsGetFacility.js.map +1 -1
  8. package/funcs/organizationsListOrSearchFacilities.d.ts +2 -1
  9. package/funcs/organizationsListOrSearchFacilities.d.ts.map +1 -1
  10. package/funcs/organizationsListOrSearchFacilities.js +11 -7
  11. package/funcs/organizationsListOrSearchFacilities.js.map +1 -1
  12. package/funcs/userGetCurrentUser.d.ts +2 -1
  13. package/funcs/userGetCurrentUser.d.ts.map +1 -1
  14. package/funcs/userGetCurrentUser.js +10 -6
  15. package/funcs/userGetCurrentUser.js.map +1 -1
  16. package/funcs/userGetUserById.d.ts +2 -1
  17. package/funcs/userGetUserById.d.ts.map +1 -1
  18. package/funcs/userGetUserById.js +11 -7
  19. package/funcs/userGetUserById.js.map +1 -1
  20. package/funcs/userLogsUserIntoTheSystem.d.ts +2 -1
  21. package/funcs/userLogsUserIntoTheSystem.d.ts.map +1 -1
  22. package/funcs/userLogsUserIntoTheSystem.js +11 -7
  23. package/funcs/userLogsUserIntoTheSystem.js.map +1 -1
  24. package/funcs/userMagiclink.d.ts +17 -0
  25. package/funcs/userMagiclink.d.ts.map +1 -0
  26. package/funcs/userMagiclink.js +115 -0
  27. package/funcs/userMagiclink.js.map +1 -0
  28. package/funcs/userPassword.d.ts +18 -0
  29. package/funcs/userPassword.d.ts.map +1 -0
  30. package/funcs/userPassword.js +116 -0
  31. package/funcs/userPassword.js.map +1 -0
  32. package/funcs/userPasswordResetRequest.d.ts +17 -0
  33. package/funcs/userPasswordResetRequest.d.ts.map +1 -0
  34. package/funcs/userPasswordResetRequest.js +115 -0
  35. package/funcs/userPasswordResetRequest.js.map +1 -0
  36. package/funcs/vendorsCreateVendorRegistration.d.ts +2 -1
  37. package/funcs/vendorsCreateVendorRegistration.d.ts.map +1 -1
  38. package/funcs/vendorsCreateVendorRegistration.js +11 -7
  39. package/funcs/vendorsCreateVendorRegistration.js.map +1 -1
  40. package/funcs/vendorsListVendorJobTitles.d.ts +2 -1
  41. package/funcs/vendorsListVendorJobTitles.d.ts.map +1 -1
  42. package/funcs/vendorsListVendorJobTitles.js +11 -7
  43. package/funcs/vendorsListVendorJobTitles.js.map +1 -1
  44. package/jsr.json +1 -1
  45. package/lib/config.d.ts +5 -5
  46. package/lib/config.d.ts.map +1 -1
  47. package/lib/config.js +3 -3
  48. package/lib/config.js.map +1 -1
  49. package/lib/files.js.map +1 -1
  50. package/lib/sdks.d.ts +1 -1
  51. package/lib/sdks.d.ts.map +1 -1
  52. package/mcp-server/build.d.mts.map +1 -0
  53. package/mcp-server/build.mjs +14 -0
  54. package/mcp-server/build.mjs.map +1 -0
  55. package/mcp-server/cli/start/command.d.ts +2 -0
  56. package/mcp-server/cli/start/command.d.ts.map +1 -0
  57. package/mcp-server/cli/start/command.js +99 -0
  58. package/mcp-server/cli/start/command.js.map +1 -0
  59. package/mcp-server/cli/start/impl.d.ts +15 -0
  60. package/mcp-server/cli/start/impl.d.ts.map +1 -0
  61. package/mcp-server/cli/start/impl.js +97 -0
  62. package/mcp-server/cli/start/impl.js.map +1 -0
  63. package/mcp-server/cli.d.ts +6 -0
  64. package/mcp-server/cli.d.ts.map +1 -0
  65. package/mcp-server/cli.js +10 -0
  66. package/mcp-server/cli.js.map +1 -0
  67. package/mcp-server/console-logger.d.ts +7 -0
  68. package/mcp-server/console-logger.d.ts.map +1 -0
  69. package/mcp-server/console-logger.js +59 -0
  70. package/mcp-server/console-logger.js.map +1 -0
  71. package/mcp-server/mcp-server.d.ts +2 -0
  72. package/mcp-server/mcp-server.d.ts.map +1 -0
  73. package/mcp-server/mcp-server.js +29 -0
  74. package/mcp-server/mcp-server.js.map +1 -0
  75. package/mcp-server/resources.d.ts +27 -0
  76. package/mcp-server/resources.d.ts.map +1 -0
  77. package/mcp-server/resources.js +51 -0
  78. package/mcp-server/resources.js.map +1 -0
  79. package/mcp-server/scopes.d.ts +3 -0
  80. package/mcp-server/scopes.d.ts.map +1 -0
  81. package/mcp-server/scopes.js +8 -0
  82. package/mcp-server/scopes.js.map +1 -0
  83. package/mcp-server/server.d.ts +11 -0
  84. package/mcp-server/server.d.ts.map +1 -0
  85. package/mcp-server/server.js +44 -0
  86. package/mcp-server/server.js.map +1 -0
  87. package/mcp-server/shared.d.ts +7 -0
  88. package/mcp-server/shared.d.ts.map +1 -0
  89. package/mcp-server/shared.js +98 -0
  90. package/mcp-server/shared.js.map +1 -0
  91. package/mcp-server/tools/organizationsGetFacility.d.ts +8 -0
  92. package/mcp-server/tools/organizationsGetFacility.d.ts.map +1 -0
  93. package/mcp-server/tools/organizationsGetFacility.js +64 -0
  94. package/mcp-server/tools/organizationsGetFacility.js.map +1 -0
  95. package/mcp-server/tools/organizationsListOrSearchFacilities.d.ts +8 -0
  96. package/mcp-server/tools/organizationsListOrSearchFacilities.d.ts.map +1 -0
  97. package/mcp-server/tools/organizationsListOrSearchFacilities.js +77 -0
  98. package/mcp-server/tools/organizationsListOrSearchFacilities.js.map +1 -0
  99. package/mcp-server/tools/userGetCurrentUser.d.ts +3 -0
  100. package/mcp-server/tools/userGetCurrentUser.d.ts.map +1 -0
  101. package/mcp-server/tools/userGetCurrentUser.js +26 -0
  102. package/mcp-server/tools/userGetCurrentUser.js.map +1 -0
  103. package/mcp-server/tools/userGetUserById.d.ts +8 -0
  104. package/mcp-server/tools/userGetUserById.d.ts.map +1 -0
  105. package/mcp-server/tools/userGetUserById.js +64 -0
  106. package/mcp-server/tools/userGetUserById.js.map +1 -0
  107. package/mcp-server/tools/userLogsUserIntoTheSystem.d.ts +8 -0
  108. package/mcp-server/tools/userLogsUserIntoTheSystem.d.ts.map +1 -0
  109. package/mcp-server/tools/userLogsUserIntoTheSystem.js +94 -0
  110. package/mcp-server/tools/userLogsUserIntoTheSystem.js.map +1 -0
  111. package/mcp-server/tools/userMagiclink.d.ts +8 -0
  112. package/mcp-server/tools/userMagiclink.d.ts.map +1 -0
  113. package/mcp-server/tools/userMagiclink.js +64 -0
  114. package/mcp-server/tools/userMagiclink.js.map +1 -0
  115. package/mcp-server/tools/userPassword.d.ts +8 -0
  116. package/mcp-server/tools/userPassword.d.ts.map +1 -0
  117. package/mcp-server/tools/userPassword.js +65 -0
  118. package/mcp-server/tools/userPassword.js.map +1 -0
  119. package/mcp-server/tools/userPasswordResetRequest.d.ts +8 -0
  120. package/mcp-server/tools/userPasswordResetRequest.d.ts.map +1 -0
  121. package/mcp-server/tools/userPasswordResetRequest.js +64 -0
  122. package/mcp-server/tools/userPasswordResetRequest.js.map +1 -0
  123. package/mcp-server/tools/vendorsCreateVendorRegistration.d.ts +8 -0
  124. package/mcp-server/tools/vendorsCreateVendorRegistration.d.ts.map +1 -0
  125. package/mcp-server/tools/vendorsCreateVendorRegistration.js +64 -0
  126. package/mcp-server/tools/vendorsCreateVendorRegistration.js.map +1 -0
  127. package/mcp-server/tools/vendorsListVendorJobTitles.d.ts +8 -0
  128. package/mcp-server/tools/vendorsListVendorJobTitles.d.ts.map +1 -0
  129. package/mcp-server/tools/vendorsListVendorJobTitles.js +64 -0
  130. package/mcp-server/tools/vendorsListVendorJobTitles.js.map +1 -0
  131. package/mcp-server/tools.d.ts +25 -0
  132. package/mcp-server/tools.d.ts.map +1 -0
  133. package/mcp-server/tools.js +74 -0
  134. package/mcp-server/tools.js.map +1 -0
  135. package/models/operations/index.d.ts +3 -0
  136. package/models/operations/index.d.ts.map +1 -1
  137. package/models/operations/index.js +3 -0
  138. package/models/operations/index.js.map +1 -1
  139. package/models/operations/magiclink.d.ts +57 -0
  140. package/models/operations/magiclink.d.ts.map +1 -0
  141. package/models/operations/magiclink.js +96 -0
  142. package/models/operations/magiclink.js.map +1 -0
  143. package/models/operations/password.d.ts +59 -0
  144. package/models/operations/password.d.ts.map +1 -0
  145. package/models/operations/password.js +107 -0
  146. package/models/operations/password.js.map +1 -0
  147. package/models/operations/passwordresetrequest.d.ts +57 -0
  148. package/models/operations/passwordresetrequest.d.ts.map +1 -0
  149. package/models/operations/passwordresetrequest.js +96 -0
  150. package/models/operations/passwordresetrequest.js.map +1 -0
  151. package/package.json +14 -2
  152. package/react-query/index.d.ts +3 -0
  153. package/react-query/index.d.ts.map +1 -1
  154. package/react-query/index.js +3 -0
  155. package/react-query/index.js.map +1 -1
  156. package/react-query/userMagiclink.d.ts +23 -0
  157. package/react-query/userMagiclink.d.ts.map +1 -0
  158. package/react-query/userMagiclink.js +47 -0
  159. package/react-query/userMagiclink.js.map +1 -0
  160. package/react-query/userPassword.d.ts +24 -0
  161. package/react-query/userPassword.d.ts.map +1 -0
  162. package/react-query/userPassword.js +48 -0
  163. package/react-query/userPassword.js.map +1 -0
  164. package/react-query/userPasswordResetRequest.d.ts +23 -0
  165. package/react-query/userPasswordResetRequest.d.ts.map +1 -0
  166. package/react-query/userPasswordResetRequest.js +47 -0
  167. package/react-query/userPasswordResetRequest.js.map +1 -0
  168. package/sdk/user.d.ts +22 -0
  169. package/sdk/user.d.ts.map +1 -1
  170. package/sdk/user.js +31 -0
  171. package/sdk/user.js.map +1 -1
  172. package/src/funcs/organizationsGetFacility.ts +37 -8
  173. package/src/funcs/organizationsListOrSearchFacilities.ts +35 -8
  174. package/src/funcs/userGetCurrentUser.ts +33 -7
  175. package/src/funcs/userGetUserById.ts +36 -8
  176. package/src/funcs/userLogsUserIntoTheSystem.ts +36 -8
  177. package/src/funcs/userMagiclink.ts +162 -0
  178. package/src/funcs/userPassword.ts +163 -0
  179. package/src/funcs/userPasswordResetRequest.ts +163 -0
  180. package/src/funcs/vendorsCreateVendorRegistration.ts +36 -8
  181. package/src/funcs/vendorsListVendorJobTitles.ts +37 -8
  182. package/src/lib/config.ts +5 -5
  183. package/src/lib/files.ts +1 -1
  184. package/src/lib/sdks.ts +1 -1
  185. package/src/mcp-server/cli/start/command.ts +67 -0
  186. package/src/mcp-server/cli/start/impl.ts +123 -0
  187. package/src/mcp-server/cli.ts +13 -0
  188. package/src/mcp-server/console-logger.ts +71 -0
  189. package/src/mcp-server/mcp-server.ts +26 -0
  190. package/src/mcp-server/resources.ts +96 -0
  191. package/src/mcp-server/scopes.ts +7 -0
  192. package/src/mcp-server/server.ts +52 -0
  193. package/src/mcp-server/shared.ts +75 -0
  194. package/src/mcp-server/tools/organizationsGetFacility.ts +37 -0
  195. package/src/mcp-server/tools/organizationsListOrSearchFacilities.ts +52 -0
  196. package/src/mcp-server/tools/userGetCurrentUser.ts +30 -0
  197. package/src/mcp-server/tools/userGetUserById.ts +37 -0
  198. package/src/mcp-server/tools/userLogsUserIntoTheSystem.ts +67 -0
  199. package/src/mcp-server/tools/userMagiclink.ts +37 -0
  200. package/src/mcp-server/tools/userPassword.ts +38 -0
  201. package/src/mcp-server/tools/userPasswordResetRequest.ts +37 -0
  202. package/src/mcp-server/tools/vendorsCreateVendorRegistration.ts +38 -0
  203. package/src/mcp-server/tools/vendorsListVendorJobTitles.ts +37 -0
  204. package/src/mcp-server/tools.ts +116 -0
  205. package/src/models/operations/index.ts +3 -0
  206. package/src/models/operations/magiclink.ts +127 -0
  207. package/src/models/operations/password.ts +140 -0
  208. package/src/models/operations/passwordresetrequest.ts +131 -0
  209. package/src/react-query/index.ts +3 -0
  210. package/src/react-query/userMagiclink.ts +88 -0
  211. package/src/react-query/userPassword.ts +89 -0
  212. package/src/react-query/userPasswordResetRequest.ts +89 -0
  213. package/src/sdk/user.ts +55 -0
  214. package/src/types/async.ts +68 -0
  215. package/types/async.d.ts +23 -0
  216. package/types/async.d.ts.map +1 -0
  217. package/types/async.js +44 -0
  218. package/types/async.js.map +1 -0
  219. package/.devcontainer/README.md +0 -35
  220. package/docs/sdks/greensecurity/README.md +0 -14
  221. package/docs/sdks/organizations/README.md +0 -252
  222. package/docs/sdks/user/README.md +0 -348
  223. package/docs/sdks/vendors/README.md +0 -219
@@ -20,6 +20,7 @@ import {
20
20
  import * as errors from "../models/errors/index.js";
21
21
  import { SDKValidationError } from "../models/errors/sdkvalidationerror.js";
22
22
  import * as operations from "../models/operations/index.js";
23
+ import { APICall, APIPromise } from "../types/async.js";
23
24
  import { Result } from "../types/fp.js";
24
25
 
25
26
  /**
@@ -28,11 +29,11 @@ import { Result } from "../types/fp.js";
28
29
  * @remarks
29
30
  * List valid job titles for Vendors. This can be used during sign up or in a filter.
30
31
  */
31
- export async function vendorsListVendorJobTitles(
32
+ export function vendorsListVendorJobTitles(
32
33
  client: GreenSecurityCore,
33
34
  request: operations.ListVendorJobTitlesRequest,
34
35
  options?: RequestOptions,
35
- ): Promise<
36
+ ): APIPromise<
36
37
  Result<
37
38
  operations.ListVendorJobTitlesResponseBody,
38
39
  | errors.ApiErrorResponse
@@ -45,6 +46,34 @@ export async function vendorsListVendorJobTitles(
45
46
  | RequestTimeoutError
46
47
  | ConnectionError
47
48
  >
49
+ > {
50
+ return new APIPromise($do(
51
+ client,
52
+ request,
53
+ options,
54
+ ));
55
+ }
56
+
57
+ async function $do(
58
+ client: GreenSecurityCore,
59
+ request: operations.ListVendorJobTitlesRequest,
60
+ options?: RequestOptions,
61
+ ): Promise<
62
+ [
63
+ Result<
64
+ operations.ListVendorJobTitlesResponseBody,
65
+ | errors.ApiErrorResponse
66
+ | errors.ApiErrorResponse
67
+ | APIError
68
+ | SDKValidationError
69
+ | UnexpectedClientError
70
+ | InvalidRequestError
71
+ | RequestAbortedError
72
+ | RequestTimeoutError
73
+ | ConnectionError
74
+ >,
75
+ APICall,
76
+ ]
48
77
  > {
49
78
  const parsed = safeParse(
50
79
  request,
@@ -53,7 +82,7 @@ export async function vendorsListVendorJobTitles(
53
82
  "Input validation failed",
54
83
  );
55
84
  if (!parsed.ok) {
56
- return parsed;
85
+ return [parsed, { status: "invalid" }];
57
86
  }
58
87
  const payload = parsed.value;
59
88
  const body = null;
@@ -73,7 +102,7 @@ export async function vendorsListVendorJobTitles(
73
102
  }));
74
103
 
75
104
  const context = {
76
- baseURL: options?.serverURL ?? "",
105
+ baseURL: options?.serverURL ?? client._baseURL ?? "",
77
106
  operationID: "listVendorJobTitles",
78
107
  oAuth2Scopes: [],
79
108
 
@@ -96,7 +125,7 @@ export async function vendorsListVendorJobTitles(
96
125
  timeoutMs: options?.timeoutMs || client._options.timeoutMs || -1,
97
126
  }, options);
98
127
  if (!requestRes.ok) {
99
- return requestRes;
128
+ return [requestRes, { status: "invalid" }];
100
129
  }
101
130
  const req = requestRes.value;
102
131
 
@@ -107,7 +136,7 @@ export async function vendorsListVendorJobTitles(
107
136
  retryCodes: context.retryCodes,
108
137
  });
109
138
  if (!doResult.ok) {
110
- return doResult;
139
+ return [doResult, { status: "request-error", request: req }];
111
140
  }
112
141
  const response = doResult.value;
113
142
 
@@ -134,8 +163,8 @@ export async function vendorsListVendorJobTitles(
134
163
  M.fail("5XX"),
135
164
  )(response, { extraFields: responseFields });
136
165
  if (!result.ok) {
137
- return result;
166
+ return [result, { status: "complete", request: req, response }];
138
167
  }
139
168
 
140
- return result;
169
+ return [result, { status: "complete", request: req, response }];
141
170
  }
package/src/lib/config.ts CHANGED
@@ -36,11 +36,11 @@ export type SDKOptions = {
36
36
  /**
37
37
  * Allows overriding the default server used by the SDK
38
38
  */
39
- serverIdx?: number;
39
+ serverIdx?: number | undefined;
40
40
  /**
41
41
  * Allows overriding the default server URL used by the SDK
42
42
  */
43
- serverURL?: string;
43
+ serverURL?: string | undefined;
44
44
  /**
45
45
  * Allows overriding the default retry config used by the SDK
46
46
  */
@@ -69,8 +69,8 @@ export function serverURLFromOptions(options: SDKOptions): URL | null {
69
69
  export const SDK_METADATA = {
70
70
  language: "typescript",
71
71
  openapiDocVersion: "0.0.3",
72
- sdkVersion: "0.9.1",
73
- genVersion: "2.512.4",
72
+ sdkVersion: "0.11.0",
73
+ genVersion: "2.518.1",
74
74
  userAgent:
75
- "speakeasy-sdk/typescript 0.9.1 2.512.4 0.0.3 @greensecurity/javascript-sdk",
75
+ "speakeasy-sdk/typescript 0.11.0 2.518.1 0.0.3 @greensecurity/javascript-sdk",
76
76
  } as const;
package/src/lib/files.ts CHANGED
@@ -36,5 +36,5 @@ export async function readableStreamToArrayBuffer(
36
36
  offset += chunk.length;
37
37
  }
38
38
 
39
- return concatenatedChunks.buffer;
39
+ return concatenatedChunks.buffer as ArrayBuffer;
40
40
  }
package/src/lib/sdks.ts CHANGED
@@ -79,7 +79,7 @@ export class ClientSDK {
79
79
  readonly #httpClient: HTTPClient;
80
80
  readonly #hooks: SDKHooks;
81
81
  readonly #logger?: Logger | undefined;
82
- protected readonly _baseURL: URL | null;
82
+ public readonly _baseURL: URL | null;
83
83
  public readonly _options: SDKOptions & { hooks?: SDKHooks };
84
84
 
85
85
  constructor(options: SDKOptions = {}) {
@@ -0,0 +1,67 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import { buildCommand } from "@stricli/core";
6
+ import { numberParser } from "@stricli/core";
7
+ import * as z from "zod";
8
+ import { consoleLoggerLevels } from "../../console-logger.js";
9
+ import { mcpScopes } from "../../scopes.js";
10
+
11
+ export const startCommand = buildCommand({
12
+ loader: async () => {
13
+ const { main } = await import("./impl.js");
14
+ return main;
15
+ },
16
+ parameters: {
17
+ flags: {
18
+ "log-level": {
19
+ kind: "enum",
20
+ brief: "The log level to use for the server",
21
+ default: "info",
22
+ values: consoleLoggerLevels,
23
+ },
24
+ transport: {
25
+ kind: "enum",
26
+ brief: "The transport to use for communicating with the server",
27
+ default: "stdio",
28
+ values: ["stdio", "sse"],
29
+ },
30
+ port: {
31
+ kind: "parsed",
32
+ brief: "The port to use when the SSE transport is enabled",
33
+ default: "2718",
34
+ parse: (val: string) =>
35
+ z.coerce.number().int().gte(0).lt(65536).parse(val),
36
+ },
37
+ ...(mcpScopes.length
38
+ ? {
39
+ scope: {
40
+ kind: "enum",
41
+ brief:
42
+ "Mount tools/resources that match given scope (repeatable flag)",
43
+ values: mcpScopes,
44
+ variadic: true,
45
+ optional: true,
46
+ },
47
+ }
48
+ : {}),
49
+
50
+ "server-url": {
51
+ kind: "parsed",
52
+ brief: "Overrides the default server URL used by the SDK",
53
+ optional: true,
54
+ parse: (value) => new URL(value).toString(),
55
+ },
56
+ "server-index": {
57
+ kind: "parsed",
58
+ brief: "Selects a predefined server used by the SDK",
59
+ optional: true,
60
+ parse: numberParser,
61
+ },
62
+ },
63
+ },
64
+ docs: {
65
+ brief: "Run the Model Context Protocol server",
66
+ },
67
+ });
@@ -0,0 +1,123 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
6
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
7
+ import express from "express";
8
+ import { SDKOptions } from "../../../lib/config.js";
9
+ import { LocalContext } from "../../cli.js";
10
+ import {
11
+ ConsoleLoggerLevel,
12
+ createConsoleLogger,
13
+ } from "../../console-logger.js";
14
+ import { MCPScope } from "../../scopes.js";
15
+ import { createMCPServer } from "../../server.js";
16
+
17
+ interface StartCommandFlags {
18
+ readonly "log-level": ConsoleLoggerLevel;
19
+ readonly transport: "stdio" | "sse";
20
+ readonly port: number;
21
+ readonly scope?: MCPScope[];
22
+ readonly "server-url"?: string;
23
+ readonly "server-index"?: SDKOptions["serverIdx"];
24
+ }
25
+
26
+ export async function main(this: LocalContext, flags: StartCommandFlags) {
27
+ switch (flags.transport) {
28
+ case "stdio":
29
+ await startStdio(flags);
30
+ break;
31
+ case "sse":
32
+ await startSSE(flags);
33
+ break;
34
+ default:
35
+ throw new Error(`Invalid transport: ${flags.transport}`);
36
+ }
37
+ }
38
+
39
+ async function startStdio(flags: StartCommandFlags) {
40
+ const logger = createConsoleLogger(flags["log-level"]);
41
+ const transport = new StdioServerTransport();
42
+ const server = createMCPServer({
43
+ logger,
44
+ scopes: flags.scope,
45
+ serverURL: flags["server-url"],
46
+ serverIdx: flags["server-index"],
47
+ });
48
+ await server.connect(transport);
49
+
50
+ const abort = async () => {
51
+ await server.close();
52
+ process.exit(0);
53
+ };
54
+ process.on("SIGTERM", abort);
55
+ process.on("SIGINT", abort);
56
+ }
57
+
58
+ async function startSSE(flags: StartCommandFlags) {
59
+ const logger = createConsoleLogger(flags["log-level"]);
60
+ const app = express();
61
+ const mcpServer = createMCPServer({
62
+ logger,
63
+ scopes: flags.scope,
64
+ serverURL: flags["server-url"],
65
+ serverIdx: flags["server-index"],
66
+ });
67
+ let transport: SSEServerTransport | undefined;
68
+ const controller = new AbortController();
69
+
70
+ app.get("/sse", async (_req, res) => {
71
+ transport = new SSEServerTransport("/message", res);
72
+
73
+ await mcpServer.connect(transport);
74
+
75
+ mcpServer.server.onclose = async () => {
76
+ res.end();
77
+ };
78
+ });
79
+
80
+ app.post("/message", async (req, res) => {
81
+ if (!transport) {
82
+ throw new Error("Server transport not initialized");
83
+ }
84
+
85
+ await transport.handlePostMessage(req, res);
86
+ });
87
+
88
+ const httpServer = app.listen(flags.port, "0.0.0.0", () => {
89
+ const ha = httpServer.address();
90
+ const host = typeof ha === "string" ? ha : `${ha?.address}:${ha?.port}`;
91
+ logger.info("MCP HTTP server started", { host });
92
+ });
93
+
94
+ let closing = false;
95
+ controller.signal.addEventListener("abort", async () => {
96
+ if (closing) {
97
+ logger.info("Received second signal. Forcing shutdown.");
98
+ process.exit(1);
99
+ }
100
+ closing = true;
101
+
102
+ logger.info("Shutting down MCP server");
103
+
104
+ await mcpServer.close();
105
+
106
+ logger.info("Shutting down HTTP server");
107
+
108
+ const timer = setTimeout(() => {
109
+ logger.info("Forcing shutdown");
110
+ process.exit(1);
111
+ }, 5000);
112
+
113
+ httpServer.close(() => {
114
+ clearTimeout(timer);
115
+ logger.info("Graceful shutdown complete");
116
+ process.exit(0);
117
+ });
118
+ });
119
+
120
+ const abort = () => controller.abort();
121
+ process.on("SIGTERM", abort);
122
+ process.on("SIGINT", abort);
123
+ }
@@ -0,0 +1,13 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import { CommandContext, StricliProcess } from "@stricli/core";
6
+
7
+ export interface LocalContext extends CommandContext {
8
+ readonly process: StricliProcess;
9
+ }
10
+
11
+ export function buildContext(process: NodeJS.Process): LocalContext {
12
+ return { process: process as StricliProcess };
13
+ }
@@ -0,0 +1,71 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ export const consoleLoggerLevels = [
6
+ "debug",
7
+ "warning",
8
+ "info",
9
+ "error",
10
+ ] as const;
11
+
12
+ export type ConsoleLoggerLevel = (typeof consoleLoggerLevels)[number];
13
+
14
+ export type ConsoleLogger = {
15
+ [key in ConsoleLoggerLevel]: (
16
+ message: string,
17
+ data?: Record<string, unknown>,
18
+ ) => void;
19
+ };
20
+
21
+ export function createConsoleLogger(level: ConsoleLoggerLevel): ConsoleLogger {
22
+ const min = consoleLoggerLevels.indexOf(level);
23
+ const noop = () => {};
24
+
25
+ const logger: ConsoleLogger = {
26
+ debug: noop,
27
+ warning: noop,
28
+ info: noop,
29
+ error: noop,
30
+ };
31
+
32
+ return consoleLoggerLevels.reduce((logger, level, i) => {
33
+ if (i < min) {
34
+ return logger;
35
+ }
36
+
37
+ logger[level] = log.bind(null, level);
38
+
39
+ return logger;
40
+ }, logger);
41
+ }
42
+
43
+ function log(
44
+ level: ConsoleLoggerLevel,
45
+ message: string,
46
+ data?: Record<string, unknown>,
47
+ ) {
48
+ let line = "";
49
+ const allData = [{ msg: message, l: level }, data];
50
+
51
+ for (const ctx of allData) {
52
+ for (const [key, value] of Object.entries(ctx || {})) {
53
+ if (value == null) {
54
+ line += ` ${key}=<${value}>`;
55
+ } else if (typeof value === "function") {
56
+ line += ` ${key}=<function>`;
57
+ } else if (typeof value === "symbol") {
58
+ line += ` ${key}=${value.toString()}`;
59
+ } else if (typeof value === "string") {
60
+ const v = value.search(/\s/g) >= 0 ? JSON.stringify(value) : value;
61
+ line += ` ${key}=${v}`;
62
+ } else if (typeof value !== "object") {
63
+ line += ` ${key}=${value}`;
64
+ } else {
65
+ line += ` ${key}="${JSON.stringify(value)}"`;
66
+ }
67
+ }
68
+ }
69
+
70
+ console.error(line);
71
+ }
@@ -0,0 +1,26 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import { buildApplication, buildRouteMap, run } from "@stricli/core";
6
+ import process from "node:process";
7
+ import { buildContext } from "./cli.js";
8
+ import { startCommand } from "./cli/start/command.js";
9
+
10
+ const routes = buildRouteMap({
11
+ routes: {
12
+ start: startCommand,
13
+ },
14
+ docs: {
15
+ brief: "MCP server CLI",
16
+ },
17
+ });
18
+
19
+ export const app = buildApplication(routes, {
20
+ name: "mcp",
21
+ versionInfo: {
22
+ currentVersion: "0.11.0",
23
+ },
24
+ });
25
+
26
+ run(app, process.argv.slice(2), buildContext(process));
@@ -0,0 +1,96 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ import { RequestHandlerExtra } from "@modelcontextprotocol/sdk/shared/protocol.js";
7
+ import { Variables } from "@modelcontextprotocol/sdk/shared/uriTemplate.js";
8
+ import { ReadResourceResult } from "@modelcontextprotocol/sdk/types.js";
9
+ import { GreenSecurityCore } from "../core.js";
10
+ import { Result } from "../types/fp.js";
11
+ import { MCPScope } from "./scopes.js";
12
+ import { isAsyncIterable, isBinaryData, valueToBase64 } from "./shared.js";
13
+
14
+ export type ReadResourceCallback = (
15
+ client: GreenSecurityCore,
16
+ uri: URL,
17
+ extra: RequestHandlerExtra,
18
+ ) => ReadResourceResult | Promise<ReadResourceResult>;
19
+
20
+ export type ResourceDefinition = {
21
+ name: string;
22
+ description: string;
23
+ scopes?: MCPScope[];
24
+ resource: string;
25
+ read: ReadResourceCallback;
26
+ };
27
+
28
+ export type ReadResourceTemplateCallback = (
29
+ client: GreenSecurityCore,
30
+ uri: URL,
31
+ vars: Variables,
32
+ extra: RequestHandlerExtra,
33
+ ) => ReadResourceResult | Promise<ReadResourceResult>;
34
+
35
+ export type ResourceTemplateDefinition = {
36
+ name: string;
37
+ description: string;
38
+ scopes?: MCPScope[];
39
+ resource: ResourceTemplate;
40
+ read: ReadResourceTemplateCallback;
41
+ };
42
+
43
+ export async function formatResult(
44
+ result: Result<unknown, Error>,
45
+ uri: URL,
46
+ init: { response?: Response | undefined },
47
+ ): Promise<ReadResourceResult> {
48
+ if (!result.ok) {
49
+ throw result.error;
50
+ }
51
+
52
+ const { value } = result;
53
+ if (typeof value === "undefined") {
54
+ return { contents: [] };
55
+ }
56
+
57
+ const { response } = init;
58
+ const mimeType = response?.headers.get("content-type") ?? "";
59
+ let contents: ReadResourceResult["contents"] = [];
60
+
61
+ if (mimeType.search(/\bjson\b/g)) {
62
+ contents = [{ uri: uri.toString(), mimeType, text: JSON.stringify(value) }];
63
+ } else if (
64
+ mimeType.startsWith("text/event-stream")
65
+ && isAsyncIterable(value)
66
+ ) {
67
+ contents = [
68
+ {
69
+ uri: uri.toString(),
70
+ mimeType: "application/json",
71
+ text: await stringifySSEToJSON(value),
72
+ },
73
+ ];
74
+ } else if (mimeType.startsWith("text/") && typeof value === "string") {
75
+ contents = [{ uri: uri.toString(), mimeType, text: value }];
76
+ } else if (isBinaryData(value)) {
77
+ const blob = await valueToBase64(value);
78
+ contents = blob == null ? [] : [{ uri: uri.toString(), blob, mimeType }];
79
+ } else {
80
+ throw new Error(`Unsupported content type: "${mimeType}"`);
81
+ }
82
+
83
+ return { contents };
84
+ }
85
+
86
+ async function stringifySSEToJSON(
87
+ value: AsyncIterable<unknown>,
88
+ ): Promise<string> {
89
+ const payloads = [];
90
+
91
+ for await (const chunk of value) {
92
+ payloads.push(chunk);
93
+ }
94
+
95
+ return JSON.stringify(payloads);
96
+ }
@@ -0,0 +1,7 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ export const mcpScopes = [] as const;
6
+
7
+ export type MCPScope = (typeof mcpScopes)[number];
@@ -0,0 +1,52 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ import { GreenSecurityCore } from "../core.js";
7
+ import { SDKOptions } from "../lib/config.js";
8
+ import type { ConsoleLogger } from "./console-logger.js";
9
+ import { MCPScope, mcpScopes } from "./scopes.js";
10
+ import { createRegisterTool } from "./tools.js";
11
+ import { tool$organizationsGetFacility } from "./tools/organizationsGetFacility.js";
12
+ import { tool$organizationsListOrSearchFacilities } from "./tools/organizationsListOrSearchFacilities.js";
13
+ import { tool$userGetCurrentUser } from "./tools/userGetCurrentUser.js";
14
+ import { tool$userGetUserById } from "./tools/userGetUserById.js";
15
+ import { tool$userLogsUserIntoTheSystem } from "./tools/userLogsUserIntoTheSystem.js";
16
+ import { tool$userMagiclink } from "./tools/userMagiclink.js";
17
+ import { tool$userPassword } from "./tools/userPassword.js";
18
+ import { tool$userPasswordResetRequest } from "./tools/userPasswordResetRequest.js";
19
+ import { tool$vendorsCreateVendorRegistration } from "./tools/vendorsCreateVendorRegistration.js";
20
+ import { tool$vendorsListVendorJobTitles } from "./tools/vendorsListVendorJobTitles.js";
21
+
22
+ export function createMCPServer(deps: {
23
+ logger: ConsoleLogger;
24
+ scopes?: MCPScope[] | undefined;
25
+ serverURL?: string | undefined;
26
+ serverIdx?: SDKOptions["serverIdx"];
27
+ }) {
28
+ const server = new McpServer({
29
+ name: "GreenSecurity",
30
+ version: "0.11.0",
31
+ });
32
+
33
+ const client = new GreenSecurityCore({
34
+ serverURL: deps.serverURL,
35
+ serverIdx: deps.serverIdx,
36
+ });
37
+ const scopes = new Set(deps.scopes ?? mcpScopes);
38
+ const tool = createRegisterTool(deps.logger, server, client, scopes);
39
+
40
+ tool(tool$vendorsCreateVendorRegistration);
41
+ tool(tool$vendorsListVendorJobTitles);
42
+ tool(tool$userGetCurrentUser);
43
+ tool(tool$userGetUserById);
44
+ tool(tool$userLogsUserIntoTheSystem);
45
+ tool(tool$userMagiclink);
46
+ tool(tool$userPasswordResetRequest);
47
+ tool(tool$userPassword);
48
+ tool(tool$organizationsListOrSearchFacilities);
49
+ tool(tool$organizationsGetFacility);
50
+
51
+ return server;
52
+ }
@@ -0,0 +1,75 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import * as z from "zod";
6
+ import { bytesToBase64 } from "../lib/base64.js";
7
+
8
+ type BinaryData =
9
+ | Uint8Array
10
+ | ArrayBuffer
11
+ | Blob
12
+ | ReadableStream
13
+ | Response
14
+ | string;
15
+
16
+ export async function consumeStream(
17
+ stream: ReadableStream<Uint8Array>,
18
+ ): Promise<Uint8Array> {
19
+ const reader = stream.getReader();
20
+ const chunks: Uint8Array[] = [];
21
+
22
+ try {
23
+ while (true) {
24
+ const { done, value } = await reader.read();
25
+ if (value != null) chunks.push(value);
26
+ if (done) break;
27
+ }
28
+ } finally {
29
+ reader.releaseLock();
30
+ }
31
+
32
+ return new Uint8Array(await new Blob(chunks).arrayBuffer());
33
+ }
34
+
35
+ export function isAsyncIterable(
36
+ value: unknown,
37
+ ): value is AsyncIterable<string> {
38
+ return (
39
+ typeof value === "object" && value != null && Symbol.asyncIterator in value
40
+ );
41
+ }
42
+
43
+ export function isBinaryData(value: unknown): value is BinaryData {
44
+ return (
45
+ value instanceof Uint8Array
46
+ || value instanceof ArrayBuffer
47
+ || value instanceof Blob
48
+ || value instanceof ReadableStream
49
+ || value instanceof Response
50
+ || typeof value === "string"
51
+ );
52
+ }
53
+
54
+ const base64Schema = z.string().base64();
55
+
56
+ export async function valueToBase64(
57
+ value: BinaryData | null | undefined,
58
+ ): Promise<string | null> {
59
+ if (value == null) {
60
+ return null;
61
+ } else if (value instanceof Uint8Array) {
62
+ return bytesToBase64(value);
63
+ } else if (value instanceof ArrayBuffer) {
64
+ return bytesToBase64(new Uint8Array(value));
65
+ } else if (value instanceof Response || value instanceof Blob) {
66
+ return bytesToBase64(new Uint8Array(await value.arrayBuffer()));
67
+ } else if (value instanceof ReadableStream) {
68
+ return bytesToBase64(await consumeStream(value));
69
+ } else if (typeof value === "string") {
70
+ return base64Schema.parse(value);
71
+ } else {
72
+ value satisfies never;
73
+ throw new Error(`Unsupported image value type: ${typeof value}`);
74
+ }
75
+ }