@lerianstudio/matcher-mcp 1.0.0-beta.5

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.
Files changed (220) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +281 -0
  3. package/dist/auth/request-token.js +117 -0
  4. package/dist/auth/request-token.js.map +1 -0
  5. package/dist/config.js +95 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/matcher/client.js +168 -0
  8. package/dist/matcher/client.js.map +1 -0
  9. package/dist/observability/otel.js +223 -0
  10. package/dist/observability/otel.js.map +1 -0
  11. package/dist/server.js +245 -0
  12. package/dist/server.js.map +1 -0
  13. package/dist/spec/curated-operations.js +145 -0
  14. package/dist/spec/curated-operations.js.map +1 -0
  15. package/dist/spec/index.js +155 -0
  16. package/dist/spec/index.js.map +1 -0
  17. package/dist/spec/load.js +76 -0
  18. package/dist/spec/load.js.map +1 -0
  19. package/dist/spec/openapi.yaml +15217 -0
  20. package/dist/tools/context/create.js +100 -0
  21. package/dist/tools/context/create.js.map +1 -0
  22. package/dist/tools/context/get.js +31 -0
  23. package/dist/tools/context/get.js.map +1 -0
  24. package/dist/tools/context/index.js +21 -0
  25. package/dist/tools/context/index.js.map +1 -0
  26. package/dist/tools/context/list.js +78 -0
  27. package/dist/tools/context/list.js.map +1 -0
  28. package/dist/tools/context/shared.js +61 -0
  29. package/dist/tools/context/shared.js.map +1 -0
  30. package/dist/tools/context/update.js +105 -0
  31. package/dist/tools/context/update.js.map +1 -0
  32. package/dist/tools/dashboard/aggregates.js +34 -0
  33. package/dist/tools/dashboard/aggregates.js.map +1 -0
  34. package/dist/tools/dashboard/cash-impact.js +36 -0
  35. package/dist/tools/dashboard/cash-impact.js.map +1 -0
  36. package/dist/tools/dashboard/index.js +27 -0
  37. package/dist/tools/dashboard/index.js.map +1 -0
  38. package/dist/tools/dashboard/match-rate.js +35 -0
  39. package/dist/tools/dashboard/match-rate.js.map +1 -0
  40. package/dist/tools/dashboard/metrics.js +36 -0
  41. package/dist/tools/dashboard/metrics.js.map +1 -0
  42. package/dist/tools/dashboard/shared.js +122 -0
  43. package/dist/tools/dashboard/shared.js.map +1 -0
  44. package/dist/tools/dashboard/sla.js +33 -0
  45. package/dist/tools/dashboard/sla.js.map +1 -0
  46. package/dist/tools/dashboard/source-breakdown.js +36 -0
  47. package/dist/tools/dashboard/source-breakdown.js.map +1 -0
  48. package/dist/tools/dashboard/volume.js +35 -0
  49. package/dist/tools/dashboard/volume.js.map +1 -0
  50. package/dist/tools/dispute/close.js +49 -0
  51. package/dist/tools/dispute/close.js.map +1 -0
  52. package/dist/tools/dispute/get.js +27 -0
  53. package/dist/tools/dispute/get.js.map +1 -0
  54. package/dist/tools/dispute/index.js +17 -0
  55. package/dist/tools/dispute/index.js.map +1 -0
  56. package/dist/tools/dispute/list.js +137 -0
  57. package/dist/tools/dispute/list.js.map +1 -0
  58. package/dist/tools/dispute/shared.js +66 -0
  59. package/dist/tools/dispute/shared.js.map +1 -0
  60. package/dist/tools/dispute/submit-evidence.js +58 -0
  61. package/dist/tools/dispute/submit-evidence.js.map +1 -0
  62. package/dist/tools/exception/add-comment.js +50 -0
  63. package/dist/tools/exception/add-comment.js.map +1 -0
  64. package/dist/tools/exception/adjust-entry.js +71 -0
  65. package/dist/tools/exception/adjust-entry.js.map +1 -0
  66. package/dist/tools/exception/bulk-assign.js +47 -0
  67. package/dist/tools/exception/bulk-assign.js.map +1 -0
  68. package/dist/tools/exception/bulk-dispatch.js +69 -0
  69. package/dist/tools/exception/bulk-dispatch.js.map +1 -0
  70. package/dist/tools/exception/bulk-resolve.js +64 -0
  71. package/dist/tools/exception/bulk-resolve.js.map +1 -0
  72. package/dist/tools/exception/delete-comment.js +40 -0
  73. package/dist/tools/exception/delete-comment.js.map +1 -0
  74. package/dist/tools/exception/dispatch.js +64 -0
  75. package/dist/tools/exception/dispatch.js.map +1 -0
  76. package/dist/tools/exception/force-match.js +55 -0
  77. package/dist/tools/exception/force-match.js.map +1 -0
  78. package/dist/tools/exception/get.js +34 -0
  79. package/dist/tools/exception/get.js.map +1 -0
  80. package/dist/tools/exception/history.js +61 -0
  81. package/dist/tools/exception/history.js.map +1 -0
  82. package/dist/tools/exception/index.js +39 -0
  83. package/dist/tools/exception/index.js.map +1 -0
  84. package/dist/tools/exception/list-comments.js +35 -0
  85. package/dist/tools/exception/list-comments.js.map +1 -0
  86. package/dist/tools/exception/list.js +169 -0
  87. package/dist/tools/exception/list.js.map +1 -0
  88. package/dist/tools/exception/open-dispute.js +53 -0
  89. package/dist/tools/exception/open-dispute.js.map +1 -0
  90. package/dist/tools/exception/shared.js +98 -0
  91. package/dist/tools/exception/shared.js.map +1 -0
  92. package/dist/tools/fee-rule/create.js +106 -0
  93. package/dist/tools/fee-rule/create.js.map +1 -0
  94. package/dist/tools/fee-rule/delete.js +27 -0
  95. package/dist/tools/fee-rule/delete.js.map +1 -0
  96. package/dist/tools/fee-rule/get.js +27 -0
  97. package/dist/tools/fee-rule/get.js.map +1 -0
  98. package/dist/tools/fee-rule/index.js +21 -0
  99. package/dist/tools/fee-rule/index.js.map +1 -0
  100. package/dist/tools/fee-rule/list.js +64 -0
  101. package/dist/tools/fee-rule/list.js.map +1 -0
  102. package/dist/tools/fee-rule/shared.js +67 -0
  103. package/dist/tools/fee-rule/shared.js.map +1 -0
  104. package/dist/tools/fee-rule/update.js +70 -0
  105. package/dist/tools/fee-rule/update.js.map +1 -0
  106. package/dist/tools/fee-schedule/create.js +105 -0
  107. package/dist/tools/fee-schedule/create.js.map +1 -0
  108. package/dist/tools/fee-schedule/delete.js +32 -0
  109. package/dist/tools/fee-schedule/delete.js.map +1 -0
  110. package/dist/tools/fee-schedule/get.js +30 -0
  111. package/dist/tools/fee-schedule/get.js.map +1 -0
  112. package/dist/tools/fee-schedule/index.js +22 -0
  113. package/dist/tools/fee-schedule/index.js.map +1 -0
  114. package/dist/tools/fee-schedule/list.js +56 -0
  115. package/dist/tools/fee-schedule/list.js.map +1 -0
  116. package/dist/tools/fee-schedule/shared.js +58 -0
  117. package/dist/tools/fee-schedule/shared.js.map +1 -0
  118. package/dist/tools/fee-schedule/simulate.js +54 -0
  119. package/dist/tools/fee-schedule/simulate.js.map +1 -0
  120. package/dist/tools/fee-schedule/update.js +69 -0
  121. package/dist/tools/fee-schedule/update.js.map +1 -0
  122. package/dist/tools/generic/describe-operation.js +157 -0
  123. package/dist/tools/generic/describe-operation.js.map +1 -0
  124. package/dist/tools/generic/invoke.js +343 -0
  125. package/dist/tools/generic/invoke.js.map +1 -0
  126. package/dist/tools/generic/list-operations.js +73 -0
  127. package/dist/tools/generic/list-operations.js.map +1 -0
  128. package/dist/tools/ingestion/index.js +29 -0
  129. package/dist/tools/ingestion/index.js.map +1 -0
  130. package/dist/tools/ingestion/job-errors-list.js +45 -0
  131. package/dist/tools/ingestion/job-errors-list.js.map +1 -0
  132. package/dist/tools/ingestion/job-get.js +42 -0
  133. package/dist/tools/ingestion/job-get.js.map +1 -0
  134. package/dist/tools/ingestion/job-transactions-list.js +93 -0
  135. package/dist/tools/ingestion/job-transactions-list.js.map +1 -0
  136. package/dist/tools/ingestion/jobs-list.js +89 -0
  137. package/dist/tools/ingestion/jobs-list.js.map +1 -0
  138. package/dist/tools/ingestion/shared.js +84 -0
  139. package/dist/tools/ingestion/shared.js.map +1 -0
  140. package/dist/tools/ingestion/transaction-ignore.js +51 -0
  141. package/dist/tools/ingestion/transaction-ignore.js.map +1 -0
  142. package/dist/tools/ingestion/transactions-search.js +143 -0
  143. package/dist/tools/ingestion/transactions-search.js.map +1 -0
  144. package/dist/tools/match-rule/create.js +64 -0
  145. package/dist/tools/match-rule/create.js.map +1 -0
  146. package/dist/tools/match-rule/delete.js +35 -0
  147. package/dist/tools/match-rule/delete.js.map +1 -0
  148. package/dist/tools/match-rule/get.js +32 -0
  149. package/dist/tools/match-rule/get.js.map +1 -0
  150. package/dist/tools/match-rule/index.js +22 -0
  151. package/dist/tools/match-rule/index.js.map +1 -0
  152. package/dist/tools/match-rule/list.js +72 -0
  153. package/dist/tools/match-rule/list.js.map +1 -0
  154. package/dist/tools/match-rule/reorder.js +45 -0
  155. package/dist/tools/match-rule/reorder.js.map +1 -0
  156. package/dist/tools/match-rule/shared.js +71 -0
  157. package/dist/tools/match-rule/shared.js.map +1 -0
  158. package/dist/tools/match-rule/update.js +68 -0
  159. package/dist/tools/match-rule/update.js.map +1 -0
  160. package/dist/tools/matching/get.js +48 -0
  161. package/dist/tools/matching/get.js.map +1 -0
  162. package/dist/tools/matching/groups.js +98 -0
  163. package/dist/tools/matching/groups.js.map +1 -0
  164. package/dist/tools/matching/index.js +19 -0
  165. package/dist/tools/matching/index.js.map +1 -0
  166. package/dist/tools/matching/list.js +76 -0
  167. package/dist/tools/matching/list.js.map +1 -0
  168. package/dist/tools/matching/shared.js +77 -0
  169. package/dist/tools/matching/shared.js.map +1 -0
  170. package/dist/tools/matching/start.js +55 -0
  171. package/dist/tools/matching/start.js.map +1 -0
  172. package/dist/tools/report/count-exceptions.js +45 -0
  173. package/dist/tools/report/count-exceptions.js.map +1 -0
  174. package/dist/tools/report/count-matched.js +46 -0
  175. package/dist/tools/report/count-matched.js.map +1 -0
  176. package/dist/tools/report/count-transactions.js +44 -0
  177. package/dist/tools/report/count-transactions.js.map +1 -0
  178. package/dist/tools/report/count-unmatched.js +44 -0
  179. package/dist/tools/report/count-unmatched.js.map +1 -0
  180. package/dist/tools/report/export-exceptions.js +46 -0
  181. package/dist/tools/report/export-exceptions.js.map +1 -0
  182. package/dist/tools/report/export-matched.js +47 -0
  183. package/dist/tools/report/export-matched.js.map +1 -0
  184. package/dist/tools/report/export-summary.js +47 -0
  185. package/dist/tools/report/export-summary.js.map +1 -0
  186. package/dist/tools/report/export-unmatched.js +47 -0
  187. package/dist/tools/report/export-unmatched.js.map +1 -0
  188. package/dist/tools/report/export-variance.js +46 -0
  189. package/dist/tools/report/export-variance.js.map +1 -0
  190. package/dist/tools/report/index.js +40 -0
  191. package/dist/tools/report/index.js.map +1 -0
  192. package/dist/tools/report/matched.js +44 -0
  193. package/dist/tools/report/matched.js.map +1 -0
  194. package/dist/tools/report/shared.js +176 -0
  195. package/dist/tools/report/shared.js.map +1 -0
  196. package/dist/tools/report/summary.js +41 -0
  197. package/dist/tools/report/summary.js.map +1 -0
  198. package/dist/tools/report/unmatched.js +44 -0
  199. package/dist/tools/report/unmatched.js.map +1 -0
  200. package/dist/tools/report/variance.js +44 -0
  201. package/dist/tools/report/variance.js.map +1 -0
  202. package/dist/tools/source/create.js +84 -0
  203. package/dist/tools/source/create.js.map +1 -0
  204. package/dist/tools/source/get.js +41 -0
  205. package/dist/tools/source/get.js.map +1 -0
  206. package/dist/tools/source/index.js +22 -0
  207. package/dist/tools/source/index.js.map +1 -0
  208. package/dist/tools/source/list.js +72 -0
  209. package/dist/tools/source/list.js.map +1 -0
  210. package/dist/tools/source/shared.js +63 -0
  211. package/dist/tools/source/shared.js.map +1 -0
  212. package/dist/tools/source/update.js +73 -0
  213. package/dist/tools/source/update.js.map +1 -0
  214. package/dist/tools/tool-error.js +74 -0
  215. package/dist/tools/tool-error.js.map +1 -0
  216. package/dist/transport/body-limit.js +82 -0
  217. package/dist/transport/body-limit.js.map +1 -0
  218. package/dist/transport/http.js +154 -0
  219. package/dist/transport/http.js.map +1 -0
  220. package/package.json +68 -0
@@ -0,0 +1,154 @@
1
+ // Streamable HTTP transport boundary for the Matcher MCP server.
2
+ //
3
+ // This module mounts the SDK's Streamable HTTP server transport on a plain
4
+ // Node HTTP server. It runs in the SDK's documented *stateless* mode
5
+ // (`sessionIdGenerator: undefined`): a fresh McpServer + transport is created
6
+ // per inbound POST /mcp request and torn down when the response completes.
7
+ // Statelessness is the right model for a credential relay — each request
8
+ // carries its own bearer token (task 1.1.3) and the server holds no per-client
9
+ // state between calls. We follow the SDK's stateless recipe rather than
10
+ // inventing a session model.
11
+ import { createServer } from 'node:http';
12
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
13
+ import { runWithBearerToken } from '../auth/request-token.js';
14
+ import { loadConfig } from '../config.js';
15
+ import { buildMcpServer } from '../server.js';
16
+ import { BodySizeGuard, BodyTooLargeError, HEADERS_TIMEOUT_MS, REQUEST_TIMEOUT_MS, } from './body-limit.js';
17
+ /** The conventional MCP protocol endpoint path. */
18
+ const MCP_PATH = '/mcp';
19
+ /** Liveness endpoint, separate from the MCP protocol (used by the container). */
20
+ const HEALTHZ_PATH = '/healthz';
21
+ /**
22
+ * Read the request body and return it as a string, bounded by `maxBodyBytes`.
23
+ * The SDK's Node transport can parse the body itself, but reading it here lets
24
+ * us pass a pre-parsed JSON body and keeps the handler in control of malformed
25
+ * input — and, critically, lets us cap an unbounded read.
26
+ *
27
+ * The size guard is checked BEFORE each chunk is retained, so an over-limit
28
+ * payload is rejected (via `BodyTooLargeError`) without ever buffering more than
29
+ * the limit (+ one chunk) of an attacker's body. The guard counts only bytes —
30
+ * it never inspects body content, headers, or any token.
31
+ */
32
+ async function readBody(req, maxBodyBytes) {
33
+ const guard = new BodySizeGuard(maxBodyBytes);
34
+ const chunks = [];
35
+ for await (const chunk of req) {
36
+ const buf = chunk;
37
+ // Throws BodyTooLargeError the moment the running total exceeds the limit,
38
+ // before the over-limit chunk is appended to memory.
39
+ guard.add(buf.length);
40
+ chunks.push(buf);
41
+ }
42
+ return Buffer.concat(chunks).toString('utf8');
43
+ }
44
+ /**
45
+ * Handle a single MCP protocol request in stateless mode: spin up a transport
46
+ * + server, connect, dispatch, and tear both down when the response finishes.
47
+ */
48
+ async function handleMcpRequest(info, config, req, res) {
49
+ // Read + bound the body BEFORE spinning up the transport/server, so an
50
+ // over-limit payload is rejected without allocating an McpServer for it.
51
+ let parsedBody;
52
+ if (req.method === 'POST') {
53
+ const raw = await readBody(req, config.maxBodyBytes);
54
+ parsedBody = raw.length > 0 ? JSON.parse(raw) : undefined;
55
+ }
56
+ const transport = new StreamableHTTPServerTransport({
57
+ // Stateless: no session id is issued or validated. Each request is
58
+ // self-contained — the SDK's documented stateless configuration.
59
+ sessionIdGenerator: undefined,
60
+ });
61
+ const server = buildMcpServer(info);
62
+ // Ensure both are released once the HTTP response is done, regardless of
63
+ // success or error path.
64
+ res.on('close', () => {
65
+ void transport.close();
66
+ void server.close();
67
+ });
68
+ await server.connect(transport);
69
+ await transport.handleRequest(req, res, parsedBody);
70
+ }
71
+ /**
72
+ * Build (but do not start) the Node HTTP server that routes /healthz and /mcp.
73
+ * Exposed separately from `start` so tests can drive a listener on an ephemeral
74
+ * port and close it deterministically.
75
+ *
76
+ * `config` is optional and defaults to `loadConfig()` so existing call sites
77
+ * (tests, `start`) keep working; it supplies `maxBodyBytes` for the inbound
78
+ * body-size guard. Server-level timeouts (`requestTimeout` / `headersTimeout`)
79
+ * are set on the returned server so a stuck or trickled request is shed.
80
+ */
81
+ export function createHttpServer(info, config = loadConfig()) {
82
+ const httpServer = createServer((req, res) => {
83
+ const url = req.url ?? '/';
84
+ const path = url.split('?', 1)[0];
85
+ if (req.method === 'GET' && path === HEALTHZ_PATH) {
86
+ res.writeHead(200, { 'Content-Type': 'text/plain' });
87
+ res.end('ok');
88
+ return;
89
+ }
90
+ if (path === MCP_PATH) {
91
+ // Seed the request-scoped auth store at the boundary so tool handlers can
92
+ // recover the caller's bearer token even when the SDK does not thread the
93
+ // raw Authorization header through `extra`. The header value is forwarded
94
+ // verbatim and never logged here (token-relay rule). `req.headers` lower-
95
+ // cases names, so `authorization` is the canonical key.
96
+ runWithBearerToken(req.headers.authorization, () => {
97
+ handleMcpRequest(info, config, req, res).catch((err) => {
98
+ // An over-limit body is a client fault: answer 413 (no token, no body
99
+ // content — BodyTooLargeError carries only byte counts).
100
+ if (err instanceof BodyTooLargeError) {
101
+ if (!res.headersSent) {
102
+ res.writeHead(err.status, { 'Content-Type': 'application/json' });
103
+ }
104
+ res.end(JSON.stringify({
105
+ jsonrpc: '2.0',
106
+ error: { code: -32600, message: 'request body too large' },
107
+ id: null,
108
+ }));
109
+ return;
110
+ }
111
+ // Never leak internals (and never a token) into the response body.
112
+ if (!res.headersSent) {
113
+ res.writeHead(500, { 'Content-Type': 'application/json' });
114
+ }
115
+ res.end(JSON.stringify({
116
+ jsonrpc: '2.0',
117
+ error: { code: -32603, message: 'internal server error' },
118
+ id: null,
119
+ }));
120
+ console.error('matcher-mcp request handling failed:', err);
121
+ });
122
+ });
123
+ return;
124
+ }
125
+ res.writeHead(404, { 'Content-Type': 'text/plain' });
126
+ res.end('not found');
127
+ });
128
+ // Shed stuck / Slowloris-style connections. headersTimeout must be < the
129
+ // overall requestTimeout (Node enforces this) so a header trickle is dropped
130
+ // well before the full-request budget.
131
+ httpServer.requestTimeout = REQUEST_TIMEOUT_MS;
132
+ httpServer.headersTimeout = HEADERS_TIMEOUT_MS;
133
+ return httpServer;
134
+ }
135
+ /**
136
+ * Start the MCP HTTP server listening on the configured port. Resolves once the
137
+ * listener is bound. The returned handle closes the listener gracefully.
138
+ */
139
+ export function start(config, info) {
140
+ const httpServer = createHttpServer(info, config);
141
+ return new Promise((resolve, reject) => {
142
+ httpServer.once('error', reject);
143
+ httpServer.listen(config.port, () => {
144
+ httpServer.removeListener('error', reject);
145
+ resolve({
146
+ httpServer,
147
+ close: () => new Promise((res, rej) => {
148
+ httpServer.close((err) => (err ? rej(err) : res()));
149
+ }),
150
+ });
151
+ });
152
+ });
153
+ }
154
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/transport/http.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,68 @@
1
+ {
2
+ "name": "@lerianstudio/matcher-mcp",
3
+ "version": "1.0.0-beta.5",
4
+ "type": "module",
5
+ "description": "Model Context Protocol server for the Matcher reconciliation engine",
6
+ "license": "Apache-2.0",
7
+ "author": "Lerian Studio",
8
+ "keywords": [
9
+ "model-context-protocol",
10
+ "mcp",
11
+ "matcher",
12
+ "reconciliation",
13
+ "mcp-server"
14
+ ],
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/LerianStudio/matcher.git",
18
+ "directory": "mcp"
19
+ },
20
+ "homepage": "https://github.com/LerianStudio/matcher/tree/main/mcp",
21
+ "publishConfig": {
22
+ "access": "public"
23
+ },
24
+ "files": [
25
+ "dist"
26
+ ],
27
+ "packageManager": "pnpm@11.5.2",
28
+ "engines": {
29
+ "node": ">=22",
30
+ "pnpm": ">=11.5.2 <12"
31
+ },
32
+ "bin": {
33
+ "matcher-mcp": "./dist/server.js"
34
+ },
35
+ "main": "./dist/server.js",
36
+ "scripts": {
37
+ "vendor-spec": "node scripts/vendor-spec.mjs",
38
+ "predev": "node scripts/vendor-spec.mjs",
39
+ "dev": "node --watch --experimental-strip-types src/server.ts",
40
+ "prebuild": "node scripts/vendor-spec.mjs",
41
+ "build": "tsc",
42
+ "postbuild": "node scripts/vendor-spec.mjs",
43
+ "typecheck": "tsc --noEmit",
44
+ "test": "vitest run",
45
+ "lint": "eslint ."
46
+ },
47
+ "dependencies": {
48
+ "@modelcontextprotocol/sdk": "^1.29.0",
49
+ "@opentelemetry/api": "1.9.1",
50
+ "@opentelemetry/exporter-metrics-otlp-http": "0.219.0",
51
+ "@opentelemetry/exporter-trace-otlp-http": "0.219.0",
52
+ "@opentelemetry/resources": "2.8.0",
53
+ "@opentelemetry/sdk-metrics": "2.8.0",
54
+ "@opentelemetry/sdk-node": "0.219.0",
55
+ "@opentelemetry/semantic-conventions": "1.41.1",
56
+ "ajv": "^8.20.0",
57
+ "yaml": "^2.9.0",
58
+ "zod": "^4.4.3"
59
+ },
60
+ "devDependencies": {
61
+ "@eslint/js": "^10.0.1",
62
+ "@types/node": "^22.10.2",
63
+ "eslint": "^10.4.1",
64
+ "typescript": "^6.0.2",
65
+ "typescript-eslint": "^8.60.1",
66
+ "vitest": "^4.1.5"
67
+ }
68
+ }