Let a server hand a form `elicitation/create` to an MCP App and return the app's ordinary `ElicitResult`, with the native elicitation form as the fallback on every failure. No second extension, no custom method, and no custom result shape: the only new wire surface is a nested `elicitation` flag on the existing `io.modelcontextprotocol/ui` extension on each side, plus `_meta.ui.resourceUri` on the request. App rendering is selected only when all four gates hold — client `elicitation.form`, client MCP Apps MIME type, the nested `elicitation` setting on BOTH peers, and a valid absolute `ui://` URI on the request. Only the web client advertises the nested client-side setting, and only because it has a sandbox renderer: supplying `InspectorClientOptions.appElicitation` is what opts a client in, so CLI and TUI keep advertising the MIME type without ever claiming they can resolve an elicitation through an app. Routing lives in the one funnel both entry points already use (`enqueuePendingElicitation`), so the inbound handler and the MRTR driver cannot diverge. Ownership is request-scoped — a per-request id keys the renderer, iframe and bridge — so two concurrent elicitations can never resolve through each other's bridges. An explicit `decline`/`cancel` is a completed elicitation and goes back to the server; everything else (absent or malformed metadata, resource/sandbox/bridge failure, an app with no elicitation capability, a timeout, an invalid result or one that fails the requested schema) falls back. The Inspector speaks the ext-apps#733 / SEP-3118 wire protocol but cannot yet consume its helpers — the released `@modelcontextprotocol/ext-apps` (1.7.5) predates that PR. `core/mcp/appElicitation.ts` and `AppRenderer/requestAppElicitation.ts` mirror it exactly and are marked for deletion once a release containing it ships. One consequence needed its own seam: ext-apps 1.7.5 parses the view's `ui/initialize` through a schema that strips `elicitation`, so an app that correctly advertises it would look like one that did not, silently turning every negotiated elicitation into a fallback. `AppRenderer/appCapabilities.ts` records the raw frame instead, and prefers the bridge's own value once it carries the key. `AppRenderer` now takes an `AppRenderSource` union rather than a `Tool`, so the same renderer and bridge factory serve an App tool and an elicitation without either faking the other's shape. Adds the public fixture (`app_choose_option` + a self-contained `ui://demo/choose-option.html` app covering accept/decline/cancel), its two showcase configs, and `smoke:web:elicit`, which drives the negotiated path end to end in headless Chromium and then the same tool against a server that never advertised the capability, asserting the native form takes it. Closes #1854 Signed-off-by: cliffhall <cliff@futurescale.com>
115 lines
5.6 KiB
JSON
115 lines
5.6 KiB
JSON
{
|
|
"name": "@modelcontextprotocol/inspector",
|
|
"version": "2.3.0",
|
|
"description": "The Model Context Protocol Inspector",
|
|
"keywords": [
|
|
"MCP",
|
|
"inspector"
|
|
],
|
|
"homepage": "https://github.com/modelcontextprotocol/inspector#readme",
|
|
"bugs": {
|
|
"url": "https://github.com/modelcontextprotocol/inspector/issues"
|
|
},
|
|
"repository": {
|
|
"type": "git",
|
|
"url": "git+https://github.com/modelcontextprotocol/inspector.git"
|
|
},
|
|
"license": "MIT",
|
|
"author": "The MCP Maintainers and Community",
|
|
"type": "module",
|
|
"bin": {
|
|
"mcp-inspector": "./clients/launcher/build/index.js"
|
|
},
|
|
"files": [
|
|
"clients/launcher/build",
|
|
"clients/web/build",
|
|
"clients/web/dist",
|
|
"clients/web/static",
|
|
"clients/cli/build",
|
|
"clients/tui/build",
|
|
"scripts/install-clients.mjs"
|
|
],
|
|
"scripts": {
|
|
"web": "node clients/launcher/build/index.js --web",
|
|
"build:web:runner": "cd clients/web && npm run build:runner",
|
|
"web:dev": "npm run build:web:runner && node clients/launcher/build/index.js --web --dev",
|
|
"build": "npm run build:web && npm run build:cli && npm run build:tui && npm run build:launcher",
|
|
"build:cli": "cd clients/cli && npm run build",
|
|
"build:tui": "cd clients/tui && npm run build",
|
|
"build:web": "cd clients/web && npm run build",
|
|
"build:launcher": "cd clients/launcher && npm run build",
|
|
"ci": "npm run validate && npm run coverage && npm run verify:build-gate && npm run smoke && npm run ci:storybook",
|
|
"ci:storybook": "cd clients/web && npx playwright install chromium && npm run test:storybook",
|
|
"verify:build-gate": "node scripts/verify-build-gate.mjs",
|
|
"verify:typecheck-coverage": "node scripts/verify-typecheck-coverage.mjs",
|
|
"test:scripts": "node --test \"scripts/**/*.test.mjs\"",
|
|
"validate": "npm run verify:format-coverage && npm run verify:typecheck-coverage && npm run verify:dep-lockstep && npm run test:scripts && npm run validate:core && npm run validate:web && npm run validate:cli && npm run validate:tui && npm run validate:launcher",
|
|
"verify:format-coverage": "node scripts/verify-format-coverage.mjs",
|
|
"verify:dep-lockstep": "node scripts/verify-dep-lockstep.mjs",
|
|
"validate:core": "npm run format:check:core && npm run format:check:scripts && npm run format:check:shared && npm run lint:core && npm run lint:shared",
|
|
"lint:core": "eslint \"core/**/*.{ts,tsx}\"",
|
|
"lint:shared": "eslint \"test-servers/src/**/*.{ts,tsx,mts,cts}\" vitest.shared.mts eslint.config.js",
|
|
"format:core": "prettier --write \"core/**/*.{ts,tsx}\"",
|
|
"format:check:core": "prettier --check \"core/**/*.{ts,tsx}\"",
|
|
"format:scripts": "prettier --write \"scripts/**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}\"",
|
|
"format:check:scripts": "prettier --check \"scripts/**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}\"",
|
|
"format:shared": "prettier --write \"test-servers/src/**/*.{ts,tsx,mts,cts}\" vitest.shared.mts eslint.config.js",
|
|
"format:check:shared": "prettier --check \"test-servers/src/**/*.{ts,tsx,mts,cts}\" vitest.shared.mts eslint.config.js",
|
|
"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",
|
|
"validate:cli": "cd clients/cli && npm run validate",
|
|
"validate:tui": "cd clients/tui && npm run validate",
|
|
"validate:web": "cd clients/web && npm run validate",
|
|
"validate:launcher": "cd clients/launcher && npm run validate",
|
|
"coverage": "npm run coverage:web && npm run coverage:cli && npm run coverage:tui && npm run coverage:launcher",
|
|
"coverage:cli": "cd clients/cli && npm run test:coverage",
|
|
"coverage:tui": "cd clients/tui && npm run test:coverage",
|
|
"coverage:web": "cd clients/web && npm run test:coverage",
|
|
"coverage:launcher": "cd clients/launcher && npm run test:coverage",
|
|
"smoke": "npm run smoke:launcher && npm run smoke:cli && npm run smoke:tui && npm run smoke:web && npm run smoke:web:browser && npm run smoke:web:app && npm run smoke:web:elicit",
|
|
"smoke:cli": "node scripts/smoke-cli.mjs",
|
|
"smoke:tui": "node scripts/smoke-tui.mjs",
|
|
"smoke:web": "node scripts/smoke-web.mjs",
|
|
"smoke:web:browser": "cd clients/web && npx playwright install chromium && node ../../scripts/smoke-web-browser.mjs",
|
|
"smoke:web:app": "cd clients/web && npx playwright install chromium && node ../../scripts/smoke-web-app.mjs",
|
|
"smoke:web:elicit": "cd clients/web && npx playwright install chromium && node ../../scripts/smoke-web-elicitation.mjs",
|
|
"smoke:launcher": "node scripts/smoke-launcher.mjs",
|
|
"pack:verify": "node scripts/pack-and-verify.mjs",
|
|
"prepack": "npm run build",
|
|
"postinstall": "node scripts/install-clients.mjs"
|
|
},
|
|
"dependencies": {
|
|
"@hono/node-server": "^2.0.12",
|
|
"@modelcontextprotocol/client": "2.0.0",
|
|
"@modelcontextprotocol/core": "2.0.0",
|
|
"@modelcontextprotocol/ext-apps": "^1.7.4",
|
|
"@modelcontextprotocol/server": "2.0.0",
|
|
"@modelcontextprotocol/server-legacy": "2.0.0",
|
|
"@napi-rs/keyring": "^1.3.0",
|
|
"@vitejs/plugin-react": "^6.0.0",
|
|
"ajv": "^8.17.1",
|
|
"atomically": "^2.1.1",
|
|
"chokidar": "^4.0.3",
|
|
"commander": "^13.1.0",
|
|
"hono": "^4.12.18",
|
|
"ink": "^6.0.0",
|
|
"open": "^10.2.0",
|
|
"pino": "^9.14.0",
|
|
"react": "^19.0.0",
|
|
"undici": "^8.5.0",
|
|
"vite": "^8.1.5",
|
|
"yaml": "^2.9.0",
|
|
"zod": "^4.4.3"
|
|
},
|
|
"engines": {
|
|
"node": ">=22.19.0"
|
|
},
|
|
"devDependencies": {
|
|
"@eslint/js": "^10.0.1",
|
|
"eslint": "^10.8.0",
|
|
"express": "^5.2.1",
|
|
"globals": "^17.7.0",
|
|
"prettier": "3.8.4",
|
|
"typescript": "~5.9.3",
|
|
"typescript-eslint": "^8.65.0"
|
|
}
|
|
}
|