@authsec/sdk 4.0.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 (56) hide show
  1. package/README.md +253 -0
  2. package/dist/ciba.d.ts +47 -0
  3. package/dist/ciba.d.ts.map +1 -0
  4. package/dist/ciba.js +172 -0
  5. package/dist/ciba.js.map +1 -0
  6. package/dist/config.d.ts +32 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +92 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/decorators.d.ts +59 -0
  11. package/dist/decorators.d.ts.map +1 -0
  12. package/dist/decorators.js +142 -0
  13. package/dist/decorators.js.map +1 -0
  14. package/dist/http.d.ts +19 -0
  15. package/dist/http.d.ts.map +1 -0
  16. package/dist/http.js +156 -0
  17. package/dist/http.js.map +1 -0
  18. package/dist/index.d.ts +47 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +69 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/mcp-server.d.ts +42 -0
  23. package/dist/mcp-server.d.ts.map +1 -0
  24. package/dist/mcp-server.js +353 -0
  25. package/dist/mcp-server.js.map +1 -0
  26. package/dist/rbac.d.ts +12 -0
  27. package/dist/rbac.d.ts.map +1 -0
  28. package/dist/rbac.js +130 -0
  29. package/dist/rbac.js.map +1 -0
  30. package/dist/service-access.d.ts +31 -0
  31. package/dist/service-access.d.ts.map +1 -0
  32. package/dist/service-access.js +82 -0
  33. package/dist/service-access.js.map +1 -0
  34. package/dist/spiffe/index.d.ts +4 -0
  35. package/dist/spiffe/index.d.ts.map +1 -0
  36. package/dist/spiffe/index.js +10 -0
  37. package/dist/spiffe/index.js.map +1 -0
  38. package/dist/spiffe/proto/workload.proto +126 -0
  39. package/dist/spiffe/quick-start-svid.d.ts +74 -0
  40. package/dist/spiffe/quick-start-svid.d.ts.map +1 -0
  41. package/dist/spiffe/quick-start-svid.js +191 -0
  42. package/dist/spiffe/quick-start-svid.js.map +1 -0
  43. package/dist/spiffe/workload-api-client.d.ts +71 -0
  44. package/dist/spiffe/workload-api-client.d.ts.map +1 -0
  45. package/dist/spiffe/workload-api-client.js +355 -0
  46. package/dist/spiffe/workload-api-client.js.map +1 -0
  47. package/dist/spiffe/workload-svid.d.ts +44 -0
  48. package/dist/spiffe/workload-svid.d.ts.map +1 -0
  49. package/dist/spiffe/workload-svid.js +137 -0
  50. package/dist/spiffe/workload-svid.js.map +1 -0
  51. package/dist/types.d.ts +95 -0
  52. package/dist/types.d.ts.map +1 -0
  53. package/dist/types.js +23 -0
  54. package/dist/types.js.map +1 -0
  55. package/package.json +45 -0
  56. package/src/spiffe/proto/workload.proto +126 -0
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ /**
3
+ * Tool decorator functions (higher-order functions)
4
+ * Mirrors Python @protected_by_AuthSec and @mcp_tool decorators
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.protectedByAuthSec = protectedByAuthSec;
8
+ exports.mcpTool = mcpTool;
9
+ const http_js_1 = require("./http.js");
10
+ const rbac_js_1 = require("./rbac.js");
11
+ const config_js_1 = require("./config.js");
12
+ const types_js_1 = require("./types.js");
13
+ /**
14
+ * Protect a tool via SDK Manager auth service API with optional RBAC.
15
+ *
16
+ * The handler receives (arguments, session) where session contains user context.
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * const adminTool = protectedByAuthSec({
21
+ * toolName: 'admin_dashboard',
22
+ * roles: ['admin'],
23
+ * description: 'Access admin dashboard',
24
+ * }, async (args, session) => {
25
+ * return [{ type: 'text', text: `Hello ${session.userId}` }];
26
+ * });
27
+ * ```
28
+ */
29
+ function protectedByAuthSec(options, handler) {
30
+ const rbacRequirements = {
31
+ roles: options.roles ?? [],
32
+ groups: options.groups ?? [],
33
+ resources: options.resources ?? [],
34
+ scopes: options.scopes ?? [],
35
+ permissions: options.permissions ?? [],
36
+ requireAll: options.requireAll ?? false,
37
+ };
38
+ // Determine if handler expects session (by checking function arity)
39
+ const expectsSession = handler.length >= 2;
40
+ const wrappedHandler = async (arguments_) => {
41
+ const config = (0, config_js_1.getInternalConfig)();
42
+ const sessionId = arguments_.session_id;
43
+ // Single API call to auth service for tool protection
44
+ const payload = {
45
+ session_id: sessionId,
46
+ tool_name: options.toolName,
47
+ client_id: config.clientId,
48
+ app_name: config.appName,
49
+ };
50
+ const protectionResult = await (0, http_js_1.makeAuthRequest)('protect-tool', payload);
51
+ // Check if access is allowed
52
+ if (!protectionResult.allowed) {
53
+ const errorResponse = {
54
+ error: protectionResult.error ?? 'Access denied',
55
+ message: protectionResult.message ?? 'Authentication failed',
56
+ tool: options.toolName,
57
+ };
58
+ return [{ type: 'text', text: JSON.stringify(errorResponse) }];
59
+ }
60
+ const resolvedSessionId = protectionResult.session_id ?? sessionId;
61
+ const userInfo = protectionResult.user_info ?? {};
62
+ if (resolvedSessionId) {
63
+ config_js_1.sessionUserInfo[String(resolvedSessionId)] = userInfo;
64
+ arguments_.session_id = resolvedSessionId;
65
+ }
66
+ console.log(JSON.stringify(userInfo, null, 2));
67
+ // Enforce RBAC at execution time
68
+ const [rbacOk, rbacReason] = (0, rbac_js_1.evaluateRbac)(userInfo, rbacRequirements);
69
+ if (!rbacOk) {
70
+ const errorResponse = {
71
+ error: 'Access denied',
72
+ message: `RBAC denied: ${rbacReason}`,
73
+ tool: options.toolName,
74
+ };
75
+ return [{ type: 'text', text: JSON.stringify(errorResponse) }];
76
+ }
77
+ // Add user info to arguments for the business function
78
+ arguments_._user_info = userInfo;
79
+ try {
80
+ if (expectsSession) {
81
+ const session = new types_js_1.SimpleSession(String(resolvedSessionId ?? ''), protectionResult.user_info ?? {});
82
+ return await handler(arguments_, session);
83
+ }
84
+ else {
85
+ return await handler(arguments_);
86
+ }
87
+ }
88
+ catch (e) {
89
+ return [
90
+ {
91
+ type: 'text',
92
+ text: JSON.stringify({
93
+ error: 'Tool execution failed',
94
+ message: `Internal error in ${options.toolName}: ${e.message ?? e}`,
95
+ tool: options.toolName,
96
+ }),
97
+ },
98
+ ];
99
+ }
100
+ };
101
+ return {
102
+ handler: wrappedHandler,
103
+ name: options.toolName,
104
+ description: options.description,
105
+ inputSchema: options.inputSchema,
106
+ isProtected: true,
107
+ rbacRequirements,
108
+ };
109
+ }
110
+ /**
111
+ * Define a standard MCP tool (no authentication required).
112
+ *
113
+ * @example
114
+ * ```ts
115
+ * const echoTool = mcpTool({
116
+ * name: 'echo',
117
+ * description: 'Echo a message',
118
+ * inputSchema: {
119
+ * type: 'object',
120
+ * properties: { message: { type: 'string' } },
121
+ * required: ['message'],
122
+ * },
123
+ * }, async (args) => {
124
+ * return [{ type: 'text', text: args.message }];
125
+ * });
126
+ * ```
127
+ */
128
+ function mcpTool(options, handler) {
129
+ const toolName = options.name ?? handler.name ?? 'unnamed_tool';
130
+ return {
131
+ handler,
132
+ name: toolName,
133
+ description: options.description,
134
+ inputSchema: options.inputSchema ?? {
135
+ type: 'object',
136
+ properties: {},
137
+ required: [],
138
+ },
139
+ isProtected: false,
140
+ };
141
+ }
142
+ //# sourceMappingURL=decorators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"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"}
package/dist/http.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ /**
2
+ * HTTP client helpers for communicating with SDK Manager
3
+ * Mirrors Python _make_auth_request / _make_services_request
4
+ */
5
+ /**
6
+ * Make HTTP request to SDK Manager auth service.
7
+ */
8
+ export declare function makeAuthRequest(endpoint: string, payload?: Record<string, any> | null, method?: 'GET' | 'POST'): Promise<Record<string, any>>;
9
+ /**
10
+ * Make HTTP request to SDK Manager services.
11
+ */
12
+ export declare function makeServicesRequest(endpoint: string, payload?: Record<string, any> | null, method?: 'GET' | 'POST'): Promise<Record<string, any>>;
13
+ /** Test connection to auth service */
14
+ export declare function testAuthService(): Promise<boolean>;
15
+ /** Test connection to services */
16
+ export declare function testServices(): Promise<boolean>;
17
+ /** Decode JWT payload without verification (for cache/debug only) */
18
+ export declare function decodeJwtUnverified(token: string): Record<string, any>;
19
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;GAEG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,EACpC,MAAM,GAAE,KAAK,GAAG,MAAe,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAqD9B;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,EACpC,MAAM,GAAE,KAAK,GAAG,MAAe,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAyD9B;AAED,sCAAsC;AACtC,wBAAsB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CASxD;AAED,kCAAkC;AAClC,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CASrD;AAED,qEAAqE;AACrE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAatE"}
package/dist/http.js ADDED
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ /**
3
+ * HTTP client helpers for communicating with SDK Manager
4
+ * Mirrors Python _make_auth_request / _make_services_request
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.makeAuthRequest = makeAuthRequest;
8
+ exports.makeServicesRequest = makeServicesRequest;
9
+ exports.testAuthService = testAuthService;
10
+ exports.testServices = testServices;
11
+ exports.decodeJwtUnverified = decodeJwtUnverified;
12
+ const config_js_1 = require("./config.js");
13
+ /**
14
+ * Make HTTP request to SDK Manager auth service.
15
+ */
16
+ async function makeAuthRequest(endpoint, payload, method = 'POST') {
17
+ const config = (0, config_js_1.getInternalConfig)();
18
+ if (!config.clientId) {
19
+ throw new Error('Authentication not configured. Call configureAuth() first.');
20
+ }
21
+ const headers = {
22
+ 'Content-Type': 'application/json',
23
+ 'X-Client-ID': config.clientId,
24
+ 'X-App-Name': config.appName,
25
+ };
26
+ const url = `${config.authServiceUrl}/${endpoint}`;
27
+ for (let attempt = 0; attempt < config.retries; attempt++) {
28
+ try {
29
+ const controller = new AbortController();
30
+ const timeoutId = setTimeout(() => controller.abort(), config.timeout * 1000);
31
+ const fetchOptions = {
32
+ method,
33
+ headers,
34
+ signal: controller.signal,
35
+ };
36
+ if (method === 'POST' && payload) {
37
+ fetchOptions.body = JSON.stringify(payload);
38
+ }
39
+ const response = await fetch(url, fetchOptions);
40
+ clearTimeout(timeoutId);
41
+ return (await response.json());
42
+ }
43
+ catch (e) {
44
+ if (attempt < config.retries - 1) {
45
+ await sleep(500 * (attempt + 1));
46
+ continue;
47
+ }
48
+ return {
49
+ allowed: false,
50
+ error: 'Connection error',
51
+ message: `Failed to connect to auth service: ${e.message ?? e}`,
52
+ };
53
+ }
54
+ }
55
+ return {
56
+ allowed: false,
57
+ error: 'Max retries exceeded',
58
+ message: 'Could not complete authentication check',
59
+ };
60
+ }
61
+ /**
62
+ * Make HTTP request to SDK Manager services.
63
+ */
64
+ async function makeServicesRequest(endpoint, payload, method = 'POST') {
65
+ const config = (0, config_js_1.getInternalConfig)();
66
+ if (!config.clientId) {
67
+ throw new Error('Authentication not configured. Call configureAuth() first.');
68
+ }
69
+ const headers = {
70
+ 'Content-Type': 'application/json',
71
+ 'X-Client-ID': config.clientId,
72
+ 'X-App-Name': config.appName,
73
+ };
74
+ const url = `${config.servicesBaseUrl}/${endpoint}`;
75
+ const timeoutMs = config.timeout * 2 * 1000; // Services may take longer
76
+ for (let attempt = 0; attempt < config.retries; attempt++) {
77
+ try {
78
+ const controller = new AbortController();
79
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
80
+ const fetchOptions = {
81
+ method,
82
+ headers,
83
+ signal: controller.signal,
84
+ };
85
+ if (method === 'POST' && payload) {
86
+ fetchOptions.body = JSON.stringify(payload);
87
+ }
88
+ const response = await fetch(url, fetchOptions);
89
+ clearTimeout(timeoutId);
90
+ if (response.status >= 400) {
91
+ const errorText = await response.text();
92
+ return { error: `HTTP ${response.status}: ${errorText}` };
93
+ }
94
+ return (await response.json());
95
+ }
96
+ catch (e) {
97
+ if (attempt < config.retries - 1) {
98
+ await sleep(500 * (attempt + 1));
99
+ continue;
100
+ }
101
+ return {
102
+ error: 'Connection error',
103
+ message: `Failed to connect to services: ${e.message ?? e}`,
104
+ };
105
+ }
106
+ }
107
+ return {
108
+ error: 'Max retries exceeded',
109
+ message: 'Could not complete services request',
110
+ };
111
+ }
112
+ /** Test connection to auth service */
113
+ async function testAuthService() {
114
+ try {
115
+ const result = await makeAuthRequest('health', null, 'GET');
116
+ console.log(`Auth service is running: ${JSON.stringify(result)}`);
117
+ return result.status === 'healthy';
118
+ }
119
+ catch (e) {
120
+ console.log(`Failed to connect to auth service: ${e.message ?? e}`);
121
+ return false;
122
+ }
123
+ }
124
+ /** Test connection to services */
125
+ async function testServices() {
126
+ try {
127
+ const result = await makeServicesRequest('health', null, 'GET');
128
+ console.log(`Services are running: ${JSON.stringify(result)}`);
129
+ return result.status === 'healthy';
130
+ }
131
+ catch (e) {
132
+ console.log(`Failed to connect to services: ${e.message ?? e}`);
133
+ return false;
134
+ }
135
+ }
136
+ /** Decode JWT payload without verification (for cache/debug only) */
137
+ function decodeJwtUnverified(token) {
138
+ try {
139
+ const parts = token.split('.');
140
+ if (parts.length < 2)
141
+ return {};
142
+ const payload = parts[1];
143
+ // Add padding
144
+ const padded = payload + '='.repeat((4 - (payload.length % 4)) % 4);
145
+ const decoded = Buffer.from(padded, 'base64url').toString('utf-8');
146
+ const data = JSON.parse(decoded);
147
+ return typeof data === 'object' && data !== null ? data : {};
148
+ }
149
+ catch {
150
+ return {};
151
+ }
152
+ }
153
+ function sleep(ms) {
154
+ return new Promise((resolve) => setTimeout(resolve, ms));
155
+ }
156
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * AuthSec SDK for TypeScript/JavaScript
3
+ *
4
+ * Enterprise-grade authentication and authorization library for JS/TS servers.
5
+ * Provides OAuth 2.0, RBAC, SPIFFE workload identity, and CIBA passwordless auth.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import {
10
+ * protectedByAuthSec,
11
+ * mcpTool,
12
+ * runMcpServerWithOAuth,
13
+ * ServiceAccessSDK,
14
+ * CIBAClient,
15
+ * } from '@authsec/sdk';
16
+ *
17
+ * const adminTool = protectedByAuthSec({
18
+ * toolName: 'admin_dashboard',
19
+ * roles: ['admin'],
20
+ * description: 'Access admin dashboard',
21
+ * }, async (args, session) => {
22
+ * const sdk = new ServiceAccessSDK(session);
23
+ * const creds = await sdk.getServiceCredentials('my-db');
24
+ * return [{ type: 'text', text: JSON.stringify(creds) }];
25
+ * });
26
+ *
27
+ * runMcpServerWithOAuth({
28
+ * tools: [adminTool],
29
+ * clientId: 'your-client-id',
30
+ * appName: 'my-app',
31
+ * });
32
+ * ```
33
+ */
34
+ export { protectedByAuthSec, mcpTool } from './decorators.js';
35
+ export { runMcpServerWithOAuth } from './mcp-server.js';
36
+ export type { RunMcpServerOptions } from './mcp-server.js';
37
+ export { configureAuth, getConfig, isConfigured } from './config.js';
38
+ export { testAuthService, testServices } from './http.js';
39
+ export { ServiceAccessSDK, ServiceAccessError } from './service-access.js';
40
+ export { CIBAClient } from './ciba.js';
41
+ export { QuickStartSVID } from './spiffe/quick-start-svid.js';
42
+ export { WorkloadAPIClient } from './spiffe/workload-api-client.js';
43
+ export { WorkloadSVID } from './spiffe/workload-svid.js';
44
+ export type { ToolHandler, ToolHandlerWithSession, ToolDefinition, RbacRequirements, McpContent, UserInfo, ServiceCredentials, AuthSecConfig, McpMessage, } from './types.js';
45
+ export { SimpleSession } from './types.js';
46
+ export declare const VERSION = "4.0.0";
47
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAGH,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,YAAY,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAG3D,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGrE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAG1D,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAG3E,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGvC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAGzD,YAAY,EACV,WAAW,EACX,sBAAsB,EACtB,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,QAAQ,EACR,kBAAkB,EAClB,aAAa,EACb,UAAU,GACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,OAAO,UAAU,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ /**
3
+ * AuthSec SDK for TypeScript/JavaScript
4
+ *
5
+ * Enterprise-grade authentication and authorization library for JS/TS servers.
6
+ * Provides OAuth 2.0, RBAC, SPIFFE workload identity, and CIBA passwordless auth.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import {
11
+ * protectedByAuthSec,
12
+ * mcpTool,
13
+ * runMcpServerWithOAuth,
14
+ * ServiceAccessSDK,
15
+ * CIBAClient,
16
+ * } from '@authsec/sdk';
17
+ *
18
+ * const adminTool = protectedByAuthSec({
19
+ * toolName: 'admin_dashboard',
20
+ * roles: ['admin'],
21
+ * description: 'Access admin dashboard',
22
+ * }, async (args, session) => {
23
+ * const sdk = new ServiceAccessSDK(session);
24
+ * const creds = await sdk.getServiceCredentials('my-db');
25
+ * return [{ type: 'text', text: JSON.stringify(creds) }];
26
+ * });
27
+ *
28
+ * runMcpServerWithOAuth({
29
+ * tools: [adminTool],
30
+ * clientId: 'your-client-id',
31
+ * appName: 'my-app',
32
+ * });
33
+ * ```
34
+ */
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.VERSION = exports.SimpleSession = exports.WorkloadSVID = exports.WorkloadAPIClient = exports.QuickStartSVID = exports.CIBAClient = exports.ServiceAccessError = exports.ServiceAccessSDK = exports.testServices = exports.testAuthService = exports.isConfigured = exports.getConfig = exports.configureAuth = exports.runMcpServerWithOAuth = exports.mcpTool = exports.protectedByAuthSec = void 0;
37
+ // Core Auth & MCP
38
+ var decorators_js_1 = require("./decorators.js");
39
+ Object.defineProperty(exports, "protectedByAuthSec", { enumerable: true, get: function () { return decorators_js_1.protectedByAuthSec; } });
40
+ Object.defineProperty(exports, "mcpTool", { enumerable: true, get: function () { return decorators_js_1.mcpTool; } });
41
+ var mcp_server_js_1 = require("./mcp-server.js");
42
+ Object.defineProperty(exports, "runMcpServerWithOAuth", { enumerable: true, get: function () { return mcp_server_js_1.runMcpServerWithOAuth; } });
43
+ // Configuration
44
+ var config_js_1 = require("./config.js");
45
+ Object.defineProperty(exports, "configureAuth", { enumerable: true, get: function () { return config_js_1.configureAuth; } });
46
+ Object.defineProperty(exports, "getConfig", { enumerable: true, get: function () { return config_js_1.getConfig; } });
47
+ Object.defineProperty(exports, "isConfigured", { enumerable: true, get: function () { return config_js_1.isConfigured; } });
48
+ // HTTP / Testing
49
+ var http_js_1 = require("./http.js");
50
+ Object.defineProperty(exports, "testAuthService", { enumerable: true, get: function () { return http_js_1.testAuthService; } });
51
+ Object.defineProperty(exports, "testServices", { enumerable: true, get: function () { return http_js_1.testServices; } });
52
+ // Service Access
53
+ var service_access_js_1 = require("./service-access.js");
54
+ Object.defineProperty(exports, "ServiceAccessSDK", { enumerable: true, get: function () { return service_access_js_1.ServiceAccessSDK; } });
55
+ Object.defineProperty(exports, "ServiceAccessError", { enumerable: true, get: function () { return service_access_js_1.ServiceAccessError; } });
56
+ // CIBA Passwordless Auth
57
+ var ciba_js_1 = require("./ciba.js");
58
+ Object.defineProperty(exports, "CIBAClient", { enumerable: true, get: function () { return ciba_js_1.CIBAClient; } });
59
+ // SPIFFE Workload Identity
60
+ var quick_start_svid_js_1 = require("./spiffe/quick-start-svid.js");
61
+ Object.defineProperty(exports, "QuickStartSVID", { enumerable: true, get: function () { return quick_start_svid_js_1.QuickStartSVID; } });
62
+ var workload_api_client_js_1 = require("./spiffe/workload-api-client.js");
63
+ Object.defineProperty(exports, "WorkloadAPIClient", { enumerable: true, get: function () { return workload_api_client_js_1.WorkloadAPIClient; } });
64
+ var workload_svid_js_1 = require("./spiffe/workload-svid.js");
65
+ Object.defineProperty(exports, "WorkloadSVID", { enumerable: true, get: function () { return workload_svid_js_1.WorkloadSVID; } });
66
+ var types_js_1 = require("./types.js");
67
+ Object.defineProperty(exports, "SimpleSession", { enumerable: true, get: function () { return types_js_1.SimpleSession; } });
68
+ exports.VERSION = '4.0.0';
69
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;;;AAEH,kBAAkB;AAClB,iDAA8D;AAArD,mHAAA,kBAAkB,OAAA;AAAE,wGAAA,OAAO,OAAA;AACpC,iDAAwD;AAA/C,sHAAA,qBAAqB,OAAA;AAG9B,gBAAgB;AAChB,yCAAqE;AAA5D,0GAAA,aAAa,OAAA;AAAE,sGAAA,SAAS,OAAA;AAAE,yGAAA,YAAY,OAAA;AAE/C,iBAAiB;AACjB,qCAA0D;AAAjD,0GAAA,eAAe,OAAA;AAAE,uGAAA,YAAY,OAAA;AAEtC,iBAAiB;AACjB,yDAA2E;AAAlE,qHAAA,gBAAgB,OAAA;AAAE,uHAAA,kBAAkB,OAAA;AAE7C,yBAAyB;AACzB,qCAAuC;AAA9B,qGAAA,UAAU,OAAA;AAEnB,2BAA2B;AAC3B,oEAA8D;AAArD,qHAAA,cAAc,OAAA;AACvB,0EAAoE;AAA3D,2HAAA,iBAAiB,OAAA;AAC1B,8DAAyD;AAAhD,gHAAA,YAAY,OAAA;AAcrB,uCAA2C;AAAlC,yGAAA,aAAa,OAAA;AAET,QAAA,OAAO,GAAG,OAAO,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * MCP Server implementation
3
+ * Mirrors Python MCPServer class + run_mcp_server_with_oauth
4
+ */
5
+ import type { ToolDefinition } from './types.js';
6
+ export interface RunMcpServerOptions {
7
+ /** Array of tool definitions created by protectedByAuthSec() and mcpTool() */
8
+ tools: ToolDefinition[];
9
+ /** Your client ID from AuthSec */
10
+ clientId: string;
11
+ /** Application name */
12
+ appName: string;
13
+ /** Server host (default: "0.0.0.0") */
14
+ host?: string;
15
+ /** Server port (default: 3005) */
16
+ port?: number;
17
+ /** Optional path to SPIRE agent socket */
18
+ spireSocketPath?: string;
19
+ }
20
+ /**
21
+ * Run MCP server using SDK Manager for auth.
22
+ *
23
+ * @example
24
+ * ```ts
25
+ * import { protectedByAuthSec, mcpTool, runMcpServerWithOAuth } from '@authsec/sdk';
26
+ *
27
+ * const myTool = protectedByAuthSec({
28
+ * toolName: 'my_tool',
29
+ * roles: ['admin'],
30
+ * }, async (args, session) => {
31
+ * return [{ type: 'text', text: 'Hello!' }];
32
+ * });
33
+ *
34
+ * runMcpServerWithOAuth({
35
+ * tools: [myTool],
36
+ * clientId: 'your-client-id',
37
+ * appName: 'my-app',
38
+ * });
39
+ * ```
40
+ */
41
+ export declare function runMcpServerWithOAuth(options: RunMcpServerOptions): void;
42
+ //# sourceMappingURL=mcp-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,YAAY,CAAC;AAgU7D,MAAM,WAAW,mBAAmB;IAClC,8EAA8E;IAC9E,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAoDxE"}