apcore-mcp 0.12.0 → 0.14.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 +190 -0
- package/README.md +165 -19
- package/dist/acl-builder.d.ts +43 -0
- package/dist/acl-builder.d.ts.map +1 -0
- package/dist/acl-builder.js +115 -0
- package/dist/acl-builder.js.map +1 -0
- package/dist/adapters/annotations.d.ts.map +1 -1
- package/dist/adapters/annotations.js +37 -2
- package/dist/adapters/annotations.js.map +1 -1
- package/dist/adapters/errors.d.ts +17 -0
- package/dist/adapters/errors.d.ts.map +1 -1
- package/dist/adapters/errors.js +192 -2
- package/dist/adapters/errors.js.map +1 -1
- package/dist/adapters/id-normalizer.d.ts +40 -0
- package/dist/adapters/id-normalizer.d.ts.map +1 -0
- package/dist/adapters/id-normalizer.js +59 -0
- package/dist/adapters/id-normalizer.js.map +1 -0
- package/dist/adapters/index.d.ts +2 -2
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +2 -2
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/{mcpErrorFormatter.d.ts → mcp-error-formatter.d.ts} +5 -7
- package/dist/adapters/mcp-error-formatter.d.ts.map +1 -0
- package/dist/adapters/mcp-error-formatter.js +30 -0
- package/dist/adapters/mcp-error-formatter.js.map +1 -0
- package/dist/adapters/schema.d.ts +21 -4
- package/dist/adapters/schema.d.ts.map +1 -1
- package/dist/adapters/schema.js +147 -13
- package/dist/adapters/schema.js.map +1 -1
- package/dist/apcore-mcp.d.ts +24 -2
- package/dist/apcore-mcp.d.ts.map +1 -1
- package/dist/apcore-mcp.js +8 -0
- package/dist/apcore-mcp.js.map +1 -1
- package/dist/auth/hooks.d.ts +1 -1
- package/dist/auth/hooks.d.ts.map +1 -1
- package/dist/auth/hooks.js +10 -3
- package/dist/auth/hooks.js.map +1 -1
- package/dist/auth/jwt.d.ts +1 -2
- package/dist/auth/jwt.d.ts.map +1 -1
- package/dist/auth/jwt.js +18 -10
- package/dist/auth/jwt.js.map +1 -1
- package/dist/auth/types.d.ts +6 -3
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +23 -1
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +15 -6
- package/dist/config.js.map +1 -1
- package/dist/converters/openai.d.ts +10 -0
- package/dist/converters/openai.d.ts.map +1 -1
- package/dist/converters/openai.js +100 -5
- package/dist/converters/openai.js.map +1 -1
- package/dist/explorer/index.d.ts +2 -0
- package/dist/explorer/index.d.ts.map +1 -0
- package/dist/explorer/index.js +2 -0
- package/dist/explorer/index.js.map +1 -0
- package/dist/index.d.ts +68 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +346 -60
- package/dist/index.js.map +1 -1
- package/dist/inspector/index.d.ts +2 -0
- package/dist/inspector/index.d.ts.map +1 -0
- package/dist/inspector/index.js +2 -0
- package/dist/inspector/index.js.map +1 -0
- package/dist/middleware-builder.d.ts +41 -0
- package/dist/middleware-builder.d.ts.map +1 -0
- package/dist/middleware-builder.js +129 -0
- package/dist/middleware-builder.js.map +1 -0
- package/dist/server/async-task-bridge.d.ts +190 -0
- package/dist/server/async-task-bridge.d.ts.map +1 -0
- package/dist/server/async-task-bridge.js +393 -0
- package/dist/server/async-task-bridge.js.map +1 -0
- package/dist/server/context.d.ts +9 -2
- package/dist/server/context.d.ts.map +1 -1
- package/dist/server/context.js +14 -6
- package/dist/server/context.js.map +1 -1
- package/dist/server/factory.d.ts +25 -2
- package/dist/server/factory.d.ts.map +1 -1
- package/dist/server/factory.js +127 -7
- package/dist/server/factory.js.map +1 -1
- package/dist/server/listener.d.ts +3 -0
- package/dist/server/listener.d.ts.map +1 -1
- package/dist/server/listener.js +13 -2
- package/dist/server/listener.js.map +1 -1
- package/dist/server/observability.d.ts +51 -0
- package/dist/server/observability.d.ts.map +1 -0
- package/dist/server/observability.js +96 -0
- package/dist/server/observability.js.map +1 -0
- package/dist/server/router.d.ts +114 -0
- package/dist/server/router.d.ts.map +1 -1
- package/dist/server/router.js +360 -18
- package/dist/server/router.js.map +1 -1
- package/dist/server/trace-context.d.ts +40 -0
- package/dist/server/trace-context.d.ts.map +1 -0
- package/dist/server/trace-context.js +67 -0
- package/dist/server/trace-context.js.map +1 -0
- package/dist/server/transport.d.ts +39 -0
- package/dist/server/transport.d.ts.map +1 -1
- package/dist/server/transport.js +134 -4
- package/dist/server/transport.js.map +1 -1
- package/dist/types.d.ts +18 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -1
- package/package.json +12 -6
- package/dist/adapters/idNormalizer.d.ts +0 -22
- package/dist/adapters/idNormalizer.d.ts.map +0 -1
- package/dist/adapters/idNormalizer.js +0 -30
- package/dist/adapters/idNormalizer.js.map +0 -1
- package/dist/adapters/mcpErrorFormatter.d.ts.map +0 -1
- package/dist/adapters/mcpErrorFormatter.js +0 -24
- package/dist/adapters/mcpErrorFormatter.js.map +0 -1
package/dist/adapters/schema.js
CHANGED
|
@@ -4,32 +4,156 @@
|
|
|
4
4
|
* Handles deep copying, inlining $ref references, and ensuring schemas
|
|
5
5
|
* have the required `type: "object"` for MCP tool input/output schemas.
|
|
6
6
|
*/
|
|
7
|
+
/**
|
|
8
|
+
* [SC-1] Maximum recursion depth for $ref inlining and schema descent.
|
|
9
|
+
* Matches Python's _MAX_REF_DEPTH and Rust's MAX_REF_DEPTH (32 levels).
|
|
10
|
+
* Prevents stack overflow on pathological-but-legal acyclic schemas
|
|
11
|
+
* (e.g. a chain of 100,000 distinct $defs each pointing to the next).
|
|
12
|
+
*/
|
|
13
|
+
const MAX_REF_DEPTH = 32;
|
|
7
14
|
export class SchemaConverter {
|
|
8
15
|
/**
|
|
9
16
|
* Convert a module descriptor's inputSchema to an MCP-compatible schema.
|
|
10
17
|
*/
|
|
11
|
-
convertInputSchema(descriptor) {
|
|
12
|
-
return this._convertSchema(descriptor.inputSchema);
|
|
18
|
+
convertInputSchema(descriptor, options) {
|
|
19
|
+
return this._convertSchema(descriptor.inputSchema, options);
|
|
13
20
|
}
|
|
14
21
|
/**
|
|
15
22
|
* Convert a module descriptor's outputSchema to an MCP-compatible schema.
|
|
16
23
|
*/
|
|
17
|
-
convertOutputSchema(descriptor) {
|
|
18
|
-
return this._convertSchema(descriptor.outputSchema);
|
|
24
|
+
convertOutputSchema(descriptor, options) {
|
|
25
|
+
return this._convertSchema(descriptor.outputSchema, options);
|
|
19
26
|
}
|
|
20
27
|
/**
|
|
21
28
|
* Apply all schema transformations: deep copy, inline $ref, ensure object type.
|
|
22
29
|
*/
|
|
23
|
-
_convertSchema(schema) {
|
|
30
|
+
_convertSchema(schema, options) {
|
|
24
31
|
// Deep copy to avoid mutating the original
|
|
25
32
|
const copied = structuredClone(schema);
|
|
26
33
|
// Extract and remove $defs before inlining
|
|
27
34
|
const defs = copied["$defs"] ?? {};
|
|
28
35
|
delete copied["$defs"];
|
|
29
36
|
// Inline all $ref references (with circular ref detection)
|
|
30
|
-
const inlined = this._inlineRefs(copied, defs, new Set());
|
|
37
|
+
const inlined = this._inlineRefs(copied, defs, new Set(), 0);
|
|
31
38
|
// Ensure the top-level schema has type: "object"
|
|
32
|
-
|
|
39
|
+
const normalized = this._ensureObjectType(inlined);
|
|
40
|
+
// [SC-11] Default strict=true to match Python and Rust SDKs. Pre-fix
|
|
41
|
+
// TS defaulted to false (undefined → falsy), silently producing
|
|
42
|
+
// permissive schemas. Callers that explicitly want non-strict must
|
|
43
|
+
// now pass `{ strict: false }`.
|
|
44
|
+
const strict = options?.strict ?? true;
|
|
45
|
+
if (strict) {
|
|
46
|
+
return this._applyStrict(normalized);
|
|
47
|
+
}
|
|
48
|
+
return normalized;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Recursively set `additionalProperties: false` on every object-shaped
|
|
52
|
+
* schema node that does not already specify `additionalProperties`.
|
|
53
|
+
*
|
|
54
|
+
* A node is treated as an object schema when ANY of:
|
|
55
|
+
* - `type === "object"`
|
|
56
|
+
* - `Array.isArray(type) && type.includes("object")`
|
|
57
|
+
* - `"properties" in node` AND the declared scalar `type` (if any) isn't
|
|
58
|
+
* a non-object scalar (string/number/integer/boolean/null)
|
|
59
|
+
*
|
|
60
|
+
* Recurses only into known subschema slots. Opaque value slots like
|
|
61
|
+
* `enum`, `const`, `examples`, `default` are left untouched.
|
|
62
|
+
*/
|
|
63
|
+
_applyStrict(node) {
|
|
64
|
+
if (Array.isArray(node)) {
|
|
65
|
+
return node.map((item) => this._applyStrict(item));
|
|
66
|
+
}
|
|
67
|
+
if (node === null || typeof node !== "object") {
|
|
68
|
+
return node;
|
|
69
|
+
}
|
|
70
|
+
const obj = node;
|
|
71
|
+
const result = { ...obj };
|
|
72
|
+
// Recurse into subschema slots only
|
|
73
|
+
if ("properties" in result && result.properties !== null && typeof result.properties === "object" && !Array.isArray(result.properties)) {
|
|
74
|
+
const props = result.properties;
|
|
75
|
+
const newProps = {};
|
|
76
|
+
for (const [k, v] of Object.entries(props)) {
|
|
77
|
+
newProps[k] = this._applyStrict(v);
|
|
78
|
+
}
|
|
79
|
+
result.properties = newProps;
|
|
80
|
+
}
|
|
81
|
+
if ("patternProperties" in result && result.patternProperties !== null && typeof result.patternProperties === "object" && !Array.isArray(result.patternProperties)) {
|
|
82
|
+
const pp = result.patternProperties;
|
|
83
|
+
const newPP = {};
|
|
84
|
+
for (const [k, v] of Object.entries(pp)) {
|
|
85
|
+
newPP[k] = this._applyStrict(v);
|
|
86
|
+
}
|
|
87
|
+
result.patternProperties = newPP;
|
|
88
|
+
}
|
|
89
|
+
if ("$defs" in result && result.$defs !== null && typeof result.$defs === "object" && !Array.isArray(result.$defs)) {
|
|
90
|
+
const defs = result.$defs;
|
|
91
|
+
const newDefs = {};
|
|
92
|
+
for (const [k, v] of Object.entries(defs)) {
|
|
93
|
+
newDefs[k] = this._applyStrict(v);
|
|
94
|
+
}
|
|
95
|
+
result.$defs = newDefs;
|
|
96
|
+
}
|
|
97
|
+
if ("definitions" in result && result.definitions !== null && typeof result.definitions === "object" && !Array.isArray(result.definitions)) {
|
|
98
|
+
const defs = result.definitions;
|
|
99
|
+
const newDefs = {};
|
|
100
|
+
for (const [k, v] of Object.entries(defs)) {
|
|
101
|
+
newDefs[k] = this._applyStrict(v);
|
|
102
|
+
}
|
|
103
|
+
result.definitions = newDefs;
|
|
104
|
+
}
|
|
105
|
+
if ("items" in result) {
|
|
106
|
+
result.items = this._applyStrict(result.items);
|
|
107
|
+
}
|
|
108
|
+
if ("additionalProperties" in result && typeof result.additionalProperties === "object" && result.additionalProperties !== null) {
|
|
109
|
+
result.additionalProperties = this._applyStrict(result.additionalProperties);
|
|
110
|
+
}
|
|
111
|
+
if ("not" in result) {
|
|
112
|
+
result.not = this._applyStrict(result.not);
|
|
113
|
+
}
|
|
114
|
+
for (const key of ["oneOf", "anyOf", "allOf"]) {
|
|
115
|
+
if (Array.isArray(result[key])) {
|
|
116
|
+
result[key] = result[key].map((v) => this._applyStrict(v));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
for (const key of ["if", "then", "else"]) {
|
|
120
|
+
if (key in result) {
|
|
121
|
+
result[key] = this._applyStrict(result[key]);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// [D11-002] Mirror Python's _SCHEMA_CHILD_SCHEMA_KEYS: also recurse into
|
|
125
|
+
// `propertyNames` (single schema) and `contains` (single schema).
|
|
126
|
+
for (const key of ["propertyNames", "contains"]) {
|
|
127
|
+
if (key in result && result[key] !== null && typeof result[key] === "object") {
|
|
128
|
+
result[key] = this._applyStrict(result[key]);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// [D11-002] Mirror Python's _SCHEMA_CHILD_LIST_KEYS: also recurse into
|
|
132
|
+
// `prefixItems` (array of schemas).
|
|
133
|
+
if ("prefixItems" in result && Array.isArray(result["prefixItems"])) {
|
|
134
|
+
result["prefixItems"] = result["prefixItems"].map((v) => this._applyStrict(v));
|
|
135
|
+
}
|
|
136
|
+
// Decide whether this node is object-shaped
|
|
137
|
+
const type = result["type"];
|
|
138
|
+
const SCALAR_TYPES = new Set(["string", "number", "integer", "boolean", "null"]);
|
|
139
|
+
let isObjectShaped = false;
|
|
140
|
+
if (type === "object") {
|
|
141
|
+
isObjectShaped = true;
|
|
142
|
+
}
|
|
143
|
+
else if (Array.isArray(type) && type.includes("object")) {
|
|
144
|
+
isObjectShaped = true;
|
|
145
|
+
}
|
|
146
|
+
else if (type === undefined && "properties" in result) {
|
|
147
|
+
isObjectShaped = true;
|
|
148
|
+
}
|
|
149
|
+
else if (typeof type === "string" && !SCALAR_TYPES.has(type) && "properties" in result) {
|
|
150
|
+
// Unknown string type with properties — treat as object
|
|
151
|
+
isObjectShaped = true;
|
|
152
|
+
}
|
|
153
|
+
if (isObjectShaped && !("additionalProperties" in result)) {
|
|
154
|
+
result["additionalProperties"] = false;
|
|
155
|
+
}
|
|
156
|
+
return result;
|
|
33
157
|
}
|
|
34
158
|
/**
|
|
35
159
|
* Recursively inline `$ref` references using the provided $defs map.
|
|
@@ -37,9 +161,13 @@ export class SchemaConverter {
|
|
|
37
161
|
* Handles dicts (objects), arrays, and primitive values.
|
|
38
162
|
* Skips the `$defs` key itself during traversal.
|
|
39
163
|
*/
|
|
40
|
-
_inlineRefs(node, defs, activeRefs) {
|
|
164
|
+
_inlineRefs(node, defs, activeRefs, depth = 0) {
|
|
165
|
+
// [SC-1] Cap recursion at MAX_REF_DEPTH to match Python+Rust.
|
|
166
|
+
if (depth > MAX_REF_DEPTH) {
|
|
167
|
+
throw new Error(`Maximum schema recursion depth (${MAX_REF_DEPTH}) exceeded`);
|
|
168
|
+
}
|
|
41
169
|
if (Array.isArray(node)) {
|
|
42
|
-
return node.map((item) => this._inlineRefs(item, defs, activeRefs));
|
|
170
|
+
return node.map((item) => this._inlineRefs(item, defs, activeRefs, depth + 1));
|
|
43
171
|
}
|
|
44
172
|
if (node !== null && typeof node === "object") {
|
|
45
173
|
const obj = node;
|
|
@@ -53,9 +181,15 @@ export class SchemaConverter {
|
|
|
53
181
|
const resolved = this._resolveRef(refPath, defs);
|
|
54
182
|
// Track this ref as active during recursion
|
|
55
183
|
activeRefs.add(refPath);
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
184
|
+
try {
|
|
185
|
+
const result = this._inlineRefs(resolved, defs, activeRefs, depth + 1);
|
|
186
|
+
return result;
|
|
187
|
+
}
|
|
188
|
+
finally {
|
|
189
|
+
// [SC-2] Use try/finally so an exception mid-recursion doesn't
|
|
190
|
+
// leave activeRefs poisoned for subsequent sibling branches.
|
|
191
|
+
activeRefs.delete(refPath);
|
|
192
|
+
}
|
|
59
193
|
}
|
|
60
194
|
// Otherwise, recurse into each key (skip $defs)
|
|
61
195
|
const result = {};
|
|
@@ -63,7 +197,7 @@ export class SchemaConverter {
|
|
|
63
197
|
if (key === "$defs") {
|
|
64
198
|
continue;
|
|
65
199
|
}
|
|
66
|
-
result[key] = this._inlineRefs(value, defs, activeRefs);
|
|
200
|
+
result[key] = this._inlineRefs(value, defs, activeRefs, depth + 1);
|
|
67
201
|
}
|
|
68
202
|
return result;
|
|
69
203
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/adapters/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/adapters/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/apcore-mcp.d.ts
CHANGED
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
import type { RegistryOrExecutor, Registry, Executor, OpenAIToolDef } from "./types.js";
|
|
29
29
|
import type { Authenticator } from "./auth/types.js";
|
|
30
30
|
import type { MetricsExporter } from "./server/transport.js";
|
|
31
|
+
import type { ObservabilityFlag } from "./server/observability.js";
|
|
31
32
|
import type { AsyncServeApp, ToOpenaiToolsOptions } from "./index.js";
|
|
32
33
|
/** Options for the APCoreMCP constructor. */
|
|
33
34
|
export interface APCoreMCPOptions {
|
|
@@ -43,8 +44,16 @@ export interface APCoreMCPOptions {
|
|
|
43
44
|
logLevel?: "DEBUG" | "INFO" | "WARNING" | "ERROR" | "CRITICAL";
|
|
44
45
|
/** Enable input validation against schemas. Default: false */
|
|
45
46
|
validateInputs?: boolean;
|
|
46
|
-
/** Optional MetricsCollector for Prometheus /metrics endpoint. */
|
|
47
|
-
metricsCollector?: MetricsExporter;
|
|
47
|
+
/** Optional MetricsCollector for Prometheus /metrics endpoint. Pass `true` to auto-instantiate. */
|
|
48
|
+
metricsCollector?: MetricsExporter | boolean;
|
|
49
|
+
/** Enable the full observability stack (metrics + usage middleware). */
|
|
50
|
+
observability?: ObservabilityFlag;
|
|
51
|
+
/** Async Task Bridge configuration (F-043). */
|
|
52
|
+
async?: boolean | {
|
|
53
|
+
enabled?: boolean;
|
|
54
|
+
maxConcurrent?: number;
|
|
55
|
+
maxTasks?: number;
|
|
56
|
+
};
|
|
48
57
|
/** Optional authenticator for request authentication (HTTP transports only). */
|
|
49
58
|
authenticator?: Authenticator;
|
|
50
59
|
/** If true (default), unauthenticated requests are rejected with 401. */
|
|
@@ -58,6 +67,19 @@ export interface APCoreMCPOptions {
|
|
|
58
67
|
* When undefined, results are serialised with `JSON.stringify(result)`.
|
|
59
68
|
*/
|
|
60
69
|
outputFormatter?: (result: Record<string, unknown>) => string;
|
|
70
|
+
/**
|
|
71
|
+
* Optional list of apcore `Middleware` instances to install on the Executor
|
|
72
|
+
* via `executor.use()`. Appended to any middleware declared under Config
|
|
73
|
+
* Bus key `mcp.middleware`. Chain execution order is controlled by
|
|
74
|
+
* `Middleware.priority`, not insertion order.
|
|
75
|
+
*/
|
|
76
|
+
middleware?: unknown[];
|
|
77
|
+
/**
|
|
78
|
+
* Optional apcore `ACL` instance to install via `executor.setAcl()`.
|
|
79
|
+
* When omitted, the bridge falls back to any ACL declared under Config
|
|
80
|
+
* Bus key `mcp.acl`. Caller-supplied ACL takes precedence over Config Bus.
|
|
81
|
+
*/
|
|
82
|
+
acl?: unknown;
|
|
61
83
|
}
|
|
62
84
|
/** Options for APCoreMCP.serve() (transport + lifecycle subset). */
|
|
63
85
|
export interface APCoreMCPServeOptions {
|
package/dist/apcore-mcp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apcore-mcp.d.ts","sourceRoot":"","sources":["../src/apcore-mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAClB,QAAQ,EACR,QAAQ,EACR,aAAa,EACd,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"apcore-mcp.d.ts","sourceRoot":"","sources":["../src/apcore-mcp.ts"],"names":[],"mappings":"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"}
|
package/dist/apcore-mcp.js
CHANGED
|
@@ -117,6 +117,8 @@ export class APCoreMCP {
|
|
|
117
117
|
onStartup: overrides.onStartup,
|
|
118
118
|
onShutdown: overrides.onShutdown,
|
|
119
119
|
metricsCollector: this._options.metricsCollector,
|
|
120
|
+
observability: this._options.observability,
|
|
121
|
+
async: this._options.async,
|
|
120
122
|
explorer: overrides.explorer,
|
|
121
123
|
explorerPrefix: overrides.explorerPrefix,
|
|
122
124
|
allowExecute: overrides.allowExecute,
|
|
@@ -128,6 +130,8 @@ export class APCoreMCP {
|
|
|
128
130
|
exemptPaths: this._options.exemptPaths,
|
|
129
131
|
approvalHandler: this._options.approvalHandler,
|
|
130
132
|
outputFormatter: this._options.outputFormatter,
|
|
133
|
+
middleware: this._options.middleware,
|
|
134
|
+
acl: this._options.acl,
|
|
131
135
|
};
|
|
132
136
|
}
|
|
133
137
|
/**
|
|
@@ -187,6 +191,8 @@ export class APCoreMCP {
|
|
|
187
191
|
prefix: this._options.prefix,
|
|
188
192
|
logLevel: this._options.logLevel,
|
|
189
193
|
metricsCollector: this._options.metricsCollector,
|
|
194
|
+
observability: this._options.observability,
|
|
195
|
+
async: this._options.async,
|
|
190
196
|
explorer: options.explorer,
|
|
191
197
|
explorerPrefix: options.explorerPrefix,
|
|
192
198
|
allowExecute: options.allowExecute,
|
|
@@ -199,6 +205,8 @@ export class APCoreMCP {
|
|
|
199
205
|
approvalHandler: this._options.approvalHandler,
|
|
200
206
|
endpoint: options.endpoint,
|
|
201
207
|
outputFormatter: this._options.outputFormatter,
|
|
208
|
+
middleware: this._options.middleware,
|
|
209
|
+
acl: this._options.acl,
|
|
202
210
|
};
|
|
203
211
|
return asyncServe(backend, asyncOpts);
|
|
204
212
|
}
|
package/dist/apcore-mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apcore-mcp.js","sourceRoot":"","sources":["../src/apcore-mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;
|
|
1
|
+
{"version":3,"file":"apcore-mcp.js","sourceRoot":"","sources":["../src/apcore-mcp.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAWH,OAAO,EACL,KAAK,EACL,UAAU,EACV,aAAa,EACb,eAAe,GAChB,MAAM,YAAY,CAAC;AAoGpB,MAAM,OAAO,SAAS;IACZ,QAAQ,CAA4B;IAC3B,QAAQ,CAAmB;IACpC,SAAS,CAAuB;IAChC,SAAS,CAAuB;IACvB,cAAc,CAAqB;IAEpD;;;;;;OAMG;IACH,YACE,sBAAmD,EACnD,UAA4B,EAAE;QAE9B,mBAAmB;QACnB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC;QAC1C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBAC/B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC7B,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3F,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC;QAErC,IAAI,OAAO,sBAAsB,KAAK,QAAQ,EAAE,CAAC;YAC/C,yDAAyD;YACzD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,cAAc,GAAG,sBAAsB,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,GAAG,sBAAsB,CAAC;YACvC,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;QAClC,CAAC;IACH,CAAC;IAED,sCAAsC;IACtC,IAAI,QAAQ;QACV,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;gBAC3B,IAAI,CAAC,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CACb,iEAAiE;oBACjE,iDAAiD,CAClD,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,wDAAwD;IACxD,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,oEAAoE;IACpE,IAAI,KAAK;QACP,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC1B,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC;YACtB,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,SAAS;YACrC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,SAAS;SAC1C,CAAC,CAAC;QACH,2FAA2F;QAC3F,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACnC,IAAI,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ;YAAE,OAAO,MAAkB,CAAC;QAC7D,OAAQ,MAAiD,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACnF,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,YAAmC,EAAE;QAC9D,OAAO;YACL,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;YACxB,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO;YAC9B,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc;YAC5C,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;YACxB,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;YAC5B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ;YAChC,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,gBAAgB;YAChD,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa;YAC1C,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK;YAC1B,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,cAAc,EAAE,SAAS,CAAC,cAAc;YACxC,YAAY,EAAE,SAAS,CAAC,YAAY;YACpC,aAAa,EAAE,SAAS,CAAC,aAAa;YACtC,mBAAmB,EAAE,SAAS,CAAC,mBAAmB;YAClD,kBAAkB,EAAE,SAAS,CAAC,kBAAkB;YAChD,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa;YAC1C,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW;YACtC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW;YACtC,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe;YAC9C,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe;YAC9C,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU;YACpC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG;SACvB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe;QAC3B,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAC;QAEjD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC;YACH,8DAA8D;YAC9D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAQ,CAAC;YAChD,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC;YAClE,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAC7D,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;YAC3E,IAAI,OAAO,QAAQ,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;gBAC5C,MAAM,QAAQ,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC;YACD,IAAI,CAAC,SAAS,GAAG,QAAoB,CAAC;YACtC,IAAI,CAAC,QAAQ,GAAG,QAA8B,CAAC;YAC/C,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,kDAAkD,IAAI,CAAC,cAAc,KAAK;gBAC1E,kDAAkD,GAAG,EAAE,CACxD,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,UAAiC,EAAE;QAC7C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC7C,MAAM,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;IACzD,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,UAAU,CAAC,UAAsC,EAAE;QACvD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAE7C,MAAM,SAAS,GAAsB;YACnC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;YACxB,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO;YAC9B,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc;YAC5C,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;YACxB,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;YAC5B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ;YAChC,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,gBAAgB;YAChD,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa;YAC1C,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK;YAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;YAChD,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;YAC9C,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa;YAC1C,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW;YACtC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW;YACtC,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe;YAC9C,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe;YAC9C,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU;YACpC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG;SACvB,CAAC;QAEF,OAAO,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACxC,CAAC;IAED;;;;;OAKG;IACH,aAAa,CAAC,UAAgC,EAAE;QAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC1B,OAAO,aAAa,CAAC,GAAG,EAAE;YACxB,GAAG,OAAO;YACV,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,SAAS;YACrC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,SAAS;SAC1C,CAAC,CAAC;IACL,CAAC;CACF"}
|
package/dist/auth/hooks.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ interface IncomingRequest {
|
|
|
17
17
|
* Build an auth hook for mcp-embedded-ui that bridges to an Authenticator.
|
|
18
18
|
*
|
|
19
19
|
* The hook:
|
|
20
|
-
* 1. Extracts headers from the incoming request
|
|
20
|
+
* 1. Extracts headers from the incoming request and converts to a flat map
|
|
21
21
|
* 2. Delegates to `authenticator.authenticate()` for token validation
|
|
22
22
|
* 3. Throws on auth failure (mcp-embedded-ui catches this and returns 401)
|
|
23
23
|
* 4. Wraps `next()` in `identityStorage.run()` so `getCurrentIdentity()` works
|
package/dist/auth/hooks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/auth/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/auth/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD;;;GAGG;AACH,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;CACxD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,aAAa,GAC3B,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,CAe5E"}
|
package/dist/auth/hooks.js
CHANGED
|
@@ -10,7 +10,7 @@ import { identityStorage } from "./storage.js";
|
|
|
10
10
|
* Build an auth hook for mcp-embedded-ui that bridges to an Authenticator.
|
|
11
11
|
*
|
|
12
12
|
* The hook:
|
|
13
|
-
* 1. Extracts headers from the incoming request
|
|
13
|
+
* 1. Extracts headers from the incoming request and converts to a flat map
|
|
14
14
|
* 2. Delegates to `authenticator.authenticate()` for token validation
|
|
15
15
|
* 3. Throws on auth failure (mcp-embedded-ui catches this and returns 401)
|
|
16
16
|
* 4. Wraps `next()` in `identityStorage.run()` so `getCurrentIdentity()` works
|
|
@@ -20,8 +20,15 @@ import { identityStorage } from "./storage.js";
|
|
|
20
20
|
*/
|
|
21
21
|
export function buildExplorerAuthHook(authenticator) {
|
|
22
22
|
return async (req, next) => {
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
// Flatten headers to Record<string, string> for the Authenticator interface.
|
|
24
|
+
// Multi-value headers are joined with ", " per HTTP/1.1 convention.
|
|
25
|
+
const headersMap = {};
|
|
26
|
+
for (const [key, value] of Object.entries(req.headers)) {
|
|
27
|
+
if (value === undefined)
|
|
28
|
+
continue;
|
|
29
|
+
headersMap[key.toLowerCase()] = Array.isArray(value) ? value.join(", ") : value;
|
|
30
|
+
}
|
|
31
|
+
const identity = await authenticator.authenticate(headersMap);
|
|
25
32
|
if (!identity) {
|
|
26
33
|
throw new Error("Unauthorized");
|
|
27
34
|
}
|
package/dist/auth/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/auth/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/auth/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAU/C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB,CACnC,aAA4B;IAE5B,OAAO,KAAK,EAAE,GAAoB,EAAE,IAA6B,EAAE,EAAE;QACnE,6EAA6E;QAC7E,oEAAoE;QACpE,MAAM,UAAU,GAA2B,EAAE,CAAC;QAC9C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACvD,IAAI,KAAK,KAAK,SAAS;gBAAE,SAAS;YAClC,UAAU,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAClF,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAC9D,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,eAAe,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/auth/jwt.d.ts
CHANGED
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Mirrors the Python `JWTAuthenticator` from apcore-mcp-python.
|
|
5
5
|
*/
|
|
6
|
-
import type { IncomingMessage } from "node:http";
|
|
7
6
|
import jwt from "jsonwebtoken";
|
|
8
7
|
import { type Identity } from "apcore-js";
|
|
9
8
|
import type { Authenticator } from "./types.js";
|
|
@@ -58,6 +57,6 @@ export declare class JWTAuthenticator implements Authenticator {
|
|
|
58
57
|
constructor(options: JWTAuthenticatorOptions);
|
|
59
58
|
/** Whether unauthenticated requests should be rejected. */
|
|
60
59
|
get requireAuth(): boolean;
|
|
61
|
-
authenticate(
|
|
60
|
+
authenticate(headers: Record<string, string>): Promise<Identity | null>;
|
|
62
61
|
}
|
|
63
62
|
//# sourceMappingURL=jwt.d.ts.map
|
package/dist/auth/jwt.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../src/auth/jwt.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../src/auth/jwt.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,GAAG,MAAM,cAAc,CAAC;AAC/B,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,kDAAkD;AAClD,MAAM,WAAW,YAAY;IAC3B,gDAAgD;IAChD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,mDAAmD;AACnD,MAAM,WAAW,uBAAuB;IACtC,gFAAgF;IAChF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;IAC7B,+BAA+B;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,iEAAiE;IACjE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,yGAAyG;IACzG,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,qBAAa,gBAAiB,YAAW,aAAa;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkB;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA+D;IAC7F,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAW;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;gBAE3B,OAAO,EAAE,uBAAuB;IAoB5C,2DAA2D;IAC3D,IAAI,WAAW,IAAI,OAAO,CAEzB;IAEK,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;CA4D9E"}
|
package/dist/auth/jwt.js
CHANGED
|
@@ -23,10 +23,11 @@ export class JWTAuthenticator {
|
|
|
23
23
|
_requireAuth;
|
|
24
24
|
constructor(options) {
|
|
25
25
|
const keyValue = options.key ?? options.secret;
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
// [D10-008] Do NOT throw at construction time for missing key.
|
|
27
|
+
// Python + Rust don't validate the key at construction; they fail
|
|
28
|
+
// gracefully (return null) when authenticate() is called without a valid key.
|
|
29
|
+
// requireAuth belongs on AuthMiddleware, not on the authenticator itself.
|
|
30
|
+
this._secret = keyValue ?? "";
|
|
30
31
|
this._algorithms = options.algorithms ?? ["HS256"];
|
|
31
32
|
this._audience = options.audience;
|
|
32
33
|
this._issuer = options.issuer;
|
|
@@ -43,20 +44,27 @@ export class JWTAuthenticator {
|
|
|
43
44
|
get requireAuth() {
|
|
44
45
|
return this._requireAuth;
|
|
45
46
|
}
|
|
46
|
-
async authenticate(
|
|
47
|
-
const authHeader =
|
|
47
|
+
async authenticate(headers) {
|
|
48
|
+
const authHeader = headers["authorization"] ?? headers["Authorization"];
|
|
48
49
|
if (!authHeader)
|
|
49
50
|
return null;
|
|
50
|
-
//
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
// Case-insensitive "Bearer " prefix; tolerate extra whitespace between the
|
|
52
|
+
// prefix and the token (real-world reverse proxies and auth headers can
|
|
53
|
+
// emit double spaces). Matches apcore-mcp-python (auth_header[7:].strip())
|
|
54
|
+
// and apcore-mcp-rust (auth_header[7..].trim()) behaviour. See D10-004.
|
|
55
|
+
if (!authHeader.toLowerCase().startsWith("bearer "))
|
|
53
56
|
return null;
|
|
54
|
-
const token =
|
|
57
|
+
const token = authHeader.slice(7).trim();
|
|
55
58
|
if (!token)
|
|
56
59
|
return null;
|
|
57
60
|
try {
|
|
58
61
|
const verifyOptions = {
|
|
59
62
|
algorithms: this._algorithms,
|
|
63
|
+
// [JWT-3] Spec mandates ~30s clock-skew leeway. jsonwebtoken's
|
|
64
|
+
// default clockTolerance is 0; without this, NTP drift between
|
|
65
|
+
// issuer and server produces spurious 401s on tokens valid
|
|
66
|
+
// within ±30s of expiry/nbf.
|
|
67
|
+
clockTolerance: 30,
|
|
60
68
|
};
|
|
61
69
|
if (this._audience)
|
|
62
70
|
verifyOptions.audience = this._audience;
|
package/dist/auth/jwt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../src/auth/jwt.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../src/auth/jwt.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,GAAG,MAAM,cAAc,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAiB,MAAM,WAAW,CAAC;AAqC1D;;;;;;;GAOG;AACH,MAAM,OAAO,gBAAgB;IACV,OAAO,CAAS;IAChB,WAAW,CAAkB;IAC7B,SAAS,CAAU;IACnB,OAAO,CAAU;IACjB,aAAa,CAA+D;IAC5E,cAAc,CAAW;IACzB,YAAY,CAAU;IAEvC,YAAY,OAAgC;QAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;QAC/C,+DAA+D;QAC/D,kEAAkE;QAClE,8EAA8E;QAC9E,0EAA0E;QAC1E,IAAI,CAAC,OAAO,GAAG,QAAQ,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,aAAa,GAAG;YACnB,EAAE,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE,IAAI,KAAK;YACrC,IAAI,EAAE,OAAO,CAAC,YAAY,EAAE,IAAI,IAAI,MAAM;YAC1C,KAAK,EAAE,OAAO,CAAC,YAAY,EAAE,KAAK,IAAI,OAAO;YAC7C,KAAK,EAAE,OAAO,CAAC,YAAY,EAAE,KAAK;SACnC,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,aAAa,IAAI,CAAC,KAAK,CAAC,CAAC;QACvD,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC;IAClD,CAAC;IAED,2DAA2D;IAC3D,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAA+B;QAChD,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;QACxE,IAAI,CAAC,UAAU;YAAE,OAAO,IAAI,CAAC;QAE7B,2EAA2E;QAC3E,wEAAwE;QACxE,2EAA2E;QAC3E,wEAAwE;QACxE,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC;QACjE,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,aAAa,GAAsB;gBACvC,UAAU,EAAE,IAAI,CAAC,WAAW;gBAC5B,+DAA+D;gBAC/D,+DAA+D;gBAC/D,2DAA2D;gBAC3D,6BAA6B;gBAC7B,cAAc,EAAE,EAAE;aACnB,CAAC;YACF,IAAI,IAAI,CAAC,SAAS;gBAAE,aAAa,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;YAC5D,IAAI,IAAI,CAAC,OAAO;gBAAE,aAAa,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;YAEtD,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YAE/D,oDAAoD;YACpD,IAAI,OAAO,OAAO,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAE7C,MAAM,MAAM,GAAG,OAAkC,CAAC;YAElD,oCAAoC;YACpC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACxC,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC;oBAAE,OAAO,IAAI,CAAC;YACtC,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;YAC5C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YACvD,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YACzB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC;YAE/D,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAClD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAElE,6BAA6B;YAC7B,MAAM,KAAK,GAA4B,EAAE,CAAC;YAC1C,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;gBAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;oBAC3C,IAAI,GAAG,IAAI,MAAM,EAAE,CAAC;wBAClB,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;oBAC3B,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,cAAc,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,yDAAyD;YACzD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
|
package/dist/auth/types.d.ts
CHANGED
|
@@ -4,17 +4,20 @@
|
|
|
4
4
|
* Re-exports the Identity type from apcore-js and defines the
|
|
5
5
|
* Authenticator interface that transport-level auth implementations must satisfy.
|
|
6
6
|
*/
|
|
7
|
-
import type { IncomingMessage } from "node:http";
|
|
8
7
|
import type { Identity } from "apcore-js";
|
|
9
8
|
export type { Identity };
|
|
10
9
|
/**
|
|
11
10
|
* Authenticator interface — implemented by auth strategies (e.g. JWT).
|
|
12
11
|
*
|
|
13
|
-
* `authenticate()` inspects
|
|
12
|
+
* `authenticate()` inspects a flat headers map and returns an Identity
|
|
14
13
|
* for authenticated requests, or `null` for unauthenticated/invalid requests.
|
|
14
|
+
*
|
|
15
|
+
* The transport layer extracts headers from IncomingMessage before calling
|
|
16
|
+
* this method, keeping auth logic decoupled from the HTTP stack (matching
|
|
17
|
+
* Python `authenticate(headers: dict)` and Rust `authenticate(&HashMap)`).
|
|
15
18
|
*/
|
|
16
19
|
export interface Authenticator {
|
|
17
|
-
authenticate(
|
|
20
|
+
authenticate(headers: Record<string, string>): Promise<Identity | null>;
|
|
18
21
|
/** Whether unauthenticated requests should be rejected. Default true. */
|
|
19
22
|
readonly requireAuth?: boolean;
|
|
20
23
|
}
|
package/dist/auth/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAG1C,YAAY,EAAE,QAAQ,EAAE,CAAC;AAEzB;;;;;;;;;GASG;AACH,MAAM,WAAW,aAAa;IAC5B,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IACxE,yEAAyE;IACzE,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;CAChC"}
|
package/dist/cli.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG;AAiDH,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAyN1C"}
|
package/dist/cli.js
CHANGED
|
@@ -37,8 +37,12 @@ Options:
|
|
|
37
37
|
--jwt-issuer <string> Expected JWT issuer claim
|
|
38
38
|
--jwt-require-auth Require auth (default: true)
|
|
39
39
|
--jwt-permissive Permissive mode: allow unauthenticated requests (overrides --jwt-require-auth)
|
|
40
|
+
--strategy <name> Execution strategy: standard, internal, testing, performance, minimal
|
|
40
41
|
--approval <mode> Approval mode: elicit, auto-approve, always-deny, off (default: off)
|
|
41
|
-
--exempt-paths <paths> Comma-separated paths exempt from auth (default: /health,/metrics)
|
|
42
|
+
--exempt-paths <paths> Comma-separated paths exempt from auth (default: /health,/metrics,/usage)
|
|
43
|
+
--observability Enable metrics + usage middleware and expose /metrics and /usage endpoints
|
|
44
|
+
--async Enable the Async Task Bridge (default: on; use --no-async to disable)
|
|
45
|
+
--no-async Disable the Async Task Bridge
|
|
42
46
|
--help Show this help message
|
|
43
47
|
`);
|
|
44
48
|
}
|
|
@@ -69,7 +73,11 @@ export async function main() {
|
|
|
69
73
|
"jwt-require-auth": { type: "boolean", default: true },
|
|
70
74
|
"jwt-permissive": { type: "boolean", default: false },
|
|
71
75
|
approval: { type: "string", default: "off" },
|
|
76
|
+
strategy: { type: "string" },
|
|
72
77
|
"exempt-paths": { type: "string" },
|
|
78
|
+
observability: { type: "boolean", default: false },
|
|
79
|
+
async: { type: "boolean", default: true },
|
|
80
|
+
"no-async": { type: "boolean", default: false },
|
|
73
81
|
help: { type: "boolean", default: false },
|
|
74
82
|
},
|
|
75
83
|
strict: true,
|
|
@@ -143,6 +151,14 @@ export async function main() {
|
|
|
143
151
|
if (!validApprovalModes.includes(approvalMode)) {
|
|
144
152
|
fail(`--approval must be one of: ${validApprovalModes.join(", ")}. Got '${approvalMode}'.`);
|
|
145
153
|
}
|
|
154
|
+
// Validate strategy
|
|
155
|
+
const strategy = values.strategy;
|
|
156
|
+
if (strategy) {
|
|
157
|
+
const validStrategies = ["standard", "internal", "testing", "performance", "minimal"];
|
|
158
|
+
if (!validStrategies.includes(strategy)) {
|
|
159
|
+
fail(`--strategy must be one of: ${validStrategies.join(", ")}. Got '${strategy}'.`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
146
162
|
let approvalHandler;
|
|
147
163
|
if (approvalMode === "elicit") {
|
|
148
164
|
approvalHandler = new ElicitationApprovalHandler();
|
|
@@ -207,6 +223,9 @@ export async function main() {
|
|
|
207
223
|
const exemptPaths = exemptPathsRaw
|
|
208
224
|
? exemptPathsRaw.split(",").map((p) => p.trim())
|
|
209
225
|
: undefined;
|
|
226
|
+
const observabilityEnabled = values.observability;
|
|
227
|
+
const asyncDisabled = values["no-async"];
|
|
228
|
+
const asyncEnabled = asyncDisabled ? false : values.async;
|
|
210
229
|
// Launch the MCP server
|
|
211
230
|
try {
|
|
212
231
|
await serve(registry, {
|
|
@@ -222,6 +241,9 @@ export async function main() {
|
|
|
222
241
|
authenticator,
|
|
223
242
|
exemptPaths,
|
|
224
243
|
approvalHandler,
|
|
244
|
+
strategy,
|
|
245
|
+
observability: observabilityEnabled,
|
|
246
|
+
async: asyncEnabled,
|
|
225
247
|
});
|
|
226
248
|
}
|
|
227
249
|
catch (error) {
|