@aauth/mcp-stdio 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/dist/args.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ export interface StdioArgs {
2
+ serverUrl: string;
3
+ agentUrl: string;
4
+ delegate?: string;
5
+ tokenLifetime?: number;
6
+ }
7
+ export declare function parseArgs(argv: string[]): StdioArgs;
8
+ //# sourceMappingURL=args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAoBD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CAuDnD"}
package/dist/args.js ADDED
@@ -0,0 +1,67 @@
1
+ function usage() {
2
+ console.error(`Usage: aauth-mcp-stdio <server-url> --agent-url <url> [--delegate <name>] [--token-lifetime <sec>]
3
+
4
+ Arguments:
5
+ server-url Remote MCP server URL
6
+
7
+ Options:
8
+ --agent-url <url> Agent URL (or AAUTH_AGENT_URL env var)
9
+ --delegate <name> Delegate name (or AAUTH_DELEGATE env var)
10
+ --token-lifetime <sec> Token lifetime in seconds (or AAUTH_TOKEN_LIFETIME env var, default: 3600)
11
+
12
+ Environment variables:
13
+ AAUTH_AGENT_URL Agent URL
14
+ AAUTH_DELEGATE Delegate name
15
+ AAUTH_TOKEN_LIFETIME Token lifetime in seconds`);
16
+ process.exit(1);
17
+ }
18
+ export function parseArgs(argv) {
19
+ const args = argv.slice(2);
20
+ if (args.length === 0) {
21
+ usage();
22
+ }
23
+ const serverUrl = args[0];
24
+ if (!serverUrl || serverUrl.startsWith('--')) {
25
+ usage();
26
+ }
27
+ let agentUrl;
28
+ let delegate;
29
+ let tokenLifetime;
30
+ for (let i = 1; i < args.length; i++) {
31
+ switch (args[i]) {
32
+ case '--agent-url':
33
+ agentUrl = args[++i];
34
+ break;
35
+ case '--delegate':
36
+ delegate = args[++i];
37
+ break;
38
+ case '--token-lifetime':
39
+ tokenLifetime = parseInt(args[++i], 10);
40
+ if (isNaN(tokenLifetime)) {
41
+ console.error('Error: --token-lifetime must be a number');
42
+ process.exit(1);
43
+ }
44
+ break;
45
+ default:
46
+ console.error(`Unknown option: ${args[i]}`);
47
+ usage();
48
+ }
49
+ }
50
+ agentUrl = agentUrl ?? process.env.AAUTH_AGENT_URL;
51
+ delegate = delegate ?? process.env.AAUTH_DELEGATE;
52
+ const envLifetime = process.env.AAUTH_TOKEN_LIFETIME;
53
+ if (!tokenLifetime && envLifetime) {
54
+ tokenLifetime = parseInt(envLifetime, 10);
55
+ }
56
+ if (!agentUrl) {
57
+ console.error('Error: --agent-url or AAUTH_AGENT_URL is required');
58
+ process.exit(1);
59
+ }
60
+ return {
61
+ serverUrl,
62
+ agentUrl,
63
+ delegate,
64
+ tokenLifetime,
65
+ };
66
+ }
67
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../src/args.ts"],"names":[],"mappings":"AAOA,SAAS,KAAK;IACZ,OAAO,CAAC,KAAK,CAAC;;;;;;;;;;;;;qDAaqC,CAAC,CAAA;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAE1B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,KAAK,EAAE,CAAA;IACT,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;IACzB,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,KAAK,EAAE,CAAA;IACT,CAAC;IAED,IAAI,QAA4B,CAAA;IAChC,IAAI,QAA4B,CAAA;IAChC,IAAI,aAAiC,CAAA;IAErC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAChB,KAAK,aAAa;gBAChB,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;gBACpB,MAAK;YACP,KAAK,YAAY;gBACf,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAA;gBACpB,MAAK;YACP,KAAK,kBAAkB;gBACrB,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;gBACvC,IAAI,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;oBACzB,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAA;oBACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACjB,CAAC;gBACD,MAAK;YACP;gBACE,OAAO,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;gBAC3C,KAAK,EAAE,CAAA;QACX,CAAC;IACH,CAAC;IAED,QAAQ,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAA;IAClD,QAAQ,GAAG,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAA;IACjD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAA;IACpD,IAAI,CAAC,aAAa,IAAI,WAAW,EAAE,CAAC;QAClC,aAAa,GAAG,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;IAC3C,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAA;QAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,OAAO;QACL,SAAS;QACT,QAAQ;QACR,QAAQ;QACR,aAAa;KACd,CAAA;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=args.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.test.d.ts","sourceRoot":"","sources":["../src/args.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,105 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { parseArgs } from './args.js';
3
+ describe('parseArgs', () => {
4
+ const originalEnv = { ...process.env };
5
+ const mockExit = vi.spyOn(process, 'exit').mockImplementation(() => {
6
+ throw new Error('process.exit called');
7
+ });
8
+ beforeEach(() => {
9
+ vi.clearAllMocks();
10
+ delete process.env.AAUTH_AGENT_URL;
11
+ delete process.env.AAUTH_DELEGATE;
12
+ delete process.env.AAUTH_TOKEN_LIFETIME;
13
+ });
14
+ afterEach(() => {
15
+ process.env = { ...originalEnv };
16
+ });
17
+ it('parses server-url and --agent-url', () => {
18
+ const result = parseArgs([
19
+ 'node', 'cli.js',
20
+ 'https://example.com/mcp',
21
+ '--agent-url', 'https://agent.example.com',
22
+ ]);
23
+ expect(result).toEqual({
24
+ serverUrl: 'https://example.com/mcp',
25
+ agentUrl: 'https://agent.example.com',
26
+ delegate: undefined,
27
+ tokenLifetime: undefined,
28
+ });
29
+ });
30
+ it('parses all options', () => {
31
+ const result = parseArgs([
32
+ 'node', 'cli.js',
33
+ 'https://example.com/mcp',
34
+ '--agent-url', 'https://agent.example.com',
35
+ '--delegate', 'claude',
36
+ '--token-lifetime', '7200',
37
+ ]);
38
+ expect(result).toEqual({
39
+ serverUrl: 'https://example.com/mcp',
40
+ agentUrl: 'https://agent.example.com',
41
+ delegate: 'claude',
42
+ tokenLifetime: 7200,
43
+ });
44
+ });
45
+ it('falls back to AAUTH_AGENT_URL env var', () => {
46
+ process.env.AAUTH_AGENT_URL = 'https://env-agent.example.com';
47
+ const result = parseArgs([
48
+ 'node', 'cli.js',
49
+ 'https://example.com/mcp',
50
+ ]);
51
+ expect(result.agentUrl).toBe('https://env-agent.example.com');
52
+ });
53
+ it('falls back to AAUTH_DELEGATE env var', () => {
54
+ process.env.AAUTH_AGENT_URL = 'https://agent.example.com';
55
+ process.env.AAUTH_DELEGATE = 'env-delegate';
56
+ const result = parseArgs([
57
+ 'node', 'cli.js',
58
+ 'https://example.com/mcp',
59
+ ]);
60
+ expect(result.delegate).toBe('env-delegate');
61
+ });
62
+ it('falls back to AAUTH_TOKEN_LIFETIME env var', () => {
63
+ process.env.AAUTH_AGENT_URL = 'https://agent.example.com';
64
+ process.env.AAUTH_TOKEN_LIFETIME = '1800';
65
+ const result = parseArgs([
66
+ 'node', 'cli.js',
67
+ 'https://example.com/mcp',
68
+ ]);
69
+ expect(result.tokenLifetime).toBe(1800);
70
+ });
71
+ it('CLI --agent-url overrides env var', () => {
72
+ process.env.AAUTH_AGENT_URL = 'https://env.example.com';
73
+ const result = parseArgs([
74
+ 'node', 'cli.js',
75
+ 'https://example.com/mcp',
76
+ '--agent-url', 'https://cli.example.com',
77
+ ]);
78
+ expect(result.agentUrl).toBe('https://cli.example.com');
79
+ });
80
+ it('exits on missing server-url', () => {
81
+ expect(() => parseArgs(['node', 'cli.js'])).toThrow('process.exit called');
82
+ expect(mockExit).toHaveBeenCalledWith(1);
83
+ });
84
+ it('exits when server-url starts with --', () => {
85
+ expect(() => parseArgs(['node', 'cli.js', '--agent-url', 'https://a.com'])).toThrow('process.exit called');
86
+ expect(mockExit).toHaveBeenCalledWith(1);
87
+ });
88
+ it('exits on missing agent-url', () => {
89
+ expect(() => parseArgs([
90
+ 'node', 'cli.js',
91
+ 'https://example.com/mcp',
92
+ ])).toThrow('process.exit called');
93
+ expect(mockExit).toHaveBeenCalledWith(1);
94
+ });
95
+ it('exits on non-numeric token-lifetime', () => {
96
+ expect(() => parseArgs([
97
+ 'node', 'cli.js',
98
+ 'https://example.com/mcp',
99
+ '--agent-url', 'https://agent.example.com',
100
+ '--token-lifetime', 'abc',
101
+ ])).toThrow('process.exit called');
102
+ expect(mockExit).toHaveBeenCalledWith(1);
103
+ });
104
+ });
105
+ //# sourceMappingURL=args.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.test.js","sourceRoot":"","sources":["../src/args.test.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env node
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
4
+ import { createSignedFetch } from '@aauth/mcp-agent';
5
+ import { createAgentToken } from '@aauth/local-keys';
6
+ import { parseArgs } from './args.js';
7
+ import { bridgeTransports } from './proxy.js';
8
+ const { serverUrl, agentUrl, delegate, tokenLifetime } = parseArgs(process.argv);
9
+ const getKeyMaterial = () => createAgentToken({
10
+ agentUrl,
11
+ delegate: delegate ?? 'claude',
12
+ tokenLifetime,
13
+ });
14
+ const signedFetch = createSignedFetch(getKeyMaterial);
15
+ const remote = new StreamableHTTPClientTransport(new URL(serverUrl), {
16
+ fetch: signedFetch,
17
+ });
18
+ const local = new StdioServerTransport();
19
+ bridgeTransports(local, remote).catch((err) => {
20
+ console.error('Fatal error:', err);
21
+ process.exit(1);
22
+ });
23
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAChF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAA;AAClG,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAE7C,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;AAEhF,MAAM,cAAc,GAAG,GAAG,EAAE,CAC1B,gBAAgB,CAAC;IACf,QAAQ;IACR,QAAQ,EAAE,QAAQ,IAAI,QAAQ;IAC9B,aAAa;CACd,CAAC,CAAA;AAEJ,MAAM,WAAW,GAAG,iBAAiB,CAAC,cAAc,CAAC,CAAA;AAErD,MAAM,MAAM,GAAG,IAAI,6BAA6B,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,EAAE;IACnE,KAAK,EAAE,WAAW;CACnB,CAAC,CAAA;AAEF,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAA;AAExC,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC5C,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAA;IAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ export { bridgeTransports } from './proxy.js';
2
+ export { parseArgs } from './args.js';
3
+ export type { StdioArgs } from './args.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AACrC,YAAY,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { bridgeTransports } from './proxy.js';
2
+ export { parseArgs } from './args.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
2
+ export declare function bridgeTransports(local: Transport, remote: Transport): Promise<void>;
3
+ //# sourceMappingURL=proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAA;AAE9E,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,SAAS,EAChB,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,IAAI,CAAC,CAgCf"}
package/dist/proxy.js ADDED
@@ -0,0 +1,28 @@
1
+ export async function bridgeTransports(local, remote) {
2
+ local.onmessage = (message) => {
3
+ remote.send(message).catch((err) => {
4
+ console.error('Error forwarding to remote:', err);
5
+ });
6
+ };
7
+ remote.onmessage = (message) => {
8
+ local.send(message).catch((err) => {
9
+ console.error('Error forwarding to local:', err);
10
+ });
11
+ };
12
+ local.onclose = () => {
13
+ remote.close().catch(() => { });
14
+ };
15
+ remote.onclose = () => {
16
+ local.close().catch(() => { });
17
+ };
18
+ local.onerror = (err) => {
19
+ console.error('Local transport error:', err);
20
+ remote.close().catch(() => { });
21
+ };
22
+ remote.onerror = (err) => {
23
+ console.error('Remote transport error:', err);
24
+ local.close().catch(() => { });
25
+ };
26
+ await Promise.all([local.start(), remote.start()]);
27
+ }
28
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAgB,EAChB,MAAiB;IAEjB,KAAK,CAAC,SAAS,GAAG,CAAC,OAAO,EAAE,EAAE;QAC5B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACjC,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAA;QACnD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,MAAM,CAAC,SAAS,GAAG,CAAC,OAAO,EAAE,EAAE;QAC7B,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YAChC,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,KAAK,CAAC,OAAO,GAAG,GAAG,EAAE;QACnB,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IAChC,CAAC,CAAA;IAED,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE;QACpB,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IAC/B,CAAC,CAAA;IAED,KAAK,CAAC,OAAO,GAAG,CAAC,GAAG,EAAE,EAAE;QACtB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAA;QAC5C,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IAChC,CAAC,CAAA;IAED,MAAM,CAAC,OAAO,GAAG,CAAC,GAAG,EAAE,EAAE;QACvB,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAA;QAC7C,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IAC/B,CAAC,CAAA;IAED,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;AACpD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=proxy.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.test.d.ts","sourceRoot":"","sources":["../src/proxy.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,58 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { bridgeTransports } from './proxy.js';
3
+ function createMockTransport() {
4
+ return {
5
+ start: vi.fn().mockResolvedValue(undefined),
6
+ send: vi.fn().mockResolvedValue(undefined),
7
+ close: vi.fn().mockResolvedValue(undefined),
8
+ onmessage: undefined,
9
+ onclose: undefined,
10
+ onerror: undefined,
11
+ };
12
+ }
13
+ describe('bridgeTransports', () => {
14
+ let local;
15
+ let remote;
16
+ beforeEach(() => {
17
+ local = createMockTransport();
18
+ remote = createMockTransport();
19
+ });
20
+ it('calls start() on both transports', async () => {
21
+ await bridgeTransports(local, remote);
22
+ expect(local.start).toHaveBeenCalledOnce();
23
+ expect(remote.start).toHaveBeenCalledOnce();
24
+ });
25
+ it('forwards local messages to remote', async () => {
26
+ await bridgeTransports(local, remote);
27
+ const msg = { jsonrpc: '2.0', method: 'test', id: 1 };
28
+ local.onmessage(msg);
29
+ expect(remote.send).toHaveBeenCalledWith(msg);
30
+ });
31
+ it('forwards remote messages to local', async () => {
32
+ await bridgeTransports(local, remote);
33
+ const msg = { jsonrpc: '2.0', result: {}, id: 1 };
34
+ remote.onmessage(msg);
35
+ expect(local.send).toHaveBeenCalledWith(msg);
36
+ });
37
+ it('closes remote when local closes', async () => {
38
+ await bridgeTransports(local, remote);
39
+ local.onclose();
40
+ expect(remote.close).toHaveBeenCalledOnce();
41
+ });
42
+ it('closes local when remote closes', async () => {
43
+ await bridgeTransports(local, remote);
44
+ remote.onclose();
45
+ expect(local.close).toHaveBeenCalledOnce();
46
+ });
47
+ it('closes remote on local error', async () => {
48
+ await bridgeTransports(local, remote);
49
+ local.onerror(new Error('local broke'));
50
+ expect(remote.close).toHaveBeenCalledOnce();
51
+ });
52
+ it('closes local on remote error', async () => {
53
+ await bridgeTransports(local, remote);
54
+ remote.onerror(new Error('remote broke'));
55
+ expect(local.close).toHaveBeenCalledOnce();
56
+ });
57
+ });
58
+ //# sourceMappingURL=proxy.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.test.js","sourceRoot":"","sources":["../src/proxy.test.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@aauth/mcp-stdio",
3
+ "version": "0.1.0",
4
+ "description": "Stdio-to-HTTP proxy for MCP with AAuth signatures",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/index.d.ts",
9
+ "default": "./dist/index.js"
10
+ }
11
+ },
12
+ "bin": {
13
+ "aauth-mcp-stdio": "./dist/cli.js"
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "prepublishOnly": "npm run build"
21
+ },
22
+ "keywords": [
23
+ "aauth",
24
+ "agent-auth",
25
+ "mcp",
26
+ "stdio",
27
+ "proxy"
28
+ ],
29
+ "author": "Dick Hardt <dick.hardt@hello.coop>",
30
+ "license": "MIT",
31
+ "publishConfig": {
32
+ "access": "public"
33
+ },
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "https://github.com/hellocoop/AAuth",
37
+ "directory": "mcp-stdio"
38
+ },
39
+ "dependencies": {
40
+ "@aauth/mcp-agent": "^0.1.0",
41
+ "@aauth/local-keys": "^0.1.0",
42
+ "@modelcontextprotocol/sdk": "^1.15.1"
43
+ },
44
+ "devDependencies": {
45
+ "@types/node": "^20.0.0",
46
+ "typescript": "^5.0.0"
47
+ }
48
+ }