Skip to content

Commit b31e79c

Browse files
author
Lasim
committed
refactor: update MCP server search functionality with advanced filters and category handling
1 parent 4add8a5 commit b31e79c

File tree

9 files changed

+273
-128
lines changed

9 files changed

+273
-128
lines changed

services/backend/src/routes/mcp/servers/search.ts

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -79,19 +79,19 @@ export default async function searchServers(server: FastifyInstance) {
7979
security: [{ cookieAuth: [] }],
8080
// Plain JSON Schema for Fastify validation
8181
querystring: {
82-
type: 'object',
83-
properties: {
84-
q: { type: 'string', minLength: 1, maxLength: 255 },
85-
category: { type: 'string' },
86-
language: { type: 'string' },
87-
runtime: { type: 'string' },
88-
status: { type: 'string', enum: ['active', 'deprecated', 'maintenance'] },
89-
featured: { type: 'string', enum: ['true', 'false'] },
90-
limit: { type: 'string', pattern: '^\\d+$' },
91-
offset: { type: 'string', pattern: '^\\d+$' }
92-
},
93-
required: ['q'],
94-
additionalProperties: false
82+
type: 'object',
83+
properties: {
84+
q: { type: 'string', minLength: 1, maxLength: 255 },
85+
category_id: { type: 'string' },
86+
language: { type: 'string' },
87+
runtime: { type: 'string' },
88+
status: { type: 'string', enum: ['active', 'deprecated', 'maintenance'] },
89+
featured: { type: 'string', enum: ['true', 'false'] },
90+
limit: { type: 'string', pattern: '^\\d+$' },
91+
offset: { type: 'string', pattern: '^\\d+$' }
92+
},
93+
required: ['q'],
94+
additionalProperties: false
9595
},
9696
response: {
9797
200: createSchema(searchServersResponseSchema),
@@ -104,7 +104,7 @@ export default async function searchServers(server: FastifyInstance) {
104104
}, async (request, reply) => {
105105
const queryParams = request.query as {
106106
q?: string;
107-
category?: string;
107+
category_id?: string;
108108
language?: string;
109109
runtime?: string;
110110
status?: string;
@@ -118,7 +118,7 @@ export default async function searchServers(server: FastifyInstance) {
118118
userId: request.user?.id,
119119
query: queryParams.q,
120120
filters: {
121-
category: queryParams.category,
121+
category_id: queryParams.category_id,
122122
language: queryParams.language,
123123
runtime: queryParams.runtime,
124124
status: queryParams.status,
@@ -162,7 +162,7 @@ export default async function searchServers(server: FastifyInstance) {
162162
// Build filters object
163163
const filters = {
164164
search: queryParams.q,
165-
category_id: queryParams.category,
165+
category_id: queryParams.category_id,
166166
language: queryParams.language,
167167
runtime: queryParams.runtime,
168168
status: status,
@@ -238,7 +238,7 @@ export default async function searchServers(server: FastifyInstance) {
238238
},
239239
filters: {
240240
query: queryParams.q,
241-
category: queryParams.category || null,
241+
category: queryParams.category_id || null,
242242
language: queryParams.language || null,
243243
runtime: queryParams.runtime || null,
244244
status: queryParams.status || null,

services/backend/src/services/mcpCatalogService.ts

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -167,15 +167,16 @@ export class McpCatalogService {
167167
filters
168168
}, 'Getting MCP servers for user');
169169

170-
let query = this.db.select().from(mcpServers);
170+
// Build all WHERE conditions in an array
171+
const whereConditions: any[] = [];
171172

172173
// Apply visibility filters based on user role
173174
if (userRole === 'global_admin') {
174-
// Global admin sees ALL servers
175+
// Global admin sees ALL servers - no visibility restrictions
175176
this.logger.debug('Global admin - showing all servers');
176177
} else {
177178
// Regular users see global servers + their team servers
178-
query = query.where(
179+
whereConditions.push(
179180
or(
180181
eq(mcpServers.visibility, 'global'),
181182
and(
@@ -189,23 +190,23 @@ export class McpCatalogService {
189190
// Apply additional filters
190191
if (filters) {
191192
if (filters.category_id) {
192-
query = query.where(eq(mcpServers.category_id, filters.category_id));
193+
whereConditions.push(eq(mcpServers.category_id, filters.category_id));
193194
}
194195
if (filters.language) {
195-
query = query.where(eq(mcpServers.language, filters.language));
196+
whereConditions.push(eq(mcpServers.language, filters.language));
196197
}
197198
if (filters.runtime) {
198-
query = query.where(eq(mcpServers.runtime, filters.runtime));
199+
whereConditions.push(eq(mcpServers.runtime, filters.runtime));
199200
}
200201
if (filters.status) {
201-
query = query.where(eq(mcpServers.status, filters.status));
202+
whereConditions.push(eq(mcpServers.status, filters.status));
202203
}
203204
if (filters.featured !== undefined) {
204-
query = query.where(eq(mcpServers.featured, filters.featured));
205+
whereConditions.push(eq(mcpServers.featured, filters.featured));
205206
}
206207
if (filters.search) {
207208
const searchTerm = `%${filters.search}%`;
208-
query = query.where(
209+
whereConditions.push(
209210
or(
210211
like(mcpServers.name, searchTerm),
211212
like(mcpServers.description, searchTerm),
@@ -215,6 +216,12 @@ export class McpCatalogService {
215216
}
216217
}
217218

219+
// Build the query with all conditions combined
220+
let query = this.db.select().from(mcpServers);
221+
if (whereConditions.length > 0) {
222+
query = query.where(and(...whereConditions));
223+
}
224+
218225
// Order by featured first, then by name
219226
query = query.orderBy(desc(mcpServers.featured), asc(mcpServers.name));
220227

@@ -224,7 +231,9 @@ export class McpCatalogService {
224231
operation: 'get_servers_for_user',
225232
userId,
226233
userRole,
227-
serversFound: servers.length
234+
serversFound: servers.length,
235+
appliedFilters: filters,
236+
whereConditionsCount: whereConditions.length
228237
}, 'Retrieved MCP servers for user');
229238

230239
// Parse JSON fields for all servers

services/backend/tests/unit/routes/mcp/servers/search.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ describe('MCP Servers - Search Servers', () => {
308308
...mockRequest,
309309
query: {
310310
q: 'test',
311-
category: 'web',
311+
category_id: 'web', // Changed from 'category' to 'category_id' to match the route schema
312312
language: 'javascript',
313313
runtime: 'node',
314314
status: 'active',

0 commit comments

Comments
 (0)