Skip to main content
Glama

NestJS MCP Server Module

by rekog-labs
MIT License
32,416
470
  • Apple
  • Linux
mcp.prefix.e2e.spec.ts3.35 kB
import { INestApplication, Injectable } from '@nestjs/common'; import { Test } from '@nestjs/testing'; import request from 'supertest'; import { McpModule } from '../src/mcp/mcp.module'; import { createStreamableClient } from './utils'; import { Tool } from '../src/mcp/decorators/tool.decorator'; @Injectable() class Tools { @Tool({ name: 'tool', description: 'Tool from Module', }) toolA() { return 'Tool result'; } } const globalPrefix = 'api'; const apiPrefix = 'service/custom'; describe('MCP with global API Prefix (e2e)', () => { let app: INestApplication; let port: number; // Set timeout for all tests in this describe block to 15000ms jest.setTimeout(15000); beforeAll(async () => { const moduleRef = await Test.createTestingModule({ imports: [ McpModule.forRoot({ name: 'prefix-mcp-server', version: '0.0.1', }), ], providers: [Tools], exports: [Tools], }).compile(); app = moduleRef.createNestApplication(); app.setGlobalPrefix(globalPrefix); await app.listen(0); const server = app.getHttpServer(); port = (server.address() as import('net').AddressInfo).port; }); afterAll(async () => { await app.close(); }); it('should connect to server with global prefix', async () => { const client = await createStreamableClient(port, { endpoint: `/${globalPrefix}/mcp`, }); try { const tools = await client.listTools(); expect(tools.tools.length).toBe(1); } finally { await client.close(); } }); it('should return 404 if globalPrefix is not used', async () => { let client; try { client = await createStreamableClient(port, { endpoint: '/mcp', }); fail('Expected 404 error'); } catch (error) { expect(error.message).toContain('404'); } }); }); describe('MCP with global API Prefix and local api prefix (e2e)', () => { let app: INestApplication; let port: number; // Set timeout for all tests in this describe block to 15000ms jest.setTimeout(15000); beforeAll(async () => { const moduleRef = await Test.createTestingModule({ imports: [ McpModule.forRoot({ name: 'prefix-mcp-server', version: '0.0.1', apiPrefix, }), ], providers: [Tools], exports: [Tools], }).compile(); app = moduleRef.createNestApplication(); app.setGlobalPrefix(globalPrefix); await app.listen(0); const server = app.getHttpServer(); port = (server.address() as import('net').AddressInfo).port; }); afterAll(async () => { await app.close(); }); it('should connect to server with global prefix amd apiPrefix', async () => { const client = await createStreamableClient(port, { endpoint: `/${globalPrefix}/${apiPrefix}/mcp`, }); try { const tools = await client.listTools(); expect(tools.tools.length).toBe(1); } finally { await client.close(); } }); it('should return 404 if apiPrefix is not used', async () => { let client; try { client = await createStreamableClient(port, { endpoint: `/${globalPrefix}/mcp`, }); fail('Expected 404 error'); } catch (error) { expect(error.message).toContain('404'); } }); });

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/rekog-labs/MCP-Nest'

If you have feedback or need assistance with the MCP directory API, please join our Discord server