Commit graph

1,941 commits

Author SHA1 Message Date
Cliff Hall
3adaf39371
Merge pull request #1029 from modelcontextprotocol/claude/issue-1028-20260121-1235 0.19.0
Bump version to 0.19.0
2026-01-23 10:30:20 -05:00
Ola Hungerford
edbe2f84f3
Merge branch 'main' into claude/issue-1028-20260121-1235 2026-01-23 08:03:27 -07:00
Cliff Hall
7ef0971c81
Add Tasks support (#1013)
* ### client/src/App.tsx

- Imports:
  - Added: `Task` and `GetTaskResultSchema` to the same import block.
  - UI Icons: Added `ListTodo` from `lucide-react` to the icon imports.
  - Components: Added `TasksTab` import beside `ToolsTab`.
  - Config utils: Added `getMCPTaskTtl` to the config utils import block.

- State additions:
  - `const [tasks, setTasks] = useState<Task[]>([]);`
  - Extended `errors` state to include a `tasks` key: `tasks: null,`
  - `const [selectedTask, setSelectedTask] = useState<Task | null>(null);`
  - `const [isPollingTask, setIsPollingTask] = useState(false);`
  - `const [nextTaskCursor, setNextTaskCursor] = useState<string | undefined>();`

- Hook: `useConnection({...})` return value usage extended
  - Added destructured functions: `cancelTask: cancelMcpTask` and `listTasks: listMcpTasks` from the custom hook.

- Notification handling:
  - In `onNotification`, added:
    - If `method === "notifications/tasks/list_changed"`, call `listTasks()` (voided).
    - If `method === "notifications/tasks/status"`, treat `notification.params` as a `Task` and update `tasks` state: replace if exists by `taskId`, otherwise prepend. Also update `selectedTask` if it’s the same `taskId`.

- Tab routing:
  - When computing valid tabs, added `tasks` when server declares capability: `...(serverCapabilities?.tasks ? ["tasks"] : []),`
  - When choosing a default tab, added a branch to fall back to `"tasks"` if neither resources/prompts/tools are present but tasks are.

- Effect for Tasks tab:
  - When `mcpClient` is connected and `activeTab === "tasks"`, invoke `listTasks()`.

- Tools → task-augmented calls integration in `callTool`:
  - Parameter signature supports `runAsTask?: boolean` (already present in this file), but now:
    - If `runAsTask` is true, augment the `tools/call` request’s `params` with a `task` object: `{ task: { ttl: getMCPTaskTtl(config) } }`.
  - Use a permissive result schema for tool call: `sendMCPRequest(request, z.any(), "tools")` to avoid version-mismatch schema issues.
  - Task reference detection introduced:
    - `isTaskResult` helper checks for a nested `task` object with `taskId` (i.e., `response.task.taskId`).
  - When task is detected:
    - Set `isPollingTask(true)`.
    - Immediately set a temporary `toolResult` that includes text content “Task created: … Polling for status…” and `_meta` with `"io.modelcontextprotocol/related-task": { taskId }`.
    - Start a polling loop:
      - Delay 1s between polls.
      - Call `tasks/get` with `GetTaskResultSchema` for status.
      - If status is `completed`: call `tasks/result` with `z.any()` to retrieve the final result and set it as `toolResult`; call `listTasks()`.
      - If status is `failed` or `cancelled`: set an error `toolResult` content that includes the status + `statusMessage`; call `listTasks()`.
      - Else (still running): update `toolResult` content with current `status`/`statusMessage` and preserve `_meta` related-task.
    - After loop, set `isPollingTask(false)`.
  - When not a task response, set `toolResult` directly from response (cast to `CompatibilityCallToolResult`).

- Tasks list + cancel helpers in App:
  - `listTasks`: uses `listMcpTasks(nextTaskCursor)` from the hook, updates `tasks`, `nextTaskCursor`, and clears `errors.tasks`.
  - `cancelTask`: calls `cancelMcpTask(taskId)`, updates `tasks` array by `taskId`, updates `selectedTask` if it matches, and clears `errors.tasks`.

- UI integration:
  - Added a `TabsTrigger` for “Tasks” with `<ListTodo />` icon, disabled unless server supports tasks.
  - Added `<TasksTab />` to the main `TabsContent` block, passing: `tasks`, `listTasks`, `clearTasks`, `cancelTask`, `selectedTask`, `setSelectedTask`, `error={errors.tasks}`, `nextCursor={nextTaskCursor}`.
  - Passed `isPollingTask={isPollingTask}` and `toolResult` into `ToolsTab` so the Tools tab can show the live “Polling Task…” state and block reruns while polling.

Note: The raw diff is long; the key hunks align with the above bullet points (imports, state, notifications, tab wiring, request augmentation, polling loop, UI additions).

---

### client/src/components/ToolsTab.tsx

- Props shape changed:
  - Added `isPollingTask?: boolean` prop in the destructured props and in the prop types.
  - The `callTool` callback signature is now `(name, params, metadata?, runAsTask?) => Promise<void>` (runAsTask added earlier; test updates elsewhere reflect this).

- Local state additions:
  - `const [runAsTask, setRunAsTask] = useState(false);`

- Reset behavior:
  - When switching tools (`useEffect` on `selectedTool`), reset `runAsTask(false)`.
  - When clearing the list in `ListPane.clearItems`, also call `setRunAsTask(false)`.

- UI additions:
  - New checkbox control block to toggle “Run as task”:
    - Checkbox `id="run-as-task"`, bound to `runAsTask`, with `onCheckedChange` → `setRunAsTask(checked)`.
    - Label “Run as task”.
  - Run button disabling conditions expanded to include `isPollingTask`.
  - Run button text shows spinner with conditional label:
    - If `isToolRunning || isPollingTask` → show spinner and text `isPollingTask ? "Polling Task..." : "Running..."`.

- Call invocation change:
  - When clicking “Run Tool”, the `callTool` is invoked with `(selectedTool.name, params, metadata?, runAsTask)`.

- ToolResults relay:
  - Passes `isPollingTask` to `<ToolResults />`.

---

### client/src/components/ToolResults.tsx

- Props shape changed:
  - Added optional prop: `isPollingTask?: boolean`.

- Task-running banner logic:
  - Extracts related task from the tool result’s `_meta["io.modelcontextprotocol/related-task"]` if present.
  - Computes `isTaskRunning` as `isPollingTask ||` a text-heuristic against `structuredResult.content` entries that contain text like “Polling” or “Task status”.
  - Header “Tool Result:” now conditionally shows:
    - `Error` (red) if `isError` is true, else
    - `Task Running` (yellow) if `isTaskRunning`, else
    - `Success` (green).

No other changes to validation or rendering of content blocks.

---

### client/src/components/TasksTab.tsx (new file)

- A brand new tab to list and inspect tasks.
- Key elements:
  - Imports `Task` type and multiple status icons.
  - `TaskStatusIcon` component maps task `status` to an icon and color.
  - Main `TasksTab` props: `tasks`, `listTasks`, `clearTasks`, `cancelTask`, `selectedTask`, `setSelectedTask`, `error`, `nextCursor`.
  - Left column (`ListPane`): lists tasks, shows status icon, `taskId`, `status`, and last update time; button text changes to “List More Tasks” if `nextCursor` present; disables button if no cursor and list non-empty.
  - Right column:
    - Shows error `Alert` if `error` prop provided.
    - If a task is selected: header with `Task Details`, a Cancel button when `status === "working"` (shows a spinner while cancelling), and a grid of task fields: Status (with colored label and icon), Last Updated, Created At, TTL (shows “Infinite” if `ttl === null`, otherwise shows numeric with `s` suffix), optional Status Message, and full task JSON via `JsonView`.
    - If no task is selected: centered empty state with a “Refresh Tasks” button.

---

### client/src/lib/hooks/useConnection.ts

- Imports added from `@modelcontextprotocol/sdk/types.js`:
  - `ListTasksResultSchema`, `CancelTaskResultSchema`, `TaskStatusNotificationSchema`.

- Client capabilities on `connect`:
  - Added `tasks: { list: {}, cancel: {} }` into the `clientCapabilities` passed to `new Client(...)`.

- Notification handling setup:
  - The hook’s notification schema registration now includes the `TaskStatusNotificationSchema` in the `setNotificationHandler` list so the app receives `notifications/tasks/status`.

- New hook functions:
  - `cancelTask(taskId: string)` sends `tasks/cancel` with `CancelTaskResultSchema`.
  - `listTasks(cursor?: string)` sends `tasks/list` with `ListTasksResultSchema`.

- Exports:
  - Returned object now includes `cancelTask` and `listTasks`.

---

### client/src/utils/configUtils.ts

- Added a new getter:
  - `export const getMCPTaskTtl = (config: InspectorConfig): number => { return config.MCP_TASK_TTL.value as number; };`

---

### client/src/lib/configurationTypes.ts

- `InspectorConfig` type extended with a new item:
  - `MCP_TASK_TTL: ConfigItem;`
  - Includes descriptive JSDoc about default TTL in milliseconds for newly created tasks.

---

### client/src/lib/constants.ts

- `DEFAULT_INSPECTOR_CONFIG` extended with a default for task TTL:
  - Key: `MCP_TASK_TTL`
  - Label: `"Task TTL"`
  - Description: `"Default Time-to-Live (TTL) in milliseconds for newly created tasks"`
  - Default `value: 60000`
  - `is_session_item: false`

---

### client/src/components/__tests__/ToolsTab.test.tsx

- Expectations updated due to new `callTool` signature (4th arg `runAsTask`). Everywhere the test asserts a `callTool` invocation, an additional trailing `false` argument was added to reflect the default state when the box isn’t checked.
  - Examples of added trailing `false` at various assertion points (line offsets from diff): after calls around prior lines 132, 157, 193, 236, 257, 279, 297, 818, 1082 (now passing 4 arguments: name, params, metadata-or-undefined, false).

---

### Additional notes

- The Tasks feature is wired end-to-end:
  - Client capability declaration (list/cancel)
  - Notification handler for `notifications/tasks/status`
  - Tools call augmentation with `task` `{ ttl }`
  - Polling loop using `tasks/get` and `tasks/result`
  - UI feedback in Tools and dedicated Tasks tab
  - Configurable TTL via new config item and getter

* Fix issue where displayed task on task tab was not updated when task completes, leaving the cancel task button available.

* Handle button the same when input_requred or working state

* ### What changed
- Added **receiver-side (client-side) Tasks support** to the Inspector client for task-augmented **server → client** requests.
- When the server sends `sampling/createMessage` or `elicitation/create` with `params.task`, the client now:
  - Creates a local task and immediately returns a `CreateTaskResult` (`{ task: ... }`).
  - Runs the underlying user-driven flow asynchronously.
  - Updates task state to `completed` / `failed` and makes the final payload available via `tasks/result`.
- Implemented server polling handlers backed by the local task store:
  - `tasks/get`
  - `tasks/result` (blocks until payload is ready)
  - `tasks/list`
  - `tasks/cancel`
- Advertises task-augmented request capabilities via `capabilities.tasks.requests.sampling.createMessage` and `capabilities.tasks.requests.elicitation.create` when the corresponding callbacks are provided.
- Emits best-effort `notifications/tasks/status` updates as local task status changes.

* Fix review requests.

* In the ToolsTab, when a tool call results in an elicitation request, the app automatically switches to the elicitation tab, and once submitted, switches back to the ToolsTab to view the result of the tool call.

However, when a tool call results in a sampling request, it does not switch automatically to the SamplingTab and when the sampling request form is submitted it does not automatically switch back to the ToolsTab to view the result of the tool call.

These changes make the sampling use case work like the elicitation one. Tests were added.
2026-01-22 21:40:59 -07:00
claude[bot]
7f6e5792b2 Bump version to 0.19.0 across all packages
- Updated version in root package.json
- Updated version in cli/package.json
- Updated version in client/package.json
- Updated version in server/package.json
- Updated workspace dependencies in root package.json
- Updated package-lock.json via npm install

Co-authored-by: Ola Hungerford <olaservo@users.noreply.github.com>
2026-01-21 12:37:36 +00:00
Cliff Hall
6dc5d1a0bd
Merge pull request #937 from olaservo/add-mcp-docs-server-to-claude
Add MCP docs server to Claude Code GitHub Action
2026-01-20 10:20:36 -05:00
Ola Hungerford
6247e676fe
Merge branch 'main' into add-mcp-docs-server-to-claude 2026-01-19 09:35:42 -07:00
Copilot
da684d0a9d
Update LICENSE and package.json for Linux Foundation transition (#1018)
* Initial plan

* Update LICENSE to Apache 2.0 + MIT + CC-BY-4.0 hybrid license for Linux Foundation transition

Co-authored-by: olaservo <16480113+olaservo@users.noreply.github.com>

* Update package.json license fields to reference LICENSE file

Co-authored-by: olaservo <16480113+olaservo@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: olaservo <16480113+olaservo@users.noreply.github.com>
Co-authored-by: Ola Hungerford <olahungerford@gmail.com>
2026-01-19 09:33:43 -07:00
Bob Dickinson
44d0e580f6
Converted CLI tests to use vitest (#1012)
* Pinned server-everything, fixed all tests to work with current pinned version, fixed problem with undetected failures (isError: true payloads).

* First working vitest implementation

* Refactoring some single-use configs fixtures and into the refeencing tests

* No tests refere to server-everything (or any other server from a registry), all tests actually validate what they say they test.

* Removed server-everything dep from CI, minor cleanup

* Addressed Claude PR review comments: Added tsx dev dependency, beefed up process termination (possible leak on Windows), beefed up http server cleanup (close all connections), removed unused hasValidJsonOutput, reduced CLI timeout to give it breathing room with vitest timeout.

* Made both stdio and http test servers fully composable, cleaned up types, terminology, and usage.
2026-01-19 08:12:00 -07:00
Ola Hungerford
ea82effeed
Merge branch 'main' into add-mcp-docs-server-to-claude 2026-01-18 20:26:54 -07:00
olaservo
4835b7392e Fix allowedTools config to include mcp-docs MCP server tools
Add mcp__mcp-docs to allowedTools so Claude can actually use the
MCP documentation server when reviewing MCP-related code.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 20:26:00 -07:00
olaservo
232f2447e5 Add MCP docs server to Claude Code GitHub Action
- Add .mcp.json with mcp-docs HTTP server configuration
- Update claude.yml to use --mcp-config and --append-system-prompt
- Add instructions for Claude to use MCP docs and schema references

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-18 20:02:31 -07:00
Cliff Hall
94ba4c3b56
* In useConnection.ts (#924)
- in connect()
    - Pass authProvider in transport options
2026-01-18 19:08:43 -07:00
Ahmet Soormally
2bf0dd1a03
fix: omit scope field in OAuth DCR when undefined and improve error handling (#1003)
fix: OAuth DCR scope field compliance

Omits the scope field entirely when undefined, per RFC 7591. This allows OAuth servers to assign default scopes instead of registering clients with no scopes.

Tested with Keycloak DCR.
2026-01-18 14:22:21 -07:00
Cliff Hall
5a7f9961eb
Merge pull request #765 from howardjohn/inspector/error-popup
Add a toast on connection error
2026-01-09 15:55:04 -05:00
Cliff Hall
8cb845798e
Merge branch 'main' into inspector/error-popup 2026-01-09 15:52:22 -05:00
Cliff Hall
4a4968f30f
Merge pull request #1004 from olaservo/update-typescript-sdk
Update typescript sdk to 1.25.2
2026-01-08 12:58:11 -05:00
olaservo
66b84b0431 Update minimum SDK version to ^1.25.2 in package.json files
Ensures fresh installs without lock file get the patched version.

🦉 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 20:51:05 -07:00
olaservo
3c892b2ddf Fix high severity security vulnerabilities
Update @modelcontextprotocol/sdk from 1.24.3 to 1.25.2 to fix ReDoS
vulnerability (GHSA-8r9q-7v3j-jr4g) and qs to 6.14.1 to fix DoS
vulnerability (GHSA-6rw7-vpxm-498p).

🦉 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 20:30:53 -07:00
Cliff Hall
fc8066efe6
Merge pull request #999 from thinhtpt-dev/main
fix: detect 401 errors from `StreamableHTTP` transport in client
2026-01-07 16:19:45 -05:00
cliffhall
f7bf100a65 Fix is401Error 2026-01-07 14:23:46 -05:00
Cliff Hall
04898cb5ce
Update client/src/lib/hooks/useConnection.ts 2026-01-07 14:16:22 -05:00
Cliff Hall
fdd5bec519
Merge branch 'main' into main 2026-01-07 14:07:26 -05:00
Cliff Hall
36a7244f86
Update client/src/lib/hooks/useConnection.ts
Adding fix for Via Proxy mode
2026-01-07 14:07:17 -05:00
Ola Hungerford
82067f3c2d
Merge pull request #1001 from cliffhall/allow-claude-pr-reviews-from-forks
Allow Claude to code review PRs from forks
2026-01-06 16:32:50 -07:00
cliffhall
775726b958 prettier 2026-01-06 16:31:38 -05:00
cliffhall
1c265b9260 Remove claude_pr_review.yml as it turns out there is a GitHub restriction that keeps secrets from being accessed on PRs from forks. We will have to request reviews manually.
* Modify claude.yml

1. Added "Get PR details" step (NEW - lines 28-51)
This new step runs ONLY when the trigger is a PR-related comment. It:

- Detects if it's a PR comment vs regular issue
- Fetches the PR information using GitHub API
- Extracts the fork's repository name and commit SHA
- Sets them as outputs (steps.pr.outputs.sha and steps.pr.outputs.repo)

Why? The original workflow couldn't see fork PR code because it only checked out the main repo.

2. Split checkout into TWO conditional steps (CHANGED - lines 53-62)
Before: One checkout step that always checked out main repo with fetch-depth: 1
After: Two checkout steps:

- "Checkout PR branch" - Runs if PR details were fetched successfully, checks out the fork's PR branch
- "Checkout repository" - Runs otherwise (for regular issues), checks out main repo

Why? Need different checkout behavior for PRs (checkout fork) vs issues (checkout main).

3. Changed fetch-depth from 1 to 0 (CHANGED)
Before: fetch-depth: 1 (only latest commit)
After: fetch-depth: 0 (full git history)
Why? Claude Code needs more context to understand the codebase and provide better reviews.

Summary
The original workflow could only see the main repo's code. When you commented @claude on a fork PR, it would review the wrong code!
These changes make it check out the actual PR branch from the fork when reviewing PRs, while keeping the original behavior for regular issues.
2026-01-06 16:25:57 -05:00
cliffhall
7e6cc16fba Change instructions to prompt in claude_pr_review.yml 2026-01-06 15:50:15 -05:00
cliffhall
33b71992e4 Allow Claude to safely do code review automatically and from forks. Doesn't change the existing Claude workflow.
* Added claude_pr_review.yml
2026-01-06 15:36:17 -05:00
thinhtpt-dev
e1886a8229 fix: detect 401 errors from StreamableHTTP transport in client 2026-01-06 14:00:13 +07:00
Ola Hungerford
fe393e514a
Merge pull request #974 from DaleSeo/anyof-description
Show description for anyOf fields in JSON editor
2025-12-22 08:11:46 -07:00
Dale Seo
6eed736d23 fix: display description for anyOf fields in JSON editor 2025-12-18 16:40:50 -05:00
Ola Hungerford
f5d9c187c6
Merge pull request #972 from cliffhall/update-readme-about-docker
Update docker launch command
2025-12-18 05:09:33 -07:00
Cliff Hall
1977e2a597
Merge pull request #966 from olaservo/fix/streamable-http-401-handling 0.17.6 0.18.0
fix: detect 401 errors from StreamableHTTP transport for OAuth flow
2025-12-13 18:04:34 -05:00
cliffhall
6de14a36b6 Update docker launch command 2025-12-13 17:45:43 -05:00
Ola Hungerford
8ea530cee9
Merge pull request #971 from cliffhall/bump-ts-sdk-version
Bump TS SDK version to 1.24.3
2025-12-13 10:48:41 -07:00
cliffhall
96e256687e Bump TS SDK version to 1.24.3 2025-12-13 12:01:40 -05:00
Cliff Hall
e7018c0e23
Merge pull request #969 from olaservo/release/v0.18.0
chore: bump version to 0.18.0
2025-12-13 11:11:43 -05:00
olaservo
b3a27297c8 chore: bump version to 0.18.0
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-12 08:08:44 -07:00
Ola Hungerford
5778a3a93e
Merge pull request #926 from bolinfest/sapling-pr-archive-bolinfest
fix: allow empty elicitation form data when all fields are optional
2025-12-11 21:34:12 -07:00
Ola Hungerford
bce61b2d34
Merge pull request #968 from Vijaydaswani/fix/icon-theme-property
feat: add theme property to Icon and Prompt types
2025-12-11 20:42:53 -07:00
Vijay Daswani
1e1b9e3619 feat: add theme property to Icon and Prompt types 2025-12-12 01:25:30 +04:00
Ola Hungerford
2056622607
Merge pull request #952 from cliffhall/sep-1330-enums
Add support for SEP-1330 Elicitation Enums
2025-12-09 20:28:14 -07:00
Ola Hungerford
3d15778a86
Merge pull request #964 from koic/fix_broken_links_to_contributing_md
[Docs] Fix broken CONTRIBUTING.md links in GitHub templates
2025-12-08 18:38:28 -07:00
olaservo
d1fcbd2c93 fix: detect 401 errors from StreamableHTTP transport for OAuth flow
The server-side error handling only checked for SseError instances
when detecting 401 responses from MCP servers. StreamableHTTPClientTransport
throws a different error type (generic Error with "HTTP 401" message)
when there's no authProvider configured.

This caused the proxy to return 500 instead of 401 to the client,
preventing the OAuth discovery and redirect flow from triggering.

Added is401Error() helper that checks for:
- SseError with code 401
- StreamableHTTPError with code 401
- Generic Error with "HTTP 401" or "(401)" in message

Fixes #960

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-08 07:22:29 -07:00
Koichi ITO
171d6b42b4 [Docs] Fix broken CONTRIBUTING.md links in GitHub templates
The links were broken because the relative paths were incorrect.
2025-12-08 16:50:43 +09:00
Ola Hungerford
2b79e36464
Merge pull request #963 from DaleSeo/patch-1
fix issue link in CONTRIBUTING.md
2025-12-07 15:24:45 -07:00
Dale Seo
25618173b2
fix issue link in CONTRIBUTING.md 2025-12-07 16:52:31 -05:00
Cliff Hall
976d77f05a
Merge pull request #958 from olaservo/update-pr-template
Update V2 messaging to clarify V1 focus
2025-12-06 10:39:05 -05:00
Ola Hungerford
06f4b25a11
Merge branch 'main' into update-pr-template 2025-12-05 09:05:19 -07:00
olaservo
de5b23bb5a Update V2 messaging to clarify V1 focus on bug fixes and spec compliance
Clarify in contribution guidelines that during V2 development, V1
contributions should focus on bug fixes and MCP spec compliance.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-05 08:58:35 -07:00