@registrum/mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,83 @@
1
+ # Registrum MCP Server
2
+
3
+ Use UK Companies House data directly inside Claude, Cursor, and any other MCP-compatible AI client.
4
+
5
+ **5 tools, zero boilerplate.** Search companies, pull structured financials, list directors, and map corporate networks — all from the Registrum API.
6
+
7
+ ---
8
+
9
+ ## Installation
10
+
11
+ ### Claude Desktop
12
+
13
+ Add to `~/.claude/claude_desktop_config.json`:
14
+
15
+ ```json
16
+ {
17
+ "mcpServers": {
18
+ "registrum": {
19
+ "command": "npx",
20
+ "args": ["-y", "@registrum/mcp"],
21
+ "env": {
22
+ "REGISTRUM_API_KEY": "reg_live_..."
23
+ }
24
+ }
25
+ }
26
+ }
27
+ ```
28
+
29
+ Get a free API key at [registrum.co.uk](https://registrum.co.uk) (50 calls/month free).
30
+
31
+ ### Cursor
32
+
33
+ Add to `.cursor/mcp.json` in your project, or to `~/.cursor/mcp.json` globally — same format as above.
34
+
35
+ ### Smithery
36
+
37
+ Find this server at [smithery.ai/server/@registrum/mcp](https://smithery.ai/server/@registrum/mcp) and install with one click.
38
+
39
+ ---
40
+
41
+ ## Tools
42
+
43
+ | Tool | Description |
44
+ |------|-------------|
45
+ | `search_company` | Search for UK companies by name |
46
+ | `get_company` | Enriched company profile (age, overdue flags, SIC descriptions) |
47
+ | `get_financials` | Structured P&L + balance sheet from iXBRL filings |
48
+ | `get_directors` | Directors with full appointment history across all companies |
49
+ | `get_network` | Corporate network via shared director connections |
50
+
51
+ ---
52
+
53
+ ## Example prompts
54
+
55
+ > "Who are the directors of Tesco PLC and what other companies are they associated with?"
56
+
57
+ > "Get the latest financials for company 00445790"
58
+
59
+ > "Search for companies named 'Rolls-Royce' and show me their status"
60
+
61
+ > "Map the director network for Barratt Developments to depth 2"
62
+
63
+ ---
64
+
65
+ ## Plans
66
+
67
+ | Plan | Price | Calls/month |
68
+ |------|-------|------------|
69
+ | Free | £0 | 50 |
70
+ | Pro | £49/mo | 2,000 |
71
+ | Enterprise | £149/mo | 10,000 |
72
+
73
+ [See pricing →](https://registrum.co.uk/#pricing)
74
+
75
+ ---
76
+
77
+ ## API reference
78
+
79
+ Full API docs at [api.registrum.co.uk/docs](https://api.registrum.co.uk/docs)
80
+
81
+ ## Support
82
+
83
+ [support@registrum.co.uk](mailto:support@registrum.co.uk)
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { createServer } from "./server.js";
4
+ const apiKey = process.env.REGISTRUM_API_KEY;
5
+ if (!apiKey) {
6
+ process.stderr.write("Error: REGISTRUM_API_KEY environment variable is required.\n" +
7
+ "Get a free key at https://registrum.co.uk\n");
8
+ process.exit(1);
9
+ }
10
+ const server = createServer(apiKey);
11
+ const transport = new StdioServerTransport();
12
+ await server.connect(transport);
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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,CAAC;AAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;IACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,8DAA8D;QAC9D,6CAA6C,CAC9C,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,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"}
@@ -0,0 +1,5 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare const API_BASE = "https://api.registrum.co.uk/v1";
3
+ export declare function callApi(path: string, apiKey: string, baseUrl?: string): Promise<unknown>;
4
+ export declare function createServer(apiKey: string, baseUrl?: string): McpServer;
5
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,eAAO,MAAM,QAAQ,mCAAmC,CAAC;AAGzD,wBAAsB,OAAO,CAC3B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,MAAiB,GACzB,OAAO,CAAC,OAAO,CAAC,CASlB;AAeD,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,MAAiB,GACzB,SAAS,CA0KX"}
package/dist/server.js ADDED
@@ -0,0 +1,163 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { z } from "zod";
3
+ export const API_BASE = "https://api.registrum.co.uk/v1";
4
+ const VERSION = "1.0.0";
5
+ export async function callApi(path, apiKey, baseUrl = API_BASE) {
6
+ const res = await fetch(`${baseUrl}${path}`, {
7
+ headers: { "X-API-Key": apiKey },
8
+ });
9
+ if (!res.ok) {
10
+ const body = await res.text();
11
+ throw new Error(`API error ${res.status}: ${body}`);
12
+ }
13
+ return res.json();
14
+ }
15
+ function text(content) {
16
+ return {
17
+ content: [{ type: "text", text: JSON.stringify(content, null, 2) }],
18
+ };
19
+ }
20
+ function err(message) {
21
+ return {
22
+ isError: true,
23
+ content: [{ type: "text", text: message }],
24
+ };
25
+ }
26
+ export function createServer(apiKey, baseUrl = API_BASE) {
27
+ const api = (path) => callApi(path, apiKey, baseUrl);
28
+ const server = new McpServer({ name: "registrum", version: VERSION }, {
29
+ capabilities: { tools: {} },
30
+ instructions: "Use these tools to look up UK companies registered at Companies House. " +
31
+ "Company numbers are zero-padded 8-digit strings (e.g. '00445790' for Tesco PLC). " +
32
+ "When a user gives you a company name, use search_company first to find the number, " +
33
+ "then use get_company, get_financials, get_directors, or get_network as needed.",
34
+ });
35
+ server.registerTool("search_company", {
36
+ title: "Search for companies",
37
+ description: "Search for UK companies by name. Returns a list of matching companies with " +
38
+ "their company number, status, type, and registered address. Use this first " +
39
+ "when you only have a company name and need its company number.",
40
+ inputSchema: {
41
+ query: z.string().min(1).describe("Company name or keywords to search for"),
42
+ limit: z
43
+ .number()
44
+ .int()
45
+ .min(1)
46
+ .max(20)
47
+ .optional()
48
+ .describe("Maximum number of results to return (default 10)"),
49
+ },
50
+ }, async ({ query, limit }) => {
51
+ try {
52
+ const params = new URLSearchParams({ q: query });
53
+ if (limit)
54
+ params.set("limit", String(limit));
55
+ const data = await api(`/search?${params}`);
56
+ return text(data);
57
+ }
58
+ catch (e) {
59
+ return err(String(e));
60
+ }
61
+ });
62
+ server.registerTool("get_company", {
63
+ title: "Get company profile",
64
+ description: "Get an enriched profile for a UK company by its Companies House number. " +
65
+ "Returns name, status, type, incorporation date, registered address, SIC codes " +
66
+ "with descriptions, accounts status, confirmation statement status, and derived " +
67
+ "fields like company_age_years and accounts.overdue that are not available from " +
68
+ "the raw Companies House API.",
69
+ inputSchema: {
70
+ company_number: z
71
+ .string()
72
+ .regex(/^[A-Z0-9]{1,8}$/, "Must be 1–8 alphanumeric characters")
73
+ .describe("Companies House company number, e.g. '00445790' for Tesco PLC. " +
74
+ "Numeric-only numbers should be zero-padded to 8 digits."),
75
+ },
76
+ }, async ({ company_number }) => {
77
+ try {
78
+ const data = await api(`/company/${company_number}`);
79
+ return text(data);
80
+ }
81
+ catch (e) {
82
+ return err(String(e));
83
+ }
84
+ });
85
+ server.registerTool("get_financials", {
86
+ title: "Get company financials",
87
+ description: "Get structured financial data for a UK company, parsed from its iXBRL accounts " +
88
+ "filed at Companies House. Returns revenue, cost of sales, gross profit, operating " +
89
+ "profit, net profit, fixed assets, current assets, total equity, net assets, " +
90
+ "creditors, and average employees for the current and prior reporting year. " +
91
+ "Also includes accounts type (full/abbreviated/micro/dormant) and a data_quality " +
92
+ "block indicating which fields were extracted and which were absent from the filing. " +
93
+ "Cached for 7 days.",
94
+ inputSchema: {
95
+ company_number: z
96
+ .string()
97
+ .regex(/^[A-Z0-9]{1,8}$/)
98
+ .describe("Companies House company number, e.g. '00445790' for Tesco PLC"),
99
+ },
100
+ }, async ({ company_number }) => {
101
+ try {
102
+ const data = await api(`/company/${company_number}/financials`);
103
+ return text(data);
104
+ }
105
+ catch (e) {
106
+ return err(String(e));
107
+ }
108
+ });
109
+ server.registerTool("get_directors", {
110
+ title: "Get company directors",
111
+ description: "Get the current and past directors for a UK company, including each director's " +
112
+ "name, role, appointment date, resignation date (if applicable), nationality, " +
113
+ "country of residence, and a list of other companies they serve or have served as " +
114
+ "director. This gives you a full picture of a director's corporate history in one call.",
115
+ inputSchema: {
116
+ company_number: z
117
+ .string()
118
+ .regex(/^[A-Z0-9]{1,8}$/)
119
+ .describe("Companies House company number, e.g. '00445790' for Tesco PLC"),
120
+ },
121
+ }, async ({ company_number }) => {
122
+ try {
123
+ const data = await api(`/company/${company_number}/directors`);
124
+ return text(data);
125
+ }
126
+ catch (e) {
127
+ return err(String(e));
128
+ }
129
+ });
130
+ server.registerTool("get_network", {
131
+ title: "Get director network",
132
+ description: "Map the corporate network connected to a UK company via shared directors. " +
133
+ "Returns all companies connected through shared board members, up to the specified " +
134
+ "depth. Each connected company includes its name, number, status, and the directors " +
135
+ "it shares with the focal company. Useful for identifying corporate group structures, " +
136
+ "related party relationships, and director interlocks.",
137
+ inputSchema: {
138
+ company_number: z
139
+ .string()
140
+ .regex(/^[A-Z0-9]{1,8}$/)
141
+ .describe("Companies House company number, e.g. '00445790' for Tesco PLC"),
142
+ depth: z
143
+ .number()
144
+ .int()
145
+ .min(1)
146
+ .max(2)
147
+ .optional()
148
+ .describe("Traversal depth: 1 = direct connections only, 2 = connections of connections (default 1). " +
149
+ "Depth 2 can return many results for large companies."),
150
+ },
151
+ }, async ({ company_number, depth }) => {
152
+ try {
153
+ const params = depth ? `?depth=${depth}` : "";
154
+ const data = await api(`/company/${company_number}/network${params}`);
155
+ return text(data);
156
+ }
157
+ catch (e) {
158
+ return err(String(e));
159
+ }
160
+ });
161
+ return server;
162
+ }
163
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=server.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.test.d.ts","sourceRoot":"","sources":["../src/server.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,187 @@
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_network ──────────────────────────────────────────────────────────────
158
+ describe("get_network tool", () => {
159
+ beforeEach(() => vi.restoreAllMocks());
160
+ it("fetches /company/{number}/network without depth param by default", async () => {
161
+ const spy = vi.spyOn(globalThis, "fetch").mockResolvedValueOnce({
162
+ ok: true,
163
+ json: () => Promise.resolve({ nodes: [] }),
164
+ });
165
+ const client = await makeClient();
166
+ await client.callTool({
167
+ name: "get_network",
168
+ arguments: { company_number: "00445790" },
169
+ });
170
+ const url = spy.mock.calls[0][0];
171
+ expect(url).toBe(`${API_BASE}/company/00445790/network`);
172
+ });
173
+ it("appends ?depth=2 when depth is provided", async () => {
174
+ const spy = vi.spyOn(globalThis, "fetch").mockResolvedValueOnce({
175
+ ok: true,
176
+ json: () => Promise.resolve({ nodes: [] }),
177
+ });
178
+ const client = await makeClient();
179
+ await client.callTool({
180
+ name: "get_network",
181
+ arguments: { company_number: "00445790", depth: 2 },
182
+ });
183
+ const url = spy.mock.calls[0][0];
184
+ expect(url).toBe(`${API_BASE}/company/00445790/network?depth=2`);
185
+ });
186
+ });
187
+ //# sourceMappingURL=server.test.js.map
@@ -0,0 +1 @@
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,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"}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@registrum/mcp",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for the Registrum Companies House API — search UK companies, get financials, directors, and director networks",
5
+ "keywords": [
6
+ "mcp",
7
+ "mcp-server",
8
+ "companies-house",
9
+ "uk-companies",
10
+ "company-data",
11
+ "financials",
12
+ "directors",
13
+ "registrum"
14
+ ],
15
+ "homepage": "https://registrum.co.uk",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "https://github.com/eugenemerwe/registrum-mcp"
19
+ },
20
+ "license": "MIT",
21
+ "author": "Eugene Merwe-Chartier",
22
+ "type": "module",
23
+ "main": "dist/index.js",
24
+ "bin": {
25
+ "registrum-mcp": "dist/index.js"
26
+ },
27
+ "files": [
28
+ "dist"
29
+ ],
30
+ "scripts": {
31
+ "build": "tsc",
32
+ "dev": "tsc --watch",
33
+ "start": "node dist/index.js",
34
+ "test": "vitest run",
35
+ "prepublishOnly": "npm run build && npm test"
36
+ },
37
+ "dependencies": {
38
+ "@modelcontextprotocol/sdk": "^1.27.1",
39
+ "zod": "^3.25.0"
40
+ },
41
+ "devDependencies": {
42
+ "@types/node": "^20",
43
+ "typescript": "^5",
44
+ "vitest": "^3"
45
+ },
46
+ "engines": {
47
+ "node": ">=18"
48
+ }
49
+ }