API: @loopstack/mcp-module
Classes
McpAuthError
Error thrown when the remote MCP server responds with 401 or 403. Catch this to handle missing or invalid authentication credentials.
import { McpAuthError } from '@loopstack/mcp-module';export class McpAuthError extends McpError {}McpCallTool
Tool that calls a tool on a remote MCP server over HTTPS (Streamable HTTP or legacy SSE).
import { McpCallTool } from '@loopstack/mcp-module';Provided by: McpModule
export class McpCallTool extends McpToolBase<McpCallToolArgs> {
protected handle(
args: McpCallToolArgs,
ctx: RunContext,
options?: ToolCallOptions<McpToolConfig>,
): Promise<ToolEnvelope>;
}McpClientService
Service that connects to remote MCP servers; inject it to list and call tools on an MCP endpoint.
import { McpClientService } from '@loopstack/mcp-module';Provided by: McpModule
export class McpClientService {
constructor(env?: EnvReader, metrics?: McpMetricsPort);
listTools(
rawUrl: string,
config: McpToolConfig,
options?: McpClientCallOptions,
): Promise<{
tools: unknown;
}>;
callTool(
rawUrl: string,
config: McpToolConfig,
toolName: string,
toolArgs: Record<string, unknown>,
options?: McpClientCallOptions,
): Promise<McpCallToolResult>;
mergeHeaders(config: McpToolConfig, url: URL): Record<string, string>;
}McpError
Base class for all MCP failures. Catch this to handle any error raised while connecting to or calling a remote MCP server.
import { McpError } from '@loopstack/mcp-module';export abstract class McpError extends Error {
constructor(message: string);
}McpListToolsTool
Tool that lists the tool definitions exposed by a remote MCP server.
import { McpListToolsTool } from '@loopstack/mcp-module';Provided by: McpModule
export class McpListToolsTool extends McpToolBase<McpListToolsArgs> {
protected handle(
args: McpListToolsArgs,
ctx: RunContext,
options?: ToolCallOptions<McpToolConfig>,
): Promise<ToolEnvelope>;
}McpModule
NestJS module that provides remote MCP client tools — mcp_list_tools (McpListToolsTool),
mcp_call (McpCallTool), and the McpClientService that connects to remote Model Context
Protocol servers.
Registration:
McpModule.forRoot(McpToolConfigInput)— the only entry point; registers the module globally and co-importsLoopCoreModule. Pass config (allowlist, auth header mappings) to apply it to every tool call; config is optional here, in which case each call must supply config viaoptions.config.
Requires: an allowedHosts allowlist supplied either at the module level (via forRoot) or per call
via options.config — a tool call with no config at either level throws (the SSRF allowlist is
mandatory). For authenticated servers, the env vars referenced by hostHeaderEnv / headerEnv must
also be set, since header values are read from process.env at call time.
import { McpModule } from '@loopstack/mcp-module';export class McpModule {
static forRoot(config?: McpToolConfigInput): DynamicModule;
}McpProtocolError
Error thrown when the MCP server returns a malformed response (JSON-RPC parse or invalid message). Catch this to handle protocol-level violations from the remote server.
import { McpProtocolError } from '@loopstack/mcp-module';export class McpProtocolError extends McpError {}McpTimeoutError
Error thrown when an MCP call exceeds its configured timeoutMs.
Catch this to handle slow or unresponsive remote servers.
import { McpTimeoutError } from '@loopstack/mcp-module';export class McpTimeoutError extends McpError {}McpToolBase
Abstract base for tools that call a remote MCP server; extend it to add custom MCP-backed tools.
Concrete subclasses must repeat the @Tool({ schema, configSchema }) decorator —
decorator metadata is not inherited.
import { McpToolBase } from '@loopstack/mcp-module';export abstract class McpToolBase<TArgs extends object> extends BaseTool<TArgs, McpToolConfig> {
protected readonly mcp: McpClientService;
protected requireConfig(config: McpToolConfig | undefined): McpToolConfig;
}McpTransportError
Error thrown on transport-level failures (DNS, TCP, TLS, abort, or transport fallback). Catch this to handle network or connection problems reaching the remote server.
import { McpTransportError } from '@loopstack/mcp-module';export class McpTransportError extends McpError {}McpUrlSecurityError
Error thrown when an MCP URL fails the security checks (SSRF, allowlist, scheme, or userinfo violations). Catch this to react to a rejected or unsafe target URL.
import { McpUrlSecurityError } from '@loopstack/mcp-module';export class McpUrlSecurityError extends McpError {}Interfaces
McpClientCallOptions
Options for an McpClientService call (per-request timeout, transport, DNS-resolution skip).
import { McpClientCallOptions } from '@loopstack/mcp-module';export interface McpClientCallOptions {
timeoutMs?: number;
skipDnsResolution?: boolean;
transport?: McpTransportKind;
}Type Aliases
McpCallToolArgs
Args for McpCallTool (mcp_call).
import { McpCallToolArgs } from '@loopstack/mcp-module';export type McpCallToolArgs = z.infer<typeof McpCallToolArgsSchema>;McpCallToolResult
Result of an McpClientService.callTool() invocation — a modern call-tool result or a legacy tool result.
import { McpCallToolResult } from '@loopstack/mcp-module';export type McpCallToolResult =
| {
kind: 'legacyToolResult';
toolResult: unknown;
meta?: unknown;
}
| {
kind: 'callToolResult';
content: unknown;
structuredContent?: unknown;
isError?: unknown;
meta?: unknown;
};McpConnectionArgs
Args for connecting to a remote MCP server, shared by the MCP tools.
import { McpConnectionArgs } from '@loopstack/mcp-module';export type McpConnectionArgs = z.infer<typeof McpConnectionArgsSchema>;McpListToolsArgs
Args for McpListToolsTool (mcp_list_tools).
import { McpListToolsArgs } from '@loopstack/mcp-module';export type McpListToolsArgs = z.infer<typeof McpListToolsArgsSchema>;McpToolConfig
Config for the MCP tools (McpCallTool, McpListToolsTool).
import { McpToolConfig } from '@loopstack/mcp-module';export type McpToolConfig = z.infer<typeof McpToolConfigSchema>;McpToolConfigInput
Input config for McpModule.forRoot() (the pre-parse shape of McpToolConfig).
import { McpToolConfigInput } from '@loopstack/mcp-module';export type McpToolConfigInput = z.input<typeof McpToolConfigSchema>;McpTransportKind
Transport used to reach a remote MCP server — Streamable HTTP or legacy SSE.
import { McpTransportKind } from '@loopstack/mcp-module';export type McpTransportKind = 'streamableHttp' | 'sse';Variables
McpCallToolArgsSchema
Zod schema for mcp_call tool arguments.
import { McpCallToolArgsSchema } from '@loopstack/mcp-module';McpCallToolArgsSchema: z.ZodObject<
{
serverUrl: z.ZodURL;
timeoutMs: z.ZodOptional<z.ZodNumber>;
transport: z.ZodDefault<
z.ZodOptional<
z.ZodEnum<{
streamableHttp: 'streamableHttp';
sse: 'sse';
}>
>
>;
toolName: z.ZodString;
arguments: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
},
z.core.$strict
>;McpCallToolResultSchema
Zod schema for McpCallToolResult — the resultSchema of mcp_call. The proxied
tool payloads (toolResult, content, structuredContent, meta) are intentionally uncontracted.
import { McpCallToolResultSchema } from '@loopstack/mcp-module';McpCallToolResultSchema: z.ZodUnion<
readonly [
z.ZodObject<
{
kind: z.ZodLiteral<'legacyToolResult'>;
toolResult: z.ZodUnknown;
meta: z.ZodOptional<z.ZodUnknown>;
},
z.core.$strict
>,
z.ZodObject<
{
kind: z.ZodLiteral<'callToolResult'>;
content: z.ZodUnknown;
structuredContent: z.ZodOptional<z.ZodUnknown>;
isError: z.ZodOptional<z.ZodUnknown>;
meta: z.ZodOptional<z.ZodUnknown>;
},
z.core.$strict
>,
]
>;McpConnectionArgsSchema
Zod schema for the connection arguments shared by the MCP tools (serverUrl, timeoutMs, transport).
import { McpConnectionArgsSchema } from '@loopstack/mcp-module';McpConnectionArgsSchema: z.ZodObject<
{
serverUrl: z.ZodURL;
timeoutMs: z.ZodOptional<z.ZodNumber>;
transport: z.ZodDefault<
z.ZodOptional<
z.ZodEnum<{
streamableHttp: 'streamableHttp';
sse: 'sse';
}>
>
>;
},
z.core.$strict
>;McpListToolsArgsSchema
Zod schema for mcp_list_tools tool arguments.
import { McpListToolsArgsSchema } from '@loopstack/mcp-module';McpListToolsArgsSchema: z.ZodObject<
{
serverUrl: z.ZodURL;
timeoutMs: z.ZodOptional<z.ZodNumber>;
transport: z.ZodDefault<
z.ZodOptional<
z.ZodEnum<{
streamableHttp: 'streamableHttp';
sse: 'sse';
}>
>
>;
},
z.core.$strict
>;McpListToolsResultSchema
Zod schema for the mcp_list_tools result — the remote server’s tool definitions are
passed through verbatim and intentionally uncontracted.
import { McpListToolsResultSchema } from '@loopstack/mcp-module';McpListToolsResultSchema: z.ZodObject<
{
tools: z.ZodUnknown;
},
z.core.$strict
>;McpToolConfigSchema
Zod schema for MCP tool configuration — host allowlist and auth header mappings.
import { McpToolConfigSchema } from '@loopstack/mcp-module';McpToolConfigSchema: z.ZodObject<
{
allowedHosts: z.ZodArray<z.ZodString>;
allowInsecureHttp: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
allowPrivateHosts: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
defaultHeaders: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
headerEnv: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
hostHeaderEnv: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>>>;
},
z.core.$strict
>;