@atxp/server 0.2.22 → 0.4.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/atxpContext.js +9 -6
- package/dist/atxpContext.js.map +1 -1
- package/dist/core/mcp.js +39 -0
- package/dist/core/mcp.js.map +1 -0
- package/dist/{oAuthChallenge.js → core/oauth.js} +21 -12
- package/dist/core/oauth.js.map +1 -0
- package/dist/{token.js → core/token.js} +13 -7
- package/dist/core/token.js.map +1 -0
- package/dist/getResource.js +23 -4
- package/dist/getResource.js.map +1 -1
- package/dist/index.cjs +654 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +197 -5
- package/dist/index.js +609 -5
- package/dist/index.js.map +1 -1
- package/dist/node/getRawBody.js +35 -0
- package/dist/node/getRawBody.js.map +1 -0
- package/dist/node/http.js +49 -0
- package/dist/node/http.js.map +1 -0
- package/dist/node/oauth.js +41 -0
- package/dist/node/oauth.js.map +1 -0
- package/dist/node/token.js +15 -0
- package/dist/node/token.js.map +1 -0
- package/dist/oAuthMetadata.js +6 -12
- package/dist/oAuthMetadata.js.map +1 -1
- package/dist/paymentServer.js +5 -20
- package/dist/paymentServer.js.map +1 -1
- package/dist/protectedResourceMetadata.js +10 -16
- package/dist/protectedResourceMetadata.js.map +1 -1
- package/dist/requirePayment.js +7 -4
- package/dist/requirePayment.js.map +1 -1
- package/dist/serverConfig.js +37 -0
- package/dist/serverConfig.js.map +1 -0
- package/dist/serverTestHelpers.d.ts +70 -21
- package/dist/serverTestHelpers.js +55 -24
- package/dist/serverTestHelpers.js.map +1 -1
- package/dist/types.js +4 -2
- package/dist/types.js.map +1 -1
- package/dist/webapi/mcp.js +25 -0
- package/dist/webapi/mcp.js.map +1 -0
- package/dist/webapi/oauth.js +43 -0
- package/dist/webapi/oauth.js.map +1 -0
- package/dist/webapi/token.js +15 -0
- package/dist/webapi/token.js.map +1 -0
- package/package.json +24 -10
- package/dist/atxpContext.d.ts +0 -6
- package/dist/atxpContext.d.ts.map +0 -1
- package/dist/atxpServer.d.ts +0 -12
- package/dist/atxpServer.d.ts.map +0 -1
- package/dist/atxpServer.js +0 -101
- package/dist/atxpServer.js.map +0 -1
- package/dist/getResource.d.ts +0 -4
- package/dist/getResource.d.ts.map +0 -1
- package/dist/http.d.ts +0 -7
- package/dist/http.d.ts.map +0 -1
- package/dist/http.js +0 -51
- package/dist/http.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/oAuthChallenge.d.ts +0 -4
- package/dist/oAuthChallenge.d.ts.map +0 -1
- package/dist/oAuthChallenge.js.map +0 -1
- package/dist/oAuthMetadata.d.ts +0 -6
- package/dist/oAuthMetadata.d.ts.map +0 -1
- package/dist/paymentServer.d.ts +0 -62
- package/dist/paymentServer.d.ts.map +0 -1
- package/dist/protectedResourceMetadata.d.ts +0 -5
- package/dist/protectedResourceMetadata.d.ts.map +0 -1
- package/dist/requirePayment.d.ts +0 -3
- package/dist/requirePayment.d.ts.map +0 -1
- package/dist/serverTestHelpers.d.ts.map +0 -1
- package/dist/token.d.ts +0 -4
- package/dist/token.d.ts.map +0 -1
- package/dist/token.js.map +0 -1
- package/dist/types.d.ts +0 -60
- package/dist/types.d.ts.map +0 -1
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
// Helper function to parse size strings like "4mb" to bytes
|
|
2
|
+
function parseSize(size) {
|
|
3
|
+
const match = size.match(/^(\d+(?:\.\d+)?)\s*([kmgt]?b?)$/i);
|
|
4
|
+
if (!match) {
|
|
5
|
+
throw new Error(`Invalid size format: ${size}`);
|
|
6
|
+
}
|
|
7
|
+
const value = parseFloat(match[1]);
|
|
8
|
+
const unit = (match[2] || 'b').toLowerCase();
|
|
9
|
+
const multipliers = {
|
|
10
|
+
'b': 1,
|
|
11
|
+
'kb': 1024,
|
|
12
|
+
'mb': 1024 * 1024,
|
|
13
|
+
'gb': 1024 * 1024 * 1024,
|
|
14
|
+
'tb': 1024 * 1024 * 1024 * 1024,
|
|
15
|
+
};
|
|
16
|
+
return Math.floor(value * (multipliers[unit] || 1));
|
|
17
|
+
}
|
|
18
|
+
async function getRawBody(req, encoding, maxSize) {
|
|
19
|
+
// Use native Node.js approach to read request body
|
|
20
|
+
const chunks = [];
|
|
21
|
+
let totalSize = 0;
|
|
22
|
+
const maxSizeBytes = parseSize(maxSize);
|
|
23
|
+
for await (const chunk of req) {
|
|
24
|
+
totalSize += chunk.length;
|
|
25
|
+
if (totalSize > maxSizeBytes) {
|
|
26
|
+
throw new Error(`Request body too large. Maximum size is ${maxSize}`);
|
|
27
|
+
}
|
|
28
|
+
chunks.push(chunk);
|
|
29
|
+
}
|
|
30
|
+
const body = Buffer.concat(chunks);
|
|
31
|
+
return body.toString(encoding);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export { getRawBody };
|
|
35
|
+
//# sourceMappingURL=getRawBody.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getRawBody.js","sources":["../../src/node/getRawBody.ts"],"sourcesContent":[null],"names":[],"mappings":"AAEA;AACA,SAAS,SAAS,CAAC,IAAY,EAAA;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,kCAAkC,CAAC;IAC5D,IAAI,CAAC,KAAK,EAAE;AACV,QAAA,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,CAAA,CAAE,CAAC;IACjD;IAEA,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAClC,IAAA,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,WAAW,EAAE;AAE5C,IAAA,MAAM,WAAW,GAA2B;AAC1C,QAAA,GAAG,EAAE,CAAC;AACN,QAAA,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI,GAAG,IAAI;AACjB,QAAA,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI;AACxB,QAAA,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;KAChC;AAED,IAAA,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACrD;AAEO,eAAe,UAAU,CAAC,GAAoB,EAAE,QAAgB,EAAE,OAAe,EAAA;;IAEtF,MAAM,MAAM,GAAa,EAAE;IAC3B,IAAI,SAAS,GAAG,CAAC;AACjB,IAAA,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC;AAEvC,IAAA,WAAW,MAAM,KAAK,IAAI,GAAG,EAAE;AAC7B,QAAA,SAAS,IAAI,KAAK,CAAC,MAAM;AACzB,QAAA,IAAI,SAAS,GAAG,YAAY,EAAE;AAC5B,YAAA,MAAM,IAAI,KAAK,CAAC,2CAA2C,OAAO,CAAA,CAAE,CAAC;QACvE;AACA,QAAA,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;IACpB;IAEA,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;AAClC,IAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,QAA0B,CAAC;AAClD;;;;"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import * as contentType from 'content-type';
|
|
2
|
+
import { isJSONRPCRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
import { parseMcpMessages } from '@atxp/common';
|
|
4
|
+
import { parseMcpRequestsCore } from '../core/mcp.js';
|
|
5
|
+
import { getRawBody } from './getRawBody.js';
|
|
6
|
+
|
|
7
|
+
// Useful reference for dealing with low-level http requests:
|
|
8
|
+
// https://github.com/modelcontextprotocol/typescript-sdk/blob/c6ac083b1b37b222b5bfba5563822daa5d03372e/src/server/streamableHttp.ts#L375
|
|
9
|
+
// Using the same value as MCP SDK
|
|
10
|
+
const MAXIMUM_MESSAGE_SIZE = "4mb";
|
|
11
|
+
/**
|
|
12
|
+
* Node.js HTTP implementation of MCP request parsing
|
|
13
|
+
* Handles Node.js IncomingMessage parsing and delegates to core logic
|
|
14
|
+
*/
|
|
15
|
+
async function parseMcpRequests(config, requestUrl, req, parsedBody) {
|
|
16
|
+
parsedBody = parsedBody ?? await parseBody(req, config.logger);
|
|
17
|
+
// Use the shared core logic for basic validation and filtering
|
|
18
|
+
const basicMessages = parseMcpRequestsCore(config, requestUrl, req.method || '', parsedBody);
|
|
19
|
+
// Only proceed with MCP processing if the basic validation passed
|
|
20
|
+
if (basicMessages.length === 0) {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
// Apply additional MCP-specific processing (parseMcpMessages handles SSE and other formats)
|
|
24
|
+
const messages = await parseMcpMessages(parsedBody, config.logger);
|
|
25
|
+
const requests = messages.filter(msg => isJSONRPCRequest(msg));
|
|
26
|
+
if (requests.length !== messages.length) {
|
|
27
|
+
config.logger.debug(`Dropped ${messages.length - requests.length} MCP messages that were not MCP requests`);
|
|
28
|
+
}
|
|
29
|
+
return requests;
|
|
30
|
+
}
|
|
31
|
+
async function parseBody(req, logger) {
|
|
32
|
+
try {
|
|
33
|
+
const ct = req.headers["content-type"];
|
|
34
|
+
let encoding = "utf-8";
|
|
35
|
+
if (ct) {
|
|
36
|
+
const parsedCt = contentType.parse(ct);
|
|
37
|
+
encoding = parsedCt.parameters.charset ?? "utf-8";
|
|
38
|
+
}
|
|
39
|
+
const body = await getRawBody(req, encoding, MAXIMUM_MESSAGE_SIZE);
|
|
40
|
+
return JSON.parse(body);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
logger.error(error.message);
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export { parseBody, parseMcpRequests };
|
|
49
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sources":["../../src/node/http.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;AAOA;AACA;AAEA;AACA,MAAM,oBAAoB,GAAG,KAAK;AAElC;;;AAGG;AACI,eAAe,gBAAgB,CAAC,MAAkB,EAAE,UAAe,EAAE,GAAoB,EAAE,UAAoB,EAAA;AACpH,IAAA,UAAU,GAAG,UAAU,IAAI,MAAM,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC;;AAG9D,IAAA,MAAM,aAAa,GAAG,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,UAAU,CAAC;;AAG5F,IAAA,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;AAC9B,QAAA,OAAO,EAAE;IACX;;IAGA,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC;AAElE,IAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAC9D,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE;AACvC,QAAA,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,QAAA,EAAW,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAA,wCAAA,CAA0C,CAAC;IAC7G;AAEA,IAAA,OAAO,QAAQ;AACjB;AAEO,eAAe,SAAS,CAAC,GAAoB,EAAE,MAAc,EAAA;AAClE,IAAA,IAAI;QACF,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC;QAEtC,IAAI,QAAQ,GAAG,OAAO;QACtB,IAAI,EAAE,EAAE;YACN,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,QAAQ,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO,IAAI,OAAO;QACnD;QACA,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,QAAQ,EAAE,oBAAoB,CAAC;AAClE,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;IACzB;IAAE,OAAO,KAAK,EAAE;AACd,QAAA,MAAM,CAAC,KAAK,CAAE,KAAe,CAAC,OAAO,CAAC;AACtC,QAAA,OAAO,SAAS;IAClB;AACF;;;;"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { createOAuthChallengeResponseCore } from '../core/oauth.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Node.js HTTP implementation of OAuth challenge sending
|
|
5
|
+
* Uses Node.js ServerResponse and delegates to core logic
|
|
6
|
+
*/
|
|
7
|
+
function sendOAuthChallenge(res, tokenCheck) {
|
|
8
|
+
// Use the shared core logic to get response data
|
|
9
|
+
const responseData = createOAuthChallengeResponseCore(tokenCheck);
|
|
10
|
+
if (!responseData) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
// Apply the response data to Node.js ServerResponse
|
|
14
|
+
Object.entries(responseData.headers).forEach(([key, value]) => {
|
|
15
|
+
res.setHeader(key, value);
|
|
16
|
+
});
|
|
17
|
+
res.writeHead(responseData.status);
|
|
18
|
+
res.end(responseData.body);
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
function sendProtectedResourceMetadata(res, metadata) {
|
|
22
|
+
if (!metadata) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
res.setHeader('Content-Type', 'application/json');
|
|
26
|
+
res.writeHead(200);
|
|
27
|
+
res.end(JSON.stringify(metadata));
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
function sendOAuthMetadata(res, metadata) {
|
|
31
|
+
if (!metadata) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
res.setHeader('Content-Type', 'application/json');
|
|
35
|
+
res.writeHead(200);
|
|
36
|
+
res.end(JSON.stringify(metadata));
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export { sendOAuthChallenge, sendOAuthMetadata, sendProtectedResourceMetadata };
|
|
41
|
+
//# sourceMappingURL=oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sources":["../../src/node/oauth.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAKA;;;AAGG;AACG,SAAU,kBAAkB,CAAC,GAAmB,EAAE,UAAsB,EAAA;;AAE5E,IAAA,MAAM,YAAY,GAAG,gCAAgC,CAAC,UAAU,CAAC;IAEjE,IAAI,CAAC,YAAY,EAAE;AACjB,QAAA,OAAO,KAAK;IACd;;AAGA,IAAA,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;AAC5D,QAAA,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC;AAC3B,IAAA,CAAC,CAAC;AACF,IAAA,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC;AAClC,IAAA,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC;AAE1B,IAAA,OAAO,IAAI;AACb;AAEM,SAAU,6BAA6B,CAAC,GAAmB,EAAE,QAA0C,EAAA;IAC3G,IAAI,CAAC,QAAQ,EAAE;AACb,QAAA,OAAO,KAAK;IACd;AACA,IAAA,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC;AACjD,IAAA,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC;IAClB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AACjC,IAAA,OAAO,IAAI;AACb;AAEM,SAAU,iBAAiB,CAAC,GAAmB,EAAE,QAA0C,EAAA;IAC/F,IAAI,CAAC,QAAQ,EAAE;AACb,QAAA,OAAO,KAAK;IACd;AACA,IAAA,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC;AACjD,IAAA,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC;IAClB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AACjC,IAAA,OAAO,IAAI;AACb;;;;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { checkTokenCore } from '../core/token.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Node.js HTTP implementation of token checking
|
|
5
|
+
* Extracts data from Node.js IncomingMessage and delegates to core logic
|
|
6
|
+
*/
|
|
7
|
+
async function checkToken(config, resourceURL, req) {
|
|
8
|
+
// Extract the authorization header from Node.js request
|
|
9
|
+
const authorizationHeader = req.headers.authorization || null;
|
|
10
|
+
// Use the shared core logic
|
|
11
|
+
return checkTokenCore(config, resourceURL, authorizationHeader);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export { checkToken };
|
|
15
|
+
//# sourceMappingURL=token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token.js","sources":["../../src/node/token.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAIA;;;AAGG;AACI,eAAe,UAAU,CAAC,MAAkB,EAAE,WAAgB,EAAE,GAAoB,EAAA;;IAEzF,MAAM,mBAAmB,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,IAAI;;IAG7D,OAAO,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,mBAAmB,CAAC;AACjE;;;;"}
|
package/dist/oAuthMetadata.js
CHANGED
|
@@ -1,14 +1,6 @@
|
|
|
1
|
-
import { getPath } from
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
return false;
|
|
5
|
-
}
|
|
6
|
-
res.setHeader('Content-Type', 'application/json');
|
|
7
|
-
res.writeHead(200);
|
|
8
|
-
res.end(JSON.stringify(metadata));
|
|
9
|
-
return true;
|
|
10
|
-
}
|
|
11
|
-
export async function getOAuthMetadata(config, requestUrl) {
|
|
1
|
+
import { getPath } from './getResource.js';
|
|
2
|
+
|
|
3
|
+
async function getOAuthMetadata(config, requestUrl) {
|
|
12
4
|
if (isOAuthMetadataRequest(config, requestUrl)) {
|
|
13
5
|
try {
|
|
14
6
|
const authServer = await config.oAuthClient.authorizationServerFromUrl(new URL(config.server));
|
|
@@ -38,4 +30,6 @@ function isOAuthMetadataRequest(config, requestUrl) {
|
|
|
38
30
|
const path = getPath(requestUrl).replace(/\/$/, '');
|
|
39
31
|
return path === '/.well-known/oauth-authorization-server';
|
|
40
32
|
}
|
|
41
|
-
|
|
33
|
+
|
|
34
|
+
export { getOAuthMetadata };
|
|
35
|
+
//# sourceMappingURL=oAuthMetadata.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oAuthMetadata.js","
|
|
1
|
+
{"version":3,"file":"oAuthMetadata.js","sources":["../src/oAuthMetadata.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAIO,eAAe,gBAAgB,CAAC,MAAkB,EAAE,UAAe,EAAA;AACxE,IAAA,IAAI,sBAAsB,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE;AAC9C,QAAA,IAAI;AACF,YAAA,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,0BAA0B,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAE9F,OAAO;gBACL,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,sBAAsB,EAAE,UAAU,CAAC,sBAAsB;gBACzD,wBAAwB,EAAE,UAAU,CAAC,wBAAwB;gBAC7D,qBAAqB,EAAE,UAAU,CAAC,qBAAqB;gBACvD,cAAc,EAAE,UAAU,CAAC,cAAc;gBACzC,qCAAqC,EAAE,UAAU,CAAC,qCAAqC;gBACvF,qBAAqB,EAAE,UAAU,CAAC,qBAAqB;gBACvD,mBAAmB,EAAE,UAAU,CAAC,mBAAmB;gBACnD,sBAAsB,EAAE,UAAU,CAAC,sBAAsB;gBACzD,6CAA6C,EAAE,UAAU,CAAC,6CAA6C;gBACvG,gCAAgC,EAAE,UAAU,CAAC,gCAAgC;gBAC7E,gBAAgB,EAAE,UAAU,CAAC;aAC9B;QACH;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,uDAAA,EAA0D,MAAM,CAAC,MAAM,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAC;AACxG,YAAA,MAAM,KAAK;QACb;IACF;AACA,IAAA,OAAO,IAAI;AACb;AAEA,SAAS,sBAAsB,CAAC,MAAkB,EAAE,UAAe,EAAA;AACjE,IAAA,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IACnD,OAAO,IAAI,KAAK,yCAAyC;AAC3D;;;;"}
|
package/dist/paymentServer.js
CHANGED
|
@@ -3,25 +3,17 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This class handles payment operations with the ATXP authorization server.
|
|
5
5
|
*
|
|
6
|
-
* **Required Environment Variable:**
|
|
7
|
-
* - `ATXP_AUTH_CLIENT_TOKEN`: Authentication token for the ATXP authorization server.
|
|
8
|
-
* This token is used to authenticate API calls to the ATXP server for payment operations.
|
|
9
|
-
* Must be set when using this class, otherwise an error will be thrown.
|
|
10
|
-
*
|
|
11
6
|
* @example
|
|
12
7
|
* ```typescript
|
|
13
|
-
* // Ensure ATXP_AUTH_CLIENT_TOKEN is set in your environment
|
|
14
8
|
* const paymentServer = new ATXPPaymentServer(
|
|
15
9
|
* 'https://auth.atxp.ai',
|
|
16
|
-
* oAuthDb,
|
|
17
10
|
* logger
|
|
18
11
|
* );
|
|
19
12
|
* ```
|
|
20
13
|
*/
|
|
21
|
-
|
|
22
|
-
constructor(server,
|
|
14
|
+
class ATXPPaymentServer {
|
|
15
|
+
constructor(server, logger, fetchFn = fetch) {
|
|
23
16
|
this.server = server;
|
|
24
|
-
this.authCredentials = authCredentials;
|
|
25
17
|
this.logger = logger;
|
|
26
18
|
this.fetchFn = fetchFn;
|
|
27
19
|
this.charge = async ({ source, destination, network, currency, amount }) => {
|
|
@@ -57,18 +49,13 @@ export class ATXPPaymentServer {
|
|
|
57
49
|
/**
|
|
58
50
|
* Makes authenticated requests to the ATXP authorization server
|
|
59
51
|
*
|
|
60
|
-
* This method automatically includes the `ATXP_AUTH_CLIENT_TOKEN` from environment variables
|
|
61
|
-
* in the Authorization header for all requests.
|
|
62
|
-
*
|
|
63
52
|
* @param method - HTTP method ('GET' or 'POST')
|
|
64
53
|
* @param path - API endpoint path
|
|
65
54
|
* @param body - Request body (for POST requests)
|
|
66
55
|
* @returns Promise<Response> - The HTTP response from the server
|
|
67
|
-
* @throws {Error} When `ATXP_AUTH_CLIENT_TOKEN` environment variable is not set
|
|
68
56
|
*
|
|
69
57
|
* @example
|
|
70
58
|
* ```typescript
|
|
71
|
-
* // Ensure ATXP_AUTH_CLIENT_TOKEN is set in your environment
|
|
72
59
|
* const response = await paymentServer.makeRequest('POST', '/charge', {
|
|
73
60
|
* source: 'user123',
|
|
74
61
|
* destination: 'merchant456',
|
|
@@ -81,16 +68,14 @@ export class ATXPPaymentServer {
|
|
|
81
68
|
const response = await this.fetchFn(url, {
|
|
82
69
|
method,
|
|
83
70
|
headers: {
|
|
84
|
-
'Authorization': `Bearer ${this.authCredentials}`,
|
|
85
71
|
'Content-Type': 'application/json'
|
|
86
72
|
},
|
|
87
73
|
body: JSON.stringify(body)
|
|
88
74
|
});
|
|
89
75
|
return response;
|
|
90
76
|
};
|
|
91
|
-
if (!authCredentials || authCredentials.trim() === '') {
|
|
92
|
-
throw new Error('Auth credentials are required');
|
|
93
|
-
}
|
|
94
77
|
}
|
|
95
78
|
}
|
|
96
|
-
|
|
79
|
+
|
|
80
|
+
export { ATXPPaymentServer };
|
|
81
|
+
//# sourceMappingURL=paymentServer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paymentServer.js","
|
|
1
|
+
{"version":3,"file":"paymentServer.js","sources":["../src/paymentServer.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
res.setHeader('Content-Type', 'application/json');
|
|
7
|
-
res.writeHead(200);
|
|
8
|
-
res.end(JSON.stringify(metadata));
|
|
9
|
-
return true;
|
|
10
|
-
}
|
|
11
|
-
export function getProtectedResourceMetadata(config, requestUrl) {
|
|
12
|
-
if (isProtectedResourceMetadataRequest(config, requestUrl)) {
|
|
13
|
-
const resource = getResource(config, requestUrl);
|
|
1
|
+
import { getResource, getPath } from './getResource.js';
|
|
2
|
+
|
|
3
|
+
function getProtectedResourceMetadata(config, requestUrl, headers) {
|
|
4
|
+
if (isProtectedResourceMetadataRequest(config, requestUrl, headers)) {
|
|
5
|
+
const resource = getResource(config, requestUrl, headers);
|
|
14
6
|
return {
|
|
15
7
|
resource,
|
|
16
8
|
resource_name: config.payeeName || resource.toString(),
|
|
@@ -21,12 +13,12 @@ export function getProtectedResourceMetadata(config, requestUrl) {
|
|
|
21
13
|
}
|
|
22
14
|
return null;
|
|
23
15
|
}
|
|
24
|
-
function isProtectedResourceMetadataRequest(config, requestUrl) {
|
|
16
|
+
function isProtectedResourceMetadataRequest(config, requestUrl, headers) {
|
|
25
17
|
const path = getPath(requestUrl);
|
|
26
18
|
if (!path.startsWith('/.well-known/oauth-protected-resource')) {
|
|
27
19
|
return false;
|
|
28
20
|
}
|
|
29
|
-
const resource = getResource(config, requestUrl);
|
|
21
|
+
const resource = getResource(config, requestUrl, headers);
|
|
30
22
|
const resourcePath = getPath(resource);
|
|
31
23
|
const mountPath = config.mountPath.replace(/\/$/, '');
|
|
32
24
|
if (resourcePath === mountPath) {
|
|
@@ -37,4 +29,6 @@ function isProtectedResourceMetadataRequest(config, requestUrl) {
|
|
|
37
29
|
}
|
|
38
30
|
return false;
|
|
39
31
|
}
|
|
40
|
-
|
|
32
|
+
|
|
33
|
+
export { getProtectedResourceMetadata };
|
|
34
|
+
//# sourceMappingURL=protectedResourceMetadata.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protectedResourceMetadata.js","
|
|
1
|
+
{"version":3,"file":"protectedResourceMetadata.js","sources":["../src/protectedResourceMetadata.ts"],"sourcesContent":[null],"names":[],"mappings":";;SAGgB,4BAA4B,CAAC,MAAkB,EAAE,UAAe,EAAE,OAAuD,EAAA;IACvI,IAAI,kCAAkC,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE;QACnE,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC;QACzD,OAAO;YACL,QAAQ;YACR,aAAa,EAAE,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC,QAAQ,EAAE;AACtD,YAAA,qBAAqB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;YACtC,wBAAwB,EAAE,CAAC,QAAQ,CAAC;AACpC,YAAA,gBAAgB,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;SACpC;IACH;AACA,IAAA,OAAO,IAAI;AACb;AAEA,SAAS,kCAAkC,CAAC,MAAkB,EAAE,UAAe,EAAE,OAAuD,EAAA;AACtI,IAAA,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC;IAChC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,uCAAuC,CAAC,EAAE;AAC7D,QAAA,OAAO,KAAK;IACd;IACA,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC;AACzD,IAAA,MAAM,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC;AACtC,IAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AACrD,IAAA,IAAI,YAAY,KAAK,SAAS,EAAE;AAC9B,QAAA,OAAO,IAAI;IACb;AACA,IAAA,IAAI,YAAY,KAAK,CAAA,EAAG,SAAS,CAAA,QAAA,CAAU,EAAE;AAC3C,QAAA,OAAO,IAAI;IACb;AACA,IAAA,OAAO,KAAK;AACd;;;;"}
|
package/dist/requirePayment.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { paymentRequiredError } from
|
|
2
|
-
import { getATXPConfig, atxpAccountId } from
|
|
3
|
-
|
|
1
|
+
import { paymentRequiredError } from '@atxp/common';
|
|
2
|
+
import { getATXPConfig, atxpAccountId } from './atxpContext.js';
|
|
3
|
+
|
|
4
|
+
async function requirePayment(paymentConfig) {
|
|
4
5
|
const config = getATXPConfig();
|
|
5
6
|
if (!config) {
|
|
6
7
|
throw new Error('No config found');
|
|
@@ -33,4 +34,6 @@ export async function requirePayment(paymentConfig) {
|
|
|
33
34
|
config.logger.info(`Created payment request ${paymentId}`);
|
|
34
35
|
throw paymentRequiredError(config.server, paymentId, charge.amount);
|
|
35
36
|
}
|
|
36
|
-
|
|
37
|
+
|
|
38
|
+
export { requirePayment };
|
|
39
|
+
//# sourceMappingURL=requirePayment.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requirePayment.js","
|
|
1
|
+
{"version":3,"file":"requirePayment.js","sources":["../src/requirePayment.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAGO,eAAe,cAAc,CAAC,aAAmC,EAAA;AACtE,IAAA,MAAM,MAAM,GAAG,aAAa,EAAE;IAC9B,IAAI,CAAC,MAAM,EAAE;AACX,QAAA,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC;IACpC;AACA,IAAA,MAAM,IAAI,GAAG,aAAa,EAAE;IAC5B,IAAI,CAAC,IAAI,EAAE;AACT,QAAA,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC;AACpC,QAAA,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC;IAClC;AAEA,IAAA,MAAM,MAAM,GAAG;QACb,MAAM,EAAE,aAAa,CAAC,KAAK;QAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,WAAW,EAAE,MAAM,CAAC,WAAW;AAC/B,QAAA,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B;AAED,IAAA,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA,gBAAA,EAAmB,MAAM,CAAC,MAAM,iBAAiB,MAAM,CAAC,WAAW,CAAA,SAAA,EAAY,MAAM,CAAC,MAAM,CAAA,CAAE,CAAC;IACnH,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC;AAChE,IAAA,IAAI,cAAc,CAAC,OAAO,EAAE;AAC1B,QAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,QAAA,EAAW,MAAM,CAAC,MAAM,eAAe,MAAM,CAAC,MAAM,CAAA,CAAE,CAAC;QAC1E;IACF;IAEA,MAAM,iBAAiB,GAAG,MAAM,aAAa,CAAC,oBAAoB,IAAI;IACtE,IAAI,iBAAiB,EAAE;QACrB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,0BAAA,EAA6B,iBAAiB,CAAA,CAAE,CAAC;AACpE,QAAA,MAAM,oBAAoB,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,CAAC,MAAM,CAAC;IAC7E;IAEA,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,oBAAoB,CAAC,MAAM,CAAC;IACzE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA,wBAAA,EAA2B,SAAS,CAAA,CAAE,CAAC;AAC1D,IAAA,MAAM,oBAAoB,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC;AACrE;;;;"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { DEFAULT_AUTHORIZATION_SERVER, MemoryOAuthDb, OAuthResourceClient, ConsoleLogger } from '@atxp/common';
|
|
2
|
+
import { ATXPPaymentServer } from './paymentServer.js';
|
|
3
|
+
|
|
4
|
+
const DEFAULT_CONFIG = {
|
|
5
|
+
mountPath: '/',
|
|
6
|
+
currency: 'USDC',
|
|
7
|
+
network: 'base',
|
|
8
|
+
server: DEFAULT_AUTHORIZATION_SERVER,
|
|
9
|
+
payeeName: 'An ATXP Server',
|
|
10
|
+
allowHttp: false, // May be overridden in buildServerConfig by process.env.NODE_ENV
|
|
11
|
+
resource: null, // Set dynamically from the request URL
|
|
12
|
+
};
|
|
13
|
+
function buildServerConfig(args) {
|
|
14
|
+
if (!args.destination) {
|
|
15
|
+
throw new Error('destination is required');
|
|
16
|
+
}
|
|
17
|
+
// Read environment variables at runtime, not module load time
|
|
18
|
+
const envDefaults = {
|
|
19
|
+
...DEFAULT_CONFIG,
|
|
20
|
+
atxpAuthClientToken: process.env.ATXP_AUTH_CLIENT_TOKEN,
|
|
21
|
+
allowHttp: process.env.NODE_ENV === 'development',
|
|
22
|
+
};
|
|
23
|
+
const withDefaults = { ...envDefaults, ...args };
|
|
24
|
+
const oAuthDb = withDefaults.oAuthDb ?? new MemoryOAuthDb();
|
|
25
|
+
const oAuthClient = withDefaults.oAuthClient ?? new OAuthResourceClient({
|
|
26
|
+
db: oAuthDb,
|
|
27
|
+
allowInsecureRequests: withDefaults.allowHttp,
|
|
28
|
+
clientName: withDefaults.payeeName,
|
|
29
|
+
});
|
|
30
|
+
const logger = withDefaults.logger ?? new ConsoleLogger();
|
|
31
|
+
const paymentServer = withDefaults.paymentServer ?? new ATXPPaymentServer(withDefaults.server, logger);
|
|
32
|
+
const built = { oAuthDb, oAuthClient, paymentServer, logger };
|
|
33
|
+
return Object.freeze({ ...withDefaults, ...built });
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export { DEFAULT_CONFIG, buildServerConfig };
|
|
37
|
+
//# sourceMappingURL=serverConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serverConfig.js","sources":["../src/serverConfig.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAUO,MAAM,cAAc,GAAkE;AAC3F,IAAA,SAAS,EAAE,GAAG;AACd,IAAA,QAAQ,EAAE,MAAe;AACzB,IAAA,OAAO,EAAE,MAAe;AACxB,IAAA,MAAM,EAAE,4BAA4B;AACpC,IAAA,SAAS,EAAE,gBAAgB;IAC3B,SAAS,EAAE,KAAK;IAChB,QAAQ,EAAE,IAAI;;AAGV,SAAU,iBAAiB,CAAC,IAAc,EAAA;AAC9C,IAAA,IAAG,CAAC,IAAI,CAAC,WAAW,EAAE;AACpB,QAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC;IAC5C;;AAGA,IAAA,MAAM,WAAW,GAAG;AAClB,QAAA,GAAG,cAAc;AACjB,QAAA,mBAAmB,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB;AACvD,QAAA,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa;KAClD;IACD,MAAM,YAAY,GAAG,EAAE,GAAG,WAAW,EAAE,GAAG,IAAI,EAAE;IAChD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,IAAI,IAAI,aAAa,EAAE;IAC3D,MAAM,WAAW,GAAG,YAAY,CAAC,WAAW,IAAI,IAAI,mBAAmB,CAAC;AACtE,QAAA,EAAE,EAAE,OAAO;QACX,qBAAqB,EAAE,YAAY,CAAC,SAAS;QAC7C,UAAU,EAAE,YAAY,CAAC,SAAS;AACnC,KAAA,CAAC;IACF,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,IAAI,IAAI,aAAa,EAAE;AACzD,IAAA,MAAM,aAAa,GAAG,YAAY,CAAC,aAAa,IAAI,IAAI,iBAAiB,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC;IAEtG,MAAM,KAAK,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,EAAC;AAC5D,IAAA,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,YAAY,EAAE,GAAG,KAAK,EAAE,CAAC;AACrD;;;;"}
|
|
@@ -1,55 +1,104 @@
|
|
|
1
|
+
import * as vitest from 'vitest';
|
|
1
2
|
import { IncomingHttpHeaders, IncomingMessage, ServerResponse } from 'http';
|
|
2
3
|
import { JSONRPCRequest } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
-
import {
|
|
4
|
-
import { Charge, ATXPConfig, TokenCheck, TokenProblem, McpMethod, McpName, PaymentServer } from './types.js';
|
|
4
|
+
import { PaymentRequestData, Currency, Network, AuthorizationServerUrl, UrlString, Logger, OAuthDb, OAuthResourceClient, TokenData } from '@atxp/common';
|
|
5
5
|
import * as oauth from 'oauth4webapi';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
|
|
7
|
+
type McpMethod = 'notifications/cancelled' | 'initialize' | 'ping' | 'notifications/progress' | 'resources/list' | 'resources/templates/list' | 'resources/read' | 'notifications/resources/list_changed' | 'resources/subscribe' | 'resources/unsubscribe' | 'notifications/resources/updated' | 'prompts/list' | 'prompts/get' | 'notifications/prompts/list_changed' | 'tools/list' | 'tools/call' | 'notifications/tools/list_changed' | 'logging/setLevel' | 'notifications/message' | 'sampling/createMessage' | 'elicitation/create' | 'completion/complete' | 'roots/list' | 'notifications/roots/list_changed';
|
|
8
|
+
type McpName = string;
|
|
9
|
+
type Charge = Omit<PaymentRequestData, 'resource' | 'resourceName' | 'iss'>;
|
|
10
|
+
type ChargeResponse = {
|
|
11
|
+
success: boolean;
|
|
12
|
+
requiredPayment: PaymentRequestData | null;
|
|
13
|
+
};
|
|
14
|
+
type PaymentServer = {
|
|
15
|
+
charge: (args: Charge) => Promise<ChargeResponse>;
|
|
16
|
+
createPaymentRequest: (args: Charge) => Promise<string>;
|
|
17
|
+
};
|
|
18
|
+
type ATXPConfig = {
|
|
19
|
+
destination: string;
|
|
20
|
+
mountPath: string;
|
|
21
|
+
currency: Currency;
|
|
22
|
+
network: Network;
|
|
23
|
+
server: AuthorizationServerUrl;
|
|
24
|
+
payeeName: string;
|
|
25
|
+
resource: UrlString | null;
|
|
26
|
+
allowHttp: boolean;
|
|
27
|
+
logger: Logger;
|
|
28
|
+
oAuthDb: OAuthDb;
|
|
29
|
+
oAuthClient: OAuthResourceClient;
|
|
30
|
+
paymentServer: PaymentServer;
|
|
31
|
+
};
|
|
32
|
+
declare enum TokenProblem {
|
|
33
|
+
NO_TOKEN = "NO-TOKEN",
|
|
34
|
+
NON_BEARER_AUTH_HEADER = "NON-BEARER-AUTH-HEADER",
|
|
35
|
+
INVALID_TOKEN = "INVALID-TOKEN",
|
|
36
|
+
INVALID_AUDIENCE = "INVALID-AUDIENCE",
|
|
37
|
+
NON_SUFFICIENT_FUNDS = "NON-SUFFICIENT-FUNDS",
|
|
38
|
+
INTROSPECT_ERROR = "INTROSPECT-ERROR"
|
|
39
|
+
}
|
|
40
|
+
type TokenCheckPass = {
|
|
41
|
+
passes: true;
|
|
42
|
+
token: string;
|
|
43
|
+
data: TokenData;
|
|
44
|
+
};
|
|
45
|
+
type TokenCheckFail = {
|
|
46
|
+
passes: false;
|
|
47
|
+
problem: TokenProblem;
|
|
48
|
+
token: string | null;
|
|
49
|
+
data: TokenData | null;
|
|
50
|
+
resourceMetadataUrl: string | null;
|
|
51
|
+
};
|
|
52
|
+
type TokenCheck = TokenCheckPass | TokenCheckFail;
|
|
53
|
+
|
|
54
|
+
declare const DESTINATION = "testDestination";
|
|
55
|
+
declare const SOURCE = "testSource";
|
|
56
|
+
declare function charge({ amount, currency, network, destination, source }?: {
|
|
9
57
|
amount?: BigNumber;
|
|
10
58
|
currency?: Currency;
|
|
11
59
|
network?: Network;
|
|
12
60
|
destination?: string;
|
|
13
61
|
source?: string;
|
|
14
62
|
}): Charge;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
charge?:
|
|
21
|
-
createPaymentRequest?:
|
|
63
|
+
declare const oneCentCharge: Charge;
|
|
64
|
+
declare const zeroCharge: Charge;
|
|
65
|
+
declare function logger(): Logger;
|
|
66
|
+
declare function config(args?: Partial<ATXPConfig>): ATXPConfig;
|
|
67
|
+
declare function paymentServer({ charge, createPaymentRequest }?: {
|
|
68
|
+
charge?: vitest.Mock<(...args: any[]) => any> | undefined;
|
|
69
|
+
createPaymentRequest?: vitest.Mock<(...args: any[]) => any> | undefined;
|
|
22
70
|
}): PaymentServer;
|
|
23
|
-
|
|
71
|
+
declare function mcpRequest({ method, params, id }?: {
|
|
24
72
|
method?: McpMethod;
|
|
25
73
|
params?: any;
|
|
26
74
|
id?: string;
|
|
27
75
|
}): JSONRPCRequest;
|
|
28
|
-
|
|
76
|
+
declare function mcpToolRequest({ toolName, args, }?: {
|
|
29
77
|
toolName?: McpName;
|
|
30
78
|
args?: any;
|
|
31
79
|
}): JSONRPCRequest;
|
|
32
|
-
|
|
80
|
+
declare function incomingMessage({ body, method, url, headers }?: {
|
|
33
81
|
body?: any;
|
|
34
82
|
method?: 'POST' | 'GET' | 'PUT' | 'DELETE' | 'PATCH' | 'OPTIONS';
|
|
35
83
|
url?: string;
|
|
36
84
|
headers?: IncomingHttpHeaders;
|
|
37
85
|
}): IncomingMessage;
|
|
38
|
-
|
|
86
|
+
declare function incomingToolMessage({ authHeader, url, }?: {
|
|
39
87
|
authHeader?: string;
|
|
40
88
|
url?: string;
|
|
41
89
|
}): IncomingMessage;
|
|
42
|
-
|
|
90
|
+
declare function oAuthClient({ introspectResult, authorizationServer }?: {
|
|
43
91
|
introspectResult?: TokenData;
|
|
44
92
|
authorizationServer?: oauth.AuthorizationServer;
|
|
45
93
|
}): OAuthResourceClient;
|
|
46
|
-
|
|
47
|
-
|
|
94
|
+
declare function tokenData({ active, sub, scope, aud }?: Partial<TokenData>): TokenData;
|
|
95
|
+
declare function tokenCheck({ data, token, passes, problem, resourceMetadataUrl }?: {
|
|
48
96
|
data?: TokenData;
|
|
49
97
|
token?: string | null;
|
|
50
98
|
passes?: boolean;
|
|
51
99
|
problem?: TokenProblem;
|
|
52
100
|
resourceMetadataUrl?: string;
|
|
53
101
|
}): TokenCheck;
|
|
54
|
-
|
|
55
|
-
|
|
102
|
+
declare function serverResponse(): ServerResponse;
|
|
103
|
+
|
|
104
|
+
export { DESTINATION, SOURCE, charge, config, incomingMessage, incomingToolMessage, logger, mcpRequest, mcpToolRequest, oAuthClient, oneCentCharge, paymentServer, serverResponse, tokenCheck, tokenData, zeroCharge };
|