mcp-inspect 1.0.0

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.
Files changed (72) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +107 -0
  3. package/dist/src/App.d.ts +7 -0
  4. package/dist/src/App.d.ts.map +1 -0
  5. package/dist/src/App.js +591 -0
  6. package/dist/src/App.js.map +1 -0
  7. package/dist/src/components/DetailsModal.d.ts +11 -0
  8. package/dist/src/components/DetailsModal.d.ts.map +1 -0
  9. package/dist/src/components/DetailsModal.js +50 -0
  10. package/dist/src/components/DetailsModal.js.map +1 -0
  11. package/dist/src/components/HistoryTab.d.ts +13 -0
  12. package/dist/src/components/HistoryTab.d.ts.map +1 -0
  13. package/dist/src/components/HistoryTab.js +122 -0
  14. package/dist/src/components/HistoryTab.js.map +1 -0
  15. package/dist/src/components/InfoTab.d.ts +13 -0
  16. package/dist/src/components/InfoTab.d.ts.map +1 -0
  17. package/dist/src/components/InfoTab.js +28 -0
  18. package/dist/src/components/InfoTab.js.map +1 -0
  19. package/dist/src/components/NotificationsTab.d.ts +13 -0
  20. package/dist/src/components/NotificationsTab.d.ts.map +1 -0
  21. package/dist/src/components/NotificationsTab.js +37 -0
  22. package/dist/src/components/NotificationsTab.js.map +1 -0
  23. package/dist/src/components/PromptsTab.d.ts +13 -0
  24. package/dist/src/components/PromptsTab.d.ts.map +1 -0
  25. package/dist/src/components/PromptsTab.js +60 -0
  26. package/dist/src/components/PromptsTab.js.map +1 -0
  27. package/dist/src/components/ResourcesTab.d.ts +13 -0
  28. package/dist/src/components/ResourcesTab.d.ts.map +1 -0
  29. package/dist/src/components/ResourcesTab.js +60 -0
  30. package/dist/src/components/ResourcesTab.js.map +1 -0
  31. package/dist/src/components/Tabs.d.ts +24 -0
  32. package/dist/src/components/Tabs.d.ts.map +1 -0
  33. package/dist/src/components/Tabs.js +22 -0
  34. package/dist/src/components/Tabs.js.map +1 -0
  35. package/dist/src/components/ToolTestModal.d.ts +11 -0
  36. package/dist/src/components/ToolTestModal.d.ts.map +1 -0
  37. package/dist/src/components/ToolTestModal.js +112 -0
  38. package/dist/src/components/ToolTestModal.js.map +1 -0
  39. package/dist/src/components/ToolsTab.d.ts +14 -0
  40. package/dist/src/components/ToolsTab.d.ts.map +1 -0
  41. package/dist/src/components/ToolsTab.js +76 -0
  42. package/dist/src/components/ToolsTab.js.map +1 -0
  43. package/dist/src/hooks/useMCPClient.d.ts +41 -0
  44. package/dist/src/hooks/useMCPClient.d.ts.map +1 -0
  45. package/dist/src/hooks/useMCPClient.js +179 -0
  46. package/dist/src/hooks/useMCPClient.js.map +1 -0
  47. package/dist/src/hooks/useMessageTracking.d.ts +9 -0
  48. package/dist/src/hooks/useMessageTracking.d.ts.map +1 -0
  49. package/dist/src/hooks/useMessageTracking.js +124 -0
  50. package/dist/src/hooks/useMessageTracking.js.map +1 -0
  51. package/dist/src/types/focus.d.ts +2 -0
  52. package/dist/src/types/focus.d.ts.map +1 -0
  53. package/dist/src/types/focus.js +2 -0
  54. package/dist/src/types/focus.js.map +1 -0
  55. package/dist/src/types/messages.d.ts +14 -0
  56. package/dist/src/types/messages.d.ts.map +1 -0
  57. package/dist/src/types/messages.js +2 -0
  58. package/dist/src/types/messages.js.map +1 -0
  59. package/dist/src/types.d.ts +48 -0
  60. package/dist/src/types.d.ts.map +1 -0
  61. package/dist/src/types.js +2 -0
  62. package/dist/src/types.js.map +1 -0
  63. package/dist/src/utils/schemaToForm.d.ts +9 -0
  64. package/dist/src/utils/schemaToForm.d.ts.map +1 -0
  65. package/dist/src/utils/schemaToForm.js +107 -0
  66. package/dist/src/utils/schemaToForm.js.map +1 -0
  67. package/dist/tui.d.ts +3 -0
  68. package/dist/tui.d.ts.map +1 -0
  69. package/dist/tui.js +43 -0
  70. package/dist/tui.js.map +1 -0
  71. package/package.json +58 -0
  72. package/screenshots/mcp-inspector.png +0 -0
@@ -0,0 +1,9 @@
1
+ import type { MessageHistory, JSONRPCRequest, JSONRPCNotification, JSONRPCResultResponse, JSONRPCErrorResponse } from '../types/messages.js';
2
+ export declare function useMessageTracking(): {
3
+ history: MessageHistory;
4
+ trackRequest: (serverName: string, message: JSONRPCRequest) => string;
5
+ trackResponse: (serverName: string, message: JSONRPCResultResponse | JSONRPCErrorResponse) => void;
6
+ trackNotification: (serverName: string, message: JSONRPCNotification) => void;
7
+ clearHistory: (serverName?: string) => void;
8
+ };
9
+ //# sourceMappingURL=useMessageTracking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMessageTracking.d.ts","sourceRoot":"","sources":["../../../src/hooks/useMessageTracking.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EAErB,MAAM,sBAAsB,CAAC;AAE9B,wBAAgB,kBAAkB;;+BAIc,MAAM,WAAW,cAAc;gCAuB9B,MAAM,WAAW,qBAAqB,GAAG,oBAAoB;oCA8EzD,MAAM,WAAW,mBAAmB;gCAcxC,MAAM;EAoBtD"}
@@ -0,0 +1,124 @@
1
+ import { useState, useCallback, useRef } from 'react';
2
+ export function useMessageTracking() {
3
+ const [history, setHistory] = useState({});
4
+ const pendingRequestsRef = useRef(new Map());
5
+ const trackRequest = useCallback((serverName, message) => {
6
+ const entry = {
7
+ id: `${serverName}-${Date.now()}-${Math.random()}`,
8
+ timestamp: new Date(),
9
+ direction: 'request',
10
+ message,
11
+ };
12
+ if ('id' in message && message.id !== null && message.id !== undefined) {
13
+ pendingRequestsRef.current.set(message.id, {
14
+ timestamp: entry.timestamp,
15
+ serverName,
16
+ });
17
+ }
18
+ setHistory((prev) => ({
19
+ ...prev,
20
+ [serverName]: [...(prev[serverName] || []), entry],
21
+ }));
22
+ return entry.id;
23
+ }, []);
24
+ const trackResponse = useCallback((serverName, message) => {
25
+ if (!('id' in message) || message.id === undefined) {
26
+ // Response without an ID (shouldn't happen, but handle it)
27
+ return;
28
+ }
29
+ const entryId = message.id;
30
+ const pending = pendingRequestsRef.current.get(entryId);
31
+ if (pending && pending.serverName === serverName) {
32
+ pendingRequestsRef.current.delete(entryId);
33
+ const duration = Date.now() - pending.timestamp.getTime();
34
+ setHistory((prev) => {
35
+ const serverHistory = prev[serverName] || [];
36
+ // Find the matching request by message ID
37
+ const requestIndex = serverHistory.findIndex((e) => e.direction === 'request' && 'id' in e.message && e.message.id === entryId);
38
+ if (requestIndex !== -1) {
39
+ // Update the request entry with the response
40
+ const updatedHistory = [...serverHistory];
41
+ updatedHistory[requestIndex] = {
42
+ ...updatedHistory[requestIndex],
43
+ response: message,
44
+ duration,
45
+ };
46
+ return { ...prev, [serverName]: updatedHistory };
47
+ }
48
+ // If no matching request found, create a new entry
49
+ const newEntry = {
50
+ id: `${serverName}-${Date.now()}-${Math.random()}`,
51
+ timestamp: new Date(),
52
+ direction: 'response',
53
+ message,
54
+ duration: 0,
55
+ };
56
+ return {
57
+ ...prev,
58
+ [serverName]: [...serverHistory, newEntry],
59
+ };
60
+ });
61
+ }
62
+ else {
63
+ // Response without a matching request (might be from a different server or orphaned)
64
+ setHistory((prev) => {
65
+ const serverHistory = prev[serverName] || [];
66
+ // Check if there's a matching request in the history
67
+ const requestIndex = serverHistory.findIndex((e) => e.direction === 'request' && 'id' in e.message && e.message.id === entryId);
68
+ if (requestIndex !== -1) {
69
+ // Update the request entry with the response
70
+ const updatedHistory = [...serverHistory];
71
+ updatedHistory[requestIndex] = {
72
+ ...updatedHistory[requestIndex],
73
+ response: message,
74
+ };
75
+ return { ...prev, [serverName]: updatedHistory };
76
+ }
77
+ // Create a new entry for orphaned response
78
+ const newEntry = {
79
+ id: `${serverName}-${Date.now()}-${Math.random()}`,
80
+ timestamp: new Date(),
81
+ direction: 'response',
82
+ message,
83
+ };
84
+ return {
85
+ ...prev,
86
+ [serverName]: [...serverHistory, newEntry],
87
+ };
88
+ });
89
+ }
90
+ }, []);
91
+ const trackNotification = useCallback((serverName, message) => {
92
+ const entry = {
93
+ id: `${serverName}-${Date.now()}-${Math.random()}`,
94
+ timestamp: new Date(),
95
+ direction: 'notification',
96
+ message,
97
+ };
98
+ setHistory((prev) => ({
99
+ ...prev,
100
+ [serverName]: [...(prev[serverName] || []), entry],
101
+ }));
102
+ }, []);
103
+ const clearHistory = useCallback((serverName) => {
104
+ if (serverName) {
105
+ setHistory((prev) => {
106
+ const updated = { ...prev };
107
+ delete updated[serverName];
108
+ return updated;
109
+ });
110
+ }
111
+ else {
112
+ setHistory({});
113
+ pendingRequestsRef.current.clear();
114
+ }
115
+ }, []);
116
+ return {
117
+ history,
118
+ trackRequest,
119
+ trackResponse,
120
+ trackNotification,
121
+ clearHistory,
122
+ };
123
+ }
124
+ //# sourceMappingURL=useMessageTracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMessageTracking.js","sourceRoot":"","sources":["../../../src/hooks/useMessageTracking.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export type FocusArea = 'serverList' | 'tabs' | 'tabContentList' | 'tabContentDetails' | 'messagesList' | 'messagesDetail';
2
+ //# sourceMappingURL=focus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus.d.ts","sourceRoot":"","sources":["../../../src/types/focus.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GACjB,YAAY,GACZ,MAAM,GAEN,gBAAgB,GAEhB,mBAAmB,GAEnB,cAAc,GACd,gBAAgB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=focus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"focus.js","sourceRoot":"","sources":["../../../src/types/focus.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ import type { JSONRPCRequest, JSONRPCNotification, JSONRPCResultResponse, JSONRPCErrorResponse, JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
2
+ export type { JSONRPCRequest, JSONRPCNotification, JSONRPCResultResponse, JSONRPCErrorResponse, JSONRPCMessage };
3
+ export interface MessageEntry {
4
+ id: string;
5
+ timestamp: Date;
6
+ direction: 'request' | 'response' | 'notification';
7
+ message: JSONRPCRequest | JSONRPCNotification | JSONRPCResultResponse | JSONRPCErrorResponse;
8
+ response?: JSONRPCResultResponse | JSONRPCErrorResponse;
9
+ duration?: number;
10
+ }
11
+ export interface MessageHistory {
12
+ [serverName: string]: MessageEntry[];
13
+ }
14
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/types/messages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACf,MAAM,oCAAoC,CAAC;AAE5C,YAAY,EACV,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACf,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,SAAS,GAAG,UAAU,GAAG,cAAc,CAAC;IACnD,OAAO,EAAE,cAAc,GAAG,mBAAmB,GAAG,qBAAqB,GAAG,oBAAoB,CAAC;IAC7F,QAAQ,CAAC,EAAE,qBAAqB,GAAG,oBAAoB,CAAC;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,EAAE,CAAC;CACtC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/types/messages.ts"],"names":[],"mappings":""}
@@ -0,0 +1,48 @@
1
+ export interface StdioServerConfig {
2
+ type?: 'stdio';
3
+ command: string;
4
+ args?: string[];
5
+ env?: Record<string, string>;
6
+ cwd?: string;
7
+ }
8
+ export interface SseServerConfig {
9
+ type: 'sse';
10
+ url: string;
11
+ headers?: Record<string, string>;
12
+ eventSourceInit?: Record<string, unknown>;
13
+ requestInit?: Record<string, unknown>;
14
+ }
15
+ export interface StreamableHttpServerConfig {
16
+ type: 'streamableHttp';
17
+ url: string;
18
+ headers?: Record<string, string>;
19
+ requestInit?: Record<string, unknown>;
20
+ }
21
+ export type MCPServerConfig = StdioServerConfig | SseServerConfig | StreamableHttpServerConfig;
22
+ export interface MCPConfig {
23
+ mcpServers: Record<string, MCPServerConfig>;
24
+ }
25
+ export type ConnectionStatus = 'disconnected' | 'connecting' | 'connected' | 'error';
26
+ export interface StderrLogEntry {
27
+ timestamp: Date;
28
+ message: string;
29
+ }
30
+ export interface ServerState {
31
+ status: ConnectionStatus;
32
+ error: string | null;
33
+ capabilities: {
34
+ resources?: boolean;
35
+ prompts?: boolean;
36
+ tools?: boolean;
37
+ };
38
+ serverInfo?: {
39
+ name?: string;
40
+ version?: string;
41
+ };
42
+ instructions?: string;
43
+ resources: any[];
44
+ prompts: any[];
45
+ tools: any[];
46
+ stderrLogs: StderrLogEntry[];
47
+ }
48
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAGD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,KAAK,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAGD,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,gBAAgB,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACvC;AAED,MAAM,MAAM,eAAe,GAAG,iBAAiB,GAAG,eAAe,GAAG,0BAA0B,CAAC;AAE/F,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;CAC7C;AAED,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC;AAErF,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,EAAE;QACZ,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,CAAC;IACF,UAAU,CAAC,EAAE;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,GAAG,EAAE,CAAC;IACjB,OAAO,EAAE,GAAG,EAAE,CAAC;IACf,KAAK,EAAE,GAAG,EAAE,CAAC;IACb,UAAU,EAAE,cAAc,EAAE,CAAC;CAC9B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Converts JSON Schema to ink-form format
3
+ */
4
+ import type { FormStructure } from 'ink-form';
5
+ /**
6
+ * Converts a JSON Schema to ink-form structure
7
+ */
8
+ export declare function schemaToForm(schema: any, toolName: string): FormStructure;
9
+ //# sourceMappingURL=schemaToForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemaToForm.d.ts","sourceRoot":"","sources":["../../../src/utils/schemaToForm.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAA0B,MAAM,UAAU,CAAC;AAEtE;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa,CA0GzE"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Converts JSON Schema to ink-form format
3
+ */
4
+ /**
5
+ * Converts a JSON Schema to ink-form structure
6
+ */
7
+ export function schemaToForm(schema, toolName) {
8
+ const fields = [];
9
+ if (!schema || !schema.properties) {
10
+ return {
11
+ title: `Test Tool: ${toolName}`,
12
+ sections: [{ title: 'Parameters', fields: [] }],
13
+ };
14
+ }
15
+ const properties = schema.properties || {};
16
+ const required = schema.required || [];
17
+ for (const [key, prop] of Object.entries(properties)) {
18
+ const property = prop;
19
+ const baseField = {
20
+ name: key,
21
+ label: property.title || key,
22
+ required: required.includes(key),
23
+ };
24
+ let field;
25
+ // Handle enum -> select
26
+ if (property.enum) {
27
+ if (property.type === 'array' && property.items?.enum) {
28
+ // For array of enums, we'll use select but handle it differently
29
+ // Note: ink-form doesn't have multiselect, so we'll use select
30
+ field = {
31
+ type: 'select',
32
+ ...baseField,
33
+ options: property.items.enum.map((val) => ({
34
+ label: String(val),
35
+ value: String(val),
36
+ })),
37
+ };
38
+ }
39
+ else {
40
+ // Single select
41
+ field = {
42
+ type: 'select',
43
+ ...baseField,
44
+ options: property.enum.map((val) => ({
45
+ label: String(val),
46
+ value: String(val),
47
+ })),
48
+ };
49
+ }
50
+ }
51
+ else {
52
+ // Map JSON Schema types to ink-form types
53
+ switch (property.type) {
54
+ case 'string':
55
+ field = {
56
+ type: 'string',
57
+ ...baseField,
58
+ };
59
+ break;
60
+ case 'integer':
61
+ field = {
62
+ type: 'integer',
63
+ ...baseField,
64
+ ...(property.minimum !== undefined && { min: property.minimum }),
65
+ ...(property.maximum !== undefined && { max: property.maximum }),
66
+ };
67
+ break;
68
+ case 'number':
69
+ field = {
70
+ type: 'float',
71
+ ...baseField,
72
+ ...(property.minimum !== undefined && { min: property.minimum }),
73
+ ...(property.maximum !== undefined && { max: property.maximum }),
74
+ };
75
+ break;
76
+ case 'boolean':
77
+ field = {
78
+ type: 'boolean',
79
+ ...baseField,
80
+ };
81
+ break;
82
+ default:
83
+ // Default to string for unknown types
84
+ field = {
85
+ type: 'string',
86
+ ...baseField,
87
+ };
88
+ }
89
+ }
90
+ // Set initial value from default
91
+ if (property.default !== undefined) {
92
+ field.initialValue = property.default;
93
+ }
94
+ fields.push(field);
95
+ }
96
+ const sections = [
97
+ {
98
+ title: 'Parameters',
99
+ fields,
100
+ },
101
+ ];
102
+ return {
103
+ title: `Test Tool: ${toolName}`,
104
+ sections,
105
+ };
106
+ }
107
+ //# sourceMappingURL=schemaToForm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemaToForm.js","sourceRoot":"","sources":["../../../src/utils/schemaToForm.ts"],"names":[],"mappings":"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"}
package/dist/tui.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=tui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../tui.tsx"],"names":[],"mappings":""}
package/dist/tui.js ADDED
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env node
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { render } from 'ink';
4
+ import App from './src/App.js';
5
+ const args = process.argv.slice(2);
6
+ const configFile = args[0];
7
+ if (!configFile) {
8
+ console.error('Usage: mcp-inspect <config-file.json>');
9
+ process.exit(1);
10
+ }
11
+ // Switch to alternate screen (like vim, top, etc.)
12
+ // This preserves the terminal history and switches back automatically on exit
13
+ process.stdout.write('\x1b[?1049h'); // Switch to alternate screen
14
+ const instance = render(_jsx(App, { configFile: configFile }));
15
+ // Set up cleanup on exit function
16
+ const exitWithCleanup = (code = 0) => {
17
+ try {
18
+ instance.unmount();
19
+ }
20
+ catch (error) {
21
+ // Ignore errors on unmount
22
+ }
23
+ try {
24
+ instance.cleanup();
25
+ }
26
+ catch (error) {
27
+ // Ignore errors on cleanup
28
+ }
29
+ // Switch back from alternate screen
30
+ process.stdout.write('\x1b[?1049l'); // Switch back from alternate screen
31
+ process.stdout.write('', () => { }); // Force flush
32
+ process.exit(code);
33
+ };
34
+ // Update App with exit callback
35
+ instance.rerender(_jsx(App, { configFile: configFile, onExit: exitWithCleanup }));
36
+ // Handle various exit signals (for Ctrl+C, etc.)
37
+ process.on('SIGINT', () => {
38
+ exitWithCleanup(0);
39
+ });
40
+ process.on('SIGTERM', () => {
41
+ exitWithCleanup(0);
42
+ });
43
+ //# sourceMappingURL=tui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../tui.tsx"],"names":[],"mappings":";;AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,GAAG,MAAM,cAAc,CAAC;AAE/B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAE3B,IAAI,CAAC,UAAU,EAAE,CAAC;IAChB,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;IACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,mDAAmD;AACnD,8EAA8E;AAC9E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,6BAA6B;AAElE,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAC,GAAG,IAAC,UAAU,EAAE,UAAU,GAAI,CAAC,CAAC;AAEzD,kCAAkC;AAClC,MAAM,eAAe,GAAG,CAAC,OAAe,CAAC,EAAE,EAAE;IAC3C,IAAI,CAAC;QACH,QAAQ,CAAC,OAAO,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,2BAA2B;IAC7B,CAAC;IACD,IAAI,CAAC;QACH,QAAQ,CAAC,OAAO,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,2BAA2B;IAC7B,CAAC;IAED,oCAAoC;IACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,oCAAoC;IACzE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,cAAc;IAElD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC,CAAC;AAEF,gCAAgC;AAChC,QAAQ,CAAC,QAAQ,CAAC,KAAC,GAAG,IAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,GAAI,CAAC,CAAC;AAE5E,iDAAiD;AACjD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,eAAe,CAAC,CAAC,CAAC,CAAC;AACrB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;IACzB,eAAe,CAAC,CAAC,CAAC,CAAC;AACrB,CAAC,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "mcp-inspect",
3
+ "version": "1.0.0",
4
+ "description": "A terminal UI (TUI) inspector for Model Context Protocol (MCP) servers",
5
+ "type": "module",
6
+ "main": "dist/tui.js",
7
+ "bin": {
8
+ "mcp-inspect": "./dist/tui.js"
9
+ },
10
+ "files": [
11
+ "dist/",
12
+ "LICENSE",
13
+ "README.md",
14
+ "screenshots/"
15
+ ],
16
+ "scripts": {
17
+ "start": "tsx tui.tsx",
18
+ "build": "tsc",
19
+ "dev": "tsx tui.tsx",
20
+ "test": "echo \"Error: no test specified\" && exit 1",
21
+ "everything-sse": "./scripts/run-everything-sse.sh",
22
+ "prepublishOnly": "npm run build"
23
+ },
24
+ "keywords": [
25
+ "mcp",
26
+ "model-context-protocol",
27
+ "inspector",
28
+ "tui",
29
+ "terminal-ui",
30
+ "cli",
31
+ "mcp-server",
32
+ "debug",
33
+ "development-tools"
34
+ ],
35
+ "author": "TeamSpark, LLC",
36
+ "license": "MIT",
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "https://github.com/TeamSparkAI/mcp-inspect.git"
40
+ },
41
+ "bugs": {
42
+ "url": "https://github.com/TeamSparkAI/mcp-inspect/issues"
43
+ },
44
+ "homepage": "https://github.com/TeamSparkAI/mcp-inspect#readme",
45
+ "dependencies": {
46
+ "@modelcontextprotocol/sdk": "^1.25.2",
47
+ "ink": "^6.6.0",
48
+ "ink-form": "^2.0.1",
49
+ "ink-scroll-view": "^0.3.5",
50
+ "react": "^19.2.3"
51
+ },
52
+ "devDependencies": {
53
+ "@types/node": "^25.0.3",
54
+ "@types/react": "^19.2.7",
55
+ "tsx": "^4.21.0",
56
+ "typescript": "^5.9.3"
57
+ }
58
+ }
Binary file