agentic-payments 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/README.md +924 -0
- package/bin/cli.js +18 -0
- package/bin/mcp.js +10 -0
- package/completions/agentic-payments.bash +21 -0
- package/completions/agentic-payments.fish +9 -0
- package/completions/agentic-payments.zsh +17 -0
- package/completions/bash.sh +182 -0
- package/completions/fish.fish +110 -0
- package/completions/zsh.sh +175 -0
- package/dist/active-mandate/i18n.d.ts +27 -0
- package/dist/active-mandate/i18n.d.ts.map +1 -0
- package/dist/active-mandate/i18n.js +35 -0
- package/dist/active-mandate/i18n.js.map +1 -0
- package/dist/active-mandate/index.d.ts +26 -0
- package/dist/active-mandate/index.d.ts.map +1 -0
- package/dist/active-mandate/index.js +51 -0
- package/dist/active-mandate/index.js.map +1 -0
- package/dist/active-mandate/revocation.d.ts +11 -0
- package/dist/active-mandate/revocation.d.ts.map +1 -0
- package/dist/active-mandate/revocation.js +27 -0
- package/dist/active-mandate/revocation.js.map +1 -0
- package/dist/active-mandate/schema.d.ts +85 -0
- package/dist/active-mandate/schema.d.ts.map +1 -0
- package/dist/active-mandate/schema.js +36 -0
- package/dist/active-mandate/schema.js.map +1 -0
- package/dist/active-mandate/signing.d.ts +8 -0
- package/dist/active-mandate/signing.d.ts.map +1 -0
- package/dist/active-mandate/signing.js +64 -0
- package/dist/active-mandate/signing.js.map +1 -0
- package/dist/active-mandate/types.d.ts +59 -0
- package/dist/active-mandate/types.d.ts.map +1 -0
- package/dist/active-mandate/types.js +6 -0
- package/dist/active-mandate/types.js.map +1 -0
- package/dist/cli/commands/active-mandate.d.ts +4 -0
- package/dist/cli/commands/active-mandate.d.ts.map +1 -0
- package/dist/cli/commands/active-mandate.js +218 -0
- package/dist/cli/commands/active-mandate.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +3 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +59 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/mandate.d.ts +4 -0
- package/dist/cli/commands/mandate.d.ts.map +1 -0
- package/dist/cli/commands/mandate.js +223 -0
- package/dist/cli/commands/mandate.js.map +1 -0
- package/dist/cli/commands/system.d.ts +4 -0
- package/dist/cli/commands/system.d.ts.map +1 -0
- package/dist/cli/commands/system.js +101 -0
- package/dist/cli/commands/system.js.map +1 -0
- package/dist/cli/commands/verify.d.ts +3 -0
- package/dist/cli/commands/verify.d.ts.map +1 -0
- package/dist/cli/commands/verify.js +104 -0
- package/dist/cli/commands/verify.js.map +1 -0
- package/dist/cli/completion.d.ts +3 -0
- package/dist/cli/completion.d.ts.map +1 -0
- package/dist/cli/completion.js +245 -0
- package/dist/cli/completion.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +79 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/errors.d.ts +58 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +100 -0
- package/dist/errors.js.map +1 -0
- package/dist/identity.d.ts +78 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +204 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +68 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +79 -0
- package/dist/index.js.map +1 -0
- package/dist/mandate.d.ts +134 -0
- package/dist/mandate.d.ts.map +1 -0
- package/dist/mandate.js +342 -0
- package/dist/mandate.js.map +1 -0
- package/dist/mcp/index.d.ts +7 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +102 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +38 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +126 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/agent.d.ts +9 -0
- package/dist/mcp/tools/agent.d.ts.map +1 -0
- package/dist/mcp/tools/agent.js +34 -0
- package/dist/mcp/tools/agent.js.map +1 -0
- package/dist/mcp/tools/consensus.d.ts +9 -0
- package/dist/mcp/tools/consensus.d.ts.map +1 -0
- package/dist/mcp/tools/consensus.js +38 -0
- package/dist/mcp/tools/consensus.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +45 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +282 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/mandate.d.ts +31 -0
- package/dist/mcp/tools/mandate.d.ts.map +1 -0
- package/dist/mcp/tools/mandate.js +165 -0
- package/dist/mcp/tools/mandate.js.map +1 -0
- package/dist/mcp/tools/payment.d.ts +13 -0
- package/dist/mcp/tools/payment.d.ts.map +1 -0
- package/dist/mcp/tools/payment.js +66 -0
- package/dist/mcp/tools/payment.js.map +1 -0
- package/dist/mcp/tools/types.d.ts +63 -0
- package/dist/mcp/tools/types.d.ts.map +1 -0
- package/dist/mcp/tools/types.js +5 -0
- package/dist/mcp/tools/types.js.map +1 -0
- package/dist/mcp/transports/http.d.ts +52 -0
- package/dist/mcp/transports/http.d.ts.map +1 -0
- package/dist/mcp/transports/http.js +234 -0
- package/dist/mcp/transports/http.js.map +1 -0
- package/dist/types.d.ts +238 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/verification.d.ts +140 -0
- package/dist/verification.d.ts.map +1 -0
- package/dist/verification.js +285 -0
- package/dist/verification.js.map +1 -0
- package/package.json +175 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Payment mandate MCP tools (Intent and Cart)
|
|
3
|
+
*/
|
|
4
|
+
import { IntentMandate, CartMandate } from '../../mandate.js';
|
|
5
|
+
/**
|
|
6
|
+
* Create an intent-based payment mandate
|
|
7
|
+
*/
|
|
8
|
+
export async function createIntentMandateTool(args) {
|
|
9
|
+
try {
|
|
10
|
+
const { merchant_id, customer_id, intent, max_amount, currency = 'USD', expires_at, } = args;
|
|
11
|
+
const mandate = new IntentMandate({
|
|
12
|
+
merchantId: merchant_id,
|
|
13
|
+
customerId: customer_id,
|
|
14
|
+
intent,
|
|
15
|
+
maxAmount: max_amount,
|
|
16
|
+
currency,
|
|
17
|
+
expiresAt: expires_at || Date.now() + 86400000, // Default 24 hours
|
|
18
|
+
});
|
|
19
|
+
return {
|
|
20
|
+
success: true,
|
|
21
|
+
mandate: mandate.toJSON(),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
return {
|
|
26
|
+
success: false,
|
|
27
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Create a cart-based payment mandate
|
|
33
|
+
*/
|
|
34
|
+
export async function createCartMandateTool(args) {
|
|
35
|
+
try {
|
|
36
|
+
const { merchant_id, customer_id, items, currency = 'USD' } = args;
|
|
37
|
+
// Calculate total from items
|
|
38
|
+
const total = items.reduce((sum, item) => sum + item.quantity * item.unit_price, 0);
|
|
39
|
+
// CartMandate constructor takes data without totalAmount (it calculates it)
|
|
40
|
+
const mandate = new CartMandate({
|
|
41
|
+
merchantId: merchant_id,
|
|
42
|
+
customerId: customer_id,
|
|
43
|
+
items: items.map((item) => ({
|
|
44
|
+
id: item.id,
|
|
45
|
+
name: item.name,
|
|
46
|
+
quantity: item.quantity,
|
|
47
|
+
unitPrice: item.unit_price,
|
|
48
|
+
})),
|
|
49
|
+
currency,
|
|
50
|
+
expiresAt: Date.now() + 86400000, // Default 24 hours
|
|
51
|
+
});
|
|
52
|
+
return {
|
|
53
|
+
success: true,
|
|
54
|
+
mandate: mandate.toJSON(),
|
|
55
|
+
total,
|
|
56
|
+
items_count: items.length,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
return {
|
|
61
|
+
success: false,
|
|
62
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=payment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"payment.js","sourceRoot":"","sources":["../../../src/mcp/tools/payment.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAO9D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,IAA6B;IAE7B,IAAI,CAAC;QACH,MAAM,EACJ,WAAW,EACX,WAAW,EACX,MAAM,EACN,UAAU,EACV,QAAQ,GAAG,KAAK,EAChB,UAAU,GACX,GAAG,IAAI,CAAC;QAET,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC;YAChC,UAAU,EAAE,WAAW;YACvB,UAAU,EAAE,WAAW;YACvB,MAAM;YACN,SAAS,EAAE,UAAU;YACrB,QAAQ;YACR,SAAS,EAAE,UAAU,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,mBAAmB;SACpE,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE;SAC1B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAChE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAA2B;IAE3B,IAAI,CAAC;QACH,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC;QAEnE,6BAA6B;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CACxB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,EACpD,CAAC,CACF,CAAC;QAEF,4EAA4E;QAC5E,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC;YAC9B,UAAU,EAAE,WAAW;YACvB,UAAU,EAAE,WAAW;YACvB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC1B,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,SAAS,EAAE,IAAI,CAAC,UAAU;aAC3B,CAAC,CAAC;YACH,QAAQ;YACR,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,mBAAmB;SACtD,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE;YACzB,KAAK;YACL,WAAW,EAAE,KAAK,CAAC,MAAM;SAC1B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAChE,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool Type Definitions
|
|
3
|
+
*/
|
|
4
|
+
export interface ToolResult {
|
|
5
|
+
success: boolean;
|
|
6
|
+
[key: string]: any;
|
|
7
|
+
}
|
|
8
|
+
export interface CreateActiveMandateArgs {
|
|
9
|
+
agent: string;
|
|
10
|
+
holder: string;
|
|
11
|
+
amount: number;
|
|
12
|
+
currency: string;
|
|
13
|
+
period: 'single' | 'daily' | 'weekly' | 'monthly';
|
|
14
|
+
kind: 'intent' | 'cart';
|
|
15
|
+
merchant_allow?: string[];
|
|
16
|
+
merchant_block?: string[];
|
|
17
|
+
expires_at?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface SignMandateArgs {
|
|
20
|
+
mandate: any;
|
|
21
|
+
private_key: string;
|
|
22
|
+
}
|
|
23
|
+
export interface VerifyMandateArgs {
|
|
24
|
+
signed_mandate: any;
|
|
25
|
+
check_guards?: boolean;
|
|
26
|
+
}
|
|
27
|
+
export interface RevokeMandateArgs {
|
|
28
|
+
mandate_id: string;
|
|
29
|
+
reason?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface GenerateAgentIdentityArgs {
|
|
32
|
+
include_private_key?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export interface CreateIntentMandateArgs {
|
|
35
|
+
merchant_id: string;
|
|
36
|
+
customer_id: string;
|
|
37
|
+
intent: string;
|
|
38
|
+
max_amount: number;
|
|
39
|
+
currency?: string;
|
|
40
|
+
expires_at?: number;
|
|
41
|
+
}
|
|
42
|
+
export interface CreateCartMandateArgs {
|
|
43
|
+
merchant_id: string;
|
|
44
|
+
customer_id: string;
|
|
45
|
+
items: Array<{
|
|
46
|
+
id: string;
|
|
47
|
+
name: string;
|
|
48
|
+
quantity: number;
|
|
49
|
+
unit_price: number;
|
|
50
|
+
}>;
|
|
51
|
+
currency?: string;
|
|
52
|
+
}
|
|
53
|
+
export interface VerifyConsensusArgs {
|
|
54
|
+
message: string;
|
|
55
|
+
signature: string;
|
|
56
|
+
public_key: string;
|
|
57
|
+
agent_public_keys: string[];
|
|
58
|
+
consensus_threshold?: number;
|
|
59
|
+
}
|
|
60
|
+
export interface GetMandateInfoArgs {
|
|
61
|
+
mandate_id: string;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IAClD,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,GAAG,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,GAAG,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,yBAAyB;IACxC,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,KAAK,CAAC;QACX,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/mcp/tools/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP/SSE Transport for MCP Server
|
|
3
|
+
* Provides remote access to MCP tools via Server-Sent Events
|
|
4
|
+
*/
|
|
5
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* HTTP transport configuration
|
|
8
|
+
*/
|
|
9
|
+
export interface HttpTransportConfig {
|
|
10
|
+
/** Port to listen on */
|
|
11
|
+
port: number;
|
|
12
|
+
/** CORS origin (default: '*') */
|
|
13
|
+
corsOrigin?: string | string[];
|
|
14
|
+
/** Enable request logging */
|
|
15
|
+
enableLogging?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* HTTP MCP Server with SSE support
|
|
19
|
+
* Handles multiple client connections via session management
|
|
20
|
+
*/
|
|
21
|
+
export declare class HttpMCPServer {
|
|
22
|
+
private app;
|
|
23
|
+
private server;
|
|
24
|
+
private sessions;
|
|
25
|
+
private config;
|
|
26
|
+
constructor(server: Server, config?: Partial<HttpTransportConfig>);
|
|
27
|
+
/**
|
|
28
|
+
* Setup Express middleware
|
|
29
|
+
*/
|
|
30
|
+
private setupMiddleware;
|
|
31
|
+
/**
|
|
32
|
+
* Setup HTTP routes
|
|
33
|
+
*/
|
|
34
|
+
private setupRoutes;
|
|
35
|
+
/**
|
|
36
|
+
* Start HTTP server
|
|
37
|
+
*/
|
|
38
|
+
listen(): void;
|
|
39
|
+
/**
|
|
40
|
+
* Get active session count
|
|
41
|
+
*/
|
|
42
|
+
getSessionCount(): number;
|
|
43
|
+
/**
|
|
44
|
+
* Get active session IDs
|
|
45
|
+
*/
|
|
46
|
+
getSessionIds(): string[];
|
|
47
|
+
/**
|
|
48
|
+
* Close all sessions and shutdown
|
|
49
|
+
*/
|
|
50
|
+
shutdown(): Promise<void>;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/mcp/transports/http.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAInE;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC/B,6BAA6B;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,MAAM,CAAgC;gBAElC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,CAAC,mBAAmB,CAAM;IAgBrE;;OAEG;IACH,OAAO,CAAC,eAAe;IAsBvB;;OAEG;IACH,OAAO,CAAC,WAAW;IAqJnB;;OAEG;IACH,MAAM,IAAI,IAAI;IAad;;OAEG;IACH,eAAe,IAAI,MAAM;IAIzB;;OAEG;IACH,aAAa,IAAI,MAAM,EAAE;IAIzB;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAehC"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP/SSE Transport for MCP Server
|
|
3
|
+
* Provides remote access to MCP tools via Server-Sent Events
|
|
4
|
+
*/
|
|
5
|
+
import express from 'express';
|
|
6
|
+
import cors from 'cors';
|
|
7
|
+
import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
|
|
8
|
+
/**
|
|
9
|
+
* HTTP MCP Server with SSE support
|
|
10
|
+
* Handles multiple client connections via session management
|
|
11
|
+
*/
|
|
12
|
+
export class HttpMCPServer {
|
|
13
|
+
app;
|
|
14
|
+
server;
|
|
15
|
+
sessions;
|
|
16
|
+
config;
|
|
17
|
+
constructor(server, config = {}) {
|
|
18
|
+
this.server = server;
|
|
19
|
+
this.sessions = new Map();
|
|
20
|
+
// Default configuration
|
|
21
|
+
this.config = {
|
|
22
|
+
port: config.port || 3000,
|
|
23
|
+
corsOrigin: config.corsOrigin || '*',
|
|
24
|
+
enableLogging: config.enableLogging ?? true,
|
|
25
|
+
};
|
|
26
|
+
this.app = express();
|
|
27
|
+
this.setupMiddleware();
|
|
28
|
+
this.setupRoutes();
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Setup Express middleware
|
|
32
|
+
*/
|
|
33
|
+
setupMiddleware() {
|
|
34
|
+
// CORS configuration
|
|
35
|
+
this.app.use(cors({
|
|
36
|
+
origin: this.config.corsOrigin,
|
|
37
|
+
credentials: true,
|
|
38
|
+
methods: ['GET', 'POST', 'OPTIONS'],
|
|
39
|
+
allowedHeaders: ['Content-Type', 'Accept'],
|
|
40
|
+
}));
|
|
41
|
+
// JSON parsing
|
|
42
|
+
this.app.use(express.json());
|
|
43
|
+
// Request logging
|
|
44
|
+
if (this.config.enableLogging) {
|
|
45
|
+
this.app.use((req, _res, next) => {
|
|
46
|
+
const timestamp = new Date().toISOString();
|
|
47
|
+
console.error(`[${timestamp}] ${req.method} ${req.path}`);
|
|
48
|
+
next();
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Setup HTTP routes
|
|
54
|
+
*/
|
|
55
|
+
setupRoutes() {
|
|
56
|
+
// Health check endpoint
|
|
57
|
+
this.app.get('/health', (_req, res) => {
|
|
58
|
+
res.json({
|
|
59
|
+
status: 'healthy',
|
|
60
|
+
version: '0.1.0',
|
|
61
|
+
server: 'agentic-payments-mcp',
|
|
62
|
+
transport: 'http/sse',
|
|
63
|
+
activeSessions: this.sessions.size,
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
// SSE endpoint - establishes MCP connection
|
|
67
|
+
this.app.get('/sse', async (req, res) => {
|
|
68
|
+
try {
|
|
69
|
+
if (this.config.enableLogging) {
|
|
70
|
+
console.error(`[SSE] New connection request`);
|
|
71
|
+
}
|
|
72
|
+
// Create SSE transport - it generates its own session ID
|
|
73
|
+
// The endpoint for POST messages must match what transport expects
|
|
74
|
+
const transport = new SSEServerTransport(`/message`, res);
|
|
75
|
+
// Get the session ID that the transport generated
|
|
76
|
+
const sessionId = transport.sessionId;
|
|
77
|
+
this.sessions.set(sessionId, transport);
|
|
78
|
+
if (this.config.enableLogging) {
|
|
79
|
+
console.error(`[SSE] Established session: ${sessionId}`);
|
|
80
|
+
}
|
|
81
|
+
// Connect server to transport
|
|
82
|
+
await this.server.connect(transport);
|
|
83
|
+
// Don't immediately delete session on close - keep it for a grace period
|
|
84
|
+
// This allows POST requests to complete even if SSE disconnects briefly
|
|
85
|
+
req.on('close', () => {
|
|
86
|
+
if (this.config.enableLogging) {
|
|
87
|
+
console.error(`[SSE] Connection closed: ${sessionId}`);
|
|
88
|
+
}
|
|
89
|
+
// Grace period of 30 seconds before cleanup
|
|
90
|
+
setTimeout(() => {
|
|
91
|
+
if (this.sessions.has(sessionId)) {
|
|
92
|
+
this.sessions.delete(sessionId);
|
|
93
|
+
if (this.config.enableLogging) {
|
|
94
|
+
console.error(`[SSE] Session cleaned up: ${sessionId}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}, 30000);
|
|
98
|
+
});
|
|
99
|
+
// Handle errors
|
|
100
|
+
req.on('error', (error) => {
|
|
101
|
+
console.error(`[SSE] Connection error: ${sessionId}`, error);
|
|
102
|
+
// Don't immediately delete - same grace period
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
console.error('[SSE] Failed to establish connection:', error);
|
|
107
|
+
if (!res.headersSent) {
|
|
108
|
+
res.status(500).json({
|
|
109
|
+
error: 'Failed to establish SSE connection',
|
|
110
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
// Message endpoint - receives client messages
|
|
116
|
+
this.app.post('/message', async (req, res) => {
|
|
117
|
+
try {
|
|
118
|
+
const sessionId = req.query.sessionId;
|
|
119
|
+
if (!sessionId) {
|
|
120
|
+
res.status(400).json({
|
|
121
|
+
error: 'Missing sessionId query parameter',
|
|
122
|
+
});
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const transport = this.sessions.get(sessionId);
|
|
126
|
+
if (!transport) {
|
|
127
|
+
res.status(404).json({
|
|
128
|
+
error: 'Session not found',
|
|
129
|
+
sessionId,
|
|
130
|
+
});
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
// Forward message to transport with request body
|
|
134
|
+
await transport.handlePostMessage(req, res, req.body);
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
console.error('[Message] Handler error:', error);
|
|
138
|
+
if (!res.headersSent) {
|
|
139
|
+
res.status(500).json({
|
|
140
|
+
error: 'Failed to process message',
|
|
141
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
// Sessions endpoint - list active sessions (for debugging)
|
|
147
|
+
this.app.get('/sessions', (_req, res) => {
|
|
148
|
+
const sessions = Array.from(this.sessions.keys());
|
|
149
|
+
res.json({
|
|
150
|
+
count: sessions.length,
|
|
151
|
+
sessions: sessions.map(id => ({
|
|
152
|
+
sessionId: id,
|
|
153
|
+
status: 'active',
|
|
154
|
+
})),
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
// Root endpoint - API information
|
|
158
|
+
this.app.get('/', (_req, res) => {
|
|
159
|
+
res.json({
|
|
160
|
+
name: 'agentic-payments-mcp',
|
|
161
|
+
version: '0.1.0',
|
|
162
|
+
protocol: 'MCP (Model Context Protocol)',
|
|
163
|
+
transport: 'HTTP/SSE',
|
|
164
|
+
endpoints: {
|
|
165
|
+
health: '/health',
|
|
166
|
+
sse: '/sse?sessionId=<uuid>',
|
|
167
|
+
message: '/message?sessionId=<uuid>',
|
|
168
|
+
sessions: '/sessions',
|
|
169
|
+
},
|
|
170
|
+
documentation: 'https://github.com/agentic-catalog/agentic-payments',
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
// 404 handler
|
|
174
|
+
this.app.use((_req, res) => {
|
|
175
|
+
res.status(404).json({
|
|
176
|
+
error: 'Not Found',
|
|
177
|
+
message: 'The requested endpoint does not exist',
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
// Error handler
|
|
181
|
+
this.app.use((error, _req, res, _next) => {
|
|
182
|
+
console.error('[Error]', error);
|
|
183
|
+
res.status(500).json({
|
|
184
|
+
error: 'Internal Server Error',
|
|
185
|
+
message: error.message,
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Start HTTP server
|
|
191
|
+
*/
|
|
192
|
+
listen() {
|
|
193
|
+
this.app.listen(this.config.port, () => {
|
|
194
|
+
console.error('='.repeat(60));
|
|
195
|
+
console.error('🚀 Agentic Payments MCP Server (HTTP/SSE)');
|
|
196
|
+
console.error('='.repeat(60));
|
|
197
|
+
console.error(`📡 Server: http://localhost:${this.config.port}`);
|
|
198
|
+
console.error(`🔗 SSE: http://localhost:${this.config.port}/sse`);
|
|
199
|
+
console.error(`💬 Messages: http://localhost:${this.config.port}/message`);
|
|
200
|
+
console.error(`❤️ Health: http://localhost:${this.config.port}/health`);
|
|
201
|
+
console.error('='.repeat(60));
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Get active session count
|
|
206
|
+
*/
|
|
207
|
+
getSessionCount() {
|
|
208
|
+
return this.sessions.size;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Get active session IDs
|
|
212
|
+
*/
|
|
213
|
+
getSessionIds() {
|
|
214
|
+
return Array.from(this.sessions.keys());
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Close all sessions and shutdown
|
|
218
|
+
*/
|
|
219
|
+
async shutdown() {
|
|
220
|
+
console.error('Shutting down HTTP MCP server...');
|
|
221
|
+
// Close all active sessions
|
|
222
|
+
for (const [sessionId, transport] of this.sessions.entries()) {
|
|
223
|
+
try {
|
|
224
|
+
await transport.close();
|
|
225
|
+
this.sessions.delete(sessionId);
|
|
226
|
+
}
|
|
227
|
+
catch (error) {
|
|
228
|
+
console.error(`Error closing session ${sessionId}:`, error);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
console.error('HTTP MCP server shutdown complete');
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/mcp/transports/http.ts"],"names":[],"mappings":"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"}
|