Skip to content

Commit a5ba8db

Browse files
committed
chore: merge
1 parent f0e9118 commit a5ba8db

File tree

3 files changed

+64
-198
lines changed

3 files changed

+64
-198
lines changed

src/commands/start-server.ts

Lines changed: 3 additions & 190 deletions
Original file line numberDiff line numberDiff line change
@@ -1,201 +1,14 @@
11
#!/usr/bin/env -S node --experimental-strip-types
22

3-
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4-
import { authenticate } from "../authentication.ts";
5-
import { AppStateManager } from "../appState.ts";
6-
import { DashboardApi } from "../DashboardApi.ts";
7-
import {
8-
operationId as GetUserInfoOperationId,
9-
registerGetUserInfo,
10-
} from "../tools/registerGetUserInfo.ts";
11-
import {
12-
operationId as GetApplicationsOperationId,
13-
registerGetApplications,
14-
} from "../tools/registerGetApplications.ts";
153
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
16-
import { registerOpenApiTools } from "../tools/registerOpenApi.ts";
17-
import { CONFIG } from "../config.ts";
18-
import {
19-
ABTestingSpec,
20-
AnalyticsSpec,
21-
CollectionsSpec,
22-
IngestionSpec,
23-
MonitoringSpec,
24-
QuerySuggestionsSpec,
25-
RecommendSpec,
26-
SearchSpec,
27-
UsageSpec,
28-
} from "../openApi.ts";
29-
import { type CliFilteringOptions, getToolFilter, isToolAllowed } from "../toolFilters.ts";
30-
import {
31-
operationId as SetAttributesForFacetingOperationId,
32-
registerSetAttributesForFaceting,
33-
} from "../tools/registerSetAttributesForFaceting.ts";
34-
import {
35-
registerSetCustomRanking,
36-
operationId as SetCustomRankingOperationId,
37-
} from "../tools/registerSetCustomRanking.ts";
4+
import { type CliFilteringOptions } from "../toolFilters.ts";
5+
import { initMCPServer } from "../server/init-server.js";
386

397
export type StartServerOptions = CliFilteringOptions;
408

419
export async function startServer(opts: StartServerOptions) {
4210
try {
43-
const appState = await AppStateManager.load();
44-
45-
if (!appState.get("accessToken")) {
46-
const token = await authenticate();
47-
48-
await appState.update({
49-
accessToken: token.access_token,
50-
refreshToken: token.refresh_token,
51-
});
52-
}
53-
54-
const dashboardApi = new DashboardApi({
55-
baseUrl: CONFIG.dashboardApiBaseUrl,
56-
appState,
57-
});
58-
59-
const server = new McpServer({
60-
name: "algolia",
61-
version: CONFIG.version,
62-
capabilities: {
63-
resources: {},
64-
tools: {},
65-
},
66-
});
67-
68-
const toolFilter = getToolFilter(opts);
69-
70-
// Dashboard API Tools
71-
if (isToolAllowed(GetUserInfoOperationId, toolFilter)) {
72-
registerGetUserInfo(server, dashboardApi);
73-
}
74-
75-
if (isToolAllowed(GetApplicationsOperationId, toolFilter)) {
76-
registerGetApplications(server, dashboardApi);
77-
}
78-
79-
// Search API Tools
80-
registerOpenApiTools({
81-
server,
82-
dashboardApi,
83-
openApiSpec: SearchSpec,
84-
toolFilter,
85-
});
86-
87-
// Analytics API Tools
88-
registerOpenApiTools({
89-
server,
90-
dashboardApi,
91-
openApiSpec: AnalyticsSpec,
92-
toolFilter,
93-
});
94-
95-
// Recommend API Tools
96-
registerOpenApiTools({
97-
server,
98-
dashboardApi,
99-
openApiSpec: RecommendSpec,
100-
toolFilter,
101-
});
102-
103-
// AB Testing
104-
registerOpenApiTools({
105-
server,
106-
dashboardApi,
107-
openApiSpec: ABTestingSpec,
108-
toolFilter,
109-
});
110-
111-
// Monitoring API Tools
112-
registerOpenApiTools({
113-
server,
114-
dashboardApi,
115-
openApiSpec: MonitoringSpec,
116-
toolFilter,
117-
});
118-
119-
// Usage
120-
registerOpenApiTools({
121-
server,
122-
dashboardApi,
123-
openApiSpec: UsageSpec,
124-
toolFilter,
125-
requestMiddlewares: [
126-
// The Usage API expects `name` parameter as multiple values
127-
// rather than comma-separated.
128-
async ({ request }) => {
129-
const url = new URL(request.url);
130-
const nameParams = url.searchParams.get("name");
131-
132-
if (!nameParams) {
133-
return new Request(url, request.clone());
134-
}
135-
136-
const nameValues = nameParams.split(",");
137-
138-
url.searchParams.delete("name");
139-
140-
nameValues.forEach((value) => {
141-
url.searchParams.append("name", value);
142-
});
143-
144-
return new Request(url, request.clone());
145-
},
146-
],
147-
});
148-
149-
// Ingestion API Tools
150-
registerOpenApiTools({
151-
server,
152-
dashboardApi,
153-
openApiSpec: IngestionSpec,
154-
toolFilter,
155-
requestMiddlewares: [
156-
// Dirty fix for Claud hallucinating regions
157-
async ({ request, params }) => {
158-
const application = await dashboardApi.getApplication(params.applicationId);
159-
const region = application.data.attributes.log_region === "de" ? "eu" : "us";
160-
161-
const url = new URL(request.url);
162-
const regionFromUrl = url.hostname.match(/data\.(.+)\.algolia.com/)?.[0];
163-
164-
if (regionFromUrl !== region) {
165-
console.error("Had to adjust region from", regionFromUrl, "to", region);
166-
url.hostname = `data.${region}.algolia.com`;
167-
return new Request(url, request.clone());
168-
}
169-
170-
return request;
171-
},
172-
],
173-
});
174-
175-
// Collections API Tools
176-
registerOpenApiTools({
177-
server,
178-
dashboardApi,
179-
openApiSpec: CollectionsSpec,
180-
toolFilter,
181-
});
182-
183-
// Query Suggestions API Tools
184-
registerOpenApiTools({
185-
server,
186-
dashboardApi,
187-
openApiSpec: QuerySuggestionsSpec,
188-
toolFilter,
189-
});
190-
191-
// Custom settings Tools
192-
if (isToolAllowed(SetAttributesForFacetingOperationId, toolFilter)) {
193-
registerSetAttributesForFaceting(server, dashboardApi);
194-
}
195-
196-
if (isToolAllowed(SetCustomRankingOperationId, toolFilter)) {
197-
registerSetCustomRanking(server, dashboardApi);
198-
}
11+
const server = await initMCPServer(opts);
19912

20013
const transport = new StdioServerTransport();
20114
await server.connect(transport);

src/commands/start-sse-server.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import cors from "cors";
33
import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
44
import type { StartServerOptions } from "../server/types.ts";
55
import { initMCPServer } from "../server/init-server.ts";
6+
import { CONFIG } from "../config.js";
67

78
export async function startSseServer(opts: StartServerOptions) {
89
try {
@@ -19,10 +20,10 @@ export async function startSseServer(opts: StartServerOptions) {
1920
const connections = new Map();
2021

2122
// Health check endpoint
22-
app.get("/health", (req, res) => {
23+
app.get("/health", (_, res) => {
2324
res.status(200).json({
2425
status: "ok",
25-
version: "1.0.0",
26+
version: CONFIG.version,
2627
uptime: process.uptime(),
2728
timestamp: new Date().toISOString(),
2829
connections: connections.size,

src/server/init-server.ts

Lines changed: 58 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,35 @@ import { authenticate } from "../authentication.ts";
44
import { DashboardApi } from "../DashboardApi.ts";
55
import { CONFIG } from "../config.ts";
66
import { getToolFilter, isToolAllowed } from "../toolFilters.ts";
7-
import { operationId as GetUserInfoOperationId, registerGetUserInfo } from "../tools/registerGetUserInfo.ts";
7+
import {
8+
operationId as GetUserInfoOperationId,
9+
registerGetUserInfo,
10+
} from "../tools/registerGetUserInfo.ts";
811
import {
912
operationId as GetApplicationsOperationId,
10-
registerGetApplications
13+
registerGetApplications,
1114
} from "../tools/registerGetApplications.ts";
1215
import { registerOpenApiTools } from "../tools/registerOpenApi.ts";
1316
import {
1417
ABTestingSpec,
15-
AnalyticsSpec, CollectionsSpec,
18+
AnalyticsSpec,
19+
CollectionsSpec,
1620
IngestionSpec,
1721
MonitoringSpec,
22+
QuerySuggestionsSpec,
1823
RecommendSpec,
1924
SearchSpec,
20-
UsageSpec
25+
UsageSpec,
2126
} from "../openApi.ts";
2227
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
28+
import {
29+
operationId as SetAttributesForFacetingOperationId,
30+
registerSetAttributesForFaceting,
31+
} from "../tools/registerSetAttributesForFaceting.js";
32+
import {
33+
operationId as SetCustomRankingOperationId,
34+
registerSetCustomRanking,
35+
} from "../tools/registerSetCustomRanking.js";
2336

2437
export async function initMCPServer(opts: StartServerOptions): Promise<McpServer> {
2538
try {
@@ -41,7 +54,7 @@ export async function initMCPServer(opts: StartServerOptions): Promise<McpServer
4154

4255
const server = new McpServer({
4356
name: "algolia",
44-
version: "1.0.0",
57+
version: CONFIG.version,
4558
capabilities: {
4659
resources: {},
4760
tools: {},
@@ -105,6 +118,28 @@ export async function initMCPServer(opts: StartServerOptions): Promise<McpServer
105118
dashboardApi,
106119
openApiSpec: UsageSpec,
107120
toolFilter,
121+
requestMiddlewares: [
122+
// The Usage API expects `name` parameter as multiple values
123+
// rather than comma-separated.
124+
async ({ request }) => {
125+
const url = new URL(request.url);
126+
const nameParams = url.searchParams.get("name");
127+
128+
if (!nameParams) {
129+
return new Request(url, request.clone());
130+
}
131+
132+
const nameValues = nameParams.split(",");
133+
134+
url.searchParams.delete("name");
135+
136+
nameValues.forEach((value) => {
137+
url.searchParams.append("name", value);
138+
});
139+
140+
return new Request(url, request.clone());
141+
},
142+
],
108143
});
109144

110145
// Ingestion API Tools
@@ -141,9 +176,26 @@ export async function initMCPServer(opts: StartServerOptions): Promise<McpServer
141176
toolFilter,
142177
});
143178

179+
// Query Suggestions API Tools
180+
registerOpenApiTools({
181+
server,
182+
dashboardApi,
183+
openApiSpec: QuerySuggestionsSpec,
184+
toolFilter,
185+
});
186+
187+
// Custom settings Tools
188+
if (isToolAllowed(SetAttributesForFacetingOperationId, toolFilter)) {
189+
registerSetAttributesForFaceting(server, dashboardApi);
190+
}
191+
192+
if (isToolAllowed(SetCustomRankingOperationId, toolFilter)) {
193+
registerSetCustomRanking(server, dashboardApi);
194+
}
195+
144196
return server;
145197
} catch (err) {
146198
console.error("Error starting server:", err);
147199
process.exit(1);
148200
}
149-
}
201+
}

0 commit comments

Comments
 (0)