@registrum/mcp 1.2.0 → 1.2.2
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 +71 -36
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +33 -5
- package/dist/server.js.map +1 -1
- package/dist/version.d.ts +6 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +17 -0
- package/dist/version.js.map +1 -0
- package/package.json +6 -3
- package/dist/server.test.d.ts +0 -2
- package/dist/server.test.d.ts.map +0 -1
- package/dist/server.test.js +0 -268
- package/dist/server.test.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,18 +1,41 @@
|
|
|
1
1
|
# Registrum MCP Server
|
|
2
2
|
|
|
3
|
-
**
|
|
3
|
+
**UK company data in your AI agent — without building Companies House plumbing.**
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
One API key. No Companies House developer account, no rate-limit handling, no
|
|
6
|
+
iXBRL parsing. Works in Claude Desktop, Claude Code, Cursor, and any
|
|
7
|
+
MCP-compatible client.
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
```bash
|
|
10
|
+
npx -y @registrum/mcp
|
|
11
|
+
```
|
|
8
12
|
|
|
9
13
|
---
|
|
10
14
|
|
|
11
|
-
##
|
|
15
|
+
## Why this instead of the Companies House API directly
|
|
16
|
+
|
|
17
|
+
Companies House publishes the raw register for free, and you can absolutely
|
|
18
|
+
call it yourself. What you then own is the plumbing:
|
|
19
|
+
|
|
20
|
+
| Doing it yourself | With Registrum |
|
|
21
|
+
|---|---|
|
|
22
|
+
| Register for a CH developer key, manage OAuth | One `REGISTRUM_API_KEY` |
|
|
23
|
+
| 600 requests/5min, and you handle the 429s | Server-side throttling on a higher negotiated budget |
|
|
24
|
+
| Accounts arrive as iXBRL documents you must parse | `get_financials` returns turnover, net assets, profit/loss as numbers |
|
|
25
|
+
| PSC control types are raw codes | Decoded to plain English |
|
|
26
|
+
| Ownership chains: recurse yourself, handle cycles | `get_psc_chain` returns the resolved tree with termination reasons |
|
|
27
|
+
| Director networks: N+1 queries across appointments | `get_network` traverses to depth 2 |
|
|
28
|
+
| Retry, cache, and survive CH outages yourself | 24h/7d caching, circuit breaker, stale-while-revalidate |
|
|
29
|
+
|
|
30
|
+
Other Companies House MCP servers make you bring your own CH key and hand back
|
|
31
|
+
the raw response. This one does the enrichment.
|
|
32
|
+
|
|
33
|
+
---
|
|
12
34
|
|
|
13
|
-
|
|
35
|
+
## Install
|
|
14
36
|
|
|
15
|
-
|
|
37
|
+
**Claude Desktop** — `~/.claude/claude_desktop_config.json`
|
|
38
|
+
**Cursor** — `.cursor/mcp.json` (per project) or `~/.cursor/mcp.json` (global)
|
|
16
39
|
|
|
17
40
|
```json
|
|
18
41
|
{
|
|
@@ -20,62 +43,74 @@ Add to `~/.claude/claude_desktop_config.json`:
|
|
|
20
43
|
"registrum": {
|
|
21
44
|
"command": "npx",
|
|
22
45
|
"args": ["-y", "@registrum/mcp"],
|
|
23
|
-
"env": {
|
|
24
|
-
"REGISTRUM_API_KEY": "reg_live_..."
|
|
25
|
-
}
|
|
46
|
+
"env": { "REGISTRUM_API_KEY": "reg_live_..." }
|
|
26
47
|
}
|
|
27
48
|
}
|
|
28
49
|
}
|
|
29
50
|
```
|
|
30
51
|
|
|
31
|
-
Get a free
|
|
32
|
-
|
|
33
|
-
### Cursor
|
|
34
|
-
|
|
35
|
-
Add to `.cursor/mcp.json` in your project, or to `~/.cursor/mcp.json` globally — same format as above.
|
|
52
|
+
[Get a free key](https://registrum.co.uk/?utm_source=mcp&utm_campaign=readme) — 50 calls/month, no card.
|
|
36
53
|
|
|
37
54
|
---
|
|
38
55
|
|
|
39
56
|
## Tools
|
|
40
57
|
|
|
41
|
-
| Tool |
|
|
42
|
-
|
|
43
|
-
| `search_company` |
|
|
44
|
-
| `get_company` |
|
|
45
|
-
| `get_financials` |
|
|
46
|
-
| `get_directors` |
|
|
47
|
-
| `
|
|
58
|
+
| Tool | What you get |
|
|
59
|
+
|---|---|
|
|
60
|
+
| `search_company` | Find a company by name → company number |
|
|
61
|
+
| `get_company` | Profile: status, age, SIC descriptions, overdue flags |
|
|
62
|
+
| `get_financials` | Turnover, net assets, profit/loss, employees — parsed from iXBRL, in GBP |
|
|
63
|
+
| `get_directors` | Current board with appointment history across all their companies |
|
|
64
|
+
| `get_psc` | Persons with Significant Control, control types in plain English |
|
|
65
|
+
| `get_psc_chain` | Ownership traversed to ultimate beneficial owners, with termination reasons |
|
|
66
|
+
| `get_compliance` | **ECCTA identity-verification status** — who has verified, who is pending, who is overdue |
|
|
67
|
+
| `get_network` | Companies connected by shared directors, to depth 2 |
|
|
68
|
+
|
|
69
|
+
### On `get_compliance`
|
|
70
|
+
|
|
71
|
+
The Economic Crime and Corporate Transparency Act requires every UK director
|
|
72
|
+
and PSC to verify their identity with Companies House. **Enforcement begins
|
|
73
|
+
18 November 2026**, after which unverified officers can block filings.
|
|
74
|
+
|
|
75
|
+
The tool returns verified / pending / overdue counts plus each unverified
|
|
76
|
+
person and their individual deadline. It deliberately distinguishes **pending**
|
|
77
|
+
(deadline not yet reached — not a failure) from **overdue** (missed). Treating
|
|
78
|
+
those as the same thing is the single easiest way to report a compliant company
|
|
79
|
+
as non-compliant.
|
|
48
80
|
|
|
49
81
|
---
|
|
50
82
|
|
|
51
83
|
## Example prompts
|
|
52
84
|
|
|
53
|
-
> "
|
|
85
|
+
> "Is Tesco PLC compliant with ECCTA director verification, and who still needs to verify?"
|
|
54
86
|
|
|
55
|
-
> "
|
|
87
|
+
> "Pull the last filed financials for 00445790 and tell me if turnover grew."
|
|
56
88
|
|
|
57
|
-
> "
|
|
89
|
+
> "Who ultimately owns Rolls-Royce Holdings? Trace the ownership chain."
|
|
58
90
|
|
|
59
|
-
> "
|
|
91
|
+
> "Which companies share directors with Barratt Developments?"
|
|
92
|
+
|
|
93
|
+
> "Search for 'Monzo' and show me status, incorporation date and directors."
|
|
60
94
|
|
|
61
95
|
---
|
|
62
96
|
|
|
63
97
|
## Plans
|
|
64
98
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
| Free | £0 | 50 |
|
|
68
|
-
| Pro | £49/mo | 2,000 |
|
|
69
|
-
| Enterprise | £149/mo | 10,000 |
|
|
99
|
+
Free tier is 50 calls/month with every core endpoint. Paid tiers add volume,
|
|
100
|
+
PSC chain traversal and the ECCTA compliance endpoint.
|
|
70
101
|
|
|
71
|
-
[
|
|
102
|
+
Prices and quotas are served live from [`GET /v1/plans`](https://api.registrum.co.uk/v1/plans) —
|
|
103
|
+
that endpoint is the source of truth, so this README does not duplicate the
|
|
104
|
+
numbers and cannot go stale against them. Human-readable version at
|
|
105
|
+
[registrum.co.uk](https://registrum.co.uk/?utm_source=mcp&utm_campaign=readme#pricing).
|
|
72
106
|
|
|
73
107
|
---
|
|
74
108
|
|
|
75
|
-
##
|
|
76
|
-
|
|
77
|
-
Full API docs at [api.registrum.co.uk/docs](https://api.registrum.co.uk/docs)
|
|
109
|
+
## Notes
|
|
78
110
|
|
|
79
|
-
|
|
111
|
+
- Company numbers are zero-padded 8-character strings: `00445790`, `SC000268`.
|
|
112
|
+
- Responses are JSON, cached server-side (24h profiles/directors, 7d financials).
|
|
113
|
+
- Every call sends `User-Agent: @registrum/mcp/<version>` so we can see which
|
|
114
|
+
features developers actually use. No telemetry runs on your machine.
|
|
80
115
|
|
|
81
|
-
[support@registrum.co.uk](mailto:support@registrum.co.uk)
|
|
116
|
+
[API reference](https://api.registrum.co.uk/docs) · [Issues](https://github.com/vdmeu/registrum-mcp/issues) · [support@registrum.co.uk](mailto:support@registrum.co.uk)
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,7 @@ import { createServer } from "./server.js";
|
|
|
4
4
|
const apiKey = process.env.REGISTRUM_API_KEY ?? "";
|
|
5
5
|
if (!apiKey) {
|
|
6
6
|
process.stderr.write("Warning: REGISTRUM_API_KEY is not set. Tool calls will fail until you set it.\n" +
|
|
7
|
-
"Get a free key at https://registrum.co.uk\n");
|
|
7
|
+
"Get a free key at https://registrum.co.uk/?utm_source=mcp&utm_campaign=server\n");
|
|
8
8
|
}
|
|
9
9
|
const server = createServer(apiKey);
|
|
10
10
|
const transport = new StdioServerTransport();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;AACnD,IAAI,CAAC,MAAM,EAAE,CAAC;IACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,iFAAiF;QACjF,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;AACnD,IAAI,CAAC,MAAM,EAAE,CAAC;IACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,iFAAiF;QACjF,iFAAiF,CAClF,CAAC;AACJ,CAAC;AAED,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;AACpC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,eAAO,MAAM,QAAQ,mCAAmC,CAAC;AAEzD,wBAAsB,OAAO,CAC3B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,MAAiB,GACzB,OAAO,CAAC,OAAO,CAAC,CAclB;AAeD,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,MAAiB,GACzB,SAAS,CAoRX"}
|
package/dist/server.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
+
import { VERSION, USER_AGENT } from "./version.js";
|
|
3
4
|
export const API_BASE = "https://api.registrum.co.uk/v1";
|
|
4
|
-
const VERSION = "1.0.0";
|
|
5
5
|
export async function callApi(path, apiKey, baseUrl = API_BASE) {
|
|
6
6
|
if (!apiKey) {
|
|
7
|
-
throw new Error("REGISTRUM_API_KEY is not set. Get a free key at https://registrum.co.uk and set it in your MCP client config.");
|
|
7
|
+
throw new Error("REGISTRUM_API_KEY is not set. Get a free key at https://registrum.co.uk/?utm_source=mcp&utm_campaign=server and set it in your MCP client config.");
|
|
8
8
|
}
|
|
9
9
|
const res = await fetch(`${baseUrl}${path}`, {
|
|
10
|
-
headers: { "X-API-Key": apiKey },
|
|
10
|
+
headers: { "X-API-Key": apiKey, "User-Agent": USER_AGENT },
|
|
11
11
|
});
|
|
12
12
|
if (!res.ok) {
|
|
13
13
|
const body = await res.text();
|
|
@@ -33,8 +33,8 @@ export function createServer(apiKey, baseUrl = API_BASE) {
|
|
|
33
33
|
instructions: "Use these tools to look up UK companies registered at Companies House. " +
|
|
34
34
|
"Company numbers are zero-padded 8-digit strings (e.g. '00445790' for Tesco PLC). " +
|
|
35
35
|
"When a user gives you a company name, use search_company first to find the number, " +
|
|
36
|
-
"then use get_company, get_financials, get_directors, get_psc, get_psc_chain, or get_network as needed. " +
|
|
37
|
-
"Use get_psc for a flat view of who controls a company. " +
|
|
36
|
+
"then use get_company, get_financials, get_directors, get_psc, get_psc_chain, get_compliance, or get_network as needed. " +
|
|
37
|
+
"Use get_psc for a flat view of who controls a company. Use get_compliance for ECCTA identity-verification status - note 'pending' means the deadline has not passed and is not a failure. " +
|
|
38
38
|
"Use get_psc_chain to trace corporate ownership upward and find the ultimate beneficial owners (UBOs) " +
|
|
39
39
|
"— it follows corporate entity PSCs recursively until reaching natural persons or foreign entities.",
|
|
40
40
|
});
|
|
@@ -133,6 +133,34 @@ export function createServer(apiKey, baseUrl = API_BASE) {
|
|
|
133
133
|
return err(String(e));
|
|
134
134
|
}
|
|
135
135
|
});
|
|
136
|
+
server.registerTool("get_compliance", {
|
|
137
|
+
title: "Check ECCTA identity-verification compliance",
|
|
138
|
+
description: "Check a UK company's ECCTA identity-verification status - who has verified their " +
|
|
139
|
+
"identity with Companies House, who is still pending, and who is overdue. " +
|
|
140
|
+
"The Economic Crime and Corporate Transparency Act requires every director and PSC to " +
|
|
141
|
+
"verify their identity; enforcement begins 18 November 2026, after which unverified " +
|
|
142
|
+
"officers can block filings. " +
|
|
143
|
+
"Returns per-company counts (directors_total, directors_verified, directors_pending, " +
|
|
144
|
+
"directors_overdue) and the same for PSCs, plus unverified_persons with each person's " +
|
|
145
|
+
"name, role, status and their individual deadline. " +
|
|
146
|
+
"IMPORTANT: 'pending' means the deadline has not yet passed - it is NOT a failure and " +
|
|
147
|
+
"must not be reported as one. Only 'overdue' means a deadline was missed. " +
|
|
148
|
+
"Requires a Pro plan or above. Cached for 24 hours.",
|
|
149
|
+
inputSchema: {
|
|
150
|
+
company_number: z
|
|
151
|
+
.string()
|
|
152
|
+
.regex(/^[A-Z0-9]{1,8}$/)
|
|
153
|
+
.describe("Companies House company number, e.g. '00445790' for Tesco PLC"),
|
|
154
|
+
},
|
|
155
|
+
}, async ({ company_number }) => {
|
|
156
|
+
try {
|
|
157
|
+
const data = await api(`/company/${company_number}/compliance`);
|
|
158
|
+
return text(data);
|
|
159
|
+
}
|
|
160
|
+
catch (e) {
|
|
161
|
+
return err(String(e));
|
|
162
|
+
}
|
|
163
|
+
});
|
|
136
164
|
server.registerTool("get_psc", {
|
|
137
165
|
title: "Get persons with significant control",
|
|
138
166
|
description: "Get the PSC (Persons with Significant Control) register for a UK company. " +
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const VERSION: string;
|
|
2
|
+
export declare const PACKAGE_NAME: string;
|
|
3
|
+
/** Sent on every API call so MCP-driven usage is distinguishable from direct
|
|
4
|
+
* API traffic. Without it, adoption of this package is invisible server-side. */
|
|
5
|
+
export declare const USER_AGENT: string;
|
|
6
|
+
//# sourceMappingURL=version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,OAAO,EAAE,MAAoB,CAAC;AAC3C,eAAO,MAAM,YAAY,EAAE,MAAiB,CAAC;AAE7C;iFACiF;AACjF,eAAO,MAAM,UAAU,QAA0D,CAAC"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
/**
|
|
3
|
+
* Single source of truth for the version we report to MCP clients.
|
|
4
|
+
*
|
|
5
|
+
* This was previously a literal `const VERSION = "1.0.0"` in server.ts, which
|
|
6
|
+
* stayed frozen while the package shipped 1.1.0 and 1.2.x - so every client
|
|
7
|
+
* was told the wrong version for five months. Same drift class as server.json
|
|
8
|
+
* vs package.json; both are now pinned by tests.
|
|
9
|
+
*/
|
|
10
|
+
const require = createRequire(import.meta.url);
|
|
11
|
+
const pkg = require("../package.json");
|
|
12
|
+
export const VERSION = pkg.version;
|
|
13
|
+
export const PACKAGE_NAME = pkg.name;
|
|
14
|
+
/** Sent on every API call so MCP-driven usage is distinguishable from direct
|
|
15
|
+
* API traffic. Without it, adoption of this package is invisible server-side. */
|
|
16
|
+
export const USER_AGENT = `${PACKAGE_NAME}/${VERSION} (+https://registrum.co.uk)`;
|
|
17
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C;;;;;;;GAOG;AACH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAsC,CAAC;AAE5E,MAAM,CAAC,MAAM,OAAO,GAAW,GAAG,CAAC,OAAO,CAAC;AAC3C,MAAM,CAAC,MAAM,YAAY,GAAW,GAAG,CAAC,IAAI,CAAC;AAE7C;iFACiF;AACjF,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,YAAY,IAAI,OAAO,6BAA6B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@registrum/mcp",
|
|
3
3
|
"mcpName": "io.github.vdmeu/registrum-mcp",
|
|
4
|
-
"version": "1.2.
|
|
5
|
-
"description": "MCP server for the Registrum Companies House API
|
|
4
|
+
"version": "1.2.2",
|
|
5
|
+
"description": "MCP server for the Registrum Companies House API — search UK companies, get financials, directors, beneficial ownership (PSC), and director networks",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"mcp",
|
|
8
8
|
"mcp-server",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"homepage": "https://registrum.co.uk",
|
|
19
19
|
"repository": {
|
|
20
20
|
"type": "git",
|
|
21
|
-
"url": "https://github.com/
|
|
21
|
+
"url": "git+https://github.com/vdmeu/registrum-mcp.git"
|
|
22
22
|
},
|
|
23
23
|
"license": "MIT",
|
|
24
24
|
"author": "Eugene Merwe-Chartier",
|
|
@@ -50,5 +50,8 @@
|
|
|
50
50
|
},
|
|
51
51
|
"engines": {
|
|
52
52
|
"node": ">=18"
|
|
53
|
+
},
|
|
54
|
+
"bugs": {
|
|
55
|
+
"url": "https://github.com/vdmeu/registrum-mcp/issues"
|
|
53
56
|
}
|
|
54
57
|
}
|
package/dist/server.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.test.d.ts","sourceRoot":"","sources":["../src/server.test.ts"],"names":[],"mappings":""}
|
package/dist/server.test.js
DELETED
|
@@ -1,268 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
-
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
3
|
-
import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
|
|
4
|
-
import { callApi, createServer, API_BASE } from "./server.js";
|
|
5
|
-
// ─── Helpers ─────────────────────────────────────────────────────────────────
|
|
6
|
-
function mockFetch(status, body) {
|
|
7
|
-
vi.spyOn(globalThis, "fetch").mockResolvedValueOnce({
|
|
8
|
-
ok: status >= 200 && status < 300,
|
|
9
|
-
status,
|
|
10
|
-
json: () => Promise.resolve(body),
|
|
11
|
-
text: () => Promise.resolve(JSON.stringify(body)),
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
async function makeClient() {
|
|
15
|
-
const server = createServer("reg_test_key", API_BASE);
|
|
16
|
-
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
|
|
17
|
-
await server.connect(serverTransport);
|
|
18
|
-
const client = new Client({ name: "test-client", version: "1.0.0" });
|
|
19
|
-
await client.connect(clientTransport);
|
|
20
|
-
return client;
|
|
21
|
-
}
|
|
22
|
-
// ─── callApi ─────────────────────────────────────────────────────────────────
|
|
23
|
-
describe("callApi", () => {
|
|
24
|
-
beforeEach(() => vi.restoreAllMocks());
|
|
25
|
-
it("makes a GET request with X-API-Key header and returns parsed JSON", async () => {
|
|
26
|
-
const spy = vi.spyOn(globalThis, "fetch").mockResolvedValueOnce({
|
|
27
|
-
ok: true,
|
|
28
|
-
json: () => Promise.resolve({ name: "Tesco PLC" }),
|
|
29
|
-
});
|
|
30
|
-
const result = await callApi("/company/00445790", "reg_test_key");
|
|
31
|
-
expect(result).toEqual({ name: "Tesco PLC" });
|
|
32
|
-
expect(spy).toHaveBeenCalledWith(`${API_BASE}/company/00445790`, expect.objectContaining({ headers: { "X-API-Key": "reg_test_key" } }));
|
|
33
|
-
});
|
|
34
|
-
it("throws an error with status code when response is not ok", async () => {
|
|
35
|
-
vi.spyOn(globalThis, "fetch").mockResolvedValueOnce({
|
|
36
|
-
ok: false,
|
|
37
|
-
status: 401,
|
|
38
|
-
text: () => Promise.resolve("Unauthorized"),
|
|
39
|
-
});
|
|
40
|
-
await expect(callApi("/company/00445790", "bad_key")).rejects.toThrow("API error 401: Unauthorized");
|
|
41
|
-
});
|
|
42
|
-
it("throws an error with 404 status for unknown company", async () => {
|
|
43
|
-
vi.spyOn(globalThis, "fetch").mockResolvedValueOnce({
|
|
44
|
-
ok: false,
|
|
45
|
-
status: 404,
|
|
46
|
-
text: () => Promise.resolve("Not Found"),
|
|
47
|
-
});
|
|
48
|
-
await expect(callApi("/company/99999999", "reg_test_key")).rejects.toThrow("API error 404");
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
// ─── search_company ───────────────────────────────────────────────────────────
|
|
52
|
-
describe("search_company tool", () => {
|
|
53
|
-
beforeEach(() => vi.restoreAllMocks());
|
|
54
|
-
it("returns company list from the API", async () => {
|
|
55
|
-
const payload = { results: [{ company_number: "00445790", name: "Tesco PLC" }] };
|
|
56
|
-
mockFetch(200, payload);
|
|
57
|
-
const client = await makeClient();
|
|
58
|
-
const result = await client.callTool({ name: "search_company", arguments: { query: "Tesco" } });
|
|
59
|
-
expect(result.isError).toBeFalsy();
|
|
60
|
-
const text = result.content[0].text;
|
|
61
|
-
expect(JSON.parse(text)).toEqual(payload);
|
|
62
|
-
});
|
|
63
|
-
it("includes limit param in the URL when provided", async () => {
|
|
64
|
-
const spy = vi.spyOn(globalThis, "fetch").mockResolvedValueOnce({
|
|
65
|
-
ok: true,
|
|
66
|
-
json: () => Promise.resolve({ results: [] }),
|
|
67
|
-
});
|
|
68
|
-
const client = await makeClient();
|
|
69
|
-
await client.callTool({ name: "search_company", arguments: { query: "Tesco", limit: 5 } });
|
|
70
|
-
const url = spy.mock.calls[0][0];
|
|
71
|
-
expect(url).toContain("q=Tesco");
|
|
72
|
-
expect(url).toContain("limit=5");
|
|
73
|
-
});
|
|
74
|
-
it("returns isError on API failure", async () => {
|
|
75
|
-
vi.spyOn(globalThis, "fetch").mockResolvedValueOnce({
|
|
76
|
-
ok: false,
|
|
77
|
-
status: 429,
|
|
78
|
-
text: () => Promise.resolve("Too Many Requests"),
|
|
79
|
-
});
|
|
80
|
-
const client = await makeClient();
|
|
81
|
-
const result = await client.callTool({ name: "search_company", arguments: { query: "Tesco" } });
|
|
82
|
-
expect(result.isError).toBe(true);
|
|
83
|
-
const text = result.content[0].text;
|
|
84
|
-
expect(text).toContain("429");
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
// ─── get_company ──────────────────────────────────────────────────────────────
|
|
88
|
-
describe("get_company tool", () => {
|
|
89
|
-
beforeEach(() => vi.restoreAllMocks());
|
|
90
|
-
it("fetches /company/{number} and returns the profile", async () => {
|
|
91
|
-
const payload = { company_number: "00445790", name: "Tesco PLC" };
|
|
92
|
-
const spy = vi.spyOn(globalThis, "fetch").mockResolvedValueOnce({
|
|
93
|
-
ok: true,
|
|
94
|
-
json: () => Promise.resolve(payload),
|
|
95
|
-
});
|
|
96
|
-
const client = await makeClient();
|
|
97
|
-
const result = await client.callTool({
|
|
98
|
-
name: "get_company",
|
|
99
|
-
arguments: { company_number: "00445790" },
|
|
100
|
-
});
|
|
101
|
-
expect(result.isError).toBeFalsy();
|
|
102
|
-
const url = spy.mock.calls[0][0];
|
|
103
|
-
expect(url).toBe(`${API_BASE}/company/00445790`);
|
|
104
|
-
const text = result.content[0].text;
|
|
105
|
-
expect(JSON.parse(text)).toEqual(payload);
|
|
106
|
-
});
|
|
107
|
-
it("returns isError on 404", async () => {
|
|
108
|
-
vi.spyOn(globalThis, "fetch").mockResolvedValueOnce({
|
|
109
|
-
ok: false,
|
|
110
|
-
status: 404,
|
|
111
|
-
text: () => Promise.resolve("Not found"),
|
|
112
|
-
});
|
|
113
|
-
const client = await makeClient();
|
|
114
|
-
const result = await client.callTool({
|
|
115
|
-
name: "get_company",
|
|
116
|
-
arguments: { company_number: "99999999" },
|
|
117
|
-
});
|
|
118
|
-
expect(result.isError).toBe(true);
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
// ─── get_financials ───────────────────────────────────────────────────────────
|
|
122
|
-
describe("get_financials tool", () => {
|
|
123
|
-
beforeEach(() => vi.restoreAllMocks());
|
|
124
|
-
it("fetches /company/{number}/financials", async () => {
|
|
125
|
-
const payload = { revenue: 65000000 };
|
|
126
|
-
const spy = vi.spyOn(globalThis, "fetch").mockResolvedValueOnce({
|
|
127
|
-
ok: true,
|
|
128
|
-
json: () => Promise.resolve(payload),
|
|
129
|
-
});
|
|
130
|
-
const client = await makeClient();
|
|
131
|
-
await client.callTool({
|
|
132
|
-
name: "get_financials",
|
|
133
|
-
arguments: { company_number: "00445790" },
|
|
134
|
-
});
|
|
135
|
-
const url = spy.mock.calls[0][0];
|
|
136
|
-
expect(url).toBe(`${API_BASE}/company/00445790/financials`);
|
|
137
|
-
});
|
|
138
|
-
});
|
|
139
|
-
// ─── get_directors ────────────────────────────────────────────────────────────
|
|
140
|
-
describe("get_directors tool", () => {
|
|
141
|
-
beforeEach(() => vi.restoreAllMocks());
|
|
142
|
-
it("fetches /company/{number}/directors", async () => {
|
|
143
|
-
const payload = { directors: [] };
|
|
144
|
-
const spy = vi.spyOn(globalThis, "fetch").mockResolvedValueOnce({
|
|
145
|
-
ok: true,
|
|
146
|
-
json: () => Promise.resolve(payload),
|
|
147
|
-
});
|
|
148
|
-
const client = await makeClient();
|
|
149
|
-
await client.callTool({
|
|
150
|
-
name: "get_directors",
|
|
151
|
-
arguments: { company_number: "00445790" },
|
|
152
|
-
});
|
|
153
|
-
const url = spy.mock.calls[0][0];
|
|
154
|
-
expect(url).toBe(`${API_BASE}/company/00445790/directors`);
|
|
155
|
-
});
|
|
156
|
-
});
|
|
157
|
-
// ─── get_psc ─────────────────────────────────────────────────────────────────
|
|
158
|
-
describe("get_psc tool", () => {
|
|
159
|
-
beforeEach(() => vi.restoreAllMocks());
|
|
160
|
-
it("fetches /company/{number}/psc", async () => {
|
|
161
|
-
const payload = { active_pscs: [], ceased_pscs: [], has_psc_exemption: false };
|
|
162
|
-
const spy = vi.spyOn(globalThis, "fetch").mockResolvedValueOnce({
|
|
163
|
-
ok: true,
|
|
164
|
-
json: () => Promise.resolve(payload),
|
|
165
|
-
});
|
|
166
|
-
const client = await makeClient();
|
|
167
|
-
const result = await client.callTool({
|
|
168
|
-
name: "get_psc",
|
|
169
|
-
arguments: { company_number: "00445790" },
|
|
170
|
-
});
|
|
171
|
-
expect(result.isError).toBeFalsy();
|
|
172
|
-
const url = spy.mock.calls[0][0];
|
|
173
|
-
expect(url).toBe(`${API_BASE}/company/00445790/psc`);
|
|
174
|
-
const text = result.content[0].text;
|
|
175
|
-
expect(JSON.parse(text)).toEqual(payload);
|
|
176
|
-
});
|
|
177
|
-
it("returns isError on API failure", async () => {
|
|
178
|
-
vi.spyOn(globalThis, "fetch").mockResolvedValueOnce({
|
|
179
|
-
ok: false,
|
|
180
|
-
status: 404,
|
|
181
|
-
text: () => Promise.resolve("Not found"),
|
|
182
|
-
});
|
|
183
|
-
const client = await makeClient();
|
|
184
|
-
const result = await client.callTool({
|
|
185
|
-
name: "get_psc",
|
|
186
|
-
arguments: { company_number: "99999999" },
|
|
187
|
-
});
|
|
188
|
-
expect(result.isError).toBe(true);
|
|
189
|
-
});
|
|
190
|
-
});
|
|
191
|
-
// ─── get_psc_chain ────────────────────────────────────────────────────────────
|
|
192
|
-
describe("get_psc_chain tool", () => {
|
|
193
|
-
beforeEach(() => vi.restoreAllMocks());
|
|
194
|
-
it("fetches /company/{number}/psc/chain without max_depth by default", async () => {
|
|
195
|
-
const payload = { company_number: "12345678", pscs: [], chain_metadata: { companies_resolved: 1 } };
|
|
196
|
-
const spy = vi.spyOn(globalThis, "fetch").mockResolvedValueOnce({
|
|
197
|
-
ok: true,
|
|
198
|
-
json: () => Promise.resolve(payload),
|
|
199
|
-
});
|
|
200
|
-
const client = await makeClient();
|
|
201
|
-
const result = await client.callTool({
|
|
202
|
-
name: "get_psc_chain",
|
|
203
|
-
arguments: { company_number: "12345678" },
|
|
204
|
-
});
|
|
205
|
-
expect(result.isError).toBeFalsy();
|
|
206
|
-
const url = spy.mock.calls[0][0];
|
|
207
|
-
expect(url).toBe(`${API_BASE}/company/12345678/psc/chain`);
|
|
208
|
-
const text = result.content[0].text;
|
|
209
|
-
expect(JSON.parse(text)).toEqual(payload);
|
|
210
|
-
});
|
|
211
|
-
it("appends ?max_depth=3 when max_depth is provided", async () => {
|
|
212
|
-
const spy = vi.spyOn(globalThis, "fetch").mockResolvedValueOnce({
|
|
213
|
-
ok: true,
|
|
214
|
-
json: () => Promise.resolve({ pscs: [] }),
|
|
215
|
-
});
|
|
216
|
-
const client = await makeClient();
|
|
217
|
-
await client.callTool({
|
|
218
|
-
name: "get_psc_chain",
|
|
219
|
-
arguments: { company_number: "12345678", max_depth: 3 },
|
|
220
|
-
});
|
|
221
|
-
const url = spy.mock.calls[0][0];
|
|
222
|
-
expect(url).toBe(`${API_BASE}/company/12345678/psc/chain?max_depth=3`);
|
|
223
|
-
});
|
|
224
|
-
it("returns isError on API failure", async () => {
|
|
225
|
-
vi.spyOn(globalThis, "fetch").mockResolvedValueOnce({
|
|
226
|
-
ok: false,
|
|
227
|
-
status: 404,
|
|
228
|
-
text: () => Promise.resolve("Not found"),
|
|
229
|
-
});
|
|
230
|
-
const client = await makeClient();
|
|
231
|
-
const result = await client.callTool({
|
|
232
|
-
name: "get_psc_chain",
|
|
233
|
-
arguments: { company_number: "99999999" },
|
|
234
|
-
});
|
|
235
|
-
expect(result.isError).toBe(true);
|
|
236
|
-
});
|
|
237
|
-
});
|
|
238
|
-
// ─── get_network ──────────────────────────────────────────────────────────────
|
|
239
|
-
describe("get_network tool", () => {
|
|
240
|
-
beforeEach(() => vi.restoreAllMocks());
|
|
241
|
-
it("fetches /company/{number}/network without depth param by default", async () => {
|
|
242
|
-
const spy = vi.spyOn(globalThis, "fetch").mockResolvedValueOnce({
|
|
243
|
-
ok: true,
|
|
244
|
-
json: () => Promise.resolve({ nodes: [] }),
|
|
245
|
-
});
|
|
246
|
-
const client = await makeClient();
|
|
247
|
-
await client.callTool({
|
|
248
|
-
name: "get_network",
|
|
249
|
-
arguments: { company_number: "00445790" },
|
|
250
|
-
});
|
|
251
|
-
const url = spy.mock.calls[0][0];
|
|
252
|
-
expect(url).toBe(`${API_BASE}/company/00445790/network`);
|
|
253
|
-
});
|
|
254
|
-
it("appends ?depth=2 when depth is provided", async () => {
|
|
255
|
-
const spy = vi.spyOn(globalThis, "fetch").mockResolvedValueOnce({
|
|
256
|
-
ok: true,
|
|
257
|
-
json: () => Promise.resolve({ nodes: [] }),
|
|
258
|
-
});
|
|
259
|
-
const client = await makeClient();
|
|
260
|
-
await client.callTool({
|
|
261
|
-
name: "get_network",
|
|
262
|
-
arguments: { company_number: "00445790", depth: 2 },
|
|
263
|
-
});
|
|
264
|
-
const url = spy.mock.calls[0][0];
|
|
265
|
-
expect(url).toBe(`${API_BASE}/company/00445790/network?depth=2`);
|
|
266
|
-
});
|
|
267
|
-
});
|
|
268
|
-
//# sourceMappingURL=server.test.js.map
|
package/dist/server.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.test.js","sourceRoot":"","sources":["../src/server.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE9D,gFAAgF;AAEhF,SAAS,SAAS,CAAC,MAAc,EAAE,IAAa;IAC9C,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,qBAAqB,CAAC;QAClD,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;QACjC,MAAM;QACN,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;QACjC,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;KACtC,CAAC,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,UAAU;IACvB,MAAM,MAAM,GAAG,YAAY,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IACtD,MAAM,CAAC,eAAe,EAAE,eAAe,CAAC,GAAG,iBAAiB,CAAC,gBAAgB,EAAE,CAAC;IAChF,MAAM,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACrE,MAAM,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,gFAAgF;AAEhF,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC;IAEvC,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,qBAAqB,CAAC;YAC9D,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;SACvC,CAAC,CAAC;QAEf,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC;QAElE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAC9B,GAAG,QAAQ,mBAAmB,EAC9B,MAAM,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE,CAAC,CACtE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QACxE,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,qBAAqB,CAAC;YAClD,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC;SAChC,CAAC,CAAC;QAEf,MAAM,MAAM,CAAC,OAAO,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACnE,6BAA6B,CAC9B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,qBAAqB,CAAC;YAClD,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;SAC7B,CAAC,CAAC;QAEf,MAAM,MAAM,CAAC,OAAO,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACxE,eAAe,CAChB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC;IAEvC,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,cAAc,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;QACjF,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAExB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QAEhG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC;QACnC,MAAM,IAAI,GAAI,MAAM,CAAC,OAAiD,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,qBAAqB,CAAC;YAC9D,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;SACjC,CAAC,CAAC;QAEf,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAE3F,MAAM,GAAG,GAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAe,CAAC,CAAC,CAAW,CAAC;QAC1D,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACjC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,qBAAqB,CAAC;YAClD,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC;SACrC,CAAC,CAAC;QAEf,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QAEhG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,IAAI,GAAI,MAAM,CAAC,OAAiD,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/E,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC;IAEvC,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,OAAO,GAAG,EAAE,cAAc,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;QAClE,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,qBAAqB,CAAC;YAC9D,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;SACzB,CAAC,CAAC;QAEf,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE;SAC1C,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC;QACnC,MAAM,GAAG,GAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAe,CAAC,CAAC,CAAW,CAAC;QAC1D,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,mBAAmB,CAAC,CAAC;QACjD,MAAM,IAAI,GAAI,MAAM,CAAC,OAAiD,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,qBAAqB,CAAC;YAClD,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;SAC7B,CAAC,CAAC;QAEf,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE;SAC1C,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC;IAEvC,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,qBAAqB,CAAC;YAC9D,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;SACzB,CAAC,CAAC;QAEf,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,MAAM,CAAC,QAAQ,CAAC;YACpB,IAAI,EAAE,gBAAgB;YACtB,SAAS,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE;SAC1C,CAAC,CAAC;QAEH,MAAM,GAAG,GAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAe,CAAC,CAAC,CAAW,CAAC;QAC1D,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,8BAA8B,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC;IAEvC,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,OAAO,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,qBAAqB,CAAC;YAC9D,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;SACzB,CAAC,CAAC;QAEf,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,MAAM,CAAC,QAAQ,CAAC;YACpB,IAAI,EAAE,eAAe;YACrB,SAAS,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE;SAC1C,CAAC,CAAC;QAEH,MAAM,GAAG,GAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAe,CAAC,CAAC,CAAW,CAAC;QAC1D,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,6BAA6B,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAEhF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC;IAEvC,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,OAAO,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC;QAC/E,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,qBAAqB,CAAC;YAC9D,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;SACzB,CAAC,CAAC;QAEf,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,SAAS;YACf,SAAS,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE;SAC1C,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC;QACnC,MAAM,GAAG,GAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAe,CAAC,CAAC,CAAW,CAAC;QAC1D,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,uBAAuB,CAAC,CAAC;QACrD,MAAM,IAAI,GAAI,MAAM,CAAC,OAAiD,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,qBAAqB,CAAC;YAClD,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;SAC7B,CAAC,CAAC;QAEf,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,SAAS;YACf,SAAS,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE;SAC1C,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC;IAEvC,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,OAAO,GAAG,EAAE,cAAc,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,kBAAkB,EAAE,CAAC,EAAE,EAAE,CAAC;QACpG,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,qBAAqB,CAAC;YAC9D,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;SACzB,CAAC,CAAC;QAEf,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,eAAe;YACrB,SAAS,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE;SAC1C,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC;QACnC,MAAM,GAAG,GAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAe,CAAC,CAAC,CAAW,CAAC;QAC1D,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,6BAA6B,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAI,MAAM,CAAC,OAAiD,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,qBAAqB,CAAC;YAC9D,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;SAC9B,CAAC,CAAC;QAEf,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,MAAM,CAAC,QAAQ,CAAC;YACpB,IAAI,EAAE,eAAe;YACrB,SAAS,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,EAAE;SACxD,CAAC,CAAC;QAEH,MAAM,GAAG,GAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAe,CAAC,CAAC,CAAW,CAAC;QAC1D,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,yCAAyC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,qBAAqB,CAAC;YAClD,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG;YACX,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;SAC7B,CAAC,CAAC;QAEf,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,eAAe;YACrB,SAAS,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE;SAC1C,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC;IAEvC,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,qBAAqB,CAAC;YAC9D,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;SAC/B,CAAC,CAAC;QAEf,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,MAAM,CAAC,QAAQ,CAAC;YACpB,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE;SAC1C,CAAC,CAAC;QAEH,MAAM,GAAG,GAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAe,CAAC,CAAC,CAAW,CAAC;QAC1D,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,2BAA2B,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,qBAAqB,CAAC;YAC9D,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;SAC/B,CAAC,CAAC;QAEf,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;QAClC,MAAM,MAAM,CAAC,QAAQ,CAAC;YACpB,IAAI,EAAE,aAAa;YACnB,SAAS,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE;SACpD,CAAC,CAAC;QAEH,MAAM,GAAG,GAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAe,CAAC,CAAC,CAAW,CAAC;QAC1D,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,mCAAmC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|