@n24q02m/mcp-core 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.
- package/build/crypto/aes.d.ts +8 -0
- package/build/crypto/aes.d.ts.map +1 -0
- package/build/crypto/aes.js +25 -0
- package/build/crypto/aes.js.map +1 -0
- package/build/crypto/ecdh.d.ts +5 -0
- package/build/crypto/ecdh.d.ts.map +1 -0
- package/build/crypto/ecdh.js +16 -0
- package/build/crypto/ecdh.js.map +1 -0
- package/build/crypto/index.d.ts +4 -0
- package/build/crypto/index.d.ts.map +1 -0
- package/build/crypto/index.js +4 -0
- package/build/crypto/index.js.map +1 -0
- package/build/crypto/kdf.d.ts +2 -0
- package/build/crypto/kdf.d.ts.map +1 -0
- package/build/crypto/kdf.js +7 -0
- package/build/crypto/kdf.js.map +1 -0
- package/build/index.d.ts +12 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +12 -0
- package/build/index.js.map +1 -0
- package/build/oauth/index.d.ts +4 -0
- package/build/oauth/index.d.ts.map +1 -0
- package/build/oauth/index.js +4 -0
- package/build/oauth/index.js.map +1 -0
- package/build/oauth/jwt-issuer.d.ts +25 -0
- package/build/oauth/jwt-issuer.d.ts.map +1 -0
- package/build/oauth/jwt-issuer.js +79 -0
- package/build/oauth/jwt-issuer.js.map +1 -0
- package/build/oauth/provider.d.ts +67 -0
- package/build/oauth/provider.d.ts.map +1 -0
- package/build/oauth/provider.js +129 -0
- package/build/oauth/provider.js.map +1 -0
- package/build/oauth/user-store.d.ts +25 -0
- package/build/oauth/user-store.d.ts.map +1 -0
- package/build/oauth/user-store.js +78 -0
- package/build/oauth/user-store.js.map +1 -0
- package/build/relay/browser.d.ts +15 -0
- package/build/relay/browser.d.ts.map +1 -0
- package/build/relay/browser.js +76 -0
- package/build/relay/browser.js.map +1 -0
- package/build/relay/client.d.ts +17 -0
- package/build/relay/client.d.ts.map +1 -0
- package/build/relay/client.js +87 -0
- package/build/relay/client.js.map +1 -0
- package/build/relay/wordlist.d.ts +2 -0
- package/build/relay/wordlist.d.ts.map +1 -0
- package/build/relay/wordlist.js +7782 -0
- package/build/relay/wordlist.js.map +1 -0
- package/build/schema/types.d.ts +42 -0
- package/build/schema/types.d.ts.map +1 -0
- package/build/schema/types.js +2 -0
- package/build/schema/types.js.map +1 -0
- package/build/storage/config-file.d.ts +8 -0
- package/build/storage/config-file.d.ts.map +1 -0
- package/build/storage/config-file.js +136 -0
- package/build/storage/config-file.js.map +1 -0
- package/build/storage/encryption.d.ts +7 -0
- package/build/storage/encryption.d.ts.map +1 -0
- package/build/storage/encryption.js +26 -0
- package/build/storage/encryption.js.map +1 -0
- package/build/storage/index.d.ts +7 -0
- package/build/storage/index.d.ts.map +1 -0
- package/build/storage/index.js +7 -0
- package/build/storage/index.js.map +1 -0
- package/build/storage/machine-id.d.ts +3 -0
- package/build/storage/machine-id.d.ts.map +1 -0
- package/build/storage/machine-id.js +47 -0
- package/build/storage/machine-id.js.map +1 -0
- package/build/storage/mode.d.ts +23 -0
- package/build/storage/mode.d.ts.map +1 -0
- package/build/storage/mode.js +43 -0
- package/build/storage/mode.js.map +1 -0
- package/build/storage/resolver.d.ts +7 -0
- package/build/storage/resolver.d.ts.map +1 -0
- package/build/storage/resolver.js +37 -0
- package/build/storage/resolver.js.map +1 -0
- package/build/storage/session-lock.d.ts +19 -0
- package/build/storage/session-lock.d.ts.map +1 -0
- package/build/storage/session-lock.js +94 -0
- package/build/storage/session-lock.js.map +1 -0
- package/build/transport/index.d.ts +3 -0
- package/build/transport/index.d.ts.map +1 -0
- package/build/transport/index.js +3 -0
- package/build/transport/index.js.map +1 -0
- package/build/transport/oauth-middleware.d.ts +32 -0
- package/build/transport/oauth-middleware.d.ts.map +1 -0
- package/build/transport/oauth-middleware.js +62 -0
- package/build/transport/oauth-middleware.js.map +1 -0
- package/build/transport/streamable-http.d.ts +54 -0
- package/build/transport/streamable-http.d.ts.map +1 -0
- package/build/transport/streamable-http.js +57 -0
- package/build/transport/streamable-http.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/storage/resolver.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI,CAAA;AAE7D,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAA;IACrC,MAAM,EAAE,YAAY,CAAA;CACrB;AAED,wBAAsB,aAAa,CACjC,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EAAE,EACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,OAAO,CAAC,cAAc,CAAC,CAoCzB"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { readConfig } from './config-file.js';
|
|
2
|
+
export async function resolveConfig(serverName, requiredFields, defaults) {
|
|
3
|
+
// 1. Check env vars -- if ALL required fields present as env vars, use them
|
|
4
|
+
const envConfig = {};
|
|
5
|
+
let allEnvPresent = requiredFields.length > 0;
|
|
6
|
+
for (const field of requiredFields) {
|
|
7
|
+
const envKey = `MCP_${serverName.toUpperCase().replace(/-/g, '_')}_${field.toUpperCase().replace(/-/g, '_')}`;
|
|
8
|
+
const value = process.env[envKey];
|
|
9
|
+
if (value !== undefined && value !== '') {
|
|
10
|
+
envConfig[field] = value;
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
allEnvPresent = false;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
if (allEnvPresent) {
|
|
17
|
+
return { config: envConfig, source: 'env' };
|
|
18
|
+
}
|
|
19
|
+
// 2. Check config file
|
|
20
|
+
const fileConfig = await readConfig(serverName);
|
|
21
|
+
if (fileConfig) {
|
|
22
|
+
const hasAllRequired = requiredFields.every((f) => f in fileConfig && fileConfig[f] !== '');
|
|
23
|
+
if (hasAllRequired) {
|
|
24
|
+
return { config: fileConfig, source: 'file' };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// 3. Check defaults
|
|
28
|
+
if (defaults) {
|
|
29
|
+
const hasAllRequired = requiredFields.every((f) => f in defaults && defaults[f] !== '');
|
|
30
|
+
if (hasAllRequired) {
|
|
31
|
+
return { config: { ...defaults }, source: 'defaults' };
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// 4. Nothing found -- trigger relay setup
|
|
35
|
+
return { config: null, source: null };
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/storage/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAS7C,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,UAAkB,EAClB,cAAwB,EACxB,QAAiC;IAEjC,4EAA4E;IAC5E,MAAM,SAAS,GAA2B,EAAE,CAAA;IAC5C,IAAI,aAAa,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,CAAA;IAC7C,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,OAAO,UAAU,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAA;QAC7G,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACjC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YACxC,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,CAAA;QAC1B,CAAC;aAAM,CAAC;YACN,aAAa,GAAG,KAAK,CAAA;QACvB,CAAC;IACH,CAAC;IACD,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IAC7C,CAAC;IAED,uBAAuB;IACvB,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAA;IAC/C,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,cAAc,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,UAAU,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;QAC3F,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;QAC/C,CAAC;IACH,CAAC;IAED,oBAAoB;IACpB,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,cAAc,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAA;QACvF,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,QAAQ,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAA;QACxD,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;AACvC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File-based session lock to prevent duplicate relay sessions.
|
|
3
|
+
*
|
|
4
|
+
* When multiple MCP server processes start simultaneously (common in Claude Code),
|
|
5
|
+
* this lock prevents each from creating a separate relay session (rate limit:
|
|
6
|
+
* max 10 sessions/IP/10min).
|
|
7
|
+
*
|
|
8
|
+
* Lock file location: <config_dir>/mcp/relay-session-<server>.lock
|
|
9
|
+
*/
|
|
10
|
+
export declare function setLockDir(path: string | null): void;
|
|
11
|
+
export interface SessionInfo {
|
|
12
|
+
sessionId: string;
|
|
13
|
+
relayUrl: string;
|
|
14
|
+
createdAt: number;
|
|
15
|
+
}
|
|
16
|
+
export declare function acquireSessionLock(serverName: string, maxAgeMs?: number): Promise<SessionInfo | null>;
|
|
17
|
+
export declare function writeSessionLock(serverName: string, info: SessionInfo): Promise<void>;
|
|
18
|
+
export declare function releaseSessionLock(serverName: string): Promise<void>;
|
|
19
|
+
//# sourceMappingURL=session-lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-lock.d.ts","sourceRoot":"","sources":["../../src/storage/session-lock.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAeH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAEpD;AAUD,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAQD,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,QAAQ,SAAqB,GAC5B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA2C7B;AAED,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB3F;AAED,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS1E"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File-based session lock to prevent duplicate relay sessions.
|
|
3
|
+
*
|
|
4
|
+
* When multiple MCP server processes start simultaneously (common in Claude Code),
|
|
5
|
+
* this lock prevents each from creating a separate relay session (rate limit:
|
|
6
|
+
* max 10 sessions/IP/10min).
|
|
7
|
+
*
|
|
8
|
+
* Lock file location: <config_dir>/mcp/relay-session-<server>.lock
|
|
9
|
+
*/
|
|
10
|
+
import { existsSync } from 'node:fs';
|
|
11
|
+
import { mkdir, readFile, rename, unlink, writeFile } from 'node:fs/promises';
|
|
12
|
+
import { dirname, join } from 'node:path';
|
|
13
|
+
import envPaths from 'env-paths';
|
|
14
|
+
const paths = envPaths('mcp', { suffix: '' });
|
|
15
|
+
const DEFAULT_LOCK_DIR = paths.config;
|
|
16
|
+
const DEFAULT_MAX_AGE_MS = 600_000;
|
|
17
|
+
// Allow overriding lock directory for testing
|
|
18
|
+
let lockDirOverride = null;
|
|
19
|
+
export function setLockDir(path) {
|
|
20
|
+
lockDirOverride = path;
|
|
21
|
+
}
|
|
22
|
+
function getLockDir() {
|
|
23
|
+
return lockDirOverride ?? DEFAULT_LOCK_DIR;
|
|
24
|
+
}
|
|
25
|
+
function lockPath(serverName) {
|
|
26
|
+
return join(getLockDir(), `relay-session-${serverName}.lock`);
|
|
27
|
+
}
|
|
28
|
+
export async function acquireSessionLock(serverName, maxAgeMs = DEFAULT_MAX_AGE_MS) {
|
|
29
|
+
const path = lockPath(serverName);
|
|
30
|
+
try {
|
|
31
|
+
if (!existsSync(path)) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
const raw = await readFile(path, 'utf-8');
|
|
35
|
+
const data = JSON.parse(raw);
|
|
36
|
+
// Validate required fields
|
|
37
|
+
if (typeof data.session_id !== 'string' ||
|
|
38
|
+
typeof data.relay_url !== 'string' ||
|
|
39
|
+
typeof data.created_at !== 'number') {
|
|
40
|
+
await releaseSessionLock(serverName);
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
const info = {
|
|
44
|
+
sessionId: data.session_id,
|
|
45
|
+
relayUrl: data.relay_url,
|
|
46
|
+
createdAt: data.created_at
|
|
47
|
+
};
|
|
48
|
+
const age = Date.now() - info.createdAt;
|
|
49
|
+
if (age > maxAgeMs) {
|
|
50
|
+
// Expired lock: clean up and return null
|
|
51
|
+
await releaseSessionLock(serverName);
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
return info;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// Corrupt or unreadable lock file: clean up and return null
|
|
58
|
+
try {
|
|
59
|
+
await releaseSessionLock(serverName);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
/* ignore cleanup errors */
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export async function writeSessionLock(serverName, info) {
|
|
68
|
+
const path = lockPath(serverName);
|
|
69
|
+
const dir = dirname(path);
|
|
70
|
+
if (!existsSync(dir)) {
|
|
71
|
+
await mkdir(dir, { recursive: true });
|
|
72
|
+
}
|
|
73
|
+
const data = {
|
|
74
|
+
session_id: info.sessionId,
|
|
75
|
+
relay_url: info.relayUrl,
|
|
76
|
+
created_at: info.createdAt
|
|
77
|
+
};
|
|
78
|
+
// Write atomically via temp file + rename
|
|
79
|
+
const tmpPath = `${path}.tmp`;
|
|
80
|
+
await writeFile(tmpPath, JSON.stringify(data), 'utf-8');
|
|
81
|
+
await rename(tmpPath, path);
|
|
82
|
+
}
|
|
83
|
+
export async function releaseSessionLock(serverName) {
|
|
84
|
+
const path = lockPath(serverName);
|
|
85
|
+
try {
|
|
86
|
+
if (existsSync(path)) {
|
|
87
|
+
await unlink(path);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
/* ignore errors during cleanup */
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=session-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-lock.js","sourceRoot":"","sources":["../../src/storage/session-lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,oBAAoB,EACzB,eAAe,EACf,KAAK,sBAAsB,EAC5B,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,oBAAoB,EACpB,KAAK,2BAA2B,EACjC,MAAM,sBAAsB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,eAAe,EAEhB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACL,oBAAoB,EAErB,MAAM,sBAAsB,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth 2.1 Bearer token validation middleware for Streamable HTTP.
|
|
3
|
+
*
|
|
4
|
+
* Validates `Authorization: Bearer <token>` headers on incoming requests
|
|
5
|
+
* against a `JWTIssuer`. On missing or invalid token it writes a 401
|
|
6
|
+
* with `WWW-Authenticate: Bearer resource_metadata="..."` per RFC 6750 +
|
|
7
|
+
* RFC 9728 (OAuth 2.1 protected resource metadata discovery).
|
|
8
|
+
*
|
|
9
|
+
* Success attaches the validated claims to `(req as any).user` so
|
|
10
|
+
* downstream handlers can read the subject without re-validating.
|
|
11
|
+
*/
|
|
12
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
13
|
+
import type { JWTIssuer } from '../oauth/jwt-issuer.js';
|
|
14
|
+
export interface OAuthMiddlewareOptions {
|
|
15
|
+
jwtIssuer: JWTIssuer;
|
|
16
|
+
resourceMetadataUrl: string;
|
|
17
|
+
}
|
|
18
|
+
export interface AuthenticatedRequest extends IncomingMessage {
|
|
19
|
+
user?: Record<string, unknown>;
|
|
20
|
+
}
|
|
21
|
+
export declare class OAuthMiddleware {
|
|
22
|
+
private readonly _issuer;
|
|
23
|
+
private readonly _resourceMetadataUrl;
|
|
24
|
+
constructor(options: OAuthMiddlewareOptions);
|
|
25
|
+
/**
|
|
26
|
+
* Validate the request. Returns `true` if the request should proceed
|
|
27
|
+
* (and attaches `req.user` on success). Returns `false` if the
|
|
28
|
+
* middleware has already written a 401 response.
|
|
29
|
+
*/
|
|
30
|
+
validate(req: AuthenticatedRequest, res: ServerResponse): Promise<boolean>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=oauth-middleware.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-middleware.d.ts","sourceRoot":"","sources":["../../src/transport/oauth-middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAEhE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAEvD,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,SAAS,CAAA;IACpB,mBAAmB,EAAE,MAAM,CAAA;CAC5B;AAED,MAAM,WAAW,oBAAqB,SAAQ,eAAe;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B;AA0BD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAW;IACnC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAQ;gBAEjC,OAAO,EAAE,sBAAsB;IAK3C;;;;OAIG;IACG,QAAQ,CAAC,GAAG,EAAE,oBAAoB,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;CAejF"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth 2.1 Bearer token validation middleware for Streamable HTTP.
|
|
3
|
+
*
|
|
4
|
+
* Validates `Authorization: Bearer <token>` headers on incoming requests
|
|
5
|
+
* against a `JWTIssuer`. On missing or invalid token it writes a 401
|
|
6
|
+
* with `WWW-Authenticate: Bearer resource_metadata="..."` per RFC 6750 +
|
|
7
|
+
* RFC 9728 (OAuth 2.1 protected resource metadata discovery).
|
|
8
|
+
*
|
|
9
|
+
* Success attaches the validated claims to `(req as any).user` so
|
|
10
|
+
* downstream handlers can read the subject without re-validating.
|
|
11
|
+
*/
|
|
12
|
+
function writeChallenge(res, resourceMetadataUrl, error) {
|
|
13
|
+
const params = [`resource_metadata="${resourceMetadataUrl}"`];
|
|
14
|
+
if (error)
|
|
15
|
+
params.push(`error="${error}"`);
|
|
16
|
+
res.writeHead(401, {
|
|
17
|
+
'WWW-Authenticate': `Bearer ${params.join(', ')}`,
|
|
18
|
+
'Content-Type': 'application/json'
|
|
19
|
+
});
|
|
20
|
+
res.end(JSON.stringify({
|
|
21
|
+
error: error ?? 'unauthorized',
|
|
22
|
+
error_description: error ? 'The access token is missing or invalid' : 'Authentication required'
|
|
23
|
+
}));
|
|
24
|
+
}
|
|
25
|
+
function extractBearerToken(authHeader) {
|
|
26
|
+
if (!authHeader)
|
|
27
|
+
return null;
|
|
28
|
+
const trimmed = authHeader.trim();
|
|
29
|
+
const match = trimmed.match(/^Bearer\s+(.+)$/i);
|
|
30
|
+
if (!match)
|
|
31
|
+
return null;
|
|
32
|
+
const token = match[1]?.trim() ?? '';
|
|
33
|
+
return token.length > 0 ? token : null;
|
|
34
|
+
}
|
|
35
|
+
export class OAuthMiddleware {
|
|
36
|
+
constructor(options) {
|
|
37
|
+
this._issuer = options.jwtIssuer;
|
|
38
|
+
this._resourceMetadataUrl = options.resourceMetadataUrl;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Validate the request. Returns `true` if the request should proceed
|
|
42
|
+
* (and attaches `req.user` on success). Returns `false` if the
|
|
43
|
+
* middleware has already written a 401 response.
|
|
44
|
+
*/
|
|
45
|
+
async validate(req, res) {
|
|
46
|
+
const token = extractBearerToken(req.headers.authorization);
|
|
47
|
+
if (!token) {
|
|
48
|
+
writeChallenge(res, this._resourceMetadataUrl);
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
const claims = await this._issuer.verifyAccessToken(token);
|
|
53
|
+
req.user = claims;
|
|
54
|
+
return true;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
writeChallenge(res, this._resourceMetadataUrl, 'invalid_token');
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=oauth-middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-middleware.js","sourceRoot":"","sources":["../../src/transport/oauth-middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAeH,SAAS,cAAc,CAAC,GAAmB,EAAE,mBAA2B,EAAE,KAAc;IACtF,MAAM,MAAM,GAAG,CAAC,sBAAsB,mBAAmB,GAAG,CAAC,CAAA;IAC7D,IAAI,KAAK;QAAE,MAAM,CAAC,IAAI,CAAC,UAAU,KAAK,GAAG,CAAC,CAAA;IAC1C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,kBAAkB,EAAE,UAAU,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACjD,cAAc,EAAE,kBAAkB;KACnC,CAAC,CAAA;IACF,GAAG,CAAC,GAAG,CACL,IAAI,CAAC,SAAS,CAAC;QACb,KAAK,EAAE,KAAK,IAAI,cAAc;QAC9B,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAC,wCAAwC,CAAC,CAAC,CAAC,yBAAyB;KAChG,CAAC,CACH,CAAA;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,UAA8B;IACxD,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAA;IAC5B,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,CAAA;IACjC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAA;IAC/C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IACvB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IACpC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;AACxC,CAAC;AAED,MAAM,OAAO,eAAe;IAI1B,YAAY,OAA+B;QACzC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,SAAS,CAAA;QAChC,IAAI,CAAC,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAA;IACzD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,GAAyB,EAAE,GAAmB;QAC3D,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;QAC3D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAA;YAC9C,OAAO,KAAK,CAAA;QACd,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAA;YAC1D,GAAG,CAAC,IAAI,GAAG,MAAM,CAAA;YACjB,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,MAAM,CAAC;YACP,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,oBAAoB,EAAE,eAAe,CAAC,CAAA;YAC/D,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streamable HTTP 2025-11-25 transport wrapper for mcp-core TypeScript.
|
|
3
|
+
*
|
|
4
|
+
* Thin convenience wrapper around `@modelcontextprotocol/sdk`'s
|
|
5
|
+
* `StreamableHTTPServerTransport` that pairs it with an `McpServer`
|
|
6
|
+
* instance and an optional OAuth Bearer validation middleware.
|
|
7
|
+
*
|
|
8
|
+
* The SDK already implements the full 2025-11-25 transport spec
|
|
9
|
+
* (session management, SSE streaming, stateful / stateless modes),
|
|
10
|
+
* so this wrapper focuses on the mcp-core ergonomics:
|
|
11
|
+
*
|
|
12
|
+
* - one-call `connect()` that wires server <-> transport
|
|
13
|
+
* - `handleRequest(req, res)` that applies the OAuth middleware
|
|
14
|
+
* first and short-circuits with 401 on missing / invalid token
|
|
15
|
+
* - explicit `host` / `port` properties for lifecycle management
|
|
16
|
+
* (the actual port bind is left to the caller's http.Server)
|
|
17
|
+
*/
|
|
18
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
19
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
20
|
+
import { StreamableHTTPServerTransport, type StreamableHTTPServerTransportOptions } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
21
|
+
import type { OAuthMiddleware } from './oauth-middleware.js';
|
|
22
|
+
export interface StreamableHTTPServerOptions {
|
|
23
|
+
/** MCP server instance that handles requests */
|
|
24
|
+
server: McpServer;
|
|
25
|
+
/** Host to advertise (used for logging / display only) */
|
|
26
|
+
host?: string;
|
|
27
|
+
/** Port to advertise (used for logging / display only) */
|
|
28
|
+
port: number;
|
|
29
|
+
/** Optional OAuth middleware for Bearer token validation */
|
|
30
|
+
oauthMiddleware?: OAuthMiddleware;
|
|
31
|
+
/** Transport options forwarded to StreamableHTTPServerTransport */
|
|
32
|
+
transportOptions?: StreamableHTTPServerTransportOptions;
|
|
33
|
+
}
|
|
34
|
+
export declare class StreamableHTTPServer {
|
|
35
|
+
readonly host: string;
|
|
36
|
+
readonly port: number;
|
|
37
|
+
private readonly _server;
|
|
38
|
+
private readonly _oauth?;
|
|
39
|
+
private readonly _transport;
|
|
40
|
+
private _connected;
|
|
41
|
+
constructor(options: StreamableHTTPServerOptions);
|
|
42
|
+
/** Connect the MCP server to the transport. Call once before handleRequest. */
|
|
43
|
+
connect(): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Handle an incoming HTTP request. Applies OAuth validation first if
|
|
46
|
+
* configured, then delegates to the SDK transport.
|
|
47
|
+
*/
|
|
48
|
+
handleRequest(req: IncomingMessage, res: ServerResponse, parsedBody?: unknown): Promise<void>;
|
|
49
|
+
/** Expose the underlying transport for advanced use cases. */
|
|
50
|
+
get transport(): StreamableHTTPServerTransport;
|
|
51
|
+
/** Close the transport and drain any active sessions. */
|
|
52
|
+
close(): Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=streamable-http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamable-http.d.ts","sourceRoot":"","sources":["../../src/transport/streamable-http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAEhE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,EACL,6BAA6B,EAC7B,KAAK,oCAAoC,EAC1C,MAAM,oDAAoD,CAAA;AAE3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAE5D,MAAM,WAAW,2BAA2B;IAC1C,gDAAgD;IAChD,MAAM,EAAE,SAAS,CAAA;IACjB,0DAA0D;IAC1D,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAA;IACZ,4DAA4D;IAC5D,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,mEAAmE;IACnE,gBAAgB,CAAC,EAAE,oCAAoC,CAAA;CACxD;AAED,qBAAa,oBAAoB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAW;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA+B;IAC1D,OAAO,CAAC,UAAU,CAAQ;gBAEd,OAAO,EAAE,2BAA2B;IAQhD,+EAA+E;IACzE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAM9B;;;OAGG;IACG,aAAa,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAQnG,8DAA8D;IAC9D,IAAI,SAAS,IAAI,6BAA6B,CAE7C;IAED,yDAAyD;IACnD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7B"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streamable HTTP 2025-11-25 transport wrapper for mcp-core TypeScript.
|
|
3
|
+
*
|
|
4
|
+
* Thin convenience wrapper around `@modelcontextprotocol/sdk`'s
|
|
5
|
+
* `StreamableHTTPServerTransport` that pairs it with an `McpServer`
|
|
6
|
+
* instance and an optional OAuth Bearer validation middleware.
|
|
7
|
+
*
|
|
8
|
+
* The SDK already implements the full 2025-11-25 transport spec
|
|
9
|
+
* (session management, SSE streaming, stateful / stateless modes),
|
|
10
|
+
* so this wrapper focuses on the mcp-core ergonomics:
|
|
11
|
+
*
|
|
12
|
+
* - one-call `connect()` that wires server <-> transport
|
|
13
|
+
* - `handleRequest(req, res)` that applies the OAuth middleware
|
|
14
|
+
* first and short-circuits with 401 on missing / invalid token
|
|
15
|
+
* - explicit `host` / `port` properties for lifecycle management
|
|
16
|
+
* (the actual port bind is left to the caller's http.Server)
|
|
17
|
+
*/
|
|
18
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
19
|
+
export class StreamableHTTPServer {
|
|
20
|
+
constructor(options) {
|
|
21
|
+
this._connected = false;
|
|
22
|
+
this._server = options.server;
|
|
23
|
+
this.host = options.host ?? '127.0.0.1';
|
|
24
|
+
this.port = options.port;
|
|
25
|
+
this._oauth = options.oauthMiddleware;
|
|
26
|
+
this._transport = new StreamableHTTPServerTransport(options.transportOptions ?? { sessionIdGenerator: undefined });
|
|
27
|
+
}
|
|
28
|
+
/** Connect the MCP server to the transport. Call once before handleRequest. */
|
|
29
|
+
async connect() {
|
|
30
|
+
if (this._connected)
|
|
31
|
+
return;
|
|
32
|
+
await this._server.connect(this._transport);
|
|
33
|
+
this._connected = true;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Handle an incoming HTTP request. Applies OAuth validation first if
|
|
37
|
+
* configured, then delegates to the SDK transport.
|
|
38
|
+
*/
|
|
39
|
+
async handleRequest(req, res, parsedBody) {
|
|
40
|
+
if (this._oauth) {
|
|
41
|
+
const allowed = await this._oauth.validate(req, res);
|
|
42
|
+
if (!allowed)
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
await this._transport.handleRequest(req, res, parsedBody);
|
|
46
|
+
}
|
|
47
|
+
/** Expose the underlying transport for advanced use cases. */
|
|
48
|
+
get transport() {
|
|
49
|
+
return this._transport;
|
|
50
|
+
}
|
|
51
|
+
/** Close the transport and drain any active sessions. */
|
|
52
|
+
async close() {
|
|
53
|
+
await this._transport.close();
|
|
54
|
+
this._connected = false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=streamable-http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamable-http.js","sourceRoot":"","sources":["../../src/transport/streamable-http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,EACL,6BAA6B,EAE9B,MAAM,oDAAoD,CAAA;AAiB3D,MAAM,OAAO,oBAAoB;IAQ/B,YAAY,OAAoC;QAFxC,eAAU,GAAG,KAAK,CAAA;QAGxB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAA;QAC7B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,CAAA;QACvC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;QACxB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,eAAe,CAAA;QACrC,IAAI,CAAC,UAAU,GAAG,IAAI,6BAA6B,CAAC,OAAO,CAAC,gBAAgB,IAAI,EAAE,kBAAkB,EAAE,SAAS,EAAE,CAAC,CAAA;IACpH,CAAC;IAED,+EAA+E;IAC/E,KAAK,CAAC,OAAO;QACX,IAAI,IAAI,CAAC,UAAU;YAAE,OAAM;QAC3B,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC3C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;IACxB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa,CAAC,GAAoB,EAAE,GAAmB,EAAE,UAAoB;QACjF,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;YACpD,IAAI,CAAC,OAAO;gBAAE,OAAM;QACtB,CAAC;QACD,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,CAAC,CAAA;IAC3D,CAAC;IAED,8DAA8D;IAC9D,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAA;IACxB,CAAC;IAED,yDAAyD;IACzD,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;QAC7B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;IACzB,CAAC;CACF"}
|
package/package.json
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@n24q02m/mcp-core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Unified MCP Streamable HTTP 2025-11-25 transport, OAuth 2.1 AS, lifecycle, install",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"mcp",
|
|
7
|
+
"model-context-protocol",
|
|
8
|
+
"streamable-http",
|
|
9
|
+
"oauth21",
|
|
10
|
+
"transport"
|
|
11
|
+
],
|
|
12
|
+
"author": {
|
|
13
|
+
"name": "n24q02m",
|
|
14
|
+
"url": "https://github.com/n24q02m"
|
|
15
|
+
},
|
|
16
|
+
"license": "MIT",
|
|
17
|
+
"repository": {
|
|
18
|
+
"type": "git",
|
|
19
|
+
"url": "git+https://github.com/n24q02m/mcp-core.git",
|
|
20
|
+
"directory": "packages/core-ts"
|
|
21
|
+
},
|
|
22
|
+
"homepage": "https://github.com/n24q02m/mcp-core",
|
|
23
|
+
"bugs": {
|
|
24
|
+
"url": "https://github.com/n24q02m/mcp-core/issues"
|
|
25
|
+
},
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public"
|
|
28
|
+
},
|
|
29
|
+
"type": "module",
|
|
30
|
+
"main": "build/index.js",
|
|
31
|
+
"types": "build/index.d.ts",
|
|
32
|
+
"files": [
|
|
33
|
+
"build/",
|
|
34
|
+
"README.md",
|
|
35
|
+
"LICENSE"
|
|
36
|
+
],
|
|
37
|
+
"exports": {
|
|
38
|
+
".": {
|
|
39
|
+
"import": "./build/index.js",
|
|
40
|
+
"types": "./build/index.d.ts"
|
|
41
|
+
},
|
|
42
|
+
"./crypto": {
|
|
43
|
+
"import": "./build/crypto/index.js",
|
|
44
|
+
"types": "./build/crypto/index.d.ts"
|
|
45
|
+
},
|
|
46
|
+
"./storage": {
|
|
47
|
+
"import": "./build/storage/resolver.js",
|
|
48
|
+
"types": "./build/storage/resolver.d.ts"
|
|
49
|
+
},
|
|
50
|
+
"./relay": {
|
|
51
|
+
"import": "./build/relay/client.js",
|
|
52
|
+
"types": "./build/relay/client.d.ts"
|
|
53
|
+
},
|
|
54
|
+
"./schema": {
|
|
55
|
+
"import": "./build/schema/types.js",
|
|
56
|
+
"types": "./build/schema/types.d.ts"
|
|
57
|
+
},
|
|
58
|
+
"./oauth": {
|
|
59
|
+
"import": "./build/oauth/index.js",
|
|
60
|
+
"types": "./build/oauth/index.d.ts"
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
"scripts": {
|
|
64
|
+
"build": "tsc --build tsconfig.build.json",
|
|
65
|
+
"test": "vitest --passWithNoTests",
|
|
66
|
+
"test:coverage": "vitest --coverage --passWithNoTests",
|
|
67
|
+
"check": "biome check . && bun run type-check",
|
|
68
|
+
"type-check": "tsc --noEmit"
|
|
69
|
+
},
|
|
70
|
+
"dependencies": {
|
|
71
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
72
|
+
"better-sqlite3": "^12.8.0",
|
|
73
|
+
"env-paths": "^3.0.0",
|
|
74
|
+
"jose": "^6.2.2"
|
|
75
|
+
},
|
|
76
|
+
"devDependencies": {
|
|
77
|
+
"@biomejs/biome": "^2.4.10",
|
|
78
|
+
"@types/better-sqlite3": "^7.6.13",
|
|
79
|
+
"@types/node": "^24.12.2",
|
|
80
|
+
"@vitest/coverage-v8": "^4.1.3",
|
|
81
|
+
"typescript": "^5.9.3",
|
|
82
|
+
"vitest": "^4.1.3"
|
|
83
|
+
},
|
|
84
|
+
"engines": {
|
|
85
|
+
"node": ">=24.14.1"
|
|
86
|
+
},
|
|
87
|
+
"packageManager": "bun@1.2.21"
|
|
88
|
+
}
|