@modelcontextprotocol/inspector 2.9.0 → 2.10.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.
@@ -1,4 +1,4 @@
1
- import{a as e,c as t,d as n,i as r,l as i,n as a,o,r as s,s as c,t as l,u}from"./index-DgXruQhz.js";function d(e,n){if(e==null)return{};var r,i,a=t(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i<o.length;i++)r=o[i],n.indexOf(r)===-1&&{}.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}function f(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function p(e){if(Array.isArray(e))return f(e)}function m(e){if(typeof Symbol<`u`&&e[Symbol.iterator]!=null||e[`@@iterator`]!=null)return Array.from(e)}function h(e,t){if(e){if(typeof e==`string`)return f(e,t);var n={}.toString.call(e).slice(8,-1);return n===`Object`&&e.constructor&&(n=e.constructor.name),n===`Map`||n===`Set`?Array.from(e):n===`Arguments`||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?f(e,t):void 0}}function g(){throw TypeError(`Invalid attempt to spread non-iterable instance.
1
+ import{a as e,c as t,d as n,i as r,l as i,n as a,o,r as s,s as c,t as l,u}from"./index-DgDEc2gL.js";function d(e,n){if(e==null)return{};var r,i,a=t(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i<o.length;i++)r=o[i],n.indexOf(r)===-1&&{}.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}function f(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function p(e){if(Array.isArray(e))return f(e)}function m(e){if(typeof Symbol<`u`&&e[Symbol.iterator]!=null||e[`@@iterator`]!=null)return Array.from(e)}function h(e,t){if(e){if(typeof e==`string`)return f(e,t);var n={}.toString.call(e).slice(8,-1);return n===`Object`&&e.constructor&&(n=e.constructor.name),n===`Map`||n===`Set`?Array.from(e):n===`Arguments`||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?f(e,t):void 0}}function g(){throw TypeError(`Invalid attempt to spread non-iterable instance.
2
2
  In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function _(e){return p(e)||m(e)||h(e)||g()}function v(e){"@babel/helpers - typeof";return v=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},v(e)}function y(e,t){if(v(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(v(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function b(e){var t=y(e,`string`);return v(t)==`symbol`?t:t+``}function x(e,t,n){return(t=b(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var S=n(u());function C(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function w(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?C(Object(n),!0).forEach(function(t){x(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):C(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function T(e){var t=e.length;if(t===0||t===1)return e;if(t===2)return[e[0],e[1],`${e[0]}.${e[1]}`,`${e[1]}.${e[0]}`];if(t===3)return[e[0],e[1],e[2],`${e[0]}.${e[1]}`,`${e[0]}.${e[2]}`,`${e[1]}.${e[0]}`,`${e[1]}.${e[2]}`,`${e[2]}.${e[0]}`,`${e[2]}.${e[1]}`,`${e[0]}.${e[1]}.${e[2]}`,`${e[0]}.${e[2]}.${e[1]}`,`${e[1]}.${e[0]}.${e[2]}`,`${e[1]}.${e[2]}.${e[0]}`,`${e[2]}.${e[0]}.${e[1]}`,`${e[2]}.${e[1]}.${e[0]}`];if(t>=4)return[e[0],e[1],e[2],e[3],`${e[0]}.${e[1]}`,`${e[0]}.${e[2]}`,`${e[0]}.${e[3]}`,`${e[1]}.${e[0]}`,`${e[1]}.${e[2]}`,`${e[1]}.${e[3]}`,`${e[2]}.${e[0]}`,`${e[2]}.${e[1]}`,`${e[2]}.${e[3]}`,`${e[3]}.${e[0]}`,`${e[3]}.${e[1]}`,`${e[3]}.${e[2]}`,`${e[0]}.${e[1]}.${e[2]}`,`${e[0]}.${e[1]}.${e[3]}`,`${e[0]}.${e[2]}.${e[1]}`,`${e[0]}.${e[2]}.${e[3]}`,`${e[0]}.${e[3]}.${e[1]}`,`${e[0]}.${e[3]}.${e[2]}`,`${e[1]}.${e[0]}.${e[2]}`,`${e[1]}.${e[0]}.${e[3]}`,`${e[1]}.${e[2]}.${e[0]}`,`${e[1]}.${e[2]}.${e[3]}`,`${e[1]}.${e[3]}.${e[0]}`,`${e[1]}.${e[3]}.${e[2]}`,`${e[2]}.${e[0]}.${e[1]}`,`${e[2]}.${e[0]}.${e[3]}`,`${e[2]}.${e[1]}.${e[0]}`,`${e[2]}.${e[1]}.${e[3]}`,`${e[2]}.${e[3]}.${e[0]}`,`${e[2]}.${e[3]}.${e[1]}`,`${e[3]}.${e[0]}.${e[1]}`,`${e[3]}.${e[0]}.${e[2]}`,`${e[3]}.${e[1]}.${e[0]}`,`${e[3]}.${e[1]}.${e[2]}`,`${e[3]}.${e[2]}.${e[0]}`,`${e[3]}.${e[2]}.${e[1]}`,`${e[0]}.${e[1]}.${e[2]}.${e[3]}`,`${e[0]}.${e[1]}.${e[3]}.${e[2]}`,`${e[0]}.${e[2]}.${e[1]}.${e[3]}`,`${e[0]}.${e[2]}.${e[3]}.${e[1]}`,`${e[0]}.${e[3]}.${e[1]}.${e[2]}`,`${e[0]}.${e[3]}.${e[2]}.${e[1]}`,`${e[1]}.${e[0]}.${e[2]}.${e[3]}`,`${e[1]}.${e[0]}.${e[3]}.${e[2]}`,`${e[1]}.${e[2]}.${e[0]}.${e[3]}`,`${e[1]}.${e[2]}.${e[3]}.${e[0]}`,`${e[1]}.${e[3]}.${e[0]}.${e[2]}`,`${e[1]}.${e[3]}.${e[2]}.${e[0]}`,`${e[2]}.${e[0]}.${e[1]}.${e[3]}`,`${e[2]}.${e[0]}.${e[3]}.${e[1]}`,`${e[2]}.${e[1]}.${e[0]}.${e[3]}`,`${e[2]}.${e[1]}.${e[3]}.${e[0]}`,`${e[2]}.${e[3]}.${e[0]}.${e[1]}`,`${e[2]}.${e[3]}.${e[1]}.${e[0]}`,`${e[3]}.${e[0]}.${e[1]}.${e[2]}`,`${e[3]}.${e[0]}.${e[2]}.${e[1]}`,`${e[3]}.${e[1]}.${e[0]}.${e[2]}`,`${e[3]}.${e[1]}.${e[2]}.${e[0]}`,`${e[3]}.${e[2]}.${e[0]}.${e[1]}`,`${e[3]}.${e[2]}.${e[1]}.${e[0]}`]}var E={};function D(e){if(e.length===0||e.length===1)return e;var t=e.join(`.`);return E[t]||(E[t]=T(e)),E[t]}function O(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},n=arguments.length>2?arguments[2]:void 0;return D(e.filter(function(e){return e!==`token`})).reduce(function(e,t){return w(w({},e),n[t])},t)}function k(e){return e.join(` `)}function A(e,t){var n=0;return function(r){return n+=1,r.map(function(r,i){return j({node:r,stylesheet:e,useInlineStyles:t,key:`code-segment-${n}-${i}`})})}}function j(e){var t=e.node,n=e.stylesheet,r=e.style,a=r===void 0?{}:r,o=e.useInlineStyles,s=e.key,c=t.properties,l=t.type,u=t.tagName,d=t.value;if(l===`text`)return d;if(u){var f=A(n,o),p;if(!o)p=w(w({},c),{},{className:k(c.className)});else{var m=Object.keys(n).reduce(function(e,t){return t.split(`.`).forEach(function(t){e.includes(t)||e.push(t)}),e},[]),h=c.className&&c.className.includes(`token`)?[`token`]:[],g=c.className&&h.concat(c.className.filter(function(e){return!m.includes(e)}));p=w(w({},c),{},{className:k(g)||void 0,style:O(c.className,Object.assign({},c.style,a),n)})}var _=f(t.children);return S.createElement(u,i({key:s},p),_)}}var M=(function(e,t){return e.listLanguages().indexOf(t)!==-1}),ee=[`language`,`children`,`style`,`customStyle`,`codeTagProps`,`useInlineStyles`,`showLineNumbers`,`showInlineLineNumbers`,`startingLineNumber`,`lineNumberContainerStyle`,`lineNumberStyle`,`wrapLines`,`wrapLongLines`,`lineProps`,`renderer`,`PreTag`,`CodeTag`,`code`,`astGenerator`];function N(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function P(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]==null?{}:arguments[t];t%2?N(Object(n),!0).forEach(function(t){x(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):N(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}var F=/\n/g;function I(e){return e.match(F)}function L(e){var t=e.lines,n=e.startingLineNumber,r=e.style;return t.map(function(e,t){var i=t+n;return S.createElement(`span`,{key:`line-${t}`,className:`react-syntax-highlighter-line-number`,style:typeof r==`function`?r(i):r},`${i}
3
3
  `)})}function te(e){var t=e.codeString,n=e.codeStyle,r=e.containerStyle,i=r===void 0?{float:`left`,paddingRight:`10px`}:r,a=e.numberStyle,o=a===void 0?{}:a,s=e.startingLineNumber;return S.createElement(`code`,{style:Object.assign({},n,i)},L({lines:t.replace(/\n$/,``).split(`
4
4
  `),style:o,startingLineNumber:s}))}function R(e){return`${e.toString().length}.25em`}function z(e,t){return{type:`element`,tagName:`span`,properties:{key:`line-number--${e}`,className:[`comment`,`linenumber`,`react-syntax-highlighter-line-number`],style:t},children:[{type:`text`,value:e}]}}function B(e,t,n){var r={display:`inline-block`,minWidth:R(n),paddingRight:`1em`,textAlign:`right`,userSelect:`none`},i=typeof e==`function`?e(t):e;return P(P({},r),i)}function V(e){var t=e.children,n=e.lineNumber,r=e.lineNumberStyle,i=e.largestLineNumber,a=e.showInlineLineNumbers,o=e.lineProps,s=o===void 0?{}:o,c=e.className,l=c===void 0?[]:c,u=e.showLineNumbers,d=e.wrapLongLines,f=e.wrapLines,p=f!==void 0&&f?P({},typeof s==`function`?s(n):s):{};if(p.className=p.className?[].concat(_(p.className.trim().split(/\s+/)),_(l)):l,n&&a){var m=B(r,n,i);t.unshift(z(n,m))}return d&u&&(p.style=P({display:`flex`},p.style)),{type:`element`,tagName:`span`,properties:p,children:t}}function H(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:[],n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[];e.length===void 0&&(e=[e]);for(var r=0;r<e.length;r++){var i=e[r];if(i.type===`text`)n.push(V({children:[i],className:_(new Set(t))}));else if(i.children){var a=t.concat(i.properties?.className||[]);H(i.children,a).forEach(function(e){return n.push(e)})}}return n}function ne(e,t,n,r,i,a,o,s,c){var l,u=H(e.value),d=[],f=-1,p=0;function m(e,a){return V({children:e,lineNumber:a,lineNumberStyle:s,largestLineNumber:o,showInlineLineNumbers:i,lineProps:n,className:arguments.length>2&&arguments[2]!==void 0?arguments[2]:[],showLineNumbers:r,wrapLongLines:c,wrapLines:t})}function h(e,t){if(r&&t&&i){var n=B(s,t,o);e.unshift(z(t,n))}return e}function g(e,n){var r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:[];return t||r.length>0?m(e,n,r):h(e,n)}for(var _=function(){var e=u[p],t=e.children[0].value;if(I(t)){var n=t.split(`
@@ -8,7 +8,7 @@
8
8
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
9
9
  <link href="https://fonts.googleapis.com/css2?family=Fredoka:wght@300..700&family=Roboto+Mono:ital,wght@0,100..700;1,100..700&display=swap" rel="stylesheet" />
10
10
  <title>MCP Inspector</title>
11
- <script type="module" crossorigin src="/assets/index-DgXruQhz.js"></script>
11
+ <script type="module" crossorigin src="/assets/index-DgDEc2gL.js"></script>
12
12
  <link rel="stylesheet" crossorigin href="/assets/index-dqp8Sd8W.css">
13
13
  </head>
14
14
  <body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@modelcontextprotocol/inspector",
3
- "version": "2.9.0",
3
+ "version": "2.10.1",
4
4
  "description": "The Model Context Protocol Inspector",
5
5
  "keywords": [
6
6
  "MCP",
@@ -18,7 +18,9 @@
18
18
  "author": "The MCP Maintainers and Community",
19
19
  "type": "module",
20
20
  "bin": {
21
- "mcp-inspector": "./clients/launcher/build/index.js"
21
+ "inspector": "./clients/launcher/build/index.js",
22
+ "mcp-inspector": "./clients/launcher/build/index.js",
23
+ "mcpdo": "./clients/mcpdo/build/mcp-bin.js"
22
24
  },
23
25
  "files": [
24
26
  "clients/launcher/build",
@@ -26,21 +28,26 @@
26
28
  "clients/web/dist",
27
29
  "clients/web/static",
28
30
  "clients/cli/build",
31
+ "clients/mcpdo/build",
29
32
  "clients/tui/build",
30
- "scripts/install-clients.mjs"
33
+ "scripts/install-clients.mjs",
34
+ "skills/mcpdo"
31
35
  ],
32
36
  "scripts": {
33
37
  "web": "node clients/launcher/build/index.js --web",
34
38
  "build:web:runner": "cd clients/web && npm run build:runner",
35
39
  "web:dev": "npm run build:web:runner && node clients/launcher/build/index.js --web --dev",
36
- "build": "npm run build:web && npm run build:cli && npm run build:tui && npm run build:launcher",
40
+ "build": "npm run build:web && npm run build:cli && npm run build:mcpdo && npm run build:tui && npm run build:launcher",
37
41
  "build:cli": "cd clients/cli && npm run build",
42
+ "build:mcpdo": "cd clients/mcpdo && npm run build",
43
+ "build:mcpdo:dev": "cd clients/mcpdo && npm run build:dev",
38
44
  "build:tui": "cd clients/tui && npm run build",
39
45
  "build:web": "cd clients/web && npm run build",
40
46
  "build:launcher": "cd clients/launcher && npm run build",
41
47
  "local:gate": "node scripts/gate-lease.mjs npm run local:gate:stages",
42
- "local:gate:stages": "npm run local:validate && npm run verify:skills:cli && npm run coverage && npm run verify:build-gate && npm run verify:bundle-externals && npm run smoke && npm run smoke:web:firefox && npm run local:storybook",
43
- "local:validate": "npm run validate:guards && npm run validate:core && cd clients/web && npm run check && cd ../cli && npm run check && cd ../tui && npm run check && cd ../launcher && npm run check",
48
+ "local:gate:stages": "npm run local:validate && npm run local:dco && npm run verify:skills:cli && npm run coverage && npm run verify:build-gate && npm run verify:bundle-externals && npm run smoke && npm run smoke:web:firefox && npm run local:storybook",
49
+ "local:validate": "npm run validate:guards && npm run validate:core && cd clients/web && npm run check && cd ../cli && npm run check && cd ../mcpdo && npm run check && cd ../tui && npm run check && cd ../launcher && npm run check",
50
+ "local:dco": "node scripts/dco-check.mjs --base origin/v2/main --exclude origin/main",
44
51
  "local:storybook": "cd clients/web && npx playwright install chromium && npm run test:storybook",
45
52
  "verify:build-gate": "node scripts/verify-build-gate.mjs",
46
53
  "verify:bundle-externals": "node scripts/verify-bundle-externals.mjs",
@@ -48,7 +55,25 @@
48
55
  "verify:skills": "node scripts/verify-skills.mjs",
49
56
  "verify:skills:cli": "node scripts/verify-skills-cli.mjs",
50
57
  "test:scripts": "node --test \"scripts/**/*.test.mjs\"",
51
- "validate": "npm run validate:guards && npm run validate:core && npm run validate:web && npm run validate:cli && npm run validate:tui && npm run validate:launcher",
58
+ "pr:review-request": "node scripts/pr-review-request.mjs",
59
+ "pr:review-wait": "node scripts/pr-review-wait.mjs",
60
+ "pr:review-fetch": "node scripts/pr-review-fetch.mjs",
61
+ "pr:link": "node scripts/pr-link-issue.mjs",
62
+ "dco:check": "node scripts/dco-check.mjs",
63
+ "pr:upload": "node scripts/pr-upload-screenshot.mjs",
64
+ "board:status": "node scripts/board-card-status.mjs",
65
+ "board:add": "node scripts/board-card-add.mjs",
66
+ "board:delete": "node scripts/board-card-delete.mjs",
67
+ "board:find-draft": "node scripts/board-draft-find.mjs",
68
+ "board:snapshot": "node scripts/board-snapshot.mjs",
69
+ "board:sweep": "node scripts/board-sweep.mjs",
70
+ "board:audit": "node scripts/board-audit.mjs",
71
+ "board:recover": "node scripts/board-recover.mjs",
72
+ "advisory:fork": "node scripts/advisory-fork.mjs",
73
+ "release:notes": "node scripts/release-notes.mjs",
74
+ "release:tag": "node scripts/release-tag.mjs",
75
+ "action:resolve-pin": "node scripts/action-pin-resolve.mjs",
76
+ "validate": "npm run validate:guards && npm run validate:core && npm run validate:web && npm run validate:cli && npm run validate:mcpdo && npm run validate:tui && npm run validate:launcher",
52
77
  "validate:guards": "npm run verify:install-fresh && npm run verify:format-coverage && npm run verify:skills && npm run verify:typecheck-coverage && npm run verify:dep-lockstep && npm run verify:test-timeouts && npm run verify:action-pins && npm run test:scripts",
53
78
  "verify:format-coverage": "node scripts/verify-format-coverage.mjs",
54
79
  "verify:dep-lockstep": "node scripts/verify-dep-lockstep.mjs",
@@ -64,18 +89,21 @@
64
89
  "format:check:scripts": "prettier --check \"scripts/**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}\"",
65
90
  "format:shared": "prettier --write \"test-servers/src/**/*.{ts,tsx,mts,cts}\" vitest.shared.mts vitest.setup.shared.mts eslint.config.js",
66
91
  "format:check:shared": "prettier --check \"test-servers/src/**/*.{ts,tsx,mts,cts}\" vitest.shared.mts vitest.setup.shared.mts eslint.config.js",
67
- "format": "npm run format:core && npm run format:scripts && npm run format:shared && cd clients/web && npm run format && cd ../cli && npm run format && cd ../tui && npm run format && cd ../launcher && npm run format",
92
+ "format": "npm run format:core && npm run format:scripts && npm run format:shared && cd clients/web && npm run format && cd ../cli && npm run format && cd ../mcpdo && npm run format && cd ../tui && npm run format && cd ../launcher && npm run format",
68
93
  "validate:cli": "cd clients/cli && npm run validate",
94
+ "validate:mcpdo": "cd clients/mcpdo && npm run validate",
69
95
  "validate:tui": "cd clients/tui && npm run validate",
70
96
  "validate:web": "cd clients/web && npm run validate",
71
97
  "validate:launcher": "cd clients/launcher && npm run validate",
72
- "coverage": "npm run coverage:web && npm run coverage:cli && npm run coverage:tui && npm run coverage:launcher",
98
+ "coverage": "npm run coverage:web && npm run coverage:cli && npm run coverage:mcpdo && npm run coverage:tui && npm run coverage:launcher",
73
99
  "coverage:cli": "cd clients/cli && npm run test:coverage",
100
+ "coverage:mcpdo": "cd clients/mcpdo && npm run test:coverage",
74
101
  "coverage:tui": "cd clients/tui && npm run test:coverage",
75
102
  "coverage:web": "cd clients/web && npm run test:coverage",
76
103
  "coverage:launcher": "cd clients/launcher && npm run test:coverage",
77
- "smoke": "npm run smoke:launcher && npm run smoke:cli && npm run smoke:tui && npm run smoke:web && npm run smoke:web:chromium && npm run smoke:web:tabs",
104
+ "smoke": "npm run smoke:launcher && npm run smoke:cli && npm run smoke:mcpdo && npm run smoke:tui && npm run smoke:web && npm run smoke:web:chromium && npm run smoke:web:tabs",
78
105
  "smoke:cli": "node scripts/smoke-cli.mjs",
106
+ "smoke:mcpdo": "node scripts/smoke-mcpdo.mjs",
79
107
  "smoke:tui": "node scripts/smoke-tui.mjs",
80
108
  "smoke:web": "node scripts/smoke-web.mjs",
81
109
  "smoke:web:browser": "node scripts/install-smoke-browser.mjs && node scripts/smoke-web-browser.mjs",
@@ -90,13 +118,15 @@
90
118
  "pack:verify": "node scripts/install-smoke-browser.mjs chromium && node scripts/pack-and-verify.mjs",
91
119
  "prepack": "npm run build",
92
120
  "postinstall": "node scripts/install-clients.mjs",
93
- "skills:eval": "node scripts/skill-eval.mjs"
121
+ "skills:eval": "node scripts/skill-eval.mjs",
122
+ "skills:eval:mcpdo": "node scripts/skill-eval-mcpdo.mjs"
94
123
  },
95
124
  "dependencies": {
96
125
  "@hono/node-server": "^2.0.12",
97
126
  "@modelcontextprotocol/client": "2.2.0",
98
127
  "@modelcontextprotocol/core": "2.2.0",
99
128
  "@modelcontextprotocol/ext-apps": "^2.0.0",
129
+ "@modelcontextprotocol/ext-tasks": "^0.2.2",
100
130
  "@modelcontextprotocol/server": "2.2.0",
101
131
  "@napi-rs/keyring": "^1.3.0",
102
132
  "@vitejs/plugin-react": "^6.0.0",
@@ -27,7 +27,7 @@ import { dirname, join, resolve, sep } from "node:path";
27
27
  import { fileURLToPath } from "node:url";
28
28
 
29
29
  const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
30
- const CLIENTS = ["web", "cli", "tui", "launcher"];
30
+ const CLIENTS = ["web", "cli", "mcpdo", "tui", "launcher"];
31
31
 
32
32
  if (process.env.INSPECTOR_SKIP_CLIENT_INSTALL) {
33
33
  console.log(
@@ -0,0 +1,165 @@
1
+ ---
2
+ name: mcpdo
3
+ description: Access MCP (Model Context Protocol) servers and their tools, resources, and prompts through the mcpdo CLI — connections it holds extend your capabilities alongside any built-in MCP support. Use this skill for any question or task about MCP servers, connections, or tools (e.g. "what MCP servers am I connected to?", "what MCP tools do I have?"), and whenever a task requires inspecting, testing, or scripting against an MCP server (stdio or HTTP) rather than writing custom client code.
4
+ disable-model-invocation: false
5
+ ---
6
+
7
+ # mcpdo — MCP Inspector connection CLI
8
+
9
+ Connect to an MCP server once, then run many commands against that named
10
+ connection.
11
+
12
+ ```bash
13
+ mcpdo servers/list # catalog entries you can connect
14
+ mcpdo connect entry-name # connect a catalog entry
15
+ mcpdo connect https://example.com/mcp # ad-hoc HTTP/SSE target
16
+ mcpdo connect node server.js # ad-hoc stdio target
17
+
18
+ mcpdo connections/list # open connections
19
+ mcpdo @entry-name tools/list
20
+ mcpdo @entry-name tools/call <toolName> arg:=value
21
+ mcpdo @entry-name resources/list
22
+ mcpdo @entry-name resources/read <uri>
23
+ mcpdo @entry-name prompts/list
24
+
25
+ mcpdo --connection entry-name tools/list # flag form of @entry-name
26
+
27
+ mcpdo disconnect entry-name
28
+ ```
29
+
30
+ The canonical flow is `servers/list` → `connect <entry>` → `@entry <command>`.
31
+ Run `mcpdo help` or `mcpdo <command> --help` for the full, authoritative list of
32
+ commands and flags (auth management, elicitation controls, daemon control, and
33
+ more).
34
+
35
+ ## How to think about mcpdo
36
+
37
+ - **Connections extend your toolset.** Treat every open connection's tools,
38
+ resources, and prompts as part of your available capabilities: when facing a
39
+ task (or before saying "I can't do that"), check `mcpdo connections/list`
40
+ and the connected servers' `tools/list`, and call those tools mid-task like
41
+ any built-in tool.
42
+ - **Answer capability questions with it.** "What MCP servers/tools do I have?"
43
+ includes mcpdo connections (`connections/list`) and catalog entries that are
44
+ connectable but not connected (`servers/list`).
45
+ - **Don't auto-connect.** Catalog entries don't describe capabilities, and
46
+ connecting can start an auth flow involving the human. Connect when the user
47
+ directs it, or when a task clearly needs it — and say so first.
48
+ - **Inspect via commands, not the filesystem.** Entries, connections, auth
49
+ state, and daemon state all have read commands; never list or read
50
+ `~/.mcp-inspector` directly. The one exception is _editing_ the catalog
51
+ (below).
52
+ - **Make it always-on (optional).** Skills load only on demand; for standing
53
+ awareness of mcpdo in a project, append `mcpdo agent-help --instructions`
54
+ output to the project's `CLAUDE.md`/`AGENTS.md`. (`mcpdo agent-help`
55
+ prints this guide; `--skill-path` prints the installable skill file's
56
+ path.)
57
+
58
+ ## The catalog
59
+
60
+ - `servers/list` / `servers/show <name>` read the **catalog**: the writable
61
+ entry file at `~/.mcp-inspector/mcp.json` (standard `mcpServers` shape),
62
+ overridable per shell via `--catalog <path>` or `MCP_CATALOG_PATH`.
63
+ `servers/list` prints the resolved source path.
64
+ - `servers/*` shows entries on disk; `connections/*` shows live daemon state.
65
+ Two shells with different catalogs share the same connections.
66
+ - There are no CLI edit commands, by design: add or remove entries by editing
67
+ the catalog file directly. `mcpdo connect entry --config path/to/mcp.json`
68
+ instead connects an entry from a read-only foreign config file.
69
+
70
+ ## Conventions
71
+
72
+ - `--format json` outputs JSON; the default, `--format text`, is
73
+ human-readable.
74
+ - Always qualify commands with `@name` or `--connection <name>` (shorthand
75
+ `--conn`) from an agent shell: with non-interactive (non-TTY) stdin, mcpdo
76
+ requires an explicit connection and errors without one. Omitting it falls
77
+ back to the most-recently-used connection only on an interactive TTY, or
78
+ anywhere when `MCP_ALLOW_DEFAULT_CONNECTION=1` is set.
79
+ - Connections persist across separate `mcpdo` invocations and **self-heal**: a
80
+ dropped transport (expired session, exited stdio child) transparently
81
+ re-dials on next use with stored credentials. Don't monitor or reconnect
82
+ manually; only an `auth_required` error needs action (re-run `connect`).
83
+ `mcpdo disconnect` ends one connection; `mcpdo daemon stop` resets
84
+ everything.
85
+ - The `[legacy]` / `[modern]` era tag on `connections/list` is the negotiated
86
+ protocol generation (`legacy` = classic `initialize` handshake — current and
87
+ fine, not deprecated). Informational only.
88
+
89
+ ## Auth
90
+
91
+ - Auth is automatic at connect time and stored for reuse (`mcpdo auth/list` /
92
+ `mcpdo auth/clear`). `auth/list` shows each stored URL with the catalog or
93
+ connection names it is "known as" and a `● live` marker when a current
94
+ connection holds it, so the store entries line up with the servers you use.
95
+ `auth/clear` accepts either the store URL or one of those friendly names
96
+ (`mcpdo auth/clear hosted-everything`); a name that resolves to no URL (a
97
+ stdio server) or to more than one URL is rejected with guidance. EMA IdP
98
+ login records lead with their bare issuer URL and carry a trailing
99
+ `enterprise IdP login` marker, and clear by that bare issuer URL
100
+ (`mcpdo auth/clear https://idp.example.com`). Run `connect` as its **own
101
+ command** — never chained with `&&`, `;`, or a follow-on
102
+ `tools/list`/`connections/show`. A connect that needs sign-in exits 0 while
103
+ the connection is still unusable, so a chained command runs against a
104
+ not-yet-connected server, errors, and clutters the output you relay to the
105
+ user. Connect, check whether it returned `pendingAuth`, and only then decide
106
+ the next step. When a
107
+ browser sign-in is needed and stdin is non-TTY,
108
+ `connect` exits 0 immediately with `pendingAuth: true` and an `authUrl`.
109
+ The connection is **not** connected and **not** usable until the user signs
110
+ in — exit 0 is not success here. Show that `authUrl` to the user as literal
111
+ plain text as the **last thing in your reply**, ask them to open it, sign in,
112
+ and tell you when they're done, then **end your turn and wait**. Do not retry
113
+ the command, poll, sleep, or say you are connected: the user can't see your
114
+ message until the turn ends, so any further tool call in the same turn only
115
+ delays the link reaching them. Once the user says they have signed in, run
116
+ `connections/show @name` to complete the sign-in, then continue the original
117
+ task. (`connections/show @name` completes a finished sign-in itself and
118
+ reprints the `authUrl` if you need to show it again; `connections/list` stays
119
+ read-only but reports `pendingAuthSignedIn: true` — "signed in — completing on
120
+ next use" — once the user's part is done.) Never reconnect to fix a pending
121
+ sign-in.
122
+ - To force a fresh sign-in on an already-open connection, `mcpdo disconnect
123
+ <name> --clear-auth` (`-c`) tears it down and clears its stored tokens in one
124
+ step, so the next plain `connect` re-triggers the browser flow. Prefer it over
125
+ a separate `disconnect` + `auth/clear <url>` — it takes the connection name
126
+ (not the URL) and closes the window where the live connection keeps working on
127
+ in-memory tokens. `connect <name> --relogin` (`-r`) is the equivalent when you
128
+ are reconnecting anyway.
129
+ - Enterprise-managed auth (EMA) works the same way. `mcpdo auth/ema-login`
130
+ from a non-TTY shell exits 0 immediately with `pendingLogin: true` and an
131
+ `authUrl`. Show that `authUrl` to the user as literal plain text as the last
132
+ thing in your reply, ask them to sign in and tell you when they're done, then
133
+ end your turn and wait — do not poll while they are signing in. Once they
134
+ confirm, run `mcpdo auth/ema-status`; `loginState` reads `logged_in` once the
135
+ sign-in has completed in the background. After that, connects to EMA servers
136
+ mint
137
+ tokens silently with no further sign-in. Connecting to an EMA server
138
+ *without* a prior IdP login parks like any other pending sign-in, with the
139
+ IdP link as its `authUrl`. `mcpdo auth/ema-logout` clears local EMA state
140
+ only; when the IdP advertises an end-session endpoint the output includes a
141
+ URL to end the IdP browser session too — relay it to the user, who may
142
+ ignore it if they only meant to reset local state.
143
+ - Tokens live in the OS keychain when one is available. On keychain-less
144
+ hosts mcpdo falls back to the shared secrets file (never the in-memory
145
+ store — mcpdo is multi-process, so a per-process store can't carry a token
146
+ from the sign-in helper to the daemon). `MCP_INSPECTOR_SECRET_STORE`
147
+ (`keyring|file|memory`) still overrides explicitly.
148
+
149
+ ## Elicitations (server asks a question mid-call)
150
+
151
+ - On an interactive TTY, mcpdo prompts inline. From an agent shell (non-TTY or
152
+ `--format json`), the **command returns immediately** (exit 0) with an
153
+ `elicitationPending` payload carrying the question, schema, and an
154
+ `elicitationId`; the underlying MCP **tool call stays parked** on the daemon
155
+ awaiting your response. Never wait on or time-box the mcpdo command itself —
156
+ it has already exited; the pending work lives daemon-side.
157
+ - Answer with `mcpdo elicitation/respond <elicitationId> field:=value ...`
158
+ (repeat if the server asks again), or end it with `--decline` or `--cancel`.
159
+ For URL-mode elicitations, relay the URL to the user, then confirm with
160
+ `elicitation/respond <id> --done` (or `--cancel`; URL mode has no decline).
161
+ The response returns the
162
+ final tool result.
163
+ - Parked calls expire after 10 minutes; one parked call per connection. Pass
164
+ `--elicit off` on `connect` to have well-behaved servers fall back to their
165
+ own defaults instead of asking.