@greensecurity/javascript-sdk 0.16.0 → 0.18.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 (169) hide show
  1. package/REACT_QUERY.md +68 -30
  2. package/README.md +43 -0
  3. package/bin/mcp-server.js +731 -52
  4. package/bin/mcp-server.js.map +29 -19
  5. package/funcs/organizationsListOrSearchFacilities.d.ts +4 -1
  6. package/funcs/organizationsListOrSearchFacilities.d.ts.map +1 -1
  7. package/funcs/organizationsListOrSearchFacilities.js +46 -9
  8. package/funcs/organizationsListOrSearchFacilities.js.map +1 -1
  9. package/funcs/supportArticlesGetSupportArticle.js +1 -1
  10. package/funcs/supportArticlesGetSupportArticle.js.map +1 -1
  11. package/funcs/supportArticlesListOrSearchSupportArticles.d.ts +4 -1
  12. package/funcs/supportArticlesListOrSearchSupportArticles.d.ts.map +1 -1
  13. package/funcs/supportArticlesListOrSearchSupportArticles.js +42 -7
  14. package/funcs/supportArticlesListOrSearchSupportArticles.js.map +1 -1
  15. package/funcs/vendorsExpediteTimeRemaining.d.ts +17 -0
  16. package/funcs/vendorsExpediteTimeRemaining.d.ts.map +1 -0
  17. package/funcs/vendorsExpediteTimeRemaining.js +120 -0
  18. package/funcs/vendorsExpediteTimeRemaining.js.map +1 -0
  19. package/funcs/vendorsListVendorInvoices.d.ts +24 -0
  20. package/funcs/vendorsListVendorInvoices.d.ts.map +1 -0
  21. package/funcs/vendorsListVendorInvoices.js +166 -0
  22. package/funcs/vendorsListVendorInvoices.js.map +1 -0
  23. package/funcs/vendorsListVendorJobTitles.d.ts +4 -1
  24. package/funcs/vendorsListVendorJobTitles.d.ts.map +1 -1
  25. package/funcs/vendorsListVendorJobTitles.js +39 -6
  26. package/funcs/vendorsListVendorJobTitles.js.map +1 -1
  27. package/jsr.json +1 -1
  28. package/lib/config.d.ts +3 -3
  29. package/lib/config.js +3 -3
  30. package/mcp-server/extensions.d.ts +9 -0
  31. package/mcp-server/extensions.d.ts.map +1 -0
  32. package/mcp-server/extensions.js +6 -0
  33. package/mcp-server/extensions.js.map +1 -0
  34. package/mcp-server/mcp-server.js +1 -1
  35. package/mcp-server/resources.d.ts +9 -4
  36. package/mcp-server/resources.d.ts.map +1 -1
  37. package/mcp-server/resources.js +36 -9
  38. package/mcp-server/resources.js.map +1 -1
  39. package/mcp-server/server.d.ts.map +1 -1
  40. package/mcp-server/server.js +10 -1
  41. package/mcp-server/server.js.map +1 -1
  42. package/mcp-server/tools/organizationsListOrSearchFacilities.js +1 -1
  43. package/mcp-server/tools/organizationsListOrSearchFacilities.js.map +1 -1
  44. package/mcp-server/tools/supportArticlesListOrSearchSupportArticles.js +1 -1
  45. package/mcp-server/tools/supportArticlesListOrSearchSupportArticles.js.map +1 -1
  46. package/mcp-server/tools/vendorsExpediteTimeRemaining.d.ts +8 -0
  47. package/mcp-server/tools/vendorsExpediteTimeRemaining.d.ts.map +1 -0
  48. package/mcp-server/tools/vendorsExpediteTimeRemaining.js +64 -0
  49. package/mcp-server/tools/vendorsExpediteTimeRemaining.js.map +1 -0
  50. package/mcp-server/tools/vendorsListVendorInvoices.d.ts +8 -0
  51. package/mcp-server/tools/vendorsListVendorInvoices.d.ts.map +1 -0
  52. package/mcp-server/tools/vendorsListVendorInvoices.js +68 -0
  53. package/mcp-server/tools/vendorsListVendorInvoices.js.map +1 -0
  54. package/mcp-server/tools/vendorsListVendorJobTitles.js +1 -1
  55. package/mcp-server/tools/vendorsListVendorJobTitles.js.map +1 -1
  56. package/models/components/expand.d.ts +3 -0
  57. package/models/components/expand.d.ts.map +1 -1
  58. package/models/components/expand.js +1 -0
  59. package/models/components/expand.js.map +1 -1
  60. package/models/components/index.d.ts +2 -0
  61. package/models/components/index.d.ts.map +1 -1
  62. package/models/components/index.js +2 -0
  63. package/models/components/index.js.map +1 -1
  64. package/models/components/invoice.d.ts +43 -0
  65. package/models/components/invoice.d.ts.map +1 -0
  66. package/models/components/invoice.js +91 -0
  67. package/models/components/invoice.js.map +1 -0
  68. package/models/components/invoiceitem.d.ts +40 -0
  69. package/models/components/invoiceitem.d.ts.map +1 -0
  70. package/models/components/invoiceitem.js +94 -0
  71. package/models/components/invoiceitem.js.map +1 -0
  72. package/models/operations/expeditetimeremaining.d.ts +60 -0
  73. package/models/operations/expeditetimeremaining.d.ts.map +1 -0
  74. package/models/operations/expeditetimeremaining.js +113 -0
  75. package/models/operations/expeditetimeremaining.js.map +1 -0
  76. package/models/operations/index.d.ts +2 -0
  77. package/models/operations/index.d.ts.map +1 -1
  78. package/models/operations/index.js +2 -0
  79. package/models/operations/index.js.map +1 -1
  80. package/models/operations/listorsearchfacilities.d.ts +25 -0
  81. package/models/operations/listorsearchfacilities.d.ts.map +1 -1
  82. package/models/operations/listorsearchfacilities.js +36 -1
  83. package/models/operations/listorsearchfacilities.js.map +1 -1
  84. package/models/operations/listorsearchsupportarticles.d.ts +25 -0
  85. package/models/operations/listorsearchsupportarticles.d.ts.map +1 -1
  86. package/models/operations/listorsearchsupportarticles.js +36 -1
  87. package/models/operations/listorsearchsupportarticles.js.map +1 -1
  88. package/models/operations/listvendorinvoices.d.ts +116 -0
  89. package/models/operations/listvendorinvoices.d.ts.map +1 -0
  90. package/models/operations/listvendorinvoices.js +155 -0
  91. package/models/operations/listvendorinvoices.js.map +1 -0
  92. package/models/operations/listvendorjobtitles.d.ts +25 -0
  93. package/models/operations/listvendorjobtitles.d.ts.map +1 -1
  94. package/models/operations/listvendorjobtitles.js +36 -1
  95. package/models/operations/listvendorjobtitles.js.map +1 -1
  96. package/package.json +1 -1
  97. package/react-query/index.d.ts +2 -0
  98. package/react-query/index.d.ts.map +1 -1
  99. package/react-query/index.js +2 -0
  100. package/react-query/index.js.map +1 -1
  101. package/react-query/organizationsListOrSearchFacilities.d.ts +54 -3
  102. package/react-query/organizationsListOrSearchFacilities.d.ts.map +1 -1
  103. package/react-query/organizationsListOrSearchFacilities.js +89 -0
  104. package/react-query/organizationsListOrSearchFacilities.js.map +1 -1
  105. package/react-query/supportArticlesListOrSearchSupportArticles.d.ts +28 -3
  106. package/react-query/supportArticlesListOrSearchSupportArticles.d.ts.map +1 -1
  107. package/react-query/supportArticlesListOrSearchSupportArticles.js +58 -0
  108. package/react-query/supportArticlesListOrSearchSupportArticles.js.map +1 -1
  109. package/react-query/vendorsExpediteTimeRemaining.d.ts +30 -0
  110. package/react-query/vendorsExpediteTimeRemaining.d.ts.map +1 -0
  111. package/react-query/vendorsExpediteTimeRemaining.js +96 -0
  112. package/react-query/vendorsExpediteTimeRemaining.js.map +1 -0
  113. package/react-query/vendorsListVendorInvoices.d.ts +96 -0
  114. package/react-query/vendorsListVendorInvoices.d.ts.map +1 -0
  115. package/react-query/vendorsListVendorInvoices.js +178 -0
  116. package/react-query/vendorsListVendorInvoices.js.map +1 -0
  117. package/react-query/vendorsListVendorJobTitles.d.ts +28 -3
  118. package/react-query/vendorsListVendorJobTitles.d.ts.map +1 -1
  119. package/react-query/vendorsListVendorJobTitles.js +59 -0
  120. package/react-query/vendorsListVendorJobTitles.js.map +1 -1
  121. package/sdk/organizations.d.ts +4 -1
  122. package/sdk/organizations.d.ts.map +1 -1
  123. package/sdk/organizations.js +2 -1
  124. package/sdk/organizations.js.map +1 -1
  125. package/sdk/supportarticles.d.ts +4 -1
  126. package/sdk/supportarticles.d.ts.map +1 -1
  127. package/sdk/supportarticles.js +2 -1
  128. package/sdk/supportarticles.js.map +1 -1
  129. package/sdk/vendors.d.ts +24 -1
  130. package/sdk/vendors.d.ts.map +1 -1
  131. package/sdk/vendors.js +26 -1
  132. package/sdk/vendors.js.map +1 -1
  133. package/src/__tests__/supportarticles.test.ts +2 -1
  134. package/src/__tests__/vendors.test.ts +58 -1
  135. package/src/funcs/organizationsListOrSearchFacilities.ts +116 -42
  136. package/src/funcs/supportArticlesGetSupportArticle.ts +1 -1
  137. package/src/funcs/supportArticlesListOrSearchSupportArticles.ts +100 -31
  138. package/src/funcs/vendorsExpediteTimeRemaining.ts +171 -0
  139. package/src/funcs/vendorsListVendorInvoices.ts +255 -0
  140. package/src/funcs/vendorsListVendorJobTitles.ts +101 -33
  141. package/src/lib/config.ts +3 -3
  142. package/src/mcp-server/extensions.ts +13 -0
  143. package/src/mcp-server/mcp-server.ts +1 -1
  144. package/src/mcp-server/resources.ts +75 -14
  145. package/src/mcp-server/server.ts +20 -1
  146. package/src/mcp-server/tools/organizationsListOrSearchFacilities.ts +1 -1
  147. package/src/mcp-server/tools/supportArticlesListOrSearchSupportArticles.ts +1 -1
  148. package/src/mcp-server/tools/vendorsExpediteTimeRemaining.ts +37 -0
  149. package/src/mcp-server/tools/vendorsListVendorInvoices.ts +41 -0
  150. package/src/mcp-server/tools/vendorsListVendorJobTitles.ts +1 -1
  151. package/src/models/components/expand.ts +1 -0
  152. package/src/models/components/index.ts +2 -0
  153. package/src/models/components/invoice.ts +99 -0
  154. package/src/models/components/invoiceitem.ts +98 -0
  155. package/src/models/operations/expeditetimeremaining.ts +152 -0
  156. package/src/models/operations/index.ts +2 -0
  157. package/src/models/operations/listorsearchfacilities.ts +72 -0
  158. package/src/models/operations/listorsearchsupportarticles.ts +75 -0
  159. package/src/models/operations/listvendorinvoices.ts +252 -0
  160. package/src/models/operations/listvendorjobtitles.ts +68 -0
  161. package/src/react-query/index.ts +2 -0
  162. package/src/react-query/organizationsListOrSearchFacilities.ts +179 -1
  163. package/src/react-query/supportArticlesListOrSearchSupportArticles.ts +149 -1
  164. package/src/react-query/vendorsExpediteTimeRemaining.ts +165 -0
  165. package/src/react-query/vendorsListVendorInvoices.ts +364 -0
  166. package/src/react-query/vendorsListVendorJobTitles.ts +149 -1
  167. package/src/sdk/organizations.ts +5 -2
  168. package/src/sdk/supportarticles.ts +8 -2
  169. package/src/sdk/vendors.ts +47 -2
@@ -3,6 +3,7 @@
3
3
  */
4
4
 
5
5
  import { GreenSecurityCore } from "../core.js";
6
+ import { dlv } from "../lib/dlv.js";
6
7
  import { encodeFormQuery } from "../lib/encodings.js";
7
8
  import * as M from "../lib/matchers.js";
8
9
  import { compactMap } from "../lib/primitives.js";
@@ -22,6 +23,12 @@ import { SDKValidationError } from "../models/errors/sdkvalidationerror.js";
22
23
  import * as operations from "../models/operations/index.js";
23
24
  import { APICall, APIPromise } from "../types/async.js";
24
25
  import { Result } from "../types/fp.js";
26
+ import {
27
+ createPageIterator,
28
+ haltIterator,
29
+ PageIterator,
30
+ Paginator,
31
+ } from "../types/operations.js";
25
32
 
26
33
  /**
27
34
  * List vendor job titles
@@ -34,17 +41,20 @@ export function vendorsListVendorJobTitles(
34
41
  request: operations.ListVendorJobTitlesRequest,
35
42
  options?: RequestOptions,
36
43
  ): APIPromise<
37
- Result<
38
- operations.ListVendorJobTitlesListVendorJobTitlesOk,
39
- | errors.ApiErrorResponse
40
- | errors.ApiErrorResponse
41
- | APIError
42
- | SDKValidationError
43
- | UnexpectedClientError
44
- | InvalidRequestError
45
- | RequestAbortedError
46
- | RequestTimeoutError
47
- | ConnectionError
44
+ PageIterator<
45
+ Result<
46
+ operations.ListVendorJobTitlesResponse,
47
+ | errors.ApiErrorResponse
48
+ | errors.ApiErrorResponse
49
+ | APIError
50
+ | SDKValidationError
51
+ | UnexpectedClientError
52
+ | InvalidRequestError
53
+ | RequestAbortedError
54
+ | RequestTimeoutError
55
+ | ConnectionError
56
+ >,
57
+ { page: number }
48
58
  >
49
59
  > {
50
60
  return new APIPromise($do(
@@ -60,17 +70,20 @@ async function $do(
60
70
  options?: RequestOptions,
61
71
  ): Promise<
62
72
  [
63
- Result<
64
- operations.ListVendorJobTitlesListVendorJobTitlesOk,
65
- | errors.ApiErrorResponse
66
- | errors.ApiErrorResponse
67
- | APIError
68
- | SDKValidationError
69
- | UnexpectedClientError
70
- | InvalidRequestError
71
- | RequestAbortedError
72
- | RequestTimeoutError
73
- | ConnectionError
73
+ PageIterator<
74
+ Result<
75
+ operations.ListVendorJobTitlesResponse,
76
+ | errors.ApiErrorResponse
77
+ | errors.ApiErrorResponse
78
+ | APIError
79
+ | SDKValidationError
80
+ | UnexpectedClientError
81
+ | InvalidRequestError
82
+ | RequestAbortedError
83
+ | RequestTimeoutError
84
+ | ConnectionError
85
+ >,
86
+ { page: number }
74
87
  >,
75
88
  APICall,
76
89
  ]
@@ -82,7 +95,7 @@ async function $do(
82
95
  "Input validation failed",
83
96
  );
84
97
  if (!parsed.ok) {
85
- return [parsed, { status: "invalid" }];
98
+ return [haltIterator(parsed), { status: "invalid" }];
86
99
  }
87
100
  const payload = parsed.value;
88
101
  const body = null;
@@ -125,7 +138,7 @@ async function $do(
125
138
  timeoutMs: options?.timeoutMs || client._options.timeoutMs || -1,
126
139
  }, options);
127
140
  if (!requestRes.ok) {
128
- return [requestRes, { status: "invalid" }];
141
+ return [haltIterator(requestRes), { status: "invalid" }];
129
142
  }
130
143
  const req = requestRes.value;
131
144
 
@@ -136,7 +149,7 @@ async function $do(
136
149
  retryCodes: context.retryCodes,
137
150
  });
138
151
  if (!doResult.ok) {
139
- return [doResult, { status: "request-error", request: req }];
152
+ return [haltIterator(doResult), { status: "request-error", request: req }];
140
153
  }
141
154
  const response = doResult.value;
142
155
 
@@ -144,8 +157,8 @@ async function $do(
144
157
  HttpMeta: { Response: response, Request: req },
145
158
  };
146
159
 
147
- const [result] = await M.match<
148
- operations.ListVendorJobTitlesListVendorJobTitlesOk,
160
+ const [result, raw] = await M.match<
161
+ operations.ListVendorJobTitlesResponse,
149
162
  | errors.ApiErrorResponse
150
163
  | errors.ApiErrorResponse
151
164
  | APIError
@@ -156,18 +169,73 @@ async function $do(
156
169
  | RequestTimeoutError
157
170
  | ConnectionError
158
171
  >(
159
- M.json(
160
- 200,
161
- operations.ListVendorJobTitlesListVendorJobTitlesOk$inboundSchema,
162
- ),
172
+ M.json(200, operations.ListVendorJobTitlesResponse$inboundSchema, {
173
+ key: "Result",
174
+ }),
163
175
  M.jsonErr(403, errors.ApiErrorResponse$inboundSchema),
164
176
  M.jsonErr(500, errors.ApiErrorResponse$inboundSchema),
165
177
  M.fail("4XX"),
166
178
  M.fail("5XX"),
167
179
  )(response, { extraFields: responseFields });
168
180
  if (!result.ok) {
169
- return [result, { status: "complete", request: req, response }];
181
+ return [haltIterator(result), {
182
+ status: "complete",
183
+ request: req,
184
+ response,
185
+ }];
170
186
  }
171
187
 
172
- return [result, { status: "complete", request: req, response }];
188
+ const nextFunc = (
189
+ responseData: unknown,
190
+ ): {
191
+ next: Paginator<
192
+ Result<
193
+ operations.ListVendorJobTitlesResponse,
194
+ | errors.ApiErrorResponse
195
+ | errors.ApiErrorResponse
196
+ | APIError
197
+ | SDKValidationError
198
+ | UnexpectedClientError
199
+ | InvalidRequestError
200
+ | RequestAbortedError
201
+ | RequestTimeoutError
202
+ | ConnectionError
203
+ >
204
+ >;
205
+ "~next"?: { page: number };
206
+ } => {
207
+ const page = request?.page ?? 1;
208
+ const nextPage = page + 1;
209
+
210
+ if (!responseData) {
211
+ return { next: () => null };
212
+ }
213
+ const results = dlv(responseData, "items");
214
+ if (!Array.isArray(results) || !results.length) {
215
+ return { next: () => null };
216
+ }
217
+ const limit = request?.itemsPerPage ?? 0;
218
+ if (results.length < limit) {
219
+ return { next: () => null };
220
+ }
221
+
222
+ const nextVal = () =>
223
+ vendorsListVendorJobTitles(
224
+ client,
225
+ {
226
+ ...request,
227
+ page: nextPage,
228
+ },
229
+ options,
230
+ );
231
+
232
+ return { next: nextVal, "~next": { page: nextPage } };
233
+ };
234
+
235
+ const page = { ...result, ...nextFunc(raw) };
236
+ return [{ ...page, ...createPageIterator(page, (v) => !v.ok) }, {
237
+ status: "complete",
238
+ request: req,
239
+ response,
240
+ }];
173
241
  }
package/src/lib/config.ts CHANGED
@@ -72,8 +72,8 @@ export function serverURLFromOptions(options: SDKOptions): URL | null {
72
72
  export const SDK_METADATA = {
73
73
  language: "typescript",
74
74
  openapiDocVersion: "0.0.3",
75
- sdkVersion: "0.16.0",
76
- genVersion: "2.541.0",
75
+ sdkVersion: "0.18.0",
76
+ genVersion: "2.545.4",
77
77
  userAgent:
78
- "speakeasy-sdk/typescript 0.16.0 2.541.0 0.0.3 @greensecurity/javascript-sdk",
78
+ "speakeasy-sdk/typescript 0.18.0 2.545.4 0.0.3 @greensecurity/javascript-sdk",
79
79
  } as const;
@@ -0,0 +1,13 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import { ZodRawShape } from "zod";
6
+ import { ResourceDefinition, ResourceTemplateDefinition } from "./resources.js";
7
+ import { ToolDefinition } from "./tools.js";
8
+
9
+ export type Register = {
10
+ tool: <A extends ZodRawShape | undefined>(def: ToolDefinition<A>) => void;
11
+ resource: (def: ResourceDefinition) => void;
12
+ resourceTemplate: (def: ResourceTemplateDefinition) => void;
13
+ };
@@ -19,7 +19,7 @@ const routes = buildRouteMap({
19
19
  export const app = buildApplication(routes, {
20
20
  name: "mcp",
21
21
  versionInfo: {
22
- currentVersion: "0.16.0",
22
+ currentVersion: "0.18.0",
23
23
  },
24
24
  });
25
25
 
@@ -2,12 +2,16 @@
2
2
  * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
3
  */
4
4
 
5
- import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ import {
6
+ McpServer,
7
+ ResourceMetadata,
8
+ ResourceTemplate,
9
+ } from "@modelcontextprotocol/sdk/server/mcp.js";
6
10
  import { RequestHandlerExtra } from "@modelcontextprotocol/sdk/shared/protocol.js";
7
11
  import { Variables } from "@modelcontextprotocol/sdk/shared/uriTemplate.js";
8
12
  import { ReadResourceResult } from "@modelcontextprotocol/sdk/types.js";
9
13
  import { GreenSecurityCore } from "../core.js";
10
- import { Result } from "../types/fp.js";
14
+ import { ConsoleLogger } from "./console-logger.js";
11
15
  import { MCPScope } from "./scopes.js";
12
16
  import { isAsyncIterable, isBinaryData, valueToBase64 } from "./shared.js";
13
17
 
@@ -19,7 +23,8 @@ export type ReadResourceCallback = (
19
23
 
20
24
  export type ResourceDefinition = {
21
25
  name: string;
22
- description: string;
26
+ description?: string;
27
+ metadata?: ResourceMetadata;
23
28
  scopes?: MCPScope[];
24
29
  resource: string;
25
30
  read: ReadResourceCallback;
@@ -35,30 +40,27 @@ export type ReadResourceTemplateCallback = (
35
40
  export type ResourceTemplateDefinition = {
36
41
  name: string;
37
42
  description: string;
43
+ metadata?: ResourceMetadata;
38
44
  scopes?: MCPScope[];
39
45
  resource: ResourceTemplate;
40
46
  read: ReadResourceTemplateCallback;
41
47
  };
42
48
 
43
49
  export async function formatResult(
44
- result: Result<unknown, Error>,
50
+ value: unknown,
45
51
  uri: URL,
46
- init: { response?: Response | undefined },
52
+ init: { mimeType?: string | undefined; response?: Response | undefined },
47
53
  ): Promise<ReadResourceResult> {
48
- if (!result.ok) {
49
- throw result.error;
50
- }
51
-
52
- const { value } = result;
53
54
  if (typeof value === "undefined") {
54
55
  return { contents: [] };
55
56
  }
56
57
 
57
- const { response } = init;
58
- const mimeType = response?.headers.get("content-type") ?? "";
59
58
  let contents: ReadResourceResult["contents"] = [];
60
59
 
61
- if (mimeType.search(/\bjson\b/g)) {
60
+ const mimeType = init.mimeType ?? init.response?.headers.get("content-type")
61
+ ?? "";
62
+
63
+ if (mimeType.search(/\bjson\b/g) !== -1) {
62
64
  contents = [{ uri: uri.toString(), mimeType, text: JSON.stringify(value) }];
63
65
  } else if (
64
66
  mimeType.startsWith("text/event-stream")
@@ -71,7 +73,10 @@ export async function formatResult(
71
73
  text: await stringifySSEToJSON(value),
72
74
  },
73
75
  ];
74
- } else if (mimeType.startsWith("text/") && typeof value === "string") {
76
+ } else if (
77
+ (mimeType.startsWith("text/") || mimeType.startsWith("application/"))
78
+ && typeof value === "string"
79
+ ) {
75
80
  contents = [{ uri: uri.toString(), mimeType, text: value }];
76
81
  } else if (isBinaryData(value)) {
77
82
  const blob = await valueToBase64(value);
@@ -94,3 +99,59 @@ async function stringifySSEToJSON(
94
99
 
95
100
  return JSON.stringify(payloads);
96
101
  }
102
+
103
+ export function createRegisterResource(
104
+ logger: ConsoleLogger,
105
+ server: McpServer,
106
+ sdk: GreenSecurityCore,
107
+ allowedScopes: Set<MCPScope>,
108
+ ): (resource: ResourceDefinition) => void {
109
+ return (resource: ResourceDefinition): void => {
110
+ const scopes = resource.scopes ?? [];
111
+ if (!scopes.every((s: MCPScope) => allowedScopes.has(s))) {
112
+ return;
113
+ }
114
+
115
+ const metadata: ResourceMetadata = {
116
+ ...resource.metadata,
117
+ description: resource.description,
118
+ };
119
+
120
+ server.resource(
121
+ resource.name,
122
+ resource.resource,
123
+ metadata,
124
+ async (uri, ctx) => resource.read(sdk, uri, ctx),
125
+ );
126
+
127
+ logger.debug("Registered resource", { name: resource.name });
128
+ };
129
+ }
130
+
131
+ export function createRegisterResourceTemplate(
132
+ logger: ConsoleLogger,
133
+ server: McpServer,
134
+ sdk: GreenSecurityCore,
135
+ allowedScopes: Set<MCPScope>,
136
+ ): (resource: ResourceTemplateDefinition) => void {
137
+ return (resource: ResourceTemplateDefinition): void => {
138
+ const scopes = resource.scopes ?? [];
139
+ if (!scopes.every((s: MCPScope) => allowedScopes.has(s))) {
140
+ return;
141
+ }
142
+
143
+ const metadata: ResourceMetadata = {
144
+ ...resource.metadata,
145
+ description: resource.description,
146
+ };
147
+
148
+ server.resource(
149
+ resource.name,
150
+ resource.resource,
151
+ metadata,
152
+ async (uri, vars, ctx) => resource.read(sdk, uri, vars, ctx),
153
+ );
154
+
155
+ logger.debug("Registered resource template", { name: resource.name });
156
+ };
157
+ }
@@ -6,6 +6,10 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
6
  import { GreenSecurityCore } from "../core.js";
7
7
  import { SDKOptions } from "../lib/config.js";
8
8
  import type { ConsoleLogger } from "./console-logger.js";
9
+ import {
10
+ createRegisterResource,
11
+ createRegisterResourceTemplate,
12
+ } from "./resources.js";
9
13
  import { MCPScope, mcpScopes } from "./scopes.js";
10
14
  import { createRegisterTool } from "./tools.js";
11
15
  import { tool$organizationsGetFacility } from "./tools/organizationsGetFacility.js";
@@ -19,7 +23,9 @@ import { tool$usersMagiclink } from "./tools/usersMagiclink.js";
19
23
  import { tool$usersPassword } from "./tools/usersPassword.js";
20
24
  import { tool$usersPasswordResetRequest } from "./tools/usersPasswordResetRequest.js";
21
25
  import { tool$vendorsCreateVendorRegistration } from "./tools/vendorsCreateVendorRegistration.js";
26
+ import { tool$vendorsExpediteTimeRemaining } from "./tools/vendorsExpediteTimeRemaining.js";
22
27
  import { tool$vendorsListVendorCredentials } from "./tools/vendorsListVendorCredentials.js";
28
+ import { tool$vendorsListVendorInvoices } from "./tools/vendorsListVendorInvoices.js";
23
29
  import { tool$vendorsListVendorJobTitles } from "./tools/vendorsListVendorJobTitles.js";
24
30
 
25
31
  export function createMCPServer(deps: {
@@ -32,7 +38,7 @@ export function createMCPServer(deps: {
32
38
  }) {
33
39
  const server = new McpServer({
34
40
  name: "GreenSecurity",
35
- version: "0.16.0",
41
+ version: "0.18.0",
36
42
  });
37
43
 
38
44
  const client = new GreenSecurityCore({
@@ -40,7 +46,9 @@ export function createMCPServer(deps: {
40
46
  serverURL: deps.serverURL,
41
47
  serverIdx: deps.serverIdx,
42
48
  });
49
+
43
50
  const scopes = new Set(deps.scopes ?? mcpScopes);
51
+
44
52
  const allowedTools = deps.allowedTools && new Set(deps.allowedTools);
45
53
  const tool = createRegisterTool(
46
54
  deps.logger,
@@ -49,10 +57,21 @@ export function createMCPServer(deps: {
49
57
  scopes,
50
58
  allowedTools,
51
59
  );
60
+ const resource = createRegisterResource(deps.logger, server, client, scopes);
61
+ const resourceTemplate = createRegisterResourceTemplate(
62
+ deps.logger,
63
+ server,
64
+ client,
65
+ scopes,
66
+ );
67
+ const register = { tool, resource, resourceTemplate };
68
+ void register; // suppress unused warnings
52
69
 
53
70
  tool(tool$vendorsCreateVendorRegistration);
54
71
  tool(tool$vendorsListVendorJobTitles);
55
72
  tool(tool$vendorsListVendorCredentials);
73
+ tool(tool$vendorsExpediteTimeRemaining);
74
+ tool(tool$vendorsListVendorInvoices);
56
75
  tool(tool$usersGetCurrentUser);
57
76
  tool(tool$usersGetUserById);
58
77
  tool(tool$usersLogsUserIntoTheSystem);
@@ -45,7 +45,7 @@ Available \`expand\` scopes are:
45
45
  };
46
46
  }
47
47
 
48
- const value = result.value;
48
+ const value = result.value.result;
49
49
 
50
50
  return formatResult(value, apiCall);
51
51
  },
@@ -32,7 +32,7 @@ List or search support articles for FAQ.`,
32
32
  };
33
33
  }
34
34
 
35
- const value = result.value;
35
+ const value = result.value.result;
36
36
 
37
37
  return formatResult(value, apiCall);
38
38
  },
@@ -0,0 +1,37 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import { vendorsExpediteTimeRemaining } from "../../funcs/vendorsExpediteTimeRemaining.js";
6
+ import * as operations from "../../models/operations/index.js";
7
+ import { formatResult, ToolDefinition } from "../tools.js";
8
+
9
+ const args = {
10
+ request: operations.ExpediteTimeRemainingRequest$inboundSchema,
11
+ };
12
+
13
+ export const tool$vendorsExpediteTimeRemaining: ToolDefinition<typeof args> = {
14
+ name: "vendors_expedite-time-remaining",
15
+ description: `Expedite time remaining
16
+
17
+ For vendors who have a paid 24-hour expedite credentials invoice, get the remaining time (in seconds) for which submitted credentials will be expedited.`,
18
+ args,
19
+ tool: async (client, args, ctx) => {
20
+ const [result, apiCall] = await vendorsExpediteTimeRemaining(
21
+ client,
22
+ args.request,
23
+ { fetchOptions: { signal: ctx.signal } },
24
+ ).$inspect();
25
+
26
+ if (!result.ok) {
27
+ return {
28
+ content: [{ type: "text", text: result.error.message }],
29
+ isError: true,
30
+ };
31
+ }
32
+
33
+ const value = result.value;
34
+
35
+ return formatResult(value, apiCall);
36
+ },
37
+ };
@@ -0,0 +1,41 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import { vendorsListVendorInvoices } from "../../funcs/vendorsListVendorInvoices.js";
6
+ import * as operations from "../../models/operations/index.js";
7
+ import { formatResult, ToolDefinition } from "../tools.js";
8
+
9
+ const args = {
10
+ request: operations.ListVendorInvoicesRequest$inboundSchema,
11
+ };
12
+
13
+ export const tool$vendorsListVendorInvoices: ToolDefinition<typeof args> = {
14
+ name: "vendors_list-vendor-invoices",
15
+ description: `List vendor invoices
16
+
17
+ List invoices for Vendors
18
+
19
+ Available \`expand\` scopes are:
20
+
21
+ invoice.line_items`,
22
+ args,
23
+ tool: async (client, args, ctx) => {
24
+ const [result, apiCall] = await vendorsListVendorInvoices(
25
+ client,
26
+ args.request,
27
+ { fetchOptions: { signal: ctx.signal } },
28
+ ).$inspect();
29
+
30
+ if (!result.ok) {
31
+ return {
32
+ content: [{ type: "text", text: result.error.message }],
33
+ isError: true,
34
+ };
35
+ }
36
+
37
+ const value = result.value.result;
38
+
39
+ return formatResult(value, apiCall);
40
+ },
41
+ };
@@ -30,7 +30,7 @@ List valid job titles for Vendors. This can be used during sign up or in a filte
30
30
  };
31
31
  }
32
32
 
33
- const value = result.value;
33
+ const value = result.value.result;
34
34
 
35
35
  return formatResult(value, apiCall);
36
36
  },
@@ -30,6 +30,7 @@ export const Expand = {
30
30
  SupportArticlePublished: "support_article.published",
31
31
  SupportArticleNotes: "support_article.notes",
32
32
  SupportArticleSupportCategory: "support_article.support_category",
33
+ InvoiceLineItems: "invoice.line_items",
33
34
  } as const;
34
35
  /**
35
36
  * An expansion scope that is valid for the object being requested.
@@ -12,6 +12,8 @@ export * from "./expand.js";
12
12
  export * from "./facility.js";
13
13
  export * from "./facilitysummary.js";
14
14
  export * from "./imageset.js";
15
+ export * from "./invoice.js";
16
+ export * from "./invoiceitem.js";
15
17
  export * from "./loginemailandpassword.js";
16
18
  export * from "./loginrequirementsfromemail.js";
17
19
  export * from "./mfarequiredresponse.js";
@@ -0,0 +1,99 @@
1
+ /*
2
+ * Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
3
+ */
4
+
5
+ import * as z from "zod";
6
+ import { remap as remap$ } from "../../lib/primitives.js";
7
+ import { safeParse } from "../../lib/schemas.js";
8
+ import { Result as SafeParseResult } from "../../types/fp.js";
9
+ import { SDKValidationError } from "../errors/sdkvalidationerror.js";
10
+ import {
11
+ InvoiceItem,
12
+ InvoiceItem$inboundSchema,
13
+ InvoiceItem$Outbound,
14
+ InvoiceItem$outboundSchema,
15
+ } from "./invoiceitem.js";
16
+
17
+ /**
18
+ * A simplified representation of an Invoice
19
+ */
20
+ export type Invoice = {
21
+ id: number;
22
+ invoiceNumber?: string | null | undefined;
23
+ amount?: number | null | undefined;
24
+ status?: string | null | undefined;
25
+ financialStatus?: string | null | undefined;
26
+ items?: Array<InvoiceItem> | undefined;
27
+ };
28
+
29
+ /** @internal */
30
+ export const Invoice$inboundSchema: z.ZodType<Invoice, z.ZodTypeDef, unknown> =
31
+ z.object({
32
+ id: z.number().int(),
33
+ invoice_number: z.nullable(z.string()).optional(),
34
+ amount: z.nullable(z.number().int()).optional(),
35
+ status: z.nullable(z.string()).optional(),
36
+ financial_status: z.nullable(z.string()).optional(),
37
+ items: z.array(InvoiceItem$inboundSchema).optional(),
38
+ }).transform((v) => {
39
+ return remap$(v, {
40
+ "invoice_number": "invoiceNumber",
41
+ "financial_status": "financialStatus",
42
+ });
43
+ });
44
+
45
+ /** @internal */
46
+ export type Invoice$Outbound = {
47
+ id: number;
48
+ invoice_number?: string | null | undefined;
49
+ amount?: number | null | undefined;
50
+ status?: string | null | undefined;
51
+ financial_status?: string | null | undefined;
52
+ items?: Array<InvoiceItem$Outbound> | undefined;
53
+ };
54
+
55
+ /** @internal */
56
+ export const Invoice$outboundSchema: z.ZodType<
57
+ Invoice$Outbound,
58
+ z.ZodTypeDef,
59
+ Invoice
60
+ > = z.object({
61
+ id: z.number().int(),
62
+ invoiceNumber: z.nullable(z.string()).optional(),
63
+ amount: z.nullable(z.number().int()).optional(),
64
+ status: z.nullable(z.string()).optional(),
65
+ financialStatus: z.nullable(z.string()).optional(),
66
+ items: z.array(InvoiceItem$outboundSchema).optional(),
67
+ }).transform((v) => {
68
+ return remap$(v, {
69
+ invoiceNumber: "invoice_number",
70
+ financialStatus: "financial_status",
71
+ });
72
+ });
73
+
74
+ /**
75
+ * @internal
76
+ * @deprecated This namespace will be removed in future versions. Use schemas and types that are exported directly from this module.
77
+ */
78
+ export namespace Invoice$ {
79
+ /** @deprecated use `Invoice$inboundSchema` instead. */
80
+ export const inboundSchema = Invoice$inboundSchema;
81
+ /** @deprecated use `Invoice$outboundSchema` instead. */
82
+ export const outboundSchema = Invoice$outboundSchema;
83
+ /** @deprecated use `Invoice$Outbound` instead. */
84
+ export type Outbound = Invoice$Outbound;
85
+ }
86
+
87
+ export function invoiceToJSON(invoice: Invoice): string {
88
+ return JSON.stringify(Invoice$outboundSchema.parse(invoice));
89
+ }
90
+
91
+ export function invoiceFromJSON(
92
+ jsonString: string,
93
+ ): SafeParseResult<Invoice, SDKValidationError> {
94
+ return safeParse(
95
+ jsonString,
96
+ (x) => Invoice$inboundSchema.parse(JSON.parse(x)),
97
+ `Failed to parse 'Invoice' from JSON`,
98
+ );
99
+ }