@modelcontextprotocol/server-everything
Version:
MCP server that exercises all the features of the MCP protocol
111 lines (110 loc) • 5.58 kB
JavaScript
// Registers the everything server's tools, grouped by the protocol era that
// gets them (#4852):
// - `registerTools`: every client, on either era.
// - `registerLegacyTools`: 2025-era clients only, for the deprecated features
// the 2026-07-28 revision removes (`logging/setLevel`, `resources/subscribe`).
// - `registerConditionalTools`: 2025-era clients that declared the capability
// a tool needs; called once `initialize` has told the server what the client
// supports.
// - `registerModernTools`: 2026-07-28 clients. Their capabilities arrive with
// each request, so the capability-gated tools are registered up front and the
// SDK refuses an embedded request the client did not declare (-32021); the
// task tools are served only here, on the tasks extension.
import { registerGetAnnotatedMessageTool } from "./get-annotated-message.js";
import { registerEchoTool } from "./echo.js";
import { registerGetEnvTool } from "./get-env.js";
import { registerGetHeaderParamsTool } from "./get-header-params.js";
import { registerGetResourceLinksTool } from "./get-resource-links.js";
import { registerGetResourceReferenceTool } from "./get-resource-reference.js";
import { registerGetRootsListTool } from "./get-roots-list.js";
import { registerGetStructuredContentTool } from "./get-structured-content.js";
import { registerGetSumTool } from "./get-sum.js";
import { registerGetTinyImageTool } from "./get-tiny-image.js";
import { registerGZipFileAsResourceTool } from "./gzip-file-as-resource.js";
import { registerSimulateResearchQueryTool } from "./simulate-research-query.js";
import { registerToggleSimulatedLoggingTool } from "./toggle-simulated-logging.js";
import { registerToggleSubscriberUpdatesTool } from "./toggle-subscriber-updates.js";
import { registerTriggerElicitationRequestAsyncTool } from "./trigger-elicitation-request-async.js";
import { registerTriggerElicitationRequestTool } from "./trigger-elicitation-request.js";
import { registerTriggerListChangedTool } from "./trigger-list-changed.js";
import { registerTriggerLogMessagesTool } from "./trigger-log-messages.js";
import { registerTriggerLongRunningOperationTool } from "./trigger-long-running-operation.js";
import { registerTriggerMultiStepElicitationTool } from "./trigger-multi-step-elicitation.js";
import { registerTriggerResourceUpdateTool } from "./trigger-resource-update.js";
import { registerTriggerSamplingRequestAsyncTool } from "./trigger-sampling-request-async.js";
import { registerTriggerSamplingRequestTool } from "./trigger-sampling-request.js";
import { registerTriggerUrlElicitationTool } from "./trigger-url-elicitation.js";
/**
* Register the tools every client gets, on either protocol era.
* @param server
* @param context
*/
export const registerTools = (server, context) => {
registerEchoTool(server);
registerGetAnnotatedMessageTool(server);
registerGetEnvTool(server);
registerGetHeaderParamsTool(server);
registerGetResourceLinksTool(server);
registerGetResourceReferenceTool(server);
registerGetStructuredContentTool(server);
registerGetSumTool(server);
registerGetTinyImageTool(server);
registerGZipFileAsResourceTool(server, context);
registerTriggerListChangedTool(server, context);
registerTriggerLogMessagesTool(server);
registerTriggerLongRunningOperationTool(server);
registerTriggerResourceUpdateTool(server, context);
};
/**
* Register the deprecated tools that only a 2025-era client gets, because
* they rely on methods the 2026-07-28 revision removes.
* @param server
* @param context
*/
export const registerLegacyTools = (server, context) => {
registerToggleSimulatedLoggingTool(server, context);
registerToggleSubscriberUpdatesTool(server, context);
};
/**
* Register the tools that need a client capability, for a 2025-era client
* that declared it. These must be registered after initialization, when the
* client's capabilities are known.
* @param server
* @param context
*/
export const registerConditionalTools = (server, context) => {
const capabilities = server.server.getClientCapabilities() || {};
const elicitation = capabilities.elicitation;
// Form mode is `elicitation.form`, or `elicitation` with neither mode,
// which the spec treats as form mode for backwards compatibility (#4985).
const supportsFormElicitation = elicitation !== undefined &&
(elicitation.form !== undefined || elicitation.url === undefined);
if (capabilities.roots !== undefined)
registerGetRootsListTool(server);
if (supportsFormElicitation) {
registerTriggerElicitationRequestTool(server);
registerTriggerMultiStepElicitationTool(server);
}
if (elicitation?.url !== undefined) {
registerTriggerUrlElicitationTool(server, context);
}
if (capabilities.sampling !== undefined) {
registerTriggerSamplingRequestTool(server);
}
};
/**
* Register the tools a 2026-07-28 client gets beyond the common ones: the
* capability-gated tools, registered up front, and the task tools.
* @param server
* @param context
*/
export const registerModernTools = (server, context) => {
registerGetRootsListTool(server);
registerTriggerElicitationRequestTool(server);
registerTriggerMultiStepElicitationTool(server);
registerTriggerUrlElicitationTool(server, context);
registerTriggerSamplingRequestTool(server);
registerSimulateResearchQueryTool(server);
registerTriggerSamplingRequestAsyncTool(server);
registerTriggerElicitationRequestAsyncTool(server);
};