arc-1 0.1.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 (160) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +222 -0
  3. package/bin/arc1.js +12 -0
  4. package/dist/adt/btp.d.ts +122 -0
  5. package/dist/adt/btp.d.ts.map +1 -0
  6. package/dist/adt/btp.js +392 -0
  7. package/dist/adt/btp.js.map +1 -0
  8. package/dist/adt/client.d.ts +89 -0
  9. package/dist/adt/client.d.ts.map +1 -0
  10. package/dist/adt/client.js +208 -0
  11. package/dist/adt/client.js.map +1 -0
  12. package/dist/adt/codeintel.d.ts +38 -0
  13. package/dist/adt/codeintel.d.ts.map +1 -0
  14. package/dist/adt/codeintel.js +61 -0
  15. package/dist/adt/codeintel.js.map +1 -0
  16. package/dist/adt/config.d.ts +65 -0
  17. package/dist/adt/config.d.ts.map +1 -0
  18. package/dist/adt/config.js +35 -0
  19. package/dist/adt/config.js.map +1 -0
  20. package/dist/adt/cookies.d.ts +27 -0
  21. package/dist/adt/cookies.d.ts.map +1 -0
  22. package/dist/adt/cookies.js +67 -0
  23. package/dist/adt/cookies.js.map +1 -0
  24. package/dist/adt/crud.d.ts +35 -0
  25. package/dist/adt/crud.d.ts.map +1 -0
  26. package/dist/adt/crud.js +87 -0
  27. package/dist/adt/crud.js.map +1 -0
  28. package/dist/adt/devtools.d.ts +32 -0
  29. package/dist/adt/devtools.d.ts.map +1 -0
  30. package/dist/adt/devtools.js +154 -0
  31. package/dist/adt/devtools.js.map +1 -0
  32. package/dist/adt/errors.d.ts +49 -0
  33. package/dist/adt/errors.d.ts.map +1 -0
  34. package/dist/adt/errors.js +80 -0
  35. package/dist/adt/errors.js.map +1 -0
  36. package/dist/adt/features.d.ts +44 -0
  37. package/dist/adt/features.d.ts.map +1 -0
  38. package/dist/adt/features.js +173 -0
  39. package/dist/adt/features.js.map +1 -0
  40. package/dist/adt/http.d.ts +116 -0
  41. package/dist/adt/http.d.ts.map +1 -0
  42. package/dist/adt/http.js +374 -0
  43. package/dist/adt/http.js.map +1 -0
  44. package/dist/adt/safety.d.ts +70 -0
  45. package/dist/adt/safety.d.ts.map +1 -0
  46. package/dist/adt/safety.js +222 -0
  47. package/dist/adt/safety.js.map +1 -0
  48. package/dist/adt/transport.d.ts +18 -0
  49. package/dist/adt/transport.d.ts.map +1 -0
  50. package/dist/adt/transport.js +66 -0
  51. package/dist/adt/transport.js.map +1 -0
  52. package/dist/adt/types.d.ts +91 -0
  53. package/dist/adt/types.d.ts.map +1 -0
  54. package/dist/adt/types.js +9 -0
  55. package/dist/adt/types.js.map +1 -0
  56. package/dist/adt/xml-parser.d.ts +109 -0
  57. package/dist/adt/xml-parser.d.ts.map +1 -0
  58. package/dist/adt/xml-parser.js +283 -0
  59. package/dist/adt/xml-parser.js.map +1 -0
  60. package/dist/cache/cache.d.ts +61 -0
  61. package/dist/cache/cache.d.ts.map +1 -0
  62. package/dist/cache/cache.js +14 -0
  63. package/dist/cache/cache.js.map +1 -0
  64. package/dist/cache/memory.d.ts +25 -0
  65. package/dist/cache/memory.d.ts.map +1 -0
  66. package/dist/cache/memory.js +69 -0
  67. package/dist/cache/memory.js.map +1 -0
  68. package/dist/cache/sqlite.d.ts +26 -0
  69. package/dist/cache/sqlite.d.ts.map +1 -0
  70. package/dist/cache/sqlite.js +130 -0
  71. package/dist/cache/sqlite.js.map +1 -0
  72. package/dist/cli.d.ts +14 -0
  73. package/dist/cli.d.ts.map +1 -0
  74. package/dist/cli.js +101 -0
  75. package/dist/cli.js.map +1 -0
  76. package/dist/context/compressor.d.ts +33 -0
  77. package/dist/context/compressor.d.ts.map +1 -0
  78. package/dist/context/compressor.js +208 -0
  79. package/dist/context/compressor.js.map +1 -0
  80. package/dist/context/contract.d.ts +14 -0
  81. package/dist/context/contract.d.ts.map +1 -0
  82. package/dist/context/contract.js +202 -0
  83. package/dist/context/contract.js.map +1 -0
  84. package/dist/context/deps.d.ts +32 -0
  85. package/dist/context/deps.d.ts.map +1 -0
  86. package/dist/context/deps.js +240 -0
  87. package/dist/context/deps.js.map +1 -0
  88. package/dist/context/types.d.ts +56 -0
  89. package/dist/context/types.d.ts.map +1 -0
  90. package/dist/context/types.js +10 -0
  91. package/dist/context/types.js.map +1 -0
  92. package/dist/handlers/intent.d.ts +46 -0
  93. package/dist/handlers/intent.d.ts.map +1 -0
  94. package/dist/handlers/intent.js +539 -0
  95. package/dist/handlers/intent.js.map +1 -0
  96. package/dist/handlers/tools.d.ts +21 -0
  97. package/dist/handlers/tools.d.ts.map +1 -0
  98. package/dist/handlers/tools.js +260 -0
  99. package/dist/handlers/tools.js.map +1 -0
  100. package/dist/index.d.ts +10 -0
  101. package/dist/index.d.ts.map +1 -0
  102. package/dist/index.js +16 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/lint/lint.d.ts +35 -0
  105. package/dist/lint/lint.d.ts.map +1 -0
  106. package/dist/lint/lint.js +67 -0
  107. package/dist/lint/lint.js.map +1 -0
  108. package/dist/server/audit.d.ts +96 -0
  109. package/dist/server/audit.d.ts.map +1 -0
  110. package/dist/server/audit.js +27 -0
  111. package/dist/server/audit.js.map +1 -0
  112. package/dist/server/config.d.ts +19 -0
  113. package/dist/server/config.d.ts.map +1 -0
  114. package/dist/server/config.js +101 -0
  115. package/dist/server/config.js.map +1 -0
  116. package/dist/server/context.d.ts +20 -0
  117. package/dist/server/context.d.ts.map +1 -0
  118. package/dist/server/context.js +20 -0
  119. package/dist/server/context.js.map +1 -0
  120. package/dist/server/elicit.d.ts +43 -0
  121. package/dist/server/elicit.d.ts.map +1 -0
  122. package/dist/server/elicit.js +183 -0
  123. package/dist/server/elicit.js.map +1 -0
  124. package/dist/server/http.d.ts +34 -0
  125. package/dist/server/http.d.ts.map +1 -0
  126. package/dist/server/http.js +328 -0
  127. package/dist/server/http.js.map +1 -0
  128. package/dist/server/logger.d.ts +57 -0
  129. package/dist/server/logger.d.ts.map +1 -0
  130. package/dist/server/logger.js +129 -0
  131. package/dist/server/logger.js.map +1 -0
  132. package/dist/server/server.d.ts +25 -0
  133. package/dist/server/server.d.ts.map +1 -0
  134. package/dist/server/server.js +307 -0
  135. package/dist/server/server.js.map +1 -0
  136. package/dist/server/sinks/btp-auditlog.d.ts +48 -0
  137. package/dist/server/sinks/btp-auditlog.d.ts.map +1 -0
  138. package/dist/server/sinks/btp-auditlog.js +232 -0
  139. package/dist/server/sinks/btp-auditlog.js.map +1 -0
  140. package/dist/server/sinks/file.d.ts +22 -0
  141. package/dist/server/sinks/file.d.ts.map +1 -0
  142. package/dist/server/sinks/file.js +59 -0
  143. package/dist/server/sinks/file.js.map +1 -0
  144. package/dist/server/sinks/stderr.d.ts +19 -0
  145. package/dist/server/sinks/stderr.d.ts.map +1 -0
  146. package/dist/server/sinks/stderr.js +63 -0
  147. package/dist/server/sinks/stderr.js.map +1 -0
  148. package/dist/server/sinks/types.d.ts +14 -0
  149. package/dist/server/sinks/types.d.ts.map +1 -0
  150. package/dist/server/sinks/types.js +8 -0
  151. package/dist/server/sinks/types.js.map +1 -0
  152. package/dist/server/types.d.ts +54 -0
  153. package/dist/server/types.d.ts.map +1 -0
  154. package/dist/server/types.js +42 -0
  155. package/dist/server/types.js.map +1 -0
  156. package/dist/server/xsuaa.d.ts +77 -0
  157. package/dist/server/xsuaa.d.ts.map +1 -0
  158. package/dist/server/xsuaa.js +364 -0
  159. package/dist/server/xsuaa.js.map +1 -0
  160. package/package.json +66 -0
@@ -0,0 +1,328 @@
1
+ /**
2
+ * HTTP Streamable transport for ARC-1.
3
+ *
4
+ * Provides an Express HTTP server that:
5
+ * - Serves MCP Streamable HTTP protocol on /mcp
6
+ * - Health check endpoint on /health
7
+ * - API key authentication via Bearer token
8
+ * - OIDC/JWT validation via JWKS discovery (Entra ID, etc.)
9
+ * - XSUAA OAuth proxy for MCP-native clients (Claude Desktop, Cursor)
10
+ *
11
+ * When XSUAA auth is enabled, the MCP SDK's mcpAuthRouter installs standard
12
+ * OAuth endpoints (authorize, token, register, revoke, discovery metadata).
13
+ *
14
+ * Design decisions:
15
+ *
16
+ * 1. Express is used because the MCP SDK's auth infrastructure (mcpAuthRouter,
17
+ * requireBearerAuth) requires Express. Express 5.x is already a transitive
18
+ * dependency of the MCP SDK.
19
+ *
20
+ * 2. Per-request server pattern: each MCP request gets a fresh Server + Transport.
21
+ * This avoids "already connected" errors from concurrent clients.
22
+ *
23
+ * 3. Auth is checked BEFORE creating the MCP transport to avoid wasting resources.
24
+ *
25
+ * 4. Health endpoint is always unauthenticated — needed for CF health checks.
26
+ */
27
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
28
+ import express from 'express';
29
+ import { logger } from './logger.js';
30
+ import { VERSION } from './server.js';
31
+ // ─── JWKS / JWT types (lazy-loaded from jose) ────────────────────────
32
+ let joseModule = null;
33
+ let jwksClient = null;
34
+ // ─── MCP Request Handler ─────────────────────────────────────────────
35
+ /**
36
+ * Create an Express handler that processes MCP requests.
37
+ * Each request gets a fresh Server + Transport pair.
38
+ */
39
+ function createMcpHandler(serverFactory) {
40
+ return async (req, res) => {
41
+ logger.debug('MCP handler invoked', {
42
+ method: req.method,
43
+ contentType: req.headers['content-type'],
44
+ hasBody: !!req.body,
45
+ bodyMethod: req.body?.method,
46
+ bodyId: req.body?.id,
47
+ });
48
+ try {
49
+ const server = serverFactory();
50
+ const transport = new StreamableHTTPServerTransport({
51
+ sessionIdGenerator: undefined, // Stateless mode
52
+ });
53
+ await server.connect(transport);
54
+ // IMPORTANT: Pass req.body as pre-parsed body (3rd argument).
55
+ // express.json() middleware (line 91) consumes the raw request stream.
56
+ // Without this, the MCP SDK's transport tries to re-read the stream,
57
+ // gets nothing, and returns "Parse error: Invalid JSON" (-32700).
58
+ // The SDK explicitly supports this pattern — see their docs/comments
59
+ // in StreamableHTTPServerTransport.handleRequest().
60
+ await transport.handleRequest(req, res, req.body);
61
+ }
62
+ catch (err) {
63
+ logger.error('MCP request error', { error: err instanceof Error ? err.message : String(err) });
64
+ if (!res.headersSent) {
65
+ res.status(500).json({ error: 'Internal server error' });
66
+ }
67
+ }
68
+ };
69
+ }
70
+ /**
71
+ * Start the HTTP Streamable server.
72
+ */
73
+ export async function startHttpServer(serverFactory, config, xsuaaCredentials) {
74
+ const [host, portStr] = config.httpAddr.split(':');
75
+ const port = Number.parseInt(portStr || '8080', 10);
76
+ const bindHost = host || '0.0.0.0';
77
+ const app = express();
78
+ // Trust first proxy (CF gorouter) — required for express-rate-limit
79
+ // and correct client IP detection behind CF's reverse proxy.
80
+ app.set('trust proxy', 1);
81
+ app.use(express.json());
82
+ app.use(express.urlencoded({ extended: false }));
83
+ const mcpHandler = createMcpHandler(serverFactory);
84
+ // ─── Global Request Logger ──────────────────────────────────
85
+ // Log every inbound request for debugging OAuth/MCP flows.
86
+ app.use((req, _res, next) => {
87
+ logger.debug('HTTP request', {
88
+ method: req.method,
89
+ path: req.path,
90
+ contentType: req.headers['content-type'],
91
+ userAgent: req.headers['user-agent']?.slice(0, 80),
92
+ hasAuth: !!req.headers.authorization,
93
+ ip: req.ip,
94
+ });
95
+ next();
96
+ });
97
+ // ─── Health Check (always unauthenticated) ───────────────
98
+ app.get('/health', (_req, res) => {
99
+ res.json({ status: 'ok', version: VERSION });
100
+ });
101
+ // ─── XSUAA OAuth Proxy Mode ──────────────────────────────
102
+ if (config.xsuaaAuth && xsuaaCredentials) {
103
+ const { mcpAuthRouter } = await import('@modelcontextprotocol/sdk/server/auth/router.js');
104
+ const { requireBearerAuth } = await import('@modelcontextprotocol/sdk/server/auth/middleware/bearerAuth.js');
105
+ const { createXsuaaOAuthProvider, createChainedTokenVerifier, createXsuaaTokenVerifier } = await import('./xsuaa.js');
106
+ const { getAppUrl } = await import('../adt/btp.js');
107
+ // Determine app URL for OAuth metadata
108
+ const appUrl = getAppUrl() ?? `http://${bindHost}:${port}`;
109
+ // Create XSUAA provider + chained verifier
110
+ const { provider } = createXsuaaOAuthProvider(xsuaaCredentials, appUrl);
111
+ const xsuaaVerifier = createXsuaaTokenVerifier(xsuaaCredentials);
112
+ const oidcVerifier = config.oidcIssuer ? await createOidcVerifier(config) : undefined;
113
+ const chainedVerifier = createChainedTokenVerifier(config, xsuaaVerifier, oidcVerifier);
114
+ const bearerAuth = requireBearerAuth({ verifier: { verifyAccessToken: chainedVerifier } });
115
+ // ─── OAuth authorize normalization + Copilot Studio MCP workaround ──
116
+ // Copilot Studio sends MCP JSON-RPC requests to /authorize instead of
117
+ // /mcp after completing the OAuth flow. When we detect a JSON-RPC body
118
+ // (has "jsonrpc" field) on POST /authorize, we bypass the OAuth handler
119
+ // and route directly to bearerAuth + mcpHandler.
120
+ //
121
+ // For normal OAuth requests, merge query params into body as fallback
122
+ // (some clients send POST /authorize with params in query string).
123
+ app.use('/authorize', (req, res, next) => {
124
+ // Detect MCP JSON-RPC on /authorize (Copilot Studio quirk)
125
+ if (req.method === 'POST' && req.body?.jsonrpc) {
126
+ logger.info('MCP JSON-RPC on /authorize, routing to MCP handler', {
127
+ rpcMethod: req.body.method,
128
+ id: req.body.id,
129
+ userAgent: req.headers['user-agent']?.slice(0, 60),
130
+ });
131
+ // Run bearerAuth, then mcpHandler — skip the OAuth authorize handler
132
+ bearerAuth(req, res, (err) => {
133
+ if (err) {
134
+ next(err);
135
+ return;
136
+ }
137
+ mcpHandler(req, res);
138
+ });
139
+ return;
140
+ }
141
+ logger.debug('OAuth authorize request', {
142
+ method: req.method,
143
+ contentType: req.headers['content-type'],
144
+ hasBody: !!req.body,
145
+ bodyKeys: req.body ? Object.keys(req.body) : [],
146
+ queryKeys: Object.keys(req.query),
147
+ });
148
+ if (req.method === 'POST' && req.query.client_id && (!req.body || !req.body.client_id)) {
149
+ req.body = { ...req.query, ...(req.body || {}) };
150
+ logger.debug('OAuth authorize: merged query params into body', {
151
+ client_id: req.body.client_id,
152
+ });
153
+ }
154
+ next();
155
+ });
156
+ // Install MCP SDK auth router at root (OAuth endpoints + DCR)
157
+ // resourceServerUrl must point to /mcp so that the protected resource
158
+ // metadata is served at /.well-known/oauth-protected-resource/mcp
159
+ // (per RFC 9728). Without this, MCP clients can't discover the
160
+ // resource endpoint and may send JSON-RPC to the wrong path.
161
+ app.use(mcpAuthRouter({
162
+ provider,
163
+ issuerUrl: new URL(appUrl),
164
+ baseUrl: new URL(appUrl),
165
+ resourceServerUrl: new URL(`${appUrl}/mcp`),
166
+ scopesSupported: ['read', 'write', 'admin'],
167
+ resourceName: 'ARC-1 SAP MCP Server',
168
+ }));
169
+ // Protected MCP endpoint with chained token verification
170
+ app.all('/mcp', bearerAuth, mcpHandler);
171
+ logger.info('XSUAA OAuth proxy enabled', {
172
+ xsappname: xsuaaCredentials.xsappname,
173
+ appUrl,
174
+ });
175
+ }
176
+ else {
177
+ // ─── Standard Auth Mode (API key / OIDC) ─────────────────
178
+ if (config.oidcIssuer) {
179
+ await initJwks(config.oidcIssuer);
180
+ }
181
+ // Auth middleware for standard mode
182
+ const authMiddleware = async (req, res, next) => {
183
+ const authResult = await checkAuth(req, config);
184
+ if (!authResult.ok) {
185
+ res.status(authResult.status).json({ error: authResult.message });
186
+ return;
187
+ }
188
+ next();
189
+ };
190
+ app.all('/mcp', authMiddleware, mcpHandler);
191
+ }
192
+ // ─── 404 for anything else ─────────────────────────────────
193
+ app.use((req, res) => {
194
+ logger.debug('404 Not Found', { method: req.method, path: req.path, url: req.originalUrl });
195
+ res.status(404).json({ error: 'Not found. Use /mcp for MCP protocol, /health for health check.' });
196
+ });
197
+ // ─── Start listening ───────────────────────────────────────
198
+ app.listen(port, bindHost, () => {
199
+ let authMode = 'NONE (open)';
200
+ if (config.xsuaaAuth && xsuaaCredentials)
201
+ authMode = 'XSUAA OAuth proxy';
202
+ else if (config.apiKey && config.oidcIssuer)
203
+ authMode = 'API key + OIDC';
204
+ else if (config.apiKey)
205
+ authMode = 'API key';
206
+ else if (config.oidcIssuer)
207
+ authMode = 'OIDC';
208
+ logger.info('ARC-1 HTTP server started', {
209
+ addr: `${bindHost}:${port}`,
210
+ health: `http://${bindHost}:${port}/health`,
211
+ mcp: `http://${bindHost}:${port}/mcp`,
212
+ auth: authMode,
213
+ });
214
+ });
215
+ }
216
+ // ─── OIDC Verifier Factory ───────────────────────────────────────────
217
+ /**
218
+ * Create an Entra ID / OIDC token verifier using jose.
219
+ * Returns a function compatible with the chained verifier.
220
+ */
221
+ async function createOidcVerifier(config) {
222
+ await initJwks(config.oidcIssuer);
223
+ return async (token) => {
224
+ if (!joseModule || !jwksClient) {
225
+ throw new Error('OIDC not initialized');
226
+ }
227
+ const { payload } = await joseModule.jwtVerify(token, jwksClient, {
228
+ issuer: config.oidcIssuer,
229
+ audience: config.oidcAudience,
230
+ });
231
+ logger.debug('OIDC JWT validated', { sub: payload.sub, iss: payload.iss });
232
+ return {
233
+ token,
234
+ clientId: payload.azp ?? payload.sub ?? 'oidc-user',
235
+ scopes: ['read', 'write', 'admin'], // OIDC tokens get full access (scopes managed by OIDC provider)
236
+ expiresAt: payload.exp,
237
+ extra: { sub: payload.sub, iss: payload.iss },
238
+ };
239
+ };
240
+ }
241
+ /**
242
+ * Check authentication for standard mode (API key + OIDC).
243
+ * Used when XSUAA auth is NOT enabled.
244
+ */
245
+ async function checkAuth(req, config) {
246
+ // No auth configured — allow all
247
+ if (!config.apiKey && !config.oidcIssuer) {
248
+ return { ok: true, status: 200, message: '' };
249
+ }
250
+ const authHeader = req.headers.authorization;
251
+ if (!authHeader?.startsWith('Bearer ')) {
252
+ return {
253
+ ok: false,
254
+ status: 401,
255
+ message: 'Missing or invalid Authorization header. Expected: Bearer <token>',
256
+ };
257
+ }
258
+ const token = authHeader.slice(7);
259
+ // API Key check
260
+ if (config.apiKey) {
261
+ if (token === config.apiKey) {
262
+ return { ok: true, status: 200, message: '' };
263
+ }
264
+ if (!config.oidcIssuer) {
265
+ return { ok: false, status: 403, message: 'Invalid API key' };
266
+ }
267
+ }
268
+ // OIDC / JWT validation
269
+ if (config.oidcIssuer) {
270
+ try {
271
+ await validateJwt(token, config);
272
+ return { ok: true, status: 200, message: '' };
273
+ }
274
+ catch (err) {
275
+ const msg = err instanceof Error ? err.message : 'JWT validation failed';
276
+ logger.debug('JWT validation failed', { error: msg });
277
+ return { ok: false, status: 403, message: `Authentication failed: ${msg}` };
278
+ }
279
+ }
280
+ return { ok: false, status: 403, message: 'Authentication failed' };
281
+ }
282
+ /**
283
+ * Initialize JWKS client from OIDC discovery.
284
+ */
285
+ async function initJwks(issuer) {
286
+ if (joseModule)
287
+ return;
288
+ try {
289
+ joseModule = await import('jose');
290
+ const jwksUri = new URL('.well-known/openid-configuration', issuer.endsWith('/') ? issuer : `${issuer}/`);
291
+ const discoveryResp = await fetch(jwksUri.toString());
292
+ const discovery = (await discoveryResp.json());
293
+ if (!discovery.jwks_uri) {
294
+ throw new Error(`No jwks_uri in OIDC discovery response from ${jwksUri}`);
295
+ }
296
+ jwksClient = joseModule.createRemoteJWKSet(new URL(discovery.jwks_uri));
297
+ logger.info('OIDC JWKS initialized', { issuer, jwksUri: discovery.jwks_uri });
298
+ }
299
+ catch (err) {
300
+ logger.error('Failed to initialize OIDC JWKS', {
301
+ issuer,
302
+ error: err instanceof Error ? err.message : String(err),
303
+ });
304
+ }
305
+ }
306
+ /**
307
+ * Validate a JWT token against the configured OIDC issuer.
308
+ */
309
+ async function validateJwt(token, config) {
310
+ if (!joseModule || !jwksClient) {
311
+ if (config.oidcIssuer) {
312
+ await initJwks(config.oidcIssuer);
313
+ }
314
+ if (!joseModule || !jwksClient) {
315
+ throw new Error('OIDC not initialized — check SAP_OIDC_ISSUER configuration');
316
+ }
317
+ }
318
+ const { payload } = await joseModule.jwtVerify(token, jwksClient, {
319
+ issuer: config.oidcIssuer,
320
+ audience: config.oidcAudience,
321
+ });
322
+ logger.debug('JWT validated', {
323
+ sub: payload.sub,
324
+ iss: payload.iss,
325
+ exp: payload.exp,
326
+ });
327
+ }
328
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../ts-src/server/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Logger for ARC-1.
3
+ *
4
+ * Critical: ALL output goes to stderr, never stdout.
5
+ * stdout is reserved for the MCP JSON-RPC stream (stdio transport).
6
+ * Using console.log() would corrupt the MCP protocol.
7
+ *
8
+ * Supports two output formats:
9
+ * - 'text': human-readable for local development
10
+ * - 'json': structured for cloud deployments (CF, K8s, Datadog)
11
+ *
12
+ * Architecture: the Logger dispatches to registered LogSinks.
13
+ * StderrSink is always active. FileSink and BTPAuditLogSink are optional.
14
+ *
15
+ * The emitAudit() method writes structured audit events to ALL sinks
16
+ * (file/BTP sinks receive all events regardless of stderr level filter).
17
+ *
18
+ * Per OWASP MCP guide and Datadog recommendations, every log entry
19
+ * includes timestamp and level. Tool call logs include correlation
20
+ * context (session ID, tool name, duration).
21
+ */
22
+ import type { AuditEvent } from './audit.js';
23
+ import { type LogFormat as SinkLogFormat } from './sinks/stderr.js';
24
+ import type { LogSink } from './sinks/types.js';
25
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
26
+ export type LogFormat = SinkLogFormat;
27
+ export interface LogContext {
28
+ [key: string]: unknown;
29
+ }
30
+ export declare class Logger {
31
+ private format;
32
+ private minLevel;
33
+ private sinks;
34
+ constructor(format?: LogFormat, verbose?: boolean);
35
+ /** Add a log sink (file, BTP audit log, etc.) */
36
+ addSink(sink: LogSink): void;
37
+ /** Get all registered sinks (for testing) */
38
+ getSinks(): readonly LogSink[];
39
+ debug(message: string, context?: LogContext): void;
40
+ info(message: string, context?: LogContext): void;
41
+ warn(message: string, context?: LogContext): void;
42
+ error(message: string, context?: LogContext): void;
43
+ /**
44
+ * Emit a structured audit event to all sinks.
45
+ * Each sink handles its own level filtering.
46
+ * Automatically attaches requestId from AsyncLocalStorage context.
47
+ */
48
+ emitAudit(event: AuditEvent): void;
49
+ /** Flush all sinks (for graceful shutdown) */
50
+ flush(): Promise<void>;
51
+ private write;
52
+ }
53
+ /** Global logger instance — initialized during server startup */
54
+ export declare let logger: Logger;
55
+ /** Initialize the global logger with server configuration */
56
+ export declare function initLogger(format: LogFormat, verbose: boolean): void;
57
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../ts-src/server/logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,OAAO,EAAE,KAAK,SAAS,IAAI,aAAa,EAAc,MAAM,mBAAmB,CAAC;AAChF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAC3D,MAAM,MAAM,SAAS,GAAG,aAAa,CAAC;AAEtC,MAAM,WAAW,UAAU;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AASD,qBAAa,MAAM;IAKf,OAAO,CAAC,MAAM;IAJhB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAY;gBAGf,MAAM,GAAE,SAAkB,EAClC,OAAO,GAAE,OAAe;IAO1B,iDAAiD;IACjD,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAI5B,6CAA6C;IAC7C,QAAQ,IAAI,SAAS,OAAO,EAAE;IAI9B,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIlD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIjD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIjD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI;IAIlD;;;;OAIG;IACH,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAmBlC,8CAA8C;IACxC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,OAAO,CAAC,KAAK;CAoBd;AAkBD,iEAAiE;AACjE,eAAO,IAAI,MAAM,QAA4B,CAAC;AAE9C,6DAA6D;AAC7D,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAEpE"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Logger for ARC-1.
3
+ *
4
+ * Critical: ALL output goes to stderr, never stdout.
5
+ * stdout is reserved for the MCP JSON-RPC stream (stdio transport).
6
+ * Using console.log() would corrupt the MCP protocol.
7
+ *
8
+ * Supports two output formats:
9
+ * - 'text': human-readable for local development
10
+ * - 'json': structured for cloud deployments (CF, K8s, Datadog)
11
+ *
12
+ * Architecture: the Logger dispatches to registered LogSinks.
13
+ * StderrSink is always active. FileSink and BTPAuditLogSink are optional.
14
+ *
15
+ * The emitAudit() method writes structured audit events to ALL sinks
16
+ * (file/BTP sinks receive all events regardless of stderr level filter).
17
+ *
18
+ * Per OWASP MCP guide and Datadog recommendations, every log entry
19
+ * includes timestamp and level. Tool call logs include correlation
20
+ * context (session ID, tool name, duration).
21
+ */
22
+ import { getCurrentContext } from './context.js';
23
+ import { StderrSink } from './sinks/stderr.js';
24
+ const LEVEL_PRIORITY = {
25
+ debug: 0,
26
+ info: 1,
27
+ warn: 2,
28
+ error: 3,
29
+ };
30
+ export class Logger {
31
+ format;
32
+ minLevel;
33
+ sinks;
34
+ constructor(format = 'text', verbose = false) {
35
+ this.format = format;
36
+ this.minLevel = verbose ? LEVEL_PRIORITY.debug : LEVEL_PRIORITY.info;
37
+ // Default: stderr only
38
+ this.sinks = [new StderrSink(format, verbose ? 'debug' : 'info')];
39
+ }
40
+ /** Add a log sink (file, BTP audit log, etc.) */
41
+ addSink(sink) {
42
+ this.sinks.push(sink);
43
+ }
44
+ /** Get all registered sinks (for testing) */
45
+ getSinks() {
46
+ return this.sinks;
47
+ }
48
+ debug(message, context) {
49
+ this.write('debug', message, context);
50
+ }
51
+ info(message, context) {
52
+ this.write('info', message, context);
53
+ }
54
+ warn(message, context) {
55
+ this.write('warn', message, context);
56
+ }
57
+ error(message, context) {
58
+ this.write('error', message, context);
59
+ }
60
+ /**
61
+ * Emit a structured audit event to all sinks.
62
+ * Each sink handles its own level filtering.
63
+ * Automatically attaches requestId from AsyncLocalStorage context.
64
+ */
65
+ emitAudit(event) {
66
+ // Attach requestId from context if not already set
67
+ if (!event.requestId) {
68
+ const ctx = getCurrentContext();
69
+ if (ctx) {
70
+ event.requestId = ctx.requestId;
71
+ if (!event.user && ctx.user)
72
+ event.user = ctx.user;
73
+ }
74
+ }
75
+ for (const sink of this.sinks) {
76
+ try {
77
+ sink.write(event);
78
+ }
79
+ catch {
80
+ // Sinks must not throw — but if they do, don't crash the server
81
+ }
82
+ }
83
+ }
84
+ /** Flush all sinks (for graceful shutdown) */
85
+ async flush() {
86
+ await Promise.all(this.sinks.map((s) => s.flush?.()));
87
+ }
88
+ write(level, message, context) {
89
+ if (LEVEL_PRIORITY[level] < this.minLevel)
90
+ return;
91
+ // Redact sensitive fields from context
92
+ const safeContext = context ? redactSensitive(context) : undefined;
93
+ if (this.format === 'json') {
94
+ const entry = {
95
+ timestamp: new Date().toISOString(),
96
+ level,
97
+ message,
98
+ ...safeContext,
99
+ };
100
+ process.stderr.write(`${JSON.stringify(entry)}\n`);
101
+ }
102
+ else {
103
+ const ts = new Date().toISOString();
104
+ const ctx = safeContext ? ` ${JSON.stringify(safeContext)}` : '';
105
+ process.stderr.write(`[${ts}] ${level.toUpperCase()}: ${message}${ctx}\n`);
106
+ }
107
+ }
108
+ }
109
+ /** Redact known sensitive fields to prevent credential leakage in logs */
110
+ function redactSensitive(context) {
111
+ const sensitiveKeys = ['password', 'token', 'cookie', 'authorization', 'secret', 'csrf'];
112
+ const result = {};
113
+ for (const [key, value] of Object.entries(context)) {
114
+ if (sensitiveKeys.some((s) => key.toLowerCase().includes(s))) {
115
+ result[key] = '[REDACTED]';
116
+ }
117
+ else {
118
+ result[key] = value;
119
+ }
120
+ }
121
+ return result;
122
+ }
123
+ /** Global logger instance — initialized during server startup */
124
+ export let logger = new Logger('text', false);
125
+ /** Initialize the global logger with server configuration */
126
+ export function initLogger(format, verbose) {
127
+ logger = new Logger(format, verbose);
128
+ }
129
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../ts-src/server/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * MCP Server for ARC-1.
3
+ *
4
+ * Creates and starts the MCP server with 11 intent-based tools.
5
+ * Supports two transports:
6
+ * - stdio (default): for local MCP clients (Claude Desktop, Claude Code, Cursor)
7
+ * - http-streamable: for remote/containerized deployments
8
+ */
9
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
10
+ import type { BTPConfig, BTPProxyConfig } from '../adt/btp.js';
11
+ import type { ServerConfig } from './types.js';
12
+ /** ARC-1 version */
13
+ export declare const VERSION = "0.1.0";
14
+ /**
15
+ * Create the MCP server with registered tool handlers.
16
+ * @param config Server configuration
17
+ * @param btpProxy Optional BTP connectivity proxy config (resolved at startup)
18
+ * @param btpConfig Optional BTP service config (for per-user destination lookup)
19
+ */
20
+ export declare function createServer(config: ServerConfig, btpProxy?: BTPProxyConfig, btpConfig?: BTPConfig): Server;
21
+ /**
22
+ * Create and start the MCP server.
23
+ */
24
+ export declare function createAndStartServer(config: ServerConfig): Promise<Server>;
25
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../ts-src/server/server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAGnE,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAO/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,oBAAoB;AACpB,eAAO,MAAM,OAAO,UAAU,CAAC;AAoG/B;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,cAAc,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,MAAM,CAwF3G;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAkHhF"}