@baref00t/mcp-server 0.2.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.
- package/LICENSE +201 -0
- package/README.md +109 -0
- package/dist/auth.d.ts +28 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +58 -0
- package/dist/auth.js.map +1 -0
- package/dist/config.d.ts +33 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +124 -0
- package/dist/config.js.map +1 -0
- package/dist/env.d.ts +41 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +37 -0
- package/dist/env.js.map +1 -0
- package/dist/logger.d.ts +3 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +31 -0
- package/dist/logger.js.map +1 -0
- package/dist/registry.d.ts +58 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +94 -0
- package/dist/registry.js.map +1 -0
- package/dist/sdkCache.d.ts +20 -0
- package/dist/sdkCache.d.ts.map +1 -0
- package/dist/sdkCache.js +65 -0
- package/dist/sdkCache.js.map +1 -0
- package/dist/server.d.ts +25 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +144 -0
- package/dist/server.js.map +1 -0
- package/dist/telemetry.d.ts +8 -0
- package/dist/telemetry.d.ts.map +1 -0
- package/dist/telemetry.js +32 -0
- package/dist/telemetry.js.map +1 -0
- package/dist/tools/distributor/getUsage.d.ts +12 -0
- package/dist/tools/distributor/getUsage.d.ts.map +1 -0
- package/dist/tools/distributor/getUsage.js +25 -0
- package/dist/tools/distributor/getUsage.js.map +1 -0
- package/dist/tools/distributor/listPartners.d.ts +12 -0
- package/dist/tools/distributor/listPartners.d.ts.map +1 -0
- package/dist/tools/distributor/listPartners.js +20 -0
- package/dist/tools/distributor/listPartners.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +102 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/partner/createCustomer.d.ts +27 -0
- package/dist/tools/partner/createCustomer.d.ts.map +1 -0
- package/dist/tools/partner/createCustomer.js +29 -0
- package/dist/tools/partner/createCustomer.js.map +1 -0
- package/dist/tools/partner/createKey.d.ts +6 -0
- package/dist/tools/partner/createKey.d.ts.map +1 -0
- package/dist/tools/partner/createKey.js +18 -0
- package/dist/tools/partner/createKey.js.map +1 -0
- package/dist/tools/partner/createWebhook.d.ts +18 -0
- package/dist/tools/partner/createWebhook.d.ts.map +1 -0
- package/dist/tools/partner/createWebhook.js +36 -0
- package/dist/tools/partner/createWebhook.js.map +1 -0
- package/dist/tools/partner/deleteWebhook.d.ts +12 -0
- package/dist/tools/partner/deleteWebhook.d.ts.map +1 -0
- package/dist/tools/partner/deleteWebhook.js +25 -0
- package/dist/tools/partner/deleteWebhook.js.map +1 -0
- package/dist/tools/partner/getAssessment.d.ts +12 -0
- package/dist/tools/partner/getAssessment.d.ts.map +1 -0
- package/dist/tools/partner/getAssessment.js +20 -0
- package/dist/tools/partner/getAssessment.js.map +1 -0
- package/dist/tools/partner/getAssessmentReport.d.ts +12 -0
- package/dist/tools/partner/getAssessmentReport.d.ts.map +1 -0
- package/dist/tools/partner/getAssessmentReport.js +28 -0
- package/dist/tools/partner/getAssessmentReport.js.map +1 -0
- package/dist/tools/partner/getAssessmentStatus.d.ts +12 -0
- package/dist/tools/partner/getAssessmentStatus.d.ts.map +1 -0
- package/dist/tools/partner/getAssessmentStatus.js +21 -0
- package/dist/tools/partner/getAssessmentStatus.js.map +1 -0
- package/dist/tools/partner/getBilling.d.ts +6 -0
- package/dist/tools/partner/getBilling.d.ts.map +1 -0
- package/dist/tools/partner/getBilling.js +20 -0
- package/dist/tools/partner/getBilling.js.map +1 -0
- package/dist/tools/partner/getBranding.d.ts +6 -0
- package/dist/tools/partner/getBranding.d.ts.map +1 -0
- package/dist/tools/partner/getBranding.js +18 -0
- package/dist/tools/partner/getBranding.js.map +1 -0
- package/dist/tools/partner/getConsentUrl.d.ts +18 -0
- package/dist/tools/partner/getConsentUrl.d.ts.map +1 -0
- package/dist/tools/partner/getConsentUrl.js +43 -0
- package/dist/tools/partner/getConsentUrl.js.map +1 -0
- package/dist/tools/partner/getCustomer.d.ts +12 -0
- package/dist/tools/partner/getCustomer.d.ts.map +1 -0
- package/dist/tools/partner/getCustomer.js +20 -0
- package/dist/tools/partner/getCustomer.js.map +1 -0
- package/dist/tools/partner/getPaymentPortalUrl.d.ts +6 -0
- package/dist/tools/partner/getPaymentPortalUrl.d.ts.map +1 -0
- package/dist/tools/partner/getPaymentPortalUrl.js +19 -0
- package/dist/tools/partner/getPaymentPortalUrl.js.map +1 -0
- package/dist/tools/partner/getPlanBilling.d.ts +6 -0
- package/dist/tools/partner/getPlanBilling.d.ts.map +1 -0
- package/dist/tools/partner/getPlanBilling.js +38 -0
- package/dist/tools/partner/getPlanBilling.js.map +1 -0
- package/dist/tools/partner/inviteMember.d.ts +15 -0
- package/dist/tools/partner/inviteMember.d.ts.map +1 -0
- package/dist/tools/partner/inviteMember.js +25 -0
- package/dist/tools/partner/inviteMember.js.map +1 -0
- package/dist/tools/partner/listAssessments.d.ts +18 -0
- package/dist/tools/partner/listAssessments.d.ts.map +1 -0
- package/dist/tools/partner/listAssessments.js +27 -0
- package/dist/tools/partner/listAssessments.js.map +1 -0
- package/dist/tools/partner/listCustomers.d.ts +6 -0
- package/dist/tools/partner/listCustomers.d.ts.map +1 -0
- package/dist/tools/partner/listCustomers.js +27 -0
- package/dist/tools/partner/listCustomers.js.map +1 -0
- package/dist/tools/partner/listKeys.d.ts +6 -0
- package/dist/tools/partner/listKeys.d.ts.map +1 -0
- package/dist/tools/partner/listKeys.js +20 -0
- package/dist/tools/partner/listKeys.js.map +1 -0
- package/dist/tools/partner/listMembers.d.ts +6 -0
- package/dist/tools/partner/listMembers.d.ts.map +1 -0
- package/dist/tools/partner/listMembers.js +19 -0
- package/dist/tools/partner/listMembers.js.map +1 -0
- package/dist/tools/partner/listWebhookDeliveries.d.ts +15 -0
- package/dist/tools/partner/listWebhookDeliveries.d.ts.map +1 -0
- package/dist/tools/partner/listWebhookDeliveries.js +32 -0
- package/dist/tools/partner/listWebhookDeliveries.js.map +1 -0
- package/dist/tools/partner/listWebhooks.d.ts +6 -0
- package/dist/tools/partner/listWebhooks.d.ts.map +1 -0
- package/dist/tools/partner/listWebhooks.js +18 -0
- package/dist/tools/partner/listWebhooks.js.map +1 -0
- package/dist/tools/partner/mailDisconnect.d.ts +6 -0
- package/dist/tools/partner/mailDisconnect.d.ts.map +1 -0
- package/dist/tools/partner/mailDisconnect.js +18 -0
- package/dist/tools/partner/mailDisconnect.js.map +1 -0
- package/dist/tools/partner/mailSendTest.d.ts +6 -0
- package/dist/tools/partner/mailSendTest.d.ts.map +1 -0
- package/dist/tools/partner/mailSendTest.js +20 -0
- package/dist/tools/partner/mailSendTest.js.map +1 -0
- package/dist/tools/partner/mailSetMode.d.ts +12 -0
- package/dist/tools/partner/mailSetMode.d.ts.map +1 -0
- package/dist/tools/partner/mailSetMode.js +26 -0
- package/dist/tools/partner/mailSetMode.js.map +1 -0
- package/dist/tools/partner/mailSetSharedMailbox.d.ts +12 -0
- package/dist/tools/partner/mailSetSharedMailbox.d.ts.map +1 -0
- package/dist/tools/partner/mailSetSharedMailbox.js +25 -0
- package/dist/tools/partner/mailSetSharedMailbox.js.map +1 -0
- package/dist/tools/partner/mailStartConnect.d.ts +12 -0
- package/dist/tools/partner/mailStartConnect.d.ts.map +1 -0
- package/dist/tools/partner/mailStartConnect.js +28 -0
- package/dist/tools/partner/mailStartConnect.js.map +1 -0
- package/dist/tools/partner/mailStatus.d.ts +6 -0
- package/dist/tools/partner/mailStatus.d.ts.map +1 -0
- package/dist/tools/partner/mailStatus.js +19 -0
- package/dist/tools/partner/mailStatus.js.map +1 -0
- package/dist/tools/partner/removeMember.d.ts +12 -0
- package/dist/tools/partner/removeMember.d.ts.map +1 -0
- package/dist/tools/partner/removeMember.js +25 -0
- package/dist/tools/partner/removeMember.js.map +1 -0
- package/dist/tools/partner/resendMemberInvite.d.ts +12 -0
- package/dist/tools/partner/resendMemberInvite.d.ts.map +1 -0
- package/dist/tools/partner/resendMemberInvite.js +24 -0
- package/dist/tools/partner/resendMemberInvite.js.map +1 -0
- package/dist/tools/partner/revokeKey.d.ts +12 -0
- package/dist/tools/partner/revokeKey.d.ts.map +1 -0
- package/dist/tools/partner/revokeKey.js +25 -0
- package/dist/tools/partner/revokeKey.js.map +1 -0
- package/dist/tools/partner/sendConsentEmail.d.ts +18 -0
- package/dist/tools/partner/sendConsentEmail.d.ts.map +1 -0
- package/dist/tools/partner/sendConsentEmail.js +50 -0
- package/dist/tools/partner/sendConsentEmail.js.map +1 -0
- package/dist/tools/partner/testWebhook.d.ts +12 -0
- package/dist/tools/partner/testWebhook.d.ts.map +1 -0
- package/dist/tools/partner/testWebhook.js +25 -0
- package/dist/tools/partner/testWebhook.js.map +1 -0
- package/dist/tools/partner/triggerAssessment.d.ts +18 -0
- package/dist/tools/partner/triggerAssessment.d.ts.map +1 -0
- package/dist/tools/partner/triggerAssessment.js +26 -0
- package/dist/tools/partner/triggerAssessment.js.map +1 -0
- package/dist/tools/partner/updateBranding.d.ts +31 -0
- package/dist/tools/partner/updateBranding.d.ts.map +1 -0
- package/dist/tools/partner/updateBranding.js +44 -0
- package/dist/tools/partner/updateBranding.js.map +1 -0
- package/dist/tools/partner/updateMember.d.ts +26 -0
- package/dist/tools/partner/updateMember.d.ts.map +1 -0
- package/dist/tools/partner/updateMember.js +35 -0
- package/dist/tools/partner/updateMember.js.map +1 -0
- package/dist/tools/partner/updateWebhook.d.ts +41 -0
- package/dist/tools/partner/updateWebhook.d.ts.map +1 -0
- package/dist/tools/partner/updateWebhook.js +42 -0
- package/dist/tools/partner/updateWebhook.js.map +1 -0
- package/package.json +62 -0
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAa,EAAE,KAAK,MAAM,EAAE,MAAM,MAAM,CAAA;AAKxC,wBAAgB,MAAM,IAAI,MAAM,CAyB/B"}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import pino from 'pino';
|
|
2
|
+
import { env } from './env.js';
|
|
3
|
+
let _logger = null;
|
|
4
|
+
export function logger() {
|
|
5
|
+
if (_logger)
|
|
6
|
+
return _logger;
|
|
7
|
+
const e = env();
|
|
8
|
+
_logger = pino({
|
|
9
|
+
level: process.env['MCP_LOG_LEVEL'] ?? 'info',
|
|
10
|
+
base: {
|
|
11
|
+
service: 'baref00t-mcp-server',
|
|
12
|
+
env: e.ENVIRONMENT,
|
|
13
|
+
},
|
|
14
|
+
formatters: {
|
|
15
|
+
level: (label) => ({ level: label }),
|
|
16
|
+
},
|
|
17
|
+
redact: {
|
|
18
|
+
paths: [
|
|
19
|
+
'apiKey',
|
|
20
|
+
'authorization',
|
|
21
|
+
'req.headers.authorization',
|
|
22
|
+
'req.headers["x-partner-key"]',
|
|
23
|
+
'req.headers["x-distributor-key"]',
|
|
24
|
+
'req.headers.cookie',
|
|
25
|
+
],
|
|
26
|
+
censor: '[REDACTED]',
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
return _logger;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAqB,MAAM,MAAM,CAAA;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAE9B,IAAI,OAAO,GAAkB,IAAI,CAAA;AAEjC,MAAM,UAAU,MAAM;IACpB,IAAI,OAAO;QAAE,OAAO,OAAO,CAAA;IAC3B,MAAM,CAAC,GAAG,GAAG,EAAE,CAAA;IACf,OAAO,GAAG,IAAI,CAAC;QACb,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,MAAM;QAC7C,IAAI,EAAE;YACJ,OAAO,EAAE,qBAAqB;YAC9B,GAAG,EAAE,CAAC,CAAC,WAAW;SACnB;QACD,UAAU,EAAE;YACV,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;SACrC;QACD,MAAM,EAAE;YACN,KAAK,EAAE;gBACL,QAAQ;gBACR,eAAe;gBACf,2BAA2B;gBAC3B,8BAA8B;gBAC9B,kCAAkC;gBAClC,oBAAoB;aACrB;YACD,MAAM,EAAE,YAAY;SACrB;KACF,CAAC,CAAA;IACF,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool registry — central index of every MCP tool the server exposes.
|
|
3
|
+
*
|
|
4
|
+
* Each tool module under `tools/<scope>/<name>.ts` exports an object
|
|
5
|
+
* conforming to the `Tool` shape below. The registry walks the imports
|
|
6
|
+
* at startup, builds the `tools/list` response, and dispatches
|
|
7
|
+
* `tools/call` to the right handler.
|
|
8
|
+
*
|
|
9
|
+
* `inputSchema` is generated from each tool's Zod schema via
|
|
10
|
+
* zod-to-json-schema so the JSON Schema published to clients always
|
|
11
|
+
* matches the runtime parser.
|
|
12
|
+
*/
|
|
13
|
+
import { z } from 'zod';
|
|
14
|
+
import type { Scope } from './auth.js';
|
|
15
|
+
import type { ExtractedKey } from './auth.js';
|
|
16
|
+
export interface ToolContext {
|
|
17
|
+
/** Authenticated scope + raw API key (don't log the raw key). */
|
|
18
|
+
auth: ExtractedKey;
|
|
19
|
+
/** Per-call request id for log correlation. */
|
|
20
|
+
requestId: string;
|
|
21
|
+
}
|
|
22
|
+
export interface Tool<TInput extends z.ZodTypeAny = z.ZodTypeAny, TOutput = unknown> {
|
|
23
|
+
/** Unique tool name, e.g. `partner_list_customers`. Snake_case. */
|
|
24
|
+
name: string;
|
|
25
|
+
/** Required scope. Tools are filtered out of tools/list when caller's scope mismatches. */
|
|
26
|
+
scope: Scope;
|
|
27
|
+
/** Plain-text description shown verbatim to LLMs. 1-3 sentences. */
|
|
28
|
+
description: string;
|
|
29
|
+
/** Zod schema for the tool input. */
|
|
30
|
+
schema: TInput;
|
|
31
|
+
/** Implementation. Receives parsed input + context. Returns serialisable output. */
|
|
32
|
+
handler: (input: z.infer<TInput>, ctx: ToolContext) => Promise<TOutput>;
|
|
33
|
+
}
|
|
34
|
+
/** Register a tool. Throws if name already taken. */
|
|
35
|
+
export declare function registerTool<TInput extends z.ZodTypeAny, TOutput>(tool: Tool<TInput, TOutput>): void;
|
|
36
|
+
/** All registered tools. */
|
|
37
|
+
export declare function allTools(): Tool[];
|
|
38
|
+
/**
|
|
39
|
+
* Tools available to a given scope, after applying the runtime
|
|
40
|
+
* `MCPEnabledTools` allow-list (empty = all enabled).
|
|
41
|
+
*/
|
|
42
|
+
export declare function visibleTools(scope: Scope): Promise<Tool[]>;
|
|
43
|
+
/** Build the MCP `tools/list` response payload. */
|
|
44
|
+
export declare function listToolsForScope(scope: Scope): Promise<{
|
|
45
|
+
name: string;
|
|
46
|
+
description: string;
|
|
47
|
+
inputSchema: import("zod-to-json-schema").JsonSchema7Type & {
|
|
48
|
+
$schema?: string | undefined;
|
|
49
|
+
definitions?: {
|
|
50
|
+
[key: string]: import("zod-to-json-schema").JsonSchema7Type;
|
|
51
|
+
} | undefined;
|
|
52
|
+
};
|
|
53
|
+
}[]>;
|
|
54
|
+
/** Dispatch a `tools/call`. Throws if tool unknown / wrong scope / disabled / input invalid. */
|
|
55
|
+
export declare function callTool(name: string, rawInput: unknown, ctx: ToolContext): Promise<unknown>;
|
|
56
|
+
/** Test-only — clear all registrations. */
|
|
57
|
+
export declare function _resetRegistry(): void;
|
|
58
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AACtC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAI7C,MAAM,WAAW,WAAW;IAC1B,iEAAiE;IACjE,IAAI,EAAE,YAAY,CAAA;IAClB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO;IACjF,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAA;IACZ,2FAA2F;IAC3F,KAAK,EAAE,KAAK,CAAA;IACZ,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAA;IACnB,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAA;IACd,oFAAoF;IACpF,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CACxE;AAID,qDAAqD;AACrD,wBAAgB,YAAY,CAAC,MAAM,SAAS,CAAC,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,QAK7F;AAED,4BAA4B;AAC5B,wBAAgB,QAAQ,IAAI,IAAI,EAAE,CAEjC;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAOhE;AAED,mDAAmD;AACnD,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,KAAK;;;;;;;;;KAOnD;AAED,gGAAgG;AAChG,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,OAAO,EACjB,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,OAAO,CAAC,CA8ClB;AAED,2CAA2C;AAC3C,wBAAgB,cAAc,SAE7B"}
|
package/dist/registry.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool registry — central index of every MCP tool the server exposes.
|
|
3
|
+
*
|
|
4
|
+
* Each tool module under `tools/<scope>/<name>.ts` exports an object
|
|
5
|
+
* conforming to the `Tool` shape below. The registry walks the imports
|
|
6
|
+
* at startup, builds the `tools/list` response, and dispatches
|
|
7
|
+
* `tools/call` to the right handler.
|
|
8
|
+
*
|
|
9
|
+
* `inputSchema` is generated from each tool's Zod schema via
|
|
10
|
+
* zod-to-json-schema so the JSON Schema published to clients always
|
|
11
|
+
* matches the runtime parser.
|
|
12
|
+
*/
|
|
13
|
+
import { zodToJsonSchema } from 'zod-to-json-schema';
|
|
14
|
+
import { getConfig } from './config.js';
|
|
15
|
+
import { logger } from './logger.js';
|
|
16
|
+
const tools = new Map();
|
|
17
|
+
/** Register a tool. Throws if name already taken. */
|
|
18
|
+
export function registerTool(tool) {
|
|
19
|
+
if (tools.has(tool.name)) {
|
|
20
|
+
throw new Error(`tool already registered: ${tool.name}`);
|
|
21
|
+
}
|
|
22
|
+
tools.set(tool.name, tool);
|
|
23
|
+
}
|
|
24
|
+
/** All registered tools. */
|
|
25
|
+
export function allTools() {
|
|
26
|
+
return [...tools.values()];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Tools available to a given scope, after applying the runtime
|
|
30
|
+
* `MCPEnabledTools` allow-list (empty = all enabled).
|
|
31
|
+
*/
|
|
32
|
+
export async function visibleTools(scope) {
|
|
33
|
+
const config = await getConfig();
|
|
34
|
+
return allTools().filter((t) => {
|
|
35
|
+
if (t.scope !== scope)
|
|
36
|
+
return false;
|
|
37
|
+
if (config.enabledTools.length > 0 && !config.enabledTools.includes(t.name))
|
|
38
|
+
return false;
|
|
39
|
+
return true;
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/** Build the MCP `tools/list` response payload. */
|
|
43
|
+
export async function listToolsForScope(scope) {
|
|
44
|
+
const visible = await visibleTools(scope);
|
|
45
|
+
return visible.map((t) => ({
|
|
46
|
+
name: t.name,
|
|
47
|
+
description: t.description,
|
|
48
|
+
inputSchema: zodToJsonSchema(t.schema, { target: 'jsonSchema7' }),
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
/** Dispatch a `tools/call`. Throws if tool unknown / wrong scope / disabled / input invalid. */
|
|
52
|
+
export async function callTool(name, rawInput, ctx) {
|
|
53
|
+
const tool = tools.get(name);
|
|
54
|
+
if (!tool)
|
|
55
|
+
throw new Error(`unknown tool: ${name}`);
|
|
56
|
+
if (tool.scope !== ctx.auth.scope) {
|
|
57
|
+
throw new Error(`tool '${name}' requires scope '${tool.scope}'; caller is '${ctx.auth.scope}'`);
|
|
58
|
+
}
|
|
59
|
+
const config = await getConfig();
|
|
60
|
+
if (config.enabledTools.length > 0 && !config.enabledTools.includes(name)) {
|
|
61
|
+
throw new Error(`tool '${name}' is disabled by MCPEnabledTools`);
|
|
62
|
+
}
|
|
63
|
+
const parsed = tool.schema.safeParse(rawInput ?? {});
|
|
64
|
+
if (!parsed.success) {
|
|
65
|
+
const issues = parsed.error.issues.map((i) => `${i.path.join('.')}: ${i.message}`).join('; ');
|
|
66
|
+
throw new Error(`invalid input for '${name}': ${issues}`);
|
|
67
|
+
}
|
|
68
|
+
const startedAt = Date.now();
|
|
69
|
+
try {
|
|
70
|
+
const result = await tool.handler(parsed.data, ctx);
|
|
71
|
+
logger().info({
|
|
72
|
+
tool: name,
|
|
73
|
+
scope: tool.scope,
|
|
74
|
+
latencyMs: Date.now() - startedAt,
|
|
75
|
+
requestId: ctx.requestId,
|
|
76
|
+
}, 'tool_call_succeeded');
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
logger().error({
|
|
81
|
+
tool: name,
|
|
82
|
+
scope: tool.scope,
|
|
83
|
+
latencyMs: Date.now() - startedAt,
|
|
84
|
+
requestId: ctx.requestId,
|
|
85
|
+
err: err instanceof Error ? err.message : String(err),
|
|
86
|
+
}, 'tool_call_failed');
|
|
87
|
+
throw err;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/** Test-only — clear all registrations. */
|
|
91
|
+
export function _resetRegistry() {
|
|
92
|
+
tools.clear();
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-tenant SDK client cache.
|
|
3
|
+
*
|
|
4
|
+
* Keyed by sha256(apiKey) so the raw key never enters the cache key set.
|
|
5
|
+
* 1000 entries max, 10-minute TTL — eliminates per-call SDK construction
|
|
6
|
+
* during chatty agent loops without retaining keys longer than necessary.
|
|
7
|
+
*/
|
|
8
|
+
import { PartnerClient } from '@baref00t/sdk/partner';
|
|
9
|
+
import { DistributorClient } from '@baref00t/sdk/distributor';
|
|
10
|
+
import type { Scope } from './auth.js';
|
|
11
|
+
export declare function getPartnerClient(apiKey: string): PartnerClient;
|
|
12
|
+
export declare function getDistributorClient(apiKey: string): DistributorClient;
|
|
13
|
+
/** Test-only. */
|
|
14
|
+
export declare function _resetSdkCache(): void;
|
|
15
|
+
/** Telemetry helper — first 8 chars of the sha256(apiKey) for log correlation. */
|
|
16
|
+
export declare function keyHashShort(apiKey: string): string;
|
|
17
|
+
/** Hint that the configured cache key for `apiKey` is `key`. Useful for unit tests. */
|
|
18
|
+
export declare function _cacheSize(): number;
|
|
19
|
+
export type { Scope };
|
|
20
|
+
//# sourceMappingURL=sdkCache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdkCache.d.ts","sourceRoot":"","sources":["../src/sdkCache.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAE7D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAiBtC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAe9D;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAetE;AAED,iBAAiB;AACjB,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,uFAAuF;AACvF,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,YAAY,EAAE,KAAK,EAAE,CAAA"}
|
package/dist/sdkCache.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-tenant SDK client cache.
|
|
3
|
+
*
|
|
4
|
+
* Keyed by sha256(apiKey) so the raw key never enters the cache key set.
|
|
5
|
+
* 1000 entries max, 10-minute TTL — eliminates per-call SDK construction
|
|
6
|
+
* during chatty agent loops without retaining keys longer than necessary.
|
|
7
|
+
*/
|
|
8
|
+
import { createHash } from 'node:crypto';
|
|
9
|
+
import { LRUCache } from 'lru-cache';
|
|
10
|
+
import { PartnerClient } from '@baref00t/sdk/partner';
|
|
11
|
+
import { DistributorClient } from '@baref00t/sdk/distributor';
|
|
12
|
+
import { env } from './env.js';
|
|
13
|
+
const cache = new LRUCache({
|
|
14
|
+
max: 1000,
|
|
15
|
+
ttl: 10 * 60 * 1000, // 10 minutes
|
|
16
|
+
updateAgeOnGet: false,
|
|
17
|
+
});
|
|
18
|
+
function hashKey(apiKey) {
|
|
19
|
+
return createHash('sha256').update(apiKey).digest('hex').slice(0, 32);
|
|
20
|
+
}
|
|
21
|
+
export function getPartnerClient(apiKey) {
|
|
22
|
+
const hash = hashKey(apiKey);
|
|
23
|
+
let entry = cache.get(hash);
|
|
24
|
+
if (!entry) {
|
|
25
|
+
entry = {};
|
|
26
|
+
cache.set(hash, entry);
|
|
27
|
+
}
|
|
28
|
+
if (!entry.partner) {
|
|
29
|
+
entry.partner = new PartnerClient({
|
|
30
|
+
apiKey,
|
|
31
|
+
baseUrl: env().BAREF00T_API_BASE,
|
|
32
|
+
defaultHeaders: { 'X-Mcp-Server': '1' },
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return entry.partner;
|
|
36
|
+
}
|
|
37
|
+
export function getDistributorClient(apiKey) {
|
|
38
|
+
const hash = hashKey(apiKey);
|
|
39
|
+
let entry = cache.get(hash);
|
|
40
|
+
if (!entry) {
|
|
41
|
+
entry = {};
|
|
42
|
+
cache.set(hash, entry);
|
|
43
|
+
}
|
|
44
|
+
if (!entry.distributor) {
|
|
45
|
+
entry.distributor = new DistributorClient({
|
|
46
|
+
apiKey,
|
|
47
|
+
baseUrl: env().BAREF00T_API_BASE,
|
|
48
|
+
defaultHeaders: { 'X-Mcp-Server': '1' },
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return entry.distributor;
|
|
52
|
+
}
|
|
53
|
+
/** Test-only. */
|
|
54
|
+
export function _resetSdkCache() {
|
|
55
|
+
cache.clear();
|
|
56
|
+
}
|
|
57
|
+
/** Telemetry helper — first 8 chars of the sha256(apiKey) for log correlation. */
|
|
58
|
+
export function keyHashShort(apiKey) {
|
|
59
|
+
return hashKey(apiKey).slice(0, 8);
|
|
60
|
+
}
|
|
61
|
+
/** Hint that the configured cache key for `apiKey` is `key`. Useful for unit tests. */
|
|
62
|
+
export function _cacheSize() {
|
|
63
|
+
return cache.size;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=sdkCache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdkCache.js","sourceRoot":"","sources":["../src/sdkCache.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAQ9B,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAqB;IAC7C,GAAG,EAAE,IAAI;IACT,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,aAAa;IAClC,cAAc,EAAE,KAAK;CACtB,CAAC,CAAA;AAEF,SAAS,OAAO,CAAC,MAAc;IAC7B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AACvE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAC5B,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,GAAG,EAAE,CAAA;QACV,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IACxB,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACnB,KAAK,CAAC,OAAO,GAAG,IAAI,aAAa,CAAC;YAChC,MAAM;YACN,OAAO,EAAE,GAAG,EAAE,CAAC,iBAAiB;YAChC,cAAc,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE;SACxC,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAA;AACtB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAc;IACjD,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;IAC5B,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,KAAK,GAAG,EAAE,CAAA;QACV,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;IACxB,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;QACvB,KAAK,CAAC,WAAW,GAAG,IAAI,iBAAiB,CAAC;YACxC,MAAM;YACN,OAAO,EAAE,GAAG,EAAE,CAAC,iBAAiB;YAChC,cAAc,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE;SACxC,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,WAAW,CAAA;AAC1B,CAAC;AAED,iBAAiB;AACjB,MAAM,UAAU,cAAc;IAC5B,KAAK,CAAC,KAAK,EAAE,CAAA;AACf,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AACpC,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,UAAU;IACxB,OAAO,KAAK,CAAC,IAAI,CAAA;AACnB,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* baref00t MCP server — hosted multi-tenant entry point.
|
|
4
|
+
*
|
|
5
|
+
* Pin: @modelcontextprotocol/sdk@1.29.0 (current at 2026-04-30).
|
|
6
|
+
*
|
|
7
|
+
* Wire model:
|
|
8
|
+
*
|
|
9
|
+
* POST /mcp → Streamable HTTP transport (MCP messages)
|
|
10
|
+
* GET /healthz → liveness (Node up)
|
|
11
|
+
* GET /readyz → readiness (config load OK + tools registered)
|
|
12
|
+
*
|
|
13
|
+
* Per-request:
|
|
14
|
+
* 1. extractKey() validates the API key prefix against MCPAllowedKeyPrefixes
|
|
15
|
+
* and routes to partner|distributor scope.
|
|
16
|
+
* 2. A fresh Server instance + transport is created per request, bound to
|
|
17
|
+
* this caller's auth context. Stateless mode (sessionIdGenerator
|
|
18
|
+
* undefined) — each MCP message is processed independently. This
|
|
19
|
+
* matches how Anthropic's MCP bridge + Claude Desktop's connector
|
|
20
|
+
* actually call us in practice (fresh connection per tool invocation,
|
|
21
|
+
* no session ID reuse). Stateful mode broke because clients open a
|
|
22
|
+
* new initialize for every tool call instead of carrying session IDs.
|
|
23
|
+
*/
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;GAqBG"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* baref00t MCP server — hosted multi-tenant entry point.
|
|
4
|
+
*
|
|
5
|
+
* Pin: @modelcontextprotocol/sdk@1.29.0 (current at 2026-04-30).
|
|
6
|
+
*
|
|
7
|
+
* Wire model:
|
|
8
|
+
*
|
|
9
|
+
* POST /mcp → Streamable HTTP transport (MCP messages)
|
|
10
|
+
* GET /healthz → liveness (Node up)
|
|
11
|
+
* GET /readyz → readiness (config load OK + tools registered)
|
|
12
|
+
*
|
|
13
|
+
* Per-request:
|
|
14
|
+
* 1. extractKey() validates the API key prefix against MCPAllowedKeyPrefixes
|
|
15
|
+
* and routes to partner|distributor scope.
|
|
16
|
+
* 2. A fresh Server instance + transport is created per request, bound to
|
|
17
|
+
* this caller's auth context. Stateless mode (sessionIdGenerator
|
|
18
|
+
* undefined) — each MCP message is processed independently. This
|
|
19
|
+
* matches how Anthropic's MCP bridge + Claude Desktop's connector
|
|
20
|
+
* actually call us in practice (fresh connection per tool invocation,
|
|
21
|
+
* no session ID reuse). Stateful mode broke because clients open a
|
|
22
|
+
* new initialize for every tool call instead of carrying session IDs.
|
|
23
|
+
*/
|
|
24
|
+
import { createServer } from 'node:http';
|
|
25
|
+
import { randomUUID } from 'node:crypto';
|
|
26
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
27
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
28
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
29
|
+
import { env } from './env.js';
|
|
30
|
+
import { logger } from './logger.js';
|
|
31
|
+
import { initTelemetry } from './telemetry.js';
|
|
32
|
+
import { extractKey } from './auth.js';
|
|
33
|
+
import { keyHashShort } from './sdkCache.js';
|
|
34
|
+
import { callTool, listToolsForScope } from './registry.js';
|
|
35
|
+
import { registerAllTools } from './tools/index.js';
|
|
36
|
+
const SDK_NAME = 'baref00t-mcp-server';
|
|
37
|
+
const SDK_VERSION = '0.1.6';
|
|
38
|
+
async function main() {
|
|
39
|
+
const e = env();
|
|
40
|
+
const log = logger();
|
|
41
|
+
await initTelemetry();
|
|
42
|
+
registerAllTools();
|
|
43
|
+
const server = createServer(handleRequest);
|
|
44
|
+
server.listen(e.PORT, () => {
|
|
45
|
+
log.info({ port: e.PORT, env: e.ENVIRONMENT }, 'MCP server listening');
|
|
46
|
+
});
|
|
47
|
+
const shutdown = (signal) => {
|
|
48
|
+
log.info({ signal }, 'shutdown requested — draining');
|
|
49
|
+
server.close(() => process.exit(0));
|
|
50
|
+
setTimeout(() => process.exit(1), 10_000).unref();
|
|
51
|
+
};
|
|
52
|
+
process.on('SIGTERM', () => shutdown('SIGTERM'));
|
|
53
|
+
process.on('SIGINT', () => shutdown('SIGINT'));
|
|
54
|
+
}
|
|
55
|
+
async function handleRequest(req, res) {
|
|
56
|
+
const requestId = randomUUID();
|
|
57
|
+
res.setHeader('X-Request-Id', requestId);
|
|
58
|
+
// CORS preflight passthrough — MCP clients (Claude Desktop, Inspector)
|
|
59
|
+
// may send OPTIONS depending on transport.
|
|
60
|
+
if (req.method === 'OPTIONS') {
|
|
61
|
+
res.writeHead(204, {
|
|
62
|
+
'Access-Control-Allow-Origin': '*',
|
|
63
|
+
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS',
|
|
64
|
+
'Access-Control-Allow-Headers': 'Content-Type, Authorization, X-Partner-Key, X-Distributor-Key, MCP-Session-Id',
|
|
65
|
+
'Access-Control-Max-Age': '86400',
|
|
66
|
+
});
|
|
67
|
+
res.end();
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const url = new URL(req.url ?? '/', `http://${req.headers.host ?? 'localhost'}`);
|
|
71
|
+
if (url.pathname === '/healthz') {
|
|
72
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
73
|
+
res.end(JSON.stringify({ status: 'ok', service: SDK_NAME, version: SDK_VERSION }));
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (url.pathname === '/readyz') {
|
|
77
|
+
// Ready iff at least one tool is registered (config errors will throw above).
|
|
78
|
+
const { allTools } = await import('./registry.js');
|
|
79
|
+
const ok = allTools().length > 0;
|
|
80
|
+
res.writeHead(ok ? 200 : 503, { 'Content-Type': 'application/json' });
|
|
81
|
+
res.end(JSON.stringify({ status: ok ? 'ready' : 'not_ready', tools: allTools().length }));
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
if (url.pathname !== '/mcp') {
|
|
85
|
+
res.writeHead(404, { 'Content-Type': 'application/json' });
|
|
86
|
+
res.end(JSON.stringify({ error: { code: 'NOT_FOUND', message: 'POST /mcp' } }));
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
// Auth + scope routing.
|
|
90
|
+
const key = await extractKey(req);
|
|
91
|
+
if ('status' in key) {
|
|
92
|
+
res.writeHead(key.status, { 'Content-Type': 'application/json' });
|
|
93
|
+
res.end(JSON.stringify(key.body));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
// Build a per-request MCP Server instance bound to this caller's auth.
|
|
97
|
+
const mcp = new Server({ name: SDK_NAME, version: SDK_VERSION }, { capabilities: { tools: {} } });
|
|
98
|
+
// List tools — filter by caller's scope + runtime allow-list.
|
|
99
|
+
mcp.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
100
|
+
const tools = await listToolsForScope(key.scope);
|
|
101
|
+
return { tools };
|
|
102
|
+
});
|
|
103
|
+
// Call tool — dispatch via registry, capture errors as MCP error-results.
|
|
104
|
+
mcp.setRequestHandler(CallToolRequestSchema, async (cr) => {
|
|
105
|
+
const ctx = { auth: key, requestId };
|
|
106
|
+
try {
|
|
107
|
+
const result = await callTool(cr.params.name, cr.params.arguments, ctx);
|
|
108
|
+
return {
|
|
109
|
+
content: [
|
|
110
|
+
{ type: 'text', text: JSON.stringify(result, null, 2) },
|
|
111
|
+
],
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
116
|
+
return {
|
|
117
|
+
isError: true,
|
|
118
|
+
content: [{ type: 'text', text: message }],
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
// Stateless transport — each HTTP request is processed independently.
|
|
123
|
+
// sessionIdGenerator: undefined disables session tracking; the SDK
|
|
124
|
+
// doesn't enforce init-first ordering on messages, so a tools/call
|
|
125
|
+
// arriving without a prior initialize round-trip is processed normally.
|
|
126
|
+
// This matches how Anthropic's bridge + Claude Desktop's connector
|
|
127
|
+
// actually call MCP servers (fresh per tool invocation).
|
|
128
|
+
const transport = new StreamableHTTPServerTransport({
|
|
129
|
+
sessionIdGenerator: undefined,
|
|
130
|
+
enableJsonResponse: true,
|
|
131
|
+
});
|
|
132
|
+
await mcp.connect(transport);
|
|
133
|
+
await transport.handleRequest(req, res);
|
|
134
|
+
logger().debug({
|
|
135
|
+
requestId,
|
|
136
|
+
scope: key.scope,
|
|
137
|
+
keyHash: keyHashShort(key.apiKey),
|
|
138
|
+
}, 'mcp_request_handled');
|
|
139
|
+
}
|
|
140
|
+
main().catch((err) => {
|
|
141
|
+
console.error('fatal:', err);
|
|
142
|
+
process.exit(1);
|
|
143
|
+
});
|
|
144
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenTelemetry + Azure Monitor (App Insights) bootstrap.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the pattern apps/functions uses today. No-op when
|
|
5
|
+
* APPLICATIONINSIGHTS_CONNECTION_STRING is unset.
|
|
6
|
+
*/
|
|
7
|
+
export declare function initTelemetry(): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=telemetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAwBnD"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenTelemetry + Azure Monitor (App Insights) bootstrap.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the pattern apps/functions uses today. No-op when
|
|
5
|
+
* APPLICATIONINSIGHTS_CONNECTION_STRING is unset.
|
|
6
|
+
*/
|
|
7
|
+
import { env } from './env.js';
|
|
8
|
+
import { logger } from './logger.js';
|
|
9
|
+
let _initialised = false;
|
|
10
|
+
export async function initTelemetry() {
|
|
11
|
+
if (_initialised)
|
|
12
|
+
return;
|
|
13
|
+
_initialised = true;
|
|
14
|
+
const e = env();
|
|
15
|
+
if (!e.APPLICATIONINSIGHTS_CONNECTION_STRING) {
|
|
16
|
+
logger().info('telemetry: APPLICATIONINSIGHTS_CONNECTION_STRING unset — skipping OTel bootstrap');
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const { useAzureMonitor } = await import('@azure/monitor-opentelemetry');
|
|
21
|
+
useAzureMonitor({
|
|
22
|
+
azureMonitorExporterOptions: { connectionString: e.APPLICATIONINSIGHTS_CONNECTION_STRING },
|
|
23
|
+
enableLiveMetrics: true,
|
|
24
|
+
samplingRatio: 1.0,
|
|
25
|
+
});
|
|
26
|
+
logger().info('telemetry: Azure Monitor OpenTelemetry initialised');
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
logger().warn({ err: err instanceof Error ? err.message : String(err) }, 'telemetry: failed to initialise Azure Monitor (non-fatal)');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,IAAI,YAAY,GAAG,KAAK,CAAA;AAExB,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,YAAY;QAAE,OAAM;IACxB,YAAY,GAAG,IAAI,CAAA;IAEnB,MAAM,CAAC,GAAG,GAAG,EAAE,CAAA;IACf,IAAI,CAAC,CAAC,CAAC,qCAAqC,EAAE,CAAC;QAC7C,MAAM,EAAE,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAA;QACjG,OAAM;IACR,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAA;QACxE,eAAe,CAAC;YACd,2BAA2B,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC,qCAAqC,EAAE;YAC1F,iBAAiB,EAAE,IAAI;YACvB,aAAa,EAAE,GAAG;SACnB,CAAC,CAAA;QACF,MAAM,EAAE,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAA;IACrE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,EAAE,CAAC,IAAI,CACX,EAAE,GAAG,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EACzD,2DAA2D,CAC5D,CAAA;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { Tool } from '../../registry.js';
|
|
3
|
+
declare const inputSchema: z.ZodObject<{
|
|
4
|
+
month: z.ZodOptional<z.ZodString>;
|
|
5
|
+
}, "strict", z.ZodTypeAny, {
|
|
6
|
+
month?: string | undefined;
|
|
7
|
+
}, {
|
|
8
|
+
month?: string | undefined;
|
|
9
|
+
}>;
|
|
10
|
+
declare const tool: Tool<typeof inputSchema>;
|
|
11
|
+
export default tool;
|
|
12
|
+
//# sourceMappingURL=getUsage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getUsage.d.ts","sourceRoot":"","sources":["../../../src/tools/distributor/getUsage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAE7C,QAAA,MAAM,WAAW;;;;;;EAQN,CAAA;AAEX,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAYlC,CAAA;AAED,eAAe,IAAI,CAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { getDistributorClient } from '../../sdkCache.js';
|
|
3
|
+
const inputSchema = z
|
|
4
|
+
.object({
|
|
5
|
+
month: z
|
|
6
|
+
.string()
|
|
7
|
+
.regex(/^\d{4}-\d{2}$/, 'YYYY-MM')
|
|
8
|
+
.optional()
|
|
9
|
+
.describe('Filter to a specific billing month (YYYY-MM). Defaults to current month.'),
|
|
10
|
+
})
|
|
11
|
+
.strict();
|
|
12
|
+
const tool = {
|
|
13
|
+
name: 'distributor_get_usage',
|
|
14
|
+
scope: 'distributor',
|
|
15
|
+
description: 'Aggregated assessment usage across all sub-partners for a billing month. Returns ' +
|
|
16
|
+
'totalPartners, activePartners, totalRuns, and per-partner breakdown (runs vs limit). ' +
|
|
17
|
+
'Use to answer "how much have my sub-partners used this month?".',
|
|
18
|
+
schema: inputSchema,
|
|
19
|
+
async handler(input, ctx) {
|
|
20
|
+
const client = getDistributorClient(ctx.auth.apiKey);
|
|
21
|
+
return client.usage.get(input);
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
export default tool;
|
|
25
|
+
//# sourceMappingURL=getUsage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getUsage.js","sourceRoot":"","sources":["../../../src/tools/distributor/getUsage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAGxD,MAAM,WAAW,GAAG,CAAC;KAClB,MAAM,CAAC;IACN,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,KAAK,CAAC,eAAe,EAAE,SAAS,CAAC;SACjC,QAAQ,EAAE;SACV,QAAQ,CAAC,0EAA0E,CAAC;CACxF,CAAC;KACD,MAAM,EAAE,CAAA;AAEX,MAAM,IAAI,GAA6B;IACrC,IAAI,EAAE,uBAAuB;IAC7B,KAAK,EAAE,aAAa;IACpB,WAAW,EACT,mFAAmF;QACnF,uFAAuF;QACvF,iEAAiE;IACnE,MAAM,EAAE,WAAW;IACnB,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;QACtB,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACpD,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAChC,CAAC;CACF,CAAA;AAED,eAAe,IAAI,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { Tool } from '../../registry.js';
|
|
3
|
+
declare const inputSchema: z.ZodObject<{
|
|
4
|
+
status: z.ZodOptional<z.ZodString>;
|
|
5
|
+
}, "strict", z.ZodTypeAny, {
|
|
6
|
+
status?: string | undefined;
|
|
7
|
+
}, {
|
|
8
|
+
status?: string | undefined;
|
|
9
|
+
}>;
|
|
10
|
+
declare const tool: Tool<typeof inputSchema>;
|
|
11
|
+
export default tool;
|
|
12
|
+
//# sourceMappingURL=listPartners.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listPartners.d.ts","sourceRoot":"","sources":["../../../src/tools/distributor/listPartners.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAE7C,QAAA,MAAM,WAAW;;;;;;EAIN,CAAA;AAEX,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAWlC,CAAA;AAED,eAAe,IAAI,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { getDistributorClient } from '../../sdkCache.js';
|
|
3
|
+
const inputSchema = z
|
|
4
|
+
.object({
|
|
5
|
+
status: z.string().optional().describe('Filter by status (active, suspended, pending, cancelled)'),
|
|
6
|
+
})
|
|
7
|
+
.strict();
|
|
8
|
+
const tool = {
|
|
9
|
+
name: 'distributor_list_partners',
|
|
10
|
+
scope: 'distributor',
|
|
11
|
+
description: 'List all sub-partners owned by this distributor. Optionally filter by status. ' +
|
|
12
|
+
'Returns each partner\'s id, company, email, plan, billing, and status.',
|
|
13
|
+
schema: inputSchema,
|
|
14
|
+
async handler(input, ctx) {
|
|
15
|
+
const client = getDistributorClient(ctx.auth.apiKey);
|
|
16
|
+
return client.partners.list(input);
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
export default tool;
|
|
20
|
+
//# sourceMappingURL=listPartners.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listPartners.js","sourceRoot":"","sources":["../../../src/tools/distributor/listPartners.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAGxD,MAAM,WAAW,GAAG,CAAC;KAClB,MAAM,CAAC;IACN,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0DAA0D,CAAC;CACnG,CAAC;KACD,MAAM,EAAE,CAAA;AAEX,MAAM,IAAI,GAA6B;IACrC,IAAI,EAAE,2BAA2B;IACjC,KAAK,EAAE,aAAa;IACpB,WAAW,EACT,gFAAgF;QAChF,wEAAwE;IAC1E,MAAM,EAAE,WAAW;IACnB,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;QACtB,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACpD,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACpC,CAAC;CACF,CAAA;AAED,eAAe,IAAI,CAAA"}
|