diff --git a/cli/src/index.ts b/cli/src/index.ts index 8e219e451..a7c5896d7 100644 --- a/cli/src/index.ts +++ b/cli/src/index.ts @@ -31,6 +31,8 @@ type JsonValue = | JsonValue[] | { [key: string]: JsonValue }; +import packageJson from "../package.json" with { type: "json" }; + type Args = { target: string[]; method?: string; @@ -105,10 +107,12 @@ async function callMethod(args: Args): Promise { args.headers, ); const transport = createTransport(transportOptions); - const client = new Client({ - name: "inspector-cli", - version: "0.5.1", - }); + + const [, name = packageJson.name] = packageJson.name.split("/"); + const version = packageJson.version; + const clientIdentity = { name, version }; + + const client = new Client(clientIdentity); try { await connect(client, transport); diff --git a/client/src/lib/constants.ts b/client/src/lib/constants.ts index 2e983302e..8e4ff2b56 100644 --- a/client/src/lib/constants.ts +++ b/client/src/lib/constants.ts @@ -1,4 +1,12 @@ import { InspectorConfig } from "./configurationTypes"; +import packageJson from "../../package.json"; + +// Client identity for MCP connections +export const CLIENT_IDENTITY = (() => { + const [, name = packageJson.name] = packageJson.name.split("/"); + const version = packageJson.version; + return { name, version }; +})(); // OAuth-related session storage keys export const SESSION_KEYS = { diff --git a/client/src/lib/hooks/__tests__/useConnection.test.tsx b/client/src/lib/hooks/__tests__/useConnection.test.tsx index b16eaa3d0..81bc4f45a 100644 --- a/client/src/lib/hooks/__tests__/useConnection.test.tsx +++ b/client/src/lib/hooks/__tests__/useConnection.test.tsx @@ -2,7 +2,7 @@ import { renderHook, act } from "@testing-library/react"; import { useConnection } from "../useConnection"; import { z } from "zod"; import { ClientRequest } from "@modelcontextprotocol/sdk/types.js"; -import { DEFAULT_INSPECTOR_CONFIG } from "../../constants"; +import { DEFAULT_INSPECTOR_CONFIG, CLIENT_IDENTITY } from "../../constants"; import { SSEClientTransportOptions, SseError, @@ -251,8 +251,8 @@ describe("useConnection", () => { expect(Client).toHaveBeenCalledWith( expect.objectContaining({ - name: "mcp-inspector", - version: expect.any(String), + name: CLIENT_IDENTITY.name, + version: CLIENT_IDENTITY.version, }), expect.objectContaining({ capabilities: expect.objectContaining({ diff --git a/client/src/lib/hooks/useConnection.ts b/client/src/lib/hooks/useConnection.ts index 1341b0c2b..163231eb4 100644 --- a/client/src/lib/hooks/useConnection.ts +++ b/client/src/lib/hooks/useConnection.ts @@ -35,7 +35,7 @@ import { RequestOptions } from "@modelcontextprotocol/sdk/shared/protocol.js"; import { useEffect, useState } from "react"; import { useToast } from "@/lib/hooks/useToast"; import { z } from "zod"; -import { ConnectionStatus } from "../constants"; +import { ConnectionStatus, CLIENT_IDENTITY } from "../constants"; import { Notification } from "../notificationTypes"; import { auth, @@ -47,7 +47,6 @@ import { saveClientInformationToSessionStorage, discoverScopes, } from "../auth"; -import packageJson from "../../../package.json"; import { getMCPProxyAddress, getMCPServerRequestMaxTotalTimeout, @@ -364,20 +363,19 @@ export function useConnection({ }; const connect = async (_e?: unknown, retryCount: number = 0) => { - const client = new Client( - { - name: "mcp-inspector", - version: packageJson.version, - }, - { - capabilities: { - sampling: {}, - elicitation: {}, - roots: { - listChanged: true, - }, + const clientCapabilities = { + capabilities: { + sampling: {}, + elicitation: {}, + roots: { + listChanged: true, }, }, + }; + + const client = new Client( + CLIENT_IDENTITY, + clientCapabilities, ); // Only check proxy health for proxy connections