@modelcontextprotocol/inspector 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,14 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <title>MCP Inspector</title>
8
+ <script type="module" crossorigin src="/assets/index-Dnx-KnuX.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-DJlejpJa.css">
10
+ </head>
11
+ <body>
12
+ <div id="root"></div>
13
+ </body>
14
+ </html>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@modelcontextprotocol/inspector",
3
+ "version": "0.1.1",
4
+ "description": "Model Context Protocol inspector",
5
+ "license": "MIT",
6
+ "author": "Anthropic, PBC (https://anthropic.com)",
7
+ "homepage": "https://modelcontextprotocol.github.io",
8
+ "bugs": "https://github.com/modelcontextprotocol/inspector/issues",
9
+ "type": "module",
10
+ "bin": {
11
+ "mcp-inspector": "./bin/cli.js"
12
+ },
13
+ "files": [
14
+ "bin",
15
+ "client/bin",
16
+ "client/dist",
17
+ "server/build"
18
+ ],
19
+ "workspaces": [
20
+ "client",
21
+ "server"
22
+ ],
23
+ "scripts": {
24
+ "dev": "concurrently \"cd client && npm run dev\" \"cd server && npm run dev\"",
25
+ "build-server": "cd server && npm run build",
26
+ "build-client": "cd client && npm run build",
27
+ "build": "npm run build-server && npm run build-client",
28
+ "start-server": "cd server && npm run start",
29
+ "start-client": "cd client && npm run preview",
30
+ "start": "./bin/cli.js",
31
+ "prepare": "npm run build",
32
+ "prettier-fix": "prettier --write ."
33
+ },
34
+ "dependencies": {
35
+ "@modelcontextprotocol/sdk": "0.5.0",
36
+ "@radix-ui/react-icons": "^1.3.0",
37
+ "@radix-ui/react-label": "^2.1.0",
38
+ "@radix-ui/react-select": "^2.1.2",
39
+ "@radix-ui/react-slot": "^1.1.0",
40
+ "@radix-ui/react-tabs": "^1.1.1",
41
+ "class-variance-authority": "^0.7.0",
42
+ "clsx": "^2.1.1",
43
+ "lucide-react": "^0.447.0",
44
+ "react": "^18.3.1",
45
+ "react-dom": "^18.3.1",
46
+ "react-toastify": "^10.0.6",
47
+ "serve-handler": "^6.1.6",
48
+ "tailwind-merge": "^2.5.3",
49
+ "tailwindcss-animate": "^1.0.7",
50
+ "concurrently": "^9.0.1",
51
+ "cors": "^2.8.5",
52
+ "eventsource": "^2.0.2",
53
+ "express": "^4.21.0",
54
+ "ws": "^8.18.0",
55
+ "zod": "^3.23.8"
56
+ },
57
+ "devDependencies": {
58
+ "prettier": "3.3.3",
59
+ "@types/node": "^22.7.5"
60
+ }
61
+ }
@@ -0,0 +1,76 @@
1
+ import { Client } from "mcp-typescript/client/index.js";
2
+ import { SSEClientTransport } from "mcp-typescript/client/sse.js";
3
+ import { StdioClientTransport } from "mcp-typescript/client/stdio.js";
4
+ import { ListResourcesResultSchema, ReadResourceResultSchema, ListPromptsResultSchema, GetPromptResultSchema, ListToolsResultSchema, CallToolResultSchema, } from "mcp-typescript/types.js";
5
+ export class McpClient {
6
+ client;
7
+ transport;
8
+ constructor(name, version) {
9
+ this.client = new Client({
10
+ name,
11
+ version,
12
+ });
13
+ }
14
+ async connect(url) {
15
+ const urlObj = typeof url === "string" ? new URL(url) : url;
16
+ if (urlObj.protocol === "http:" || urlObj.protocol === "https:") {
17
+ this.transport = new SSEClientTransport();
18
+ }
19
+ else {
20
+ throw new Error(`Unsupported protocol: ${urlObj.protocol}`);
21
+ }
22
+ await this.transport.connect(urlObj);
23
+ await this.client.connect(this.transport);
24
+ }
25
+ async connectStdio(command, args = []) {
26
+ this.transport = new StdioClientTransport();
27
+ await this.transport.spawn({ command, args });
28
+ await this.client.connect(this.transport);
29
+ }
30
+ async close() {
31
+ await this.client.close();
32
+ }
33
+ // Resource Operations
34
+ async listResources() {
35
+ return await this.client.request({
36
+ method: "resources/list",
37
+ }, ListResourcesResultSchema);
38
+ }
39
+ async readResource(params) {
40
+ return await this.client.request({
41
+ method: "resources/read",
42
+ params,
43
+ }, ReadResourceResultSchema);
44
+ }
45
+ // Prompt Operations
46
+ async listPrompts() {
47
+ return await this.client.request({
48
+ method: "prompts/list",
49
+ }, ListPromptsResultSchema);
50
+ }
51
+ async getPrompt(params) {
52
+ return await this.client.request({
53
+ method: "prompts/get",
54
+ params,
55
+ }, GetPromptResultSchema);
56
+ }
57
+ // Tool Operations
58
+ async listTools() {
59
+ return await this.client.request({
60
+ method: "tools/list",
61
+ }, ListToolsResultSchema);
62
+ }
63
+ async callTool(params) {
64
+ return await this.client.request({
65
+ method: "tools/call",
66
+ params,
67
+ }, CallToolResultSchema);
68
+ }
69
+ getServerCapabilities() {
70
+ return this.client.getServerCapabilities();
71
+ }
72
+ getServerVersion() {
73
+ return this.client.getServerVersion();
74
+ }
75
+ }
76
+ export default McpClient;
@@ -0,0 +1,93 @@
1
+ #!/usr/bin/env node
2
+ import cors from "cors";
3
+ import EventSource from "eventsource";
4
+ import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
5
+ import { StdioClientTransport, getDefaultEnvironment, } from "@modelcontextprotocol/sdk/client/stdio.js";
6
+ import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
7
+ import express from "express";
8
+ import mcpProxy from "./mcpProxy.js";
9
+ // Polyfill EventSource for an SSE client in Node.js
10
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
11
+ global.EventSource = EventSource;
12
+ const app = express();
13
+ app.use(cors());
14
+ let webAppTransports = [];
15
+ const createTransport = async (query) => {
16
+ console.log("Query parameters:", query);
17
+ const transportType = query.transportType;
18
+ if (transportType === "stdio") {
19
+ const command = query.command;
20
+ const args = query.args.split(/\s+/);
21
+ const env = query.env ? JSON.parse(query.env) : undefined;
22
+ console.log(`Stdio transport: command=${command}, args=${args}, env=${JSON.stringify(env)}`);
23
+ const transport = new StdioClientTransport({ command, args, env });
24
+ await transport.start();
25
+ console.log("Spawned stdio transport");
26
+ return transport;
27
+ }
28
+ else if (transportType === "sse") {
29
+ const url = query.url;
30
+ console.log(`SSE transport: url=${url}`);
31
+ const transport = new SSEClientTransport(new URL(url));
32
+ await transport.start();
33
+ console.log("Connected to SSE transport");
34
+ return transport;
35
+ }
36
+ else {
37
+ console.error(`Invalid transport type: ${transportType}`);
38
+ throw new Error("Invalid transport type specified");
39
+ }
40
+ };
41
+ app.get("/sse", async (req, res) => {
42
+ try {
43
+ console.log("New SSE connection");
44
+ const backingServerTransport = await createTransport(req.query);
45
+ console.log("Connected MCP client to backing server transport");
46
+ const webAppTransport = new SSEServerTransport("/message", res);
47
+ console.log("Created web app transport");
48
+ webAppTransports.push(webAppTransport);
49
+ console.log("Created web app transport");
50
+ await webAppTransport.start();
51
+ mcpProxy({
52
+ transportToClient: webAppTransport,
53
+ transportToServer: backingServerTransport,
54
+ onerror: (error) => {
55
+ console.error(error);
56
+ },
57
+ });
58
+ console.log("Set up MCP proxy");
59
+ }
60
+ catch (error) {
61
+ console.error("Error in /sse route:", error);
62
+ res.status(500).json(error);
63
+ }
64
+ });
65
+ app.post("/message", async (req, res) => {
66
+ try {
67
+ const sessionId = req.query.sessionId;
68
+ console.log(`Received message for sessionId ${sessionId}`);
69
+ const transport = webAppTransports.find((t) => t.sessionId === sessionId);
70
+ if (!transport) {
71
+ res.status(404).end("Session not found");
72
+ return;
73
+ }
74
+ await transport.handlePostMessage(req, res);
75
+ }
76
+ catch (error) {
77
+ console.error("Error in /message route:", error);
78
+ res.status(500).json(error);
79
+ }
80
+ });
81
+ app.get("/default-environment", (req, res) => {
82
+ try {
83
+ res.json(getDefaultEnvironment());
84
+ }
85
+ catch (error) {
86
+ console.error("Error in /default-environment route:", error);
87
+ res.status(500).json(error);
88
+ }
89
+ });
90
+ const PORT = process.env.PORT || 3000;
91
+ app.listen(PORT, () => {
92
+ console.log(`Server is running on port ${PORT}`);
93
+ });
@@ -0,0 +1,26 @@
1
+ export default function mcpProxy({ transportToClient, transportToServer, onerror, }) {
2
+ let transportToClientClosed = false;
3
+ let transportToServerClosed = false;
4
+ transportToClient.onmessage = (message) => {
5
+ transportToServer.send(message).catch(onerror);
6
+ };
7
+ transportToServer.onmessage = (message) => {
8
+ transportToClient.send(message).catch(onerror);
9
+ };
10
+ transportToClient.onclose = () => {
11
+ if (transportToServerClosed) {
12
+ return;
13
+ }
14
+ transportToClientClosed = true;
15
+ transportToServer.close().catch(onerror);
16
+ };
17
+ transportToServer.onclose = () => {
18
+ if (transportToClientClosed) {
19
+ return;
20
+ }
21
+ transportToServerClosed = true;
22
+ transportToClient.close().catch(onerror);
23
+ };
24
+ transportToClient.onerror = onerror;
25
+ transportToServer.onerror = onerror;
26
+ }