diff --git a/documentation/docs/getting-started/using-extensions.md b/documentation/docs/getting-started/using-extensions.md
index a04e5b882f25..6ad1e7c67753 100644
--- a/documentation/docs/getting-started/using-extensions.md
+++ b/documentation/docs/getting-started/using-extensions.md
@@ -153,8 +153,7 @@ See available servers in the **[MCP Server Directory](https://www.pulsemcp.com/s
3. Choose the type of extension you'd like to add:
- `Built-In Extension`: Use an extension that comes pre-installed with goose.
- `Command-Line Extension`: Add a local command or script to run as an extension.
- - `Remote Extension (SSE)`: Connect to a remote system via SSE (Server-Sent Events).
- - `Remote Extension (Streaming HTTP)`: Connect to a remote system via Streaming HTTP
+ - `Remote Extension (Streamable HTTP)`: Connect to a remote system via Streamable HTTP
4. Follow the prompts based on the type of extension you selected.
@@ -284,32 +283,13 @@ goose://extension?cmd=npx&arg=-y&arg=%40modelcontextprotocol/server-github&timeo
Note that each parameter to the `npx` command is passed as a separate `arg` parameter in the deeplink.
-
-```
-goose://extension?url=&id=&name=&description=
-```
-
-Parameters:
-- `url`: The URL of the remote SSE server
-- `timeout`: Maximum time (in seconds) to wait for extension responses
-- `id`: Unique identifier for the extension
-- `name`: Display name for the extension
-- `description`: Brief description of the extension's functionality
-
-For example, a deeplink for a URL like `http://localhost:8080/sse` would look like this when URL-encoded:
-
-```
-goose://extension?url=http%3A%2F%2Flocalhost%3A8080%2Fsse&timeout=&id=&name=&description=>
-```
-
-
-
+
```
goose://extension?url=&type=streamable_http&id=&name=&description=
```
Parameters:
-- `url`: The URL of the remote Streaming HTTP server
+- `url`: The URL of the remote Streamable HTTP server
- `type`: Must be set to `streamable_http` to specify the protocol type
- `timeout`: Maximum time (in seconds) to wait for extension responses
- `id`: Unique identifier for the extension
@@ -636,29 +616,15 @@ Note that you'll need [Node.js](https://nodejs.org/) installed on your system to
:::
-### Remote Extensions over SSE
-
-To enable a remote extension over SSE while starting a session, run the following command:
-
-```bash
-goose session --with-remote-extension "{extension URL}" --with-remote-extension "{another extension URL}"
-```
-
-For example, to start a session with a remote extension over SSE running on localhost on port 8080, you'd run:
-
-```bash
-goose session --with-remote-extension "http://localhost:8080/sse"
-```
-
-### Remote Extensions over Streaming HTTP
+### Remote Extensions over Streamable HTTP
-To enable a remote extension over Streaming HTTP while starting a session, run the following command:
+To enable a remote extension over Streamable HTTP while starting a session, run the following command:
```bash
goose session --with-streamable-http-extension "{extension URL}" --with-streamable-http-extension "{another extension URL}"
```
-For example, to start a session with a Streaming HTTP extension, you'd run:
+For example, to start a session with a Streamable HTTP extension, you'd run:
```bash
goose session --with-streamable-http-extension "https://example.com/streamable"
diff --git a/documentation/docs/guides/goose-cli-commands.md b/documentation/docs/guides/goose-cli-commands.md
index 770e6ab61d23..2617aef349cf 100644
--- a/documentation/docs/guides/goose-cli-commands.md
+++ b/documentation/docs/guides/goose-cli-commands.md
@@ -110,8 +110,7 @@ Start or resume interactive chat sessions.
**Extension Options:**
- **`--with-extension `**: Add stdio extensions
-- **`--with-remote-extension `**: Add remote extensions over SSE
-- **`--with-streamable-http-extension `**: Add remote extensions over Streaming HTTP
+- **`--with-streamable-http-extension `**: Add remote extensions over Streamable HTTP
- **`--with-builtin `**: Enable built-in extensions (e.g., 'developer', 'computercontroller')
**Usage:**
@@ -128,13 +127,12 @@ goose session --resume --path ./session.jsonl # legacy session storage
# Start with extensions
goose session --with-extension "npx -y @modelcontextprotocol/server-memory"
goose session --with-builtin developer
-goose session --with-remote-extension "http://localhost:8080/sse"
+goose session --with-streamable-http-extension "http://localhost:8080/mcp"
# Advanced: Mix multiple extension types
goose session \
--with-extension "echo hello" \
- --with-remote-extension "http://sse.example.com/sse" \
- --with-streamable-http-extension "http://http.example.com" \
+ --with-streamable-http-extension "http://localhost:8080/mcp" \
--with-builtin "developer"
# Control session behavior
@@ -303,8 +301,7 @@ Execute commands from an instruction file or stdin. Check out the [full guide](/
**Extension Options:**
- **`--with-extension `**: Add stdio extensions (can be used multiple times)
-- **`--with-remote-extension `**: Add remote extensions over SSE (can be used multiple times)
-- **`--with-streamable-http-extension `**: Add remote extensions over Streaming HTTP (can be used multiple times)
+- **`--with-streamable-http-extension `**: Add remote extensions over Streamable HTTP (can be used multiple times)
- **`--with-builtin `**: Add builtin extensions by name (e.g., 'developer' or multiple: 'developer,github')
**Control Options:**
diff --git a/documentation/docs/guides/recipes/recipe-reference.md b/documentation/docs/guides/recipes/recipe-reference.md
index 835f0c9df0ec..d993d2237825 100644
--- a/documentation/docs/guides/recipes/recipe-reference.md
+++ b/documentation/docs/guides/recipes/recipe-reference.md
@@ -170,7 +170,6 @@ The `extensions` field allows you to specify which Model Context Protocol (MCP)
#### Extension Types
- **`stdio`**: Standard I/O client with command and arguments
-- **`sse`**: Server-sent events client with a URI endpoint
- **`builtin`**: Built-in extension that is part of the bundled goose MCP server
- **`platform`**: Platform extensions that run in the agent process
- **`streamable_http`**: Streamable HTTP client with URI endpoint
diff --git a/documentation/docs/guides/running-tasks.md b/documentation/docs/guides/running-tasks.md
index 112fbe16b3fd..ea8b2c09922a 100644
--- a/documentation/docs/guides/running-tasks.md
+++ b/documentation/docs/guides/running-tasks.md
@@ -120,12 +120,6 @@ goose run --with-builtin "developer,computercontroller" -t "your instructions"
goose run --with-extension "ENV1=value1 custom-extension-args" -t "your instructions"
```
-- Using remote SSE extensions
-
-```bash
-goose run --with-remote-extension "url" -t "your instructions"
-```
-
- Using streamable HTTP extensions
```bash
diff --git a/documentation/docs/mcp/_template_.mdx b/documentation/docs/mcp/_template_.mdx
index ab32d66e911f..71a8b498385f 100644
--- a/documentation/docs/mcp/_template_.mdx
+++ b/documentation/docs/mcp/_template_.mdx
@@ -70,13 +70,13 @@ Note that you'll need [uv](https://docs.astral.sh/uv/#installation) installed on
apiKeyLinkText="Service Access Token"
/>
-
+
-
+
- [Launch the installer](goose://extension?cmd=npx&arg=mcp-remote&arg=https%3A%2F%2Fobservability.mcp.cloudflare.com%2Fsse&id=cloudflare-observability&name=Cloudflare%20Observability&description=Debug%20and%20get%20insight%20into%20your%20application%27s%20logs%20and%20analytics&env=CLOUDFLARE_API_TOKEN%3DCloudflare%20API%20Token)
+ [Launch the installer](goose://extension?cmd=npx&arg=mcp-remote&arg=https%3A%2F%2Fobservability.mcp.cloudflare.com%2Fmcp&id=cloudflare-observability&name=Cloudflare%20Observability&description=Debug%20and%20get%20insight%20into%20your%20application%27s%20logs%20and%20analytics&env=CLOUDFLARE_API_TOKEN%3DCloudflare%20API%20Token)
**Command**
```sh
- npx mcp-remote https://observability.mcp.cloudflare.com/sse
+ npx mcp-remote https://observability.mcp.cloudflare.com/mcp
```
@@ -94,7 +94,7 @@ Choose one or more servers based on your needs. Here are the most popular config
2. Choose to add a `Command-line Extension`
3. Give your extension a name: `cloudflare-observability`
- 4. Enter the command: `npx mcp-remote https://observability.mcp.cloudflare.com/sse`
+ 4. Enter the command: `npx mcp-remote https://observability.mcp.cloudflare.com/mcp`
5. Set timeout: `300` seconds
6. Add environment variable:
- Name: `CLOUDFLARE_API_TOKEN`
@@ -107,10 +107,10 @@ Choose one or more servers based on your needs. Here are the most popular config
- [Launch the installer](goose://extension?cmd=npx&arg=mcp-remote&arg=https%3A%2F%2Fbindings.mcp.cloudflare.com%2Fsse&id=cloudflare-bindings&name=Cloudflare%20Workers%20Bindings&description=Build%20Workers%20applications%20with%20storage%2C%20AI%2C%20and%20compute%20primitives&env=CLOUDFLARE_API_TOKEN%3DCloudflare%20API%20Token)
+ [Launch the installer](goose://extension?cmd=npx&arg=mcp-remote&arg=https%3A%2F%2Fbindings.mcp.cloudflare.com%2Fmcp&id=cloudflare-bindings&name=Cloudflare%20Workers%20Bindings&description=Build%20Workers%20applications%20with%20storage%2C%20AI%2C%20and%20compute%20primitives&env=CLOUDFLARE_API_TOKEN%3DCloudflare%20API%20Token)
- Command: `npx mcp-remote https://bindings.mcp.cloudflare.com/sse`
+ Command: `npx mcp-remote https://bindings.mcp.cloudflare.com/mcp`
@@ -118,10 +118,10 @@ Choose one or more servers based on your needs. Here are the most popular config
- [Launch the installer](goose://extension?cmd=npx&arg=mcp-remote&arg=https%3A%2F%2Fradar.mcp.cloudflare.com%2Fsse&id=cloudflare-radar&name=Cloudflare%20Radar&description=Get%20global%20Internet%20traffic%20insights%2C%20trends%2C%20URL%20scans%2C%20and%20other%20utilities&env=CLOUDFLARE_API_TOKEN%3DCloudflare%20API%20Token)
+ [Launch the installer](goose://extension?cmd=npx&arg=mcp-remote&arg=https%3A%2F%2Fradar.mcp.cloudflare.com%2Fmcp&id=cloudflare-radar&name=Cloudflare%20Radar&description=Get%20global%20Internet%20traffic%20insights%2C%20trends%2C%20URL%20scans%2C%20and%20other%20utilities&env=CLOUDFLARE_API_TOKEN%3DCloudflare%20API%20Token)
- Command: `npx mcp-remote https://radar.mcp.cloudflare.com/sse`
+ Command: `npx mcp-remote https://radar.mcp.cloudflare.com/mcp`
diff --git a/documentation/docs/mcp/google-drive-mcp.md b/documentation/docs/mcp/google-drive-mcp.md
index ec4e795843f3..2b4814e6a920 100644
--- a/documentation/docs/mcp/google-drive-mcp.md
+++ b/documentation/docs/mcp/google-drive-mcp.md
@@ -132,9 +132,8 @@ You'll need to re-authenticate once a day when using the Google Drive extension.
│ ○ Built-in Extension
// highlight-start
│ ● Command-line Extension (Run a local command or script)
- // highlight-end
- │ ○ Remote Extension (SSE)
- │ ○ Remote Extension (Streaming HTTP)
+ // highlight-end
+ │ ○ Remote Extension (Streamable HTTP)
└
```
diff --git a/documentation/docs/mcp/google-maps-mcp.md b/documentation/docs/mcp/google-maps-mcp.md
index ab6adc07b831..a31164c25dbb 100644
--- a/documentation/docs/mcp/google-maps-mcp.md
+++ b/documentation/docs/mcp/google-maps-mcp.md
@@ -69,9 +69,8 @@ Note that you'll need [Node.js](https://nodejs.org/) installed on your system to
│ ○ Built-in Extension
// highlight-start
│ ● Command-line Extension (Run a local command or script)
- // highlight-end
- │ ○ Remote Extension (SSE)
- │ ○ Remote Extension (Streaming HTTP)
+ // highlight-end
+ │ ○ Remote Extension (Streamable HTTP)
└
```
diff --git a/documentation/docs/mcp/jetbrains-mcp.md b/documentation/docs/mcp/jetbrains-mcp.md
index 9548e3f4f0e2..a88c51c9547d 100644
--- a/documentation/docs/mcp/jetbrains-mcp.md
+++ b/documentation/docs/mcp/jetbrains-mcp.md
@@ -22,16 +22,16 @@ This tutorial covers how to add the JetBrains extension to integrate with any Je
Versions 2025.2 and later have built-in MCP server support and generate a dynamic configuration specific to your IDE instance.
-
- The instructions in this tutorial show how to configure the recommended remote SSE extension. See your IDE's documentation for more details (e.g. [MCP Server](https://www.jetbrains.com/help/idea/mcp-server.html) for IntelliJ IDEA).
+
+ See your IDE's documentation for more details (e.g. [MCP Server](https://www.jetbrains.com/help/idea/mcp-server.html) for IntelliJ IDEA).
:::tip TLDR
- Use `Add custom extension` in Settings → Extensions to add a `Server-Sent Events (SSE)` extension type with your IDE-specific SSE config.
+ Use `Add custom extension` in Settings → Extensions with the command from `Copy Stdio Config` in your IDE.
- Use `goose configure` to add a `Remote Extension (SSE)` extension type with your IDE-specific SSE config.
+ Use `goose configure` with the command from `Copy Stdio Config` in your IDE.
:::
@@ -43,11 +43,11 @@ This tutorial covers how to add the JetBrains extension to integrate with any Je
1. Go to `Settings > Tools > MCP Server` in your IDE
2. If needed, click `Enable MCP Server` to enable the MCP server
- 3. Click `Copy SSE Config`
+ 3. Click `Copy Stdio Config`
4. Click `OK` to save your changes and start the server
- 5. Copy the `url` value from the config
+ 5. Copy the `command`, `args`, and `env` values from the config
- 2. Add the JetBrains extension to goose, replacing "YOUR_IDE_SPECIFIC_URL" in the instructions with the URL you copied:
+ 2. Add the JetBrains extension to goose using the command from the config:
1. Click the button in the top-left to open the sidebar
@@ -55,18 +55,26 @@ This tutorial covers how to add the JetBrains extension to integrate with any Je
3. Click `Add custom extension`
4. On the `Add custom extension` modal, enter the following:
- **Extension Name**: JetBrains
- - **Type**: Server-Sent Events (SSE)
- - **Endpoint**: YOUR_IDE_SPECIFIC_URL
+ - **Type**: STDIO
+ - **Description**: Integrate goose with any JetBrains IDE
+ - **Command**: Combine the `command` and `args` from your IDE's Stdio config into a single command string
+ - **Environment Variables**: Add `IJ_MCP_SERVER_PORT` with the port value from the `env` section of your copied Stdio config
5. Click `Add Extension` to save the extension
6. Navigate to the chat
-
+ Combine command and args into a single string. The port value comes from the env section of your copied Stdio config.
+ >
+ }
/>
@@ -158,8 +166,8 @@ Anthropic's Claude 4 Sonnet was used for this task.
-:::tip
-When using goose to refactor code, it's recommended to commit your code to version control _before_ making changes. This way, you have a clean snapshot to compare against, making it easy to review goose’s modifications, revert if needed, and track improvements.
+:::tip
+When using goose to refactor code, it's recommended to commit your code to version control _before_ making changes. This way, you have a clean snapshot to compare against, making it easy to review goose's modifications, revert if needed, and track improvements.
:::
### goose Prompt
@@ -175,7 +183,7 @@ After 2 minutes, goose was done with the upgrade! 🎉
I'll make several improvements to modernize this codebase to use Java 21 (latest LTS) features. Here are the changes I'll implement:
1. Update the `pom.xml` to use Java 21
-2. Use newer Java features
+2. Use newer Java features
[... code changes ...]
@@ -248,7 +256,6 @@ The codebase is now using the latest Java LTS version (21) and incorporates many
-
Using the JetBrains extension provided several advantages and made it easier for goose to:
- navigate through the codebase
- track changes
diff --git a/documentation/docs/mcp/pieces-mcp.md b/documentation/docs/mcp/pieces-mcp.md
index 7e95ad2dd9c7..0a092b83a7ab 100644
--- a/documentation/docs/mcp/pieces-mcp.md
+++ b/documentation/docs/mcp/pieces-mcp.md
@@ -19,40 +19,22 @@ This tutorial covers how to add the [Pieces for Developers MCP Server](https://d
2. Enable [Long-Term Memory Context](https://docs.pieces.app/products/quick-guides/ltm-context) in PiecesOS
-3. Locate your MCP Server URL
- - In PiecesOS, navigate to Settings > Model Context Protocol (MCP)
- - Copy the server URL
-
-:::tip
-The default server URL is shown below. PiecesOS may use a different port if 39300 is already in use on your system:
-
-```
-http://localhost:39300/model_context_protocol/2024-11-05/sse
-```
-:::
-
-### Add Pieces MCP Server
-
- Use the server URL you copied from PiecesOS settings. PiecesOS may use a different port if 39300 is already in use on your system.
- >
- }
+ type="stdio"
+ command="uvx --from pieces-cli pieces --ignore-onboarding mcp start"
/>
@@ -74,7 +56,7 @@ Here's a report summarizing your key activities from yesterday, based on the mos
1. Code Development with goose:
- Activity: You worked on integrating SSE MCP servers into the goose CLI, making enhancements to handle extensions via schema URLs.
+ Activity: You worked on integrating MCP servers into the goose CLI, making enhancements to handle extensions via schema URLs.
Description: This task involved modifying code and testing new integrations to support advanced functionalities. It also included interactions with the goose community on Discord for feedback and troubleshooting.
2. Documentation Updates:
@@ -96,11 +78,11 @@ Here's a report summarizing your key activities from yesterday, based on the mos
Activity: Planned integration workflows for MCP and documented their use cases.
Description: You worked on strategies for implementing MCP integrations effectively, involving planning sessions to optimize future project deployments and align them with user requirements and project objectives.
-
+
These activities demonstrate a productive day with a focus on development, collaboration, and content management within your technical community.
```
:::tip
For more examples of prompts you can use with the Pieces for Developers MCP Server, see the [Pieces MCP prompting guide](https://docs.pieces.app/products/mcp/prompting?utm_source=goose&utm_medium=collab&utm_campaign=mcp).
-:::
\ No newline at end of file
+:::
diff --git a/documentation/docs/mcp/postgres-mcp.md b/documentation/docs/mcp/postgres-mcp.md
index c351c10e2db4..878b4f7d33db 100644
--- a/documentation/docs/mcp/postgres-mcp.md
+++ b/documentation/docs/mcp/postgres-mcp.md
@@ -94,9 +94,8 @@ Note that you'll need [Node.js](https://nodejs.org/) installed on your system to
│ ○ Built-in Extension
// highlight-start
│ ● Command-line Extension (Run a local command or script)
- // highlight-end
- │ ○ Remote Extension (SSE)
- │ ○ Remote Extension (Streaming HTTP)
+ // highlight-end
+ │ ○ Remote Extension (Streamable HTTP)
└
```
diff --git a/documentation/docs/mcp/puppeteer-mcp.md b/documentation/docs/mcp/puppeteer-mcp.md
index 9b3f0ec2d51f..ab88fd9aed69 100644
--- a/documentation/docs/mcp/puppeteer-mcp.md
+++ b/documentation/docs/mcp/puppeteer-mcp.md
@@ -63,9 +63,8 @@ Note that you'll need [Node.js](https://nodejs.org/) installed on your system to
│ ○ Built-in Extension
// highlight-start
│ ● Command-line Extension (Run a local command or script)
- // highlight-end
- │ ○ Remote Extension (SSE)
- │ ○ Remote Extension (Streaming HTTP)
+ // highlight-end
+ │ ○ Remote Extension (Streamable HTTP)
└
```
diff --git a/documentation/docs/mcp/speech-mcp.md b/documentation/docs/mcp/speech-mcp.md
index 87db68b6ac33..9cbb486e0c7c 100644
--- a/documentation/docs/mcp/speech-mcp.md
+++ b/documentation/docs/mcp/speech-mcp.md
@@ -69,9 +69,8 @@ Before adding this extension, make sure [PortAudio](https://github.com/GoogleClo
│ ○ Built-in Extension
// highlight-start
│ ● Command-line Extension (Run a local command or script)
- // highlight-end
- │ ○ Remote Extension (SSE)
- │ ○ Remote Extension (Streaming HTTP)
+ // highlight-end
+ │ ○ Remote Extension (Streamable HTTP)
└
```
diff --git a/documentation/src/components/CLIExtensionInstructions.tsx b/documentation/src/components/CLIExtensionInstructions.tsx
index 6ab4168a7f6e..b21cfae155f9 100644
--- a/documentation/src/components/CLIExtensionInstructions.tsx
+++ b/documentation/src/components/CLIExtensionInstructions.tsx
@@ -10,9 +10,9 @@ interface EnvVar {
interface CLIExtensionInstructionsProps {
name: string;
description: string;
- type?: 'stdio' | 'sse' | 'http';
+ type?: 'stdio' | 'http';
command?: string; // Only for stdio
- url?: string; // For both sse and http
+ url?: string; // For http
timeout?: number;
envVars?: EnvVar[]; // For stdio: environment variables, for http: headers
infoNote?: string;
@@ -31,9 +31,8 @@ export default function CLIExtensionInstructions({
commandNote,
}: CLIExtensionInstructionsProps) {
const hasEnvVars = envVars.length > 0;
- const isSSE = type === 'sse';
const isHttp = type === 'http';
- const isRemote = isSSE || isHttp;
+ const isRemote = isHttp;
// Determine last-step prompt text
const lastStepText = isHttp
@@ -57,27 +56,23 @@ export default function CLIExtensionInstructions({
Choose to add a{' '}
- {isSSE
- ? 'Remote Extension (SSE)'
- : isHttp
- ? 'Remote Extension (Streaming HTTP)'
+ {isHttp
+ ? 'Remote Extension (Streamable HTTP)'
: 'Command-line Extension'
}
.
- {`┌ goose-configure
+ {`┌ goose-configure
│
◇ What would you like to configure?
-│ Add Extension
+│ Add Extension
│
◆ What type of extension would you like to add?
${
- isSSE
- ? '│ ○ Built-in Extension\n│ ○ Command-line Extension\n// highlight-start\n│ ● Remote Extension (SSE) (Connect to a remote extension via Server-Sent Events)\n// highlight-end\n│ ○ Remote Extension (Streaming HTTP)'
- : isHttp
- ? '│ ○ Built-in Extension\n│ ○ Command-line Extension\n│ ○ Remote Extension (SSE)\n// highlight-start\n│ ● Remote Extension (Streaming HTTP) (Connect to a remote extension via MCP Streaming HTTP)\n// highlight-end'
- : '│ ○ Built-in Extension\n// highlight-start\n│ ● Command-line Extension (Run a local command or script)\n// highlight-end\n│ ○ Remote Extension (SSE)\n│ ○ Remote Extension (Streaming HTTP)'
+ isHttp
+ ? '│ ○ Built-in Extension\n│ ○ Command-line Extension\n// highlight-start\n│ ● Remote Extension (Streamable HTTP) (Connect to a remote extension via MCP Streamable HTTP)\n// highlight-end'
+ : '│ ○ Built-in Extension\n// highlight-start\n│ ● Command-line Extension (Run a local command or script)\n// highlight-end\n│ ○ Remote Extension (Streamable HTTP)'
}
└`}
@@ -90,7 +85,7 @@ ${
│ Add Extension
│
◇ What type of extension would you like to add?
-│ ${isSSE ? 'Remote Extension (SSE)' : isHttp ? 'Remote Extension (Streaming HTTP)' : 'Command-line Extension'}
+│ ${isHttp ? 'Remote Extension (Streamable HTTP)' : 'Command-line Extension'}
│
// highlight-start
◆ What would you like to call this extension?
@@ -101,7 +96,7 @@ ${
{isRemote ? (
<>
- - Enter the {isSSE ? 'SSE endpoint URI' : 'Streaming HTTP endpoint URI'}.
+ - Enter the Streamable HTTP endpoint URI.
{commandNote && (
<>
@@ -117,13 +112,13 @@ ${
│ Add Extension
│
◇ What type of extension would you like to add?
-│ ${isSSE ? 'Remote Extension (SSE)' : 'Remote Extension (Streaming HTTP)'}
+│ Remote Extension (Streamable HTTP)
│
◇ What would you like to call this extension?
│ ${name}
│
// highlight-start
-◆ What is the ${isSSE ? 'SSE endpoint URI' : 'Streaming HTTP endpoint URI'}?
+◆ What is the Streamable HTTP endpoint URI?
│ ${url}
// highlight-end
└`}
@@ -172,14 +167,14 @@ ${
│ Add Extension
│
◇ What type of extension would you like to add?
-│ ${isSSE ? 'Remote Extension (SSE)' : isHttp ? 'Remote Extension (Streaming HTTP)' : 'Command-line Extension'}
+│ ${isHttp ? 'Remote Extension (Streamable HTTP)' : 'Command-line Extension'}
│
◇ What would you like to call this extension?
│ ${name}
│
${
isRemote
- ? `◇ What is the ${isSSE ? 'SSE endpoint URI' : 'Streaming HTTP endpoint URI'}?\n│ ${url}\n│`
+ ? `◇ What is the Streamable HTTP endpoint URI?\n│ ${url}\n│`
: `◇ What command should be run?\n│ ${command}\n│`
}
// highlight-start
@@ -197,14 +192,14 @@ ${
│ Add Extension
│
◇ What type of extension would you like to add?
-│ ${isSSE ? 'Remote Extension (SSE)' : isHttp ? 'Remote Extension (Streaming HTTP)' : 'Command-line Extension'}
+│ ${isHttp ? 'Remote Extension (Streamable HTTP)' : 'Command-line Extension'}
│
◇ What would you like to call this extension?
│ ${name}
│
${
isRemote
- ? `◇ What is the ${isSSE ? 'SSE endpoint URI' : 'Streaming HTTP endpoint URI'}?\n│ ${url}\n│`
+ ? `◇ What is the Streamable HTTP endpoint URI?\n│ ${url}\n│`
: `◇ What command should be run?\n│ ${command}\n│`
}
◇ Please set the timeout for this tool (in secs):
@@ -236,14 +231,14 @@ ${
│ Add Extension
│
◇ What type of extension would you like to add?
-│ ${isSSE ? 'Remote Extension (SSE)' : isHttp ? 'Remote Extension (Streaming HTTP)' : 'Command-line Extension'}
+│ ${isHttp ? 'Remote Extension (Streamable HTTP)' : 'Command-line Extension'}
│
◇ What would you like to call this extension?
│ ${name}
│
${
isRemote
- ? `◇ What is the ${isSSE ? 'SSE endpoint URI' : 'Streaming HTTP endpoint URI'}?\n│ ${url}\n│`
+ ? `◇ What is the Streamable HTTP endpoint URI?\n│ ${url}\n│`
: `◇ What command should be run?\n│ ${command}\n│`
}
◇ Please set the timeout for this tool (in secs):
@@ -277,14 +272,14 @@ ${
│ Add Extension
│
◇ What type of extension would you like to add?
-│ ${isSSE ? 'Remote Extension (SSE)' : isHttp ? 'Remote Extension (Streaming HTTP)' : 'Command-line Extension'}
+│ ${isHttp ? 'Remote Extension (Streamable HTTP)' : 'Command-line Extension'}
│
◇ What would you like to call this extension?
│ ${name}
│
${
isRemote
- ? `◇ What is the ${isSSE ? 'SSE endpoint URI' : 'Streaming HTTP endpoint URI'}?\n│ ${url}\n│`
+ ? `◇ What is the Streamable HTTP endpoint URI?\n│ ${url}\n│`
: `◇ What command should be run?\n│ ${command}\n│`
}
◇ Please set the timeout for this tool (in secs):
diff --git a/documentation/src/components/GooseDesktopInstaller.tsx b/documentation/src/components/GooseDesktopInstaller.tsx
index 4c3e6a4e9dbf..947f1060df74 100644
--- a/documentation/src/components/GooseDesktopInstaller.tsx
+++ b/documentation/src/components/GooseDesktopInstaller.tsx
@@ -10,7 +10,7 @@ interface GooseDesktopInstallerProps {
extensionId: string;
extensionName: string;
description: string;
- type?: 'stdio' | 'sse' | 'http'; // Extension type (http maps to streamable_http)
+ type?: 'stdio' | 'http'; // Extension type (http maps to streamable_http)
// Command-line extension props (optional when using url)
command?: string;
args?: string[];
@@ -41,7 +41,7 @@ export default function GooseDesktopInstaller({
}: GooseDesktopInstallerProps) {
// Determine extension type with backward compatibility
- const extensionType = type || (command ? 'stdio' : url ? 'sse' : 'stdio');
+ const extensionType = type || (command ? 'stdio' : url ? 'http' : 'stdio');
// Build the goose:// URL
const buildGooseUrl = () => {
diff --git a/documentation/src/pages/prompt-library/data/prompts/pieces-stand-up-status-report.json b/documentation/src/pages/prompt-library/data/prompts/pieces-stand-up-status-report.json
index 47e02407d6e3..6b6bb003a247 100644
--- a/documentation/src/pages/prompt-library/data/prompts/pieces-stand-up-status-report.json
+++ b/documentation/src/pages/prompt-library/data/prompts/pieces-stand-up-status-report.json
@@ -9,7 +9,7 @@
"extensions": [
{
"name": "Pieces",
- "url": "http://localhost:39300/model_context_protocol/2024-11-05/sse",
+ "command": "uvx --from pieces-cli pieces --ignore-onboarding mcp start",
"is_builtin": false
}
]
diff --git a/documentation/static/servers.json b/documentation/static/servers.json
index ce462f5573ea..1ac66e9b7472 100644
--- a/documentation/static/servers.json
+++ b/documentation/static/servers.json
@@ -367,10 +367,8 @@
"id": "jetbrains",
"name": "JetBrains",
"description": "Integrate with any JetBrains IDE (requires local setup, dependent on your IDE version)",
- "url": "http://localhost:/sse",
- "type": "remote",
"link": "https://github.com/JetBrains/mcp-jetbrains",
- "installation_notes": "IDE v2025.2 and later: Enable SSE configuration from Settings > Tools > MCP Server, then update the placeholder SSE URL in the following command. If installing from the link, you must update the URL from the Extensions page before activating the extension. For earlier IDE versions, you must install the MCP Server plugin and use npx package manager to install the extension.",
+ "installation_notes": "Requires IDE v2025.2+. Use STDIO from Settings > Tools > MCP Server.",
"is_builtin": false,
"endorsed": true,
"environmentVariables": []
@@ -460,7 +458,7 @@
"type": "streamable-http",
"url": "https://mcp.neon.tech/mcp",
"link": "https://github.com/neondatabase/mcp-server-neon",
- "installation_notes": "Streaming HTTP extension with OAuth browser authentication to your Neon account.",
+ "installation_notes": "Streamable HTTP extension with OAuth browser authentication to your Neon account.",
"is_builtin": false,
"endorsed": true,
"environmentVariables": []
@@ -525,13 +523,12 @@
"id": "pieces",
"name": "Pieces",
"description": "Provides access to your Pieces long-term memory. You need to have Pieces installed to use this.",
- "url": "http://localhost:39300/model_context_protocol/2024-11-05/sse",
+ "command": "uvx --from pieces-cli pieces --ignore-onboarding mcp start",
"link": "https://pieces.app?utm_source=goose&utm_medium=collab&utm_campaign=mcp",
- "installation_notes": "You need to install Pieces first, and have this running.",
+ "installation_notes": "Install PiecesOS first.",
"is_builtin": false,
"endorsed": true,
- "environmentVariables": [],
- "type": "remote"
+ "environmentVariables": []
},
{
"id": "playwright",
@@ -584,7 +581,7 @@
"type": "streamable-http",
"url": "https://rube.app/mcp",
"link": "https://rube.app",
- "installation_notes": "Streaming HTTP extension with OAuth browser authentication to your Rube account.",
+ "installation_notes": "Streamable HTTP extension with OAuth browser authentication to your Rube account.",
"is_builtin": false,
"endorsed": true,
"environmentVariables": []
@@ -629,7 +626,7 @@
"type": "streamable-http",
"url": "https://mcp.supabase.com/mcp",
"link": "https://github.com/supabase-community/supabase-mcp",
- "installation_notes": "Streaming HTTP extension with OAuth browser authentication to your Supabase account.",
+ "installation_notes": "Streamable HTTP extension with OAuth browser authentication to your Supabase account.",
"is_builtin": false,
"endorsed": true,
"environmentVariables": [
diff --git a/ui/desktop/package-lock.json b/ui/desktop/package-lock.json
index 30fed4713c70..c2ebc4675016 100644
--- a/ui/desktop/package-lock.json
+++ b/ui/desktop/package-lock.json
@@ -54,6 +54,7 @@
"remark-breaks": "^4.0.0",
"remark-gfm": "^4.0.1",
"remark-math": "^6.0.0",
+ "shell-quote": "^1.8.3",
"split-type": "^0.3.4",
"swr": "^2.3.7",
"tailwind-merge": "^3.4.0",
@@ -91,6 +92,7 @@
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"@types/react-syntax-highlighter": "^15.5.13",
+ "@types/shell-quote": "^1.7.5",
"@types/yauzl": "^2.10.3",
"@typescript-eslint/eslint-plugin": "^8.48.1",
"@typescript-eslint/parser": "^8.48.1",
@@ -6550,6 +6552,13 @@
"@types/node": "*"
}
},
+ "node_modules/@types/shell-quote": {
+ "version": "1.7.5",
+ "resolved": "https://registry.npmjs.org/@types/shell-quote/-/shell-quote-1.7.5.tgz",
+ "integrity": "sha512-+UE8GAGRPbJVQDdxi16dgadcBfQ+KG2vgZhV1+3A1XmHbmwcdwhCUwIdy+d3pAGrbvgRoVSjeI9vOWyq376Yzw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/unist": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
@@ -18371,6 +18380,18 @@
"node": ">=8"
}
},
+ "node_modules/shell-quote": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz",
+ "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/side-channel": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
diff --git a/ui/desktop/package.json b/ui/desktop/package.json
index 4fcdd4c590b5..bd91c9b2821c 100644
--- a/ui/desktop/package.json
+++ b/ui/desktop/package.json
@@ -84,6 +84,7 @@
"remark-breaks": "^4.0.0",
"remark-gfm": "^4.0.1",
"remark-math": "^6.0.0",
+ "shell-quote": "^1.8.3",
"split-type": "^0.3.4",
"swr": "^2.3.7",
"tailwind-merge": "^3.4.0",
@@ -121,6 +122,7 @@
"@types/react": "^19.2.7",
"@types/react-dom": "^19.2.3",
"@types/react-syntax-highlighter": "^15.5.13",
+ "@types/shell-quote": "^1.7.5",
"@types/yauzl": "^2.10.3",
"@typescript-eslint/eslint-plugin": "^8.48.1",
"@typescript-eslint/parser": "^8.48.1",
diff --git a/ui/desktop/src/components/settings/extensions/subcomponents/ExtensionList.tsx b/ui/desktop/src/components/settings/extensions/subcomponents/ExtensionList.tsx
index 378bc5c7fda6..67bb5d469aef 100644
--- a/ui/desktop/src/components/settings/extensions/subcomponents/ExtensionList.tsx
+++ b/ui/desktop/src/components/settings/extensions/subcomponents/ExtensionList.tsx
@@ -1,6 +1,6 @@
import ExtensionItem from './ExtensionItem';
import builtInExtensionsData from '../../../../built-in-extensions.json';
-import { combineCmdAndArgs } from '../utils';
+import { quote } from 'shell-quote';
import { ExtensionConfig } from '../../../../api';
import { FixedExtensionEntry } from '../../../ConfigContext';
@@ -136,7 +136,7 @@ export function getSubtitle(config: ExtensionConfig) {
default:
return {
description: config.description || null,
- command: 'cmd' in config ? combineCmdAndArgs(config.cmd, config.args) : null,
+ command: 'cmd' in config ? quote([config.cmd, ...config.args]) : null,
};
}
}
diff --git a/ui/desktop/src/components/settings/extensions/utils.test.ts b/ui/desktop/src/components/settings/extensions/utils.test.ts
index ef96235a6265..f23e70a74536 100644
--- a/ui/desktop/src/components/settings/extensions/utils.test.ts
+++ b/ui/desktop/src/components/settings/extensions/utils.test.ts
@@ -4,10 +4,9 @@ import {
getDefaultFormData,
extensionToFormData,
createExtensionConfig,
- splitCmdAndArgs,
- combineCmdAndArgs,
extractCommand,
extractExtensionName,
+ splitCmdAndArgs,
DEFAULT_EXTENSION_TIMEOUT,
} from './utils';
import type { FixedExtensionEntry } from '../../ConfigContext';
@@ -245,38 +244,21 @@ describe('Extension Utils', () => {
});
describe('splitCmdAndArgs', () => {
- it('should split command and arguments correctly', () => {
- expect(splitCmdAndArgs('python script.py --flag value')).toEqual({
- cmd: 'python',
- args: ['script.py', '--flag', 'value'],
- });
-
- expect(splitCmdAndArgs('node')).toEqual({
- cmd: 'node',
- args: [],
- });
-
- expect(splitCmdAndArgs('')).toEqual({
- cmd: '',
- args: [],
- });
-
- expect(splitCmdAndArgs(' multiple spaces between args ')).toEqual({
- cmd: 'multiple',
- args: ['spaces', 'between', 'args'],
- });
- });
- });
-
- describe('combineCmdAndArgs', () => {
- it('should combine command and arguments correctly', () => {
- expect(combineCmdAndArgs('python', ['script.py', '--flag', 'value'])).toBe(
- 'python script.py --flag value'
- );
-
- expect(combineCmdAndArgs('node', [])).toBe('node');
-
- expect(combineCmdAndArgs('', ['arg1', 'arg2'])).toBe(' arg1 arg2');
+ it.each([
+ ['python script.py', { cmd: 'python', args: ['script.py'] }],
+ ['python script.py --flag', { cmd: 'python', args: ['script.py', '--flag'] }],
+ [
+ "java -classpath '/path/with spaces/lib.jar' Main",
+ { cmd: 'java', args: ['-classpath', '/path/with spaces/lib.jar', 'Main'] },
+ ],
+ [
+ 'node --max-old-space-size=4096 app.js',
+ { cmd: 'node', args: ['--max-old-space-size=4096', 'app.js'] },
+ ],
+ [' python script.py ', { cmd: 'python', args: ['script.py'] }],
+ ['', { cmd: '', args: [] }],
+ ])('splits %j correctly', (input, expected) => {
+ expect(splitCmdAndArgs(input)).toEqual(expected);
});
});
diff --git a/ui/desktop/src/components/settings/extensions/utils.ts b/ui/desktop/src/components/settings/extensions/utils.ts
index d33e85da2166..e6681bf7034f 100644
--- a/ui/desktop/src/components/settings/extensions/utils.ts
+++ b/ui/desktop/src/components/settings/extensions/utils.ts
@@ -1,3 +1,5 @@
+import { parse, quote } from 'shell-quote';
+
// Default extension timeout in seconds
// TODO: keep in sync with rust better
@@ -103,7 +105,7 @@ export function extensionToFormData(extension: FixedExtensionEntry): ExtensionFo
extension.type === 'platform'
? 'stdio'
: extension.type,
- cmd: extension.type === 'stdio' ? combineCmdAndArgs(extension.cmd, extension.args) : undefined,
+ cmd: extension.type === 'stdio' ? quote([extension.cmd, ...extension.args]) : undefined,
endpoint:
extension.type === 'streamable_http' || extension.type === 'sse'
? (extension.uri ?? undefined)
@@ -168,18 +170,8 @@ export function createExtensionConfig(formData: ExtensionFormData): ExtensionCon
}
export function splitCmdAndArgs(str: string): { cmd: string; args: string[] } {
- const words = str.trim().split(/\s+/);
- const cmd = words[0] || '';
- const args = words.slice(1);
-
- return {
- cmd,
- args,
- };
-}
-
-export function combineCmdAndArgs(cmd: string, args: string[]): string {
- return [cmd, ...args].join(' ');
+ const parts = parse(str.trim()).filter((p): p is string => typeof p === 'string');
+ return { cmd: parts[0] || '', args: parts.slice(1) };
}
export function extractCommand(link: string): string {